cloud-ide-fees 0.0.26 โ 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-fees.mjs","sources":["../../../projects/cloud-ide-fees/src/lib/cloud-ide-fees.ts","../../../projects/cloud-ide-fees/src/lib/cloud-ide-fees.routes.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/services/fee-structure.service.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/components/fee-structure-list/fee-structure-list.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/components/fee-structure-list/fee-structure-list.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/services/fee-assignment.service.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/components/fee-assignment-list/fee-assignment-list.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/components/fee-assignment-list/fee-assignment-list.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/services/fee-payment.service.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-list/fee-payment-list.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-list/fee-payment-list.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-process/fee-payment-process.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-process/fee-payment-process.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-view/fee-payment-view.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/discount-management/components/discount-rules/discount-rules.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/receipt-template/services/receipt-template.service.ts","../../../projects/cloud-ide-fees/src/lib/collection/receipt-template/components/template-designer/template-designer.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/receipt-template/components/template-designer/template-designer.component.html","../../../projects/cloud-ide-fees/src/lib/collection/reports/components/collection-report/collection-report.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/reports/components/collection-report/collection-report.component.html","../../../projects/cloud-ide-fees/src/lib/collection/student-fees/components/my-fee-statement/my-fee-statement.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/student-fees/components/my-fee-statement/my-fee-statement.component.html","../../../projects/cloud-ide-fees/src/lib/collection/student-fees/components/my-online-payment/my-online-payment.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/student-fees/components/my-online-payment/my-online-payment.component.html","../../../projects/cloud-ide-fees/src/lib/shared/components/fee-details-viewer/fee-details-viewer.component.ts","../../../projects/cloud-ide-fees/src/public-api.ts","../../../projects/cloud-ide-fees/src/cloud-ide-fees.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-cloud-ide-fees',\r\n imports: [],\r\n template: `\r\n <p>\r\n cloud-ide-fees works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class CloudIdeFees {\r\n\r\n}\r\n","import { Route } from '@angular/router';\nimport { authGuard } from 'cloud-ide-auth';\n\nexport const feesRoutes: Route[] = [\n // Fee Structure Management Routes\n {\n path: 'structure',\n loadComponent: () => import('./collection/fee-structure-management/components/fee-structure-list/fee-structure-list.component').then(c => c.FeeStructureListComponent),\n title: 'Fee Structure Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_structure\" }\n },\n {\n path: 'structure/create',\n loadComponent: () => import('./collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component').then(c => c.FeeStructureCreateComponent),\n title: 'Create Fee Structure',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_structure\" }\n },\n {\n path: 'structure/edit/:query',\n loadComponent: () => import('./collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component').then(c => c.FeeStructureCreateComponent),\n title: 'Edit Fee Structure',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_structure\" }\n },\n {\n path: 'structure/view/:query',\n loadComponent: () => import('./collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component').then(c => c.FeeStructureCreateComponent),\n title: 'View Fee Structure',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_structure\" }\n },\n // Fee Assignment Routes\n {\n path: 'assignment',\n loadComponent: () => import('./collection/fee-assignment-management/components/fee-assignment-list/fee-assignment-list.component').then(c => c.FeeAssignmentListComponent),\n title: 'Fee Assignment Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_assignment\" }\n },\n {\n path: 'assignment/create',\n loadComponent: () => import('./collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component').then(c => c.FeeAssignmentCreateComponent),\n title: 'Assign Fee to Student',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_assignment\" }\n },\n {\n path: 'assignment/edit/:query',\n loadComponent: () => import('./collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component').then(c => c.FeeAssignmentCreateComponent),\n title: 'Edit Fee Assignment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_assignment\" }\n },\n {\n path: 'assignment/view/:query',\n loadComponent: () => import('./collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component').then(c => c.FeeAssignmentCreateComponent),\n title: 'View Fee Assignment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_assignment\" }\n },\n // Fee Payment Management Routes\n {\n path: 'payment',\n loadComponent: () => import('./collection/fee-payment-management/components/fee-payment-list/fee-payment-list.component').then(c => c.FeePaymentListComponent),\n title: 'Fee Payment Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_payment\" }\n },\n {\n path: 'payment/process',\n loadComponent: () => import('./collection/fee-payment-management/components/fee-payment-process/fee-payment-process.component').then(c => c.FeePaymentProcessComponent),\n title: 'Process Fee Payment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_payment\" }\n },\n {\n path: 'payment/view/:query',\n loadComponent: () => import('./collection/fee-payment-management/components/fee-payment-view/fee-payment-view.component').then(c => c.FeePaymentViewComponent),\n title: 'View Fee Payment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_payment\" }\n },\n // Discount & Scholarship Management\n {\n path: 'discounts',\n loadComponent: () => import('./collection/discount-management/components/discount-rules/discount-rules.component').then(c => c.DiscountRulesComponent),\n title: 'Discount & Scholarship Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_discounts\" }\n },\n // Receipt Template Designer\n {\n path: 'receipt-template',\n loadComponent: () => import('./collection/receipt-template/components/template-designer/template-designer.component').then(c => c.TemplateDesignerComponent),\n title: 'Receipt Template Designer',\n canActivate: [authGuard],\n data: { sypg_page_code: \"receipt_template\" }\n },\n // Reports\n {\n path: 'collection',\n loadComponent: () => import('./collection/reports/components/collection-report/collection-report.component').then(c => c.CollectionReportComponent),\n title: 'Fee Collection Report',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_reports\" }\n },\n // Student Fees (Integrated into Dashboard)\n {\n path: 'statement',\n loadComponent: () => import('./collection/student-fees/components/my-fee-statement/my-fee-statement.component').then(c => c.MyFeeStatementComponent),\n title: 'My Fee Statement',\n canActivate: [authGuard],\n data: { sypg_page_code: \"my_fee_statement\" }\n },\n {\n path: 'payment',\n loadComponent: () => import('./collection/student-fees/components/my-online-payment/my-online-payment.component').then(c => c.MyOnlinePaymentComponent),\n title: 'Online Fee Payment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"my_online_payment\" }\n }\n];\n\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport {\n cidePath,\n feesRoutesUrl,\n hostManagerRoutesUrl,\n generateStringFromObject,\n type feeStructureControllerResponse,\n type MFeeStructure,\n type feeStructureByIdControllerResponse,\n type MFeeStructureGetByIdPayload,\n type feeStructureInsertUpdateControllerResponse,\n type FeeStructureSaveUpdatePayload,\n type feeStructureDeleteControllerResponse,\n type MFeeStructureDeletePayload,\n type feeStructureToggleStatusControllerResponse,\n type MFeeStructureToggleStatusPayload\n} from 'cloud-ide-lms-model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideFeeFeeStructureService {\n private http = inject(HttpClient);\n\n /**\n * Get list of fee structures\n * @param payload - Query parameters for filtering/pagination\n * @returns Observable of fee structure list response\n */\n getFeeStructureList(payload: MFeeStructure): Observable<feeStructureControllerResponse> {\n console.log(\"payload\", payload)\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure,\n query\n ]);\n\n return this.http.get(url);\n }\n\n /**\n * Get fee structure by ID\n * @param payload - Fee structure ID payload\n * @returns Observable of fee structure data\n */\n getFeeStructureById(payload: MFeeStructureGetByIdPayload): Observable<feeStructureByIdControllerResponse> {\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure,\n 'byId',\n query\n ]);\n\n return this.http.get(url);\n }\n\n /**\n * Create or update fee structure\n * @param data - Fee structure data to save (with separate fee_structure and fee_structure_items keys)\n * @returns Observable of the save response\n */\n saveUpdateFeeStructure(data: FeeStructureSaveUpdatePayload): Observable<feeStructureInsertUpdateControllerResponse> {\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure\n ]);\n\n return this.http.post(url, data);\n }\n\n /**\n * Delete fee structure\n * @param payload - Fee structure ID payload\n * @returns Observable of the delete response\n */\n deleteFeeStructure(payload: MFeeStructureDeletePayload): Observable<feeStructureDeleteControllerResponse> {\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure,\n 'delete',\n query\n ]);\n\n return this.http.delete(url);\n }\n\n /**\n * Toggle fee structure status\n * @param payload - Fee structure ID payload\n * @returns Observable of the toggle response\n */\n toggleFeeStructureStatus(payload: MFeeStructureToggleStatusPayload): Observable<feeStructureToggleStatusControllerResponse> {\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure,\n 'toggle-status'\n ]);\n\n console.log('๐ Making PATCH request to toggle fee structure status:', { url, payload });\n return this.http.patch(url, payload);\n }\n}\n\n","import { \n Component, \n signal, \n computed, \n viewChild, \n TemplateRef, \n DestroyRef, \n inject, \n OnInit,\n type OnDestroy \n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { \n CideEleDataGridComponent, \n CideIconComponent, \n CideEleButtonComponent, \n type GridConfiguration, \n type GridEvent, \n CideEleDropdownComponent, \n type DropdownItem, \n type TemplateContext, \n type DropdownConfig, \n ConfirmationService,\n NotificationService \n} from 'cloud-ide-element';\nimport { \n type FeeStructure, \n type FeeStructureResponse,\n generateStringFromObject, \n MFeeStructure \n} from 'cloud-ide-lms-model';\nimport { AppStateHelperService, CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { CideFeeFeeStructureService } from '../../services/fee-structure.service';\n\n// Use the populated response interface from LMS model\ntype FeeStructureData = FeeStructureResponse;\n\ninterface ApiResponse<T> {\n success: boolean;\n code: number;\n data: T;\n total?: number;\n pageIndex?: number;\n pageSize?: number;\n message: string;\n}\n\n@Component({\n selector: 'cide-fee-structure-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideEleDropdownComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './fee-structure-list.component.html',\n styles: [`\n .fee-structure-listing-container {\n @apply tw-w-full tw-h-full;\n }\n \n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class FeeStructureListComponent implements OnInit, OnDestroy {\n // Modern Angular 20+ dependency injection using inject()\n private readonly destroyRef = inject(DestroyRef);\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\n private readonly router = inject(Router);\n private readonly appState = inject(AppStateHelperService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly notificationService = inject(NotificationService);\n private readonly rightsService = inject(RightsService);\n\n // Modern ViewChild signals for template renderers (Angular 20 approach)\n readonly feeStructureDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('feeStructureDetailsRendererTemplate');\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\n readonly actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\n readonly academicYearRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('academicYearRendererTemplate');\n readonly classProgramRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('classProgramRendererTemplate');\n readonly reservationCategoryRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('reservationCategoryRendererTemplate');\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n // Modern Angular 20+ state management using signals with proper typing\n readonly feeStructures = signal<FeeStructureData[]>([]);\n readonly loading = signal<boolean>(false);\n readonly error = signal<string | null>(null);\n\n // Server-side pagination state using signals\n readonly currentPage = signal<number>(1);\n readonly pageSize = signal<number>(10);\n readonly totalItems = signal<number>(0);\n readonly totalPages = signal<number>(0);\n\n // Server-side search state using signals\n readonly searchQuery = signal<string>('');\n\n // Server-side sorting state using signals\n readonly sortColumn = signal<string>('fees_structure_name');\n readonly sortDirection = signal<'asc' | 'desc'>('asc');\n\n // Server-side filtering state using signals\n readonly selectedStatusFilter = signal<string>('');\n readonly selectedAcademicYearFilter = signal<string>('');\n\n // Filter options using computed signal for better performance\n readonly statusFilterOptions = computed(() => [\n { value: '', label: 'All Status' },\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'draft', label: 'Draft' }\n ]);\n\n // Modern Angular 20+ grid configuration using computed signal with proper typing\n readonly gridConfig = computed<GridConfiguration<FeeStructureData>>(() => ({\n id: 'fee-structure-list-grid',\n columns: [\n {\n key: 'fees_structure_code',\n header: 'Code',\n type: 'text',\n width: '90px',\n truncate: true,\n align: 'left',\n sortable: true\n },\n {\n key: 'details',\n header: 'Fee Structure Details',\n type: 'custom',\n width: '400px',\n truncate: true,\n align: 'left',\n renderer: 'feeStructureDetailsRenderer',\n sortable: true\n },\n {\n key: 'fees_academic_year_id_acayr',\n header: 'Academic Year',\n type: 'custom',\n width: '180px',\n truncate: true,\n align: 'left',\n sortable: true,\n renderer: 'academicYearRenderer'\n },\n {\n key: 'fees_class_program_id_acacpm',\n header: 'Class/Program',\n type: 'custom',\n width: '200px',\n truncate: true,\n align: 'left',\n sortable: false,\n renderer: 'classProgramRenderer'\n },\n {\n key: 'fees_student_category_id_sygms',\n header: 'Reservation Category',\n type: 'custom',\n width: '180px',\n truncate: true,\n align: 'left',\n sortable: false,\n renderer: 'reservationCategoryRenderer'\n },\n {\n key: 'fees_is_active',\n header: 'Status',\n type: 'custom',\n width: '140px',\n truncate: false,\n align: 'center',\n renderer: 'statusRenderer'\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'custom',\n width: '80px',\n truncate: false,\n align: 'center',\n renderer: 'actionsDropdownRenderer'\n }\n ],\n data: this.feeStructures(),\n trackBy: '_id',\n pagination: {\n enabled: true,\n pageSize: this.pageSize(),\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search by code, name, or description...',\n searchableColumns: ['fees_structure_code', 'fees_structure_name', 'fees_structure_description'],\n debounceMs: 300,\n showClearButton: true\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: this.loading()\n },\n scroll: {\n enabled: true,\n maxHeight: '',\n minHeight: '',\n stickyHeader: true,\n virtualScroll: false,\n rowHeight: 50\n },\n export: {\n enabled: true,\n formats: ['csv', 'excel', 'pdf'],\n filename: 'fee-structures',\n includeHeaders: true\n },\n responsive: true,\n striped: false,\n bordered: true,\n compact: false,\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\n }));\n\n // Rights computed signals\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n\n ngOnInit(): void {\n // Initialize rights for fee structure management\n this.rightsService.initializeRights('fee_structure');\n console.log('๐ฐ Fee Structure List Component initialized');\n this.initializeBreadcrumbData();\n this.loadFeeStructures();\n }\n\n private initializeBreadcrumbData(): void {\n this.breadcrumbData.set([\n {\n id: 'list',\n label: 'List',\n icon: 'list',\n url: undefined\n }\n ]);\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n /**\n * Load fee structures from API\n */\n loadFeeStructures(): void {\n this.loading.set(true);\n this.error.set(null);\n\n const payload: MFeeStructure = new MFeeStructure({\n pageIndex: this.currentPage(),\n pageSize: this.pageSize(),\n query: this.searchQuery() || \"\",\n sort: {\n key: this.sortColumn(),\n order: this.sortDirection()\n }\n });\n\n // Add filters as additional properties (will be sent in query string)\n const filterParams: Partial<MFeeStructure> = {};\n if (this.selectedStatusFilter()) {\n filterParams.fees_is_active = this.selectedStatusFilter() === 'active';\n }\n if (this.selectedAcademicYearFilter()) {\n filterParams.fees_academic_year_id_acayr = this.selectedAcademicYearFilter();\n }\n \n // Merge filter params into payload\n Object.assign(payload, filterParams);\n\n this.feeStructureService.getFeeStructureList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n console.log('๐ฐ Fee structures loaded:', response.data);\n console.log('๐ Pagination info:', {\n total: response.total,\n pageIndex: response.pageIndex,\n pageSize: response.pageSize\n });\n \n this.feeStructures.set(response.data);\n this.totalItems.set(response.total || 0);\n this.totalPages.set(Math.ceil((response.total || 0) / this.pageSize()));\n \n if (response.data.length > 0) {\n this.notificationService.success(`Loaded ${response.data.length} fee structure(s) successfully.`);\n }\n } else {\n console.warn('โ ๏ธ No fee structure data received');\n this.feeStructures.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n this.notificationService.warning('No fee structures found.');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('โ Error loading fee structures:', error);\n this.error.set('Failed to load fee structures. Please try again.');\n this.feeStructures.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n this.notificationService.error('Failed to load fee structures. Please try again.');\n this.loading.set(false);\n }\n });\n }\n\n // Computed template renderers for grid\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\n feeStructureDetailsRenderer: this.feeStructureDetailsRendererTemplate(),\n statusRenderer: this.statusRendererTemplate(),\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate(),\n academicYearRenderer: this.academicYearRendererTemplate(),\n classProgramRenderer: this.classProgramRendererTemplate(),\n reservationCategoryRenderer: this.reservationCategoryRendererTemplate()\n }));\n\n /**\n * Handle grid events\n */\n onGridEvent(event: GridEvent<any>): void {\n switch (event.type) {\n case 'pageChange':\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\n this.currentPage.set(event.data['pageIndex'] as number);\n this.pageSize.set(event.data['pageSize'] as number);\n this.loadFeeStructures();\n }\n break;\n case 'search':\n this.searchQuery.set(event.data as string);\n this.currentPage.set(1);\n this.loadFeeStructures();\n break;\n case 'refresh':\n this.loadFeeStructures();\n break;\n case 'sort':\n if (event.data && typeof event.data === 'object' && 'column' in event.data && 'direction' in event.data) {\n this.sortColumn.set(event.data['column'] as string);\n this.sortDirection.set(event.data['direction'] as 'asc' | 'desc');\n this.currentPage.set(1);\n this.loadFeeStructures();\n }\n break;\n case 'export':\n if (event.data && typeof event.data === 'string') {\n this.handleExport(event.data);\n }\n break;\n default:\n console.log('๐ Unhandled grid event:', event.type);\n }\n }\n\n // Filter handlers\n onStatusFilterChange(): void {\n console.log('๐ Status filter changed:', this.selectedStatusFilter());\n this.currentPage.set(1);\n this.loadFeeStructures();\n }\n\n clearFilters(): void {\n console.log('๐งน Clearing filters');\n this.selectedStatusFilter.set('');\n this.selectedAcademicYearFilter.set('');\n this.searchQuery.set('');\n this.currentPage.set(1);\n this.loadFeeStructures();\n }\n\n // Fee Structure actions with proper typing\n createFeeStructure(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to create fee structures');\n return;\n }\n console.log('โ Navigating to create fee structure');\n this.notificationService.info('Opening form to create a new fee structure.');\n this.router.navigate(['/control-panel/structure/create']);\n }\n\n viewFeeStructure(feeStructure: FeeStructureData): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view fee structures');\n return;\n }\n console.log('๐๏ธ Viewing fee structure:', feeStructure);\n this.notificationService.info(`Opening fee structure \"${feeStructure.fees_structure_name}\" for viewing.`);\n const queryParams = generateStringFromObject({ fees_id: feeStructure._id });\n this.router.navigate(['/control-panel/structure/view', queryParams]);\n }\n\n editFeeStructure(feeStructure: FeeStructureData): void {\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to edit fee structures');\n return;\n }\n console.log('โ๏ธ Editing fee structure:', feeStructure);\n this.notificationService.info(`Opening fee structure \"${feeStructure.fees_structure_name}\" for editing.`);\n const queryParams = generateStringFromObject({ fees_id: feeStructure._id });\n this.router.navigate(['/control-panel/structure/edit', queryParams]);\n }\n\n\n deleteFeeStructure(feeStructure: FeeStructureData): void {\n if (!this.rightsService.hasRight('DELETE')) {\n this.notificationService.error('You do not have permission to delete fee structures');\n return;\n }\n console.log('๐๏ธ Deleting fee structure:', feeStructure);\n \n this.confirmationService.ask({\n title: 'Delete Fee Structure',\n message: `Are you sure you want to delete the fee structure \"${feeStructure.fees_structure_name}\"? This action cannot be undone.`,\n confirmText: 'Delete',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.loading.set(true);\n \n this.feeStructureService.deleteFeeStructure({ fees_id: feeStructure._id }).subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success(`Fee structure \"${feeStructure.fees_structure_name}\" deleted successfully.`);\n this.loadFeeStructures();\n } else {\n this.notificationService.error(response?.message || 'Failed to delete fee structure');\n this.loading.set(false);\n }\n },\n error: (error) => {\n console.error('โ Error deleting fee structure:', error);\n this.notificationService.error('Failed to delete fee structure. Please try again.');\n this.loading.set(false);\n }\n });\n }\n });\n }\n\n /**\n * Get dropdown configuration\n */\n getDropdownConfig(): DropdownConfig {\n return {\n triggerIcon: 'more_vert',\n triggerSize: 'sm'\n };\n }\n\n /**\n * Get action dropdown items\n */\n getActionDropdownItems(feeStructure: FeeStructureData): DropdownItem[] {\n const items: DropdownItem[] = [];\n \n if (this.canView()) {\n items.push({\n id: 'view',\n label: 'View Details',\n icon: 'visibility',\n iconColor: 'tw-text-gray-400',\n textColor: 'tw-text-gray-700',\n hoverBgColor: 'hover:tw-bg-gray-100'\n });\n }\n \n if (this.canEdit()) {\n items.push({\n id: 'edit',\n label: 'Edit',\n icon: 'edit',\n iconColor: 'tw-text-blue-400',\n textColor: 'tw-text-blue-600',\n hoverBgColor: 'hover:tw-bg-blue-50'\n });\n }\n \n if (this.canDelete()) {\n items.push({\n id: 'delete',\n label: 'Delete',\n icon: 'delete',\n iconColor: 'tw-text-red-400',\n textColor: 'tw-text-red-600',\n hoverBgColor: 'hover:tw-bg-red-50'\n });\n }\n \n return items;\n }\n\n /**\n * Handle dropdown item click\n */\n onDropdownItemClick(item: DropdownItem, feeStructure: FeeStructureData): void {\n console.log('๐ฑ๏ธ Dropdown item clicked:', item.id, 'for fee structure:', feeStructure.fees_structure_name);\n \n if (item.disabled) {\n console.log('โ ๏ธ Item is disabled, ignoring click');\n return;\n }\n \n switch (item.id) {\n case 'view':\n this.viewFeeStructure(feeStructure);\n break;\n case 'edit':\n this.editFeeStructure(feeStructure);\n break;\n case 'delete':\n this.deleteFeeStructure(feeStructure);\n break;\n default:\n console.log('โ Unknown dropdown item clicked:', item.id);\n }\n }\n\n // Export handler\n private handleExport(format: string): void {\n console.log(`๐ค Exporting fee structures as ${format}`);\n \n const data = this.feeStructures().map(item => ({\n 'Code': item.fees_structure_code || '-',\n 'Name': item.fees_structure_name || '-',\n 'Description': item.fees_structure_description || '-',\n 'Academic Year': this.getAcademicYearName(item),\n 'Class/Program': this.getClassProgramName(item),\n 'Reservation Category': this.getReservationCategoryName(item),\n 'Status': item.fees_is_active ? 'Active' : 'Inactive'\n }));\n\n const timestamp = new Date().toISOString().split('T')[0];\n const filename = `fee-structures-${timestamp}`;\n\n switch (format.toLowerCase()) {\n case 'csv':\n this.exportToCSV(data, filename);\n break;\n case 'excel':\n this.exportToExcel(data, filename);\n break;\n case 'pdf':\n this.exportToPDF(data, filename);\n break;\n default:\n console.warn(`Unsupported export format: ${format}`);\n }\n }\n\n private exportToCSV(data: any[], filename: string): void {\n const headers = Object.keys(data[0] || {});\n const csvContent = [\n headers.join(','),\n ...data.map(row => headers.map(header => `\"${row[header] || ''}\"`).join(','))\n ].join('\\n');\n\n this.downloadFile(csvContent, `${filename}.csv`, 'text/csv');\n }\n\n private exportToExcel(data: any[], filename: string): void {\n this.exportToCSV(data, filename);\n }\n\n private exportToPDF(data: any[], filename: string): void {\n this.exportToCSV(data, filename);\n }\n\n private downloadFile(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n }\n\n // Utility methods\n formatDate(date: string | Date | null | undefined): string {\n if (!date) return '-';\n return new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n }\n\n getStatusBadgeClass(feeStructure: FeeStructureData): string {\n if (feeStructure.fees_is_active) {\n return 'tw-bg-green-100 tw-text-green-800';\n }\n return 'tw-bg-gray-100 tw-text-gray-800';\n }\n\n getStatusText(feeStructure: FeeStructureData): string {\n if (feeStructure.fees_is_active) return 'Active';\n return 'Inactive';\n }\n\n formatCurrency(amount: number | undefined): string {\n if (!amount) return 'โน0.00';\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n /**\n * Helper method to get display value from populated object or string\n */\n getDisplayValue(value: any, field: string): string {\n if (!value) return '-';\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value._id) {\n // Populated object\n return value[field] || value.name || value.title || '-';\n }\n return '-';\n }\n\n /**\n * Get academic year display name\n */\n getAcademicYearName(feeStructure: FeeStructureData): string {\n const academicYear = feeStructure.fees_academic_year_id_acayr;\n if (!academicYear) return '-';\n if (typeof academicYear === 'string') return academicYear;\n return academicYear.acayr_name || academicYear.acayr_code || '-';\n }\n\n /**\n * Get class/program display name\n */\n getClassProgramName(feeStructure: FeeStructureData): string {\n const classProgram = feeStructure.fees_class_program_id_acacpm;\n if (!classProgram) return 'All';\n if (typeof classProgram === 'string') return classProgram;\n return classProgram.acacpm_alise_title || '-';\n }\n\n /**\n * Get reservation category display name\n */\n getReservationCategoryName(feeStructure: FeeStructureData): string {\n const category = feeStructure.fees_student_category_id_sygms;\n if (!category) return 'All';\n if (typeof category === 'string') return category;\n return category.sygms_title || category.sygms_code || '-';\n }\n}\n","<!-- Fee Structure Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_structure' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"createFeeStructure()\">\n Create Fee Structure\n </button>\n </div>\n\n <div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Main Content Area -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-h-full tw-relative\">\n\n <!-- Data Grid Component -->\n <div class=\"tw-h-full tw-overflow-auto\">\n <cide-ele-data-grid [config]=\"gridConfig()\" [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n\n </div>\n </div>\n\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #feeStructureDetailsRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-w-full\">\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.fees_structure_name || 'N/A' }}</div>\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate\">{{ row.fees_structure_description || 'No description' }}</div>\n </div>\n</ng-template>\n\n\n<ng-template #statusRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-gap-1 tw-items-center\">\n <!-- Active/Inactive Status Badge -->\n <span class=\"tw-inline-flex tw-items-center tw-justify-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-text-center\"\n [ngClass]=\"getStatusBadgeClass(row)\">\n <cide-ele-icon size=\"2xs\" class=\"tw-mr-1\">\n {{ row.fees_is_active ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ getStatusText(row) }}\n </span>\n \n <!-- Template Badge -->\n @if (row.is_template) {\n <span\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-purple-100 tw-text-purple-800 tw-text-center\">\n <cide-ele-icon size=\"2xs\" class=\"tw-mr-1\">description</cide-ele-icon>\n Template\n </span>\n }\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\n <cide-ele-dropdown \n [items]=\"getActionDropdownItems(row)\"\n [config]=\"getDropdownConfig()\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #academicYearRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-900\">{{ getAcademicYearName(row) }}</span>\n </div>\n</ng-template>\n\n<ng-template #classProgramRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-text-gray-700\">{{ getClassProgramName(row) }}</span>\n </div>\n</ng-template>\n\n<ng-template #reservationCategoryRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-text-gray-700\">{{ getReservationCategoryName(row) }}</span>\n </div>\n</ng-template>\n\n","import { \n Component, \n inject, \n signal, \n OnInit, \n DestroyRef, \n OnDestroy,\n computed\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { \n FormBuilder, \n FormGroup, \n ReactiveFormsModule, \n FormArray\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { \n CideTextareaComponent, \n CideEleButtonComponent, \n CideEleTabComponent, \n type TabItem, \n CideIconComponent,\n NotificationService,\n ConfirmationService,\n CideFormFieldErrorComponent\n} from 'cloud-ide-element';\nimport { CideFeeFeeStructureService } from '../../services/fee-structure.service';\nimport { ENTITY_SERVICE_TOKEN, type IEntityService, ACADEMIC_YEAR_SERVICE_TOKEN, type IAcademicYearService, CLASS_PROGRAM_MASTER_SERVICE_TOKEN, type IClassProgramMasterService, PROGRAM_TERM_SECTION_SERVICE_TOKEN, type IProgramTermSectionService, GENERAL_MASTER_SERVICE_TOKEN, type IGeneralMasterService } from 'cloud-ide-shared';\nimport { AppStateService, ComponentContextService } from 'cloud-ide-layout';\nimport {\n FeeStructureSaveUpdatePayload,\n type FeeStructureItem,\n type FeeStructureByIdResponse,\n type FeeStructureResponse,\n type feeStructureByIdControllerResponse,\n generateObjectFromString,\n generateStringFromObject,\n MAcademicYear,\n MClassProgramMaster,\n classProgramMasterControllerResponse,\n AcaClassProgramMasterResponse,\n academicsRoutesUrl,\n type classPrgBranchControllerResponse,\n AcaClassPrgBranchListPayload,\n type AcaClassPrgBranchResponse,\n type classProgramTermControllerResponse,\n type MClassProgramTerm,\n type AcaClassProgramTermReponse,\n MPrgTrmSection,\n type prgTrmSectionControllerResponse,\n type AcaPrgTrmSectionResponse,\n selectSearchType,\n type IGeneralMasterListRequest,\n type generalMasterListControllerResponse,\n type ICoreSygms\n} from 'cloud-ide-lms-model';\nimport { HttpClient } from '@angular/common/http';\nimport { cidePath, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\nimport { CideSelectComponent } from 'cloud-ide-element';\nimport { CideInputComponent } from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { ProgramSectionSelectorWrapperComponent } from 'cloud-ide-shared';\n\n// Types\ninterface Entity {\n _id?: string;\n syen_name?: string;\n syen_code?: string;\n}\n\ninterface AcademicYear {\n _id?: string;\n acayr_name?: string;\n acayr_code?: string;\n acayr_iscurrent?: boolean;\n}\n\ninterface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'lib-cide-fee-structure-create',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideEleTabComponent,\n CideIconComponent,\n CideSelectComponent,\n CideLytSharedWrapperComponent,\n ProgramSectionSelectorWrapperComponent,\n CideFormFieldErrorComponent\n ],\n templateUrl: './fee-structure-create.component.html'\n})\nexport class FeeStructureCreateComponent implements OnInit, OnDestroy {\n // Modern Angular 20+ dependency injection\n private readonly destroyRef = inject(DestroyRef);\n private readonly fb = inject(FormBuilder);\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\n private readonly entityService = inject<IEntityService>(ENTITY_SERVICE_TOKEN);\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\n private readonly classProgramMasterService = inject<IClassProgramMasterService>(CLASS_PROGRAM_MASTER_SERVICE_TOKEN);\n private readonly programTermSectionService = inject<IProgramTermSectionService>(PROGRAM_TERM_SECTION_SERVICE_TOKEN);\n private readonly generalMasterService = inject<IGeneralMasterService>(GENERAL_MASTER_SERVICE_TOKEN);\n private readonly http = inject(HttpClient);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly appStateService = inject(AppStateService);\n private readonly componentContextService = inject(ComponentContextService);\n\n // Form and state management\n feeStructureForm!: FormGroup;\n readonly activeTab = signal<string>('basic');\n readonly loading = signal<boolean>(false);\n readonly submitting = signal<boolean>(false);\n\n // Fee structure information from route\n readonly feeStructureId = signal<string>('');\n readonly isEditMode = signal<boolean>(false);\n readonly isViewMode = signal<boolean>(false);\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n // Dropdown options\n readonly entityOptions = signal<Entity[]>([]);\n readonly academicYearOptions = signal<AcademicYear[]>([]);\n readonly entityLoading = signal<boolean>(false);\n readonly academicYearLoading = signal<boolean>(false);\n\n // Class Program Master options\n readonly classProgramMasters = signal<AcaClassProgramMasterResponse[]>([]);\n readonly classProgramMastersLoading = signal<boolean>(false);\n readonly classProgramMastersOptions = computed<SelectOption[]>(() => {\n return this.classProgramMasters().map(cp => ({\n value: cp._id || '',\n label: cp.acacpm_alise_title || ''\n }));\n });\n\n // Selected class program configuration\n readonly selectedClassProgram = signal<AcaClassProgramMasterResponse | null>(null);\n\n // Branches for selected program\n readonly classProgramBranches = signal<SelectOption[]>([]);\n readonly classProgramBranchesLoading = signal<boolean>(false);\n\n // Terms for selected program/branch\n readonly classProgramTerms = signal<SelectOption[]>([]);\n readonly classProgramTermsLoading = signal<boolean>(false);\n\n // Sections for selected term\n readonly programTermSections = signal<SelectOption[]>([]);\n readonly programTermSectionsLoading = signal<boolean>(false);\n\n // Reservation categories from general master\n readonly studentCategories = signal<SelectOption[]>([]);\n readonly studentCategoriesLoading = signal<boolean>(false);\n\n // Fee categories from general master\n readonly feeCategories = signal<ICoreSygms[]>([]);\n readonly feeCategoriesLoading = signal<boolean>(false);\n readonly feeCategoriesOptions = computed<SelectOption[]>(() => {\n return this.feeCategories().map(cat => ({\n value: cat._id || '',\n label: cat.sygms_title || cat.sygms_code || ''\n }));\n });\n\n // Note: Branch and Term dropdown visibility is now handled by ProgramSectionSelectorComponent\n\n // All dropdowns are always shown now - no need for computed signals\n\n\n // Distribution type options for installments\n readonly distributionTypeOptions = [\n { value: 'PERCENTAGE', label: 'Percentage' },\n { value: 'FIXED_AMOUNT', label: 'Fixed Amount' }\n ];\n\n\n // Tabs configuration\n feeStructureTabs(): TabItem[] {\n return [\n {\n id: 'basic',\n label: 'Basic Information',\n icon: 'info'\n },\n {\n id: 'items',\n label: 'Fee Items',\n icon: 'list'\n }\n ];\n }\n\n // Computed for fee items form array\n get feeItemsArray(): FormArray {\n return this.feeStructureForm.get('fee_items') as FormArray;\n }\n\n // Signal to trigger total amount recalculation\n private readonly totalAmountTrigger = signal(0);\n\n // Computed for total amount - reactive to form changes\n readonly totalAmount = computed(() => {\n // Read the trigger to make this reactive\n this.totalAmountTrigger();\n \n const items = this.feeItemsArray.controls;\n let total = 0;\n items.forEach(control => {\n const amount = control.get('feesi_amount')?.value || 0;\n total += parseFloat(String(amount)) || 0;\n });\n return total;\n });\n\n // Signal to trigger installment percentage validation\n private readonly installmentPercentageTrigger = signal(0);\n\n // Computed to check if all installment percentages total 100% for all items\n readonly isInstallmentPercentagesValid = computed(() => {\n // Read the trigger to make this reactive\n this.installmentPercentageTrigger();\n \n const items = this.feeItemsArray.controls;\n for (const itemControl of items) {\n const isInstallmentAllowed = itemControl.get('feesi_is_installment_allowed')?.value;\n if (!isInstallmentAllowed) continue; // Skip non-installment items\n \n const installmentsArray = itemControl.get('installments') as FormArray;\n if (installmentsArray.length <= 1) continue; // Skip if only one installment\n \n let totalPercentage = 0;\n for (const installmentControl of installmentsArray.controls) {\n const distType = installmentControl.get('distribution_type')?.value;\n if (distType === 'PERCENTAGE') {\n const percentage = parseFloat(String(installmentControl.get('percentage')?.value || 0));\n totalPercentage += percentage;\n }\n }\n \n // Check if total is exactly 100%\n if (Math.abs(totalPercentage - 100) > 0.01) {\n return false;\n }\n }\n return true;\n });\n\n constructor() {\n this.initializeForm();\n }\n\n private initializeForm(): void {\n this.feeStructureForm = this.fb.group({\n // Basic Information\n fees_structure_code: [''],\n fees_structure_name: [''],\n fees_structure_description: [''],\n fees_class_program_id_acacpm: [''],\n fees_class_program_branch_id_acabrn: [''],\n fees_class_program_term_id_acapt: [''],\n fees_program_term_section_id_acapts: [''],\n fees_student_category_id_sygms: [''],\n fees_academic_year_id_acayr: [''],\n fees_entity_id_syen: [''], // Will be set from active entity\n fees_is_active: [true],\n \n // Fee Items\n fee_items: this.fb.array([this.createFeeItemFormGroup()])\n });\n\n // Set active entity automatically\n const activeEntity = this.appStateService.activeEntity();\n if (activeEntity?._id) {\n this.feeStructureForm.patchValue({\n fees_entity_id_syen: activeEntity._id\n });\n }\n\n // Note: Program/Section selector component handles all class program, branch, term, and section loading automatically\n // No need for manual listeners - the component reacts to form changes internally\n \n // Watch for term value changes to ensure it's captured (especially for one-to-one mappings)\n this.feeStructureForm.get('fees_class_program_term_id_acapt')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(termId => {\n if (termId) {\n console.log('โ
Term value set in form:', termId);\n }\n });\n\n // Watch for changes in fee items array to update total amount\n this.feeItemsArray.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.totalAmountTrigger.set(this.totalAmountTrigger() + 1);\n });\n\n // Watch for amount changes in each existing fee item\n this.setupAmountWatchers();\n }\n\n /**\n * Setup amount watchers for all fee items\n */\n private setupAmountWatchers(): void {\n this.feeItemsArray.controls.forEach((control) => {\n control.get('feesi_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.totalAmountTrigger.set(this.totalAmountTrigger() + 1);\n });\n });\n }\n\n private createFeeItemFormGroup(): FormGroup {\n const itemForm = this.fb.group({\n feesi_category_id_sygms: [''],\n feesi_item_code: [''],\n feesi_item_name: [''],\n feesi_description: [''],\n feesi_amount: [0],\n feesi_is_amount_editable: [false],\n feesi_min_amount: [null],\n feesi_max_amount: [null],\n feesi_is_mandatory: [true],\n feesi_is_refundable: [false],\n feesi_is_installment_allowed: [false],\n feesi_installment_count: [1],\n feesi_tax_applicable: [false],\n feesi_tax_percentage: [0],\n feesi_display_order: [0],\n // Installment details - always stored in installment table (1 record if no installments)\n installments: this.fb.array([this.createInstallmentFormGroup()])\n });\n\n // Watch for installment_allowed and installment_count changes\n itemForm.get('feesi_is_installment_allowed')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(isAllowed => {\n this.syncInstallmentsForItem(itemForm, Boolean(isAllowed));\n });\n\n itemForm.get('feesi_installment_count')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(count => {\n const isAllowed = itemForm.get('feesi_is_installment_allowed')?.value;\n const installmentCount = count ?? undefined;\n this.syncInstallmentsForItem(itemForm, Boolean(isAllowed), installmentCount);\n });\n\n // Watch for category changes to auto-populate code and name\n itemForm.get('feesi_category_id_sygms')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(categoryId => {\n if (categoryId) {\n const category = this.feeCategories().find(cat => cat._id === categoryId);\n if (category) {\n console.log('Selected category:', category);\n \n // Auto-populate code from category.config.code\n let code = '';\n if (category.sygms_configuration) {\n try {\n const config = typeof category.sygms_configuration === 'string' \n ? JSON.parse(category.sygms_configuration) \n : category.sygms_configuration;\n \n console.log('Category config:', config);\n \n if (config && typeof config === 'object' && 'code' in config) {\n code = String(config.code || '');\n console.log('Extracted code from config:', code);\n }\n } catch (e) {\n console.warn('Failed to parse category configuration:', e, category.sygms_configuration);\n }\n }\n \n // Auto-populate name from category title\n const name = category.sygms_title || category.sygms_code || '';\n console.log('Extracted name from category:', name);\n \n // Auto-populate description from category description\n const description = category.sygms_desc || '';\n console.log('Extracted description from category:', description);\n \n // Update form values (emitEvent: false to prevent infinite loops)\n itemForm.patchValue({\n feesi_item_code: code,\n feesi_item_name: name,\n feesi_description: description\n }, { emitEvent: false });\n \n console.log('Updated form values - Code:', code, 'Name:', name, 'Description:', description);\n } else {\n console.warn('Category not found for ID:', categoryId);\n }\n }\n });\n\n // Watch for amount changes to recalculate installment amounts\n itemForm.get('feesi_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.recalculateInstallmentAmounts(itemForm);\n this.validateAmountRange(itemForm);\n });\n\n // Watch for editable amount checkbox changes\n itemForm.get('feesi_is_amount_editable')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(isEditable => {\n if (!isEditable) {\n // Clear min/max when editable is disabled\n itemForm.patchValue({\n feesi_min_amount: null,\n feesi_max_amount: null\n }, { emitEvent: false });\n } else {\n this.validateAmountRange(itemForm);\n }\n });\n\n // Watch for min/max amount changes to validate range\n itemForm.get('feesi_min_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.validateAmountRange(itemForm);\n });\n\n itemForm.get('feesi_max_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.validateAmountRange(itemForm);\n });\n\n return itemForm;\n }\n\n private createInstallmentFormGroup(): FormGroup {\n const installmentForm = this.fb.group({\n installment_number: [1],\n installment_amount: [0],\n distribution_type: ['PERCENTAGE'], // 'PERCENTAGE' or 'FIXED_AMOUNT'\n percentage: [0], // Percentage of total amount\n fixed_amount: [0], // Fixed amount for this installment\n due_date_offset_days: [0],\n due_date: [''], // Fixed due date (alternative to offset)\n collection_start_offset_days: [0],\n collection_start_date: [''], // Fixed collection start date (alternative to offset)\n collection_end_offset_days: [30],\n collection_end_date: [''], // Fixed collection end date (alternative to offset)\n });\n\n // Watch for distribution type changes to recalculate amount\n installmentForm.get('distribution_type')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.recalculateInstallmentAmountFromDistribution(installmentForm);\n // Trigger validation check\n this.installmentPercentageTrigger.update(v => v + 1);\n });\n\n // Watch for percentage changes\n installmentForm.get('percentage')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (installmentForm.get('distribution_type')?.value === 'PERCENTAGE') {\n this.recalculateInstallmentAmountFromDistribution(installmentForm);\n // Auto-update last installment to make total 100%\n this.autoUpdateLastInstallmentPercentage(installmentForm);\n // Trigger validation check\n this.installmentPercentageTrigger.update(v => v + 1);\n }\n });\n\n // Watch for fixed amount changes\n installmentForm.get('fixed_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (installmentForm.get('distribution_type')?.value === 'FIXED_AMOUNT') {\n this.recalculateInstallmentAmountFromDistribution(installmentForm);\n }\n });\n\n return installmentForm;\n }\n\n /**\n * Auto-update last installment percentage to make total 100%\n */\n private autoUpdateLastInstallmentPercentage(installmentForm: FormGroup): void {\n // Find the parent item form and installments array\n const installmentsArray = installmentForm.parent as FormArray;\n if (!installmentsArray) return;\n \n const itemForm = installmentsArray.parent as FormGroup;\n if (!itemForm) return;\n \n const isInstallmentAllowed = itemForm.get('feesi_is_installment_allowed')?.value;\n if (!isInstallmentAllowed) return;\n \n if (installmentsArray.length <= 1) return; // No need to auto-update if only one installment\n \n // Calculate total percentage of all installments except the last one\n let totalPercentage = 0;\n const lastIndex = installmentsArray.length - 1;\n \n for (let i = 0; i < lastIndex; i++) {\n const control = installmentsArray.at(i) as FormGroup;\n const distType = control.get('distribution_type')?.value;\n if (distType === 'PERCENTAGE') {\n const percentage = parseFloat(String(control.get('percentage')?.value || 0));\n totalPercentage += percentage;\n }\n }\n \n // Update last installment percentage to make total 100%\n const lastControl = installmentsArray.at(lastIndex) as FormGroup;\n const lastDistType = lastControl.get('distribution_type')?.value;\n if (lastDistType === 'PERCENTAGE') {\n const remainingPercentage = Math.max(0, 100 - totalPercentage);\n lastControl.patchValue({\n percentage: Math.round(remainingPercentage * 100) / 100\n }, { emitEvent: false });\n \n // Recalculate amount for last installment\n this.recalculateInstallmentAmountFromDistribution(lastControl);\n }\n }\n\n /**\n * Get total percentage from previous installments (for display)\n */\n getPreviousInstallmentsPercentage(itemIndex: number, installmentIndex: number): number {\n const installmentsArray = this.getInstallmentsArray(itemIndex);\n if (installmentIndex === 0) return 0; // First installment has no previous\n \n let totalPercentage = 0;\n for (let i = 0; i < installmentIndex; i++) {\n const control = installmentsArray.at(i) as FormGroup;\n const distType = control.get('distribution_type')?.value;\n if (distType === 'PERCENTAGE') {\n const percentage = parseFloat(String(control.get('percentage')?.value || 0));\n totalPercentage += percentage;\n }\n }\n return Math.round(totalPercentage * 100) / 100;\n }\n\n /**\n * Recalculate installment amount based on distribution type\n */\n private recalculateInstallmentAmountFromDistribution(installmentForm: FormGroup): void {\n const distributionType = installmentForm.get('distribution_type')?.value;\n \n // Get the item form (parent of installments FormArray, which is parent of this FormGroup)\n const installmentsArray = installmentForm.parent as FormArray;\n if (!installmentsArray) return;\n \n const itemForm = installmentsArray.parent as FormGroup;\n if (!itemForm) return;\n\n const totalAmount = itemForm.get('feesi_amount')?.value || 0;\n\n if (distributionType === 'PERCENTAGE') {\n const percentage = installmentForm.get('percentage')?.value || 0;\n const calculatedAmount = (totalAmount * percentage) / 100;\n installmentForm.patchValue({ \n installment_amount: Math.round(calculatedAmount * 100) / 100 \n }, { emitEvent: false });\n } else if (distributionType === 'FIXED_AMOUNT') {\n const fixedAmount = installmentForm.get('fixed_amount')?.value || 0;\n installmentForm.patchValue({ \n installment_amount: Math.round(fixedAmount * 100) / 100 \n }, { emitEvent: false });\n }\n }\n\n /**\n * Sync installments array based on installment_allowed and installment_count\n */\n private syncInstallmentsForItem(itemForm: FormGroup, isAllowed: boolean, count?: number): void {\n const installmentsArray = itemForm.get('installments') as FormArray;\n const installmentCount = count ?? itemForm.get('feesi_installment_count')?.value ?? 1;\n const targetCount = isAllowed ? installmentCount : 1; // Always have at least 1 record\n\n const currentCount = installmentsArray.length;\n\n if (currentCount < targetCount) {\n // Add missing installments\n for (let i = currentCount; i < targetCount; i++) {\n const installmentForm = this.createInstallmentFormGroup();\n installmentForm.patchValue({ \n installment_number: i + 1,\n distribution_type: 'PERCENTAGE',\n percentage: isAllowed ? (100 / targetCount) : 100\n });\n installmentsArray.push(installmentForm);\n }\n } else if (currentCount > targetCount) {\n // Remove excess installments\n for (let i = currentCount - 1; i >= targetCount; i--) {\n installmentsArray.removeAt(i);\n }\n }\n\n // Update installment numbers and default percentages\n installmentsArray.controls.forEach((control, index) => {\n const currentDistType = control.get('distribution_type')?.value;\n control.patchValue({ \n installment_number: index + 1 \n }, { emitEvent: false });\n \n // Set default percentage if not already set or if using percentage\n if (!currentDistType || currentDistType === 'PERCENTAGE') {\n const defaultPercentage = isAllowed ? (100 / targetCount) : 100;\n control.patchValue({ \n distribution_type: 'PERCENTAGE',\n percentage: defaultPercentage\n }, { emitEvent: false });\n }\n });\n\n // Recalculate amounts\n this.recalculateInstallmentAmounts(itemForm);\n \n // Trigger validation check after syncing\n setTimeout(() => {\n this.installmentPercentageTrigger.update(v => v + 1);\n }, 100);\n }\n\n /**\n * Recalculate installment amounts based on total amount and installment count\n * Only recalculates if distribution type is not set (default equal distribution)\n */\n private recalculateInstallmentAmounts(itemForm: FormGroup): void {\n const totalAmount = itemForm.get('feesi_amount')?.value || 0;\n const installmentCount = itemForm.get('feesi_installment_count')?.value || 1;\n const installmentsArray = itemForm.get('installments') as FormArray;\n\n if (installmentsArray.length === 0) return;\n\n // Check if any installment has custom distribution\n const hasCustomDistribution = installmentsArray.controls.some(control => {\n const distType = control.get('distribution_type')?.value;\n return distType === 'PERCENTAGE' || distType === 'FIXED_AMOUNT';\n });\n\n if (!hasCustomDistribution) {\n // Default: Equal distribution\n const amountPerInstallment = totalAmount / installmentCount;\n installmentsArray.controls.forEach((control) => {\n control.patchValue({ \n installment_amount: Math.round(amountPerInstallment * 100) / 100,\n distribution_type: 'PERCENTAGE',\n percentage: 100 / installmentCount\n }, { emitEvent: false });\n });\n } else {\n // Recalculate based on distribution type for each installment\n installmentsArray.controls.forEach((control) => {\n this.recalculateInstallmentAmountFromDistribution(control as FormGroup);\n });\n }\n }\n\n /**\n * Get installments array for a specific fee item\n */\n getInstallmentsArray(itemIndex: number): FormArray {\n const feeItemsArray = this.feeItemsArray;\n const itemForm = feeItemsArray.at(itemIndex) as FormGroup;\n return itemForm.get('installments') as FormArray;\n }\n\n private rightsService = inject(RightsService);\n\n ngOnInit(): void {\n // Initialize rights for fee structure management\n this.rightsService.initializeRights('fee_structure');\n this.initializeComponent();\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n /**\n * Initialize component\n */\n private initializeComponent(): void {\n this.updateBreadcrumbData();\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\n const queryParams = params['query'];\n console.log(queryParams, 'queryParams');\n\n if (queryParams) {\n const queryData = generateObjectFromString(queryParams);\n if (queryData?.fees_id) {\n this.feeStructureId.set(queryData.fees_id as string);\n this.isEditMode.set(true);\n this.loadFeeStructureData(queryData.fees_id as string);\n } else if (queryData?.copy_from) {\n // Copy mode\n this.loadFeeStructureData(queryData.copy_from as string, true);\n }\n } else {\n this.isEditMode.set(false);\n }\n\n // Always load dropdown options\n this.loadDropdownOptions();\n });\n\n // Check if view mode\n const path = this.route.snapshot.url.map(segment => segment.path).join('/');\n this.isViewMode.set(path.includes('view'));\n \n if (this.isViewMode()) {\n this.feeStructureForm.disable();\n }\n\n // Update breadcrumb after mode is determined\n this.updateBreadcrumbData();\n }\n\n /**\n * Load dropdown options\n */\n private loadDropdownOptions(): void {\n // Get active entity from app state\n const activeEntity = this.appStateService.activeEntity();\n\n // Load entity options\n this.entityLoading.set(true);\n this.entityService.getEntityList({}).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.entityOptions.set(response.data);\n }\n this.entityLoading.set(false);\n },\n error: () => {\n this.entityLoading.set(false);\n }\n });\n\n // Set active entity (already set in initializeForm, but ensure it's set here too)\n if (activeEntity?._id) {\n this.feeStructureForm.patchValue({\n fees_entity_id_syen: activeEntity._id\n });\n }\n \n // Load reservation categories on initialization\n // Use a small delay to ensure entity ID is set in the form\n setTimeout(() => {\n this.loadStudentCategories();\n this.loadFeeCategories();\n }, 100);\n\n // Load academic year options and set current one\n this.academicYearLoading.set(true);\n const academicYearPayload: MAcademicYear = {\n pageIndex: 1,\n pageSize: 100,\n pagination: false\n };\n this.academicYearService.getAcademicYearList(academicYearPayload).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.academicYearOptions.set(response.data);\n \n // Find and set current academic year (where acayr_iscurrent is true)\n const currentAcademicYear = response.data.find((ay: AcademicYear) => ay.acayr_iscurrent === true);\n if (currentAcademicYear?._id) {\n this.feeStructureForm.patchValue({\n fees_academic_year_id_acayr: currentAcademicYear._id\n });\n // Disable academic year control\n this.feeStructureForm.get('fees_academic_year_id_acayr')?.disable();\n }\n }\n this.academicYearLoading.set(false);\n },\n error: () => {\n this.academicYearLoading.set(false);\n }\n });\n }\n\n /**\n * Load class program masters\n */\n private loadClassProgramMasters(academicYearId: string, entityId?: string): void {\n this.classProgramMastersLoading.set(true);\n \n const payload: Partial<MClassProgramMaster> = {\n acacpm_academic_year_id_acayr: academicYearId,\n acacpm_entity_id_syen: entityId || this.appStateService.activeEntity()?._id || '',\n acacpm_isactive: true\n };\n\n this.classProgramMasterService.searchClassProgramMasters(payload).subscribe({\n next: (response: classProgramMasterControllerResponse) => {\n if (response?.success && response.data) {\n const dataArray: AcaClassProgramMasterResponse[] = Array.isArray(response.data) ? response.data : [];\n this.classProgramMasters.set(dataArray);\n } else {\n this.classProgramMasters.set([]);\n }\n this.classProgramMastersLoading.set(false);\n },\n error: () => {\n this.classProgramMasters.set([]);\n this.classProgramMastersLoading.set(false);\n }\n });\n }\n\n /**\n * Handle class program selection change\n */\n onClassProgramChange(classProgramId: string | null | undefined): void {\n // Clear previous selections\n this.selectedClassProgram.set(null);\n this.classProgramBranches.set([]);\n this.classProgramTerms.set([]);\n\n if (!classProgramId) {\n return;\n }\n\n // Find the selected program from the list\n const selectedProgram = this.classProgramMasters().find(cp => cp._id === classProgramId);\n if (!selectedProgram) {\n return;\n }\n\n // Note: ProgramSectionSelectorComponent handles all loading automatically\n // No need to manually load branches/terms - component reacts to form changes\n }\n\n /**\n * Load class program branches\n */\n private loadClassProgramBranches(classProgramId: string): void {\n this.classProgramBranchesLoading.set(true);\n \n const payload = new AcaClassPrgBranchListPayload({\n acabrn_class_program_id_acacpm: classProgramId,\n pagination: false\n });\n\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n academicsRoutesUrl.module,\n academicsRoutesUrl.classProgramBranch,\n query\n ]);\n\n this.http.get<classPrgBranchControllerResponse>(url).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const branches: AcaClassPrgBranchResponse[] = Array.isArray(response.data) ? response.data : [];\n this.classProgramBranches.set(branches.map((branch: AcaClassPrgBranchResponse) => ({\n value: branch._id || '',\n label: branch.acabrn_name || branch.acabrn_code || ''\n })));\n } else {\n this.classProgramBranches.set([]);\n }\n this.classProgramBranchesLoading.set(false);\n },\n error: () => {\n this.classProgramBranches.set([]);\n this.classProgramBranchesLoading.set(false);\n }\n });\n }\n\n /**\n * Handle branch selection change - load terms for selected branch\n */\n onBranchChange(branchId: string | null | undefined): void {\n this.classProgramTerms.set([]);\n this.programTermSections.set([]);\n // Reservation category is independent - don't clear it\n this.feeStructureForm.patchValue({ \n fees_class_program_term_id_acapt: '',\n fees_program_term_section_id_acapts: ''\n // Don't clear fees_student_category_id_sygms - reservation category is independent\n });\n\n // Note: ProgramSectionSelectorComponent handles all loading automatically\n // No need to manually load terms - component reacts to form changes\n }\n\n /**\n * Handle term selection change - load sections for selected term\n */\n onTermChange(termId: string | null | undefined): void {\n this.programTermSections.set([]);\n // Reservation category is independent - don't clear it\n this.feeStructureForm.patchValue({ \n fees_program_term_section_id_acapts: ''\n // Don't clear fees_student_category_id_sygms - reservation category is independent\n });\n\n // Always load sections when term is selected\n if (termId) {\n this.loadProgramTermSections(termId);\n }\n }\n\n /**\n * Handle section selection change\n * Note: Reservation category is independent and doesn't need to be reloaded\n */\n onSectionChange(sectionId: string | null | undefined): void {\n // Reservation category is independent - no need to reload or clear\n // Just clear the selection if section changes (optional)\n }\n\n /**\n * Load class program terms\n */\n private loadClassProgramTerms(classProgramId: string, branchId?: string): void {\n this.classProgramTermsLoading.set(true);\n \n const payload: Partial<MClassProgramTerm> = {\n acapt_class_program_id_acacpm: classProgramId,\n acapt_class_prg_branch_acabrn: branchId || undefined,\n pagination: false\n } as Partial<MClassProgramTerm>;\n\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n academicsRoutesUrl.module,\n academicsRoutesUrl.classProgramTerm,\n query\n ]);\n\n this.http.get<classProgramTermControllerResponse>(url)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const terms: AcaClassProgramTermReponse[] = Array.isArray(response.data) ? response.data : [];\n // Transform to SelectOption format with parent field for tree view\n const options = terms.map((term: AcaClassProgramTermReponse) => {\n // Normalize parent field for tree view compatibility\n let parentId = '';\n if (term.acapt_parent_class_prog_term_acapt) {\n if (typeof term.acapt_parent_class_prog_term_acapt === 'object') {\n parentId = term.acapt_parent_class_prog_term_acapt._id || '';\n } else if (typeof term.acapt_parent_class_prog_term_acapt === 'string') {\n parentId = term.acapt_parent_class_prog_term_acapt || '';\n }\n }\n \n return {\n _id: term._id || '',\n value: term._id || '',\n label: term.acapt_name || term.acapt_code || '',\n acapt_parent_class_prog_term_acapt: parentId\n };\n });\n \n this.classProgramTerms.set(options);\n } else {\n this.classProgramTerms.set([]);\n }\n this.classProgramTermsLoading.set(false);\n },\n error: () => {\n this.classProgramTerms.set([]);\n this.classProgramTermsLoading.set(false);\n }\n });\n }\n\n /**\n * Load program term sections for selected term\n */\n private loadProgramTermSections(termId: string): void {\n this.programTermSectionsLoading.set(true);\n \n const payload: MPrgTrmSection = new MPrgTrmSection({\n acapts_parent_class_prog_term_acapt: termId,\n pagination: false,\n pageIndex: 0,\n pageSize: 1000,\n query: \"\",\n sort: {\n key: 'acapts_name',\n order: 'asc'\n }\n });\n\n this.programTermSectionService.getProgramTermSectionList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: prgTrmSectionControllerResponse) => {\n if (response?.success && response?.data) {\n const sections: AcaPrgTrmSectionResponse[] = Array.isArray(response.data) ? response.data : [];\n this.programTermSections.set(sections.map((section: AcaPrgTrmSectionResponse) => ({\n value: section._id || '',\n label: section.acapts_name || section.acapts_code || ''\n })));\n } else {\n this.programTermSections.set([]);\n }\n this.programTermSectionsLoading.set(false);\n },\n error: () => {\n this.programTermSections.set([]);\n this.programTermSectionsLoading.set(false);\n }\n });\n }\n\n /**\n * Helper method to load branches and set values in sequence\n */\n private loadBranchesAndSetValue(classProgramId: string, branchId: string, termId?: string, sectionId?: string): void {\n const payload = new AcaClassPrgBranchListPayload({\n acabrn_class_program_id_acacpm: classProgramId,\n pagination: false\n });\n\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n academicsRoutesUrl.module,\n academicsRoutesUrl.classProgramBranch,\n query\n ]);\n\n this.http.get<classPrgBranchControllerResponse>(url)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const branches: AcaClassPrgBranchResponse[] = Array.isArray(response.data) ? response.data : [];\n this.classProgramBranches.set(branches.map((branch: AcaClassPrgBranchResponse) => ({\n value: branch._id || '',\n label: branch.acabrn_name || branch.acabrn_code || ''\n })));\n \n // Set branch value after branches are loaded\n this.feeStructureForm.patchValue({\n fees_class_program_branch_id_acabrn: branchId\n }, { emitEvent: false });\n \n // Note: ProgramSectionSelectorComponent will automatically load terms and sections\n // when form values are patched - no need for manual loading\n }\n },\n error: () => {\n this.classProgramBranches.set([]);\n }\n });\n }\n\n /**\n * Helper method to load terms and set values in sequence\n */\n private loadTermsAndSetValue(classProgramId: string, branchId: string, termId: string, sectionId?: string): void {\n const payload: Partial<MClassProgramTerm> = {\n acapt_class_program_id_acacpm: classProgramId,\n acapt_class_prg_branch_acabrn: branchId || undefined,\n pagination: false\n } as Partial<MClassProgramTerm>;\n\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n academicsRoutesUrl.module,\n academicsRoutesUrl.classProgramTerm,\n query\n ]);\n\n this.http.get<classProgramTermControllerResponse>(url)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const terms: AcaClassProgramTermReponse[] = Array.isArray(response.data) ? response.data : [];\n const options = terms.map((term: AcaClassProgramTermReponse) => {\n let parentId = '';\n if (term.acapt_parent_class_prog_term_acapt) {\n if (typeof term.acapt_parent_class_prog_term_acapt === 'object') {\n parentId = term.acapt_parent_class_prog_term_acapt._id || '';\n } else if (typeof term.acapt_parent_class_prog_term_acapt === 'string') {\n parentId = term.acapt_parent_class_prog_term_acapt;\n }\n }\n return {\n value: term._id || '',\n label: term.acapt_name || term.acapt_code || '',\n _id: term._id || '',\n acapt_parent_class_prog_term_acapt: parentId\n };\n });\n this.classProgramTerms.set(options);\n \n // Set term value after terms are loaded\n this.feeStructureForm.patchValue({\n fees_class_program_term_id_acapt: termId\n }, { emitEvent: false });\n \n // Load sections if section ID exists\n if (sectionId) {\n this.loadSectionsAndSetValue(termId, sectionId);\n }\n }\n },\n error: () => {\n this.classProgramTerms.set([]);\n }\n });\n }\n\n /**\n * Helper method to load sections and set value\n */\n private loadSectionsAndSetValue(termId: string, sectionId: string): void {\n const payload: MPrgTrmSection = new MPrgTrmSection({\n acapts_parent_class_prog_term_acapt: termId,\n pagination: false,\n pageIndex: 0,\n pageSize: 1000,\n query: \"\",\n sort: {\n key: 'acapts_name',\n order: 'asc'\n }\n });\n\n this.programTermSectionService.getProgramTermSectionList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: prgTrmSectionControllerResponse) => {\n if (response?.success && response?.data) {\n const sections: AcaPrgTrmSectionResponse[] = Array.isArray(response.data) ? response.data : [];\n this.programTermSections.set(sections.map((section: AcaPrgTrmSectionResponse) => ({\n value: section._id || '',\n label: section.acapts_name || section.acapts_code || ''\n })));\n \n // Set section value after sections are loaded\n this.feeStructureForm.patchValue({\n fees_program_term_section_id_acapts: sectionId\n }, { emitEvent: false });\n }\n },\n error: () => {\n this.programTermSections.set([]);\n }\n });\n }\n\n /**\n * Load reservation categories from general master\n */\n private loadStudentCategories(sectionId?: string): void {\n this.studentCategoriesLoading.set(true);\n \n // Get entity ID from form first, then fallback to app state\n const formEntityId = this.feeStructureForm.get('fees_entity_id_syen')?.value;\n const appStateEntityId = this.appStateService.activeEntity()?._id;\n const entityId = formEntityId || appStateEntityId;\n \n // Build payload to filter reservation categories\n // Reservation categories are stored in general master with type code 'reservation_category'\n const payload: IGeneralMasterListRequest = {\n sygmt_code: 'reservation_category'\n };\n \n // Only add entity ID if it exists (don't pass undefined)\n if (entityId) {\n payload.sygms_entity_id_syen = entityId;\n }\n\n console.log('Loading reservation categories with payload:', payload, 'Entity ID:', entityId);\n\n this.generalMasterService.getMasterList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: generalMasterListControllerResponse) => {\n console.log('Reservation categories API response:', response);\n if (response?.success && response?.data) {\n const categories: ICoreSygms[] = Array.isArray(response.data) ? response.data : [];\n // Filter only active categories and map to options\n const activeCategories = categories\n .filter((category: ICoreSygms) => category.sygms_isactive !== false)\n .map((category: ICoreSygms) => ({\n value: category._id || '',\n label: category.sygms_title || category.sygms_code || ''\n }));\n \n console.log('Mapped reservation categories:', activeCategories);\n this.studentCategories.set(activeCategories);\n } else {\n console.warn('No reservation categories found or API returned unsuccessful response. Response:', response);\n // Don't clear existing categories - keep them as they are\n }\n this.studentCategoriesLoading.set(false);\n },\n error: (error: unknown) => {\n console.error('Error loading reservation categories:', error);\n // Don't clear existing categories on error - keep them as they are\n this.studentCategoriesLoading.set(false);\n }\n });\n }\n\n /**\n * Load fee categories from general master\n */\n private loadFeeCategories(): void {\n this.feeCategoriesLoading.set(true);\n \n const activeEntity = this.appStateService.activeEntity();\n const entityId = activeEntity?._id || this.feeStructureForm.get('fees_entity_id_syen')?.value;\n \n // Build payload to filter fee categories\n // Fee categories are stored in general master with type code 'fee_category'\n const payload: IGeneralMasterListRequest = {\n sygmt_code: 'fee_category'\n };\n \n // Only add entity ID if it exists (don't pass undefined)\n if (entityId) {\n payload.sygms_entity_id_syen = entityId;\n }\n\n console.log('Loading fee categories with payload:', payload, 'Entity ID:', entityId);\n\n this.generalMasterService.getMasterList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: generalMasterListControllerResponse) => {\n console.log('Fee categories API response:', response);\n if (response?.success && response?.data) {\n const categories: ICoreSygms[] = Array.isArray(response.data) ? response.data : [];\n // Filter only active categories\n const activeCategories = categories\n .filter((category: ICoreSygms) => category.sygms_isactive !== false);\n \n console.log('Loaded fee categories:', activeCategories);\n this.feeCategories.set(activeCategories);\n } else {\n console.warn('No fee categories found or API returned unsuccessful response. Response:', response);\n }\n this.feeCategoriesLoading.set(false);\n },\n error: (error: unknown) => {\n console.error('Error loading fee categories:', error);\n this.feeCategoriesLoading.set(false);\n }\n });\n }\n\n /**\n * Handle class program search\n */\n onClassProgramMasterSearch(event: selectSearchType): void {\n const academicYearId = this.feeStructureForm.get('fees_academic_year_id_acayr')?.value;\n const entityId = this.feeStructureForm.get('fees_entity_id_syen')?.value || \n this.appStateService.activeEntity()?._id;\n \n if (!academicYearId || !entityId) {\n return;\n }\n\n this.loadClassProgramMasters(academicYearId, entityId);\n }\n\n /**\n * Load fee structure data for edit/view\n */\n private loadFeeStructureData(id: string, isCopy: boolean = false): void {\n this.loading.set(true);\n this.feeStructureService.getFeeStructureById({ fees_id: id }).subscribe({\n next: (response: feeStructureByIdControllerResponse) => {\n if (response?.success && response.data) {\n // Type guard to check if response has new structure (fee_structure and fee_structure_items)\n const isFeeStructureByIdResponse = (data: FeeStructureByIdResponse | FeeStructureResponse): data is FeeStructureByIdResponse => {\n return data !== null && typeof data === 'object' && 'fee_structure' in data;\n };\n \n let structureData: FeeStructureResponse;\n let itemsData: FeeStructureItem[] = [];\n \n if (isFeeStructureByIdResponse(response.data)) {\n // New structure: { fee_structure: {...}, fee_structure_items: [...] }\n const newData: FeeStructureByIdResponse = response.data;\n structureData = newData.fee_structure || {} as FeeStructureResponse;\n itemsData = newData.fee_structure_items || [];\n } else {\n // Legacy structure: direct FeeStructureResponse\n structureData = response.data as FeeStructureResponse;\n itemsData = [];\n }\n \n // Helper function to extract ID from object or string\n const extractId = (value: any): string => {\n if (!value) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && '_id' in value) {\n return value._id || '';\n }\n return '';\n };\n\n // Extract IDs from response\n const classProgramId = extractId(structureData.fees_class_program_id_acacpm);\n const branchId = extractId(structureData.fees_class_program_branch_id_acabrn);\n const termId = extractId(structureData.fees_class_program_term_id_acapt);\n const sectionId = extractId(structureData.fees_program_term_section_id_acapts);\n const studentCategoryId = extractId(structureData.fees_student_category_id_sygms);\n console.log(\"structureData\", structureData);\n console.log(\"classProgramId\", classProgramId);\n console.log(\"branchId\", branchId);\n console.log(\"termId\", termId);\n console.log(\"sectionId\", sectionId);\n console.log(\"studentCategoryId\", studentCategoryId);\n // Patch basic form values\n // Note: Entity and Academic Year are disabled and set from app state, so we don't override them\n // Use emitEvent: false to avoid triggering cascading loads prematurely\n // The program-section-selector component will handle loading options and matching values\n this.feeStructureForm.patchValue({\n fees_structure_code: isCopy ? '' : (structureData.fees_structure_code || ''),\n fees_structure_name: isCopy ? `${structureData.fees_structure_name} (Copy)` : structureData.fees_structure_name,\n fees_structure_description: structureData.fees_structure_description || '',\n fees_is_active: structureData.fees_is_active ?? true,\n fees_class_program_id_acacpm: classProgramId,\n fees_class_program_branch_id_acabrn: branchId,\n fees_class_program_term_id_acapt: termId,\n fees_program_term_section_id_acapts: sectionId,\n fees_student_category_id_sygms: studentCategoryId\n // fees_academic_year_id_acayr and fees_entity_id_syen are set from app state and disabled\n }, { emitEvent: false });\n\n // Trigger value changes after a short delay to allow program-section-selector to process initial values\n // The component's handleInitialValues will detect the values and load cascading options\n setTimeout(() => {\n // Emit events to trigger the component's value change handlers\n const classProgramControl = this.feeStructureForm.get('fees_class_program_id_acacpm');\n if (classProgramId && classProgramControl) {\n classProgramControl.updateValueAndValidity({ emitEvent: true });\n }\n }, 500);\n\n // Load fee items if available\n if (itemsData && itemsData.length > 0) {\n // Clear existing items\n while (this.feeItemsArray.length !== 0) {\n this.feeItemsArray.removeAt(0);\n }\n \n // Load each item\n itemsData.forEach((item: FeeStructureItem, index: number) => {\n const itemForm = this.createFeeItemFormGroup();\n \n // Patch item values\n itemForm.patchValue({\n _id: item._id || undefined,\n feesi_category_id_sygms: item.feesi_category_id_sygms || '',\n feesi_item_code: item.feesi_item_code || '',\n feesi_item_name: item.feesi_item_name || '',\n feesi_description: item.feesi_description || '',\n feesi_amount: item.feesi_amount || 0,\n feesi_is_amount_editable: item.feesi_is_amount_editable || false,\n feesi_min_amount: item.feesi_min_amount || null,\n feesi_max_amount: item.feesi_max_amount || null,\n feesi_is_mandatory: item.feesi_is_mandatory ?? true,\n feesi_is_refundable: item.feesi_is_refundable || false,\n feesi_is_installment_allowed: item.feesi_is_installment_allowed || false,\n feesi_installment_count: item.feesi_installment_count || 1,\n feesi_tax_applicable: item.feesi_tax_applicable || false,\n feesi_tax_percentage: item.feesi_tax_percentage || 0,\n feesi_display_order: index\n });\n \n // Load installment data (create at least one installment)\n const installmentsArray = itemForm.get('installments') as FormArray;\n while (installmentsArray.length !== 0) {\n installmentsArray.removeAt(0);\n }\n \n // Create installment from item data (for non-installment items, we have one installment)\n const installmentForm = this.createInstallmentFormGroup();\n installmentForm.patchValue({\n installment_number: 1,\n installment_amount: item.feesi_amount || 0,\n distribution_type: 'PERCENTAGE',\n percentage: 100,\n fixed_amount: item.feesi_amount || 0,\n due_date_offset_days: item.feesi_due_date_offset_days || 0,\n due_date: item.feesi_due_date ? new Date(item.feesi_due_date).toISOString().split('T')[0] : '',\n collection_start_offset_days: item.feesi_collection_start_offset_days || 0,\n collection_start_date: '',\n collection_end_offset_days: item.feesi_collection_end_offset_days || 30,\n collection_end_date: ''\n });\n installmentsArray.push(installmentForm);\n \n // If installments are allowed, we would need to fetch installment details separately\n // For now, we create one installment with the item's data\n \n this.feeItemsArray.push(itemForm);\n });\n \n // Setup amount watchers for loaded items\n this.setupAmountWatchers();\n \n console.log(`โ
Loaded ${itemsData.length} fee items`);\n } else {\n // No items found, keep default item\n console.log('โน๏ธ No fee items found, keeping default item');\n // Setup watchers for default item\n this.setupAmountWatchers();\n }\n \n if (!isCopy) {\n this.feeStructureId.set(id);\n }\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('Error loading fee structure:', error);\n this.notificationService.error('Failed to load fee structure data.');\n this.loading.set(false);\n }\n });\n }\n\n /**\n * Handle tab change\n */\n onTabChange(tab: TabItem): void {\n this.activeTab.set(tab.id);\n }\n\n /**\n * Add new fee item\n */\n addFeeItem(): void {\n const newItem = this.createFeeItemFormGroup();\n this.feeItemsArray.push(newItem);\n \n // Watch for amount changes in the new item\n newItem.get('feesi_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.totalAmountTrigger.set(this.totalAmountTrigger() + 1);\n });\n \n this.notificationService.info('Fee item added. Please fill in the details.');\n }\n\n /**\n * Remove fee item\n */\n removeFeeItem(index: number): void {\n if (this.feeItemsArray.length > 1) {\n this.confirmationService.ask({\n title: 'Remove Fee Item',\n message: 'Are you sure you want to remove this fee item?',\n confirmText: 'Remove',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.feeItemsArray.removeAt(index);\n this.notificationService.success('Fee item removed.');\n }\n });\n } else {\n this.notificationService.warning('At least one fee item is required.');\n }\n }\n\n /**\n * Move fee item up\n */\n moveItemUp(index: number): void {\n if (index > 0) {\n const items = this.feeItemsArray;\n const item = items.at(index);\n items.removeAt(index);\n items.insert(index - 1, item);\n }\n }\n\n /**\n * Move fee item down\n */\n moveItemDown(index: number): void {\n if (index < this.feeItemsArray.length - 1) {\n const items = this.feeItemsArray;\n const item = items.at(index);\n items.removeAt(index);\n items.insert(index + 1, item);\n }\n }\n\n /**\n * Handle form submission\n */\n onSubmit(): void {\n const requiredRight = this.isEditMode() ? 'EDIT' : 'CREATE';\n if (!this.rightsService.hasRight(requiredRight)) {\n this.notificationService.error(`You do not have permission to ${this.isEditMode() ? 'edit' : 'create'} fee structures`);\n return;\n }\n if (this.submitting()) {\n return;\n }\n\n this.submitting.set(true);\n\n // Ensure term control is enabled so it's included in getRawValue()\n const termControl = this.feeStructureForm.get('fees_class_program_term_id_acapt');\n if (termControl?.disabled) {\n termControl.enable({ emitEvent: false });\n }\n \n // Get form value, including disabled controls\n const formValue = this.feeStructureForm.getRawValue();\n \n // Get term value - check both formValue and control directly (for one-to-one mappings where term is auto-selected)\n const termId = formValue.fees_class_program_term_id_acapt || termControl?.value || undefined;\n \n // Build fee structure object\n const feeStructure = {\n _id: this.isEditMode() ? this.feeStructureId() : undefined,\n fees_structure_code: formValue.fees_structure_code,\n fees_structure_name: formValue.fees_structure_name,\n fees_structure_description: formValue.fees_structure_description,\n fees_academic_year_id_acayr: formValue.fees_academic_year_id_acayr,\n fees_entity_id_syen: formValue.fees_entity_id_syen,\n fees_class_program_id_acacpm: formValue.fees_class_program_id_acacpm || undefined,\n fees_class_program_branch_id_acabrn: formValue.fees_class_program_branch_id_acabrn || undefined,\n fees_class_program_term_id_acapt: termId || undefined,\n fees_program_term_section_id_acapts: formValue.fees_program_term_section_id_acapts || undefined,\n fees_student_category_id_sygms: formValue.fees_student_category_id_sygms || undefined,\n fees_is_active: formValue.fees_is_active ?? true\n };\n \n // Debug log to verify term is included\n if (formValue.fees_class_program_id_acacpm && !feeStructure.fees_class_program_term_id_acapt) {\n console.warn('โ ๏ธ Warning: Class program selected but term ID is missing from fee structure payload');\n console.warn('Form value term:', formValue.fees_class_program_term_id_acapt);\n console.warn('Control value term:', termControl?.value);\n console.warn('Control disabled:', termControl?.disabled);\n } else if (feeStructure.fees_class_program_term_id_acapt) {\n console.log('โ
Term ID included in fee structure:', feeStructure.fees_class_program_term_id_acapt);\n }\n\n // Build fee structure items array\n const feeStructureItems: FeeStructureItem[] = this.feeItemsArray.controls.map((itemControl, index) => {\n const itemValue = itemControl.getRawValue();\n const installments = itemValue.installments || [];\n \n // Extract installment data (first installment for non-installment items, all for installment items)\n const firstInstallment = installments[0] || {};\n \n return {\n _id: itemValue._id || undefined,\n feesi_category_id_sygms: itemValue.feesi_category_id_sygms || undefined,\n feesi_item_code: itemValue.feesi_item_code || undefined,\n feesi_item_name: itemValue.feesi_item_name || undefined,\n feesi_description: itemValue.feesi_description || undefined,\n feesi_amount: itemValue.feesi_amount || 0,\n feesi_is_amount_editable: itemValue.feesi_is_amount_editable || false,\n feesi_min_amount: itemValue.feesi_min_amount || undefined,\n feesi_max_amount: itemValue.feesi_max_amount || undefined,\n feesi_due_date: firstInstallment.due_date || undefined,\n feesi_due_date_offset_days: firstInstallment.due_date_offset_days || 0,\n feesi_collection_start_offset_days: firstInstallment.collection_start_offset_days || 0,\n feesi_collection_end_offset_days: firstInstallment.collection_end_offset_days || 30,\n feesi_is_mandatory: itemValue.feesi_is_mandatory ?? true,\n feesi_is_refundable: itemValue.feesi_is_refundable || false,\n feesi_is_installment_allowed: itemValue.feesi_is_installment_allowed || false,\n feesi_installment_count: itemValue.feesi_installment_count || 1,\n feesi_tax_applicable: itemValue.feesi_tax_applicable || false,\n feesi_tax_percentage: itemValue.feesi_tax_percentage || 0,\n feesi_display_order: index,\n feesi_is_active: true\n };\n });\n\n // Build payload with separate keys (similar to entity save model)\n const payload: FeeStructureSaveUpdatePayload = new FeeStructureSaveUpdatePayload({\n fee_structure: feeStructure,\n fee_structure_items: feeStructureItems\n });\n\n this.feeStructureService.saveUpdateFeeStructure(payload).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n const savedData = response.data;\n const structureCode = savedData.fees_structure_code || 'N/A';\n const structureId = savedData._id || 'N/A';\n \n // Show confirmation dialog with generated structure code and ID\n this.confirmationService.ask({\n title: 'Fee Structure Saved Successfully!',\n message: `Fee structure has been ${this.isEditMode() ? 'updated' : 'created'} successfully.\\n\\nStructure Code: ${structureCode}\\nStructure ID: ${structureId}`,\n confirmText: 'OK',\n cancelText: 'Cancel',\n type: 'success',\n icon: 'done'\n }).then((confirmed: boolean) => {\n if (!confirmed) {\n this.submitting.set(false);\n return;\n }\n // Update form with generated structure code and ID\n if (savedData.fees_structure_code) {\n this.feeStructureForm.patchValue({\n fees_structure_code: savedData.fees_structure_code\n });\n }\n \n // Update fee structure ID and switch to edit mode\n if (savedData._id) {\n this.feeStructureId.set(savedData._id);\n this.isEditMode.set(true);\n this.updateBreadcrumbData();\n }\n \n // Show success toast notification\n this.notificationService.success(\n `Fee structure ${this.isEditMode() ? 'updated' : 'created'} successfully!`,\n { icon: 'done' }\n );\n \n this.submitting.set(false);\n });\n } else {\n this.notificationService.error(response?.message || 'Failed to save fee structure.');\n this.submitting.set(false);\n }\n },\n error: (error) => {\n console.error('Error saving fee structure:', error);\n this.notificationService.error('Failed to save fee structure. Please try again.');\n this.submitting.set(false);\n }\n });\n }\n\n /**\n * Reset form to initial state\n */\n resetForm(): void {\n if (this.feeStructureForm.dirty) {\n this.confirmationService.ask({\n title: 'Reset Form?',\n message: 'Are you sure you want to reset the form? All unsaved changes will be lost.',\n confirmText: 'Reset',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.feeStructureForm.reset({\n fees_is_active: true\n });\n \n // Clear fee items array\n while (this.feeItemsArray.length !== 0) {\n this.feeItemsArray.removeAt(0);\n }\n \n // Add one default fee item\n this.feeItemsArray.push(this.createFeeItemFormGroup());\n \n // Reset state\n this.feeStructureId.set('');\n this.isEditMode.set(false);\n this.activeTab.set('basic');\n \n this.notificationService.info('Form has been reset.');\n }\n });\n }\n }\n\n /**\n * Validate amount range for editable fees\n */\n private validateAmountRange(itemForm: FormGroup): void {\n const isEditable = itemForm.get('feesi_is_amount_editable')?.value;\n if (!isEditable) return;\n\n const minAmount = itemForm.get('feesi_min_amount')?.value;\n const maxAmount = itemForm.get('feesi_max_amount')?.value;\n const baseAmount = itemForm.get('feesi_amount')?.value;\n\n // Clear previous errors\n itemForm.get('feesi_min_amount')?.setErrors(null);\n itemForm.get('feesi_max_amount')?.setErrors(null);\n itemForm.get('feesi_amount')?.setErrors(null);\n\n // Validate min <= max if both are provided\n if (minAmount !== null && minAmount !== undefined && minAmount !== '' &&\n maxAmount !== null && maxAmount !== undefined && maxAmount !== '') {\n if (Number(minAmount) > Number(maxAmount)) {\n itemForm.get('feesi_min_amount')?.setErrors({ minMaxMismatch: true });\n itemForm.get('feesi_max_amount')?.setErrors({ minMaxMismatch: true });\n }\n }\n\n // Validate base amount is within range if min/max are provided\n if (baseAmount !== null && baseAmount !== undefined && baseAmount !== '') {\n if (minAmount !== null && minAmount !== undefined && minAmount !== '' && Number(baseAmount) < Number(minAmount)) {\n itemForm.get('feesi_amount')?.setErrors({ belowMinimum: { min: minAmount } });\n }\n if (maxAmount !== null && maxAmount !== undefined && maxAmount !== '' && Number(baseAmount) > Number(maxAmount)) {\n itemForm.get('feesi_amount')?.setErrors({ aboveMaximum: { max: maxAmount } });\n }\n }\n }\n\n /**\n * Cancel and navigate back\n */\n onCancel(): void {\n if (this.feeStructureForm.dirty) {\n this.confirmationService.ask({\n title: 'Discard Changes?',\n message: 'You have unsaved changes. Are you sure you want to leave?',\n confirmText: 'Discard',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n // Use ComponentContextService to close tab or floating container\n this.componentContextService.close(['/control-panel/structure']);\n }\n });\n } else {\n // Use ComponentContextService to close tab or floating container\n this.componentContextService.close(['/control-panel/structure']);\n }\n }\n\n /**\n * Get entity options for select\n */\n getEntityOptions(): Array<{ value: string; label: string }> {\n return this.entityOptions().map(entity => ({\n value: entity._id || '',\n label: `${entity.syen_name || ''} (${entity.syen_code || ''})`\n }));\n }\n\n /**\n * Get academic year options for select\n */\n getAcademicYearOptions(): Array<{ value: string; label: string }> {\n return this.academicYearOptions().map(ay => ({\n value: ay._id || '',\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\n }));\n }\n\n /**\n * Format currency\n */\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n /**\n * Update breadcrumb data based on mode\n */\n private updateBreadcrumbData(): void {\n const additionalItems: { id: string; label: string; icon?: string; url?: string }[] = [];\n\n if (this.isEditMode() || this.isViewMode()) {\n if (this.isViewMode()) {\n additionalItems.push({\n id: 'view',\n label: 'View',\n icon: 'visibility',\n url: undefined\n });\n } else {\n additionalItems.push({\n id: 'edit',\n label: 'Edit',\n icon: 'edit',\n url: undefined\n });\n }\n } else {\n // Create mode\n additionalItems.push({\n id: 'create',\n label: 'Create',\n icon: 'add',\n url: undefined\n });\n }\n\n this.breadcrumbData.set(additionalItems);\n }\n}\n","<!-- Fee Structure Form -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_structure' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Back Button in Breadcrumb Area (View Mode Only) -->\n @if (isViewMode()) {\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"onCancel()\" leftIcon=\"arrow_back\">\n Back to List\n </button>\n </div>\n }\n \n <div class=\"tw-w-full tw-h-full\">\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"feeStructureForm\" \n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Tab Navigation -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-w-full tw-px-2 tw-py-0\">\n <cide-ele-tab [tabs]=\"feeStructureTabs()\" [activeTabId]=\"activeTab()\" size=\"sm\" variant=\"default\"\n (tabChange)=\"onTabChange($event)\">\n </cide-ele-tab>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-4 tw-py-4\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n @switch (activeTab()) {\n\n @case ('basic') {\n <!-- Basic Information -->\n <div class=\"tw-space-y-4\">\n <!-- First Row: Fee Code (small), Fee Name, Academic Year - Always on one row -->\n <div class=\"tw-grid\" style=\"grid-template-columns: 170px 1fr 1fr; gap: 1rem;\">\n <cide-ele-input label=\"Fee Structure Code\" formControlName=\"fees_structure_code\"\n placeholder=\"Auto-generated by API\" size=\"sm\" [disabled]=\"isEditMode()\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Fee Structure Name\" formControlName=\"fees_structure_name\"\n placeholder=\"e.g., Grade 10 Fee Structure 2024-25\" size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-select \n label=\"Academic Year\" \n formControlName=\"fees_academic_year_id_acayr\"\n [options]=\"getAcademicYearOptions()\"\n [loading]=\"academicYearLoading()\"\n [disabled]=\"true\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <div>\n <cide-ele-textarea label=\"Description\" formControlName=\"fees_structure_description\"\n placeholder=\"Enter detailed description of the fee structure...\"\n rows=\"2\" size=\"sm\">\n </cide-ele-textarea>\n </div>\n\n <!-- Academic Dropdowns - Using Program Section Selector Component -->\n \n <cide-shared-program-section-selector-wrapper\n [formGroup]=\"feeStructureForm\"\n [classProgramControlName]=\"'fees_class_program_id_acacpm'\"\n [branchControlName]=\"'fees_class_program_branch_id_acabrn'\"\n [termControlName]=\"'fees_class_program_term_id_acapt'\"\n [sectionControlName]=\"'fees_program_term_section_id_acapts'\"\n [academicYearId]=\"feeStructureForm.get('fees_academic_year_id_acayr')?.value\"\n [entityId]=\"feeStructureForm.get('fees_entity_id_syen')?.value\"\n [disabled]=\"isViewMode()\"\n [showLabels]=\"true\"\n [gridCols]=\"'tw-grid-cols-1 md:tw-grid-cols-3'\">\n </cide-shared-program-section-selector-wrapper>\n\n <!-- Reservation Category Dropdown -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-4 tw-mt-4\">\n <cide-ele-select \n label=\"Reservation Category\" \n formControlName=\"fees_student_category_id_sygms\"\n [options]=\"studentCategories()\"\n [loading]=\"studentCategoriesLoading()\"\n placeholder=\"Select reservation category\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-3 tw-p-3 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200\">\n <cide-ele-input formControlName=\"fees_is_active\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this fee structure</span>\n </div>\n </div>\n </div>\n }\n\n @case ('items') {\n <!-- Fee Items Section -->\n <div class=\"tw-space-y-3\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-2\">\n <div>\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 tw-m-0\">Fee Items</h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-m-0\">Configure individual fee items for this structure</p>\n </div>\n <div class=\"tw-flex tw-items-center tw-gap-3\">\n <div class=\"tw-text-right\">\n <div class=\"tw-text-xs tw-text-gray-500\">Total Amount</div>\n <div class=\"tw-text-base tw-font-bold tw-text-green-600\">{{ formatCurrency(totalAmount()) }}</div>\n </div>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\"\n (click)=\"addFeeItem()\">\n Add Fee Item\n </button>\n </div>\n </div>\n\n <div formArrayName=\"fee_items\" class=\"tw-space-y-2 tw-pr-2\">\n @for (item of feeItemsArray.controls; track $index; let itemIndex = $index) {\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm hover:tw-shadow-md tw-transition-shadow tw-p-3\"\n [formGroupName]=\"itemIndex\">\n \n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-2\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <div class=\"tw-bg-blue-100 tw-p-1.5 tw-rounded\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">receipt</cide-ele-icon>\n </div>\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-gray-900\">Item #{{ itemIndex + 1 }}</h6>\n </div>\n <div class=\"tw-flex tw-items-center tw-gap-1\">\n @if (itemIndex > 0) {\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" \n (click)=\"moveItemUp(itemIndex)\" title=\"Move Up\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">arrow_upward</cide-ele-icon>\n </button>\n }\n @if (itemIndex < feeItemsArray.length - 1) {\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" \n (click)=\"moveItemDown(itemIndex)\" title=\"Move Down\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">arrow_downward</cide-ele-icon>\n </button>\n }\n <button cideEleButton type=\"button\" variant=\"danger\" size=\"xs\" leftIcon=\"delete\"\n (click)=\"removeFeeItem(itemIndex)\"\n [disabled]=\"feeItemsArray.length === 1\">\n Remove\n </button>\n </div>\n </div>\n\n <!-- Category, Code, Name in one row -->\n <div class=\"tw-grid\" style=\"grid-template-columns: 1fr 170px 1fr; gap: 1rem;\">\n <cide-ele-select \n label=\"Category\" \n formControlName=\"feesi_category_id_sygms\"\n [options]=\"feeCategoriesOptions()\"\n [loading]=\"feeCategoriesLoading()\"\n size=\"sm\"\n placeholder=\"Select Fee Category\">\n </cide-ele-select>\n\n <cide-ele-input \n label=\"Item Code\" \n formControlName=\"feesi_item_code\"\n size=\"sm\"\n placeholder=\"Auto-filled from category\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Item Name\" \n formControlName=\"feesi_item_name\"\n size=\"sm\"\n placeholder=\"Auto-filled from category\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-mt-2\">\n <cide-ele-textarea \n label=\"Description\" \n formControlName=\"feesi_description\"\n rows=\"1\" \n size=\"sm\">\n </cide-ele-textarea>\n </div>\n\n <!-- Amount Section -->\n <div class=\"tw-mt-2\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2\">\n <cide-ele-input \n [label]=\"item.get('feesi_is_amount_editable')?.value ? 'Base Amount (Default)' : 'Amount'\" \n formControlName=\"feesi_amount\"\n type=\"number\"\n size=\"sm\"\n [title]=\"item.get('feesi_is_amount_editable')?.value ? 'Default amount used when applying fee. Can be edited per student if editable.' : 'Fixed fee amount'\">\n </cide-ele-input>\n </div>\n\n <!-- Amount Editable Option -->\n <div class=\"tw-mt-2 tw-p-2 tw-bg-blue-50 tw-rounded tw-border tw-border-blue-200\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-mb-2\">\n <cide-ele-input formControlName=\"feesi_is_amount_editable\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <div class=\"tw-flex-1\">\n <span class=\"tw-text-xs tw-font-semibold tw-text-blue-900\">Allow Amount to be Edited</span>\n <p class=\"tw-text-xs tw-text-blue-700 tw-mt-0.5\">\n Enable this for fees that vary per student (e.g., Transport fee based on distance). \n When applying fees, you'll be asked to enter the amount within the specified range.\n </p>\n </div>\n </div>\n\n <!-- Min/Max Amount Fields (shown when editable is checked) -->\n @if (item.get('feesi_is_amount_editable')?.value) {\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2 tw-mt-2\">\n <cide-ele-input \n label=\"Minimum Amount\" \n formControlName=\"feesi_min_amount\"\n type=\"number\"\n size=\"sm\"\n placeholder=\"No minimum\"\n title=\"Minimum amount allowed when editing (leave empty for no minimum)\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Maximum Amount\" \n formControlName=\"feesi_max_amount\"\n type=\"number\"\n size=\"sm\"\n placeholder=\"No maximum\"\n title=\"Maximum amount allowed when editing (leave empty for no maximum)\">\n </cide-ele-input>\n </div>\n }\n </div>\n </div>\n\n <!-- Additional Options -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-2 tw-mt-2\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"feesi_is_mandatory\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Mandatory</span>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"feesi_is_refundable\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Refundable</span>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"feesi_is_installment_allowed\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Installment Allowed</span>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2 tw-mt-2\">\n @if (item.get('feesi_is_installment_allowed')?.value) {\n <cide-ele-input \n label=\"Installment Count\" \n formControlName=\"feesi_installment_count\"\n type=\"number\"\n size=\"sm\">\n </cide-ele-input>\n }\n\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"feesi_tax_applicable\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Tax Applicable</span>\n </div>\n </div>\n\n @if (item.get('feesi_tax_applicable')?.value) {\n <div class=\"tw-mt-2\">\n <cide-ele-input \n label=\"Tax Percentage\" \n formControlName=\"feesi_tax_percentage\"\n type=\"number\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n }\n\n <!-- Installment Details Table -->\n <div class=\"tw-mt-4 tw-p-3 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">\n @if (item.get('feesi_is_installment_allowed')?.value) {\n Installment Details ({{ item.get('feesi_installment_count')?.value || 1 }} Installments)\n } @else {\n Payment Details (Single Payment)\n }\n </h6>\n </div>\n </div>\n\n <div formArrayName=\"installments\" class=\"tw-space-y-3\">\n @for (installment of getInstallmentsArray(itemIndex).controls; track $index; let installmentIndex = $index) {\n <div class=\"tw-bg-white tw-rounded tw-border tw-border-gray-300 tw-p-3\"\n [formGroupName]=\"installmentIndex\">\n \n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <div class=\"tw-bg-blue-100 tw-p-1 tw-rounded\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">payments</cide-ele-icon>\n </div>\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-gray-900\">\n @if (item.get('feesi_is_installment_allowed')?.value) {\n Installment #{{ installment.get('installment_number')?.value }}\n } @else {\n Payment Details\n }\n </h6>\n </div>\n <div class=\"tw-text-sm tw-font-medium tw-text-green-600\">\n Amount: {{ formatCurrency(installment.get('installment_amount')?.value || 0) }}\n </div>\n </div>\n\n <!-- Installment Amount Distribution -->\n @if (item.get('feesi_is_installment_allowed')?.value) {\n <div class=\"tw-p-2 tw-bg-yellow-50 tw-rounded tw-border tw-border-yellow-200 tw-mb-2\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-2\">\n <cide-ele-select \n label=\"Distribution Type\" \n formControlName=\"distribution_type\"\n [options]=\"distributionTypeOptions\"\n size=\"sm\">\n </cide-ele-select>\n\n @if (installment.get('distribution_type')?.value === 'PERCENTAGE') {\n <cide-ele-input \n label=\"Percentage (%)\" \n formControlName=\"percentage\"\n type=\"number\"\n size=\"sm\"\n title=\"Percentage of total amount for this installment\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col tw-items-end tw-justify-end tw-gap-1\">\n @if (installmentIndex > 0) {\n <div class=\"tw-text-xs tw-text-blue-600 tw-font-medium\">\n Previous: {{ getPreviousInstallmentsPercentage(itemIndex, installmentIndex) }}%\n </div>\n }\n <div class=\"tw-text-xs tw-text-gray-600\">\n Calculated: {{ formatCurrency((item.get('feesi_amount')?.value || 0) * (installment.get('percentage')?.value || 0) / 100) }}\n </div>\n @if (installmentIndex === getInstallmentsArray(itemIndex).length - 1 && installmentIndex > 0) {\n <div class=\"tw-text-xs tw-font-semibold\" [class.tw-text-green-600]=\"(getPreviousInstallmentsPercentage(itemIndex, installmentIndex) + (installment.get('percentage')?.value || 0)) === 100\" [class.tw-text-red-600]=\"(getPreviousInstallmentsPercentage(itemIndex, installmentIndex) + (installment.get('percentage')?.value || 0)) !== 100\">\n Total: {{ getPreviousInstallmentsPercentage(itemIndex, installmentIndex) + (installment.get('percentage')?.value || 0) }}%\n </div>\n }\n </div>\n }\n\n @if (installment.get('distribution_type')?.value === 'FIXED_AMOUNT') {\n <cide-ele-input \n label=\"Fixed Amount\" \n formControlName=\"fixed_amount\"\n type=\"number\"\n size=\"sm\"\n title=\"Fixed amount for this installment\">\n </cide-ele-input>\n }\n </div>\n </div>\n }\n\n <!-- Due Date Fields -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2 tw-mb-2\">\n <cide-ele-input \n label=\"Due Date Offset (Days from Assignment)\" \n formControlName=\"due_date_offset_days\"\n type=\"number\"\n size=\"sm\"\n title=\"Days from assignment date\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Due Date (Fixed Date - Alternative)\" \n formControlName=\"due_date\"\n type=\"date\"\n size=\"sm\"\n title=\"Use fixed date instead of offset\">\n </cide-ele-input>\n </div>\n\n <!-- Collection Window -->\n <div class=\"tw-p-2 tw-bg-blue-50 tw-rounded tw-border tw-border-blue-200\">\n <div class=\"tw-flex tw-items-center tw-gap-1.5 tw-mb-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-3 tw-h-3\">schedule</cide-ele-icon>\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-blue-900 tw-m-0\">Collection Window</h6>\n </div>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2\">\n <cide-ele-input \n label=\"Start Offset (Days from Assignment)\" \n formControlName=\"collection_start_offset_days\"\n type=\"number\"\n size=\"sm\"\n title=\"Days from assignment date when collection can start\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"End Offset (Days from Assignment)\" \n formControlName=\"collection_end_offset_days\"\n type=\"number\"\n size=\"sm\"\n title=\"Days from assignment date when collection window ends\">\n </cide-ele-input>\n </div>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2 tw-mt-2\">\n <cide-ele-input \n label=\"Start Date (Fixed Date - Alternative)\" \n formControlName=\"collection_start_date\"\n type=\"date\"\n size=\"sm\"\n title=\"Use fixed date instead of offset\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"End Date (Fixed Date - Alternative)\" \n formControlName=\"collection_end_date\"\n type=\"date\"\n size=\"sm\"\n title=\"Use fixed date instead of offset\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (feeItemsArray.length === 0) {\n <div class=\"tw-text-center tw-py-8 tw-text-gray-500\">\n <div class=\"tw-bg-white tw-p-3 tw-rounded-full tw-w-12 tw-h-12 tw-mx-auto tw-mb-3 tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-gray-400\">receipt</cide-ele-icon>\n </div>\n <h6 class=\"tw-text-sm tw-font-medium tw-text-gray-600 tw-mb-1\">No Fee Items Yet</h6>\n <p class=\"tw-text-xs tw-text-gray-500\">Click \"Add Fee Item\" to start adding fee items to this structure.</p>\n </div>\n }\n </div>\n }\n }\n \n <!-- Form Validation Errors -->\n @if (!isViewMode()) {\n <!-- Form Field Errors -->\n <div class=\"tw-w-full tw-mb-4\">\n <cide-form-field-error [formGroup]=\"feeStructureForm\"></cide-form-field-error>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-gap-3 tw-mt-6\">\n @if (!isEditMode()) {\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n }\n\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"onCancel()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n @if (!isInstallmentPercentagesValid()) {\n <div class=\"tw-w-full tw-mb-3 tw-p-2 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded tw-text-sm\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-text-red-700\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">error</cide-ele-icon>\n <span class=\"tw-font-medium\">Validation Error:</span>\n </div>\n <p class=\"tw-text-red-600 tw-mt-1 tw-ml-6\">\n All installment percentages must total exactly 100% before saving. Please adjust the percentages to continue.\n </p>\n </div>\n }\n \n <button cideEleButton type=\"submit\" variant=\"primary\" size=\"sm\" \n [disabled]=\"submitting() || loading() || !isInstallmentPercentagesValid()\" \n [loading]=\"submitting()\" \n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Fee Structure' : 'Create Fee Structure' }}\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </form>\n </div>\n</cide-lyt-shared-wrapper>\n\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport {\n cidePath,\n feesRoutesUrl,\n hostManagerRoutesUrl,\n generateStringFromObject,\n type MFeeStructure\n} from 'cloud-ide-lms-model';\n\n// Types for fee assignment (to be replaced with actual model types when available)\ninterface FeeAssignment {\n _id?: string;\n feeas_student_id?: string | { _id?: string; name?: string; class?: string; section?: string };\n feeas_fee_structure_id_feest?: string | { _id?: string; fees_structure_name?: string }; // Updated to match schema\n feeas_fee_structure_item_id_feesi?: string; // Updated to match schema\n feeas_academic_year_id_acayr?: string;\n feeas_entity_id_syen?: string;\n feeas_fee_category_sygms?: string;\n feeas_fee_name?: string;\n feeas_fee_description?: string;\n feeas_fee_type?: string;\n feeas_original_amount?: number;\n feeas_amount_after_discount?: number;\n feeas_discount_amount?: number;\n feeas_scholarship_amount?: number;\n feeas_tax_amount?: number;\n feeas_final_amount?: number;\n feeas_due_date?: Date;\n feeas_collection_start_date?: Date;\n feeas_collection_end_date?: Date;\n feeas_installment_count?: number;\n feeas_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\n feeas_amount_paid?: number;\n feeas_amount_remaining?: number;\n feeas_late_fee_applied?: number;\n feeas_remarks?: string;\n feeas_is_active?: boolean;\n feeas_assigned_by_user?: string;\n feeas_assigned_at?: Date;\n feeas_updated_at?: Date;\n student_name?: string;\n student_id?: string;\n class?: string;\n section?: string;\n fee_structure_name?: string;\n}\n\ninterface FeeAssignmentListPayload extends MFeeStructure {\n feeas_id?: string;\n feeas_student_id?: string;\n feeas_fee_structure_id_feest?: string; // Updated to match schema\n feeas_status?: string;\n}\n\ninterface FeeAssignmentInsertUpdatePayload {\n _id?: string;\n feeas_student_id?: string;\n feeas_fee_structure_id_feest?: string; // Updated to match schema field name\n feeas_fee_structure_item_id_feesi?: string; // Updated to match schema field name\n feeas_academic_year_id_acayr?: string;\n feeas_entity_id_syen?: string;\n feeas_fee_category_sygms?: string;\n feeas_fee_name?: string;\n feeas_fee_description?: string;\n feeas_fee_type?: string;\n feeas_original_amount?: number;\n feeas_amount_after_discount?: number;\n feeas_discount_amount?: number;\n feeas_scholarship_amount?: number;\n feeas_tax_amount?: number;\n feeas_final_amount?: number;\n feeas_due_date?: Date | string;\n feeas_collection_start_date?: Date | string;\n feeas_collection_end_date?: Date | string;\n feeas_installment_count?: number;\n feeas_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\n feeas_remarks?: string;\n feeas_is_active?: boolean;\n}\n\ninterface FeeAssignmentControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment[];\n total?: number;\n message?: string;\n}\n\ninterface FeeAssignmentByIdControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment;\n message?: string;\n}\n\ninterface FeeAssignmentInsertUpdateControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment;\n message?: string;\n}\n\ninterface FeeAssignmentDeletePayload {\n feeas_id: string;\n}\n\ninterface FeeAssignmentDeleteControllerResponse {\n success: boolean;\n code: number;\n message?: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideFeeFeeAssignmentService {\n private http = inject(HttpClient);\n\n /**\n * Get list of fee assignments\n * @param payload - Query parameters for filtering/pagination\n * @returns Observable of fee assignment list response\n */\n getFeeAssignmentList(payload: FeeAssignmentListPayload): Observable<FeeAssignmentControllerResponse> {\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment,\n query\n ]);\n\n return this.http.get<FeeAssignmentControllerResponse>(url);\n }\n\n /**\n * Get fee assignment by ID\n * @param assignmentId - Fee assignment ID\n * @returns Observable of fee assignment data\n */\n getFeeAssignmentById(assignmentId: string): Observable<FeeAssignmentByIdControllerResponse> {\n const query = generateStringFromObject({ feeas_id: assignmentId });\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment,\n 'byId',\n query\n ]);\n\n return this.http.get<FeeAssignmentByIdControllerResponse>(url);\n }\n\n /**\n * Create or update fee assignment\n * @param data - Fee assignment data to save\n * @returns Observable of the save response\n */\n saveUpdateFeeAssignment(data: FeeAssignmentInsertUpdatePayload): Observable<FeeAssignmentInsertUpdateControllerResponse> {\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment\n ]);\n\n return this.http.post<FeeAssignmentInsertUpdateControllerResponse>(url, data);\n }\n\n /**\n * Delete fee assignment\n * @param assignmentId - Fee assignment ID\n * @returns Observable of the delete response\n */\n deleteFeeAssignment(assignmentId: string): Observable<FeeAssignmentDeleteControllerResponse> {\n const query = generateStringFromObject({ feeas_id: assignmentId });\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment,\n 'delete',\n query\n ]);\n\n return this.http.delete<FeeAssignmentDeleteControllerResponse>(url);\n }\n\n /**\n * Waive fee assignment\n * @param assignmentId - Fee assignment ID\n * @returns Observable of the waive response\n */\n waiveFeeAssignment(assignmentId: string): Observable<FeeAssignmentInsertUpdateControllerResponse> {\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment,\n 'waive'\n ]);\n\n return this.http.patch<FeeAssignmentInsertUpdateControllerResponse>(url, { feeas_id: assignmentId });\n }\n}\n\n","import { \n Component, \n signal, \n computed, \n viewChild, \n TemplateRef, \n DestroyRef, \n inject, \n OnInit,\n type OnDestroy \n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { \n CideEleDataGridComponent, \n CideIconComponent, \n CideEleButtonComponent, \n CideSelectComponent,\n type GridConfiguration, \n type GridEvent, \n CideEleDropdownComponent, \n type DropdownItem, \n type TemplateContext, \n type DropdownConfig, \n ConfirmationService,\n NotificationService \n} from 'cloud-ide-element';\nimport { \n generateStringFromObject\n} from 'cloud-ide-lms-model';\nimport { AppStateHelperService, CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { ACADEMIC_YEAR_SERVICE_TOKEN, type IAcademicYearService, CLASS_PROGRAM_MASTER_SERVICE_TOKEN, type IClassProgramMasterService } from 'cloud-ide-shared';\nimport { CideFeeFeeAssignmentService } from '../../services/fee-assignment.service';\n\n// Types\ninterface FeeAssignmentData {\n _id?: string;\n feeas_student_id?: string;\n student_name?: string;\n student_id?: string;\n class?: string;\n section?: string;\n fee_structure_name?: string;\n feeas_amount_original?: number;\n feeas_amount_paid?: number;\n feeas_amount_remaining?: number;\n feeas_due_date?: Date;\n feeas_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\n}\n\n@Component({\n selector: 'cide-fee-assignment-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideEleDropdownComponent,\n CideSelectComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './fee-assignment-list.component.html',\n styles: [`\n .fee-assignment-listing-container {\n @apply tw-w-full tw-h-full;\n }\n \n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class FeeAssignmentListComponent implements OnInit, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n private readonly appState = inject(AppStateHelperService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly notificationService = inject(NotificationService);\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\n private readonly classProgramService = inject<IClassProgramMasterService>(CLASS_PROGRAM_MASTER_SERVICE_TOKEN);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly rightsService = inject(RightsService);\n\n readonly studentDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('studentDetailsRendererTemplate');\n readonly amountRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('amountRendererTemplate');\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\n readonly actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n readonly feeAssignments = signal<FeeAssignmentData[]>([]);\n readonly loading = signal<boolean>(false);\n readonly error = signal<string | null>(null);\n\n readonly currentPage = signal<number>(1);\n readonly pageSize = signal<number>(10);\n readonly totalItems = signal<number>(0);\n readonly totalPages = signal<number>(0);\n\n readonly searchQuery = signal<string>('');\n readonly sortColumn = signal<string>('student_name');\n readonly sortDirection = signal<'asc' | 'desc'>('asc');\n\n readonly selectedStatusFilter = signal<string>('');\n readonly selectedAcademicYearFilter = signal<string>('');\n readonly selectedClassFilter = signal<string>('');\n readonly selectedSectionFilter = signal<string>('');\n\n readonly academicYearOptions = signal<Array<{value: string; label: string}>>([]);\n readonly classOptions = signal<Array<{value: string; label: string}>>([]);\n readonly sectionOptions = signal<Array<{value: string; label: string}>>([]);\n\n readonly stats = computed(() => ({\n total: this.feeAssignments().length,\n pending: this.feeAssignments().filter(a => a.feeas_status === 'PENDING').length,\n partial: this.feeAssignments().filter(a => a.feeas_status === 'PARTIALLY_PAID').length,\n paid: this.feeAssignments().filter(a => a.feeas_status === 'PAID').length\n }));\n\n readonly gridConfig = computed<GridConfiguration<FeeAssignmentData>>(() => ({\n id: 'fee-assignment-list-grid',\n columns: [\n {\n key: 'student_id',\n header: 'Student ID',\n type: 'text',\n width: '120px',\n truncate: true,\n align: 'left',\n sortable: true\n },\n {\n key: 'student',\n header: 'Student Details',\n type: 'custom',\n width: 'auto',\n truncate: true,\n align: 'left',\n renderer: 'studentDetailsRenderer',\n sortable: true\n },\n {\n key: 'fee_structure_name',\n header: 'Fee Structure',\n type: 'text',\n width: '200px',\n truncate: true,\n align: 'left',\n sortable: true\n },\n {\n key: 'total_amount',\n header: 'Total Amount',\n type: 'custom',\n width: '150px',\n truncate: false,\n align: 'right',\n renderer: 'amountRenderer',\n sortable: true\n },\n {\n key: 'feeas_due_date',\n header: 'Due Date',\n type: 'date',\n width: '120px',\n truncate: false,\n align: 'left',\n sortable: true\n },\n {\n key: 'feeas_status',\n header: 'Status',\n type: 'custom',\n width: '140px',\n truncate: false,\n align: 'center',\n renderer: 'statusRenderer'\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'custom',\n width: '80px',\n truncate: false,\n align: 'center',\n renderer: 'actionsDropdownRenderer'\n }\n ],\n data: this.feeAssignments(),\n trackBy: '_id',\n pagination: {\n enabled: true,\n pageSize: this.pageSize(),\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search by student name, ID...',\n searchableColumns: ['student_name', 'student_id'],\n debounceMs: 300,\n showClearButton: true\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: this.loading()\n },\n scroll: {\n enabled: true,\n maxHeight: '',\n minHeight: '',\n stickyHeader: true,\n virtualScroll: false,\n rowHeight: 50\n },\n export: {\n enabled: true,\n formats: ['csv', 'excel', 'pdf'],\n filename: 'fee-assignments',\n includeHeaders: true\n },\n responsive: true,\n striped: false,\n bordered: true,\n compact: false,\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\n }));\n\n // Rights computed signals\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n\n ngOnInit(): void {\n // Initialize rights for fee assignment management\n this.rightsService.initializeRights('fee_assignment');\n console.log('๐ฐ Fee Assignment List Component initialized');\n this.initializeBreadcrumbData();\n this.loadDropdownOptions();\n this.loadFeeAssignments();\n }\n\n private initializeBreadcrumbData(): void {\n this.breadcrumbData.set([\n {\n id: 'list',\n label: 'List',\n icon: 'list',\n url: undefined\n }\n ]);\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n private loadDropdownOptions(): void {\n // Load academic years\n this.academicYearService.getAcademicYearList({ pageIndex: 1, pageSize: 100, pagination: false }).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.academicYearOptions.set(response.data.map(ay => ({\n value: ay._id || '',\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\n })));\n }\n }\n });\n\n // Load class programs\n this.classProgramService.searchClassProgramMasters({ pagination: false }).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.classOptions.set(response.data.map(cp => ({\n value: cp._id || '',\n label: cp.acacpm_alise_title || ''\n })));\n }\n }\n });\n }\n\n loadFeeAssignments(): void {\n this.loading.set(true);\n this.error.set(null);\n\n const payload: any = {\n pagination: true,\n pageIndex: this.currentPage(),\n pageSize: this.pageSize(),\n query: this.searchQuery() || '',\n feeas_status: this.selectedStatusFilter() || undefined\n };\n\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n // Transform API response to component format\n this.feeAssignments.set(\n response.data.map((item: any) => ({\n _id: item._id,\n feeas_student_id: item.feeas_student_id,\n student_name: item.student_name || item.feeas_student_id?.name || 'N/A',\n student_id: item.student_id || item.feeas_student_id?._id || '',\n class: item.class || item.feeas_student_id?.class || 'N/A',\n section: item.section || item.feeas_student_id?.section || 'N/A',\n fee_structure_name: item.fee_structure_name || item.feeas_structure_id_fees?.fees_structure_name || 'N/A',\n feeas_amount_original: item.feeas_amount_original || 0,\n feeas_amount_paid: item.feeas_amount_paid || 0,\n feeas_amount_remaining: item.feeas_amount_remaining || item.feeas_final_amount || 0,\n feeas_due_date: item.feeas_due_date ? new Date(item.feeas_due_date) : undefined,\n feeas_status: item.feeas_status || 'PENDING'\n }))\n );\n this.totalItems.set(response.total || response.data.length);\n this.totalPages.set(Math.ceil((response.total || response.data.length) / this.pageSize()));\n } else {\n this.feeAssignments.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n }\n },\n error: (err) => {\n console.error('Error loading fee assignments:', err);\n this.error.set('Failed to load fee assignments');\n this.notificationService.error('Failed to load fee assignments');\n this.feeAssignments.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n }\n\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\n studentDetailsRenderer: this.studentDetailsRendererTemplate(),\n amountRenderer: this.amountRendererTemplate(),\n statusRenderer: this.statusRendererTemplate(),\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate()\n }));\n\n onGridEvent(event: GridEvent<any>): void {\n switch (event.type) {\n case 'pageChange':\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\n this.currentPage.set(event.data['pageIndex'] as number);\n this.pageSize.set(event.data['pageSize'] as number);\n this.loadFeeAssignments();\n }\n break;\n case 'search':\n this.searchQuery.set(event.data as string);\n this.currentPage.set(1);\n this.loadFeeAssignments();\n break;\n case 'refresh':\n this.loadFeeAssignments();\n break;\n case 'sort':\n if (event.data && typeof event.data === 'object' && 'column' in event.data && 'direction' in event.data) {\n this.sortColumn.set(event.data['column'] as string);\n this.sortDirection.set(event.data['direction'] as 'asc' | 'desc');\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n break;\n case 'export':\n if (event.data && typeof event.data === 'string') {\n this.handleExport(event.data);\n }\n break;\n default:\n console.log('๐ Unhandled grid event:', event.type);\n }\n }\n\n onStatusFilterChange(value: string | number | string[] | null | undefined): void {\n this.selectedStatusFilter.set(String(value || ''));\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n onAcademicYearFilterChange(value: string | number | string[] | null | undefined): void {\n this.selectedAcademicYearFilter.set(String(value || ''));\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n onClassFilterChange(value: string | number | string[] | null | undefined): void {\n this.selectedClassFilter.set(String(value || ''));\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n onSectionFilterChange(value: string | number | string[] | null | undefined): void {\n this.selectedSectionFilter.set(String(value || ''));\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n clearFilters(): void {\n this.selectedStatusFilter.set('');\n this.selectedAcademicYearFilter.set('');\n this.selectedClassFilter.set('');\n this.selectedSectionFilter.set('');\n this.searchQuery.set('');\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n navigateToAssign(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to create fee assignments');\n return;\n }\n this.router.navigate(['/control-panel/assignment/create']);\n }\n\n bulkAssign(): void {\n if (!this.rightsService.hasRight('BULK_ASSIGN')) {\n this.notificationService.error('You do not have permission to perform bulk assignments');\n return;\n }\n this.notificationService.info('Bulk assignment feature will open in a new window.');\n }\n\n viewDetails(assignment: FeeAssignmentData): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view fee assignments');\n return;\n }\n console.log('View details:', assignment);\n const queryParams = generateStringFromObject({ feeas_id: assignment._id });\n this.router.navigate(['/control-panel/assignment/view', queryParams]);\n }\n\n modifyAssignment(assignment: FeeAssignmentData): void {\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to modify fee assignments');\n return;\n }\n console.log('Modify assignment:', assignment);\n const queryParams = generateStringFromObject({ feeas_id: assignment._id });\n this.router.navigate(['/control-panel/assignment/edit', queryParams]);\n }\n\n waiveOff(assignment: FeeAssignmentData): void {\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to waive fees');\n return;\n }\n this.confirmationService.ask({\n title: 'Waive Off Fee',\n message: `Are you sure you want to waive off the fee for ${assignment.student_name}? This action cannot be undone.`,\n confirmText: 'Waive Off',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.feeAssignmentService.waiveFeeAssignment(assignment._id || '').subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success('Fee waived off successfully.');\n this.loadFeeAssignments();\n } else {\n this.notificationService.error(response?.message || 'Failed to waive fee');\n }\n },\n error: (err) => {\n console.error('Error waiving fee:', err);\n this.notificationService.error('Failed to waive fee. Please try again.');\n }\n });\n }\n });\n }\n\n getDropdownConfig(): DropdownConfig {\n return {\n triggerIcon: 'more_vert',\n triggerSize: 'sm'\n };\n }\n\n getActionDropdownItems(assignment: FeeAssignmentData): DropdownItem[] {\n const items: DropdownItem[] = [];\n \n if (this.canView()) {\n items.push({\n id: 'view',\n label: 'View Details',\n icon: 'visibility',\n iconColor: 'tw-text-gray-400',\n textColor: 'tw-text-gray-700',\n hoverBgColor: 'hover:tw-bg-gray-100'\n });\n }\n \n if (this.canEdit()) {\n items.push({\n id: 'modify',\n label: 'Modify',\n icon: 'edit',\n iconColor: 'tw-text-blue-400',\n textColor: 'tw-text-blue-600',\n hoverBgColor: 'hover:tw-bg-blue-50'\n });\n \n items.push({\n id: 'waive',\n label: 'Waive Off',\n icon: 'cancel',\n iconColor: 'tw-text-red-400',\n textColor: 'tw-text-red-600',\n hoverBgColor: 'hover:tw-bg-red-50'\n });\n }\n \n return items;\n }\n\n onDropdownItemClick(item: DropdownItem, assignment: FeeAssignmentData): void {\n switch (item.id) {\n case 'view':\n this.viewDetails(assignment);\n break;\n case 'modify':\n this.modifyAssignment(assignment);\n break;\n case 'waive':\n this.waiveOff(assignment);\n break;\n default:\n console.log('โ Unknown dropdown item clicked:', item.id);\n }\n }\n\n private handleExport(format: string): void {\n console.log(`๐ค Exporting fee assignments as ${format}`);\n // TODO: Implement export functionality\n }\n\n formatCurrency(amount: number | undefined): string {\n if (!amount) return 'โน0.00';\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n formatDate(date: string | Date | null | undefined): string {\n if (!date) return '-';\n return new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n }\n\n getStatusBadgeClass(assignment: FeeAssignmentData): string {\n switch (assignment.feeas_status) {\n case 'PAID':\n return 'tw-bg-green-100 tw-text-green-800';\n case 'PARTIALLY_PAID':\n return 'tw-bg-blue-100 tw-text-blue-800';\n case 'PENDING':\n return 'tw-bg-yellow-100 tw-text-yellow-800';\n case 'WAIVED':\n return 'tw-bg-purple-100 tw-text-purple-800';\n case 'CANCELLED':\n return 'tw-bg-red-100 tw-text-red-800';\n default:\n return 'tw-bg-gray-100 tw-text-gray-800';\n }\n }\n\n getStatusText(assignment: FeeAssignmentData): string {\n return assignment.feeas_status || 'Unknown';\n }\n}\n","<!-- Fee Assignment Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_assignment' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"navigateToAssign()\">\n Assign Fees\n </button>\n <button cideEleButton variant=\"secondary\" size=\"sm\" leftIcon=\"group_add\" (click)=\"bulkAssign()\">\n Bulk Assignment\n </button>\n </div>\n\n <div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Stats Row -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-6 tw-py-4 tw-bg-gray-50 tw-border-b tw-border-gray-200\">\n <div class=\"tw-grid tw-grid-cols-1 sm:tw-grid-cols-4 tw-gap-4\">\n <div class=\"tw-bg-white tw-p-4 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-text-xs tw-text-gray-500 tw-mb-1\">Total Assigned</div>\n <div class=\"tw-text-2xl tw-font-bold tw-text-gray-900\">{{ stats().total }}</div>\n </div>\n <div class=\"tw-bg-white tw-p-4 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-text-xs tw-text-gray-500 tw-mb-1\">Pending</div>\n <div class=\"tw-text-2xl tw-font-bold tw-text-yellow-600\">{{ stats().pending }}</div>\n </div>\n <div class=\"tw-bg-white tw-p-4 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-text-xs tw-text-gray-500 tw-mb-1\">Partially Paid</div>\n <div class=\"tw-text-2xl tw-font-bold tw-text-blue-600\">{{ stats().partial }}</div>\n </div>\n <div class=\"tw-bg-white tw-p-4 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-text-xs tw-text-gray-500 tw-mb-1\">Paid</div>\n <div class=\"tw-text-2xl tw-font-bold tw-text-green-600\">{{ stats().paid }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Filters Row -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-6 tw-py-4 tw-bg-gray-50 tw-border-b tw-border-gray-200\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-4 tw-gap-4\">\n <cide-ele-select \n label=\"Academic Year\" \n [options]=\"academicYearOptions()\"\n [ngModel]=\"selectedAcademicYearFilter()\"\n (ngModelChange)=\"onAcademicYearFilterChange($event)\"\n size=\"sm\"\n placeholder=\"All Academic Years\">\n </cide-ele-select>\n\n <cide-ele-select \n label=\"Class/Program\" \n [options]=\"classOptions()\"\n [ngModel]=\"selectedClassFilter()\"\n (ngModelChange)=\"onClassFilterChange($event)\"\n size=\"sm\"\n placeholder=\"All Classes\">\n </cide-ele-select>\n\n <cide-ele-select \n label=\"Section\" \n [options]=\"sectionOptions()\"\n [ngModel]=\"selectedSectionFilter()\"\n (ngModelChange)=\"onSectionFilterChange($event)\"\n size=\"sm\"\n placeholder=\"All Sections\">\n </cide-ele-select>\n\n <cide-ele-select \n label=\"Status\" \n [options]=\"[\n {value: '', label: 'All Status'},\n {value: 'PENDING', label: 'Pending'},\n {value: 'PARTIALLY_PAID', label: 'Partially Paid'},\n {value: 'PAID', label: 'Paid'},\n {value: 'WAIVED', label: 'Waived'}\n ]\"\n [ngModel]=\"selectedStatusFilter()\"\n (ngModelChange)=\"onStatusFilterChange($event)\"\n size=\"sm\"\n placeholder=\"All Status\">\n </cide-ele-select>\n </div>\n <div class=\"tw-mt-3\">\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"clearFilters()\">\n Clear Filters\n </button>\n </div>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-h-full tw-relative\">\n\n <!-- Data Grid Component -->\n <div class=\"tw-h-full tw-overflow-auto\">\n <cide-ele-data-grid [config]=\"gridConfig()\" [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n\n </div>\n </div>\n\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #studentDetailsRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-w-full\">\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.student_name || 'N/A' }}</div>\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate\">{{ row.class || '' }} / {{ row.section || '' }}</div>\n </div>\n</ng-template>\n\n<ng-template #amountRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-text-sm tw-items-end\">\n <span class=\"tw-text-gray-900 tw-font-semibold\">{{ formatCurrency(row.feeas_amount_original) }}</span>\n <div class=\"tw-text-xs tw-text-gray-500\">\n Paid: {{ formatCurrency(row.feeas_amount_paid) }}\n </div>\n <div class=\"tw-text-xs tw-font-semibold\" [ngClass]=\"row.feeas_amount_remaining > 0 ? 'tw-text-red-600' : 'tw-text-green-600'\">\n Outstanding: {{ formatCurrency(row.feeas_amount_remaining) }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #statusRendererTemplate let-row=\"row\">\n <span class=\"tw-inline-flex tw-items-center tw-justify-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-text-center\"\n [ngClass]=\"getStatusBadgeClass(row)\">\n <cide-ele-icon size=\"2xs\" class=\"tw-mr-1\">\n {{ row.feeas_status === 'PAID' ? 'check_circle' : \n row.feeas_status === 'PARTIALLY_PAID' ? 'schedule' : \n row.feeas_status === 'PENDING' ? 'pending' : 'cancel' }}\n </cide-ele-icon>\n {{ getStatusText(row) }}\n </span>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\n <cide-ele-dropdown \n [items]=\"getActionDropdownItems(row)\"\n [config]=\"getDropdownConfig()\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template>\n\n","import { \n Component, \n inject, \n signal, \n OnInit, \n DestroyRef, \n OnDestroy,\n computed\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { \n FormBuilder, \n FormGroup, \n ReactiveFormsModule, \n Validators,\n FormControl\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { forkJoin } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { \n CideTextareaComponent, \n CideEleButtonComponent, \n CideIconComponent,\n NotificationService,\n ConfirmationService,\n CideFormFieldErrorComponent\n} from 'cloud-ide-element';\nimport { ComponentContextService } from 'cloud-ide-layout';\nimport { \n ENTITY_SERVICE_TOKEN, \n type IEntityService, \n ACADEMIC_YEAR_SERVICE_TOKEN, \n type IAcademicYearService\n} from 'cloud-ide-shared';\nimport {\n generateObjectFromString,\n generateStringFromObject,\n MAcademicYear,\n MFeeStructure,\n type feeStructureControllerResponse,\n type feeStructureByIdControllerResponse,\n type FeeStructure as FeeStructureType,\n FeeStructureResponse,\n FeeStructureItem,\n type FeeStructureByIdResponse,\n MFeeStructureGetByIdPayload\n} from 'cloud-ide-lms-model';\nimport { CideSelectComponent } from 'cloud-ide-element';\nimport { CideInputComponent } from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { ProgramSectionSelectorWrapperComponent } from 'cloud-ide-shared';\nimport { CideFeeFeeStructureService } from '../../../fee-structure-management/services/fee-structure.service';\nimport { CideFeeFeeAssignmentService } from '../../services/fee-assignment.service';\n\n// Types\ninterface Entity {\n _id?: string;\n syen_name?: string;\n syen_code?: string;\n}\n\ninterface AcademicYear {\n _id?: string;\n acayr_name?: string;\n acayr_code?: string;\n}\n\ninterface LocalFeeStructure {\n _id?: string;\n fees_structure_name?: string;\n fees_structure_code?: string;\n}\n\n// Fee assignment fee item type - extends FeeStructureItem to include all item properties\ntype FeeAssignmentFeeItem = FeeStructureItem & {\n fees_structure_name?: string;\n fees_category_name?: string;\n fees_total_amount?: number;\n fees_amount?: number;\n fees_structure_id?: string;\n discount_amount?: number;\n scholarship_amount?: number;\n};\n\n@Component({\n selector: 'cide-fee-assignment-create',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideSelectComponent,\n CideIconComponent,\n CideLytSharedWrapperComponent,\n ProgramSectionSelectorWrapperComponent,\n CideFormFieldErrorComponent\n ],\n templateUrl: './fee-assignment-create.component.html'\n})\nexport class FeeAssignmentCreateComponent implements OnInit, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n private readonly fb = inject(FormBuilder);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly entityService = inject<IEntityService>(ENTITY_SERVICE_TOKEN);\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly componentContextService = inject(ComponentContextService);\n\n assignmentForm!: FormGroup;\n readonly loading = signal<boolean>(false);\n readonly submitting = signal<boolean>(false);\n\n readonly assignmentId = signal<string>('');\n readonly isEditMode = signal<boolean>(false);\n readonly isViewMode = signal<boolean>(false);\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n readonly entityOptions = signal<Entity[]>([]);\n readonly academicYearOptions = signal<AcademicYear[]>([]);\n readonly feeStructureOptions = signal<LocalFeeStructure[]>([]);\n readonly entityLoading = signal<boolean>(false);\n readonly academicYearLoading = signal<boolean>(false);\n readonly feeStructureLoading = signal<boolean>(false);\n\n // Fee insights\n readonly applicableFees = signal<FeeAssignmentFeeItem[]>([]);\n readonly feesLoading = signal<boolean>(false);\n readonly discountControls = signal<Map<string, FormControl>>(new Map());\n readonly scholarshipControls = signal<Map<string, FormControl>>(new Map());\n\n readonly feeSourceOptions = [\n { value: 'STRUCTURE', label: 'From Fee Structure' },\n { value: 'CUSTOM', label: 'Custom Fee' }\n ];\n\n readonly feeCategoryOptions = [\n { value: 'TUITION', label: 'Tuition' },\n { value: 'EXAM', label: 'Exam' },\n { value: 'LIBRARY', label: 'Library' },\n { value: 'LAB', label: 'Lab' },\n { value: 'SPORTS', label: 'Sports' },\n { value: 'TRANSPORT', label: 'Transport' },\n { value: 'HOSTEL', label: 'Hostel' },\n { value: 'OTHER', label: 'Other' }\n ];\n\n readonly feeTypeOptions = [\n { value: 'ONE_TIME', label: 'One Time' },\n { value: 'RECURRING', label: 'Recurring' }\n ];\n\n readonly showCustomFeeFields = computed(() => {\n return this.assignmentForm?.get('fee_source')?.value === 'CUSTOM';\n });\n\n readonly showFeeStructureField = computed(() => {\n return this.assignmentForm?.get('fee_source')?.value === 'STRUCTURE';\n });\n\n readonly totalAmount = computed(() => {\n const original = parseFloat(this.assignmentForm?.get('feeas_original_amount')?.value || '0') || 0;\n const discount = parseFloat(this.assignmentForm?.get('feeas_discount_amount')?.value || '0') || 0;\n const scholarship = parseFloat(this.assignmentForm?.get('feeas_scholarship_amount')?.value || '0') || 0;\n return Math.max(0, original - discount - scholarship);\n });\n\n constructor() {\n this.initializeForm();\n }\n\n private initializeForm(): void {\n this.assignmentForm = this.fb.group({\n // Student Information\n student_id: ['', [Validators.required]],\n student_search: [''],\n feeas_academic_year_id_acayr: ['', [Validators.required]],\n feeas_entity_id_syen: ['', [Validators.required]],\n \n // Academic Information (for fee structure loading)\n class_program_id: [''],\n branch_id: [''],\n term_id: [''],\n section_id: [''],\n \n // Fee Information\n fee_source: ['STRUCTURE', [Validators.required]],\n feeas_fee_structure_id_feest: [''],\n \n // Custom Fee Fields\n feeas_fee_category_sygms: [''],\n feeas_fee_name: [''],\n feeas_fee_type: ['ONE_TIME'],\n feeas_original_amount: [0, [Validators.required, Validators.min(0)]],\n \n // Payment Details\n feeas_due_date: ['', [Validators.required]],\n feeas_installment_count: [1, [Validators.min(1), Validators.max(12)]],\n \n // Discounts & Scholarships\n feeas_discount_amount: [0, [Validators.min(0)]],\n feeas_scholarship_amount: [0, [Validators.min(0)]],\n \n // Additional\n feeas_remarks: ['']\n });\n\n // Set conditional validators based on fee source\n this.assignmentForm.get('fee_source')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(source => {\n if (source === 'STRUCTURE') {\n this.assignmentForm.get('feeas_fee_structure_id_feest')?.setValidators([Validators.required]);\n this.assignmentForm.get('feeas_fee_category_sygms')?.clearValidators();\n this.assignmentForm.get('feeas_fee_name')?.clearValidators();\n this.assignmentForm.get('feeas_original_amount')?.clearValidators();\n } else if (source === 'CUSTOM') {\n this.assignmentForm.get('feeas_fee_structure_id_feest')?.clearValidators();\n this.assignmentForm.get('feeas_fee_category_sygms')?.setValidators([Validators.required]);\n this.assignmentForm.get('feeas_fee_name')?.setValidators([Validators.required]);\n this.assignmentForm.get('feeas_original_amount')?.setValidators([Validators.required, Validators.min(0)]);\n }\n this.assignmentForm.updateValueAndValidity();\n });\n\n // Watch for program/term/section changes to load fees\n this.assignmentForm.get('term_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.assignmentForm.get('fee_source')?.value === 'STRUCTURE') {\n this.loadApplicableFees();\n }\n });\n\n this.assignmentForm.get('section_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.assignmentForm.get('fee_source')?.value === 'STRUCTURE' && this.assignmentForm.get('term_id')?.value) {\n this.loadApplicableFees();\n }\n });\n\n // Watch for student search changes\n this.assignmentForm.get('student_search')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n this.onStudentSearch(value);\n });\n }\n\n private rightsService = inject(RightsService);\n\n ngOnInit(): void {\n // Initialize rights for fee assignment management\n this.rightsService.initializeRights('fee_assignment');\n this.initializeComponent();\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n private initializeComponent(): void {\n this.updateBreadcrumbData();\n\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\n const queryParams = params['query'];\n \n if (queryParams) {\n const queryData = generateObjectFromString(queryParams);\n if (queryData?.feeas_id) {\n this.assignmentId.set(queryData.feeas_id as string);\n this.isEditMode.set(true);\n this.loadAssignmentData(queryData.feeas_id as string);\n }\n } else {\n this.isEditMode.set(false);\n }\n\n // Always load dropdown options\n this.loadDropdownOptions();\n });\n\n // Check if view mode\n const path = this.route.snapshot.url.map(segment => segment.path).join('/');\n this.isViewMode.set(path.includes('view'));\n \n if (this.isViewMode()) {\n this.assignmentForm.disable();\n }\n\n // Update breadcrumb after mode is determined\n this.updateBreadcrumbData();\n }\n\n private loadDropdownOptions(): void {\n // Load entity options\n this.entityLoading.set(true);\n this.entityService.getEntityList({}).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.entityOptions.set(response.data);\n }\n this.entityLoading.set(false);\n },\n error: () => {\n this.entityLoading.set(false);\n }\n });\n\n // Load academic year options\n this.academicYearLoading.set(true);\n const academicYearPayload: MAcademicYear = {\n pageIndex: 1,\n pageSize: 100,\n pagination: false\n };\n this.academicYearService.getAcademicYearList(academicYearPayload).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.academicYearOptions.set(response.data);\n }\n this.academicYearLoading.set(false);\n },\n error: () => {\n this.academicYearLoading.set(false);\n }\n });\n\n // Load fee structure options\n this.loadFeeStructures();\n }\n\n private loadFeeStructures(): void {\n this.feeStructureLoading.set(true);\n const payload = new MFeeStructure({\n fees_is_active: true,\n pagination: false\n });\n \n this.feeStructureService.getFeeStructureList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n this.feeStructureOptions.set(\n response.data.map(fs => ({\n _id: fs._id,\n fees_structure_name: fs.fees_structure_name || '',\n fees_structure_code: fs.fees_structure_code || ''\n }))\n );\n } else {\n this.feeStructureOptions.set([]);\n }\n },\n error: (err) => {\n console.error('Error loading fee structures:', err);\n this.notificationService.error('Failed to load fee structures');\n this.feeStructureOptions.set([]);\n },\n complete: () => {\n this.feeStructureLoading.set(false);\n }\n });\n }\n\n private loadAssignmentData(id: string): void {\n this.loading.set(true);\n this.feeAssignmentService.getFeeAssignmentById(id).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const data = response.data;\n // Extract fee structure ID from response (could be string or populated object)\n const feeStructureId = typeof data.feeas_fee_structure_id_feest === 'string' \n ? data.feeas_fee_structure_id_feest \n : (data.feeas_fee_structure_id_feest as any)?._id || '';\n \n this.assignmentForm.patchValue({\n student_id: data.feeas_student_id || '',\n fee_source: feeStructureId ? 'STRUCTURE' : 'CUSTOM',\n feeas_fee_structure_id_feest: feeStructureId || '',\n feeas_fee_category_sygms: data.feeas_fee_category_sygms || '',\n feeas_fee_name: data.feeas_fee_name || '',\n feeas_fee_description: data.feeas_fee_description || '',\n feeas_fee_type: data.feeas_fee_type || 'ONE_TIME',\n feeas_original_amount: data.feeas_original_amount || 0,\n feeas_discount_amount: data.feeas_discount_amount || 0,\n feeas_scholarship_amount: data.feeas_scholarship_amount || 0,\n feeas_due_date: data.feeas_due_date ? new Date(data.feeas_due_date).toISOString().split('T')[0] : '',\n feeas_installment_count: data.feeas_installment_count || 1,\n feeas_remarks: data.feeas_remarks || ''\n });\n }\n },\n error: (err) => {\n console.error('Error loading assignment data:', err);\n this.notificationService.error('Failed to load assignment data');\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n }\n\n onStudentSearch(query: string | number | boolean | null | undefined): void {\n const searchQuery = String(query || '');\n if (searchQuery.length < 3) return;\n \n this.loading.set(true);\n // TODO: Implement student search API call\n // For now, this is a placeholder - should be replaced with actual student search service\n setTimeout(() => {\n this.assignmentForm.patchValue({ student_id: 'STU001' });\n this.loading.set(false);\n }, 500);\n }\n\n /**\n * Handler for program section selector value changes\n */\n onProgramSectionValuesChange(values: { classProgramId?: string | null; branchId?: string | null; termId?: string | null; sectionId?: string | null }): void {\n if (this.assignmentForm.get('fee_source')?.value === 'STRUCTURE') {\n this.loadApplicableFees();\n }\n }\n\n /**\n * Load applicable fees based on selected program/term/section\n */\n loadApplicableFees(): void {\n const classProgramId = this.assignmentForm.get('class_program_id')?.value;\n const branchId = this.assignmentForm.get('branch_id')?.value;\n const programTermId = this.assignmentForm.get('term_id')?.value;\n const sectionId = this.assignmentForm.get('section_id')?.value;\n const entityId = this.assignmentForm.get('feeas_entity_id_syen')?.value;\n const academicYearId = this.assignmentForm.get('feeas_academic_year_id_acayr')?.value;\n\n if (!classProgramId || !programTermId || !entityId || !academicYearId) {\n this.applicableFees.set([]);\n return;\n }\n\n this.feesLoading.set(true);\n\n // Build payload with all academic filters\n const payloadData: Partial<MFeeStructure> = {\n fees_class_program_id_acacpm: classProgramId,\n fees_class_program_term_id_acapt: programTermId,\n fees_entity_id_syen: entityId,\n fees_academic_year_id_acayr: academicYearId,\n fees_is_active: true,\n pagination: false,\n pageIndex: 1,\n pageSize: 100\n };\n\n // Include branch if selected\n if (branchId) {\n payloadData.fees_class_program_branch_id_acabrn = branchId;\n }\n\n // Include section if selected\n if (sectionId) {\n payloadData.fees_program_term_section_id_acapts = sectionId;\n }\n\n const payload = new MFeeStructure(payloadData);\n\n this.feeStructureService.getFeeStructureList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: feeStructureControllerResponse) => {\n if (response?.success && response?.data) {\n const feeStructures = Array.isArray(response.data) ? response.data : [];\n \n if (feeStructures.length === 0) {\n this.applicableFees.set([]);\n this.feesLoading.set(false);\n return;\n }\n \n // Fetch fee items for all structures in parallel\n const feeItemRequests = feeStructures.map(structure => \n this.feeStructureService.getFeeStructureById({ fees_id: structure._id || '' })\n .pipe(takeUntilDestroyed(this.destroyRef))\n );\n \n forkJoin(feeItemRequests).subscribe({\n next: (responses: feeStructureByIdControllerResponse[]) => {\n const allFeeItems: FeeAssignmentFeeItem[] = [];\n \n responses.forEach((itemResponse, index) => {\n if (itemResponse?.success && itemResponse?.data) {\n const structure = feeStructures[index];\n const isFeeStructureByIdResponse = (data: FeeStructureByIdResponse | FeeStructureResponse): data is FeeStructureByIdResponse => {\n return data !== null && typeof data === 'object' && 'fee_structure' in data;\n };\n \n let feeItems: FeeStructureItem[] = [];\n if (isFeeStructureByIdResponse(itemResponse.data)) {\n feeItems = itemResponse.data.fee_structure_items || [];\n }\n \n // Transform fee items to FeeAssignmentFeeItem format\n feeItems.forEach(item => {\n if (item.feesi_is_active !== false) {\n let categoryName = 'N/A';\n if (item.feesi_category_id_sygms) {\n if (typeof item.feesi_category_id_sygms === 'object' && item.feesi_category_id_sygms !== null) {\n categoryName = (item.feesi_category_id_sygms as any)?.sygms_title || \n (item.feesi_category_id_sygms as any)?.sygms_name || \n item.feesi_item_code || \n 'N/A';\n }\n } else {\n categoryName = item.feesi_item_code || 'N/A';\n }\n\n const feeItem: FeeAssignmentFeeItem = {\n ...item,\n fees_structure_id: structure._id,\n fees_structure_name: structure.fees_structure_name || '',\n fees_category_name: categoryName,\n fees_amount: item.feesi_amount || 0,\n fees_total_amount: item.feesi_amount || 0,\n discount_amount: 0,\n scholarship_amount: 0\n };\n\n allFeeItems.push(feeItem);\n\n // Create discount and scholarship controls for each fee item\n const feeId = item._id || '';\n if (feeId && !this.discountControls().has(feeId)) {\n const discountControl = this.fb.control(0, [Validators.min(0)]);\n this.discountControls.update(map => {\n const newMap = new Map(map);\n newMap.set(feeId, discountControl);\n return newMap;\n });\n this.assignmentForm.addControl(`discount_${feeId}`, discountControl);\n }\n\n if (feeId && !this.scholarshipControls().has(feeId)) {\n const scholarshipControl = this.fb.control(0, [Validators.min(0)]);\n this.scholarshipControls.update(map => {\n const newMap = new Map(map);\n newMap.set(feeId, scholarshipControl);\n return newMap;\n });\n this.assignmentForm.addControl(`scholarship_${feeId}`, scholarshipControl);\n }\n }\n });\n }\n });\n\n this.applicableFees.set(allFeeItems);\n },\n error: (err) => {\n console.error('Error loading fee items:', err);\n this.notificationService.error('Failed to load fee items');\n this.applicableFees.set([]);\n },\n complete: () => {\n this.feesLoading.set(false);\n }\n });\n } else {\n this.applicableFees.set([]);\n this.feesLoading.set(false);\n }\n },\n error: (err) => {\n console.error('Error loading fee structures:', err);\n this.notificationService.error('Failed to load fee structures');\n this.applicableFees.set([]);\n this.feesLoading.set(false);\n }\n });\n }\n\n /**\n * Get discount control for a fee item\n */\n getDiscountControl(feeId: string): FormControl {\n return this.discountControls().get(feeId) || this.fb.control(0);\n }\n\n /**\n * Get scholarship control for a fee item\n */\n getScholarshipControl(feeId: string): FormControl {\n return this.scholarshipControls().get(feeId) || this.fb.control(0);\n }\n\n /**\n * Get fee ID for tracking\n */\n getFeeId(fee: FeeAssignmentFeeItem): string {\n return fee._id || '';\n }\n\n /**\n * Get fee name\n */\n getFeeName(fee: FeeAssignmentFeeItem): string {\n return fee.feesi_item_name || fee.feesi_item_code || 'N/A';\n }\n\n /**\n * Get fee category\n */\n getFeeCategory(fee: FeeAssignmentFeeItem): string {\n return fee.fees_category_name || 'N/A';\n }\n\n /**\n * Get fee amount\n */\n getFeeAmount(fee: FeeAssignmentFeeItem): number {\n return fee.fees_amount || fee.fees_total_amount || 0;\n }\n\n /**\n * Calculate final amount for a fee item\n */\n calculateFinalAmount(fee: FeeAssignmentFeeItem): number {\n const original = this.getFeeAmount(fee);\n const discount = parseFloat(this.getDiscountControl(this.getFeeId(fee))?.value || '0') || 0;\n const scholarship = parseFloat(this.getScholarshipControl(this.getFeeId(fee))?.value || '0') || 0;\n return Math.max(0, original - discount - scholarship);\n }\n\n /**\n * Calculate total original amount\n */\n totalOriginalAmount = computed(() => {\n return this.applicableFees().reduce((sum, fee) => {\n return sum + this.getFeeAmount(fee);\n }, 0);\n });\n\n /**\n * Calculate total discount\n */\n totalDiscount = computed(() => {\n return this.applicableFees().reduce((sum, fee) => {\n const discount = parseFloat(this.getDiscountControl(this.getFeeId(fee))?.value || '0') || 0;\n return sum + discount;\n }, 0);\n });\n\n /**\n * Calculate total scholarship\n */\n totalScholarship = computed(() => {\n return this.applicableFees().reduce((sum, fee) => {\n const scholarship = parseFloat(this.getScholarshipControl(this.getFeeId(fee))?.value || '0') || 0;\n return sum + scholarship;\n }, 0);\n });\n\n /**\n * Calculate total final amount\n */\n totalFinalAmount = computed(() => {\n return this.applicableFees().reduce((sum, fee) => {\n return sum + this.calculateFinalAmount(fee);\n }, 0);\n });\n\n onSubmit(): void {\n const requiredRight = this.isEditMode() ? 'EDIT' : 'CREATE';\n if (!this.rightsService.hasRight(requiredRight)) {\n this.notificationService.error(`You do not have permission to ${this.isEditMode() ? 'edit' : 'create'} fee assignments`);\n return;\n }\n if (this.assignmentForm.invalid || this.submitting()) {\n this.assignmentForm.markAllAsTouched();\n this.notificationService.warning('Please fill in all required fields correctly.');\n return;\n }\n\n this.submitting.set(true);\n\n const formValue = this.assignmentForm.getRawValue();\n \n // If using fee structure, create assignments for each fee item\n if (formValue.fee_source === 'STRUCTURE' && this.applicableFees().length > 0) {\n // Create multiple fee assignments for each fee item\n const assignments = this.applicableFees().map(fee => {\n const discount = parseFloat(this.getDiscountControl(this.getFeeId(fee))?.value || '0') || 0;\n const scholarship = parseFloat(this.getScholarshipControl(this.getFeeId(fee))?.value || '0') || 0;\n const originalAmount = this.getFeeAmount(fee);\n const finalAmount = Math.max(0, originalAmount - discount - scholarship);\n\n return {\n _id: this.isEditMode() ? this.assignmentId() : undefined,\n feeas_student_id: formValue.student_id,\n feeas_fee_structure_id_feest: fee.fees_structure_id,\n feeas_fee_structure_item_id_feesi: fee._id,\n feeas_academic_year_id_acayr: formValue.feeas_academic_year_id_acayr,\n feeas_entity_id_syen: formValue.feeas_entity_id_syen,\n feeas_original_amount: originalAmount,\n feeas_discount_amount: discount,\n feeas_scholarship_amount: scholarship,\n feeas_final_amount: finalAmount,\n feeas_due_date: formValue.feeas_due_date ? new Date(formValue.feeas_due_date) : undefined,\n feeas_installment_count: formValue.feeas_installment_count || 1,\n feeas_remarks: formValue.feeas_remarks || ''\n };\n });\n\n // TODO: Implement bulk assignment API call\n // For now, create assignments one by one\n const assignmentPromises = assignments.map(assignment => \n this.feeAssignmentService.saveUpdateFeeAssignment(assignment)\n );\n\n forkJoin(assignmentPromises).subscribe({\n next: (responses) => {\n const allSuccess = responses.every(r => r?.success);\n if (allSuccess) {\n this.notificationService.success(\n `Successfully assigned ${assignments.length} fee(s) to student!`\n );\n this.router.navigate(['/control-panel/assignment']);\n } else {\n this.notificationService.error('Some fee assignments failed. Please check and try again.');\n }\n },\n error: (err) => {\n console.error('Error saving fee assignments:', err);\n this.notificationService.error('Failed to save fee assignments. Please try again.');\n },\n complete: () => {\n this.submitting.set(false);\n }\n });\n } else {\n // Custom fee assignment\n const payload = {\n _id: this.isEditMode() ? this.assignmentId() : undefined,\n feeas_student_id: formValue.student_id,\n feeas_fee_structure_id_feest: undefined,\n feeas_fee_structure_item_id_feesi: undefined,\n feeas_academic_year_id_acayr: formValue.feeas_academic_year_id_acayr,\n feeas_entity_id_syen: formValue.feeas_entity_id_syen,\n feeas_fee_category_sygms: formValue.feeas_fee_category_sygms,\n feeas_fee_name: formValue.feeas_fee_name,\n feeas_fee_type: formValue.feeas_fee_type || 'ONE_TIME',\n feeas_original_amount: formValue.feeas_original_amount || 0,\n feeas_discount_amount: formValue.feeas_discount_amount || 0,\n feeas_scholarship_amount: formValue.feeas_scholarship_amount || 0,\n feeas_due_date: formValue.feeas_due_date ? new Date(formValue.feeas_due_date) : undefined,\n feeas_installment_count: formValue.feeas_installment_count || 1,\n feeas_remarks: formValue.feeas_remarks || ''\n };\n \n this.feeAssignmentService.saveUpdateFeeAssignment(payload).subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success(\n `Fee assignment ${this.isEditMode() ? 'updated' : 'created'} successfully!`\n );\n this.router.navigate(['/control-panel/assignment']);\n } else {\n this.notificationService.error(response?.message || 'Failed to save fee assignment');\n }\n },\n error: (err) => {\n console.error('Error saving fee assignment:', err);\n this.notificationService.error('Failed to save fee assignment. Please try again.');\n },\n complete: () => {\n this.submitting.set(false);\n }\n });\n }\n }\n\n resetForm(): void {\n if (this.isEditMode() && this.assignmentId()) {\n // Reload data in edit mode\n this.loadAssignmentData(this.assignmentId()!);\n } else {\n // Reset to defaults in create mode\n if (this.assignmentForm.dirty) {\n this.confirmationService.ask({\n title: 'Reset Form?',\n message: 'Are you sure you want to reset the form? All unsaved changes will be lost.',\n confirmText: 'Reset',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.assignmentForm.reset({\n fee_source: 'STRUCTURE',\n feeas_fee_type: 'ONE_TIME',\n feeas_original_amount: 0,\n feeas_discount_amount: 0,\n feeas_scholarship_amount: 0,\n feeas_installment_count: 1\n });\n this.assignmentId.set('');\n this.isEditMode.set(false);\n this.notificationService.info('Form has been reset.');\n }\n });\n }\n }\n }\n\n onCancel(): void {\n if (this.assignmentForm.dirty) {\n this.confirmationService.ask({\n title: 'Discard Changes?',\n message: 'You have unsaved changes. Are you sure you want to leave?',\n confirmText: 'Discard',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.componentContextService.close(['/fees/assignment']);\n }\n });\n } else {\n this.componentContextService.close(['/fees/assignment']);\n }\n }\n\n getAcademicYearOptions(): Array<{ value: string; label: string }> {\n return this.academicYearOptions().map(ay => ({\n value: ay._id || '',\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\n }));\n }\n\n getFeeStructureOptions(): Array<{ value: string; label: string }> {\n return this.feeStructureOptions().map(fs => ({\n value: fs._id || '',\n label: `${fs.fees_structure_name || ''} (${fs.fees_structure_code || ''})`\n }));\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n /**\n * Update breadcrumb data based on mode\n */\n private updateBreadcrumbData(): void {\n const additionalItems: { id: string; label: string; icon?: string; url?: string }[] = [];\n\n if (this.isEditMode() || this.isViewMode()) {\n if (this.isViewMode()) {\n additionalItems.push({\n id: 'view',\n label: 'View',\n icon: 'visibility',\n url: undefined\n });\n } else {\n additionalItems.push({\n id: 'edit',\n label: 'Edit',\n icon: 'edit',\n url: undefined\n });\n }\n } else {\n // Create mode\n additionalItems.push({\n id: 'create',\n label: 'Create',\n icon: 'add',\n url: undefined\n });\n }\n\n this.breadcrumbData.set(additionalItems);\n }\n}\n\n","<!-- Fee Assignment Form -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_assignment' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n <div class=\"tw-w-full tw-h-full\">\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"assignmentForm\" \n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <div class=\"tw-space-y-6\">\n\n <!-- Student Information -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3\">Student Information</h6>\n \n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <div>\n <cide-ele-input \n label=\"Student *\" \n formControlName=\"student_search\"\n placeholder=\"Search student by name or ID...\"\n size=\"sm\"\n leadingIcon=\"search\">\n </cide-ele-input>\n </div>\n\n <cide-ele-select \n label=\"Academic Year *\" \n formControlName=\"feeas_academic_year_id_acayr\"\n [options]=\"getAcademicYearOptions()\"\n [loading]=\"academicYearLoading()\"\n size=\"sm\"\n leadingIcon=\"calendar_today\">\n </cide-ele-select>\n </div>\n \n <!-- Hidden entity field (populated from app state) -->\n <input type=\"hidden\" formControlName=\"feeas_entity_id_syen\">\n </div>\n\n <!-- Academic Information (for fee structure loading) -->\n @if (showFeeStructureField()) {\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-pb-2 tw-border-b-2 tw-border-indigo-200 dark:tw-border-indigo-800 tw-mb-4\">\n <cide-ele-icon class=\"tw-w-5 tw-h-5 tw-text-indigo-600 dark:tw-text-indigo-400\">school</cide-ele-icon>\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100\">Academic Information</h6>\n </div>\n \n <cide-shared-program-section-selector-wrapper\n [formGroup]=\"assignmentForm\"\n classProgramControlName=\"class_program_id\"\n branchControlName=\"branch_id\"\n termControlName=\"term_id\"\n sectionControlName=\"section_id\"\n [academicYearId]=\"assignmentForm.get('feeas_academic_year_id_acayr')?.value\"\n [entityId]=\"assignmentForm.get('feeas_entity_id_syen')?.value\"\n [disabled]=\"isViewMode()\"\n (valuesChange)=\"onProgramSectionValuesChange($event)\">\n </cide-shared-program-section-selector-wrapper>\n </div>\n }\n\n <!-- Fee Information -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3\">Fee Information</h6>\n \n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-select \n label=\"Fee Source *\" \n formControlName=\"fee_source\"\n [options]=\"feeSourceOptions\"\n size=\"sm\"\n leadingIcon=\"source\">\n </cide-ele-select>\n </div>\n\n <!-- Custom Fee Fields -->\n @if (showCustomFeeFields()) {\n <div class=\"tw-mt-4 tw-space-y-4\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-select \n label=\"Fee Category *\" \n formControlName=\"feeas_fee_category_sygms\"\n [options]=\"feeCategoryOptions\"\n size=\"sm\">\n </cide-ele-select>\n\n <cide-ele-input \n label=\"Fee Name *\" \n formControlName=\"feeas_fee_name\"\n placeholder=\"Enter fee name\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-select \n label=\"Fee Type *\" \n formControlName=\"feeas_fee_type\"\n [options]=\"feeTypeOptions\"\n size=\"sm\">\n </cide-ele-select>\n\n <cide-ele-input \n label=\"Amount *\" \n formControlName=\"feeas_original_amount\"\n type=\"number\"\n placeholder=\"0.00\"\n size=\"sm\"\n leadingIcon=\"currency_rupee\">\n </cide-ele-input>\n </div>\n </div>\n }\n </div>\n\n <!-- Payment Details -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3\">Payment Details</h6>\n \n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input \n label=\"Due Date *\" \n formControlName=\"feeas_due_date\"\n type=\"date\"\n size=\"sm\"\n leadingIcon=\"calendar_today\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Installments\" \n formControlName=\"feeas_installment_count\"\n type=\"number\"\n placeholder=\"1\"\n min=\"1\"\n max=\"12\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Fee Insights (for fee structure) -->\n @if (showFeeStructureField() && assignmentForm.get('term_id')?.value) {\n <div class=\"tw-bg-blue-50 dark:tw-bg-blue-900/20 tw-rounded-lg tw-border tw-border-blue-200 dark:tw-border-blue-800 tw-p-4\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-5 tw-h-5 tw-text-blue-600 dark:tw-text-blue-400\">account_balance</cide-ele-icon>\n Fee Insights\n </h6>\n @if (feesLoading()) {\n <span class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400\">Loading fees...</span>\n }\n </div>\n\n @if (feesLoading()) {\n <div class=\"tw-text-center tw-py-4\">\n <span class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400\">Loading applicable fees...</span>\n </div>\n } @else if (applicableFees().length > 0) {\n <div class=\"tw-overflow-x-auto\">\n <table class=\"tw-min-w-full tw-divide-y tw-divide-gray-200 dark:tw-divide-gray-700\">\n <thead class=\"tw-bg-gray-50 dark:tw-bg-gray-800\">\n <tr>\n <th class=\"tw-px-4 tw-py-2 tw-text-left tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Fee Name</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-left tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Category</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-right tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Original Amount</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-right tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Discount</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-right tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Scholarship</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-right tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Final Amount</th>\n </tr>\n </thead>\n <tbody class=\"tw-bg-white dark:tw-bg-gray-800 tw-divide-y tw-divide-gray-200 dark:tw-divide-gray-700\">\n @for (fee of applicableFees(); track getFeeId(fee)) {\n <tr>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-text-gray-900 dark:tw-text-gray-100\">{{ getFeeName(fee) }}</td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-text-gray-600 dark:tw-text-gray-400\">{{ getFeeCategory(fee) }}</td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-text-gray-900 dark:tw-text-gray-100 tw-text-right\">{{ formatCurrency(getFeeAmount(fee)) }}</td>\n <td class=\"tw-px-4 tw-py-2\">\n <cide-ele-input\n type=\"number\"\n [formControl]=\"getDiscountControl(getFeeId(fee))\"\n placeholder=\"0.00\"\n size=\"sm\"\n class=\"tw-w-24\"\n [disabled]=\"isViewMode()\">\n </cide-ele-input>\n </td>\n <td class=\"tw-px-4 tw-py-2\">\n <cide-ele-input\n type=\"number\"\n [formControl]=\"getScholarshipControl(getFeeId(fee))\"\n placeholder=\"0.00\"\n size=\"sm\"\n class=\"tw-w-24\"\n [disabled]=\"isViewMode()\">\n </cide-ele-input>\n </td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-text-right\">\n {{ formatCurrency(calculateFinalAmount(fee)) }}\n </td>\n </tr>\n }\n </tbody>\n <tfoot class=\"tw-bg-gray-50 dark:tw-bg-gray-800\">\n <tr>\n <td colspan=\"2\" class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-text-right\">Total:</td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-text-right\">\n {{ formatCurrency(totalOriginalAmount()) }}\n </td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-blue-600 dark:tw-text-blue-400 tw-text-right\">\n {{ formatCurrency(totalDiscount()) }}\n </td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-purple-600 dark:tw-text-purple-400 tw-text-right\">\n {{ formatCurrency(totalScholarship()) }}\n </td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-bold tw-text-green-600 dark:tw-text-green-400 tw-text-right\">\n {{ formatCurrency(totalFinalAmount()) }}\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n } @else {\n <div class=\"tw-text-center tw-py-4 tw-text-sm tw-text-gray-500 dark:tw-text-gray-400\">\n No fee structure found for the selected program/term. Please select a program and term to view applicable fees.\n </div>\n }\n </div>\n }\n\n <!-- Discounts & Scholarships (for custom fees) -->\n @if (showCustomFeeFields()) {\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3\">Discounts & Scholarships</h6>\n \n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input \n label=\"Discount Amount\" \n formControlName=\"feeas_discount_amount\"\n type=\"number\"\n placeholder=\"0.00\"\n min=\"0\"\n size=\"sm\"\n leadingIcon=\"percent\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Scholarship Amount\" \n formControlName=\"feeas_scholarship_amount\"\n type=\"number\"\n placeholder=\"0.00\"\n min=\"0\"\n size=\"sm\"\n leadingIcon=\"school\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Amount Summary (for custom fees) -->\n <div class=\"tw-bg-gradient-to-r tw-from-blue-50 dark:tw-from-blue-900/20 tw-to-indigo-50 dark:tw-to-indigo-900/20 tw-rounded-lg tw-border tw-border-blue-200 dark:tw-border-blue-800 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-blue-900 dark:tw-text-blue-100 tw-mb-3\">Amount Summary</h6>\n \n <div class=\"tw-space-y-2\">\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-1\">\n <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">Original Amount:</span>\n <span class=\"tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100\">{{ formatCurrency(assignmentForm.get('feeas_original_amount')?.value || 0) }}</span>\n </div>\n \n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-1\">\n <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">Discount:</span>\n <span class=\"tw-font-semibold tw-text-red-600 dark:tw-text-red-400\">-{{ formatCurrency(assignmentForm.get('feeas_discount_amount')?.value || 0) }}</span>\n </div>\n \n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-1\">\n <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">Scholarship:</span>\n <span class=\"tw-font-semibold tw-text-red-600 dark:tw-text-red-400\">-{{ formatCurrency(assignmentForm.get('feeas_scholarship_amount')?.value || 0) }}</span>\n </div>\n \n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-t-2 tw-border-blue-300 dark:tw-border-blue-700 tw-mt-2\">\n <span class=\"tw-text-base tw-font-bold tw-text-blue-900 dark:tw-text-blue-100\">Total Amount:</span>\n <span class=\"tw-text-xl tw-font-bold tw-text-blue-700 dark:tw-text-blue-300\">{{ formatCurrency(totalAmount()) }}</span>\n </div>\n </div>\n </div>\n }\n\n <!-- Remarks -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <cide-ele-textarea \n label=\"Remarks\" \n formControlName=\"feeas_remarks\"\n placeholder=\"Enter any additional remarks...\"\n rows=\"2\" \n size=\"sm\">\n </cide-ele-textarea>\n </div>\n\n </div>\n\n <!-- Form Validation Errors -->\n @if (!isViewMode()) {\n <div class=\"tw-w-full tw-mt-6\">\n <cide-form-field-error [formGroup]=\"assignmentForm\"></cide-form-field-error>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-gap-3 tw-mt-6\">\n @if (!isEditMode()) {\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n }\n\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"onCancel()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" size=\"sm\" \n [disabled]=\"submitting() || assignmentForm.invalid || loading()\" \n [loading]=\"submitting()\" \n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Assignment' : 'Assign Fee' }}\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </form>\n </div>\n</cide-lyt-shared-wrapper>\n\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n cidePath,\r\n feesRoutesUrl,\r\n hostManagerRoutesUrl,\r\n generateStringFromObject,\r\n type feePaymentControllerResponse,\r\n type MFeePayment,\r\n type feePaymentByIdControllerResponse,\r\n type MFeePaymentGetByIdPayload,\r\n type feePaymentInsertUpdateControllerResponse,\r\n type MFeePaymentInsertUpdatePayload,\r\n type feePaymentDeleteControllerResponse,\r\n type MFeePaymentDeletePayload\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideFeeFeePaymentService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Get list of fee payments\r\n * @param payload - Query parameters for filtering/pagination\r\n * @returns Observable of fee payment list response\r\n */\r\n getFeePaymentList(payload: MFeePayment): Observable<feePaymentControllerResponse> {\r\n console.log(\"payload\", payload)\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment,\r\n query\r\n ]);\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n /**\r\n * Get fee payment by ID\r\n * @param payload - Fee payment ID payload\r\n * @returns Observable of fee payment data\r\n */\r\n getFeePaymentById(payload: MFeePaymentGetByIdPayload): Observable<feePaymentByIdControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment,\r\n 'byId',\r\n query\r\n ]);\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n /**\r\n * Create or update fee payment\r\n * @param data - Fee payment data to save\r\n * @returns Observable of the save response\r\n */\r\n saveUpdateFeePayment(data: MFeePaymentInsertUpdatePayload): Observable<feePaymentInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment\r\n ]);\r\n\r\n return this.http.post(url, data);\r\n }\r\n\r\n /**\r\n * Delete fee payment\r\n * @param payload - Fee payment ID payload\r\n * @returns Observable of the delete response\r\n */\r\n deleteFeePayment(payload: MFeePaymentDeletePayload): Observable<feePaymentDeleteControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment,\r\n 'delete',\r\n query\r\n ]);\r\n\r\n return this.http.delete(url);\r\n }\r\n}\r\n\r\n","import { \r\n Component, \r\n signal, \r\n computed, \r\n viewChild, \r\n TemplateRef, \r\n DestroyRef, \r\n inject, \r\n OnInit,\r\n type OnDestroy \r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { \r\n CideEleDataGridComponent, \r\n CideIconComponent, \r\n CideEleButtonComponent, \r\n type GridConfiguration, \r\n type GridEvent, \r\n CideEleDropdownComponent, \r\n type DropdownItem, \r\n type TemplateContext, \r\n type DropdownConfig, \r\n ConfirmationService,\r\n NotificationService \r\n} from 'cloud-ide-element';\r\nimport { \r\n generateStringFromObject, \r\n MFeePayment \r\n} from 'cloud-ide-lms-model';\r\nimport { AppStateHelperService, RightsService } from 'cloud-ide-layout';\r\nimport { CideFeeFeePaymentService } from '../../services/fee-payment.service';\r\n\r\n// Types\r\ninterface FeePaymentData {\r\n _id?: string;\r\n feepay_receipt_number?: string;\r\n feepay_student_id?: string;\r\n student_name?: string;\r\n feepay_payment_date?: Date;\r\n feepay_payment_mode?: string;\r\n feepay_total_amount?: number;\r\n feepay_late_fee_amount?: number;\r\n feepay_status?: string;\r\n feepay_payment_reference?: string;\r\n is_reconciled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-fee-payment-list',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideEleDataGridComponent,\r\n CideEleDropdownComponent\r\n ],\r\n templateUrl: './fee-payment-list.component.html',\r\n styles: [`\r\n .fee-payment-listing-container {\r\n @apply tw-w-full tw-h-full;\r\n }\r\n \r\n :host {\r\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\r\n }\r\n `]\r\n})\r\nexport class FeePaymentListComponent implements OnInit, OnDestroy {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\r\n private readonly router = inject(Router);\r\n private readonly appState = inject(AppStateHelperService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly notificationService = inject(NotificationService);\r\n private readonly rightsService = inject(RightsService);\r\n\r\n readonly paymentDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('paymentDetailsRendererTemplate');\r\n readonly amountRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('amountRendererTemplate');\r\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\r\n readonly actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\r\n\r\n readonly feePayments = signal<FeePaymentData[]>([]);\r\n readonly loading = signal<boolean>(false);\r\n readonly error = signal<string | null>(null);\r\n\r\n readonly currentPage = signal<number>(1);\r\n readonly pageSize = signal<number>(10);\r\n readonly totalItems = signal<number>(0);\r\n readonly totalPages = signal<number>(0);\r\n\r\n readonly searchQuery = signal<string>('');\r\n readonly sortColumn = signal<string>('feepay_payment_date');\r\n readonly sortDirection = signal<'asc' | 'desc'>('desc');\r\n\r\n readonly selectedStatusFilter = signal<string>('');\r\n readonly selectedPaymentModeFilter = signal<string>('');\r\n\r\n readonly gridConfig = computed<GridConfiguration<FeePaymentData>>(() => ({\r\n id: 'fee-payment-list-grid',\r\n columns: [\r\n {\r\n key: 'feepay_receipt_number',\r\n header: 'Receipt #',\r\n type: 'text',\r\n width: '140px',\r\n truncate: true,\r\n align: 'left',\r\n sortable: true\r\n },\r\n {\r\n key: 'details',\r\n header: 'Payment Details',\r\n type: 'custom',\r\n width: 'auto',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'paymentDetailsRenderer',\r\n sortable: true\r\n },\r\n {\r\n key: 'feepay_payment_date',\r\n header: 'Payment Date',\r\n type: 'date',\r\n width: '140px',\r\n truncate: false,\r\n align: 'left',\r\n sortable: true\r\n },\r\n {\r\n key: 'feepay_payment_mode',\r\n header: 'Payment Mode',\r\n type: 'text',\r\n width: '120px',\r\n truncate: false,\r\n align: 'left',\r\n sortable: true\r\n },\r\n {\r\n key: 'total_amount',\r\n header: 'Total Amount',\r\n type: 'custom',\r\n width: '150px',\r\n truncate: false,\r\n align: 'right',\r\n renderer: 'amountRenderer',\r\n sortable: true\r\n },\r\n {\r\n key: 'feepay_status',\r\n header: 'Status',\r\n type: 'custom',\r\n width: '140px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'statusRenderer'\r\n },\r\n {\r\n key: 'actions',\r\n header: 'Actions',\r\n type: 'custom',\r\n width: '80px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'actionsDropdownRenderer'\r\n }\r\n ],\r\n data: this.feePayments(),\r\n trackBy: '_id',\r\n pagination: {\r\n enabled: true,\r\n pageSize: this.pageSize(),\r\n pageSizeOptions: [10, 25, 50, 100],\r\n showQuickJump: true,\r\n showPageInfo: true,\r\n showRefresh: true\r\n },\r\n search: {\r\n enabled: true,\r\n placeholder: 'Search by receipt number, student name...',\r\n searchableColumns: ['feepay_receipt_number', 'student_name'],\r\n debounceMs: 300,\r\n showClearButton: true\r\n },\r\n loading: {\r\n useDefer: true,\r\n skeletonRows: 5,\r\n showOverlay: this.loading()\r\n },\r\n scroll: {\r\n enabled: true,\r\n maxHeight: '',\r\n minHeight: '',\r\n stickyHeader: true,\r\n virtualScroll: false,\r\n rowHeight: 50\r\n },\r\n export: {\r\n enabled: true,\r\n formats: ['csv', 'excel', 'pdf'],\r\n filename: 'fee-payments',\r\n includeHeaders: true\r\n },\r\n responsive: true,\r\n striped: false,\r\n bordered: true,\r\n compact: false,\r\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\r\n }));\r\n\r\n // Rights computed signals\r\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\r\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\r\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\r\n canView = computed(() => this.rightsService.hasRight('VIEW'));\r\n\r\n ngOnInit(): void {\r\n // Initialize rights for fee payment management\r\n this.rightsService.initializeRights('fee_payment');\r\n console.log('๐ฐ Fee Payment List Component initialized');\r\n this.loadFeePayments();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup if needed\r\n }\r\n\r\n loadFeePayments(): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n const payload: MFeePayment = new MFeePayment({\r\n pageIndex: this.currentPage(),\r\n pageSize: this.pageSize(),\r\n query: this.searchQuery() || \"\",\r\n sort: {\r\n key: this.sortColumn(),\r\n order: this.sortDirection()\r\n }\r\n });\r\n\r\n // Add filters\r\n const filterParams: any = {};\r\n if (this.selectedStatusFilter()) {\r\n filterParams.feepay_status = this.selectedStatusFilter();\r\n }\r\n if (this.selectedPaymentModeFilter()) {\r\n filterParams.feepay_payment_mode = this.selectedPaymentModeFilter();\r\n }\r\n Object.assign(payload, filterParams);\r\n\r\n this.feePaymentService.getFeePaymentList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success && response.data) {\r\n console.log('๐ฐ Fee payments loaded:', response.data);\r\n this.feePayments.set(response.data);\r\n this.totalItems.set(response.total || 0);\r\n this.totalPages.set(Math.ceil((response.total || 0) / this.pageSize()));\r\n \r\n if (response.data.length > 0) {\r\n this.notificationService.success(`Loaded ${response.data.length} payment(s) successfully.`);\r\n }\r\n } else {\r\n this.feePayments.set([]);\r\n this.totalItems.set(0);\r\n this.totalPages.set(0);\r\n this.notificationService.warning('No payments found.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('โ Error loading fee payments:', error);\r\n this.error.set('Failed to load fee payments. Please try again.');\r\n this.feePayments.set([]);\r\n this.totalItems.set(0);\r\n this.totalPages.set(0);\r\n this.notificationService.error('Failed to load fee payments. Please try again.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\r\n paymentDetailsRenderer: this.paymentDetailsRendererTemplate(),\r\n amountRenderer: this.amountRendererTemplate(),\r\n statusRenderer: this.statusRendererTemplate(),\r\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate()\r\n }));\r\n\r\n onGridEvent(event: GridEvent<any>): void {\r\n switch (event.type) {\r\n case 'pageChange':\r\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\r\n this.currentPage.set(event.data['pageIndex'] as number);\r\n this.pageSize.set(event.data['pageSize'] as number);\r\n this.loadFeePayments();\r\n }\r\n break;\r\n case 'search':\r\n this.searchQuery.set(event.data as string);\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n break;\r\n case 'refresh':\r\n this.loadFeePayments();\r\n break;\r\n case 'sort':\r\n if (event.data && typeof event.data === 'object' && 'column' in event.data && 'direction' in event.data) {\r\n this.sortColumn.set(event.data['column'] as string);\r\n this.sortDirection.set(event.data['direction'] as 'asc' | 'desc');\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n }\r\n break;\r\n case 'export':\r\n if (event.data && typeof event.data === 'string') {\r\n this.handleExport(event.data);\r\n }\r\n break;\r\n default:\r\n console.log('๐ Unhandled grid event:', event.type);\r\n }\r\n }\r\n\r\n onStatusFilterChange(): void {\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n }\r\n\r\n onPaymentModeFilterChange(): void {\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n }\r\n\r\n clearFilters(): void {\r\n this.selectedStatusFilter.set('');\r\n this.selectedPaymentModeFilter.set('');\r\n this.searchQuery.set('');\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n }\r\n\r\n processPayment(): void {\r\n if (!this.rightsService.hasRight('CREATE')) {\r\n this.notificationService.error('You do not have permission to process payments');\r\n return;\r\n }\r\n this.router.navigate(['/control-panel/payment/process']);\r\n }\r\n\r\n viewPayment(payment: FeePaymentData): void {\r\n if (!this.rightsService.hasRight('VIEW')) {\r\n this.notificationService.error('You do not have permission to view payments');\r\n return;\r\n }\r\n const queryParams = generateStringFromObject({ feepay_id: payment._id });\r\n this.router.navigate(['/control-panel/payment/view', queryParams]);\r\n }\r\n\r\n printReceipt(payment: FeePaymentData): void {\r\n console.log('Print receipt:', payment);\r\n this.notificationService.info(`Printing receipt ${payment.feepay_receipt_number}`);\r\n }\r\n\r\n reconcilePayment(payment: FeePaymentData): void {\r\n this.confirmationService.ask({\r\n title: 'Reconcile Payment',\r\n message: `Are you sure you want to mark payment ${payment.feepay_receipt_number} as reconciled?`,\r\n confirmText: 'Reconcile',\r\n cancelText: 'Cancel',\r\n type: 'info'\r\n }).then((confirmed: boolean) => {\r\n if (confirmed) {\r\n // TODO: Implement reconcile API call\r\n this.notificationService.success('Payment reconciled successfully.');\r\n this.loadFeePayments();\r\n }\r\n });\r\n }\r\n\r\n getDropdownConfig(): DropdownConfig {\r\n return {\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm'\r\n };\r\n }\r\n\r\n getActionDropdownItems(payment: FeePaymentData): DropdownItem[] {\r\n const items: DropdownItem[] = [\r\n {\r\n id: 'view',\r\n label: 'View Details',\r\n icon: 'visibility',\r\n iconColor: 'tw-text-gray-400',\r\n textColor: 'tw-text-gray-700',\r\n hoverBgColor: 'hover:tw-bg-gray-100'\r\n },\r\n {\r\n id: 'receipt',\r\n label: 'Print Receipt',\r\n icon: 'print',\r\n iconColor: 'tw-text-blue-400',\r\n textColor: 'tw-text-blue-600',\r\n hoverBgColor: 'hover:tw-bg-blue-50'\r\n }\r\n ];\r\n\r\n if (!payment.is_reconciled) {\r\n items.push({\r\n id: 'reconcile',\r\n label: 'Reconcile',\r\n icon: 'check_circle',\r\n iconColor: 'tw-text-green-400',\r\n textColor: 'tw-text-green-600',\r\n hoverBgColor: 'hover:tw-bg-green-50'\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n onDropdownItemClick(item: DropdownItem, payment: FeePaymentData): void {\r\n switch (item.id) {\r\n case 'view':\r\n this.viewPayment(payment);\r\n break;\r\n case 'receipt':\r\n this.printReceipt(payment);\r\n break;\r\n case 'reconcile':\r\n this.reconcilePayment(payment);\r\n break;\r\n default:\r\n console.log('โ Unknown dropdown item clicked:', item.id);\r\n }\r\n }\r\n\r\n private handleExport(format: string): void {\r\n console.log(`๐ค Exporting fee payments as ${format}`);\r\n // TODO: Implement export functionality\r\n }\r\n\r\n formatCurrency(amount: number | undefined): string {\r\n if (!amount) return 'โน0.00';\r\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\r\n }\r\n\r\n formatDate(date: string | Date | null | undefined): string {\r\n if (!date) return '-';\r\n return new Date(date).toLocaleDateString('en-US', {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric'\r\n });\r\n }\r\n\r\n getStatusBadgeClass(payment: FeePaymentData): string {\r\n switch (payment.feepay_status) {\r\n case 'SUCCESS':\r\n case 'COMPLETED':\r\n return 'tw-bg-green-100 tw-text-green-800';\r\n case 'PENDING':\r\n return 'tw-bg-yellow-100 tw-text-yellow-800';\r\n case 'FAILED':\r\n return 'tw-bg-red-100 tw-text-red-800';\r\n default:\r\n return 'tw-bg-gray-100 tw-text-gray-800';\r\n }\r\n }\r\n\r\n getStatusText(payment: FeePaymentData): string {\r\n return payment.feepay_status || 'Unknown';\r\n }\r\n}\r\n","<!-- Fee Payment Container -->\r\n<div class=\"tw-table tw-w-full tw-h-full\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Payment Management</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"processPayment()\">\r\n Record Payment\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-h-full tw-relative\">\r\n\r\n <!-- Data Grid Component -->\r\n <div class=\"tw-h-full tw-overflow-auto\">\r\n <cide-ele-data-grid [config]=\"gridConfig()\" [templateRenderers]=\"templateRenderers()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- Template Renderers -->\r\n<ng-template #paymentDetailsRendererTemplate let-row=\"row\">\r\n <div class=\"tw-flex tw-flex-col tw-w-full\">\r\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.student_name || 'N/A' }}</div>\r\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate\">ID: {{ row.feepay_student_id || 'N/A' }}</div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #amountRendererTemplate let-row=\"row\">\r\n <div class=\"tw-flex tw-flex-col tw-text-sm tw-items-end\">\r\n <span class=\"tw-text-gray-900 tw-font-semibold\">{{ formatCurrency(row.feepay_total_amount) }}</span>\r\n @if (row.feepay_late_fee_amount && row.feepay_late_fee_amount > 0) {\r\n <span class=\"tw-text-xs tw-text-red-600\">Late Fee: {{ formatCurrency(row.feepay_late_fee_amount) }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #statusRendererTemplate let-row=\"row\">\r\n <span class=\"tw-inline-flex tw-items-center tw-justify-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-text-center\"\r\n [ngClass]=\"getStatusBadgeClass(row)\">\r\n <cide-ele-icon size=\"2xs\" class=\"tw-mr-1\">\r\n {{ row.feepay_status === 'SUCCESS' || row.feepay_status === 'COMPLETED' ? 'check_circle' : \r\n row.feepay_status === 'PENDING' ? 'schedule' : 'error' }}\r\n </cide-ele-icon>\r\n {{ getStatusText(row) }}\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <cide-ele-dropdown \r\n [items]=\"getActionDropdownItems(row)\"\r\n [config]=\"getDropdownConfig()\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template>\r\n\r\n","import { Component, inject, signal, OnInit, computed, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent,\n NotificationService,\n ConfirmationService\n} from 'cloud-ide-element';\nimport { CideFeeFeePaymentService } from '../../services/fee-payment.service';\nimport { CideFeeFeeAssignmentService } from '../../../fee-assignment-management/services/fee-assignment.service';\nimport { RightsService } from 'cloud-ide-layout';\nimport { FeePayment, MFeePaymentInsertUpdatePayload } from 'cloud-ide-lms-model';\n\n// Types\ninterface OutstandingFee {\n id: string;\n assignment_id?: string;\n fee_head: string;\n fee_category: string;\n due_date: Date;\n outstanding_amount: number;\n late_fee: number;\n penalty?: number;\n is_overdue: boolean;\n}\n\ninterface Student {\n _id: string;\n name: string;\n student_id: string;\n class?: string;\n section?: string;\n}\n\n@Component({\n selector: 'cide-fee-payment-process',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent\n ],\n templateUrl: './fee-payment-process.component.html'\n})\nexport class FeePaymentProcessComponent implements OnInit {\n private readonly destroyRef = inject(DestroyRef);\n private readonly fb = inject(FormBuilder);\n private readonly router = inject(Router);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly rightsService = inject(RightsService);\n\n paymentForm: FormGroup = this.fb.group({\n student_id: ['', [Validators.required]],\n student_search: [''],\n feepay_payment_date: [new Date().toISOString().split('T')[0], [Validators.required]],\n feepay_payment_mode: ['CASH', [Validators.required]],\n feepay_payment_method: ['CASH', [Validators.required]],\n feepay_payment_reference: [''],\n feepay_bank_name: [''],\n feepay_bank_branch_name: [''],\n feepay_bank_ifsc_code: [''],\n feepay_instrument_date: [''],\n feepay_cheque_number: [''],\n feepay_cheque_date: [''],\n feepay_bank_account_number: [''],\n feepay_transaction_reference: [''],\n feepay_discount_percentage: [0, [Validators.min(0), Validators.max(100)]],\n feepay_discount_on: [''],\n feepay_discount_reason: [''],\n feepay_remarks: [''],\n pay_full_outstanding: [false],\n fee_items: this.fb.array([])\n });\n\n loading = signal<boolean>(false);\n submitting = signal<boolean>(false);\n selectedStudent = signal<Student | null>(null);\n outstandingFees = signal<OutstandingFee[]>([]);\n showChequeDetails = signal<boolean>(false);\n showBankDetails = signal<boolean>(false);\n\n // Payment method options\n readonly paymentMethodOptions = [\n { value: 'CASH', label: 'Cash' },\n { value: 'CHEQUE', label: 'Cheque' },\n { value: 'DD', label: 'DD' },\n { value: 'ONLINE', label: 'Online' },\n { value: 'CARD', label: 'Card' },\n { value: 'UPI', label: 'UPI' },\n { value: 'NET_BANKING', label: 'Net Banking' },\n { value: 'BANK_TRANSFER', label: 'Bank Transfer' }\n ];\n\n // Computed values\n readonly selectedFeeItems = computed(() => {\n const items = this.feeItemsArray.controls;\n return items.filter((control, index) => {\n const isSelected = control.get('is_selected')?.value;\n return isSelected;\n });\n });\n\n readonly totalFeeAmount = computed(() => {\n let total = 0;\n this.feeItemsArray.controls.forEach(control => {\n if (control.get('is_selected')?.value) {\n total += parseFloat(control.get('amount_paid')?.value || '0');\n }\n });\n return total;\n });\n\n readonly totalLateFee = computed(() => {\n let total = 0;\n this.feeItemsArray.controls.forEach(control => {\n if (control.get('is_selected')?.value) {\n total += parseFloat(control.get('late_fee')?.value || '0');\n }\n });\n return total;\n });\n\n readonly totalPenalty = computed(() => {\n let total = 0;\n this.feeItemsArray.controls.forEach(control => {\n if (control.get('is_selected')?.value) {\n total += parseFloat(control.get('penalty')?.value || '0');\n }\n });\n return total;\n });\n\n readonly totalPayable = computed(() => {\n return this.totalFeeAmount() + this.totalLateFee() + this.totalPenalty();\n });\n\n // Get fee items form array\n get feeItemsArray(): FormArray {\n return this.paymentForm.get('fee_items') as FormArray;\n }\n\n ngOnInit(): void {\n // Initialize rights for fee payment management\n this.rightsService.initializeRights('fee_payment');\n this.setupPaymentMethodListener();\n }\n\n private setupPaymentMethodListener(): void {\n this.paymentForm.get('feepay_payment_method')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(method => {\n this.showChequeDetails.set(method === 'CHEQUE' || method === 'DD');\n this.showBankDetails.set(method === 'BANK_TRANSFER' || method === 'NET_BANKING');\n\n // Set required validators based on payment method\n if (this.showChequeDetails()) {\n this.paymentForm.get('feepay_cheque_number')?.setValidators([Validators.required]);\n this.paymentForm.get('feepay_cheque_date')?.setValidators([Validators.required]);\n this.paymentForm.get('feepay_bank_name')?.setValidators([Validators.required]);\n } else {\n this.paymentForm.get('feepay_cheque_number')?.clearValidators();\n this.paymentForm.get('feepay_cheque_date')?.clearValidators();\n this.paymentForm.get('feepay_bank_name')?.clearValidators();\n }\n\n if (this.showBankDetails()) {\n this.paymentForm.get('feepay_transaction_reference')?.setValidators([Validators.required]);\n } else {\n this.paymentForm.get('feepay_transaction_reference')?.clearValidators();\n }\n\n this.paymentForm.updateValueAndValidity();\n });\n }\n\n onStudentSearch(query: string | number | boolean | null | undefined): void {\n const searchQuery = String(query || '');\n if (searchQuery.length < 3) return;\n\n this.loading.set(true);\n // TODO: Implement student search API call when student service is available\n // For now, using a placeholder - this should be replaced with actual student search service\n // The student search should return student details including _id, name, student_id, class, section\n console.warn('Student search API not yet implemented. Using placeholder.');\n \n // Placeholder: In production, this should call a student search service\n // For now, we'll allow manual entry of student ID\n setTimeout(() => {\n // This is a placeholder - replace with actual student search API call\n const mockStudent: Student = {\n _id: searchQuery, // Using query as student ID for now\n name: `Student ${searchQuery}`,\n student_id: searchQuery,\n class: 'N/A',\n section: 'N/A'\n };\n this.selectedStudent.set(mockStudent);\n this.paymentForm.patchValue({ student_id: mockStudent._id });\n this.loadOutstandingFees(mockStudent._id);\n this.loading.set(false);\n }, 500);\n }\n\n private loadOutstandingFees(studentId: string): void {\n this.loading.set(true);\n \n // Get outstanding fees from fee assignments\n const payload: any = {\n feeas_student_id: studentId,\n feeas_status: 'PENDING' // Get only pending or partially paid assignments\n };\n\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const today = new Date();\n const outstandingFees: OutstandingFee[] = response.data\n .filter((assignment: any) => {\n // Only include assignments with outstanding amount > 0\n const outstanding = assignment.feeas_amount_remaining || \n (assignment.feeas_final_amount || 0) - (assignment.feeas_amount_paid || 0);\n return outstanding > 0;\n })\n .map((assignment: any) => {\n const dueDate = assignment.feeas_due_date ? new Date(assignment.feeas_due_date) : null;\n const outstanding = assignment.feeas_amount_remaining || \n (assignment.feeas_final_amount || 0) - (assignment.feeas_amount_paid || 0);\n const lateFee = assignment.feeas_late_fee_applied || 0;\n \n return {\n id: assignment._id || '',\n assignment_id: assignment._id || '',\n fee_head: assignment.feeas_fee_name || 'Fee',\n fee_category: assignment.feeas_fee_category_sygms || 'OTHER',\n due_date: dueDate || new Date(),\n outstanding_amount: outstanding,\n late_fee: lateFee,\n penalty: 0,\n is_overdue: dueDate ? dueDate < today : false\n };\n });\n\n this.outstandingFees.set(outstandingFees);\n this.initializeFeeItems(outstandingFees);\n } else {\n this.outstandingFees.set([]);\n this.initializeFeeItems([]);\n }\n },\n error: (err) => {\n console.error('Error loading outstanding fees:', err);\n this.notificationService.error('Failed to load outstanding fees');\n this.outstandingFees.set([]);\n this.initializeFeeItems([]);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n }\n\n private initializeFeeItems(fees: OutstandingFee[]): void {\n // Clear existing items\n while (this.feeItemsArray.length !== 0) {\n this.feeItemsArray.removeAt(0);\n }\n\n // Add fee items\n fees.forEach(fee => {\n const itemGroup = this.fb.group({\n assignment_id: [fee.assignment_id],\n fee_head: [fee.fee_head],\n fee_category: [fee.fee_category],\n outstanding_amount: [fee.outstanding_amount],\n is_selected: [false],\n amount_paid: [fee.outstanding_amount, [Validators.required, Validators.min(0)]],\n late_fee: [fee.late_fee],\n penalty: [fee.penalty || 0]\n });\n\n // Set max validator for amount_paid\n itemGroup.get('amount_paid')?.setValidators([\n Validators.required,\n Validators.min(0),\n Validators.max(fee.outstanding_amount)\n ]);\n\n this.feeItemsArray.push(itemGroup);\n });\n }\n\n togglePayFullOutstanding(): void {\n const payFull = this.paymentForm.get('pay_full_outstanding')?.value;\n\n this.feeItemsArray.controls.forEach(control => {\n control.patchValue({ is_selected: payFull });\n if (payFull) {\n const outstanding = control.get('outstanding_amount')?.value || 0;\n control.patchValue({ amount_paid: outstanding });\n }\n });\n }\n\n selectAllFees(): void {\n this.feeItemsArray.controls.forEach(control => {\n control.patchValue({ is_selected: true });\n const outstanding = control.get('outstanding_amount')?.value || 0;\n control.patchValue({ amount_paid: outstanding });\n });\n }\n\n clearAllFees(): void {\n this.feeItemsArray.controls.forEach(control => {\n control.patchValue({ is_selected: false, amount_paid: 0 });\n });\n this.paymentForm.patchValue({ pay_full_outstanding: false });\n }\n\n toggleFeeItem(index: number): void {\n const control = this.feeItemsArray.at(index);\n const isSelected = control.get('is_selected')?.value;\n control.patchValue({ is_selected: !isSelected });\n\n if (!isSelected) {\n const outstanding = control.get('outstanding_amount')?.value || 0;\n control.patchValue({ amount_paid: outstanding });\n } else {\n control.patchValue({ amount_paid: 0 });\n }\n }\n\n onAmountChange(index: number, value: string | number | boolean | null | undefined): void {\n const control = this.feeItemsArray.at(index);\n const outstanding = control.get('outstanding_amount')?.value || 0;\n const numValue = parseFloat(String(value || '0')) || 0;\n\n if (numValue > outstanding) {\n control.patchValue({ amount_paid: outstanding });\n this.notificationService.warning('Amount cannot exceed outstanding amount.');\n }\n }\n\n onSubmit(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to process payments');\n return;\n }\n if (this.paymentForm.invalid || this.submitting()) {\n this.paymentForm.markAllAsTouched();\n this.notificationService.warning('Please fill in all required fields correctly.');\n return;\n }\n\n if (this.selectedFeeItems().length === 0) {\n this.notificationService.warning('Please select at least one fee item to pay.');\n return;\n }\n\n if (this.totalPayable() <= 0) {\n this.notificationService.warning('Total payable amount must be greater than zero.');\n return;\n }\n\n this.submitting.set(true);\n\n const formValue = this.paymentForm.value;\n const selectedItems = this.feeItemsArray.controls\n .map((control, index) => ({ control, index }))\n .filter(({ control }) => control.get('is_selected')?.value)\n .map(({ control, index }) => ({\n assignment_id: control.get('assignment_id')?.value,\n amount_paid: control.get('amount_paid')?.value,\n late_fee: control.get('late_fee')?.value,\n penalty: control.get('penalty')?.value\n }));\n\n // Create payload with all fields - using Record to allow all schema fields\n const payloadData = {\n feepay_student_id: formValue.student_id,\n feepay_payment_date: new Date(formValue.feepay_payment_date),\n feepay_payment_mode: formValue.feepay_payment_mode,\n feepay_payment_reference: formValue.feepay_payment_reference ||\n formValue.feepay_cheque_number ||\n formValue.feepay_transaction_reference,\n feepay_bank_name: formValue.feepay_bank_name,\n feepay_bank_branch_name: formValue.feepay_bank_branch_name,\n feepay_bank_ifsc_code: formValue.feepay_bank_ifsc_code,\n feepay_instrument_date: formValue.feepay_instrument_date ? new Date(formValue.feepay_instrument_date) : undefined,\n feepay_cheque_number: formValue.feepay_cheque_number,\n feepay_cheque_date: formValue.feepay_cheque_date ? new Date(formValue.feepay_cheque_date) : undefined,\n feepay_bank_account_number: formValue.feepay_bank_account_number,\n feepay_transaction_reference: formValue.feepay_transaction_reference,\n feepay_discount_percentage: formValue.feepay_discount_percentage || 0,\n feepay_discount_on: formValue.feepay_discount_on,\n feepay_discount_reason: formValue.feepay_discount_reason,\n feepay_total_amount: this.totalPayable(),\n feepay_late_fee_amount: this.totalLateFee(),\n feepay_status: 'SUCCESS' as const,\n feepay_remarks: formValue.feepay_remarks\n } as FeePayment;\n\n const payload: MFeePaymentInsertUpdatePayload = new MFeePaymentInsertUpdatePayload(payloadData);\n\n this.feePaymentService.saveUpdateFeePayment(payload).subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success('Payment recorded successfully!');\n this.router.navigate(['/control-panel/payment']);\n } else {\n this.notificationService.error(response?.message || 'Failed to record payment.');\n this.submitting.set(false);\n }\n },\n error: (error) => {\n console.error('Error recording payment:', error);\n this.notificationService.error('Failed to record payment. Please try again.');\n this.submitting.set(false);\n }\n });\n }\n\n onCancel(): void {\n if (this.paymentForm.dirty) {\n this.confirmationService.ask({\n title: 'Discard Changes?',\n message: 'You have unsaved changes. Are you sure you want to leave?',\n confirmText: 'Discard',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.router.navigate(['/control-panel/payment']);\n }\n });\n } else {\n this.router.navigate(['/control-panel/payment']);\n }\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n isOverdue(date: Date): boolean {\n return new Date(date) < new Date();\n }\n}\n","<!-- Payment Process Form -->\r\n<div class=\"tw-w-full tw-h-full\">\r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"paymentForm\" \r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n \r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Record Payment</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <!-- Back button or other actions can be added here if needed -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <div class=\"tw-space-y-4\">\r\n\r\n <!-- Student Information -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-p-4\">\r\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 tw-mb-3\">Student Information</h6>\r\n \r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <cide-ele-input \r\n label=\"Search Student *\" \r\n formControlName=\"student_search\"\r\n placeholder=\"Enter student name or ID...\"\r\n size=\"sm\"\r\n leadingIcon=\"search\"\r\n (ngModelChange)=\"onStudentSearch($event)\">\r\n </cide-ele-input>\r\n \r\n @if (selectedStudent()) {\r\n <div class=\"tw-mt-2 tw-p-2 tw-bg-green-50 tw-border tw-border-green-200 tw-rounded\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-green-900\">{{ selectedStudent()?.name }}</div>\r\n <div class=\"tw-text-xs tw-text-green-700\">ID: {{ selectedStudent()?.student_id }}</div>\r\n @if (selectedStudent()?.class) {\r\n <div class=\"tw-text-xs tw-text-green-600\">{{ selectedStudent()?.class }} / {{ selectedStudent()?.section }}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <cide-ele-input \r\n label=\"Payment Date *\" \r\n formControlName=\"feepay_payment_date\"\r\n type=\"date\"\r\n size=\"sm\"\r\n leadingIcon=\"calendar_today\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n\r\n <!-- Fee Selection -->\r\n @if (selectedStudent() && outstandingFees().length > 0) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-p-4\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900\">Select Fees to Pay</h6>\r\n <div class=\"tw-flex tw-items-center tw-gap-3\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-input \r\n formControlName=\"pay_full_outstanding\" \r\n type=\"checkbox\" \r\n size=\"sm\"\r\n (change)=\"togglePayFullOutstanding()\">\r\n </cide-ele-input>\r\n <span class=\"tw-text-sm tw-text-gray-700\">Pay full outstanding</span>\r\n </div>\r\n <button cideEleButton type=\"button\" variant=\"success\" size=\"xs\" (click)=\"selectAllFees()\">\r\n Select All\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"xs\" (click)=\"clearAllFees()\">\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div formArrayName=\"fee_items\" class=\"tw-space-y-2 tw-max-h-80 tw-overflow-y-auto tw-border tw-border-gray-200 tw-rounded-lg tw-p-3\">\r\n @for (item of feeItemsArray.controls; track $index) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-2 tw-bg-gray-50 tw-rounded tw-border tw-border-gray-200\"\r\n [formGroupName]=\"$index\">\r\n \r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-1\">\r\n <cide-ele-input \r\n formControlName=\"is_selected\" \r\n type=\"checkbox\" \r\n size=\"sm\"\r\n (change)=\"toggleFeeItem($index)\">\r\n </cide-ele-input>\r\n \r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900\">\r\n {{ item.get('fee_head')?.value }}\r\n </div>\r\n <div class=\"tw-text-xs tw-text-gray-500\">\r\n Outstanding: {{ formatCurrency(item.get('outstanding_amount')?.value || 0) }}\r\n @if (item.get('late_fee')?.value > 0) {\r\n <span class=\"tw-text-red-600\"> | Late Fee: {{ formatCurrency(item.get('late_fee')?.value) }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-input \r\n formControlName=\"amount_paid\"\r\n type=\"number\"\r\n placeholder=\"0.00\"\r\n size=\"sm\"\r\n [disabled]=\"!item.get('is_selected')?.value\"\r\n (ngModelChange)=\"onAmountChange($index, $event)\"\r\n class=\"tw-w-28\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Payment Details -->\r\n @if (selectedStudent()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-p-4\">\r\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 tw-mb-3\">Payment Details</h6>\r\n \r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-select \r\n label=\"Payment Method *\" \r\n formControlName=\"feepay_payment_method\"\r\n [options]=\"paymentMethodOptions\"\r\n size=\"sm\"\r\n leadingIcon=\"payment\">\r\n </cide-ele-select>\r\n\r\n <cide-ele-select \r\n label=\"Payment Mode *\" \r\n formControlName=\"feepay_payment_mode\"\r\n [options]=\"[{value: 'OFFLINE', label: 'Offline'}, {value: 'ONLINE', label: 'Online'}]\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <!-- Cheque/DD Details -->\r\n @if (showChequeDetails()) {\r\n <div class=\"tw-mt-4 tw-p-3 tw-bg-blue-50 tw-rounded tw-border tw-border-blue-200\">\r\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-blue-900 tw-mb-3\">Cheque/DD Details</h6>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\r\n <cide-ele-input \r\n label=\"Cheque/DD Number *\" \r\n formControlName=\"feepay_cheque_number\"\r\n placeholder=\"Enter cheque/DD number\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input \r\n label=\"Cheque/DD Date *\" \r\n formControlName=\"feepay_cheque_date\"\r\n type=\"date\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-mt-3\">\r\n <cide-ele-input \r\n label=\"Bank Name *\" \r\n formControlName=\"feepay_bank_name\"\r\n placeholder=\"Enter bank name\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input \r\n label=\"Branch Name *\" \r\n formControlName=\"feepay_bank_branch_name\"\r\n placeholder=\"Enter branch name\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-mt-3\">\r\n <cide-ele-input \r\n label=\"IFSC Code *\" \r\n formControlName=\"feepay_bank_ifsc_code\"\r\n placeholder=\"Enter IFSC code\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-mt-3\">\r\n <cide-ele-input \r\n label=\"Instrument Date *\" \r\n formControlName=\"feepay_instrument_date\"\r\n type=\"date\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Bank Transfer Details -->\r\n @if (showBankDetails()) {\r\n <div class=\"tw-mt-4 tw-p-3 tw-bg-green-50 tw-rounded tw-border tw-border-green-200\">\r\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-green-900 tw-mb-3\">Bank Transfer Details</h6>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\r\n <cide-ele-input \r\n label=\"Bank Name\" \r\n formControlName=\"feepay_bank_name\"\r\n placeholder=\"Enter bank name\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input \r\n label=\"Branch Name\" \r\n formControlName=\"feepay_bank_branch_name\"\r\n placeholder=\"Enter branch name\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-mt-3\">\r\n <cide-ele-input \r\n label=\"IFSC Code\" \r\n formControlName=\"feepay_bank_ifsc_code\"\r\n placeholder=\"Enter IFSC code\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input \r\n label=\"Account Number\" \r\n formControlName=\"feepay_bank_account_number\"\r\n placeholder=\"Enter account number\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-mt-3\">\r\n <cide-ele-input \r\n label=\"Transaction Reference *\" \r\n formControlName=\"feepay_transaction_reference\"\r\n placeholder=\"Enter transaction reference\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Discount Section -->\r\n <div class=\"tw-mt-4 tw-p-3 tw-bg-purple-50 tw-rounded tw-border tw-border-purple-200\">\r\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-purple-900 tw-mb-3\">Discount Information</h6>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\r\n <cide-ele-input \r\n label=\"Discount (%)\" \r\n formControlName=\"feepay_discount_percentage\"\r\n type=\"number\"\r\n placeholder=\"0\"\r\n size=\"sm\"\r\n [min]=\"0\"\r\n [max]=\"100\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-select \r\n label=\"Discount On\" \r\n formControlName=\"feepay_discount_on\"\r\n [options]=\"[{value: 'SUB_TOTAL', label: 'Sub Total'}, {value: 'FEE_HEAD', label: 'Fee Head'}, {value: 'TOTAL', label: 'Total'}, {value: 'INSTALLMENT', label: 'Installment'}]\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n <div class=\"tw-mt-3\">\r\n <cide-ele-textarea \r\n label=\"Discount Reason\" \r\n formControlName=\"feepay_discount_reason\"\r\n placeholder=\"Enter reason for discount...\"\r\n rows=\"2\"\r\n size=\"sm\">\r\n </cide-ele-textarea>\r\n </div>\r\n </div>\r\n\r\n <!-- Payment Reference -->\r\n <div class=\"tw-mt-4\">\r\n <cide-ele-input \r\n label=\"Payment Reference\" \r\n formControlName=\"feepay_payment_reference\"\r\n placeholder=\"Enter payment reference number\"\r\n size=\"sm\"\r\n leadingIcon=\"receipt\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <!-- Remarks -->\r\n <div class=\"tw-mt-4\">\r\n <cide-ele-textarea \r\n label=\"Remarks\" \r\n formControlName=\"feepay_remarks\"\r\n placeholder=\"Enter any additional remarks...\"\r\n rows=\"2\" \r\n size=\"sm\">\r\n </cide-ele-textarea>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Payment Summary -->\r\n @if (selectedStudent() && selectedFeeItems().length > 0) {\r\n <div class=\"tw-bg-gradient-to-r tw-from-green-50 tw-to-emerald-50 tw-rounded-lg tw-border tw-border-green-200 tw-p-4\">\r\n <h6 class=\"tw-text-base tw-font-semibold tw-text-green-900 tw-mb-3\">Payment Summary</h6>\r\n \r\n <div class=\"tw-space-y-3\">\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\r\n <span class=\"tw-text-gray-700\">Fee Amount:</span>\r\n <span class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(totalFeeAmount()) }}</span>\r\n </div>\r\n \r\n @if (totalLateFee() > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\r\n <span class=\"tw-text-gray-700\">Late Fee Amount:</span>\r\n <span class=\"tw-font-semibold tw-text-red-600\">{{ formatCurrency(totalLateFee()) }}</span>\r\n </div>\r\n }\r\n \r\n @if (totalPenalty() > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\r\n <span class=\"tw-text-gray-700\">Penalty Amount:</span>\r\n <span class=\"tw-font-semibold tw-text-red-600\">{{ formatCurrency(totalPenalty()) }}</span>\r\n </div>\r\n }\r\n \r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-3 tw-border-t-2 tw-border-green-300 tw-mt-2\">\r\n <span class=\"tw-text-lg tw-font-bold tw-text-green-900\">Total Payable:</span>\r\n <span class=\"tw-text-2xl tw-font-bold tw-text-green-700\">{{ formatCurrency(totalPayable()) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Form Validation Errors -->\r\n <!-- Action Buttons -->\r\n <div class=\"tw-flex tw-justify-end tw-gap-3 tw-mt-6\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"onCancel()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" size=\"sm\" \r\n [disabled]=\"submitting() || paymentForm.invalid || selectedFeeItems().length === 0 || loading()\" \r\n [loading]=\"submitting()\" \r\n leftIcon=\"save\">\r\n {{ submitting() ? 'Processing...' : 'Record Payment' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n","import { Component, inject, signal, OnInit, DestroyRef, computed } from '@angular/core';\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { HttpClient } from '@angular/common/http';\nimport { \n CideIconComponent,\n CideEleButtonComponent,\n NotificationService,\n CideEleFileManagerService\n} from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { CideFeeFeePaymentService } from '../../services/fee-payment.service';\nimport { \n generateObjectFromString,\n generateStringFromObject,\n type feePaymentByIdControllerResponse,\n type MFeePaymentGetByIdPayload,\n type FeePayment,\n type controllerResponse,\n cidePath,\n hostManagerRoutesUrl\n} from 'cloud-ide-lms-model';\n\n@Component({\n selector: 'cide-fee-payment-view',\n standalone: true,\n imports: [\n CommonModule,\n DatePipe,\n CideIconComponent,\n CideEleButtonComponent,\n CideLytSharedWrapperComponent\n ],\n template: `\n <cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"shared_wrapper_setup_param\">\n @if (loading()) {\n <div class=\"tw-text-center tw-py-12\">\n <cide-ele-icon class=\"tw-text-6xl tw-text-gray-300 dark:tw-text-gray-600 tw-animate-spin\">refresh</cide-ele-icon>\n <p class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-4\">Loading receipt details...</p>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <cide-ele-icon class=\"tw-text-6xl tw-text-red-300 dark:tw-text-red-600\">error</cide-ele-icon>\n <p class=\"tw-text-sm tw-text-red-600 dark:tw-text-red-400 tw-mt-4\">{{ error() }}</p>\n <cide-ele-button variant=\"ghost\" size=\"sm\" type=\"button\" (btnClick)=\"retryLoad()\" class=\"tw-mt-4\">\n Retry\n </cide-ele-button>\n </div>\n } @else if (feePayment()) {\n @if (feePayment(); as payment) {\n <!-- Compact Header Section -->\n <div class=\"tw-mb-3 tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-3\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-gap-3\">\n <div class=\"tw-flex tw-items-center tw-gap-2.5 tw-flex-1 tw-min-w-0\">\n <div class=\"tw-w-8 tw-h-8 tw-bg-green-100 dark:tw-bg-green-900/30 tw-rounded tw-flex tw-items-center tw-justify-center tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-text-green-600 dark:tw-text-green-400 tw-text-base\">receipt</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1 tw-min-w-0\">\n <h2 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-leading-tight tw-mb-1\">\n Fee Payment Receipt\n </h2>\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-wrap\">\n <span class=\"tw-text-xs tw-text-gray-600 dark:tw-text-gray-400\">\n Receipt #: {{ payment.feepay_receipt_number || 'N/A' }}\n </span>\n <span [class]=\"getStatusBadgeClass()\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\">\n {{ getStatusText() }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-shrink-0\">\n @if (!receiptHtml() && !generatingReceipt()) {\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"receipt\"\n (btnClick)=\"generateReceipt()\" title=\"Generate Receipt\" [loading]=\"generatingReceipt()\">\n Generate Receipt\n </button>\n }\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"sm\" leftIcon=\"visibility\"\n (btnClick)=\"viewReceipt()\" title=\"View Receipt\" [disabled]=\"generatingReceipt()\">\n View\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"sm\" leftIcon=\"print\"\n (btnClick)=\"printReceipt()\" title=\"Print Receipt\" [disabled]=\"generatingReceipt()\">\n Print\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"sm\" leftIcon=\"download\"\n (btnClick)=\"downloadReceipt()\" title=\"Download Receipt\" [disabled]=\"generatingReceipt()\">\n Download\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"sm\" leftIcon=\"arrow_back\"\n (btnClick)=\"goBack()\" title=\"Back to List\">\n Back\n </button>\n </div>\n </div>\n </div>\n\n <!-- Receipt Content -->\n <div class=\"tw-space-y-4\">\n <!-- Payment Summary Card -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-blue-500\">payment</cide-ele-icon>\n Payment Summary\n </h3>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-4\">\n <div>\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 dark:tw-text-gray-400 tw-uppercase tw-tracking-wide\">Payment Date</label>\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 dark:tw-text-gray-100 tw-mt-1\">\n {{ payment.feepay_payment_date | date:'MMM dd, yyyy' }}\n </p>\n </div>\n <div>\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 dark:tw-text-gray-400 tw-uppercase tw-tracking-wide\">Payment Mode</label>\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 dark:tw-text-gray-100 tw-mt-1\">\n {{ payment.feepay_payment_mode || 'N/A' }}\n </p>\n </div>\n <div>\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 dark:tw-text-gray-400 tw-uppercase tw-tracking-wide\">Total Amount</label>\n <p class=\"tw-text-lg tw-font-bold tw-text-green-600 dark:tw-text-green-400 tw-mt-1\">\n {{ formatCurrency(payment.feepay_total_amount || 0) }}\n </p>\n </div>\n </div>\n </div>\n\n <!-- Payment Details Grid -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <!-- Student Information -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-purple-500\">person</cide-ele-icon>\n Student Information\n </h3>\n <div class=\"tw-space-y-2 tw-text-xs\">\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Student ID:</span> <span class=\"tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_student_id || 'N/A' }}</span></div>\n @if (getStudentName()) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Name:</span> <span class=\"tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">{{ getStudentName() }}</span></div>\n }\n </div>\n </div>\n\n <!-- Payment Method Details -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-indigo-500\">account_balance</cide-ele-icon>\n Payment Method\n </h3>\n <div class=\"tw-space-y-2 tw-text-xs\">\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Mode:</span> <span class=\"tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_payment_mode || 'N/A' }}</span></div>\n @if (payment.feepay_payment_reference) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Reference:</span> <span class=\"tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_payment_reference }}</span></div>\n }\n @if (payment.feepay_bank_name) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Bank:</span> <span class=\"tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_bank_name }}</span></div>\n }\n @if (payment.feepay_cheque_number) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Cheque #:</span> <span class=\"tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_cheque_number }}</span></div>\n }\n @if (payment.feepay_transaction_reference) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Transaction ID:</span> <span class=\"tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_transaction_reference }}</span></div>\n }\n </div>\n </div>\n </div>\n\n <!-- Amount Breakdown -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-green-500\">account_balance_wallet</cide-ele-icon>\n Amount Breakdown\n </h3>\n <div class=\"tw-space-y-2\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-2 tw-border-b tw-border-gray-200 dark:tw-border-gray-700\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Subtotal:</span>\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">\n {{ formatCurrency((payment.feepay_total_amount || 0) - (payment.feepay_late_fee_amount || 0) - (payment.feepay_discount_amount || 0)) }}\n </span>\n </div>\n @if (payment.feepay_late_fee_amount && payment.feepay_late_fee_amount > 0) {\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-2 tw-border-b tw-border-gray-200 dark:tw-border-gray-700\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Late Fee:</span>\n <span class=\"tw-text-sm tw-font-medium tw-text-red-600 dark:tw-text-red-400\">\n {{ formatCurrency(payment.feepay_late_fee_amount) }}\n </span>\n </div>\n }\n @if (payment.feepay_discount_amount && payment.feepay_discount_amount > 0) {\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-2 tw-border-b tw-border-gray-200 dark:tw-border-gray-700\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Discount:</span>\n <span class=\"tw-text-sm tw-font-medium tw-text-green-600 dark:tw-text-green-400\">\n -{{ formatCurrency(payment.feepay_discount_amount) }}\n </span>\n </div>\n @if (payment.feepay_discount_reason) {\n <div class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400 tw-mt-1\">\n Reason: {{ payment.feepay_discount_reason }}\n </div>\n }\n }\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-2 tw-pt-3 tw-border-t-2 tw-border-gray-300 dark:tw-border-gray-600\">\n <span class=\"tw-text-sm tw-font-bold tw-text-gray-900 dark:tw-text-gray-100\">Total Amount:</span>\n <span class=\"tw-text-lg tw-font-bold tw-text-green-600 dark:tw-text-green-400\">\n {{ formatCurrency(payment.feepay_total_amount || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Additional Information -->\n @if (payment.feepay_remarks) {\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-2 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-orange-500\">notes</cide-ele-icon>\n Remarks\n </h3>\n <p class=\"tw-text-xs tw-text-gray-700 dark:tw-text-gray-300\">{{ payment.feepay_remarks }}</p>\n </div>\n }\n </div>\n }\n }\n </cide-lyt-shared-wrapper>\n `,\n styles: [`\n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class FeePaymentViewComponent implements OnInit {\n private readonly destroyRef = inject(DestroyRef);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n private readonly notificationService = inject(NotificationService);\n private readonly http = inject(HttpClient);\n private readonly rightsService = inject(RightsService);\n\n shared_wrapper_setup_param = {\n sypg_page_code: \"fee_payment\",\n breadcrumb_right_template: ''\n };\n\n loading = signal<boolean>(false);\n error = signal<string | null>(null);\n feePayment = signal<FeePayment | null>(null);\n generatingReceipt = signal<boolean>(false);\n receiptHtml = signal<string | null>(null);\n\n // Rights computed signals\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n canPrint = computed(() => this.rightsService.hasRight('PRINT'));\n canDownload = computed(() => this.rightsService.hasRight('DOWNLOAD'));\n\n ngOnInit(): void {\n // Initialize rights for fee payment management\n this.rightsService.initializeRights('fee_payment');\n const query = this.route.snapshot.paramMap.get('query');\n if (query) {\n try {\n const parsed = generateObjectFromString(query) as { feepay_id?: string };\n if (parsed?.feepay_id) {\n this.loadFeePayment(parsed.feepay_id);\n } else {\n this.error.set('Invalid payment ID');\n }\n } catch (error) {\n console.error('Error parsing query:', error);\n this.error.set('Invalid query parameters');\n }\n } else {\n this.error.set('Payment ID is required');\n }\n }\n\n private loadFeePayment(id: string): void {\n this.loading.set(true);\n this.error.set(null);\n\n const payload: MFeePaymentGetByIdPayload = {\n feepay_id: id\n };\n\n this.feePaymentService.getFeePaymentById(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: feePaymentByIdControllerResponse) => {\n this.loading.set(false);\n if (response.success && response.data) {\n this.feePayment.set(response.data);\n } else {\n this.error.set(response.message || 'Failed to load payment details');\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n this.error.set(response?.error?.message || 'Failed to load payment details');\n }\n });\n }\n\n retryLoad(): void {\n const query = this.route.snapshot.paramMap.get('query');\n if (query) {\n try {\n const parsed = generateObjectFromString(query) as { feepay_id?: string };\n if (parsed?.feepay_id) {\n this.loadFeePayment(parsed.feepay_id);\n }\n } catch (error) {\n console.error('Error parsing query:', error);\n }\n }\n }\n\n getStatusText(): string {\n const status = this.feePayment()?.feepay_status;\n if (!status) return 'N/A';\n return status.charAt(0) + status.slice(1).toLowerCase();\n }\n\n getStatusBadgeClass(): string {\n const status = this.feePayment()?.feepay_status?.toUpperCase();\n if (status === 'SUCCESS' || status === 'COMPLETED') {\n return 'tw-bg-green-100 tw-text-green-800 dark:tw-bg-green-900/30 dark:tw-text-green-300';\n } else if (status === 'PENDING') {\n return 'tw-bg-yellow-100 tw-text-yellow-800 dark:tw-bg-yellow-900/30 dark:tw-text-yellow-300';\n } else if (status === 'FAILED' || status === 'CANCELLED') {\n return 'tw-bg-red-100 tw-text-red-800 dark:tw-bg-red-900/30 dark:tw-text-red-300';\n } else if (status === 'REFUNDED') {\n return 'tw-bg-blue-100 tw-text-blue-800 dark:tw-bg-blue-900/30 dark:tw-text-blue-300';\n }\n return 'tw-bg-gray-100 tw-text-gray-800 dark:tw-bg-gray-700 dark:tw-text-gray-300';\n }\n\n getStudentName(): string {\n // If student is populated, extract name\n const payment = this.feePayment();\n if (!payment) return '';\n // This would need to be populated from API response\n return '';\n }\n\n formatCurrency(amount: number): string {\n return new Intl.NumberFormat('en-IN', {\n style: 'currency',\n currency: 'INR',\n minimumFractionDigits: 2\n }).format(amount);\n }\n\n printReceipt(): void {\n const payment = this.feePayment();\n if (!payment?._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n // Generate receipt if not already generated\n if (!this.receiptHtml()) {\n this.generateReceipt(() => {\n this.printReceiptHtml();\n });\n } else {\n this.printReceiptHtml();\n }\n }\n\n private printReceiptHtml(): void {\n const html = this.receiptHtml();\n if (html) {\n const printWindow = window.open('', '_blank');\n if (printWindow) {\n printWindow.document.write(html);\n printWindow.document.close();\n printWindow.focus();\n setTimeout(() => {\n printWindow.print();\n printWindow.close();\n }, 250);\n }\n } else {\n // Fallback to browser print\n window.print();\n }\n }\n\n downloadReceipt(): void {\n if (!this.rightsService.hasRight('DOWNLOAD_RECEIPT')) {\n this.notificationService.error('You do not have permission to download receipts');\n return;\n }\n const payment = this.feePayment();\n if (!payment?._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n // Generate receipt if not already generated\n if (!this.receiptHtml()) {\n this.generateReceipt(() => {\n this.downloadReceiptPdf();\n });\n } else {\n this.downloadReceiptPdf();\n }\n }\n\n private downloadReceiptPdf(): void {\n const payment = this.feePayment();\n if (!payment?._id) {\n return;\n }\n\n const paymentId = payment._id;\n const receiptUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'fees',\n 'receipt',\n paymentId,\n 'pdf'\n ]);\n\n // Open in new tab for download\n window.open(receiptUrl, '_blank');\n this.notificationService.info('Downloading receipt PDF...');\n }\n\n generateReceipt(callback?: () => void): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to generate receipts');\n return;\n }\n const payment = this.feePayment();\n if (!payment?._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n this.generatingReceipt.set(true);\n\n const paymentId = payment._id;\n const generateUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'fees',\n 'receipt',\n 'generate',\n paymentId\n ]);\n\n this.http.post<any>(generateUrl, {}).subscribe({\n next: (response) => {\n this.generatingReceipt.set(false);\n if (response?.success && response?.data) {\n // Store receipt HTML if available\n if (response.data.receiptHtml) {\n this.receiptHtml.set(response.data.receiptHtml);\n }\n this.notificationService.success('Receipt generated successfully');\n if (callback) {\n callback();\n }\n } else {\n this.notificationService.error(response?.message || 'Failed to generate receipt');\n }\n },\n error: (err) => {\n console.error('Error generating receipt:', err);\n this.generatingReceipt.set(false);\n this.notificationService.error('Failed to generate receipt');\n }\n });\n }\n\n viewReceipt(): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view receipts');\n return;\n }\n const payment = this.feePayment();\n if (!payment?._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n // Generate receipt if not already generated\n if (!this.receiptHtml()) {\n this.generateReceipt(() => {\n this.openReceiptInNewTab();\n });\n } else {\n this.openReceiptInNewTab();\n }\n }\n\n private openReceiptInNewTab(): void {\n const html = this.receiptHtml();\n if (html) {\n const newWindow = window.open('', '_blank');\n if (newWindow) {\n newWindow.document.write(html);\n newWindow.document.close();\n }\n } else {\n // Fallback: get receipt HTML from API\n const payment = this.feePayment();\n if (payment?._id) {\n const paymentId = payment._id;\n const receiptUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'fees',\n 'receipt',\n paymentId,\n 'html'\n ]);\n\n this.http.get<any>(receiptUrl).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const receiptHtml = response.data.html || response.data.receiptHtml;\n if (receiptHtml) {\n this.receiptHtml.set(receiptHtml);\n const newWindow = window.open('', '_blank');\n if (newWindow) {\n newWindow.document.write(receiptHtml);\n newWindow.document.close();\n }\n } else {\n this.notificationService.warning('Receipt HTML not available');\n }\n }\n },\n error: (err) => {\n console.error('Error loading receipt HTML:', err);\n this.notificationService.error('Failed to load receipt');\n }\n });\n }\n }\n }\n\n goBack(): void {\n this.router.navigate(['/control-panel/payment']);\n }\n}\n","import { Component, inject, signal, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'cide-discount-rules',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n template: `\r\n <div class=\"discount-rules-container\">\r\n <div class=\"header\">\r\n <h1>Discount Rules Management</h1>\r\n <button class=\"btn btn-primary\" (click)=\"openRuleModal()\">Create New Rule</button>\r\n </div>\r\n\r\n <!-- Tabs -->\r\n <div class=\"tabs\">\r\n <button class=\"tab\" [class.active]=\"activeTab() === 'rules'\" (click)=\"activeTab.set('rules')\">Discount Rules</button>\r\n <button class=\"tab\" [class.active]=\"activeTab() === 'applied'\" (click)=\"activeTab.set('applied')\">Applied Discounts</button>\r\n <button class=\"tab\" [class.active]=\"activeTab() === 'scholarships'\" (click)=\"activeTab.set('scholarships')\">Scholarships</button>\r\n </div>\r\n\r\n <!-- Rules Tab -->\r\n @if (activeTab() === 'rules') {\r\n <div class=\"rules-section\">\r\n <div class=\"table-container\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th>Rule Name</th>\r\n <th>Rule Code</th>\r\n <th>Discount Type</th>\r\n <th>Discount Value</th>\r\n <th>Applies To</th>\r\n <th>Priority</th>\r\n <th>Auto Apply</th>\r\n <th>Status</th>\r\n <th>Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (rule of discountRules(); track rule.id) {\r\n <tr>\r\n <td>{{ rule.name }}</td>\r\n <td>{{ rule.code }}</td>\r\n <td><span class=\"badge\">{{ rule.discount_type }}</span></td>\r\n <td class=\"discount-value\">{{ rule.discount_type === 'PERCENTAGE' ? rule.value + '%' : 'โน' + rule.value }}</td>\r\n <td>{{ rule.applies_to }}</td>\r\n <td><span class=\"priority\">{{ rule.priority }}</span></td>\r\n <td><span class=\"status-badge\" [class.active]=\"rule.auto_apply\">{{ rule.auto_apply ? 'Yes' : 'No' }}</span></td>\r\n <td><span class=\"status-badge\" [class.active]=\"rule.status === 'ACTIVE'\">{{ rule.status }}</span></td>\r\n <td>\r\n <button class=\"btn-icon\" (click)=\"editRule(rule)\">โ๏ธ</button>\r\n <button class=\"btn-icon\" (click)=\"toggleRuleStatus(rule)\">๐</button>\r\n <button class=\"btn-icon\" (click)=\"deleteRule(rule)\">๐๏ธ</button>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Rule Modal -->\r\n @if (showRuleModal()) {\r\n <div class=\"modal-overlay\" (click)=\"closeRuleModal()\">\r\n <div class=\"modal-content\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-header\">\r\n <h2>{{ editingRule() ? 'Edit' : 'Create' }} Discount Rule</h2>\r\n <button class=\"close-btn\" (click)=\"closeRuleModal()\">ร</button>\r\n </div>\r\n <form [formGroup]=\"ruleForm\" class=\"modal-body\">\r\n <div class=\"form-row\">\r\n <div class=\"form-group\">\r\n <label>Rule Name *</label>\r\n <input type=\"text\" formControlName=\"rule_name\" placeholder=\"e.g., Sibling Discount\" />\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Rule Code *</label>\r\n <input type=\"text\" formControlName=\"rule_code\" placeholder=\"e.g., SIBLING_DISC\" />\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Description</label>\r\n <textarea formControlName=\"description\" rows=\"3\" placeholder=\"Describe the discount rule...\"></textarea>\r\n </div>\r\n <div class=\"form-row\">\r\n <div class=\"form-group\">\r\n <label>Discount Type *</label>\r\n <select formControlName=\"discount_type\">\r\n <option value=\"PERCENTAGE\">Percentage</option>\r\n <option value=\"FIXED_AMOUNT\">Fixed Amount</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Discount Value *</label>\r\n <input type=\"number\" formControlName=\"discount_value\" placeholder=\"Enter value\" />\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Applies To Fee Categories *</label>\r\n <select formControlName=\"applies_to\" multiple>\r\n <option value=\"ALL\">All Categories</option>\r\n <option value=\"TUITION\">Tuition</option>\r\n <option value=\"EXAM\">Exam Fees</option>\r\n <option value=\"LIBRARY\">Library</option>\r\n <option value=\"LAB\">Lab</option>\r\n <option value=\"SPORTS\">Sports</option>\r\n <option value=\"TRANSPORT\">Transport</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Criteria (JSON Format)</label>\r\n <textarea formControlName=\"criteria_json\" rows=\"4\" placeholder='{\"sibling_count\": \">= 1\", \"staff_role\": \"TEACHER\"}'></textarea>\r\n <small>Define conditions for automatic discount application</small>\r\n </div>\r\n <div class=\"form-row\">\r\n <div class=\"form-group\">\r\n <label>Priority</label>\r\n <input type=\"number\" formControlName=\"priority\" placeholder=\"1\" />\r\n <small>Higher priority rules apply first</small>\r\n </div>\r\n <div class=\"form-group checkbox-group\">\r\n <label><input type=\"checkbox\" formControlName=\"auto_apply\" /> Auto Apply</label>\r\n <label><input type=\"checkbox\" formControlName=\"stackable\" /> Stackable with other discounts</label>\r\n </div>\r\n </div>\r\n <div class=\"form-row\">\r\n <div class=\"form-group\">\r\n <label>Valid From</label>\r\n <input type=\"date\" formControlName=\"valid_from\" />\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Valid To</label>\r\n <input type=\"date\" formControlName=\"valid_to\" />\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"modal-footer\">\r\n <button class=\"btn btn-secondary\" (click)=\"closeRuleModal()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"saveRule()\" [disabled]=\"ruleForm.invalid\">Save Rule</button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .discount-rules-container { padding: 20px; }\r\n .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }\r\n .btn { padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; }\r\n .btn-primary { background: #007bff; color: white; }\r\n .btn-secondary { background: #6c757d; color: white; }\r\n .tabs { display: flex; gap: 10px; margin-bottom: 20px; border-bottom: 2px solid #e0e0e0; }\r\n .tab { padding: 12px 24px; background: none; border: none; border-bottom: 3px solid transparent; cursor: pointer; font-weight: 500; }\r\n .tab.active { border-bottom-color: #007bff; color: #007bff; }\r\n .table-container { overflow-x: auto; background: white; border-radius: 8px; border: 1px solid #e0e0e0; }\r\n table { width: 100%; border-collapse: collapse; }\r\n thead { background: #f8f9fa; }\r\n th { padding: 12px; text-align: left; font-weight: 600; border-bottom: 2px solid #dee2e6; }\r\n td { padding: 12px; border-bottom: 1px solid #dee2e6; }\r\n .badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; background: #e3f2fd; color: #1976d2; }\r\n .discount-value { font-weight: 600; color: #28a745; }\r\n .priority { display: inline-block; width: 30px; height: 30px; line-height: 30px; text-align: center; background: #ffc107; color: white; border-radius: 50%; font-weight: bold; }\r\n .status-badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; background: #f8d7da; color: #721c24; }\r\n .status-badge.active { background: #d4edda; color: #155724; }\r\n .btn-icon { background: none; border: none; cursor: pointer; font-size: 18px; padding: 4px; }\r\n .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; }\r\n .modal-content { background: white; border-radius: 8px; max-width: 800px; width: 90%; max-height: 90vh; overflow-y: auto; }\r\n .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 20px; border-bottom: 1px solid #e0e0e0; }\r\n .close-btn { background: none; border: none; font-size: 28px; cursor: pointer; color: #666; }\r\n .modal-body { padding: 20px; }\r\n .modal-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 20px; border-top: 1px solid #e0e0e0; }\r\n .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; }\r\n .form-group { margin-bottom: 15px; }\r\n .form-group label { display: block; margin-bottom: 5px; font-weight: 500; font-size: 14px; }\r\n .form-group input, .form-group select, .form-group textarea { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; }\r\n .form-group small { color: #666; font-size: 12px; }\r\n .checkbox-group { display: flex; flex-direction: column; gap: 8px; }\r\n .checkbox-group label { display: flex; align-items: center; gap: 8px; }\r\n `]\r\n})\r\nexport class DiscountRulesComponent implements OnInit {\r\n private fb = inject(FormBuilder);\r\n\r\n activeTab = signal<string>('rules');\r\n showRuleModal = signal<boolean>(false);\r\n editingRule = signal<any>(null);\r\n discountRules = signal<any[]>([]);\r\n\r\n ruleForm: FormGroup = this.fb.group({\r\n rule_name: ['', Validators.required],\r\n rule_code: ['', Validators.required],\r\n description: [''],\r\n discount_type: ['PERCENTAGE', Validators.required],\r\n discount_value: ['', [Validators.required, Validators.min(0)]],\r\n applies_to: [['ALL'], Validators.required],\r\n criteria_json: [''],\r\n priority: [1],\r\n auto_apply: [false],\r\n stackable: [false],\r\n valid_from: [''],\r\n valid_to: ['']\r\n });\r\n\r\n ngOnInit(): void {\r\n this.loadDiscountRules();\r\n }\r\n\r\n private loadDiscountRules(): void {\r\n // Mock data - replace with actual API call\r\n this.discountRules.set([\r\n { id: 1, name: 'Sibling 20% on term fees', code: 'SIBLING_TERM_20', discount_type: 'PERCENTAGE', value: 20, applies_to: 'Term Fees', priority: 1, auto_apply: true, status: 'ACTIVE' },\r\n { id: 2, name: 'Teachers 1st child โน2000 on exam fees', code: 'TEACHER_EXAM_2000', discount_type: 'FIXED_AMOUNT', value: 2000, applies_to: 'Exam Fees', priority: 2, auto_apply: true, status: 'ACTIVE' },\r\n { id: 3, name: 'Early Payment Discount', code: 'EARLY_PAY_10', discount_type: 'PERCENTAGE', value: 10, applies_to: 'All', priority: 3, auto_apply: false, status: 'ACTIVE' }\r\n ]);\r\n }\r\n\r\n openRuleModal(): void {\r\n this.editingRule.set(null);\r\n this.ruleForm.reset({ discount_type: 'PERCENTAGE', priority: 1, applies_to: ['ALL'] });\r\n this.showRuleModal.set(true);\r\n }\r\n\r\n closeRuleModal(): void {\r\n this.showRuleModal.set(false);\r\n }\r\n\r\n editRule(rule: any): void {\r\n this.editingRule.set(rule);\r\n this.ruleForm.patchValue(rule);\r\n this.showRuleModal.set(true);\r\n }\r\n\r\n saveRule(): void {\r\n if (this.ruleForm.valid) {\r\n console.log('Saving rule:', this.ruleForm.value);\r\n this.closeRuleModal();\r\n this.loadDiscountRules();\r\n }\r\n }\r\n\r\n toggleRuleStatus(rule: any): void {\r\n console.log('Toggle status:', rule);\r\n }\r\n\r\n deleteRule(rule: any): void {\r\n if (confirm('Are you sure you want to delete this rule?')) {\r\n console.log('Delete rule:', rule);\r\n }\r\n }\r\n}\r\n\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n cidePath,\r\n feesRoutesUrl,\r\n hostManagerRoutesUrl,\r\n generateStringFromObject,\r\n type feeReceiptTemplateControllerResponse,\r\n type MFeeReceiptTemplate,\r\n type feeReceiptTemplateByIdControllerResponse,\r\n type MFeeReceiptTemplateGetByIdPayload,\r\n type feeReceiptTemplateInsertUpdateControllerResponse,\r\n type MFeeReceiptTemplateInsertUpdatePayload,\r\n type feeReceiptTemplateDeleteControllerResponse,\r\n type MFeeReceiptTemplateDeletePayload,\r\n type feeReceiptTemplateToggleStatusControllerResponse,\r\n type MFeeReceiptTemplateToggleStatusPayload\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReceiptTemplateService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Get list of receipt templates\r\n * @param payload - Query parameters for filtering/pagination\r\n * @returns Observable of receipt template list response\r\n */\r\n getReceiptTemplateList(payload: MFeeReceiptTemplate): Observable<feeReceiptTemplateControllerResponse> {\r\n console.log(\"Receipt Template List Payload:\", payload);\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate,\r\n query\r\n ]);\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n /**\r\n * Get receipt template by ID\r\n * @param payload - Receipt template ID payload\r\n * @returns Observable of receipt template data\r\n */\r\n getReceiptTemplateById(payload: MFeeReceiptTemplateGetByIdPayload): Observable<feeReceiptTemplateByIdControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate,\r\n 'byId',\r\n query\r\n ]);\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n /**\r\n * Create or update receipt template\r\n * @param data - Receipt template data to save\r\n * @returns Observable of the save response\r\n */\r\n saveUpdateReceiptTemplate(data: MFeeReceiptTemplateInsertUpdatePayload): Observable<feeReceiptTemplateInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate\r\n ]);\r\n\r\n return this.http.post(url, data);\r\n }\r\n\r\n /**\r\n * Delete receipt template\r\n * @param payload - Receipt template ID payload\r\n * @returns Observable of the delete response\r\n */\r\n deleteReceiptTemplate(payload: MFeeReceiptTemplateDeletePayload): Observable<feeReceiptTemplateDeleteControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate,\r\n 'delete',\r\n query\r\n ]);\r\n\r\n return this.http.delete(url);\r\n }\r\n\r\n /**\r\n * Toggle receipt template status\r\n * @param payload - Receipt template ID payload\r\n * @returns Observable of the toggle response\r\n */\r\n toggleReceiptTemplateStatus(payload: MFeeReceiptTemplateToggleStatusPayload): Observable<feeReceiptTemplateToggleStatusControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate,\r\n 'toggle-status'\r\n ]);\r\n\r\n console.log('๐ Making PATCH request to toggle receipt template status:', { url, payload });\r\n return this.http.patch(url, payload);\r\n }\r\n}\r\n\r\n\r\n\r\n","import { Component, inject, signal, OnInit, OnDestroy, computed, ViewChild, ElementRef, input, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { DestroyRef } from '@angular/core';\nimport { startWith } from 'rxjs';\nimport {\n CideInputComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent,\n NotificationService,\n ConfirmationService\n} from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, CideLytSharedWrapperSetupParam } from 'cloud-ide-layout';\nimport { ReceiptTemplateService } from '../../services/receipt-template.service';\nimport { \n MFeeReceiptTemplate,\n MFeeReceiptTemplateGetByIdPayload,\n MFeeReceiptTemplateInsertUpdatePayload,\n type FeeReceiptTemplate} from 'cloud-ide-lms-model';\n\ninterface TagCategory {\n id: string;\n name: string;\n icon: string;\n tags: Tag[];\n}\n\ninterface Tag {\n code: string;\n description: string;\n example?: string;\n}\n\n@Component({\n selector: 'cide-receipt-template-designer',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './template-designer.component.html',\n styleUrl: './template-designer.component.scss'\n})\nexport class TemplateDesignerComponent extends CideLytSharedWrapperComponent implements OnInit, OnDestroy {\n public override shared_wrapper_setup_param = input<Partial<CideLytSharedWrapperSetupParam>>({\n sypg_page_code: \"receipt_template\"\n });\n private readonly fb = inject(FormBuilder);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly receiptTemplateService = inject(ReceiptTemplateService);\n private readonly cdr = inject(ChangeDetectorRef);\n \n @ViewChild('htmlEditor', { static: false }) htmlEditorRef?: ElementRef<HTMLTextAreaElement>;\n\n templateForm: FormGroup = this.fb.group({\n template_name: ['', Validators.required],\n template_code: ['', Validators.required],\n template_type: ['PAYMENT', Validators.required],\n template_for: ['BOTH'],\n is_default: [false],\n template_html: ['', Validators.required],\n css_styles: [''],\n tag_search: [''], // For tag search input\n preview_type: ['STUDENT'] // For preview type selector\n });\n\n readonly activeCategory = signal<string>('entity');\n readonly tagSearchQuery = signal<string>('');\n readonly loading = signal<boolean>(false);\n readonly saving = signal<boolean>(false);\n readonly currentTemplateId = signal<string | null>(null);\n readonly templates = signal<FeeReceiptTemplate[]>([]);\n readonly loadingTemplates = signal<boolean>(false);\n\n readonly tagCategories: TagCategory[] = [\n {\n id: 'entity',\n name: 'Entity/School',\n icon: 'business',\n tags: [\n { code: '[entity_id]', description: 'Entity ID', example: '65c78b6fa1194f56586a9f1a' },\n { code: '[entity_name]', description: 'Entity/School Name', example: 'Dream Dale Public School' },\n { code: '[entity_logo]', description: 'Entity Logo URL', example: 'https://...' },\n { code: '[entity_address]', description: 'Entity Address', example: 'Shastrinagar, Bhandara' },\n { code: '[entity_phone]', description: 'Entity Phone', example: '+91-1234567890' }\n ]\n },\n {\n id: 'student',\n name: 'Student Info',\n icon: 'person',\n tags: [\n { code: '[student_id]', description: 'Student ID', example: 'STU-2024-001' },\n { code: '[student_full_name]', description: 'Student Full Name', example: 'AASHI SANJAY NANDURKAR' },\n { code: '[student_first_name]', description: 'Student First Name', example: 'AASHI' },\n { code: '[student_last_name]', description: 'Student Last Name', example: 'NANDURKAR' },\n { code: '[student_gender]', description: 'Student Gender', example: 'Female' },\n { code: '[student_dob]', description: 'Date of Birth', example: '01/01/2010' },\n { code: '[student_email]', description: 'Student Email', example: 'student@example.com' },\n { code: '[student_phone]', description: 'Student Phone', example: '+91-9876543210' },\n { code: '[student_address]', description: 'Student Address', example: '123 Main Street' },\n { code: '[parent_name]', description: 'Parent/Guardian Name', example: 'SANJAY NANDURKAR' },\n { code: '[parent_phone]', description: 'Parent Phone', example: '+91-9876543210' }\n ]\n },\n {\n id: 'academic',\n name: 'Academic',\n icon: 'school',\n tags: [\n { code: '[academic_year_id]', description: 'Academic Year ID', example: '68bb3279c154ce23423aeb8a' },\n { code: '[academic_year_name]', description: 'Academic Year Name', example: 'AY 2023-2024' },\n { code: '[academic_year_code]', description: 'Academic Year Code', example: '2023-24' },\n { code: '[class_program_id]', description: 'Class/Program ID', example: '68bb3279c154ce23423aeb8b' },\n { code: '[class_program_name]', description: 'Class/Program Name', example: '4th Standard' },\n { code: '[branch_id]', description: 'Branch ID', example: '68bb3279c154ce23423aeb8c' },\n { code: '[branch_name]', description: 'Branch/Specialization Name', example: 'Science' },\n { code: '[term_id]', description: 'Term ID', example: '68bb3279c154ce23423aeb8d' },\n { code: '[term_name]', description: 'Term Name', example: 'First Term' },\n { code: '[section_id]', description: 'Section ID', example: '68bb3279c154ce23423aeb8e' },\n { code: '[section_name]', description: 'Section Name', example: 'A' }\n ]\n },\n {\n id: 'payment',\n name: 'Payment Info',\n icon: 'payment',\n tags: [\n { code: '[feepay_receipt_number]', description: 'Receipt Number', example: 'RCP-2024-001234' },\n { code: '[feepay_payment_date]', description: 'Payment Date', example: '09/12/2023' },\n { code: '[feepay_payment_mode]', description: 'Payment Mode', example: 'CASH' },\n { code: '[feepay_payment_reference]', description: 'Payment Reference', example: 'REF-123456' },\n { code: '[feepay_bank_name]', description: 'Bank Name', example: 'State Bank of India' },\n { code: '[feepay_bank_branch_name]', description: 'Bank Branch Name', example: 'Bhandara Main Branch' },\n { code: '[feepay_bank_ifsc_code]', description: 'Bank IFSC Code', example: 'SBIN0001234' },\n { code: '[feepay_bank_account_number]', description: 'Bank Account Number', example: '1234567890' },\n { code: '[feepay_cheque_number]', description: 'Cheque Number', example: 'CHQ-123456' },\n { code: '[feepay_cheque_date]', description: 'Cheque Date', example: '09/12/2023' },\n { code: '[feepay_transaction_reference]', description: 'Transaction Reference', example: 'TXN-123456' },\n { code: '[feepay_instrument_date]', description: 'Instrument Date', example: '09/12/2023' },\n { code: '[feepay_status]', description: 'Payment Status', example: 'SUCCESS' },\n { code: '[feepay_remarks]', description: 'Payment Remarks', example: 'Payment received' }\n ]\n },\n {\n id: 'fee_items',\n name: 'Fee Items (Dynamic)',\n icon: 'list',\n tags: [\n { code: '[fee_items_count]', description: 'Number of Fee Items', example: '3' },\n { code: '[fee_items_loop_start]', description: 'Start Loop for Fee Items', example: '<!-- Use with fee_items_loop_end -->' },\n { code: '[fee_items_loop_end]', description: 'End Loop for Fee Items', example: '<!-- Use with fee_items_loop_start -->' },\n { code: '[fee_item_index]', description: 'Current Item Index (0-based)', example: '0' },\n { code: '[fee_item_number]', description: 'Current Item Number (1-based)', example: '1' },\n { code: '[fee_item_id]', description: 'Fee Item ID', example: '68bb3279c154ce23423aeb8f' },\n { code: '[fee_item_name]', description: 'Fee Item Name', example: 'Tuition Fee' },\n { code: '[fee_item_code]', description: 'Fee Item Code', example: 'TUITION' },\n { code: '[fee_item_category]', description: 'Fee Category Name', example: 'Academic Fees' },\n { code: '[fee_item_description]', description: 'Fee Item Description', example: 'Monthly tuition fee' },\n { code: '[fee_item_amount]', description: 'Fee Item Amount', example: '5000.00' },\n { code: '[fee_item_amount_paid]', description: 'Amount Paid for This Item', example: '5000.00' },\n { code: '[fee_item_late_fee]', description: 'Late Fee for This Item', example: '0.00' },\n { code: '[fee_item_discount]', description: 'Discount Applied to This Item', example: '0.00' },\n { code: '[fee_item_total]', description: 'Total for This Item', example: '5000.00' }\n ]\n },\n {\n id: 'fee_structure',\n name: 'Fee Structure',\n icon: 'account_tree',\n tags: [\n { code: '[fee_structure_id]', description: 'Fee Structure ID', example: '68bb3279c154ce23423aeb90' },\n { code: '[fee_structure_name]', description: 'Fee Structure Name', example: 'Standard Fee Structure 2024' },\n { code: '[fee_structure_code]', description: 'Fee Structure Code', example: 'STD-2024' },\n { code: '[fee_structure_description]', description: 'Fee Structure Description', example: 'Standard fee structure for academic year 2024' }\n ]\n },\n {\n id: 'fee_assignment',\n name: 'Fee Assignment',\n icon: 'assignment',\n tags: [\n { code: '[fee_assignment_number]', description: 'Assignment Number', example: 'ASG-2024-001' },\n { code: '[fee_assignment_date]', description: 'Assignment Date', example: '01/04/2024' },\n { code: '[fee_due_date]', description: 'Fee Due Date', example: '30/04/2024' },\n { code: '[fee_collection_start_date]', description: 'Collection Start Date', example: '01/04/2024' },\n { code: '[fee_collection_end_date]', description: 'Collection End Date', example: '30/04/2024' },\n { code: '[fee_original_amount]', description: 'Original Fee Amount', example: '50000.00' },\n { code: '[fee_assigned_amount]', description: 'Assigned Amount', example: '50000.00' },\n { code: '[fee_paid_amount]', description: 'Total Paid Amount', example: '25000.00' },\n { code: '[fee_outstanding_amount]', description: 'Outstanding Amount', example: '25000.00' },\n { code: '[fee_payment_status]', description: 'Payment Status', example: 'PARTIALLY_PAID' },\n { code: '[fee_installment_count]', description: 'Installment Count', example: '4' },\n { code: '[fee_installment_amount]', description: 'Installment Amount', example: '12500.00' },\n { code: '[fee_paid_installments]', description: 'Paid Installments', example: '2' }\n ]\n },\n {\n id: 'amounts',\n name: 'Amounts',\n icon: 'currency_rupee',\n tags: [\n { code: '[feepay_total_amount]', description: 'Total Payment Amount', example: '17500.00' },\n { code: '[feepay_discount_amount]', description: 'Total Discount Amount', example: '500.00' },\n { code: '[feepay_discount_percentage]', description: 'Discount Percentage', example: '2.5' },\n { code: '[feepay_discount_reason]', description: 'Discount Reason', example: 'Early payment discount' },\n { code: '[feepay_late_fee_amount]', description: 'Total Late Fee Amount', example: '200.00' },\n { code: '[subtotal_amount]', description: 'Subtotal (Before Discount/Late Fee)', example: '17000.00' },\n { code: '[net_amount]', description: 'Net Amount (After Discount, Before Late Fee)', example: '16500.00' },\n { code: '[amount_in_words]', description: 'Amount in Words', example: 'Seventeen Thousand Five Hundred Rupees Only' },\n { code: '[currency_symbol]', description: 'Currency Symbol', example: 'โน' },\n { code: '[currency_code]', description: 'Currency Code', example: 'INR' }\n ]\n },\n {\n id: 'installments',\n name: 'Installments',\n icon: 'calendar_view_month',\n tags: [\n { code: '[installments_count]', description: 'Number of Installments', example: '4' },\n { code: '[installments_loop_start]', description: 'Start Loop for Installments', example: '<!-- Use with installments_loop_end -->' },\n { code: '[installments_loop_end]', description: 'End Loop for Installments', example: '<!-- Use with installments_loop_start -->' },\n { code: '[installment_number]', description: 'Installment Number (1-based)', example: '1' },\n { code: '[installment_due_date]', description: 'Installment Due Date', example: '01/04/2024' },\n { code: '[installment_amount]', description: 'Installment Amount', example: '12500.00' },\n { code: '[installment_percentage]', description: 'Installment Percentage', example: '25' },\n { code: '[installment_status]', description: 'Installment Status', example: 'PAID' },\n { code: '[installment_paid_date]', description: 'Installment Paid Date', example: '01/04/2024' }\n ]\n },\n {\n id: 'receipt',\n name: 'Receipt',\n icon: 'description',\n tags: [\n { code: '[receipt_number]', description: 'Receipt Number', example: 'RCP-2024-001234' },\n { code: '[receipt_date]', description: 'Receipt Date', example: '09/12/2023' },\n { code: '[receipt_generated_at]', description: 'Receipt Generated At', example: '09/12/2023 10:30 AM' },\n { code: '[receipt_generated_by]', description: 'Receipt Generated By', example: 'Admin User' }\n ]\n }\n ];\n\n readonly filteredTags = computed(() => {\n const category = this.tagCategories.find(cat => cat.id === this.activeCategory());\n if (!category) return [];\n \n const query = this.tagSearchQuery().toLowerCase();\n if (!query) return category.tags;\n \n return category.tags.filter(tag => \n tag.code.toLowerCase().includes(query) || \n tag.description.toLowerCase().includes(query)\n );\n });\n\n // Reactive signal for template HTML - tracks form control changes\n readonly templateHtmlSignal = toSignal(\n this.templateForm.get('template_html')!.valueChanges.pipe(\n startWith(this.templateForm.get('template_html')?.value || '')\n ),\n { initialValue: this.templateForm.get('template_html')?.value || '' }\n );\n\n // Reactive signal for preview type - tracks preview type changes\n readonly previewTypeSignal = toSignal(\n this.templateForm.get('preview_type')!.valueChanges.pipe(\n startWith(this.templateForm.get('preview_type')?.value || 'STUDENT')\n ),\n { initialValue: this.templateForm.get('preview_type')?.value || 'STUDENT' }\n );\n\n readonly previewHtml = computed(() => {\n // Access both signals to make computed reactive to both changes\n const templateHtml = this.templateHtmlSignal(); // Read to track dependency\n const previewType = this.previewTypeSignal(); // Read to track dependency\n // Use the reactive signal instead of reading directly from form\n const htmlContent = this.getPreviewWithSampleData();\n return this.sanitizer.bypassSecurityTrustHtml(htmlContent);\n });\n\n constructor() {\n super();\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n // Only load default template if no template ID is provided\n if (!this.currentTemplateId()) {\n this.loadDefaultTemplate();\n }\n this.setupFormListeners();\n }\n\n private setupFormListeners(): void {\n // Listen to tag search changes with debounce for better performance\n this.templateForm.get('tag_search')?.valueChanges\n .pipe(\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe((query: string | null) => {\n const searchQuery = query || '';\n this.onTagSearch(searchQuery);\n // Also update the signal directly to ensure computed signal updates\n this.tagSearchQuery.set(searchQuery);\n });\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n insertTag(tag: Tag): void {\n // Try to get textarea from ViewChild first\n let textarea = this.htmlEditorRef?.nativeElement;\n \n // If ViewChild is not available, try to find it in the DOM\n if (!textarea) {\n const textareaElement = document.querySelector('.template-html-editor') as HTMLTextAreaElement;\n if (textareaElement) {\n textarea = textareaElement;\n }\n }\n \n if (!textarea) {\n // Fallback: just append to the end\n const currentValue = this.templateForm.get('template_html')?.value || '';\n this.templateForm.patchValue({ template_html: currentValue + tag.code });\n return;\n }\n\n const start = textarea.selectionStart || 0;\n const end = textarea.selectionEnd || 0;\n const currentValue = this.templateForm.get('template_html')?.value || '';\n const newValue = currentValue.substring(0, start) + tag.code + currentValue.substring(end);\n \n this.templateForm.patchValue({ template_html: newValue });\n \n // Restore cursor position after tag insertion\n setTimeout(() => {\n textarea.focus();\n const newPosition = start + tag.code.length;\n textarea.setSelectionRange(newPosition, newPosition);\n }, 0);\n }\n\n private getPreviewWithSampleData(): string {\n // Use the reactive signal to ensure preview updates when template changes\n let html = this.templateHtmlSignal() || '';\n \n // Sample fee payment items data\n const sampleFeeItems = [\n { \n index: 0, \n number: 1,\n id: '68bb3279c154ce23423aeb8f',\n name: 'Tuition Fee',\n code: 'TUITION',\n category: 'Academic Fees',\n description: 'Monthly tuition fee',\n amount: 5000.00,\n amount_paid: 5000.00,\n late_fee: 0.00,\n discount: 0.00,\n total: 5000.00\n },\n { \n index: 1, \n number: 2,\n id: '68bb3279c154ce23423aeb90',\n name: 'Laboratory Fee',\n code: 'LABORATORY',\n category: 'Academic Fees',\n description: 'Laboratory equipment and materials',\n amount: 3000.00,\n amount_paid: 3000.00,\n late_fee: 0.00,\n discount: 500.00,\n total: 2500.00\n },\n { \n index: 2, \n number: 3,\n id: '68bb3279c154ce23423aeb91',\n name: 'Library Fee',\n code: 'LIBRARY',\n category: 'Academic Fees',\n description: 'Library membership fee',\n amount: 1000.00,\n amount_paid: 1000.00,\n late_fee: 0.00,\n discount: 0.00,\n total: 1000.00\n }\n ];\n\n // Sample installment data\n const sampleInstallments = [\n { number: 1, due_date: '01/04/2024', amount: 3000.00, percentage: 30, status: 'PAID', paid_date: '01/04/2024' },\n { number: 2, due_date: '01/05/2024', amount: 3000.00, percentage: 30, status: 'PAID', paid_date: '01/05/2024' },\n { number: 3, due_date: '01/06/2024', amount: 2000.00, percentage: 20, status: 'PENDING', paid_date: '' },\n { number: 4, due_date: '01/07/2024', amount: 2000.00, percentage: 20, status: 'PENDING', paid_date: '' }\n ];\n\n // Process fee items loop\n if (html.includes('[fee_items_loop_start]') && html.includes('[fee_items_loop_end]')) {\n const loopStart = html.indexOf('[fee_items_loop_start]');\n const loopEnd = html.indexOf('[fee_items_loop_end]');\n if (loopStart !== -1 && loopEnd !== -1) {\n const loopTemplate = html.substring(loopStart + '[fee_items_loop_start]'.length, loopEnd);\n let loopContent = '';\n \n sampleFeeItems.forEach((item, idx) => {\n let itemHtml = loopTemplate;\n itemHtml = itemHtml.replace(/\\[fee_item_index\\]/g, idx.toString());\n itemHtml = itemHtml.replace(/\\[fee_item_number\\]/g, item.number.toString());\n itemHtml = itemHtml.replace(/\\[fee_item_id\\]/g, item.id);\n itemHtml = itemHtml.replace(/\\[fee_item_name\\]/g, item.name);\n itemHtml = itemHtml.replace(/\\[fee_item_code\\]/g, item.code);\n itemHtml = itemHtml.replace(/\\[fee_item_category\\]/g, item.category);\n itemHtml = itemHtml.replace(/\\[fee_item_description\\]/g, item.description);\n itemHtml = itemHtml.replace(/\\[fee_item_amount\\]/g, item.amount.toFixed(2));\n itemHtml = itemHtml.replace(/\\[fee_item_amount_paid\\]/g, item.amount_paid.toFixed(2));\n itemHtml = itemHtml.replace(/\\[fee_item_late_fee\\]/g, item.late_fee.toFixed(2));\n itemHtml = itemHtml.replace(/\\[fee_item_discount\\]/g, item.discount.toFixed(2));\n itemHtml = itemHtml.replace(/\\[fee_item_total\\]/g, item.total.toFixed(2));\n loopContent += itemHtml;\n });\n \n html = html.substring(0, loopStart) + loopContent + html.substring(loopEnd + '[fee_items_loop_end]'.length);\n }\n }\n\n // Process installments loop\n if (html.includes('[installments_loop_start]') && html.includes('[installments_loop_end]')) {\n const loopStart = html.indexOf('[installments_loop_start]');\n const loopEnd = html.indexOf('[installments_loop_end]');\n if (loopStart !== -1 && loopEnd !== -1) {\n const loopTemplate = html.substring(loopStart + '[installments_loop_start]'.length, loopEnd);\n let loopContent = '';\n \n sampleInstallments.forEach((installment) => {\n let instHtml = loopTemplate;\n instHtml = instHtml.replace(/\\[installment_number\\]/g, installment.number.toString());\n instHtml = instHtml.replace(/\\[installment_due_date\\]/g, installment.due_date);\n instHtml = instHtml.replace(/\\[installment_amount\\]/g, installment.amount.toFixed(2));\n instHtml = instHtml.replace(/\\[installment_percentage\\]/g, installment.percentage.toString());\n instHtml = instHtml.replace(/\\[installment_status\\]/g, installment.status);\n instHtml = instHtml.replace(/\\[installment_paid_date\\]/g, installment.paid_date || 'N/A');\n loopContent += instHtml;\n });\n \n html = html.substring(0, loopStart) + loopContent + html.substring(loopEnd + '[installments_loop_end]'.length);\n }\n }\n\n // Calculate totals\n const totalAmount = sampleFeeItems.reduce((sum, item) => sum + item.amount, 0);\n const totalDiscount = sampleFeeItems.reduce((sum, item) => sum + item.discount, 0);\n const totalLateFee = sampleFeeItems.reduce((sum, item) => sum + item.late_fee, 0);\n const subtotal = totalAmount;\n const netAmount = subtotal - totalDiscount;\n const finalTotal = netAmount + totalLateFee;\n\n // Sample data for all tags (matching actual fee payment table structure)\n const sampleData: Record<string, string> = {\n // Entity/School\n '[entity_id]': '65c78b6fa1194f56586a9f1a',\n '[entity_name]': 'Dream Dale Public School, Bhandara',\n '[entity_logo]': 'https://via.placeholder.com/150',\n '[entity_address]': 'Shastrinagar, Near Dasara maidan, Bhandara-441904',\n '[entity_phone]': '+91-1234567890',\n \n // Student Info\n '[student_id]': 'STU-2024-001',\n '[student_full_name]': 'AASHI SANJAY NANDURKAR',\n '[student_first_name]': 'AASHI',\n '[student_last_name]': 'NANDURKAR',\n '[student_gender]': 'Female',\n '[student_dob]': '01/01/2010',\n '[student_email]': 'aashi.nandurkar@example.com',\n '[student_phone]': '+91-9876543210',\n '[student_address]': '123 Main Street, Bhandara',\n '[parent_name]': 'SANJAY NANDURKAR',\n '[parent_phone]': '+91-9876543211',\n \n // Academic\n '[academic_year_id]': '68bb3279c154ce23423aeb8a',\n '[academic_year_name]': 'AY 2023-2024',\n '[academic_year_code]': '2023-24',\n '[class_program_id]': '68bb3279c154ce23423aeb8b',\n '[class_program_name]': '4th Standard',\n '[branch_id]': '68bb3279c154ce23423aeb8c',\n '[branch_name]': 'Science',\n '[term_id]': '68bb3279c154ce23423aeb8d',\n '[term_name]': 'First Term',\n '[section_id]': '68bb3279c154ce23423aeb8e',\n '[section_name]': 'A',\n \n // Payment Info (from fee_payment table)\n '[feepay_receipt_number]': 'RCP-2024-001234',\n '[feepay_payment_date]': '09/12/2023',\n '[feepay_payment_mode]': 'CASH',\n '[feepay_payment_reference]': 'REF-123456',\n '[feepay_bank_name]': 'State Bank of India',\n '[feepay_bank_branch_name]': 'Bhandara Main Branch',\n '[feepay_bank_ifsc_code]': 'SBIN0001234',\n '[feepay_bank_account_number]': '1234567890',\n '[feepay_cheque_number]': 'CHQ-123456',\n '[feepay_cheque_date]': '09/12/2023',\n '[feepay_transaction_reference]': 'TXN-123456',\n '[feepay_instrument_date]': '09/12/2023',\n '[feepay_status]': 'SUCCESS',\n '[feepay_remarks]': 'Payment received successfully',\n \n // Fee Items (dynamic)\n '[fee_items_count]': sampleFeeItems.length.toString(),\n \n // Fee Structure\n '[fee_structure_id]': '68bb3279c154ce23423aeb90',\n '[fee_structure_name]': 'Standard Fee Structure 2024',\n '[fee_structure_code]': 'STD-2024',\n '[fee_structure_description]': 'Standard fee structure for academic year 2024',\n \n // Fee Assignment\n '[fee_assignment_number]': 'ASG-2024-001',\n '[fee_assignment_date]': '01/04/2024',\n '[fee_due_date]': '30/04/2024',\n '[fee_collection_start_date]': '01/04/2024',\n '[fee_collection_end_date]': '30/04/2024',\n '[fee_original_amount]': totalAmount.toFixed(2),\n '[fee_assigned_amount]': totalAmount.toFixed(2),\n '[fee_paid_amount]': finalTotal.toFixed(2),\n '[fee_outstanding_amount]': '0.00',\n '[fee_payment_status]': 'PARTIALLY_PAID',\n '[fee_installment_count]': sampleInstallments.length.toString(),\n '[fee_installment_amount]': (totalAmount / sampleInstallments.length).toFixed(2),\n '[fee_paid_installments]': '2',\n \n // Amounts\n '[feepay_total_amount]': finalTotal.toFixed(2),\n '[feepay_discount_amount]': totalDiscount.toFixed(2),\n '[feepay_discount_percentage]': totalDiscount > 0 ? ((totalDiscount / subtotal) * 100).toFixed(2) : '0.00',\n '[feepay_discount_reason]': 'Early payment discount',\n '[feepay_late_fee_amount]': totalLateFee.toFixed(2),\n '[subtotal_amount]': subtotal.toFixed(2),\n '[net_amount]': netAmount.toFixed(2),\n '[amount_in_words]': this.numberToWords(finalTotal),\n '[currency_symbol]': 'โน',\n '[currency_code]': 'INR',\n \n // Installments\n '[installments_count]': sampleInstallments.length.toString(),\n \n // Receipt\n '[receipt_number]': 'RCP-2024-001234',\n '[receipt_date]': '09/12/2023',\n '[receipt_generated_at]': new Date().toLocaleString('en-IN', { dateStyle: 'medium', timeStyle: 'short' }),\n '[receipt_generated_by]': 'Admin User'\n };\n\n // Process conditional tags (e.g., [field_name]...[/field_name])\n // These tags show content only if the field has a value\n const conditionalTagPattern = /\\[([a-z_]+)\\]([\\s\\S]*?)\\[\\/\\1\\]/gi;\n html = html.replace(conditionalTagPattern, (match: string, fieldName: string, content: string) => {\n const fieldValue = sampleData[`[${fieldName}]`];\n // Show content if field has a value (not empty, not 'N/A', not '0.00')\n if (fieldValue && fieldValue !== 'N/A' && fieldValue !== '0.00' && fieldValue.trim() !== '') {\n return content;\n }\n return ''; // Hide content if field is empty\n });\n\n // Replace all tags with sample data\n Object.entries(sampleData).forEach(([tag, value]) => {\n const escapedTag = tag.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n html = html.replace(new RegExp(escapedTag, 'g'), value);\n });\n\n return html;\n }\n\n private numberToWords(amount: number): string {\n // Simple number to words converter (can be enhanced)\n const ones = ['', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine'];\n const teens = ['Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n \n if (amount === 0) return 'Zero Rupees Only';\n \n let rupees = Math.floor(amount);\n const paise = Math.round((amount - rupees) * 100);\n \n let words = '';\n \n if (rupees >= 100000) {\n const lakhs = Math.floor(rupees / 100000);\n words += this.convertHundreds(lakhs) + ' Lakh ';\n rupees %= 100000;\n }\n \n if (rupees >= 1000) {\n const thousands = Math.floor(rupees / 1000);\n words += this.convertHundreds(thousands) + ' Thousand ';\n rupees %= 1000;\n }\n \n if (rupees > 0) {\n words += this.convertHundreds(rupees);\n }\n \n words = words.trim() + ' Rupees';\n \n if (paise > 0) {\n words += ' and ' + this.convertHundreds(paise) + ' Paise';\n }\n \n return words + ' Only';\n }\n\n private convertHundreds(num: number): string {\n const ones = ['', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine'];\n const teens = ['Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n \n let result = '';\n \n if (num >= 100) {\n result += ones[Math.floor(num / 100)] + ' Hundred ';\n num %= 100;\n }\n \n if (num >= 20) {\n result += tens[Math.floor(num / 10)] + ' ';\n num %= 10;\n } else if (num >= 10) {\n result += teens[num - 10] + ' ';\n num = 0;\n }\n \n if (num > 0) {\n result += ones[num] + ' ';\n }\n \n return result.trim();\n }\n\n private loadDefaultTemplate(): void {\n const defaultTemplate = `<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; font-size: 12px; }\n .receipt-header { text-align: center; border-bottom: 2px solid #000; padding-bottom: 15px; margin-bottom: 20px; }\n .receipt-body { margin: 20px 0; }\n .receipt-footer { margin-top: 30px; text-align: center; border-top: 1px solid #000; padding-top: 15px; }\n table { width: 100%; border-collapse: collapse; margin: 15px 0; }\n table td { padding: 8px; border: 1px solid #ddd; }\n table th { padding: 8px; background-color: #f5f5f5; border: 1px solid #ddd; text-align: left; }\n .label { font-weight: bold; }\n .amount { font-size: 18px; font-weight: bold; }\n .text-right { text-align: right; }\n .text-center { text-align: center; }\n </style>\n</head>\n<body>\n <div class=\"receipt-header\">\n <h2>[entity_name]</h2>\n <p>[entity_address]</p>\n <p>Phone: [entity_phone]</p>\n <h3>FEE PAYMENT RECEIPT</h3>\n </div>\n <div class=\"receipt-body\">\n <table>\n <tr><td class=\"label\">Receipt Number:</td><td>[feepay_receipt_number]</td></tr>\n <tr><td class=\"label\">Receipt Date:</td><td>[feepay_payment_date]</td></tr>\n <tr><td class=\"label\">Student ID:</td><td>[student_id]</td></tr>\n <tr><td class=\"label\">Student Name:</td><td>[student_full_name]</td></tr>\n <tr><td class=\"label\">Class/Section:</td><td>[class_program_name] / [section_name]</td></tr>\n <tr><td class=\"label\">Academic Year:</td><td>[academic_year_name]</td></tr>\n <tr><td class=\"label\">Payment Mode:</td><td>[feepay_payment_mode]</td></tr>\n [feepay_bank_name]\n <tr><td class=\"label\">Bank Name:</td><td>[feepay_bank_name]</td></tr>\n [/feepay_bank_name]\n [feepay_cheque_number]\n <tr><td class=\"label\">Cheque Number:</td><td>[feepay_cheque_number]</td></tr>\n [/feepay_cheque_number]\n [feepay_transaction_reference]\n <tr><td class=\"label\">Transaction Reference:</td><td>[feepay_transaction_reference]</td></tr>\n [/feepay_transaction_reference]\n </table>\n \n <h4 style=\"margin-top: 20px; margin-bottom: 10px;\">Fee Items Details:</h4>\n <table>\n <thead>\n <tr>\n <th>Sr. No.</th>\n <th>Fee Item Name</th>\n <th>Category</th>\n <th class=\"text-right\">Amount</th>\n <th class=\"text-right\">Discount</th>\n <th class=\"text-right\">Late Fee</th>\n <th class=\"text-right\">Total</th>\n </tr>\n </thead>\n <tbody>\n [fee_items_loop_start]\n <tr>\n <td class=\"text-center\">[fee_item_number]</td>\n <td>[fee_item_name]</td>\n <td>[fee_item_category]</td>\n <td class=\"text-right\">[currency_symbol][fee_item_amount]</td>\n <td class=\"text-right\">[currency_symbol][fee_item_discount]</td>\n <td class=\"text-right\">[currency_symbol][fee_item_late_fee]</td>\n <td class=\"text-right\"><strong>[currency_symbol][fee_item_total]</strong></td>\n </tr>\n [fee_items_loop_end]\n </tbody>\n </table>\n \n <table style=\"margin-top: 20px;\">\n <tr>\n <td class=\"label\" style=\"width: 70%;\">Subtotal:</td>\n <td class=\"text-right\">[currency_symbol][subtotal_amount]</td>\n </tr>\n [feepay_discount_amount]\n <tr>\n <td class=\"label\">Discount ([feepay_discount_percentage]%):</td>\n <td class=\"text-right\">-[currency_symbol][feepay_discount_amount]</td>\n </tr>\n [/feepay_discount_amount]\n [feepay_late_fee_amount]\n <tr>\n <td class=\"label\">Late Fee:</td>\n <td class=\"text-right\">[currency_symbol][feepay_late_fee_amount]</td>\n </tr>\n [/feepay_late_fee_amount]\n <tr style=\"border-top: 2px solid #000;\">\n <td class=\"label\" style=\"font-size: 16px;\"><strong>Total Amount:</strong></td>\n <td class=\"text-right\" style=\"font-size: 18px;\"><strong>[currency_symbol][feepay_total_amount]</strong></td>\n </tr>\n <tr>\n <td colspan=\"2\" style=\"padding-top: 10px;\">\n <strong>Amount in Words:</strong> [amount_in_words]\n </td>\n </tr>\n </table>\n \n [fee_installment_count]\n <h4 style=\"margin-top: 20px; margin-bottom: 10px;\">Installment Details:</h4>\n <table>\n <thead>\n <tr>\n <th>Installment #</th>\n <th>Due Date</th>\n <th class=\"text-right\">Amount</th>\n <th class=\"text-right\">Percentage</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n [installments_loop_start]\n <tr>\n <td class=\"text-center\">[installment_number]</td>\n <td>[installment_due_date]</td>\n <td class=\"text-right\">[currency_symbol][installment_amount]</td>\n <td class=\"text-right\">[installment_percentage]%</td>\n <td>[installment_status]</td>\n </tr>\n [installments_loop_end]\n </tbody>\n </table>\n [/fee_installment_count]\n \n [feepay_remarks]\n <div style=\"margin-top: 20px; padding: 10px; background-color: #f9f9f9; border-left: 4px solid #007bff;\">\n <strong>Remarks:</strong> [feepay_remarks]\n </div>\n [/feepay_remarks]\n </div>\n <div class=\"receipt-footer\">\n <p>This is a computer generated receipt.</p>\n <p>Generated on: [receipt_generated_at]</p>\n <p style=\"margin-top: 30px;\">Authorised Signature</p>\n </div>\n</body>\n</html>`;\n\n this.templateForm.patchValue({\n template_name: 'Default Receipt Template',\n template_code: 'DEFAULT_RECEIPT',\n template_type: 'PAYMENT',\n template_html: defaultTemplate\n });\n }\n\n onCategoryChange(categoryId: string): void {\n this.activeCategory.set(categoryId);\n this.tagSearchQuery.set(''); // Clear search when changing category\n }\n\n onTagSearch(query: string): void {\n this.tagSearchQuery.set(query);\n }\n\n saveTemplate(): void {\n if (this.templateForm.invalid) {\n this.templateForm.markAllAsTouched();\n this.notificationService.warning('Please fill all required fields.');\n return;\n }\n\n this.saving.set(true);\n \n const formValue = this.templateForm.getRawValue();\n const templateData: MFeeReceiptTemplateInsertUpdatePayload = new MFeeReceiptTemplateInsertUpdatePayload({\n _id: this.currentTemplateId() || undefined,\n feert_template_name: formValue.template_name,\n feert_template_code: formValue.template_code,\n feert_template_html: formValue.template_html,\n feert_template_type: formValue.template_type as 'PAYMENT' | 'REFUND' | 'PROVISIONAL',\n feert_template_for: formValue.template_for as 'STUDENT' | 'OFFICE' | 'BOTH',\n feert_is_default: formValue.is_default || false,\n feert_status: 'ACTIVE'\n });\n \n this.receiptTemplateService.saveUpdateReceiptTemplate(templateData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.currentTemplateId.set(response.data._id || null);\n this.notificationService.success('Template saved successfully!');\n } else {\n this.notificationService.error(response.message || 'Failed to save template');\n }\n this.saving.set(false);\n },\n error: (error) => {\n console.error('Error saving template:', error);\n this.notificationService.error('Failed to save template. Please try again.');\n this.saving.set(false);\n }\n });\n }\n\n loadTemplates(): void {\n this.loadingTemplates.set(true);\n const payload: MFeeReceiptTemplate = new MFeeReceiptTemplate({});\n \n this.receiptTemplateService.getReceiptTemplateList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.templates.set(response.data);\n \n if (this.templates().length === 0) {\n this.notificationService.info('No templates found. Create a new template to get started.');\n this.loadingTemplates.set(false);\n return;\n }\n\n // If only one template, load it directly\n if (this.templates().length === 1) {\n this.loadTemplateById(this.templates()[0]._id || '');\n this.loadingTemplates.set(false);\n return;\n }\n\n // For multiple templates, show selection\n this.showTemplateSelection();\n this.loadingTemplates.set(false);\n } else {\n this.notificationService.warning('No templates found.');\n this.loadingTemplates.set(false);\n }\n },\n error: (error) => {\n console.error('Error loading templates:', error);\n this.notificationService.error('Failed to load templates. Please try again.');\n this.loadingTemplates.set(false);\n }\n });\n }\n\n private showTemplateSelection(): void {\n // Create a simple selection message\n const templateList = this.templates().map((t, index) => \n `${index + 1}. ${t.feert_template_name} (${t.feert_template_code})`\n ).join('\\n');\n\n // Use confirmation service to show template list\n // In a production app, you'd use a proper modal with a select dropdown\n const message = `Select a template to load:\\n\\n${templateList}\\n\\nEnter template number (1-${this.templates().length}):`;\n \n // For now, load the first template and show info\n // In a real implementation, you'd have a proper selection dialog\n this.notificationService.info(`Found ${this.templates().length} template(s). Loading first template. Use the template list to select others.`);\n \n // Load first template by default\n if (this.templates().length > 0) {\n this.loadTemplateById(this.templates()[0]._id || '');\n }\n }\n\n\n loadTemplateById(templateId: string): void {\n if (!templateId) {\n this.notificationService.warning('Template ID is required.');\n return;\n }\n\n this.loading.set(true);\n const payload: MFeeReceiptTemplateGetByIdPayload = new MFeeReceiptTemplateGetByIdPayload({\n feert_id: templateId\n });\n\n this.receiptTemplateService.getReceiptTemplateById(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n const template = response.data;\n this.currentTemplateId.set(template._id || null);\n \n // Use setValue to ensure all form controls are updated\n this.templateForm.patchValue({\n template_name: template.feert_template_name || '',\n template_code: template.feert_template_code || '',\n template_type: template.feert_template_type || 'PAYMENT',\n template_for: template.feert_template_for || 'BOTH',\n is_default: template.feert_is_default || false,\n template_html: template.feert_template_html || '',\n css_styles: '' // Add CSS field if needed\n }, { emitEvent: true });\n \n // Force change detection to update the textarea\n this.cdr.detectChanges();\n \n // Scroll to top of textarea after a brief delay to ensure it's rendered\n setTimeout(() => {\n const textarea = this.htmlEditorRef?.nativeElement || document.querySelector('.template-html-editor') as HTMLTextAreaElement;\n if (textarea) {\n textarea.focus();\n textarea.scrollTop = 0;\n }\n }, 100);\n \n this.notificationService.success('Template loaded successfully!');\n } else {\n this.notificationService.error(response.message || 'Failed to load template');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('Error loading template:', error);\n this.notificationService.error('Failed to load template. Please try again.');\n this.loading.set(false);\n }\n });\n }\n}\n","<!-- Receipt Template Designer -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"shared_wrapper_setup_param()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions class=\"tw-flex tw-items-center tw-gap-2\">\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"loadTemplates()\" leftIcon=\"folder_open\">\n Load Template\n </button>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"saveTemplate()\" leftIcon=\"save\"\n [disabled]=\"saving() || templateForm.invalid\" [loading]=\"saving()\">\n Save Template\n </button>\n </div>\n\n <!-- Main Content - Three Column Layout -->\n <div class=\"tw-w-full tw-h-full tw-overflow-hidden tw-flex tw-flex-col\" style=\"height: calc(100vh - 120px); max-width: 100vw;\">\n <div class=\"tw-grid tw-grid-cols-12 tw-gap-3 tw-flex-1 tw-min-h-0 tw-p-3\">\n \n <!-- Left Sidebar - Tag Categories & Tags -->\n <div class=\"tw-col-span-12 lg:tw-col-span-3 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden tw-flex tw-flex-col tw-min-w-0 tw-h-full\">\n <!-- Tag Categories Header -->\n <div class=\"tw-p-3 tw-border-b tw-border-gray-200 tw-bg-gray-50 tw-flex-shrink-0\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-2\">Available Tags</h6>\n <form [formGroup]=\"templateForm\">\n <cide-ele-input\n formControlName=\"tag_search\"\n placeholder=\"Search tags...\"\n size=\"sm\"\n leadingIcon=\"search\">\n </cide-ele-input>\n </form>\n </div>\n\n <!-- Category Tabs -->\n <div class=\"tw-flex tw-flex-wrap tw-gap-1 tw-p-2 tw-border-b tw-border-gray-200 tw-bg-gray-50 tw-overflow-x-auto\">\n @for (category of tagCategories; track category.id) {\n <button\n type=\"button\"\n class=\"tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-rounded tw-transition-colors tw-whitespace-nowrap\"\n [class.tw-bg-blue-100]=\"activeCategory() === category.id\"\n [class.tw-text-blue-700]=\"activeCategory() === category.id\"\n [class.tw-bg-gray-100]=\"activeCategory() !== category.id\"\n [class.tw-text-gray-700]=\"activeCategory() !== category.id\"\n (click)=\"onCategoryChange(category.id)\"\n [title]=\"category.name\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-inline-block tw-mr-1\">{{ category.icon }}</cide-ele-icon>\n <span class=\"tw-hidden sm:tw-inline\">{{ category.name }}</span>\n </button>\n }\n </div>\n\n <!-- Tags List -->\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-2 tw-min-h-0\">\n @if (filteredTags().length > 0) {\n <div class=\"tw-space-y-1\">\n @for (tag of filteredTags(); track tag.code) {\n <button\n type=\"button\"\n class=\"tw-w-full tw-text-left tw-p-2 tw-rounded tw-border tw-border-gray-200 tw-bg-white hover:tw-bg-blue-50 hover:tw-border-blue-300 tw-transition-colors tw-cursor-pointer tw-group\"\n (click)=\"insertTag(tag)\"\n [title]=\"tag.description\">\n <div class=\"tw-flex tw-items-start tw-justify-between tw-gap-2\">\n <div class=\"tw-flex-1 tw-min-w-0\">\n <code class=\"tw-text-xs tw-font-mono tw-text-blue-600 tw-font-semibold tw-block tw-break-all\">\n {{ tag.code }}\n </code>\n <span class=\"tw-text-xs tw-text-gray-600 tw-block tw-mt-1\">{{ tag.description }}</span>\n @if (tag.example) {\n <span class=\"tw-text-xs tw-text-gray-400 tw-block tw-mt-0.5\">e.g., {{ tag.example }}</span>\n }\n </div>\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-400 group-hover:tw-text-blue-600 tw-flex-shrink-0 tw-mt-0.5\">add_circle</cide-ele-icon>\n </div>\n </button>\n }\n </div>\n } @else {\n <div class=\"tw-text-center tw-py-8 tw-text-gray-500\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-mx-auto tw-mb-2 tw-text-gray-400\">search_off</cide-ele-icon>\n <p class=\"tw-text-xs\">No tags found</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Middle Column - HTML Editor -->\n <div class=\"tw-col-span-12 lg:tw-col-span-5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col tw-overflow-hidden tw-min-h-0 tw-min-w-0 tw-h-full\">\n <div class=\"tw-p-4 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-4\">Template Configuration</h6>\n \n <form [formGroup]=\"templateForm\" class=\"tw-space-y-3\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\n <cide-ele-input\n label=\"Template Name *\"\n formControlName=\"template_name\"\n placeholder=\"e.g., Standard Receipt\"\n size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-input\n label=\"Template Code *\"\n formControlName=\"template_code\"\n placeholder=\"e.g., STD_RECEIPT_01\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\n <cide-ele-select\n label=\"Template Type *\"\n formControlName=\"template_type\"\n [options]=\"[{value: 'PAYMENT', label: 'Payment Receipt'}, {value: 'REFUND', label: 'Refund Receipt'}, {value: 'PROVISIONAL', label: 'Provisional Receipt'}]\"\n size=\"sm\">\n </cide-ele-select>\n\n <cide-ele-select\n label=\"Template For\"\n formControlName=\"template_for\"\n [options]=\"[{value: 'STUDENT', label: 'Student'}, {value: 'OFFICE', label: 'Office'}, {value: 'BOTH', label: 'Both'}]\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"is_default\" type=\"checkbox\" size=\"sm\"></cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Set as Default Template</span>\n </div>\n </form>\n </div>\n\n <div class=\"tw-flex-1 tw-flex tw-flex-col tw-overflow-hidden tw-min-h-0 tw-h-full\">\n <div class=\"tw-p-3 tw-border-b tw-border-gray-200 tw-bg-gray-50 tw-flex-shrink-0\">\n <div class=\"tw-flex tw-items-center tw-justify-between\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900\">HTML Template *</h6>\n <span class=\"tw-text-xs tw-text-gray-500\">Click tags on left to insert or paste HTML here</span>\n </div>\n </div>\n <div class=\"tw-flex-1 tw-p-3 tw-overflow-hidden tw-min-h-0 tw-h-full\">\n <form [formGroup]=\"templateForm\" class=\"tw-h-full\">\n <textarea\n #htmlEditor\n formControlName=\"template_html\"\n placeholder=\"Enter HTML template code here... Use tags from the left sidebar or paste your HTML design.\"\n class=\"template-html-editor tw-w-full tw-h-full tw-p-3 tw-border tw-border-gray-300 tw-rounded-md tw-font-mono tw-text-xs tw-leading-relaxed tw-resize-none focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-blue-500 tw-bg-white tw-text-gray-900\"\n spellcheck=\"false\"></textarea>\n </form>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Live Preview -->\n <div class=\"tw-col-span-12 lg:tw-col-span-4 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col tw-overflow-hidden tw-min-w-0 tw-h-full\">\n <div class=\"tw-p-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-justify-between\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900\">Live Preview</h6>\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-select\n formControlName=\"preview_type\"\n [options]=\"[{value: 'STUDENT', label: 'Student'}, {value: 'OFFICE', label: 'Office'}]\"\n size=\"xs\"\n class=\"tw-w-24\">\n </cide-ele-select>\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-400\" title=\"Auto-refreshes on template change\">sync</cide-ele-icon>\n </div>\n </div>\n </div>\n \n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-bg-gray-50 tw-min-h-0\">\n <div class=\"tw-bg-white tw-shadow-sm tw-rounded tw-p-4\" [innerHTML]=\"previewHtml()\"></div>\n </div>\n </div>\n\n </div>\n </div>\n</cide-lyt-shared-wrapper>\n\n","import { Component, inject, signal, OnInit, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport {\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideEleDataGridComponent,\n type GridConfiguration,\n type GridEvent,\n type SelectOption,\n NotificationService\n} from 'cloud-ide-element';\nimport { ACADEMIC_YEAR_SERVICE_TOKEN, CLASS_PROGRAM_MASTER_SERVICE_TOKEN, type IAcademicYearService, type IClassProgramMasterService } from 'cloud-ide-shared';\nimport { type academicYearControllerResponse, type AcaAcademicYear, type classProgramMasterControllerResponse, type AcaClassProgramMasterResponse, type MFeePayment } from 'cloud-ide-lms-model';\nimport { CideFeeFeePaymentService } from '../../../fee-payment-management/services/fee-payment.service';\n\ninterface CollectionByDateData {\n date: Date;\n receipt_count: number;\n cash: number;\n online: number;\n cheque: number;\n other: number;\n total: number;\n}\n\ninterface CollectionByClassData {\n class: string;\n student_count: number;\n receipt_count: number;\n total: number;\n average: number;\n}\n\n@Component({\n selector: 'cide-collection-report',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideEleDataGridComponent\n ],\n templateUrl: './collection-report.component.html',\n styleUrl: './collection-report.component.scss'\n})\nexport class CollectionReportComponent implements OnInit {\n private readonly fb = inject(FormBuilder);\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\n private readonly classProgramService = inject<IClassProgramMasterService>(CLASS_PROGRAM_MASTER_SERVICE_TOKEN);\n private readonly notificationService = inject(NotificationService);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n\n filterForm: FormGroup = this.fb.group({\n date_from: [''],\n date_to: [''],\n academic_year: [''],\n class_program: [''],\n payment_mode: ['']\n });\n\n readonly loading = signal<boolean>(false);\n readonly collectionByDate = signal<CollectionByDateData[]>([]);\n readonly collectionByClass = signal<CollectionByClassData[]>([]);\n readonly academicYearOptions = signal<SelectOption[]>([]);\n readonly classOptions = signal<SelectOption[]>([]);\n\n readonly paymentModeOptions = [\n { value: '', label: 'All Modes' },\n { value: 'CASH', label: 'Cash' },\n { value: 'ONLINE', label: 'Online' },\n { value: 'CHEQUE', label: 'Cheque' },\n { value: 'DD', label: 'DD' },\n { value: 'UPI', label: 'UPI' },\n { value: 'CARD', label: 'Card' },\n { value: 'NET_BANKING', label: 'Net Banking' },\n { value: 'BANK_TRANSFER', label: 'Bank Transfer' }\n ];\n\n readonly summary = computed(() => {\n const byDate = this.collectionByDate();\n return {\n total_collection: byDate.reduce((sum, row) => sum + row.total, 0),\n total_receipts: byDate.reduce((sum, row) => sum + row.receipt_count, 0),\n online_payments: byDate.reduce((sum, row) => sum + row.online, 0),\n cash_payments: byDate.reduce((sum, row) => sum + row.cash, 0)\n };\n });\n\n readonly totalReceipts = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.receipt_count, 0)\n );\n \n readonly totalCash = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.cash, 0)\n );\n \n readonly totalOnline = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.online, 0)\n );\n \n readonly totalCheque = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.cheque, 0)\n );\n \n readonly totalOther = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.other, 0)\n );\n \n readonly grandTotal = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.total, 0)\n );\n\n // Grid configuration for Collection by Date\n readonly dateGridConfig = computed<GridConfiguration<CollectionByDateData>>(() => ({\n id: 'collection-by-date-grid',\n columns: [\n {\n key: 'date',\n header: 'Date',\n type: 'date',\n width: '120px',\n sortable: true\n },\n {\n key: 'receipt_count',\n header: 'Total Receipts',\n type: 'number',\n width: '120px',\n align: 'center',\n sortable: true\n },\n {\n key: 'cash',\n header: 'Cash',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'online',\n header: 'Online',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'cheque',\n header: 'Cheque',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'other',\n header: 'Other',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'total',\n header: 'Total Amount',\n type: 'number',\n width: '140px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n }\n ],\n data: this.collectionByDate(),\n trackBy: 'date',\n pagination: {\n enabled: false,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: false,\n showPageInfo: false,\n showRefresh: false\n },\n search: {\n enabled: false,\n placeholder: 'Search...',\n searchableColumns: [],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true\n }));\n\n // Grid configuration for Collection by Class\n readonly classGridConfig = computed<GridConfiguration<CollectionByClassData>>(() => ({\n id: 'collection-by-class-grid',\n columns: [\n {\n key: 'class',\n header: 'Class/Program',\n type: 'text',\n width: '200px',\n sortable: true\n },\n {\n key: 'student_count',\n header: 'Total Students',\n type: 'number',\n width: '140px',\n align: 'center',\n sortable: true\n },\n {\n key: 'receipt_count',\n header: 'Receipts',\n type: 'number',\n width: '120px',\n align: 'center',\n sortable: true\n },\n {\n key: 'total',\n header: 'Total Collected',\n type: 'number',\n width: '150px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'average',\n header: 'Average per Student',\n type: 'number',\n width: '160px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n }\n ],\n data: this.collectionByClass(),\n trackBy: 'class',\n pagination: {\n enabled: false,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: false,\n showPageInfo: false,\n showRefresh: false\n },\n search: {\n enabled: false,\n placeholder: 'Search...',\n searchableColumns: [],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true\n }));\n\n ngOnInit(): void {\n this.loadAcademicYears();\n this.loadClassPrograms();\n this.loadReportData();\n }\n\n private loadAcademicYears(): void {\n this.academicYearService.getAcademicYearList({ pageIndex: 1, pageSize: 100, pagination: false }).subscribe({\n next: (response: academicYearControllerResponse) => {\n if (response?.success && response?.data) {\n const academicYears: AcaAcademicYear[] = Array.isArray(response.data) ? response.data : [];\n this.academicYearOptions.set([\n { value: '', label: 'All Years' },\n ...academicYears.map((ay: AcaAcademicYear) => ({\n value: ay._id || '',\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\n }))\n ]);\n }\n },\n error: () => {\n this.academicYearOptions.set([{ value: '', label: 'All Years' }]);\n }\n });\n }\n\n private loadClassPrograms(): void {\n this.classProgramService.searchClassProgramMasters({ pagination: false }).subscribe({\n next: (response: classProgramMasterControllerResponse) => {\n if (response?.success && response?.data) {\n const classPrograms: AcaClassProgramMasterResponse[] = Array.isArray(response.data) ? response.data : [];\n this.classOptions.set([\n { value: '', label: 'All Classes' },\n ...classPrograms.map((cp: AcaClassProgramMasterResponse) => ({\n value: cp._id || '',\n label: cp.acacpm_alise_title || ''\n }))\n ]);\n }\n },\n error: () => {\n this.classOptions.set([{ value: '', label: 'All Classes' }]);\n }\n });\n }\n\n private loadReportData(): void {\n this.loading.set(true);\n \n // Build payload with filters from form\n const formValue = this.filterForm.value;\n const payload: MFeePayment = {\n pagination: false,\n query: undefined, // No search query field in filter form\n // Add payment mode filter if selected\n ...(formValue.payment_mode ? { feepay_payment_method: formValue.payment_mode } : {})\n // Add date range filters when available in API\n // feepay_payment_date_from: formValue.date_from,\n // feepay_payment_date_to: formValue.date_to\n };\n\n this.feePaymentService.getFeePaymentList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n // Aggregate data by date\n const dateMap = new Map<string, CollectionByDateData>();\n \n response.data.forEach((payment: any) => {\n const paymentDate = payment.feepay_payment_date ? new Date(payment.feepay_payment_date).toISOString().split('T')[0] : '';\n if (!paymentDate) return;\n \n if (!dateMap.has(paymentDate)) {\n dateMap.set(paymentDate, {\n date: new Date(paymentDate),\n receipt_count: 0,\n cash: 0,\n online: 0,\n cheque: 0,\n other: 0,\n total: 0\n });\n }\n \n const dayData = dateMap.get(paymentDate)!;\n dayData.receipt_count++;\n const amount = payment.feepay_amount_paid || payment.feepay_total_amount || 0;\n dayData.total += amount;\n \n const method = payment.feepay_payment_method || payment.feepay_payment_mode || '';\n if (method === 'CASH') {\n dayData.cash += amount;\n } else if (method === 'ONLINE' || method === 'UPI' || method === 'NET_BANKING' || method === 'CARD') {\n dayData.online += amount;\n } else if (method === 'CHEQUE' || method === 'DD') {\n dayData.cheque += amount;\n } else {\n dayData.other += amount;\n }\n });\n \n this.collectionByDate.set(Array.from(dateMap.values()).sort((a, b) => a.date.getTime() - b.date.getTime()));\n \n // TODO: Aggregate by class when class information is available in payment data\n // For now, using placeholder data structure\n this.collectionByClass.set([]);\n } else {\n this.collectionByDate.set([]);\n this.collectionByClass.set([]);\n }\n },\n error: (err) => {\n console.error('Error loading report data:', err);\n this.notificationService.error('Failed to load report data');\n this.collectionByDate.set([]);\n this.collectionByClass.set([]);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n }\n\n applyFilters(): void {\n this.loading.set(true);\n // Apply filters and reload report data\n this.loadReportData();\n this.notificationService.success('Report generated successfully');\n }\n\n exportToPDF(): void {\n this.notificationService.info('PDF export functionality will be implemented');\n }\n\n exportToExcel(): void {\n this.notificationService.info('Excel export functionality will be implemented');\n }\n\n onGridEvent(event: GridEvent<CollectionByDateData | CollectionByClassData>): void {\n // Handle grid events if needed\n console.log('Grid event:', event);\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n}\n","<!-- Collection Report Container -->\r\n<div class=\"tw-w-full tw-h-full\">\r\n <div class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n \r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">assessment</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Fee Collection Report</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-items-center tw-gap-3\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"exportToPDF()\" leftIcon=\"picture_as_pdf\">\r\n Export PDF\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"exportToExcel()\" leftIcon=\"table_chart\">\r\n Export Excel\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Filters Section -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <form [formGroup]=\"filterForm\" class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-5 tw-gap-4\">\r\n <cide-ele-input\r\n label=\"Date From\"\r\n formControlName=\"date_from\"\r\n type=\"date\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input\r\n label=\"Date To\"\r\n formControlName=\"date_to\"\r\n type=\"date\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-select\r\n label=\"Academic Year\"\r\n formControlName=\"academic_year\"\r\n [options]=\"academicYearOptions()\"\r\n size=\"sm\"\r\n placeholder=\"All Years\">\r\n </cide-ele-select>\r\n\r\n <cide-ele-select\r\n label=\"Class/Program\"\r\n formControlName=\"class_program\"\r\n [options]=\"classOptions()\"\r\n size=\"sm\"\r\n placeholder=\"All Classes\">\r\n </cide-ele-select>\r\n\r\n <cide-ele-select\r\n label=\"Payment Mode\"\r\n formControlName=\"payment_mode\"\r\n [options]=\"paymentModeOptions\"\r\n size=\"sm\"\r\n placeholder=\"All Modes\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-justify-end\">\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"applyFilters()\" leftIcon=\"search\"\r\n [disabled]=\"loading()\" [loading]=\"loading()\">\r\n Generate Report\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Summary Cards -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4 tw-border-b tw-border-gray-200\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-4 tw-gap-4\">\r\n <!-- Total Collection Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-bg-green-100 tw-rounded-full tw-p-3\">\r\n <cide-ele-icon class=\"tw-text-green-600 tw-w-6 tw-h-6\">account_balance_wallet</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Total Collection</div>\r\n <div class=\"tw-text-xl tw-font-bold tw-text-green-600\">{{ formatCurrency(summary().total_collection) }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Total Receipts Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-bg-blue-100 tw-rounded-full tw-p-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-6 tw-h-6\">receipt</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Total Receipts</div>\r\n <div class=\"tw-text-xl tw-font-bold tw-text-blue-600\">{{ summary().total_receipts }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Online Payments Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-bg-cyan-100 tw-rounded-full tw-p-3\">\r\n <cide-ele-icon class=\"tw-text-cyan-600 tw-w-6 tw-h-6\">language</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Online Payments</div>\r\n <div class=\"tw-text-xl tw-font-bold tw-text-cyan-600\">{{ formatCurrency(summary().online_payments) }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Cash Payments Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-bg-yellow-100 tw-rounded-full tw-p-3\">\r\n <cide-ele-icon class=\"tw-text-yellow-600 tw-w-6 tw-h-6\">money</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Cash Payments</div>\r\n <div class=\"tw-text-xl tw-font-bold tw-text-yellow-600\">{{ formatCurrency(summary().cash_payments) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4\">\r\n <div class=\"tw-space-y-6\">\r\n \r\n <!-- Collection by Date Section -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Collection by Date</h6>\r\n </div>\r\n <div class=\"tw-p-4\">\r\n <cide-ele-data-grid \r\n [config]=\"dateGridConfig()\" \r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n \r\n <!-- Footer Totals -->\r\n <div class=\"tw-mt-4 tw-pt-4 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-grid tw-grid-cols-7 tw-gap-4 tw-text-sm\">\r\n <div class=\"tw-font-semibold tw-text-gray-900\">TOTAL</div>\r\n <div class=\"tw-font-semibold tw-text-center tw-text-gray-900\">{{ totalReceipts() }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-gray-900\">{{ formatCurrency(totalCash()) }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-gray-900\">{{ formatCurrency(totalOnline()) }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-gray-900\">{{ formatCurrency(totalCheque()) }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-gray-900\">{{ formatCurrency(totalOther()) }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-green-600\">{{ formatCurrency(grandTotal()) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Collection by Class Section -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Collection by Class/Program</h6>\r\n </div>\r\n <div class=\"tw-p-4\">\r\n <cide-ele-data-grid \r\n [config]=\"classGridConfig()\" \r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Component, inject, signal, OnInit, computed, viewChild, TemplateRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { HttpClient } from '@angular/common/http';\nimport {\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n type GridConfiguration,\n type GridEvent,\n type TemplateContext,\n NotificationService\n} from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, AppStateHelperService, RightsService } from 'cloud-ide-layout';\nimport { CideFeeFeeAssignmentService } from '../../../fee-assignment-management/services/fee-assignment.service';\nimport { CideFeeFeePaymentService } from '../../../fee-payment-management/services/fee-payment.service';\nimport { cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\n\ninterface FeeDetailData {\n _id?: string;\n fee_head: string;\n amount: number;\n discount: number;\n net_amount: number;\n paid: number;\n outstanding: number;\n due_date: Date;\n status: 'PAID' | 'PENDING' | 'PARTIALLY_PAID' | 'OVERDUE';\n [key: string]: unknown;\n}\n\ninterface PaymentHistoryData {\n _id?: string;\n receipt_number: string;\n date: Date;\n amount: number;\n mode: string;\n reference: string;\n [key: string]: unknown;\n}\n\n@Component({\n selector: 'cide-my-fee-statement',\n standalone: true,\n imports: [\n CommonModule,\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './my-fee-statement.component.html',\n styleUrl: './my-fee-statement.component.scss'\n})\nexport class MyFeeStatementComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly notificationService = inject(NotificationService);\n private readonly http = inject(HttpClient);\n private readonly appStateHelper = inject(AppStateHelperService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n private readonly rightsService = inject(RightsService);\n\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\n readonly actionsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsRendererTemplate');\n readonly paymentHistoryRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('paymentHistoryRendererTemplate');\n\n readonly loading = signal<boolean>(false);\n readonly studentInfo = signal<{\n id: string;\n name: string;\n class: string;\n section: string;\n avatar: string;\n }>({\n id: 'STU-2024-001',\n name: 'John Doe',\n class: 'Class 10',\n section: 'A',\n avatar: ''\n });\n\n readonly feeDetails = signal<FeeDetailData[]>([]);\n readonly paymentHistory = signal<PaymentHistoryData[]>([]);\n\n readonly feeSummary = computed(() => {\n const details = this.feeDetails();\n return {\n total_fees: details.reduce((sum, fee) => sum + fee.amount, 0),\n paid_amount: details.reduce((sum, fee) => sum + fee.paid, 0),\n outstanding: details.reduce((sum, fee) => sum + fee.outstanding, 0),\n discount: details.reduce((sum, fee) => sum + fee.discount, 0)\n };\n });\n\n readonly feeDetailsGridConfig = computed<GridConfiguration<FeeDetailData>>(() => ({\n id: 'my-fee-details-grid',\n columns: [\n {\n key: 'fee_head',\n header: 'Fee Head',\n type: 'text',\n width: '200px',\n sortable: true\n },\n {\n key: 'amount',\n header: 'Amount',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'discount',\n header: 'Discount',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'net_amount',\n header: 'Net Amount',\n type: 'number',\n width: '130px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'paid',\n header: 'Paid',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'outstanding',\n header: 'Outstanding',\n type: 'number',\n width: '130px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'due_date',\n header: 'Due Date',\n type: 'date',\n width: '120px',\n sortable: true\n },\n {\n key: 'status',\n header: 'Status',\n type: 'custom',\n width: '140px',\n align: 'center',\n renderer: 'statusRenderer'\n }\n ],\n data: this.feeDetails(),\n trackBy: '_id',\n pagination: {\n enabled: false,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: false,\n showPageInfo: false,\n showRefresh: false\n },\n search: {\n enabled: false,\n placeholder: 'Search...',\n searchableColumns: [],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true\n }));\n\n readonly paymentHistoryGridConfig = computed<GridConfiguration<PaymentHistoryData>>(() => ({\n id: 'payment-history-grid',\n columns: [\n {\n key: 'receipt_number',\n header: 'Receipt Number',\n type: 'text',\n width: '150px',\n sortable: true\n },\n {\n key: 'date',\n header: 'Date',\n type: 'date',\n width: '150px',\n sortable: true\n },\n {\n key: 'amount',\n header: 'Amount',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'mode',\n header: 'Payment Mode',\n type: 'text',\n width: '150px',\n sortable: true\n },\n {\n key: 'reference',\n header: 'Reference',\n type: 'text',\n width: '150px',\n sortable: true\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'custom',\n width: '120px',\n align: 'center',\n renderer: 'paymentHistoryRenderer'\n }\n ],\n data: this.paymentHistory(),\n trackBy: '_id',\n pagination: {\n enabled: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search...',\n searchableColumns: ['receipt_number', 'mode'],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true\n }));\n\n readonly templateRenderers = computed(() => ({\n statusRenderer: this.statusRendererTemplate(),\n paymentHistoryRenderer: this.paymentHistoryRendererTemplate()\n }));\n\n ngOnInit(): void {\n // Initialize rights for fee statement (view-only)\n this.rightsService.initializeRights('fee_statement');\n this.loadFeeDetails();\n this.loadPaymentHistory();\n }\n\n private loadFeeDetails(): void {\n this.loading.set(true);\n \n // Get current user ID from app state\n const currentUser = this.appStateHelper.getCurrentUser();\n if (!currentUser?._id) {\n this.notificationService.error('User not authenticated');\n this.loading.set(false);\n return;\n }\n\n // Get student ID from admission form using user_id\n const userId = currentUser._id;\n const queryParams = new URLSearchParams({ admap_user_id_auth: userId }).toString();\n const admissionUrl = `${cidePath}${coreRoutesUrl}/admission/${queryParams}`;\n \n this.http.get<any>(admissionUrl).subscribe({\n next: (admissionResponse) => {\n let studentId: string | null = null;\n let admissionData: any = null;\n \n if (admissionResponse?.success && admissionResponse?.data) {\n admissionData = Array.isArray(admissionResponse.data) \n ? admissionResponse.data[0] \n : admissionResponse.data;\n studentId = admissionData?.admap_student_id || null;\n \n // Update student info\n if (admissionData) {\n const studentName = `${admissionData.admap_first_name || ''} ${admissionData.admap_middle_name || ''} ${admissionData.admap_last_name || ''}`.trim();\n this.studentInfo.set({\n id: studentId || 'N/A',\n name: studentName || 'N/A',\n class: admissionData.admap_class_program_name || 'N/A',\n section: admissionData.admap_program_term_section_name || 'N/A',\n avatar: admissionData.admap_photo_id_cyfm || ''\n });\n }\n }\n \n if (!studentId) {\n this.notificationService.warning('Student ID not found. Please ensure your admission is confirmed.');\n this.loading.set(false);\n return;\n }\n \n // Load fee assignments for this student\n const payload: any = {\n feeas_student_id: studentId,\n pageSize: 100 // Get all assignments\n };\n\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\n next: (response: any) => {\n if (response?.success && response?.data) {\n const today = new Date();\n const feeDetailsData: FeeDetailData[] = response.data.map((assignment: any) => {\n const originalAmount = assignment.feeas_original_amount || assignment.feeas_final_amount || 0;\n const discountAmount = assignment.feeas_discount_amount || 0;\n const netAmount = assignment.feeas_final_amount || (originalAmount - discountAmount);\n const paidAmount = assignment.feeas_amount_paid || assignment.feeas_paid_amount || 0;\n const outstandingAmount = assignment.feeas_outstanding_amount || \n assignment.feeas_amount_remaining || \n (netAmount - paidAmount);\n const dueDate = assignment.feeas_due_date ? new Date(assignment.feeas_due_date) : new Date();\n const isOverdue = dueDate < today && outstandingAmount > 0;\n \n let status: 'PAID' | 'PENDING' | 'PARTIALLY_PAID' | 'OVERDUE' = 'PENDING';\n if (outstandingAmount <= 0) {\n status = 'PAID';\n } else if (paidAmount > 0) {\n status = isOverdue ? 'OVERDUE' : 'PARTIALLY_PAID';\n } else {\n status = isOverdue ? 'OVERDUE' : 'PENDING';\n }\n \n return {\n _id: assignment._id,\n fee_head: assignment.feeas_fee_name || 'Fee',\n amount: originalAmount,\n discount: discountAmount,\n net_amount: netAmount,\n paid: paidAmount,\n outstanding: outstandingAmount,\n due_date: dueDate,\n status: status\n };\n });\n \n this.feeDetails.set(feeDetailsData);\n } else {\n this.feeDetails.set([]);\n }\n },\n error: (err: any) => {\n console.error('Error loading fee details:', err);\n this.notificationService.error('Failed to load fee details');\n this.feeDetails.set([]);\n this.loading.set(false);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n },\n error: (err: any) => {\n console.error('Error loading admission data:', err);\n this.notificationService.error('Failed to load student information');\n this.loading.set(false);\n }\n });\n }\n\n private loadPaymentHistory(): void {\n // Get current user ID from app state\n const currentUser = this.appStateHelper.getCurrentUser();\n if (!currentUser?._id) {\n return;\n }\n\n // Get student ID from admission form using user_id\n const userId = currentUser._id;\n const queryParams = new URLSearchParams({ admap_user_id_auth: userId }).toString();\n const admissionUrl = `${cidePath}${coreRoutesUrl}/admission/${queryParams}`;\n \n this.http.get<any>(admissionUrl).subscribe({\n next: (admissionResponse) => {\n let studentId: string | null = null;\n \n if (admissionResponse?.success && admissionResponse?.data) {\n const admissionData = Array.isArray(admissionResponse.data) \n ? admissionResponse.data[0] \n : admissionResponse.data;\n studentId = admissionData?.admap_student_id || null;\n }\n \n if (!studentId) {\n return;\n }\n \n // Load payment history for this student\n const payload: any = {\n feepay_student_id: studentId,\n pageSize: 100 // Get all payments\n };\n\n this.feePaymentService.getFeePaymentList(payload).subscribe({\n next: (response: any) => {\n if (response?.success && response?.data) {\n const paymentHistoryData: PaymentHistoryData[] = response.data.map((payment: any) => ({\n _id: payment._id,\n receipt_number: payment.feepay_receipt_number || 'N/A',\n date: payment.feepay_payment_date ? new Date(payment.feepay_payment_date) : new Date(),\n amount: payment.feepay_total_amount || 0,\n mode: payment.feepay_payment_mode || 'N/A',\n reference: payment.feepay_transaction_reference || \n payment.feepay_cheque_number || \n payment.feepay_payment_reference || \n 'N/A'\n }));\n \n this.paymentHistory.set(paymentHistoryData);\n } else {\n this.paymentHistory.set([]);\n }\n },\n error: (err: any) => {\n console.error('Error loading payment history:', err);\n this.notificationService.error('Failed to load payment history');\n this.paymentHistory.set([]);\n }\n });\n },\n error: (err: any) => {\n console.error('Error loading admission data for payment history:', err);\n }\n });\n }\n\n makePayment(): void {\n this.router.navigate(['/control-panel/fees/payment']);\n }\n\n downloadReceipt(payment: PaymentHistoryData): void {\n if (!payment._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n // Get receipt PDF from API\n const receiptUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'fees',\n 'receipt',\n payment._id,\n 'pdf'\n ]);\n\n // Open in new tab for download\n window.open(receiptUrl, '_blank');\n this.notificationService.info(`Downloading receipt: ${payment.receipt_number}`);\n }\n\n isOverdue(fee: FeeDetailData): boolean {\n return new Date(fee.due_date) < new Date() && fee.outstanding > 0;\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n onGridEvent(event: GridEvent<Record<string, unknown>>): void {\n console.log('Grid event:', event);\n }\n}\n\n","<!-- My Fee Statement Container with Shared Wrapper -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'my_fee_statement' }\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"makePayment()\" leftIcon=\"payment\"\n [disabled]=\"feeSummary().outstanding === 0 || loading()\">\n Make Payment\n </button>\n </div>\n\n <div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Student Info Section -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4 tw-border-b tw-border-gray-200 tw-bg-gradient-to-r tw-from-blue-50 tw-to-purple-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-16 tw-h-16 tw-rounded-full tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-border-2 tw-border-white tw-shadow-sm\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-8 tw-h-8\">person</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <h6 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-1\">{{ studentInfo().name }}</h6>\n <div class=\"tw-flex tw-flex-wrap tw-gap-4 tw-text-sm tw-text-gray-600\">\n <span><strong>Student ID:</strong> {{ studentInfo().id }}</span>\n <span><strong>Class:</strong> {{ studentInfo().class }}</span>\n <span><strong>Section:</strong> {{ studentInfo().section }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4 tw-border-b tw-border-gray-200\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-4 tw-gap-4\">\n <!-- Total Fees Card -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-bg-blue-100 tw-rounded-full tw-p-3\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-6 tw-h-6\">account_balance_wallet</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Total Fees</div>\n <div class=\"tw-text-xl tw-font-bold tw-text-blue-600\">{{ formatCurrency(feeSummary().total_fees) }}</div>\n </div>\n </div>\n\n <!-- Paid Amount Card -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-bg-green-100 tw-rounded-full tw-p-3\">\n <cide-ele-icon class=\"tw-text-green-600 tw-w-6 tw-h-6\">check_circle</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Paid Amount</div>\n <div class=\"tw-text-xl tw-font-bold tw-text-green-600\">{{ formatCurrency(feeSummary().paid_amount) }}</div>\n </div>\n </div>\n\n <!-- Outstanding Card -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-bg-red-100 tw-rounded-full tw-p-3\">\n <cide-ele-icon class=\"tw-text-red-600 tw-w-6 tw-h-6\">warning</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Outstanding</div>\n <div class=\"tw-text-xl tw-font-bold tw-text-red-600\">{{ formatCurrency(feeSummary().outstanding) }}</div>\n </div>\n </div>\n\n <!-- Discount Card -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-bg-yellow-100 tw-rounded-full tw-p-3\">\n <cide-ele-icon class=\"tw-text-yellow-600 tw-w-6 tw-h-6\">local_offer</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Total Discount</div>\n <div class=\"tw-text-xl tw-font-bold tw-text-yellow-600\">{{ formatCurrency(feeSummary().discount) }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4\">\n <div class=\"tw-space-y-6\">\n \n <!-- Fee Details Section -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Fee Details</h6>\n </div>\n <div class=\"tw-p-4\">\n <cide-ele-data-grid \n [config]=\"feeDetailsGridConfig()\" \n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </div>\n\n <!-- Payment History Section -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Payment History</h6>\n </div>\n <div class=\"tw-p-4\">\n <cide-ele-data-grid \n [config]=\"paymentHistoryGridConfig()\" \n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #statusRendererTemplate let-row=\"row\">\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [class.tw-bg-green-100]=\"row.status === 'PAID'\"\n [class.tw-text-green-800]=\"row.status === 'PAID'\"\n [class.tw-bg-yellow-100]=\"row.status === 'PENDING' || row.status === 'PARTIALLY_PAID'\"\n [class.tw-text-yellow-800]=\"row.status === 'PENDING' || row.status === 'PARTIALLY_PAID'\"\n [class.tw-bg-red-100]=\"row.status === 'OVERDUE'\"\n [class.tw-text-red-800]=\"row.status === 'OVERDUE'\">\n {{ row.status === 'PARTIALLY_PAID' ? 'PARTIALLY PAID' : row.status }}\n </span>\n</ng-template>\n\n<ng-template #actionsRendererTemplate let-row=\"row\">\n <!-- Actions if needed -->\n</ng-template>\n\n<ng-template #paymentHistoryRendererTemplate let-row=\"row\">\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"downloadReceipt(row)\" leftIcon=\"download\">\n Download\n </button>\n</ng-template>\n\n","import { Component, inject, signal, OnInit, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent,\n NotificationService,\n ConfirmationService\n} from 'cloud-ide-element';\nimport { AppStateHelperService } from 'cloud-ide-layout';\nimport { CideFeeFeeAssignmentService } from '../../../fee-assignment-management/services/fee-assignment.service';\nimport { HttpClient } from '@angular/common/http';\nimport { cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\n\n// Razorpay types (declare if not available)\ndeclare var Razorpay: any;\n\n// Process environment variables (for build-time replacement)\ndeclare var process: {\n env: {\n [key: string]: string | undefined;\n };\n};\n\ninterface OutstandingFee {\n id: string;\n fee_head: string;\n due_date: Date;\n outstanding: number;\n late_fee: number;\n is_overdue: boolean;\n}\n\n@Component({\n selector: 'cide-my-online-payment',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent\n ],\n templateUrl: './my-online-payment.component.html',\n styleUrl: './my-online-payment.component.scss'\n})\nexport class MyOnlinePaymentComponent implements OnInit {\n private readonly fb = inject(FormBuilder);\n private readonly router = inject(Router);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly appStateHelper = inject(AppStateHelperService);\n private readonly http = inject(HttpClient);\n\n readonly loading = signal<boolean>(false);\n readonly submitting = signal<boolean>(false);\n readonly selectedFees = signal<Set<string>>(new Set());\n readonly outstandingFees = signal<OutstandingFee[]>([]);\n\n paymentForm: FormGroup = this.fb.group({\n payment_method: ['', [Validators.required]],\n upi_id: [''],\n card_number: [''],\n expiry: [''],\n cvv: [''],\n bank: ['']\n });\n\n readonly paymentMethodOptions = [\n { value: 'UPI', label: 'UPI' },\n { value: 'CARD', label: 'Debit/Credit Card' },\n { value: 'NET_BANKING', label: 'Net Banking' }\n ];\n\n readonly bankOptions = [\n { value: 'SBI', label: 'State Bank of India' },\n { value: 'HDFC', label: 'HDFC Bank' },\n { value: 'ICICI', label: 'ICICI Bank' },\n { value: 'AXIS', label: 'Axis Bank' },\n { value: 'PNB', label: 'Punjab National Bank' }\n ];\n\n readonly selectedCount = computed(() => this.selectedFees().size);\n\n readonly totalFeeAmount = computed(() => {\n return this.outstandingFees()\n .filter(fee => this.selectedFees().has(fee.id))\n .reduce((sum, fee) => sum + fee.outstanding, 0);\n });\n\n readonly totalLateFee = computed(() => {\n return this.outstandingFees()\n .filter(fee => this.selectedFees().has(fee.id))\n .reduce((sum, fee) => sum + fee.late_fee, 0);\n });\n\n readonly subtotal = computed(() => this.totalFeeAmount() + this.totalLateFee());\n\n readonly convenienceFee = computed(() => {\n return Math.round(this.subtotal() * 0.02 * 100) / 100; // 2% convenience fee\n });\n\n readonly totalPayable = computed(() => this.subtotal() + this.convenienceFee());\n\n readonly selectedPaymentMethod = computed(() => this.paymentForm.get('payment_method')?.value);\n private studentId: string | null = null;\n private entityId: string | null = null;\n private academicYearId: string | null = null;\n\n ngOnInit(): void {\n this.loadOutstandingFees();\n }\n\n private loadOutstandingFees(): void {\n this.loading.set(true);\n \n // Get current user ID from app state\n const currentUser = this.appStateHelper.getCurrentUser();\n if (!currentUser?._id) {\n this.notificationService.error('User not authenticated');\n this.loading.set(false);\n return;\n }\n\n // Get student ID from admission form using user_id\n const userId = currentUser._id;\n // Use list endpoint with filter for admap_user_id_auth\n const queryParams = new URLSearchParams({ admap_user_id_auth: userId }).toString();\n const admissionUrl = `${cidePath}${coreRoutesUrl}/admission/${queryParams}`;\n \n this.http.get<any>(admissionUrl).subscribe({\n next: (admissionResponse) => {\n let studentId: string | null = null;\n \n if (admissionResponse?.success && admissionResponse?.data) {\n // Get student ID from admission form (data might be array or single object)\n const admissionData = Array.isArray(admissionResponse.data) \n ? admissionResponse.data[0] \n : admissionResponse.data;\n studentId = admissionData?.admap_student_id || null;\n this.studentId = studentId;\n this.entityId = admissionData?.admap_entity_id_syen || null;\n this.academicYearId = admissionData?.admap_academic_year_id_acayr || null;\n }\n \n if (!studentId) {\n this.notificationService.warning('Student ID not found. Please ensure your admission is confirmed.');\n this.loading.set(false);\n return;\n }\n \n // Get outstanding fees from fee assignments\n const payload: any = {\n feeas_student_id: studentId,\n feeas_payment_status: 'PENDING' // Get only pending or partially paid assignments\n // Note: feeas_payment_status field name matches the schema\n };\n\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const today = new Date();\n const outstandingFees = response.data\n .filter((assignment: any) => {\n // Only include assignments with outstanding amount > 0\n const outstanding = assignment.feeas_amount_remaining || \n (assignment.feeas_final_amount || 0) - (assignment.feeas_amount_paid || 0);\n return outstanding > 0;\n })\n .map((assignment: any) => {\n const dueDate = assignment.feeas_due_date ? new Date(assignment.feeas_due_date) : null;\n const outstanding = assignment.feeas_amount_remaining || \n (assignment.feeas_final_amount || 0) - (assignment.feeas_amount_paid || 0);\n const lateFee = assignment.feeas_late_fee_applied || 0;\n \n return {\n id: assignment._id || '',\n fee_head: assignment.feeas_fee_name || 'Fee',\n due_date: dueDate || new Date(),\n outstanding: outstanding,\n late_fee: lateFee,\n is_overdue: dueDate ? dueDate < today : false\n };\n });\n\n this.outstandingFees.set(outstandingFees);\n } else {\n this.outstandingFees.set([]);\n }\n },\n error: (err) => {\n console.error('Error loading outstanding fees:', err);\n this.notificationService.error('Failed to load outstanding fees');\n this.outstandingFees.set([]);\n this.loading.set(false);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n },\n error: (err) => {\n console.error('Error loading admission data:', err);\n this.notificationService.error('Failed to load student information');\n this.loading.set(false);\n }\n });\n }\n\n isSelected(fee: OutstandingFee): boolean {\n return this.selectedFees().has(fee.id);\n }\n\n toggleFee(fee: OutstandingFee): void {\n const newSet = new Set(this.selectedFees());\n if (newSet.has(fee.id)) {\n newSet.delete(fee.id);\n } else {\n newSet.add(fee.id);\n }\n this.selectedFees.set(newSet);\n }\n\n selectAll(): void {\n const allIds = new Set(this.outstandingFees().map(f => f.id));\n this.selectedFees.set(allIds);\n }\n\n selectOverdue(): void {\n const overdueIds = new Set(\n this.outstandingFees()\n .filter(f => f.is_overdue)\n .map(f => f.id)\n );\n this.selectedFees.set(overdueIds);\n }\n\n clearSelection(): void {\n this.selectedFees.set(new Set());\n }\n\n selectPaymentMethod(method: string): void {\n this.paymentForm.patchValue({ payment_method: method });\n \n // Clear other method fields\n if (method !== 'UPI') this.paymentForm.patchValue({ upi_id: '' });\n if (method !== 'CARD') {\n this.paymentForm.patchValue({ card_number: '', expiry: '', cvv: '' });\n }\n if (method !== 'NET_BANKING') this.paymentForm.patchValue({ bank: '' });\n }\n\n canProceed(): boolean {\n return this.selectedCount() > 0 && \n this.paymentForm.get('payment_method')?.value &&\n this.paymentForm.valid;\n }\n\n proceedToPayment(): void {\n if (!this.canProceed()) {\n this.notificationService.warning('Please select fees and payment method');\n return;\n }\n\n this.confirmationService.ask({\n title: 'Confirm Payment',\n message: `Do you want to proceed with payment of ${this.formatCurrency(this.totalPayable())}?`,\n confirmText: 'Pay Now',\n cancelText: 'Cancel',\n type: 'info'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.submitPayment();\n }\n });\n }\n\n private submitPayment(): void {\n if (!this.studentId) {\n this.notificationService.error('Student ID not found');\n return;\n }\n\n this.submitting.set(true);\n\n // Get selected fee assignment IDs\n const selectedAssignmentIds = Array.from(this.selectedFees());\n const totalAmount = this.totalPayable();\n\n // Create payment order on backend\n const orderPayload = {\n amount: totalAmount,\n currency: 'INR',\n student_id: this.studentId,\n fee_assignment_ids: selectedAssignmentIds,\n entity_id: this.entityId,\n academic_year_id: this.academicYearId\n };\n\n const orderUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'payments',\n 'create-order'\n ]);\n\n this.http.post<any>(orderUrl, orderPayload).subscribe({\n next: (orderResponse) => {\n if (orderResponse?.success && orderResponse?.data) {\n const orderData = orderResponse.data;\n \n // Initialize Razorpay checkout\n this.initializeRazorpayCheckout({\n orderId: orderData.orderId,\n amount: orderData.amount * 100, // Convert to paise\n currency: orderData.currency || 'INR',\n name: 'Fee Payment',\n description: `Payment for ${selectedAssignmentIds.length} fee(s)`,\n prefill: {\n contact: this.appStateHelper.getCurrentUser()?.user_mobileno || '',\n email: this.appStateHelper.getCurrentUser()?.user_emailid || ''\n },\n notes: {\n student_id: this.studentId,\n fee_assignment_ids: selectedAssignmentIds.join(',')\n },\n handler: (response: any) => {\n this.handlePaymentSuccess(response, orderData.orderId, totalAmount, selectedAssignmentIds);\n },\n modal: {\n ondismiss: () => {\n this.submitting.set(false);\n this.notificationService.info('Payment cancelled');\n }\n }\n });\n } else {\n this.notificationService.error(orderResponse?.message || 'Failed to create payment order');\n this.submitting.set(false);\n }\n },\n error: (err) => {\n console.error('Error creating payment order:', err);\n this.notificationService.error('Failed to initialize payment. Please try again.');\n this.submitting.set(false);\n }\n });\n }\n\n private initializeRazorpayCheckout(options: any): void {\n // Check if Razorpay is available\n if (typeof Razorpay === 'undefined') {\n // Load Razorpay script dynamically\n const script = document.createElement('script');\n script.src = 'https://checkout.razorpay.com/v1/checkout.js';\n script.onload = () => {\n this.openRazorpayCheckout(options);\n };\n script.onerror = () => {\n this.notificationService.error('Failed to load payment gateway. Please refresh and try again.');\n this.submitting.set(false);\n };\n document.body.appendChild(script);\n } else {\n this.openRazorpayCheckout(options);\n }\n }\n\n private openRazorpayCheckout(options: any): void {\n try {\n const razorpayOptions = {\n key: process.env['RAZORPAY_KEY_ID'] || 'rzp_test_1DP5mmOlF5G5ag',\n amount: options.amount,\n currency: options.currency,\n name: options.name,\n description: options.description,\n order_id: options.orderId,\n prefill: options.prefill,\n notes: options.notes,\n handler: options.handler,\n modal: options.modal,\n theme: {\n color: '#2563eb'\n }\n };\n\n const razorpay = new Razorpay(razorpayOptions);\n razorpay.open();\n } catch (error) {\n console.error('Error opening Razorpay checkout:', error);\n this.notificationService.error('Failed to open payment gateway');\n this.submitting.set(false);\n }\n }\n\n private handlePaymentSuccess(\n paymentResponse: any,\n orderId: string,\n amount: number,\n assignmentIds: string[]\n ): void {\n // Verify payment on backend\n const verifyPayload = {\n payment_id: paymentResponse.razorpay_payment_id,\n order_id: orderId,\n signature: paymentResponse.razorpay_signature,\n amount: amount,\n student_id: this.studentId,\n fee_assignment_ids: assignmentIds,\n entity_id: this.entityId,\n academic_year_id: this.academicYearId\n };\n\n const verifyUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'payments',\n 'verify'\n ]);\n\n this.http.post<any>(verifyUrl, verifyPayload).subscribe({\n next: (verifyResponse) => {\n if (verifyResponse?.success && verifyResponse?.data?.verified) {\n this.notificationService.success('Payment processed successfully!');\n \n // Navigate to receipt or statement\n if (verifyResponse.data.receiptNumber) {\n // Navigate to receipt view\n this.router.navigate(['/control-panel/fees/payment/view', verifyResponse.data.paymentId]);\n } else {\n // Navigate to statement\n this.router.navigate(['/control-panel/fees/statement']);\n }\n } else {\n this.notificationService.error(verifyResponse?.message || 'Payment verification failed');\n this.submitting.set(false);\n }\n },\n error: (err) => {\n console.error('Error verifying payment:', err);\n this.notificationService.error('Payment verification failed. Please contact support.');\n this.submitting.set(false);\n }\n });\n }\n\n cancel(): void {\n this.router.navigate(['/control-panel/my-fees/statement']);\n }\n\n isOverdue(fee: OutstandingFee): boolean {\n return fee.is_overdue;\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n}\n\n","<!-- My Online Payment Container -->\r\n<div class=\"tw-w-full tw-h-full\">\r\n <div class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n \r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Online Fee Payment</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-items-center tw-gap-3\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"cancel()\" leftIcon=\"arrow_back\">\r\n Back to Statement\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\r\n \r\n <!-- Left Panel - Fee Selection -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden tw-flex tw-flex-col\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Select Fees to Pay</h6>\r\n </div>\r\n \r\n <!-- Quick Actions -->\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50 tw-flex tw-gap-2\">\r\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"selectAll()\">\r\n Select All\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"selectOverdue()\">\r\n Select Overdue\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"clearSelection()\">\r\n Clear\r\n </button>\r\n </div>\r\n\r\n <!-- Fee Items List -->\r\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-space-y-3\">\r\n @if (outstandingFees().length === 0) {\r\n <div class=\"tw-text-center tw-py-8 tw-text-gray-500\">\r\n <cide-ele-icon class=\"tw-w-12 tw-h-12 tw-mx-auto tw-mb-2 tw-text-gray-400\">check_circle</cide-ele-icon>\r\n <p class=\"tw-text-sm\">No outstanding fees</p>\r\n </div>\r\n } @else {\r\n @for (fee of outstandingFees(); track fee.id) {\r\n <div class=\"tw-p-3 tw-rounded-lg tw-border-2 tw-cursor-pointer tw-transition-colors\"\r\n [class.tw-border-blue-500]=\"isSelected(fee)\"\r\n [class.tw-bg-blue-50]=\"isSelected(fee)\"\r\n [class.tw-border-yellow-400]=\"!isSelected(fee) && isOverdue(fee)\"\r\n [class.tw-bg-yellow-50]=\"!isSelected(fee) && isOverdue(fee)\"\r\n [class.tw-border-gray-200]=\"!isSelected(fee) && !isOverdue(fee)\"\r\n (click)=\"toggleFee(fee)\">\r\n <div class=\"tw-flex tw-items-start tw-justify-between tw-gap-3\">\r\n <div class=\"tw-flex tw-items-start tw-gap-3 tw-flex-1\">\r\n <input \r\n type=\"checkbox\" \r\n [checked]=\"isSelected(fee)\"\r\n (change)=\"toggleFee(fee); $event.stopPropagation()\"\r\n class=\"tw-mt-1\">\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-mb-1\">\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ fee.fee_head }}</span>\r\n @if (isOverdue(fee)) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\r\n Overdue\r\n </span>\r\n }\r\n </div>\r\n <div class=\"tw-text-xs tw-text-gray-600\">\r\n Due Date: {{ fee.due_date | date:'dd/MM/yyyy' }}\r\n </div>\r\n @if (fee.late_fee > 0) {\r\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\r\n Late Fee: {{ formatCurrency(fee.late_fee) }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tw-text-right\">\r\n <div class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(fee.outstanding) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Right Panel - Payment Summary & Gateway -->\r\n <div class=\"tw-space-y-4\">\r\n \r\n <!-- Payment Summary Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Payment Summary</h6>\r\n </div>\r\n <div class=\"tw-p-4 tw-space-y-3\">\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-600\">Selected Items</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ selectedCount() }}</span>\r\n </div>\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-600\">Fee Amount</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(totalFeeAmount()) }}</span>\r\n </div>\r\n @if (totalLateFee() > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-text-red-600\">\r\n <span>Late Fee</span>\r\n <span class=\"tw-font-medium\">{{ formatCurrency(totalLateFee()) }}</span>\r\n </div>\r\n }\r\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-font-semibold tw-pt-2 tw-border-t tw-border-gray-200\">\r\n <span>Subtotal</span>\r\n <span>{{ formatCurrency(subtotal()) }}</span>\r\n </div>\r\n @if (convenienceFee() > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-600\">Convenience Fee (2%)</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(convenienceFee()) }}</span>\r\n </div>\r\n }\r\n <div class=\"tw-flex tw-justify-between tw-text-lg tw-font-bold tw-pt-3 tw-border-t-2 tw-border-gray-300 tw-text-green-600\">\r\n <span>Total Payable</span>\r\n <span>{{ formatCurrency(totalPayable()) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Payment Method Selection -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Select Payment Method</h6>\r\n </div>\r\n <div class=\"tw-p-4\">\r\n <form [formGroup]=\"paymentForm\" class=\"tw-space-y-4\">\r\n \r\n <!-- Payment Method Cards -->\r\n <div class=\"tw-grid tw-grid-cols-3 tw-gap-3 tw-mb-4\">\r\n @for (method of paymentMethodOptions; track method.value) {\r\n <button\r\n type=\"button\"\r\n class=\"tw-p-4 tw-rounded-lg tw-border-2 tw-text-center tw-transition-colors\"\r\n [class.tw-border-blue-500]=\"selectedPaymentMethod() === method.value\"\r\n [class.tw-bg-blue-50]=\"selectedPaymentMethod() === method.value\"\r\n [class.tw-border-gray-200]=\"selectedPaymentMethod() !== method.value\"\r\n (click)=\"selectPaymentMethod(method.value)\">\r\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-mx-auto tw-mb-2\"\r\n [class.tw-text-blue-600]=\"selectedPaymentMethod() === method.value\"\r\n [class.tw-text-gray-400]=\"selectedPaymentMethod() !== method.value\">\r\n @switch (method.value) {\r\n @case ('UPI') { account_balance_wallet }\r\n @case ('CARD') { credit_card }\r\n @case ('NET_BANKING') { account_balance }\r\n }\r\n </cide-ele-icon>\r\n <div class=\"tw-text-xs tw-font-medium\">{{ method.label }}</div>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- UPI Details -->\r\n @if (selectedPaymentMethod() === 'UPI') {\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200\">\r\n <cide-ele-input\r\n label=\"UPI ID *\"\r\n formControlName=\"upi_id\"\r\n placeholder=\"username@upi\"\r\n size=\"sm\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n </div>\r\n }\r\n\r\n <!-- Card Details -->\r\n @if (selectedPaymentMethod() === 'CARD') {\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200 tw-space-y-3\">\r\n <cide-ele-input\r\n label=\"Card Number *\"\r\n formControlName=\"card_number\"\r\n placeholder=\"1234 5678 9012 3456\"\r\n size=\"sm\"\r\n maxLength=\"19\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\r\n <cide-ele-input\r\n label=\"Expiry Date *\"\r\n formControlName=\"expiry\"\r\n placeholder=\"MM/YY\"\r\n size=\"sm\"\r\n maxLength=\"5\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n <cide-ele-input\r\n label=\"CVV *\"\r\n formControlName=\"cvv\"\r\n type=\"password\"\r\n placeholder=\"***\"\r\n size=\"sm\"\r\n maxLength=\"3\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Net Banking Details -->\r\n @if (selectedPaymentMethod() === 'NET_BANKING') {\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200\">\r\n <cide-ele-select\r\n label=\"Select Bank *\"\r\n formControlName=\"bank\"\r\n [options]=\"bankOptions\"\r\n size=\"sm\"\r\n placeholder=\"Select Bank\"\r\n [required]=\"true\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"tw-flex tw-gap-3 tw-pt-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"cancel()\" class=\"tw-flex-1\">\r\n Cancel\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"proceedToPayment()\"\r\n [disabled]=\"!canProceed() || submitting()\" [loading]=\"submitting()\" class=\"tw-flex-1\" leftIcon=\"payment\">\r\n Pay {{ formatCurrency(totalPayable()) }}\r\n </button>\r\n </div>\r\n\r\n <!-- Security Info -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-2 tw-pt-2 tw-text-xs tw-text-gray-500\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">lock</cide-ele-icon>\r\n <span>Secure payment powered by Razorpay</span>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Component, input, output, signal, computed, inject, OnInit, OnDestroy, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CideIconComponent,\n CideEleButtonComponent,\n NotificationService,\n CurrencyPipe\n} from 'cloud-ide-element';\nimport { CideFeeFeeStructureService } from '../../../collection/fee-structure-management/services/fee-structure.service';\nimport { CideFeeFeeAssignmentService } from '../../../collection/fee-assignment-management/services/fee-assignment.service';\nimport {\n type feeStructureByIdControllerResponse,\n type MFeeStructureGetByIdPayload,\n type FeeStructureByIdResponse,\n type FeeStructureResponse,\n type FeeStructureItem,\n type controllerResponse\n} from 'cloud-ide-lms-model';\nimport { RightsService } from 'cloud-ide-layout';\n\n// Type for fee data (can be from fee structure item or fee assignment)\nexport type FeeDetailsData = {\n _id?: string;\n fees_structure_name?: string;\n fees_structure_code?: string;\n fees_category_name?: string;\n fees_amount?: number;\n fees_total_amount?: number;\n discount?: number;\n finalAmount?: number;\n _feeItemData?: FeeStructureItem | any;\n _feeAssignmentData?: any;\n};\n\n@Component({\n selector: 'cide-fee-details-viewer',\n standalone: true,\n imports: [\n CommonModule,\n CideIconComponent,\n CurrencyPipe\n ],\n template: `\n <div class=\"tw-p-4 tw-overflow-y-auto tw-h-full\">\n @if (loading()) {\n <div class=\"tw-text-center tw-py-12\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400 tw-animate-spin tw-mx-auto tw-mb-2\">refresh</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-500\">Loading fee details...</span>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-400 tw-mx-auto tw-mb-2\">error</cide-ele-icon>\n <p class=\"tw-text-sm tw-text-red-600\">{{ error() }}</p>\n </div>\n } @else {\n @if (feeDetails(); as details) {\n <div class=\"tw-space-y-4 tw-text-sm\">\n <!-- Basic Information -->\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Basic Information</h4>\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Fee Name:</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.name }}</span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Fee Code:</span>\n <span class=\"tw-text-gray-900\">{{ details.itemCode }}</span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Category:</span>\n <span class=\"tw-text-gray-900\">{{ details.category }}</span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Structure:</span>\n <span class=\"tw-text-gray-900\">{{ details.structureName }}</span>\n </div>\n </div>\n @if (details.description) {\n <div class=\"tw-mt-3 tw-pt-3 tw-border-t tw-border-gray-200\">\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Description:</span>\n <p class=\"tw-text-gray-900 tw-text-sm\">{{ details.description }}</p>\n </div>\n }\n </div>\n\n <!-- Amount Breakdown -->\n <div class=\"tw-bg-blue-50 tw-rounded-lg tw-p-3 tw-border tw-border-blue-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Amount Breakdown</h4>\n <div class=\"tw-space-y-2\">\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-gray-600\">Original Amount:</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.amount | currency }}</span>\n </div>\n @if (details.discount > 0) {\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-gray-600\">Discount Applied:</span>\n <span class=\"tw-font-medium tw-text-blue-600\">-{{ details.discount | currency }}</span>\n </div>\n }\n @if (details.taxApplicable && details.taxPercentage > 0) {\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-gray-600\">Tax ({{ details.taxPercentage }}%):</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ (details.finalAmount * details.taxPercentage) / 100 | currency }}</span>\n </div>\n }\n <div class=\"tw-flex tw-justify-between tw-items-center tw-pt-2 tw-border-t tw-border-blue-200\">\n <span class=\"tw-font-semibold tw-text-gray-900\">Final Amount:</span>\n <span class=\"tw-font-bold tw-text-green-600 tw-text-base\">{{ details.finalAmount | currency }}</span>\n </div>\n </div>\n </div>\n\n <!-- Installment Breakdown -->\n @if (details.installmentAllowed && details.installments && details.installments.length > 1) {\n <div class=\"tw-bg-purple-50 tw-rounded-lg tw-p-3 tw-border tw-border-purple-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Installment Plan</h4>\n <div class=\"tw-mb-2 tw-text-xs tw-text-gray-600\">\n Total Amount: <span class=\"tw-font-semibold\">{{ details.finalAmount | currency }}</span> \n divided into <span class=\"tw-font-semibold\">{{ details.installmentCount }}</span> installments\n </div>\n <div class=\"tw-overflow-x-auto\">\n <table class=\"tw-min-w-full tw-divide-y tw-divide-purple-200\">\n <thead class=\"tw-bg-purple-100\">\n <tr>\n <th class=\"tw-px-3 tw-py-2 tw-text-left tw-text-xs tw-font-semibold tw-text-gray-700\">Installment #</th>\n <th class=\"tw-px-3 tw-py-2 tw-text-right tw-text-xs tw-font-semibold tw-text-gray-700\">Amount</th>\n <th class=\"tw-px-3 tw-py-2 tw-text-left tw-text-xs tw-font-semibold tw-text-gray-700\">Due Date</th>\n <th class=\"tw-px-3 tw-py-2 tw-text-center tw-text-xs tw-font-semibold tw-text-gray-700\">Days from Assignment</th>\n <th class=\"tw-px-3 tw-py-2 tw-text-center tw-text-xs tw-font-semibold tw-text-gray-700\">Days from Previous</th>\n </tr>\n </thead>\n <tbody class=\"tw-bg-white tw-divide-y tw-divide-purple-200\">\n @for (installment of details.installments; track installment.number) {\n <tr>\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-900 tw-font-medium\">#{{ installment.number }}</td>\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-900 tw-text-right tw-font-semibold\">{{ installment.amount | currency }}</td>\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600\">{{ installment.dueDate || 'TBD' }}</td>\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600 tw-text-center\">\n @if (installment.daysFromAssignment !== undefined) {\n <span class=\"tw-font-medium\">{{ installment.daysFromAssignment }} days</span>\n } @else {\n <span class=\"tw-text-gray-400\">-</span>\n }\n </td>\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600 tw-text-center\">\n @if (installment.daysFromPrevious !== undefined) {\n <span class=\"tw-font-medium\">{{ installment.daysFromPrevious }} days</span>\n } @else {\n <span class=\"tw-text-gray-400\">-</span>\n }\n </td>\n </tr>\n }\n </tbody>\n <tfoot class=\"tw-bg-purple-100\">\n <tr>\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-font-bold tw-text-gray-900\">Total:</td>\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-font-bold tw-text-green-600 tw-text-right\">{{ details.finalAmount | currency }}</td>\n <td colspan=\"3\"></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n } @else {\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-2\">Payment Information</h4>\n <div class=\"tw-space-y-1 tw-text-xs\">\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Payment Type:</span>\n <span class=\"tw-font-medium tw-text-gray-900\">One-time Payment</span>\n </div>\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Amount to Pay:</span>\n <span class=\"tw-font-bold tw-text-green-600\">{{ details.finalAmount | currency }}</span>\n </div>\n @if (details.installments && details.installments.length > 0 && details.installments[0].dueDate) {\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Due Date:</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.installments[0].dueDate }}</span>\n </div>\n }\n @if (details.dueDateOffset > 0) {\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Due Date Offset:</span>\n <span class=\"tw-text-gray-900\">{{ details.dueDateOffset }} days from assignment date</span>\n </div>\n }\n @if (details.installments && details.installments.length > 0 && details.installments[0].daysFromAssignment) {\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Days from Assignment:</span>\n <span class=\"tw-text-gray-900\">{{ details.installments[0].daysFromAssignment }} days</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Fee Properties -->\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Fee Properties</h4>\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Mandatory:</span>\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\" [class]=\"details.isMandatory ? 'tw-bg-red-100 tw-text-red-800' : 'tw-bg-gray-100 tw-text-gray-800'\">\n {{ details.isMandatory ? 'Yes - Required' : 'No - Optional' }}\n </span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Refundable:</span>\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\" [class]=\"details.isRefundable ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-gray-100 tw-text-gray-800'\">\n {{ details.isRefundable ? 'Yes' : 'No' }}\n </span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Amount Editable:</span>\n <span class=\"tw-text-gray-900 tw-text-sm\">{{ details.isAmountEditable ? 'Yes' : 'No' }}</span>\n </div>\n @if (details.isAmountEditable && (details.minAmount || details.maxAmount)) {\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Amount Range:</span>\n <span class=\"tw-text-gray-900 tw-text-sm\">\n {{ details.minAmount ? (details.minAmount | currency) : 'No min' }} - \n {{ details.maxAmount ? (details.maxAmount | currency) : 'No max' }}\n </span>\n </div>\n }\n @if (details.taxApplicable) {\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Tax Applicable:</span>\n <span class=\"tw-text-gray-900 tw-text-sm\">{{ details.taxPercentage }}%</span>\n </div>\n }\n @if (details.collectionStartOffset || details.collectionEndOffset) {\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Collection Window:</span>\n <span class=\"tw-text-gray-900 tw-text-sm\">\n Day {{ details.collectionStartOffset }} to Day {{ details.collectionEndOffset }}\n </span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n }\n `]\n})\nexport class FeeDetailsViewerComponent implements OnInit, OnDestroy {\n // Inputs\n isOpen = input<boolean>(false);\n studentId = input<string | null>(null);\n feeId = input<string | null>(null);\n feeData = input<FeeDetailsData | null>(null); // For new applicable fees\n assignmentDate = input<Date | null>(null); // Assignment date for due date calculation\n discount = input<number>(0); // Discount amount to apply\n\n // Outputs\n closed = output<void>();\n\n // Services\n private readonly destroyRef = inject(DestroyRef);\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly notificationService = inject(NotificationService);\n private readonly rightsService = inject(RightsService);\n\n // State\n loading = signal(false);\n error = signal<string | null>(null);\n feeDetails = signal<any>(null);\n\n ngOnInit(): void {\n // Initialize rights for fee details viewer (view-only)\n this.rightsService.initializeRights('fee_statement');\n // Watch for changes in inputs and reload when they change\n this.loadFeeDetails();\n }\n\n private loadFeeDetails(): void {\n // Check if feeData signal input is available and has a value\n try {\n const feeDataValue = this.feeData?.();\n console.log('๐ FeeDetailsViewer - loadFeeDetails - feeDataValue:', feeDataValue);\n console.log('๐ FeeDetailsViewer - loadFeeDetails - _feeItemData:', feeDataValue?._feeItemData);\n \n if (feeDataValue) {\n // Use provided fee data (for new applicable fees)\n this.processFeeData(feeDataValue);\n return;\n }\n } catch (error) {\n // Signal input might not be initialized yet, continue to other checks\n console.warn('FeeData signal not yet initialized:', error);\n }\n \n // Fallback to loading from student/fee IDs\n const studentIdValue = this.studentId?.();\n const feeIdValue = this.feeId?.();\n \n if (studentIdValue && feeIdValue) {\n // Load existing fee assignment\n this.loadFeeAssignment();\n return;\n }\n \n if (feeIdValue) {\n // Load fee structure item\n this.loadFeeStructureItem();\n return;\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n private loadFeeAssignment(): void {\n if (!this.feeId() || !this.studentId()) return;\n\n this.loading.set(true);\n this.error.set(null);\n\n this.feeAssignmentService.getFeeAssignmentById(this.feeId()!)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.loading.set(false);\n if (response?.success && response?.data) {\n const assignment = response.data;\n // Transform fee assignment to fee details format\n this.processFeeAssignmentData(assignment);\n } else {\n this.error.set(response?.message || 'Failed to load fee assignment');\n }\n },\n error: (err: { error?: controllerResponse }) => {\n this.loading.set(false);\n this.error.set(err?.error?.message || 'Failed to load fee assignment');\n }\n });\n }\n\n private loadFeeStructureItem(): void {\n if (!this.feeId()) return;\n\n this.loading.set(true);\n this.error.set(null);\n\n // Extract fee structure ID from fee ID (assuming feeId is the structure item ID)\n // We need to get the structure first, then find the item\n // For now, let's assume feeId is the structure ID and we need to find the item\n const payload: MFeeStructureGetByIdPayload = {\n fees_id: this.feeId()!\n };\n\n this.feeStructureService.getFeeStructureById(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: feeStructureByIdControllerResponse) => {\n this.loading.set(false);\n if (response?.success && response?.data) {\n const isFeeStructureByIdResponse = (data: FeeStructureByIdResponse | FeeStructureResponse): data is FeeStructureByIdResponse => {\n return data !== null && typeof data === 'object' && 'fee_structure' in data;\n };\n\n if (isFeeStructureByIdResponse(response.data)) {\n const items = response.data.fee_structure_items || [];\n // If multiple items, we'd need to know which one - for now use first item\n // In real scenario, feeId should be the item ID\n if (items.length > 0) {\n const item = items[0];\n const structure = response.data.fee_structure;\n if (structure) {\n this.processFeeItemData(item, structure);\n } else {\n this.error.set('Fee structure data is missing');\n }\n } else {\n this.error.set('No fee items found in structure');\n }\n }\n } else {\n this.error.set(response?.message || 'Failed to load fee structure');\n }\n },\n error: (err: { error?: controllerResponse }) => {\n this.loading.set(false);\n this.error.set(err?.error?.message || 'Failed to load fee structure');\n }\n });\n }\n\n private processFeeData(fee: FeeDetailsData): void {\n console.log('๐ FeeDetailsViewer - processFeeData - fee:', fee);\n console.log('๐ FeeDetailsViewer - processFeeData - _feeItemData:', fee._feeItemData);\n \n // Ensure we have proper item data structure\n let itemData = fee._feeItemData;\n \n console.log('๐ FeeDetailsViewer - processFeeData - itemData before check:', itemData);\n console.log('๐ FeeDetailsViewer - processFeeData - itemData type:', typeof itemData);\n console.log('๐ FeeDetailsViewer - processFeeData - itemData keys:', itemData ? Object.keys(itemData) : 'null/undefined');\n \n // If _feeItemData doesn't exist or is incomplete, construct it from fee data\n if (!itemData || typeof itemData !== 'object' || Object.keys(itemData).length === 0) {\n console.warn('โ ๏ธ FeeDetailsViewer - _feeItemData is missing or empty, creating fallback');\n // Try to extract from fee object itself if it has the structure\n if (fee && typeof fee === 'object' && 'feesi_item_name' in fee) {\n itemData = fee as any; // Use fee as itemData if it has feesi_ fields\n } else {\n // Last resort: create minimal structure from available fee data\n itemData = {\n feesi_item_name: fee.fees_structure_name || 'N/A',\n feesi_item_code: fee.fees_structure_code || 'N/A',\n feesi_amount: fee.fees_amount || fee.fees_total_amount || 0,\n feesi_description: 'No description available',\n feesi_category_id_sygms: fee.fees_category_name || null,\n feesi_is_mandatory: false,\n feesi_is_refundable: false,\n feesi_is_amount_editable: false,\n feesi_is_installment_allowed: false,\n feesi_installment_count: 1,\n feesi_due_date_offset_days: 0,\n feesi_collection_start_offset_days: 0,\n feesi_collection_end_offset_days: 30,\n feesi_tax_applicable: false,\n feesi_tax_percentage: 0\n };\n }\n } else {\n // Ensure all required fields exist, using fee data as fallback\n // Only use fallback if the field is missing or empty\n if (!itemData.feesi_item_name || itemData.feesi_item_name === 'N/A') {\n itemData.feesi_item_name = fee.fees_structure_name || itemData.feesi_item_name || 'N/A';\n }\n if (!itemData.feesi_item_code || itemData.feesi_item_code === 'N/A') {\n itemData.feesi_item_code = fee.fees_structure_code || itemData.feesi_item_code || 'N/A';\n }\n if (itemData.feesi_amount === undefined || itemData.feesi_amount === null || itemData.feesi_amount === 0) {\n itemData.feesi_amount = fee.fees_amount || fee.fees_total_amount || itemData.feesi_amount || 0;\n }\n if (!itemData.feesi_description || itemData.feesi_description === 'No description available') {\n itemData.feesi_description = itemData.feesi_description || 'No description available';\n }\n \n // Ensure category is properly set\n if (!itemData.feesi_category_id_sygms || (typeof itemData.feesi_category_id_sygms === 'string' && itemData.feesi_category_id_sygms === 'N/A')) {\n // Try to preserve if it's an object, otherwise use category name from fee\n if (fee.fees_category_name && fee.fees_category_name !== 'N/A') {\n // If we have category name but not the ID object, we'll use the name\n // The category extraction in calculateAndSetFeeDetails will handle this\n }\n }\n }\n \n const finalAmount = (fee.fees_total_amount || fee.fees_amount || 0) - (this.discount() || fee.discount || 0);\n \n // Ensure assignmentDate is a Date object\n let assignmentDate: Date;\n try {\n const dateValue = this.assignmentDate();\n if (dateValue instanceof Date) {\n assignmentDate = dateValue;\n } else if (dateValue && typeof dateValue === 'string') {\n assignmentDate = new Date(dateValue);\n } else {\n assignmentDate = new Date();\n }\n } catch {\n assignmentDate = new Date();\n }\n \n // Ensure fee data has all required fields\n const feeDataWithDefaults: FeeDetailsData = {\n ...fee,\n fees_structure_name: fee.fees_structure_name || 'N/A',\n fees_structure_code: fee.fees_structure_code || 'N/A',\n fees_category_name: fee.fees_category_name || 'N/A',\n fees_amount: fee.fees_amount || fee.fees_total_amount || 0,\n fees_total_amount: fee.fees_total_amount || fee.fees_amount || 0,\n discount: fee.discount || this.discount() || 0,\n finalAmount: finalAmount,\n _feeItemData: itemData\n };\n \n this.calculateAndSetFeeDetails(itemData, feeDataWithDefaults, finalAmount, assignmentDate);\n }\n\n private processFeeAssignmentData(assignment: any): void {\n // Transform assignment data to fee details format\n const finalAmount = assignment.feeas_final_amount || assignment.feeas_total_amount || 0;\n \n // Ensure assignmentDate is a Date object\n let assignmentDate: Date;\n try {\n if (assignment.feeas_assignment_date) {\n assignmentDate = assignment.feeas_assignment_date instanceof Date \n ? assignment.feeas_assignment_date \n : new Date(assignment.feeas_assignment_date);\n } else {\n // Try to get from input signal, otherwise use current date\n const dateValue = this.assignmentDate();\n if (dateValue instanceof Date) {\n assignmentDate = dateValue;\n } else if (dateValue && typeof dateValue === 'string') {\n assignmentDate = new Date(dateValue);\n } else {\n assignmentDate = new Date();\n }\n }\n } catch {\n assignmentDate = new Date();\n }\n \n // Create a mock item data structure from assignment\n const itemData = {\n feesi_item_name: assignment.feeas_fee_name,\n feesi_item_code: assignment.feeas_fee_name,\n feesi_description: assignment.feeas_fee_description,\n feesi_amount: assignment.feeas_original_amount || 0,\n feesi_is_mandatory: true, // Assumed\n feesi_is_refundable: false, // Assumed\n feesi_is_installment_allowed: (assignment.feeas_installment_count || 1) > 1,\n feesi_installment_count: assignment.feeas_installment_count || 1,\n feesi_due_date_offset_days: assignment.feeas_due_date ? \n Math.floor((new Date(assignment.feeas_due_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 0,\n feesi_collection_start_offset_days: assignment.feeas_collection_start_date ? \n Math.floor((new Date(assignment.feeas_collection_start_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 0,\n feesi_collection_end_offset_days: assignment.feeas_collection_end_date ? \n Math.floor((new Date(assignment.feeas_collection_end_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 30,\n feesi_tax_applicable: false,\n feesi_tax_percentage: 0\n };\n\n const feeData: FeeDetailsData = {\n _id: assignment._id,\n fees_structure_name: typeof assignment.feeas_fee_structure_id_feest === 'object' \n ? (assignment.feeas_fee_structure_id_feest as any)?.fees_structure_name \n : assignment.fee_structure_name || 'Custom Fee',\n fees_category_name: assignment.feeas_fee_category_sygms || 'N/A',\n fees_amount: assignment.feeas_original_amount || 0,\n fees_total_amount: assignment.feeas_original_amount || 0,\n discount: assignment.feeas_discount_amount || 0,\n finalAmount: finalAmount,\n _feeItemData: itemData,\n _feeAssignmentData: assignment\n };\n\n this.calculateAndSetFeeDetails(itemData, feeData, finalAmount, assignmentDate);\n }\n\n private processFeeItemData(item: FeeStructureItem, structure: FeeStructureResponse): void {\n const finalAmount = (item.feesi_amount || 0) - (this.discount() || 0);\n \n // Ensure assignmentDate is a Date object\n let assignmentDate: Date;\n try {\n const dateValue = this.assignmentDate();\n if (dateValue instanceof Date) {\n assignmentDate = dateValue;\n } else if (dateValue && typeof dateValue === 'string') {\n assignmentDate = new Date(dateValue);\n } else {\n assignmentDate = new Date();\n }\n } catch {\n assignmentDate = new Date();\n }\n\n const feeData: FeeDetailsData = {\n _id: item._id,\n fees_structure_name: structure.fees_structure_name,\n fees_structure_code: structure.fees_structure_code,\n fees_category_name: typeof item.feesi_category_id_sygms === 'object' \n ? (item.feesi_category_id_sygms as any)?.sygms_title || 'N/A'\n : 'N/A',\n fees_amount: item.feesi_amount || 0,\n fees_total_amount: item.feesi_amount || 0,\n discount: this.discount(),\n finalAmount: finalAmount,\n _feeItemData: item\n };\n\n this.calculateAndSetFeeDetails(item, feeData, finalAmount, assignmentDate);\n }\n\n /**\n * Helper method to ensure a value is a Date object\n */\n private ensureDate(value: Date | string | null | undefined): Date {\n if (value instanceof Date) {\n return value;\n }\n if (value && typeof value === 'string') {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n return new Date();\n }\n\n private calculateAndSetFeeDetails(\n itemData: any,\n feeData: FeeDetailsData,\n finalAmount: number,\n assignmentDate: Date | string | null | undefined\n ): void {\n // Ensure assignmentDate is always a Date object\n const assignmentDateObj = this.ensureDate(assignmentDate);\n \n const installmentCount = itemData.feesi_installment_count || 1;\n const installmentAllowed = itemData.feesi_is_installment_allowed || false;\n const daysBetweenInstallments = 30;\n\n // Calculate installment breakdown\n const installments: Array<{\n number: number;\n amount: number;\n dueDate?: string;\n daysFromAssignment?: number;\n daysFromPrevious?: number;\n }> = [];\n\n if (installmentAllowed && installmentCount > 1) {\n const installmentAmount = finalAmount / installmentCount;\n const baseAmount = Math.floor((installmentAmount * 100)) / 100;\n const remainder = Math.round((finalAmount - (baseAmount * installmentCount)) * 100) / 100;\n\n let previousDueDate: Date | null = null;\n\n for (let i = 1; i <= installmentCount; i++) {\n const amount = i === installmentCount ? baseAmount + remainder : baseAmount;\n\n let dueDate = '';\n let dueDateObj: Date | null = null;\n let daysFromAssignment = 0;\n let daysFromPrevious = 0;\n\n if (itemData.feesi_due_date_offset_days !== undefined && itemData.feesi_due_date_offset_days !== null) {\n if (i === 1) {\n dueDateObj = new Date(assignmentDateObj);\n dueDateObj.setDate(assignmentDateObj.getDate() + itemData.feesi_due_date_offset_days);\n daysFromAssignment = itemData.feesi_due_date_offset_days;\n } else {\n if (previousDueDate) {\n dueDateObj = new Date(previousDueDate);\n dueDateObj.setDate(previousDueDate.getDate() + daysBetweenInstallments);\n daysFromPrevious = daysBetweenInstallments;\n daysFromAssignment = Math.floor((dueDateObj.getTime() - assignmentDateObj.getTime()) / (1000 * 60 * 60 * 24));\n }\n }\n\n if (dueDateObj) {\n dueDate = dueDateObj.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n previousDueDate = dueDateObj;\n }\n }\n\n installments.push({\n number: i,\n amount: Math.round(amount * 100) / 100,\n dueDate,\n daysFromAssignment: daysFromAssignment > 0 ? daysFromAssignment : undefined,\n daysFromPrevious: daysFromPrevious > 0 ? daysFromPrevious : undefined\n });\n }\n } else {\n // Single payment\n let dueDate = '';\n let daysFromAssignment = 0;\n if (itemData.feesi_due_date_offset_days !== undefined && itemData.feesi_due_date_offset_days !== null) {\n const dueDateObj = new Date(assignmentDateObj);\n dueDateObj.setDate(assignmentDateObj.getDate() + itemData.feesi_due_date_offset_days);\n dueDate = dueDateObj.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n daysFromAssignment = itemData.feesi_due_date_offset_days;\n }\n\n installments.push({\n number: 1,\n amount: finalAmount,\n dueDate,\n daysFromAssignment: daysFromAssignment > 0 ? daysFromAssignment : undefined\n });\n }\n\n // Extract category name - check multiple sources\n let categoryName = 'N/A';\n if (feeData.fees_category_name && feeData.fees_category_name !== 'N/A' && feeData.fees_category_name.trim() !== '') {\n categoryName = feeData.fees_category_name;\n } else if (itemData.feesi_category_id_sygms) {\n if (typeof itemData.feesi_category_id_sygms === 'object' && itemData.feesi_category_id_sygms !== null) {\n categoryName = (itemData.feesi_category_id_sygms as any)?.sygms_title || \n (itemData.feesi_category_id_sygms as any)?.sygms_name || \n 'N/A';\n } else if (typeof itemData.feesi_category_id_sygms === 'string') {\n // If it's just an ID string, we can't resolve it here, use fallback\n categoryName = 'N/A';\n }\n }\n \n // Final fallback - try to get from item code or name\n if (categoryName === 'N/A' && itemData.feesi_item_code) {\n categoryName = itemData.feesi_item_code;\n }\n\n // Extract fee name - prioritize item name, then item code, then structure name\n const feeName = itemData.feesi_item_name || \n itemData.feesi_item_code || \n feeData.fees_structure_name || \n 'N/A';\n \n // Extract item code - prioritize item code, then structure code, then structure name\n const itemCode = itemData.feesi_item_code || \n feeData.fees_structure_code || \n feeData.fees_structure_name || \n 'N/A';\n \n // Extract structure name\n const structureName = feeData.fees_structure_name || \n feeData.fees_structure_code || \n 'N/A';\n \n // Extract description\n const description = itemData.feesi_description || \n feeData.fees_structure_name || \n 'No description available';\n\n this.feeDetails.set({\n name: feeName,\n category: categoryName,\n amount: itemData.feesi_amount || feeData.fees_amount || 0,\n discount: this.discount() || feeData.discount || 0,\n finalAmount: finalAmount > 0 ? finalAmount : (itemData.feesi_amount || feeData.fees_amount || 0),\n structureName: structureName,\n structureCode: feeData.fees_structure_code || 'N/A',\n itemCode: itemCode,\n description: description,\n isMandatory: itemData.feesi_is_mandatory || false,\n isRefundable: itemData.feesi_is_refundable || false,\n isAmountEditable: itemData.feesi_is_amount_editable || false,\n minAmount: itemData.feesi_min_amount,\n maxAmount: itemData.feesi_max_amount,\n installmentAllowed: installmentAllowed,\n installmentCount: installmentCount,\n installmentAmount: installmentAllowed && installmentCount > 1 ? finalAmount / installmentCount : finalAmount,\n installments: installments,\n dueDateOffset: itemData.feesi_due_date_offset_days || 0,\n collectionStartOffset: itemData.feesi_collection_start_offset_days || 0,\n collectionEndOffset: itemData.feesi_collection_end_offset_days || 0,\n taxApplicable: itemData.feesi_tax_applicable || false,\n taxPercentage: itemData.feesi_tax_percentage || 0,\n displayOrder: itemData.feesi_display_order || 0\n });\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n\n","/*\n * Public API Surface of cloud-ide-fees\n */\n\nexport * from './lib/cloud-ide-fees';\n\n// Routes\nexport * from './lib/cloud-ide-fees.routes';\n\n// Fee Structure Management\nexport * from './lib/collection/fee-structure-management/services/fee-structure.service';\nexport * from './lib/collection/fee-structure-management/components/fee-structure-list/fee-structure-list.component';\nexport * from './lib/collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component';\n\n// Fee Assignment Management\nexport * from './lib/collection/fee-assignment-management/services/fee-assignment.service';\nexport * from './lib/collection/fee-assignment-management/components/fee-assignment-list/fee-assignment-list.component';\nexport * from './lib/collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component';\n\n// Fee Payment Management\nexport * from './lib/collection/fee-payment-management/services/fee-payment.service';\nexport * from './lib/collection/fee-payment-management/components/fee-payment-list/fee-payment-list.component';\nexport * from './lib/collection/fee-payment-management/components/fee-payment-process/fee-payment-process.component';\nexport * from './lib/collection/fee-payment-management/components/fee-payment-view/fee-payment-view.component';\n\n// Discount Management\nexport * from './lib/collection/discount-management/components/discount-rules/discount-rules.component';\n\n// Receipt Template\nexport * from './lib/collection/receipt-template/services/receipt-template.service';\nexport * from './lib/collection/receipt-template/components/template-designer/template-designer.component';\n\n// Reports\nexport * from './lib/collection/reports/components/collection-report/collection-report.component';\n\n// Student Fees (Integrated into Dashboard)\nexport * from './lib/collection/student-fees/components/my-fee-statement/my-fee-statement.component';\nexport * from './lib/collection/student-fees/components/my-online-payment/my-online-payment.component';\n\n// Shared Components\nexport * from './lib/shared/components/fee-details-viewer/fee-details-viewer.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cloud-ide-fees.mjs","sources":["../../../projects/cloud-ide-fees/src/lib/cloud-ide-fees.ts","../../../projects/cloud-ide-fees/src/lib/cloud-ide-fees.routes.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/services/fee-structure.service.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/components/fee-structure-list/fee-structure-list.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/components/fee-structure-list/fee-structure-list.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/services/fee-assignment.service.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/components/fee-assignment-list/fee-assignment-list.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/components/fee-assignment-list/fee-assignment-list.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/services/fee-payment.service.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-list/fee-payment-list.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-list/fee-payment-list.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-process/fee-payment-process.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-process/fee-payment-process.component.html","../../../projects/cloud-ide-fees/src/lib/collection/fee-payment-management/components/fee-payment-view/fee-payment-view.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/discount-management/components/discount-rules/discount-rules.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/receipt-template/services/receipt-template.service.ts","../../../projects/cloud-ide-fees/src/lib/collection/receipt-template/components/template-designer/template-designer.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/receipt-template/components/template-designer/template-designer.component.html","../../../projects/cloud-ide-fees/src/lib/collection/reports/components/collection-report/collection-report.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/reports/components/collection-report/collection-report.component.html","../../../projects/cloud-ide-fees/src/lib/collection/student-fees/components/my-fee-statement/my-fee-statement.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/student-fees/components/my-fee-statement/my-fee-statement.component.html","../../../projects/cloud-ide-fees/src/lib/collection/student-fees/components/my-online-payment/my-online-payment.component.ts","../../../projects/cloud-ide-fees/src/lib/collection/student-fees/components/my-online-payment/my-online-payment.component.html","../../../projects/cloud-ide-fees/src/lib/shared/components/fee-details-viewer/fee-details-viewer.component.ts","../../../projects/cloud-ide-fees/src/public-api.ts","../../../projects/cloud-ide-fees/src/cloud-ide-fees.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-cloud-ide-fees',\r\n imports: [],\r\n template: `\r\n <p>\r\n cloud-ide-fees works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class CloudIdeFees {\r\n\r\n}\r\n","import { Route } from '@angular/router';\nimport { authGuard } from 'cloud-ide-auth';\n\nexport const feesRoutes: Route[] = [\n // Fee Structure Management Routes\n {\n path: 'structure',\n loadComponent: () => import('./collection/fee-structure-management/components/fee-structure-list/fee-structure-list.component').then(c => c.FeeStructureListComponent),\n title: 'Fee Structure Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_structure\" }\n },\n {\n path: 'structure/create',\n loadComponent: () => import('./collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component').then(c => c.FeeStructureCreateComponent),\n title: 'Create Fee Structure',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_structure\" }\n },\n {\n path: 'structure/edit/:query',\n loadComponent: () => import('./collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component').then(c => c.FeeStructureCreateComponent),\n title: 'Edit Fee Structure',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_structure\" }\n },\n {\n path: 'structure/view/:query',\n loadComponent: () => import('./collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component').then(c => c.FeeStructureCreateComponent),\n title: 'View Fee Structure',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_structure\" }\n },\n // Fee Assignment Routes\n {\n path: 'assignment',\n loadComponent: () => import('./collection/fee-assignment-management/components/fee-assignment-list/fee-assignment-list.component').then(c => c.FeeAssignmentListComponent),\n title: 'Fee Assignment Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_assignment\" }\n },\n {\n path: 'assignment/create',\n loadComponent: () => import('./collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component').then(c => c.FeeAssignmentCreateComponent),\n title: 'Assign Fee to Student',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_assignment\" }\n },\n {\n path: 'assignment/edit/:query',\n loadComponent: () => import('./collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component').then(c => c.FeeAssignmentCreateComponent),\n title: 'Edit Fee Assignment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_assignment\" }\n },\n {\n path: 'assignment/view/:query',\n loadComponent: () => import('./collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component').then(c => c.FeeAssignmentCreateComponent),\n title: 'View Fee Assignment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_assignment\" }\n },\n // Fee Payment Management Routes\n {\n path: 'payment',\n loadComponent: () => import('./collection/fee-payment-management/components/fee-payment-list/fee-payment-list.component').then(c => c.FeePaymentListComponent),\n title: 'Fee Payment Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_payment\" }\n },\n {\n path: 'payment/process',\n loadComponent: () => import('./collection/fee-payment-management/components/fee-payment-process/fee-payment-process.component').then(c => c.FeePaymentProcessComponent),\n title: 'Process Fee Payment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_payment\" }\n },\n {\n path: 'payment/view/:query',\n loadComponent: () => import('./collection/fee-payment-management/components/fee-payment-view/fee-payment-view.component').then(c => c.FeePaymentViewComponent),\n title: 'View Fee Payment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_payment\" }\n },\n // Discount & Scholarship Management\n {\n path: 'discounts',\n loadComponent: () => import('./collection/discount-management/components/discount-rules/discount-rules.component').then(c => c.DiscountRulesComponent),\n title: 'Discount & Scholarship Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_discounts\" }\n },\n // Receipt Template Designer\n {\n path: 'receipt-template',\n loadComponent: () => import('./collection/receipt-template/components/template-designer/template-designer.component').then(c => c.TemplateDesignerComponent),\n title: 'Receipt Template Designer',\n canActivate: [authGuard],\n data: { sypg_page_code: \"receipt_template\" }\n },\n // Reports\n {\n path: 'collection',\n loadComponent: () => import('./collection/reports/components/collection-report/collection-report.component').then(c => c.CollectionReportComponent),\n title: 'Fee Collection Report',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_reports\" }\n },\n // Student Fees (Integrated into Dashboard)\n {\n path: 'statement',\n loadComponent: () => import('./collection/student-fees/components/my-fee-statement/my-fee-statement.component').then(c => c.MyFeeStatementComponent),\n title: 'My Fee Statement',\n canActivate: [authGuard],\n data: { sypg_page_code: \"my_fee_statement\" }\n },\n {\n path: 'payment',\n loadComponent: () => import('./collection/student-fees/components/my-online-payment/my-online-payment.component').then(c => c.MyOnlinePaymentComponent),\n title: 'Online Fee Payment',\n canActivate: [authGuard],\n data: { sypg_page_code: \"my_online_payment\" }\n }\n];\n\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport {\n cidePath,\n feesRoutesUrl,\n hostManagerRoutesUrl,\n generateStringFromObject,\n type feeStructureControllerResponse,\n type MFeeStructure,\n type feeStructureByIdControllerResponse,\n type MFeeStructureGetByIdPayload,\n type feeStructureInsertUpdateControllerResponse,\n type FeeStructureSaveUpdatePayload,\n type feeStructureDeleteControllerResponse,\n type MFeeStructureDeletePayload,\n type feeStructureToggleStatusControllerResponse,\n type MFeeStructureToggleStatusPayload\n} from 'cloud-ide-lms-model';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideFeeFeeStructureService {\n private http = inject(HttpClient);\n\n /**\n * Get list of fee structures\n * @param payload - Query parameters for filtering/pagination\n * @returns Observable of fee structure list response\n */\n getFeeStructureList(payload: MFeeStructure): Observable<feeStructureControllerResponse> {\n console.log(\"payload\", payload)\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure,\n query\n ]);\n\n return this.http.get(url);\n }\n\n /**\n * Get fee structure by ID\n * @param payload - Fee structure ID payload\n * @returns Observable of fee structure data\n */\n getFeeStructureById(payload: MFeeStructureGetByIdPayload): Observable<feeStructureByIdControllerResponse> {\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure,\n 'byId',\n query\n ]);\n\n return this.http.get(url);\n }\n\n /**\n * Create or update fee structure\n * @param data - Fee structure data to save (with separate fee_structure and fee_structure_items keys)\n * @returns Observable of the save response\n */\n saveUpdateFeeStructure(data: FeeStructureSaveUpdatePayload): Observable<feeStructureInsertUpdateControllerResponse> {\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure\n ]);\n\n return this.http.post(url, data);\n }\n\n /**\n * Delete fee structure\n * @param payload - Fee structure ID payload\n * @returns Observable of the delete response\n */\n deleteFeeStructure(payload: MFeeStructureDeletePayload): Observable<feeStructureDeleteControllerResponse> {\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure,\n 'delete',\n query\n ]);\n\n return this.http.delete(url);\n }\n\n /**\n * Toggle fee structure status\n * @param payload - Fee structure ID payload\n * @returns Observable of the toggle response\n */\n toggleFeeStructureStatus(payload: MFeeStructureToggleStatusPayload): Observable<feeStructureToggleStatusControllerResponse> {\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.structure,\n 'toggle-status'\n ]);\n\n console.log('๐ Making PATCH request to toggle fee structure status:', { url, payload });\n return this.http.patch(url, payload);\n }\n}\n\n","import { \n Component, \n signal, \n computed, \n viewChild, \n TemplateRef, \n DestroyRef, \n inject, \n OnInit,\n type OnDestroy \n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { \n CideEleDataGridComponent, \n CideIconComponent, \n CideEleButtonComponent, \n type GridConfiguration, \n type GridEvent, \n CideEleDropdownComponent, \n type DropdownItem, \n type TemplateContext, \n type DropdownConfig, \n ConfirmationService,\n NotificationService \n} from 'cloud-ide-element';\nimport { \n type FeeStructure, \n type FeeStructureResponse,\n generateStringFromObject, \n MFeeStructure \n} from 'cloud-ide-lms-model';\nimport { AppStateHelperService, CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { CideFeeFeeStructureService } from '../../services/fee-structure.service';\n\n// Use the populated response interface from LMS model\ntype FeeStructureData = FeeStructureResponse;\n\ninterface ApiResponse<T> {\n success: boolean;\n code: number;\n data: T;\n total?: number;\n pageIndex?: number;\n pageSize?: number;\n message: string;\n}\n\n@Component({\n selector: 'cide-fee-structure-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideEleDropdownComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './fee-structure-list.component.html',\n styles: [`\n .fee-structure-listing-container {\n @apply tw-w-full tw-h-full;\n }\n \n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class FeeStructureListComponent implements OnInit, OnDestroy {\n // Modern Angular 20+ dependency injection using inject()\n private readonly destroyRef = inject(DestroyRef);\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\n private readonly router = inject(Router);\n private readonly appState = inject(AppStateHelperService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly notificationService = inject(NotificationService);\n private readonly rightsService = inject(RightsService);\n\n // Modern ViewChild signals for template renderers (Angular 20 approach)\n readonly feeStructureDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('feeStructureDetailsRendererTemplate');\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\n readonly actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\n readonly academicYearRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('academicYearRendererTemplate');\n readonly classProgramRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('classProgramRendererTemplate');\n readonly reservationCategoryRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('reservationCategoryRendererTemplate');\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n // Modern Angular 20+ state management using signals with proper typing\n readonly feeStructures = signal<FeeStructureData[]>([]);\n readonly loading = signal<boolean>(false);\n readonly error = signal<string | null>(null);\n\n // Server-side pagination state using signals\n readonly currentPage = signal<number>(1);\n readonly pageSize = signal<number>(10);\n readonly totalItems = signal<number>(0);\n readonly totalPages = signal<number>(0);\n\n // Server-side search state using signals\n readonly searchQuery = signal<string>('');\n\n // Server-side sorting state using signals\n readonly sortColumn = signal<string>('fees_structure_name');\n readonly sortDirection = signal<'asc' | 'desc'>('asc');\n\n // Server-side filtering state using signals\n readonly selectedStatusFilter = signal<string>('');\n readonly selectedAcademicYearFilter = signal<string>('');\n\n // Filter options using computed signal for better performance\n readonly statusFilterOptions = computed(() => [\n { value: '', label: 'All Status' },\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'draft', label: 'Draft' }\n ]);\n\n // Modern Angular 20+ grid configuration using computed signal with proper typing\n readonly gridConfig = computed<GridConfiguration<FeeStructureData>>(() => ({\n id: 'fee-structure-list-grid',\n columns: [\n {\n key: 'fees_structure_code',\n header: 'Code',\n type: 'text',\n width: '90px',\n truncate: true,\n align: 'left',\n sortable: true\n },\n {\n key: 'details',\n header: 'Fee Structure Details',\n type: 'custom',\n width: '400px',\n truncate: true,\n align: 'left',\n renderer: 'feeStructureDetailsRenderer',\n sortable: true\n },\n {\n key: 'fees_academic_year_id_acayr',\n header: 'Academic Year',\n type: 'custom',\n width: '180px',\n truncate: true,\n align: 'left',\n sortable: true,\n renderer: 'academicYearRenderer'\n },\n {\n key: 'fees_class_program_id_acacpm',\n header: 'Class/Program',\n type: 'custom',\n width: '200px',\n truncate: true,\n align: 'left',\n sortable: false,\n renderer: 'classProgramRenderer'\n },\n {\n key: 'fees_student_category_id_sygms',\n header: 'Reservation Category',\n type: 'custom',\n width: '180px',\n truncate: true,\n align: 'left',\n sortable: false,\n renderer: 'reservationCategoryRenderer'\n },\n {\n key: 'fees_is_active',\n header: 'Status',\n type: 'custom',\n width: '140px',\n truncate: false,\n align: 'center',\n renderer: 'statusRenderer'\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'custom',\n width: '80px',\n truncate: false,\n align: 'center',\n renderer: 'actionsDropdownRenderer'\n }\n ],\n data: this.feeStructures(),\n trackBy: '_id',\n pagination: {\n enabled: true,\n pageSize: this.pageSize(),\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search by code, name, or description...',\n searchableColumns: ['fees_structure_code', 'fees_structure_name', 'fees_structure_description'],\n debounceMs: 300,\n showClearButton: true\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: this.loading()\n },\n scroll: {\n enabled: true,\n maxHeight: '',\n minHeight: '',\n stickyHeader: true,\n virtualScroll: false,\n rowHeight: 50\n },\n export: {\n enabled: true,\n formats: ['csv', 'excel', 'pdf'],\n filename: 'fee-structures',\n includeHeaders: true\n },\n responsive: true,\n striped: false,\n bordered: true,\n compact: false,\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\n }));\n\n // Rights computed signals\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n\n ngOnInit(): void {\n // Initialize rights for fee structure management\n this.rightsService.initializeRights('fee_structure');\n console.log('๐ฐ Fee Structure List Component initialized');\n this.initializeBreadcrumbData();\n this.loadFeeStructures();\n }\n\n private initializeBreadcrumbData(): void {\n this.breadcrumbData.set([\n {\n id: 'list',\n label: 'List',\n icon: 'list',\n url: undefined\n }\n ]);\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n /**\n * Load fee structures from API\n */\n loadFeeStructures(): void {\n this.loading.set(true);\n this.error.set(null);\n\n const payload: MFeeStructure = new MFeeStructure({\n pageIndex: this.currentPage(),\n pageSize: this.pageSize(),\n query: this.searchQuery() || \"\",\n sort: {\n key: this.sortColumn(),\n order: this.sortDirection()\n }\n });\n\n // Add filters as additional properties (will be sent in query string)\n const filterParams: Partial<MFeeStructure> = {};\n if (this.selectedStatusFilter()) {\n filterParams.fees_is_active = this.selectedStatusFilter() === 'active';\n }\n if (this.selectedAcademicYearFilter()) {\n filterParams.fees_academic_year_id_acayr = this.selectedAcademicYearFilter();\n }\n \n // Merge filter params into payload\n Object.assign(payload, filterParams);\n\n this.feeStructureService.getFeeStructureList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n console.log('๐ฐ Fee structures loaded:', response.data);\n console.log('๐ Pagination info:', {\n total: response.total,\n pageIndex: response.pageIndex,\n pageSize: response.pageSize\n });\n \n this.feeStructures.set(response.data);\n this.totalItems.set(response.total || 0);\n this.totalPages.set(Math.ceil((response.total || 0) / this.pageSize()));\n \n if (response.data.length > 0) {\n this.notificationService.success(`Loaded ${response.data.length} fee structure(s) successfully.`);\n }\n } else {\n console.warn('โ ๏ธ No fee structure data received');\n this.feeStructures.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n this.notificationService.warning('No fee structures found.');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('โ Error loading fee structures:', error);\n this.error.set('Failed to load fee structures. Please try again.');\n this.feeStructures.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n this.notificationService.error('Failed to load fee structures. Please try again.');\n this.loading.set(false);\n }\n });\n }\n\n // Computed template renderers for grid\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\n feeStructureDetailsRenderer: this.feeStructureDetailsRendererTemplate(),\n statusRenderer: this.statusRendererTemplate(),\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate(),\n academicYearRenderer: this.academicYearRendererTemplate(),\n classProgramRenderer: this.classProgramRendererTemplate(),\n reservationCategoryRenderer: this.reservationCategoryRendererTemplate()\n }));\n\n /**\n * Handle grid events\n */\n onGridEvent(event: GridEvent<any>): void {\n switch (event.type) {\n case 'pageChange':\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\n this.currentPage.set(event.data['pageIndex'] as number);\n this.pageSize.set(event.data['pageSize'] as number);\n this.loadFeeStructures();\n }\n break;\n case 'search':\n this.searchQuery.set(event.data as string);\n this.currentPage.set(1);\n this.loadFeeStructures();\n break;\n case 'refresh':\n this.loadFeeStructures();\n break;\n case 'sort':\n if (event.data && typeof event.data === 'object' && 'column' in event.data && 'direction' in event.data) {\n this.sortColumn.set(event.data['column'] as string);\n this.sortDirection.set(event.data['direction'] as 'asc' | 'desc');\n this.currentPage.set(1);\n this.loadFeeStructures();\n }\n break;\n case 'export':\n if (event.data && typeof event.data === 'string') {\n this.handleExport(event.data);\n }\n break;\n default:\n console.log('๐ Unhandled grid event:', event.type);\n }\n }\n\n // Filter handlers\n onStatusFilterChange(): void {\n console.log('๐ Status filter changed:', this.selectedStatusFilter());\n this.currentPage.set(1);\n this.loadFeeStructures();\n }\n\n clearFilters(): void {\n console.log('๐งน Clearing filters');\n this.selectedStatusFilter.set('');\n this.selectedAcademicYearFilter.set('');\n this.searchQuery.set('');\n this.currentPage.set(1);\n this.loadFeeStructures();\n }\n\n // Fee Structure actions with proper typing\n createFeeStructure(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to create fee structures');\n return;\n }\n console.log('โ Navigating to create fee structure');\n this.notificationService.info('Opening form to create a new fee structure.');\n this.router.navigate(['/control-panel/structure/create']);\n }\n\n viewFeeStructure(feeStructure: FeeStructureData): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view fee structures');\n return;\n }\n console.log('๐๏ธ Viewing fee structure:', feeStructure);\n this.notificationService.info(`Opening fee structure \"${feeStructure.fees_structure_name}\" for viewing.`);\n const queryParams = generateStringFromObject({ fees_id: feeStructure._id });\n this.router.navigate(['/control-panel/structure/view', queryParams]);\n }\n\n editFeeStructure(feeStructure: FeeStructureData): void {\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to edit fee structures');\n return;\n }\n console.log('โ๏ธ Editing fee structure:', feeStructure);\n this.notificationService.info(`Opening fee structure \"${feeStructure.fees_structure_name}\" for editing.`);\n const queryParams = generateStringFromObject({ fees_id: feeStructure._id });\n this.router.navigate(['/control-panel/structure/edit', queryParams]);\n }\n\n\n deleteFeeStructure(feeStructure: FeeStructureData): void {\n if (!this.rightsService.hasRight('DELETE')) {\n this.notificationService.error('You do not have permission to delete fee structures');\n return;\n }\n console.log('๐๏ธ Deleting fee structure:', feeStructure);\n \n this.confirmationService.ask({\n title: 'Delete Fee Structure',\n message: `Are you sure you want to delete the fee structure \"${feeStructure.fees_structure_name}\"? This action cannot be undone.`,\n confirmText: 'Delete',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.loading.set(true);\n \n this.feeStructureService.deleteFeeStructure({ fees_id: feeStructure._id }).subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success(`Fee structure \"${feeStructure.fees_structure_name}\" deleted successfully.`);\n this.loadFeeStructures();\n } else {\n this.notificationService.error(response?.message || 'Failed to delete fee structure');\n this.loading.set(false);\n }\n },\n error: (error) => {\n console.error('โ Error deleting fee structure:', error);\n this.notificationService.error('Failed to delete fee structure. Please try again.');\n this.loading.set(false);\n }\n });\n }\n });\n }\n\n /**\n * Get dropdown configuration\n */\n getDropdownConfig(): DropdownConfig {\n return {\n triggerIcon: 'more_vert',\n triggerSize: 'sm'\n };\n }\n\n /**\n * Get action dropdown items\n */\n getActionDropdownItems(feeStructure: FeeStructureData): DropdownItem[] {\n const items: DropdownItem[] = [];\n \n if (this.canView()) {\n items.push({\n id: 'view',\n label: 'View Details',\n icon: 'visibility',\n iconColor: 'tw-text-gray-400',\n textColor: 'tw-text-gray-700',\n hoverBgColor: 'hover:tw-bg-gray-100'\n });\n }\n \n if (this.canEdit()) {\n items.push({\n id: 'edit',\n label: 'Edit',\n icon: 'edit',\n iconColor: 'tw-text-blue-400',\n textColor: 'tw-text-blue-600',\n hoverBgColor: 'hover:tw-bg-blue-50'\n });\n }\n \n if (this.canDelete()) {\n items.push({\n id: 'delete',\n label: 'Delete',\n icon: 'delete',\n iconColor: 'tw-text-red-400',\n textColor: 'tw-text-red-600',\n hoverBgColor: 'hover:tw-bg-red-50'\n });\n }\n \n return items;\n }\n\n /**\n * Handle dropdown item click\n */\n onDropdownItemClick(item: DropdownItem, feeStructure: FeeStructureData): void {\n console.log('๐ฑ๏ธ Dropdown item clicked:', item.id, 'for fee structure:', feeStructure.fees_structure_name);\n \n if (item.disabled) {\n console.log('โ ๏ธ Item is disabled, ignoring click');\n return;\n }\n \n switch (item.id) {\n case 'view':\n this.viewFeeStructure(feeStructure);\n break;\n case 'edit':\n this.editFeeStructure(feeStructure);\n break;\n case 'delete':\n this.deleteFeeStructure(feeStructure);\n break;\n default:\n console.log('โ Unknown dropdown item clicked:', item.id);\n }\n }\n\n // Export handler\n private handleExport(format: string): void {\n console.log(`๐ค Exporting fee structures as ${format}`);\n \n const data = this.feeStructures().map(item => ({\n 'Code': item.fees_structure_code || '-',\n 'Name': item.fees_structure_name || '-',\n 'Description': item.fees_structure_description || '-',\n 'Academic Year': this.getAcademicYearName(item),\n 'Class/Program': this.getClassProgramName(item),\n 'Reservation Category': this.getReservationCategoryName(item),\n 'Status': item.fees_is_active ? 'Active' : 'Inactive'\n }));\n\n const timestamp = new Date().toISOString().split('T')[0];\n const filename = `fee-structures-${timestamp}`;\n\n switch (format.toLowerCase()) {\n case 'csv':\n this.exportToCSV(data, filename);\n break;\n case 'excel':\n this.exportToExcel(data, filename);\n break;\n case 'pdf':\n this.exportToPDF(data, filename);\n break;\n default:\n console.warn(`Unsupported export format: ${format}`);\n }\n }\n\n private exportToCSV(data: any[], filename: string): void {\n const headers = Object.keys(data[0] || {});\n const csvContent = [\n headers.join(','),\n ...data.map(row => headers.map(header => `\"${row[header] || ''}\"`).join(','))\n ].join('\\n');\n\n this.downloadFile(csvContent, `${filename}.csv`, 'text/csv');\n }\n\n private exportToExcel(data: any[], filename: string): void {\n this.exportToCSV(data, filename);\n }\n\n private exportToPDF(data: any[], filename: string): void {\n this.exportToCSV(data, filename);\n }\n\n private downloadFile(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n }\n\n // Utility methods\n formatDate(date: string | Date | null | undefined): string {\n if (!date) return '-';\n return new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n }\n\n getStatusBadgeClass(feeStructure: FeeStructureData): string {\n if (feeStructure.fees_is_active) {\n return 'tw-bg-green-100 tw-text-green-800';\n }\n return 'tw-bg-gray-100 tw-text-gray-800';\n }\n\n getStatusText(feeStructure: FeeStructureData): string {\n if (feeStructure.fees_is_active) return 'Active';\n return 'Inactive';\n }\n\n formatCurrency(amount: number | undefined): string {\n if (!amount) return 'โน0.00';\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n /**\n * Helper method to get display value from populated object or string\n */\n getDisplayValue(value: any, field: string): string {\n if (!value) return '-';\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value._id) {\n // Populated object\n return value[field] || value.name || value.title || '-';\n }\n return '-';\n }\n\n /**\n * Get academic year display name\n */\n getAcademicYearName(feeStructure: FeeStructureData): string {\n const academicYear = feeStructure.fees_academic_year_id_acayr;\n if (!academicYear) return '-';\n if (typeof academicYear === 'string') return academicYear;\n return academicYear.acayr_name || academicYear.acayr_code || '-';\n }\n\n /**\n * Get class/program display name\n */\n getClassProgramName(feeStructure: FeeStructureData): string {\n const classProgram = feeStructure.fees_class_program_id_acacpm;\n if (!classProgram) return 'All';\n if (typeof classProgram === 'string') return classProgram;\n return classProgram.acacpm_alise_title || '-';\n }\n\n /**\n * Get reservation category display name\n */\n getReservationCategoryName(feeStructure: FeeStructureData): string {\n const category = feeStructure.fees_student_category_id_sygms;\n if (!category) return 'All';\n if (typeof category === 'string') return category;\n return category.sygms_title || category.sygms_code || '-';\n }\n}\n","<!-- Fee Structure Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_structure' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"createFeeStructure()\">\n Create Fee Structure\n </button>\n </div>\n\n <div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Main Content Area -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-h-full tw-relative\">\n\n <!-- Data Grid Component -->\n <div class=\"tw-h-full tw-overflow-auto\">\n <cide-ele-data-grid [config]=\"gridConfig()\" [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n\n </div>\n </div>\n\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #feeStructureDetailsRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-w-full\">\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.fees_structure_name || 'N/A' }}</div>\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate\">{{ row.fees_structure_description || 'No description' }}</div>\n </div>\n</ng-template>\n\n\n<ng-template #statusRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-gap-1 tw-items-center\">\n <!-- Active/Inactive Status Badge -->\n <span class=\"tw-inline-flex tw-items-center tw-justify-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-text-center\"\n [ngClass]=\"getStatusBadgeClass(row)\">\n <cide-ele-icon size=\"2xs\" class=\"tw-mr-1\">\n {{ row.fees_is_active ? 'check_circle' : 'cancel' }}\n </cide-ele-icon>\n {{ getStatusText(row) }}\n </span>\n \n <!-- Template Badge -->\n @if (row.is_template) {\n <span\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-px-2 tw-py-1 tw-rounded-full tw-text-xs tw-font-medium tw-bg-purple-100 tw-text-purple-800 tw-text-center\">\n <cide-ele-icon size=\"2xs\" class=\"tw-mr-1\">description</cide-ele-icon>\n Template\n </span>\n }\n </div>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\n <cide-ele-dropdown \n [items]=\"getActionDropdownItems(row)\"\n [config]=\"getDropdownConfig()\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template>\n\n<ng-template #academicYearRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-900\">{{ getAcademicYearName(row) }}</span>\n </div>\n</ng-template>\n\n<ng-template #classProgramRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-text-gray-700\">{{ getClassProgramName(row) }}</span>\n </div>\n</ng-template>\n\n<ng-template #reservationCategoryRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-text-gray-700\">{{ getReservationCategoryName(row) }}</span>\n </div>\n</ng-template>\n\n","import { \n Component, \n inject, \n signal, \n OnInit, \n DestroyRef, \n OnDestroy,\n computed\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { \n FormBuilder, \n FormGroup, \n ReactiveFormsModule, \n FormArray\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { \n CideTextareaComponent, \n CideEleButtonComponent, \n CideEleTabComponent, \n type TabItem, \n CideIconComponent,\n NotificationService,\n ConfirmationService,\n CideFormFieldErrorComponent\n} from 'cloud-ide-element';\nimport { CideFeeFeeStructureService } from '../../services/fee-structure.service';\nimport { ENTITY_SERVICE_TOKEN, type IEntityService, ACADEMIC_YEAR_SERVICE_TOKEN, type IAcademicYearService, CLASS_PROGRAM_MASTER_SERVICE_TOKEN, type IClassProgramMasterService, PROGRAM_TERM_SECTION_SERVICE_TOKEN, type IProgramTermSectionService, GENERAL_MASTER_SERVICE_TOKEN, type IGeneralMasterService } from 'cloud-ide-shared';\nimport { AppStateService, ComponentContextService } from 'cloud-ide-layout';\nimport {\n FeeStructureSaveUpdatePayload,\n type FeeStructureItem,\n type FeeStructureByIdResponse,\n type FeeStructureResponse,\n type feeStructureByIdControllerResponse,\n generateObjectFromString,\n generateStringFromObject,\n MAcademicYear,\n MClassProgramMaster,\n classProgramMasterControllerResponse,\n AcaClassProgramMasterResponse,\n academicsRoutesUrl,\n type classPrgBranchControllerResponse,\n AcaClassPrgBranchListPayload,\n type AcaClassPrgBranchResponse,\n type classProgramTermControllerResponse,\n type MClassProgramTerm,\n type AcaClassProgramTermReponse,\n MPrgTrmSection,\n type prgTrmSectionControllerResponse,\n type AcaPrgTrmSectionResponse,\n selectSearchType,\n type IGeneralMasterListRequest,\n type generalMasterListControllerResponse,\n type ICoreSygms\n} from 'cloud-ide-lms-model';\nimport { HttpClient } from '@angular/common/http';\nimport { cidePath, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\nimport { CideSelectComponent } from 'cloud-ide-element';\nimport { CideInputComponent } from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { ProgramSectionSelectorWrapperComponent } from 'cloud-ide-shared';\n\n// Types\ninterface Entity {\n _id?: string;\n syen_name?: string;\n syen_code?: string;\n}\n\ninterface AcademicYear {\n _id?: string;\n acayr_name?: string;\n acayr_code?: string;\n acayr_iscurrent?: boolean;\n}\n\ninterface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'lib-cide-fee-structure-create',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideEleTabComponent,\n CideIconComponent,\n CideSelectComponent,\n CideLytSharedWrapperComponent,\n ProgramSectionSelectorWrapperComponent,\n CideFormFieldErrorComponent\n ],\n templateUrl: './fee-structure-create.component.html'\n})\nexport class FeeStructureCreateComponent implements OnInit, OnDestroy {\n // Modern Angular 20+ dependency injection\n private readonly destroyRef = inject(DestroyRef);\n private readonly fb = inject(FormBuilder);\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\n private readonly entityService = inject<IEntityService>(ENTITY_SERVICE_TOKEN);\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\n private readonly classProgramMasterService = inject<IClassProgramMasterService>(CLASS_PROGRAM_MASTER_SERVICE_TOKEN);\n private readonly programTermSectionService = inject<IProgramTermSectionService>(PROGRAM_TERM_SECTION_SERVICE_TOKEN);\n private readonly generalMasterService = inject<IGeneralMasterService>(GENERAL_MASTER_SERVICE_TOKEN);\n private readonly http = inject(HttpClient);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly appStateService = inject(AppStateService);\n private readonly componentContextService = inject(ComponentContextService);\n\n // Form and state management\n feeStructureForm!: FormGroup;\n readonly activeTab = signal<string>('basic');\n readonly loading = signal<boolean>(false);\n readonly submitting = signal<boolean>(false);\n\n // Fee structure information from route\n readonly feeStructureId = signal<string>('');\n readonly isEditMode = signal<boolean>(false);\n readonly isViewMode = signal<boolean>(false);\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n // Dropdown options\n readonly entityOptions = signal<Entity[]>([]);\n readonly academicYearOptions = signal<AcademicYear[]>([]);\n readonly entityLoading = signal<boolean>(false);\n readonly academicYearLoading = signal<boolean>(false);\n\n // Class Program Master options\n readonly classProgramMasters = signal<AcaClassProgramMasterResponse[]>([]);\n readonly classProgramMastersLoading = signal<boolean>(false);\n readonly classProgramMastersOptions = computed<SelectOption[]>(() => {\n return this.classProgramMasters().map(cp => ({\n value: cp._id || '',\n label: cp.acacpm_alise_title || ''\n }));\n });\n\n // Selected class program configuration\n readonly selectedClassProgram = signal<AcaClassProgramMasterResponse | null>(null);\n\n // Branches for selected program\n readonly classProgramBranches = signal<SelectOption[]>([]);\n readonly classProgramBranchesLoading = signal<boolean>(false);\n\n // Terms for selected program/branch\n readonly classProgramTerms = signal<SelectOption[]>([]);\n readonly classProgramTermsLoading = signal<boolean>(false);\n\n // Sections for selected term\n readonly programTermSections = signal<SelectOption[]>([]);\n readonly programTermSectionsLoading = signal<boolean>(false);\n\n // Reservation categories from general master\n readonly studentCategories = signal<SelectOption[]>([]);\n readonly studentCategoriesLoading = signal<boolean>(false);\n\n // Fee categories from general master\n readonly feeCategories = signal<ICoreSygms[]>([]);\n readonly feeCategoriesLoading = signal<boolean>(false);\n readonly feeCategoriesOptions = computed<SelectOption[]>(() => {\n return this.feeCategories().map(cat => ({\n value: cat._id || '',\n label: cat.sygms_title || cat.sygms_code || ''\n }));\n });\n\n // Note: Branch and Term dropdown visibility is now handled by ProgramSectionSelectorComponent\n\n // All dropdowns are always shown now - no need for computed signals\n\n\n // Distribution type options for installments\n readonly distributionTypeOptions = [\n { value: 'PERCENTAGE', label: 'Percentage' },\n { value: 'FIXED_AMOUNT', label: 'Fixed Amount' }\n ];\n\n\n // Tabs configuration\n feeStructureTabs(): TabItem[] {\n return [\n {\n id: 'basic',\n label: 'Basic Information',\n icon: 'info'\n },\n {\n id: 'items',\n label: 'Fee Items',\n icon: 'list'\n }\n ];\n }\n\n // Computed for fee items form array\n get feeItemsArray(): FormArray {\n return this.feeStructureForm.get('fee_items') as FormArray;\n }\n\n // Signal to trigger total amount recalculation\n private readonly totalAmountTrigger = signal(0);\n\n // Computed for total amount - reactive to form changes\n readonly totalAmount = computed(() => {\n // Read the trigger to make this reactive\n this.totalAmountTrigger();\n \n const items = this.feeItemsArray.controls;\n let total = 0;\n items.forEach(control => {\n const amount = control.get('feesi_amount')?.value || 0;\n total += parseFloat(String(amount)) || 0;\n });\n return total;\n });\n\n // Signal to trigger installment percentage validation\n private readonly installmentPercentageTrigger = signal(0);\n\n // Computed to check if all installment percentages total 100% for all items\n readonly isInstallmentPercentagesValid = computed(() => {\n // Read the trigger to make this reactive\n this.installmentPercentageTrigger();\n \n const items = this.feeItemsArray.controls;\n for (const itemControl of items) {\n const isInstallmentAllowed = itemControl.get('feesi_is_installment_allowed')?.value;\n if (!isInstallmentAllowed) continue; // Skip non-installment items\n \n const installmentsArray = itemControl.get('installments') as FormArray;\n if (installmentsArray.length <= 1) continue; // Skip if only one installment\n \n let totalPercentage = 0;\n for (const installmentControl of installmentsArray.controls) {\n const distType = installmentControl.get('distribution_type')?.value;\n if (distType === 'PERCENTAGE') {\n const percentage = parseFloat(String(installmentControl.get('percentage')?.value || 0));\n totalPercentage += percentage;\n }\n }\n \n // Check if total is exactly 100%\n if (Math.abs(totalPercentage - 100) > 0.01) {\n return false;\n }\n }\n return true;\n });\n\n constructor() {\n this.initializeForm();\n }\n\n private initializeForm(): void {\n this.feeStructureForm = this.fb.group({\n // Basic Information\n fees_structure_code: [''],\n fees_structure_name: [''],\n fees_structure_description: [''],\n fees_class_program_id_acacpm: [''],\n fees_class_program_branch_id_acabrn: [''],\n fees_class_program_term_id_acapt: [''],\n fees_program_term_section_id_acapts: [''],\n fees_student_category_id_sygms: [''],\n fees_academic_year_id_acayr: [''],\n fees_entity_id_syen: [''], // Will be set from active entity\n fees_is_active: [true],\n \n // Fee Items\n fee_items: this.fb.array([this.createFeeItemFormGroup()])\n });\n\n // Set active entity automatically\n const activeEntity = this.appStateService.activeEntity();\n if (activeEntity?._id) {\n this.feeStructureForm.patchValue({\n fees_entity_id_syen: activeEntity._id\n });\n }\n\n // Note: Program/Section selector component handles all class program, branch, term, and section loading automatically\n // No need for manual listeners - the component reacts to form changes internally\n \n // Watch for term value changes to ensure it's captured (especially for one-to-one mappings)\n this.feeStructureForm.get('fees_class_program_term_id_acapt')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(termId => {\n if (termId) {\n console.log('โ
Term value set in form:', termId);\n }\n });\n\n // Watch for changes in fee items array to update total amount\n this.feeItemsArray.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.totalAmountTrigger.set(this.totalAmountTrigger() + 1);\n });\n\n // Watch for amount changes in each existing fee item\n this.setupAmountWatchers();\n }\n\n /**\n * Setup amount watchers for all fee items\n */\n private setupAmountWatchers(): void {\n this.feeItemsArray.controls.forEach((control) => {\n control.get('feesi_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.totalAmountTrigger.set(this.totalAmountTrigger() + 1);\n });\n });\n }\n\n private createFeeItemFormGroup(): FormGroup {\n const itemForm = this.fb.group({\n feesi_category_id_sygms: [''],\n feesi_item_code: [''],\n feesi_item_name: [''],\n feesi_description: [''],\n feesi_amount: [0],\n feesi_is_amount_editable: [false],\n feesi_min_amount: [null],\n feesi_max_amount: [null],\n feesi_is_mandatory: [true],\n feesi_is_refundable: [false],\n feesi_is_installment_allowed: [false],\n feesi_installment_count: [1],\n feesi_tax_applicable: [false],\n feesi_tax_percentage: [0],\n feesi_display_order: [0],\n // Installment details - always stored in installment table (1 record if no installments)\n installments: this.fb.array([this.createInstallmentFormGroup()])\n });\n\n // Watch for installment_allowed and installment_count changes\n itemForm.get('feesi_is_installment_allowed')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(isAllowed => {\n this.syncInstallmentsForItem(itemForm, Boolean(isAllowed));\n });\n\n itemForm.get('feesi_installment_count')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(count => {\n const isAllowed = itemForm.get('feesi_is_installment_allowed')?.value;\n const installmentCount = count ?? undefined;\n this.syncInstallmentsForItem(itemForm, Boolean(isAllowed), installmentCount);\n });\n\n // Watch for category changes to auto-populate code and name\n itemForm.get('feesi_category_id_sygms')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(categoryId => {\n if (categoryId) {\n const category = this.feeCategories().find(cat => cat._id === categoryId);\n if (category) {\n console.log('Selected category:', category);\n \n // Auto-populate code from category.config.code\n let code = '';\n if (category.sygms_configuration) {\n try {\n const config = typeof category.sygms_configuration === 'string' \n ? JSON.parse(category.sygms_configuration) \n : category.sygms_configuration;\n \n console.log('Category config:', config);\n \n if (config && typeof config === 'object' && 'code' in config) {\n code = String(config.code || '');\n console.log('Extracted code from config:', code);\n }\n } catch (e) {\n console.warn('Failed to parse category configuration:', e, category.sygms_configuration);\n }\n }\n \n // Auto-populate name from category title\n const name = category.sygms_title || category.sygms_code || '';\n console.log('Extracted name from category:', name);\n \n // Auto-populate description from category description\n const description = category.sygms_desc || '';\n console.log('Extracted description from category:', description);\n \n // Update form values (emitEvent: false to prevent infinite loops)\n itemForm.patchValue({\n feesi_item_code: code,\n feesi_item_name: name,\n feesi_description: description\n }, { emitEvent: false });\n \n console.log('Updated form values - Code:', code, 'Name:', name, 'Description:', description);\n } else {\n console.warn('Category not found for ID:', categoryId);\n }\n }\n });\n\n // Watch for amount changes to recalculate installment amounts\n itemForm.get('feesi_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.recalculateInstallmentAmounts(itemForm);\n this.validateAmountRange(itemForm);\n });\n\n // Watch for editable amount checkbox changes\n itemForm.get('feesi_is_amount_editable')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(isEditable => {\n if (!isEditable) {\n // Clear min/max when editable is disabled\n itemForm.patchValue({\n feesi_min_amount: null,\n feesi_max_amount: null\n }, { emitEvent: false });\n } else {\n this.validateAmountRange(itemForm);\n }\n });\n\n // Watch for min/max amount changes to validate range\n itemForm.get('feesi_min_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.validateAmountRange(itemForm);\n });\n\n itemForm.get('feesi_max_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.validateAmountRange(itemForm);\n });\n\n return itemForm;\n }\n\n private createInstallmentFormGroup(): FormGroup {\n const installmentForm = this.fb.group({\n installment_number: [1],\n installment_amount: [0],\n distribution_type: ['PERCENTAGE'], // 'PERCENTAGE' or 'FIXED_AMOUNT'\n percentage: [0], // Percentage of total amount\n fixed_amount: [0], // Fixed amount for this installment\n due_date_offset_days: [0],\n due_date: [''], // Fixed due date (alternative to offset)\n collection_start_offset_days: [0],\n collection_start_date: [''], // Fixed collection start date (alternative to offset)\n collection_end_offset_days: [30],\n collection_end_date: [''], // Fixed collection end date (alternative to offset)\n });\n\n // Watch for distribution type changes to recalculate amount\n installmentForm.get('distribution_type')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.recalculateInstallmentAmountFromDistribution(installmentForm);\n // Trigger validation check\n this.installmentPercentageTrigger.update(v => v + 1);\n });\n\n // Watch for percentage changes\n installmentForm.get('percentage')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (installmentForm.get('distribution_type')?.value === 'PERCENTAGE') {\n this.recalculateInstallmentAmountFromDistribution(installmentForm);\n // Auto-update last installment to make total 100%\n this.autoUpdateLastInstallmentPercentage(installmentForm);\n // Trigger validation check\n this.installmentPercentageTrigger.update(v => v + 1);\n }\n });\n\n // Watch for fixed amount changes\n installmentForm.get('fixed_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (installmentForm.get('distribution_type')?.value === 'FIXED_AMOUNT') {\n this.recalculateInstallmentAmountFromDistribution(installmentForm);\n }\n });\n\n return installmentForm;\n }\n\n /**\n * Auto-update last installment percentage to make total 100%\n */\n private autoUpdateLastInstallmentPercentage(installmentForm: FormGroup): void {\n // Find the parent item form and installments array\n const installmentsArray = installmentForm.parent as FormArray;\n if (!installmentsArray) return;\n \n const itemForm = installmentsArray.parent as FormGroup;\n if (!itemForm) return;\n \n const isInstallmentAllowed = itemForm.get('feesi_is_installment_allowed')?.value;\n if (!isInstallmentAllowed) return;\n \n if (installmentsArray.length <= 1) return; // No need to auto-update if only one installment\n \n // Calculate total percentage of all installments except the last one\n let totalPercentage = 0;\n const lastIndex = installmentsArray.length - 1;\n \n for (let i = 0; i < lastIndex; i++) {\n const control = installmentsArray.at(i) as FormGroup;\n const distType = control.get('distribution_type')?.value;\n if (distType === 'PERCENTAGE') {\n const percentage = parseFloat(String(control.get('percentage')?.value || 0));\n totalPercentage += percentage;\n }\n }\n \n // Update last installment percentage to make total 100%\n const lastControl = installmentsArray.at(lastIndex) as FormGroup;\n const lastDistType = lastControl.get('distribution_type')?.value;\n if (lastDistType === 'PERCENTAGE') {\n const remainingPercentage = Math.max(0, 100 - totalPercentage);\n lastControl.patchValue({\n percentage: Math.round(remainingPercentage * 100) / 100\n }, { emitEvent: false });\n \n // Recalculate amount for last installment\n this.recalculateInstallmentAmountFromDistribution(lastControl);\n }\n }\n\n /**\n * Get total percentage from previous installments (for display)\n */\n getPreviousInstallmentsPercentage(itemIndex: number, installmentIndex: number): number {\n const installmentsArray = this.getInstallmentsArray(itemIndex);\n if (installmentIndex === 0) return 0; // First installment has no previous\n \n let totalPercentage = 0;\n for (let i = 0; i < installmentIndex; i++) {\n const control = installmentsArray.at(i) as FormGroup;\n const distType = control.get('distribution_type')?.value;\n if (distType === 'PERCENTAGE') {\n const percentage = parseFloat(String(control.get('percentage')?.value || 0));\n totalPercentage += percentage;\n }\n }\n return Math.round(totalPercentage * 100) / 100;\n }\n\n /**\n * Recalculate installment amount based on distribution type\n */\n private recalculateInstallmentAmountFromDistribution(installmentForm: FormGroup): void {\n const distributionType = installmentForm.get('distribution_type')?.value;\n \n // Get the item form (parent of installments FormArray, which is parent of this FormGroup)\n const installmentsArray = installmentForm.parent as FormArray;\n if (!installmentsArray) return;\n \n const itemForm = installmentsArray.parent as FormGroup;\n if (!itemForm) return;\n\n const totalAmount = itemForm.get('feesi_amount')?.value || 0;\n\n if (distributionType === 'PERCENTAGE') {\n const percentage = installmentForm.get('percentage')?.value || 0;\n const calculatedAmount = (totalAmount * percentage) / 100;\n installmentForm.patchValue({ \n installment_amount: Math.round(calculatedAmount * 100) / 100 \n }, { emitEvent: false });\n } else if (distributionType === 'FIXED_AMOUNT') {\n const fixedAmount = installmentForm.get('fixed_amount')?.value || 0;\n installmentForm.patchValue({ \n installment_amount: Math.round(fixedAmount * 100) / 100 \n }, { emitEvent: false });\n }\n }\n\n /**\n * Sync installments array based on installment_allowed and installment_count\n */\n private syncInstallmentsForItem(itemForm: FormGroup, isAllowed: boolean, count?: number): void {\n const installmentsArray = itemForm.get('installments') as FormArray;\n const installmentCount = count ?? itemForm.get('feesi_installment_count')?.value ?? 1;\n const targetCount = isAllowed ? installmentCount : 1; // Always have at least 1 record\n\n const currentCount = installmentsArray.length;\n\n if (currentCount < targetCount) {\n // Add missing installments\n for (let i = currentCount; i < targetCount; i++) {\n const installmentForm = this.createInstallmentFormGroup();\n installmentForm.patchValue({ \n installment_number: i + 1,\n distribution_type: 'PERCENTAGE',\n percentage: isAllowed ? (100 / targetCount) : 100\n });\n installmentsArray.push(installmentForm);\n }\n } else if (currentCount > targetCount) {\n // Remove excess installments\n for (let i = currentCount - 1; i >= targetCount; i--) {\n installmentsArray.removeAt(i);\n }\n }\n\n // Update installment numbers and default percentages\n installmentsArray.controls.forEach((control, index) => {\n const currentDistType = control.get('distribution_type')?.value;\n control.patchValue({ \n installment_number: index + 1 \n }, { emitEvent: false });\n \n // Set default percentage if not already set or if using percentage\n if (!currentDistType || currentDistType === 'PERCENTAGE') {\n const defaultPercentage = isAllowed ? (100 / targetCount) : 100;\n control.patchValue({ \n distribution_type: 'PERCENTAGE',\n percentage: defaultPercentage\n }, { emitEvent: false });\n }\n });\n\n // Recalculate amounts\n this.recalculateInstallmentAmounts(itemForm);\n \n // Trigger validation check after syncing\n setTimeout(() => {\n this.installmentPercentageTrigger.update(v => v + 1);\n }, 100);\n }\n\n /**\n * Recalculate installment amounts based on total amount and installment count\n * Only recalculates if distribution type is not set (default equal distribution)\n */\n private recalculateInstallmentAmounts(itemForm: FormGroup): void {\n const totalAmount = itemForm.get('feesi_amount')?.value || 0;\n const installmentCount = itemForm.get('feesi_installment_count')?.value || 1;\n const installmentsArray = itemForm.get('installments') as FormArray;\n\n if (installmentsArray.length === 0) return;\n\n // Check if any installment has custom distribution\n const hasCustomDistribution = installmentsArray.controls.some(control => {\n const distType = control.get('distribution_type')?.value;\n return distType === 'PERCENTAGE' || distType === 'FIXED_AMOUNT';\n });\n\n if (!hasCustomDistribution) {\n // Default: Equal distribution\n const amountPerInstallment = totalAmount / installmentCount;\n installmentsArray.controls.forEach((control) => {\n control.patchValue({ \n installment_amount: Math.round(amountPerInstallment * 100) / 100,\n distribution_type: 'PERCENTAGE',\n percentage: 100 / installmentCount\n }, { emitEvent: false });\n });\n } else {\n // Recalculate based on distribution type for each installment\n installmentsArray.controls.forEach((control) => {\n this.recalculateInstallmentAmountFromDistribution(control as FormGroup);\n });\n }\n }\n\n /**\n * Get installments array for a specific fee item\n */\n getInstallmentsArray(itemIndex: number): FormArray {\n const feeItemsArray = this.feeItemsArray;\n const itemForm = feeItemsArray.at(itemIndex) as FormGroup;\n return itemForm.get('installments') as FormArray;\n }\n\n private rightsService = inject(RightsService);\n\n ngOnInit(): void {\n // Initialize rights for fee structure management\n this.rightsService.initializeRights('fee_structure');\n this.initializeComponent();\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n /**\n * Initialize component\n */\n private initializeComponent(): void {\n this.updateBreadcrumbData();\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\n const queryParams = params['query'];\n console.log(queryParams, 'queryParams');\n\n if (queryParams) {\n const queryData = generateObjectFromString(queryParams);\n if (queryData?.fees_id) {\n this.feeStructureId.set(queryData.fees_id as string);\n this.isEditMode.set(true);\n this.loadFeeStructureData(queryData.fees_id as string);\n } else if (queryData?.copy_from) {\n // Copy mode\n this.loadFeeStructureData(queryData.copy_from as string, true);\n }\n } else {\n this.isEditMode.set(false);\n }\n\n // Always load dropdown options\n this.loadDropdownOptions();\n });\n\n // Check if view mode\n const path = this.route.snapshot.url.map(segment => segment.path).join('/');\n this.isViewMode.set(path.includes('view'));\n \n if (this.isViewMode()) {\n this.feeStructureForm.disable();\n }\n\n // Update breadcrumb after mode is determined\n this.updateBreadcrumbData();\n }\n\n /**\n * Load dropdown options\n */\n private loadDropdownOptions(): void {\n // Get active entity from app state\n const activeEntity = this.appStateService.activeEntity();\n\n // Load entity options\n this.entityLoading.set(true);\n this.entityService.getEntityList({}).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.entityOptions.set(response.data);\n }\n this.entityLoading.set(false);\n },\n error: () => {\n this.entityLoading.set(false);\n }\n });\n\n // Set active entity (already set in initializeForm, but ensure it's set here too)\n if (activeEntity?._id) {\n this.feeStructureForm.patchValue({\n fees_entity_id_syen: activeEntity._id\n });\n }\n \n // Load reservation categories on initialization\n // Use a small delay to ensure entity ID is set in the form\n setTimeout(() => {\n this.loadStudentCategories();\n this.loadFeeCategories();\n }, 100);\n\n // Load academic year options and set current one\n this.academicYearLoading.set(true);\n const academicYearPayload: MAcademicYear = {\n pageIndex: 1,\n pageSize: 100,\n pagination: false\n };\n this.academicYearService.getAcademicYearList(academicYearPayload).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.academicYearOptions.set(response.data);\n \n // Find and set current academic year (where acayr_iscurrent is true)\n const currentAcademicYear = response.data.find((ay: AcademicYear) => ay.acayr_iscurrent === true);\n if (currentAcademicYear?._id) {\n this.feeStructureForm.patchValue({\n fees_academic_year_id_acayr: currentAcademicYear._id\n });\n // Disable academic year control\n this.feeStructureForm.get('fees_academic_year_id_acayr')?.disable();\n }\n }\n this.academicYearLoading.set(false);\n },\n error: () => {\n this.academicYearLoading.set(false);\n }\n });\n }\n\n /**\n * Load class program masters\n */\n private loadClassProgramMasters(academicYearId: string, entityId?: string): void {\n this.classProgramMastersLoading.set(true);\n \n const payload: Partial<MClassProgramMaster> = {\n acacpm_academic_year_id_acayr: academicYearId,\n acacpm_entity_id_syen: entityId || this.appStateService.activeEntity()?._id || '',\n acacpm_isactive: true\n };\n\n this.classProgramMasterService.searchClassProgramMasters(payload).subscribe({\n next: (response: classProgramMasterControllerResponse) => {\n if (response?.success && response.data) {\n const dataArray: AcaClassProgramMasterResponse[] = Array.isArray(response.data) ? response.data : [];\n this.classProgramMasters.set(dataArray);\n } else {\n this.classProgramMasters.set([]);\n }\n this.classProgramMastersLoading.set(false);\n },\n error: () => {\n this.classProgramMasters.set([]);\n this.classProgramMastersLoading.set(false);\n }\n });\n }\n\n /**\n * Handle class program selection change\n */\n onClassProgramChange(classProgramId: string | null | undefined): void {\n // Clear previous selections\n this.selectedClassProgram.set(null);\n this.classProgramBranches.set([]);\n this.classProgramTerms.set([]);\n\n if (!classProgramId) {\n return;\n }\n\n // Find the selected program from the list\n const selectedProgram = this.classProgramMasters().find(cp => cp._id === classProgramId);\n if (!selectedProgram) {\n return;\n }\n\n // Note: ProgramSectionSelectorComponent handles all loading automatically\n // No need to manually load branches/terms - component reacts to form changes\n }\n\n /**\n * Load class program branches\n */\n private loadClassProgramBranches(classProgramId: string): void {\n this.classProgramBranchesLoading.set(true);\n \n const payload = new AcaClassPrgBranchListPayload({\n acabrn_class_program_id_acacpm: classProgramId,\n pagination: false\n });\n\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n academicsRoutesUrl.module,\n academicsRoutesUrl.classProgramBranch,\n query\n ]);\n\n this.http.get<classPrgBranchControllerResponse>(url).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const branches: AcaClassPrgBranchResponse[] = Array.isArray(response.data) ? response.data : [];\n this.classProgramBranches.set(branches.map((branch: AcaClassPrgBranchResponse) => ({\n value: branch._id || '',\n label: branch.acabrn_name || branch.acabrn_code || ''\n })));\n } else {\n this.classProgramBranches.set([]);\n }\n this.classProgramBranchesLoading.set(false);\n },\n error: () => {\n this.classProgramBranches.set([]);\n this.classProgramBranchesLoading.set(false);\n }\n });\n }\n\n /**\n * Handle branch selection change - load terms for selected branch\n */\n onBranchChange(branchId: string | null | undefined): void {\n this.classProgramTerms.set([]);\n this.programTermSections.set([]);\n // Reservation category is independent - don't clear it\n this.feeStructureForm.patchValue({ \n fees_class_program_term_id_acapt: '',\n fees_program_term_section_id_acapts: ''\n // Don't clear fees_student_category_id_sygms - reservation category is independent\n });\n\n // Note: ProgramSectionSelectorComponent handles all loading automatically\n // No need to manually load terms - component reacts to form changes\n }\n\n /**\n * Handle term selection change - load sections for selected term\n */\n onTermChange(termId: string | null | undefined): void {\n this.programTermSections.set([]);\n // Reservation category is independent - don't clear it\n this.feeStructureForm.patchValue({ \n fees_program_term_section_id_acapts: ''\n // Don't clear fees_student_category_id_sygms - reservation category is independent\n });\n\n // Always load sections when term is selected\n if (termId) {\n this.loadProgramTermSections(termId);\n }\n }\n\n /**\n * Handle section selection change\n * Note: Reservation category is independent and doesn't need to be reloaded\n */\n onSectionChange(sectionId: string | null | undefined): void {\n // Reservation category is independent - no need to reload or clear\n // Just clear the selection if section changes (optional)\n }\n\n /**\n * Load class program terms\n */\n private loadClassProgramTerms(classProgramId: string, branchId?: string): void {\n this.classProgramTermsLoading.set(true);\n \n const payload: Partial<MClassProgramTerm> = {\n acapt_class_program_id_acacpm: classProgramId,\n acapt_class_prg_branch_acabrn: branchId || undefined,\n pagination: false\n } as Partial<MClassProgramTerm>;\n\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n academicsRoutesUrl.module,\n academicsRoutesUrl.classProgramTerm,\n query\n ]);\n\n this.http.get<classProgramTermControllerResponse>(url)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const terms: AcaClassProgramTermReponse[] = Array.isArray(response.data) ? response.data : [];\n // Transform to SelectOption format with parent field for tree view\n const options = terms.map((term: AcaClassProgramTermReponse) => {\n // Normalize parent field for tree view compatibility\n let parentId = '';\n if (term.acapt_parent_class_prog_term_acapt) {\n if (typeof term.acapt_parent_class_prog_term_acapt === 'object') {\n parentId = term.acapt_parent_class_prog_term_acapt._id || '';\n } else if (typeof term.acapt_parent_class_prog_term_acapt === 'string') {\n parentId = term.acapt_parent_class_prog_term_acapt || '';\n }\n }\n \n return {\n _id: term._id || '',\n value: term._id || '',\n label: term.acapt_name || term.acapt_code || '',\n acapt_parent_class_prog_term_acapt: parentId\n };\n });\n \n this.classProgramTerms.set(options);\n } else {\n this.classProgramTerms.set([]);\n }\n this.classProgramTermsLoading.set(false);\n },\n error: () => {\n this.classProgramTerms.set([]);\n this.classProgramTermsLoading.set(false);\n }\n });\n }\n\n /**\n * Load program term sections for selected term\n */\n private loadProgramTermSections(termId: string): void {\n this.programTermSectionsLoading.set(true);\n \n const payload: MPrgTrmSection = new MPrgTrmSection({\n acapts_parent_class_prog_term_acapt: termId,\n pagination: false,\n pageIndex: 0,\n pageSize: 1000,\n query: \"\",\n sort: {\n key: 'acapts_name',\n order: 'asc'\n }\n });\n\n this.programTermSectionService.getProgramTermSectionList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: prgTrmSectionControllerResponse) => {\n if (response?.success && response?.data) {\n const sections: AcaPrgTrmSectionResponse[] = Array.isArray(response.data) ? response.data : [];\n this.programTermSections.set(sections.map((section: AcaPrgTrmSectionResponse) => ({\n value: section._id || '',\n label: section.acapts_name || section.acapts_code || ''\n })));\n } else {\n this.programTermSections.set([]);\n }\n this.programTermSectionsLoading.set(false);\n },\n error: () => {\n this.programTermSections.set([]);\n this.programTermSectionsLoading.set(false);\n }\n });\n }\n\n /**\n * Helper method to load branches and set values in sequence\n */\n private loadBranchesAndSetValue(classProgramId: string, branchId: string, termId?: string, sectionId?: string): void {\n const payload = new AcaClassPrgBranchListPayload({\n acabrn_class_program_id_acacpm: classProgramId,\n pagination: false\n });\n\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n academicsRoutesUrl.module,\n academicsRoutesUrl.classProgramBranch,\n query\n ]);\n\n this.http.get<classPrgBranchControllerResponse>(url)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const branches: AcaClassPrgBranchResponse[] = Array.isArray(response.data) ? response.data : [];\n this.classProgramBranches.set(branches.map((branch: AcaClassPrgBranchResponse) => ({\n value: branch._id || '',\n label: branch.acabrn_name || branch.acabrn_code || ''\n })));\n \n // Set branch value after branches are loaded\n this.feeStructureForm.patchValue({\n fees_class_program_branch_id_acabrn: branchId\n }, { emitEvent: false });\n \n // Note: ProgramSectionSelectorComponent will automatically load terms and sections\n // when form values are patched - no need for manual loading\n }\n },\n error: () => {\n this.classProgramBranches.set([]);\n }\n });\n }\n\n /**\n * Helper method to load terms and set values in sequence\n */\n private loadTermsAndSetValue(classProgramId: string, branchId: string, termId: string, sectionId?: string): void {\n const payload: Partial<MClassProgramTerm> = {\n acapt_class_program_id_acacpm: classProgramId,\n acapt_class_prg_branch_acabrn: branchId || undefined,\n pagination: false\n } as Partial<MClassProgramTerm>;\n\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n academicsRoutesUrl.module,\n academicsRoutesUrl.classProgramTerm,\n query\n ]);\n\n this.http.get<classProgramTermControllerResponse>(url)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const terms: AcaClassProgramTermReponse[] = Array.isArray(response.data) ? response.data : [];\n const options = terms.map((term: AcaClassProgramTermReponse) => {\n let parentId = '';\n if (term.acapt_parent_class_prog_term_acapt) {\n if (typeof term.acapt_parent_class_prog_term_acapt === 'object') {\n parentId = term.acapt_parent_class_prog_term_acapt._id || '';\n } else if (typeof term.acapt_parent_class_prog_term_acapt === 'string') {\n parentId = term.acapt_parent_class_prog_term_acapt;\n }\n }\n return {\n value: term._id || '',\n label: term.acapt_name || term.acapt_code || '',\n _id: term._id || '',\n acapt_parent_class_prog_term_acapt: parentId\n };\n });\n this.classProgramTerms.set(options);\n \n // Set term value after terms are loaded\n this.feeStructureForm.patchValue({\n fees_class_program_term_id_acapt: termId\n }, { emitEvent: false });\n \n // Load sections if section ID exists\n if (sectionId) {\n this.loadSectionsAndSetValue(termId, sectionId);\n }\n }\n },\n error: () => {\n this.classProgramTerms.set([]);\n }\n });\n }\n\n /**\n * Helper method to load sections and set value\n */\n private loadSectionsAndSetValue(termId: string, sectionId: string): void {\n const payload: MPrgTrmSection = new MPrgTrmSection({\n acapts_parent_class_prog_term_acapt: termId,\n pagination: false,\n pageIndex: 0,\n pageSize: 1000,\n query: \"\",\n sort: {\n key: 'acapts_name',\n order: 'asc'\n }\n });\n\n this.programTermSectionService.getProgramTermSectionList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: prgTrmSectionControllerResponse) => {\n if (response?.success && response?.data) {\n const sections: AcaPrgTrmSectionResponse[] = Array.isArray(response.data) ? response.data : [];\n this.programTermSections.set(sections.map((section: AcaPrgTrmSectionResponse) => ({\n value: section._id || '',\n label: section.acapts_name || section.acapts_code || ''\n })));\n \n // Set section value after sections are loaded\n this.feeStructureForm.patchValue({\n fees_program_term_section_id_acapts: sectionId\n }, { emitEvent: false });\n }\n },\n error: () => {\n this.programTermSections.set([]);\n }\n });\n }\n\n /**\n * Load reservation categories from general master\n */\n private loadStudentCategories(sectionId?: string): void {\n this.studentCategoriesLoading.set(true);\n \n // Get entity ID from form first, then fallback to app state\n const formEntityId = this.feeStructureForm.get('fees_entity_id_syen')?.value;\n const appStateEntityId = this.appStateService.activeEntity()?._id;\n const entityId = formEntityId || appStateEntityId;\n \n // Build payload to filter reservation categories\n // Reservation categories are stored in general master with type code 'reservation_category'\n const payload: IGeneralMasterListRequest = {\n sygmt_code: 'reservation_category'\n };\n \n // Only add entity ID if it exists (don't pass undefined)\n if (entityId) {\n payload.sygms_entity_id_syen = entityId;\n }\n\n console.log('Loading reservation categories with payload:', payload, 'Entity ID:', entityId);\n\n this.generalMasterService.getMasterList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: generalMasterListControllerResponse) => {\n console.log('Reservation categories API response:', response);\n if (response?.success && response?.data) {\n const categories: ICoreSygms[] = Array.isArray(response.data) ? response.data : [];\n // Filter only active categories and map to options\n const activeCategories = categories\n .filter((category: ICoreSygms) => category.sygms_isactive !== false)\n .map((category: ICoreSygms) => ({\n value: category._id || '',\n label: category.sygms_title || category.sygms_code || ''\n }));\n \n console.log('Mapped reservation categories:', activeCategories);\n this.studentCategories.set(activeCategories);\n } else {\n console.warn('No reservation categories found or API returned unsuccessful response. Response:', response);\n // Don't clear existing categories - keep them as they are\n }\n this.studentCategoriesLoading.set(false);\n },\n error: (error: unknown) => {\n console.error('Error loading reservation categories:', error);\n // Don't clear existing categories on error - keep them as they are\n this.studentCategoriesLoading.set(false);\n }\n });\n }\n\n /**\n * Load fee categories from general master\n */\n private loadFeeCategories(): void {\n this.feeCategoriesLoading.set(true);\n \n const activeEntity = this.appStateService.activeEntity();\n const entityId = activeEntity?._id || this.feeStructureForm.get('fees_entity_id_syen')?.value;\n \n // Build payload to filter fee categories\n // Fee categories are stored in general master with type code 'fee_category'\n const payload: IGeneralMasterListRequest = {\n sygmt_code: 'fee_category'\n };\n \n // Only add entity ID if it exists (don't pass undefined)\n if (entityId) {\n payload.sygms_entity_id_syen = entityId;\n }\n\n console.log('Loading fee categories with payload:', payload, 'Entity ID:', entityId);\n\n this.generalMasterService.getMasterList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: generalMasterListControllerResponse) => {\n console.log('Fee categories API response:', response);\n if (response?.success && response?.data) {\n const categories: ICoreSygms[] = Array.isArray(response.data) ? response.data : [];\n // Filter only active categories\n const activeCategories = categories\n .filter((category: ICoreSygms) => category.sygms_isactive !== false);\n \n console.log('Loaded fee categories:', activeCategories);\n this.feeCategories.set(activeCategories);\n } else {\n console.warn('No fee categories found or API returned unsuccessful response. Response:', response);\n }\n this.feeCategoriesLoading.set(false);\n },\n error: (error: unknown) => {\n console.error('Error loading fee categories:', error);\n this.feeCategoriesLoading.set(false);\n }\n });\n }\n\n /**\n * Handle class program search\n */\n onClassProgramMasterSearch(event: selectSearchType): void {\n const academicYearId = this.feeStructureForm.get('fees_academic_year_id_acayr')?.value;\n const entityId = this.feeStructureForm.get('fees_entity_id_syen')?.value || \n this.appStateService.activeEntity()?._id;\n \n if (!academicYearId || !entityId) {\n return;\n }\n\n this.loadClassProgramMasters(academicYearId, entityId);\n }\n\n /**\n * Load fee structure data for edit/view\n */\n private loadFeeStructureData(id: string, isCopy: boolean = false): void {\n this.loading.set(true);\n this.feeStructureService.getFeeStructureById({ fees_id: id }).subscribe({\n next: (response: feeStructureByIdControllerResponse) => {\n if (response?.success && response.data) {\n // Type guard to check if response has new structure (fee_structure and fee_structure_items)\n const isFeeStructureByIdResponse = (data: FeeStructureByIdResponse | FeeStructureResponse): data is FeeStructureByIdResponse => {\n return data !== null && typeof data === 'object' && 'fee_structure' in data;\n };\n \n let structureData: FeeStructureResponse;\n let itemsData: FeeStructureItem[] = [];\n \n if (isFeeStructureByIdResponse(response.data)) {\n // New structure: { fee_structure: {...}, fee_structure_items: [...] }\n const newData: FeeStructureByIdResponse = response.data;\n structureData = newData.fee_structure || {} as FeeStructureResponse;\n itemsData = newData.fee_structure_items || [];\n } else {\n // Legacy structure: direct FeeStructureResponse\n structureData = response.data as FeeStructureResponse;\n itemsData = [];\n }\n \n // Helper function to extract ID from object or string\n const extractId = (value: any): string => {\n if (!value) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && '_id' in value) {\n return value._id || '';\n }\n return '';\n };\n\n // Extract IDs from response\n const classProgramId = extractId(structureData.fees_class_program_id_acacpm);\n const branchId = extractId(structureData.fees_class_program_branch_id_acabrn);\n const termId = extractId(structureData.fees_class_program_term_id_acapt);\n const sectionId = extractId(structureData.fees_program_term_section_id_acapts);\n const studentCategoryId = extractId(structureData.fees_student_category_id_sygms);\n console.log(\"structureData\", structureData);\n console.log(\"classProgramId\", classProgramId);\n console.log(\"branchId\", branchId);\n console.log(\"termId\", termId);\n console.log(\"sectionId\", sectionId);\n console.log(\"studentCategoryId\", studentCategoryId);\n // Patch basic form values\n // Note: Entity and Academic Year are disabled and set from app state, so we don't override them\n // Use emitEvent: false to avoid triggering cascading loads prematurely\n // The program-section-selector component will handle loading options and matching values\n this.feeStructureForm.patchValue({\n fees_structure_code: isCopy ? '' : (structureData.fees_structure_code || ''),\n fees_structure_name: isCopy ? `${structureData.fees_structure_name} (Copy)` : structureData.fees_structure_name,\n fees_structure_description: structureData.fees_structure_description || '',\n fees_is_active: structureData.fees_is_active ?? true,\n fees_class_program_id_acacpm: classProgramId,\n fees_class_program_branch_id_acabrn: branchId,\n fees_class_program_term_id_acapt: termId,\n fees_program_term_section_id_acapts: sectionId,\n fees_student_category_id_sygms: studentCategoryId\n // fees_academic_year_id_acayr and fees_entity_id_syen are set from app state and disabled\n }, { emitEvent: false });\n\n // Trigger value changes after a short delay to allow program-section-selector to process initial values\n // The component's handleInitialValues will detect the values and load cascading options\n setTimeout(() => {\n // Emit events to trigger the component's value change handlers\n const classProgramControl = this.feeStructureForm.get('fees_class_program_id_acacpm');\n if (classProgramId && classProgramControl) {\n classProgramControl.updateValueAndValidity({ emitEvent: true });\n }\n }, 500);\n\n // Load fee items if available\n if (itemsData && itemsData.length > 0) {\n // Clear existing items\n while (this.feeItemsArray.length !== 0) {\n this.feeItemsArray.removeAt(0);\n }\n \n // Load each item\n itemsData.forEach((item: FeeStructureItem, index: number) => {\n const itemForm = this.createFeeItemFormGroup();\n \n // Patch item values\n itemForm.patchValue({\n _id: item._id || undefined,\n feesi_category_id_sygms: item.feesi_category_id_sygms || '',\n feesi_item_code: item.feesi_item_code || '',\n feesi_item_name: item.feesi_item_name || '',\n feesi_description: item.feesi_description || '',\n feesi_amount: item.feesi_amount || 0,\n feesi_is_amount_editable: item.feesi_is_amount_editable || false,\n feesi_min_amount: item.feesi_min_amount || null,\n feesi_max_amount: item.feesi_max_amount || null,\n feesi_is_mandatory: item.feesi_is_mandatory ?? true,\n feesi_is_refundable: item.feesi_is_refundable || false,\n feesi_is_installment_allowed: item.feesi_is_installment_allowed || false,\n feesi_installment_count: item.feesi_installment_count || 1,\n feesi_tax_applicable: item.feesi_tax_applicable || false,\n feesi_tax_percentage: item.feesi_tax_percentage || 0,\n feesi_display_order: index\n });\n \n // Load installment data (create at least one installment)\n const installmentsArray = itemForm.get('installments') as FormArray;\n while (installmentsArray.length !== 0) {\n installmentsArray.removeAt(0);\n }\n \n // Create installment from item data (for non-installment items, we have one installment)\n const installmentForm = this.createInstallmentFormGroup();\n installmentForm.patchValue({\n installment_number: 1,\n installment_amount: item.feesi_amount || 0,\n distribution_type: 'PERCENTAGE',\n percentage: 100,\n fixed_amount: item.feesi_amount || 0,\n due_date_offset_days: item.feesi_due_date_offset_days || 0,\n due_date: item.feesi_due_date ? new Date(item.feesi_due_date).toISOString().split('T')[0] : '',\n collection_start_offset_days: item.feesi_collection_start_offset_days || 0,\n collection_start_date: '',\n collection_end_offset_days: item.feesi_collection_end_offset_days || 30,\n collection_end_date: ''\n });\n installmentsArray.push(installmentForm);\n \n // If installments are allowed, we would need to fetch installment details separately\n // For now, we create one installment with the item's data\n \n this.feeItemsArray.push(itemForm);\n });\n \n // Setup amount watchers for loaded items\n this.setupAmountWatchers();\n \n console.log(`โ
Loaded ${itemsData.length} fee items`);\n } else {\n // No items found, keep default item\n console.log('โน๏ธ No fee items found, keeping default item');\n // Setup watchers for default item\n this.setupAmountWatchers();\n }\n \n if (!isCopy) {\n this.feeStructureId.set(id);\n }\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('Error loading fee structure:', error);\n this.notificationService.error('Failed to load fee structure data.');\n this.loading.set(false);\n }\n });\n }\n\n /**\n * Handle tab change\n */\n onTabChange(tab: TabItem): void {\n this.activeTab.set(tab.id);\n }\n\n /**\n * Add new fee item\n */\n addFeeItem(): void {\n const newItem = this.createFeeItemFormGroup();\n this.feeItemsArray.push(newItem);\n \n // Watch for amount changes in the new item\n newItem.get('feesi_amount')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.totalAmountTrigger.set(this.totalAmountTrigger() + 1);\n });\n \n this.notificationService.info('Fee item added. Please fill in the details.');\n }\n\n /**\n * Remove fee item\n */\n removeFeeItem(index: number): void {\n if (this.feeItemsArray.length > 1) {\n this.confirmationService.ask({\n title: 'Remove Fee Item',\n message: 'Are you sure you want to remove this fee item?',\n confirmText: 'Remove',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.feeItemsArray.removeAt(index);\n this.notificationService.success('Fee item removed.');\n }\n });\n } else {\n this.notificationService.warning('At least one fee item is required.');\n }\n }\n\n /**\n * Move fee item up\n */\n moveItemUp(index: number): void {\n if (index > 0) {\n const items = this.feeItemsArray;\n const item = items.at(index);\n items.removeAt(index);\n items.insert(index - 1, item);\n }\n }\n\n /**\n * Move fee item down\n */\n moveItemDown(index: number): void {\n if (index < this.feeItemsArray.length - 1) {\n const items = this.feeItemsArray;\n const item = items.at(index);\n items.removeAt(index);\n items.insert(index + 1, item);\n }\n }\n\n /**\n * Handle form submission\n */\n onSubmit(): void {\n const requiredRight = this.isEditMode() ? 'EDIT' : 'CREATE';\n if (!this.rightsService.hasRight(requiredRight)) {\n this.notificationService.error(`You do not have permission to ${this.isEditMode() ? 'edit' : 'create'} fee structures`);\n return;\n }\n if (this.submitting()) {\n return;\n }\n\n this.submitting.set(true);\n\n // Ensure term control is enabled so it's included in getRawValue()\n const termControl = this.feeStructureForm.get('fees_class_program_term_id_acapt');\n if (termControl?.disabled) {\n termControl.enable({ emitEvent: false });\n }\n \n // Get form value, including disabled controls\n const formValue = this.feeStructureForm.getRawValue();\n \n // Get term value - check both formValue and control directly (for one-to-one mappings where term is auto-selected)\n const termId = formValue.fees_class_program_term_id_acapt || termControl?.value || undefined;\n \n // Build fee structure object\n const feeStructure = {\n _id: this.isEditMode() ? this.feeStructureId() : undefined,\n fees_structure_code: formValue.fees_structure_code,\n fees_structure_name: formValue.fees_structure_name,\n fees_structure_description: formValue.fees_structure_description,\n fees_academic_year_id_acayr: formValue.fees_academic_year_id_acayr,\n fees_entity_id_syen: formValue.fees_entity_id_syen,\n fees_class_program_id_acacpm: formValue.fees_class_program_id_acacpm || undefined,\n fees_class_program_branch_id_acabrn: formValue.fees_class_program_branch_id_acabrn || undefined,\n fees_class_program_term_id_acapt: termId || undefined,\n fees_program_term_section_id_acapts: formValue.fees_program_term_section_id_acapts || undefined,\n fees_student_category_id_sygms: formValue.fees_student_category_id_sygms || undefined,\n fees_is_active: formValue.fees_is_active ?? true\n };\n \n // Debug log to verify term is included\n if (formValue.fees_class_program_id_acacpm && !feeStructure.fees_class_program_term_id_acapt) {\n console.warn('โ ๏ธ Warning: Class program selected but term ID is missing from fee structure payload');\n console.warn('Form value term:', formValue.fees_class_program_term_id_acapt);\n console.warn('Control value term:', termControl?.value);\n console.warn('Control disabled:', termControl?.disabled);\n } else if (feeStructure.fees_class_program_term_id_acapt) {\n console.log('โ
Term ID included in fee structure:', feeStructure.fees_class_program_term_id_acapt);\n }\n\n // Build fee structure items array\n const feeStructureItems: FeeStructureItem[] = this.feeItemsArray.controls.map((itemControl, index) => {\n const itemValue = itemControl.getRawValue();\n const installments = itemValue.installments || [];\n \n // Extract installment data (first installment for non-installment items, all for installment items)\n const firstInstallment = installments[0] || {};\n \n return {\n _id: itemValue._id || undefined,\n feesi_category_id_sygms: itemValue.feesi_category_id_sygms || undefined,\n feesi_item_code: itemValue.feesi_item_code || undefined,\n feesi_item_name: itemValue.feesi_item_name || undefined,\n feesi_description: itemValue.feesi_description || undefined,\n feesi_amount: itemValue.feesi_amount || 0,\n feesi_is_amount_editable: itemValue.feesi_is_amount_editable || false,\n feesi_min_amount: itemValue.feesi_min_amount || undefined,\n feesi_max_amount: itemValue.feesi_max_amount || undefined,\n feesi_due_date: firstInstallment.due_date || undefined,\n feesi_due_date_offset_days: firstInstallment.due_date_offset_days || 0,\n feesi_collection_start_offset_days: firstInstallment.collection_start_offset_days || 0,\n feesi_collection_end_offset_days: firstInstallment.collection_end_offset_days || 30,\n feesi_is_mandatory: itemValue.feesi_is_mandatory ?? true,\n feesi_is_refundable: itemValue.feesi_is_refundable || false,\n feesi_is_installment_allowed: itemValue.feesi_is_installment_allowed || false,\n feesi_installment_count: itemValue.feesi_installment_count || 1,\n feesi_tax_applicable: itemValue.feesi_tax_applicable || false,\n feesi_tax_percentage: itemValue.feesi_tax_percentage || 0,\n feesi_display_order: index,\n feesi_is_active: true\n };\n });\n\n // Build payload with separate keys (similar to entity save model)\n const payload: FeeStructureSaveUpdatePayload = new FeeStructureSaveUpdatePayload({\n fee_structure: feeStructure,\n fee_structure_items: feeStructureItems\n });\n\n this.feeStructureService.saveUpdateFeeStructure(payload).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n const savedData = response.data;\n const structureCode = savedData.fees_structure_code || 'N/A';\n const structureId = savedData._id || 'N/A';\n \n // Show confirmation dialog with generated structure code and ID\n this.confirmationService.ask({\n title: 'Fee Structure Saved Successfully!',\n message: `Fee structure has been ${this.isEditMode() ? 'updated' : 'created'} successfully.\\n\\nStructure Code: ${structureCode}\\nStructure ID: ${structureId}`,\n confirmText: 'OK',\n cancelText: 'Cancel',\n type: 'success',\n icon: 'done'\n }).then((confirmed: boolean) => {\n if (!confirmed) {\n this.submitting.set(false);\n return;\n }\n // Update form with generated structure code and ID\n if (savedData.fees_structure_code) {\n this.feeStructureForm.patchValue({\n fees_structure_code: savedData.fees_structure_code\n });\n }\n \n // Update fee structure ID and switch to edit mode\n if (savedData._id) {\n this.feeStructureId.set(savedData._id);\n this.isEditMode.set(true);\n this.updateBreadcrumbData();\n }\n \n // Show success toast notification\n this.notificationService.success(\n `Fee structure ${this.isEditMode() ? 'updated' : 'created'} successfully!`,\n { icon: 'done' }\n );\n \n this.submitting.set(false);\n });\n } else {\n this.notificationService.error(response?.message || 'Failed to save fee structure.');\n this.submitting.set(false);\n }\n },\n error: (error) => {\n console.error('Error saving fee structure:', error);\n this.notificationService.error('Failed to save fee structure. Please try again.');\n this.submitting.set(false);\n }\n });\n }\n\n /**\n * Reset form to initial state\n */\n resetForm(): void {\n if (this.feeStructureForm.dirty) {\n this.confirmationService.ask({\n title: 'Reset Form?',\n message: 'Are you sure you want to reset the form? All unsaved changes will be lost.',\n confirmText: 'Reset',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.feeStructureForm.reset({\n fees_is_active: true\n });\n \n // Clear fee items array\n while (this.feeItemsArray.length !== 0) {\n this.feeItemsArray.removeAt(0);\n }\n \n // Add one default fee item\n this.feeItemsArray.push(this.createFeeItemFormGroup());\n \n // Reset state\n this.feeStructureId.set('');\n this.isEditMode.set(false);\n this.activeTab.set('basic');\n \n this.notificationService.info('Form has been reset.');\n }\n });\n }\n }\n\n /**\n * Validate amount range for editable fees\n */\n private validateAmountRange(itemForm: FormGroup): void {\n const isEditable = itemForm.get('feesi_is_amount_editable')?.value;\n if (!isEditable) return;\n\n const minAmount = itemForm.get('feesi_min_amount')?.value;\n const maxAmount = itemForm.get('feesi_max_amount')?.value;\n const baseAmount = itemForm.get('feesi_amount')?.value;\n\n // Clear previous errors\n itemForm.get('feesi_min_amount')?.setErrors(null);\n itemForm.get('feesi_max_amount')?.setErrors(null);\n itemForm.get('feesi_amount')?.setErrors(null);\n\n // Validate min <= max if both are provided\n if (minAmount !== null && minAmount !== undefined && minAmount !== '' &&\n maxAmount !== null && maxAmount !== undefined && maxAmount !== '') {\n if (Number(minAmount) > Number(maxAmount)) {\n itemForm.get('feesi_min_amount')?.setErrors({ minMaxMismatch: true });\n itemForm.get('feesi_max_amount')?.setErrors({ minMaxMismatch: true });\n }\n }\n\n // Validate base amount is within range if min/max are provided\n if (baseAmount !== null && baseAmount !== undefined && baseAmount !== '') {\n if (minAmount !== null && minAmount !== undefined && minAmount !== '' && Number(baseAmount) < Number(minAmount)) {\n itemForm.get('feesi_amount')?.setErrors({ belowMinimum: { min: minAmount } });\n }\n if (maxAmount !== null && maxAmount !== undefined && maxAmount !== '' && Number(baseAmount) > Number(maxAmount)) {\n itemForm.get('feesi_amount')?.setErrors({ aboveMaximum: { max: maxAmount } });\n }\n }\n }\n\n /**\n * Cancel and navigate back\n */\n onCancel(): void {\n if (this.feeStructureForm.dirty) {\n this.confirmationService.ask({\n title: 'Discard Changes?',\n message: 'You have unsaved changes. Are you sure you want to leave?',\n confirmText: 'Discard',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n // Use ComponentContextService to close tab or floating container\n this.componentContextService.close(['/control-panel/structure']);\n }\n });\n } else {\n // Use ComponentContextService to close tab or floating container\n this.componentContextService.close(['/control-panel/structure']);\n }\n }\n\n /**\n * Get entity options for select\n */\n getEntityOptions(): Array<{ value: string; label: string }> {\n return this.entityOptions().map(entity => ({\n value: entity._id || '',\n label: `${entity.syen_name || ''} (${entity.syen_code || ''})`\n }));\n }\n\n /**\n * Get academic year options for select\n */\n getAcademicYearOptions(): Array<{ value: string; label: string }> {\n return this.academicYearOptions().map(ay => ({\n value: ay._id || '',\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\n }));\n }\n\n /**\n * Format currency\n */\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n /**\n * Update breadcrumb data based on mode\n */\n private updateBreadcrumbData(): void {\n const additionalItems: { id: string; label: string; icon?: string; url?: string }[] = [];\n\n if (this.isEditMode() || this.isViewMode()) {\n if (this.isViewMode()) {\n additionalItems.push({\n id: 'view',\n label: 'View',\n icon: 'visibility',\n url: undefined\n });\n } else {\n additionalItems.push({\n id: 'edit',\n label: 'Edit',\n icon: 'edit',\n url: undefined\n });\n }\n } else {\n // Create mode\n additionalItems.push({\n id: 'create',\n label: 'Create',\n icon: 'add',\n url: undefined\n });\n }\n\n this.breadcrumbData.set(additionalItems);\n }\n}\n","<!-- Fee Structure Form -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_structure' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Back Button in Breadcrumb Area (View Mode Only) -->\n @if (isViewMode()) {\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"onCancel()\" leftIcon=\"arrow_back\">\n Back to List\n </button>\n </div>\n }\n \n <div class=\"tw-w-full tw-h-full\">\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"feeStructureForm\" \n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Tab Navigation -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-w-full tw-px-2 tw-py-0\">\n <cide-ele-tab [tabs]=\"feeStructureTabs()\" [activeTabId]=\"activeTab()\" size=\"sm\" variant=\"default\"\n (tabChange)=\"onTabChange($event)\">\n </cide-ele-tab>\n </div>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-4 tw-py-4\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n @switch (activeTab()) {\n\n @case ('basic') {\n <!-- Basic Information -->\n <div class=\"tw-space-y-4\">\n <!-- First Row: Fee Code (small), Fee Name, Academic Year - Always on one row -->\n <div class=\"tw-grid\" style=\"grid-template-columns: 170px 1fr 1fr; gap: 1rem;\">\n <cide-ele-input label=\"Fee Structure Code\" formControlName=\"fees_structure_code\"\n placeholder=\"Auto-generated by API\" size=\"sm\" [disabled]=\"isEditMode()\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Fee Structure Name\" formControlName=\"fees_structure_name\"\n placeholder=\"e.g., Grade 10 Fee Structure 2024-25\" size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-select \n label=\"Academic Year\" \n formControlName=\"fees_academic_year_id_acayr\"\n [options]=\"getAcademicYearOptions()\"\n [loading]=\"academicYearLoading()\"\n [disabled]=\"true\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <div>\n <cide-ele-textarea label=\"Description\" formControlName=\"fees_structure_description\"\n placeholder=\"Enter detailed description of the fee structure...\"\n rows=\"2\" size=\"sm\">\n </cide-ele-textarea>\n </div>\n\n <!-- Academic Dropdowns - Using Program Section Selector Component -->\n \n <cide-shared-program-section-selector-wrapper\n [formGroup]=\"feeStructureForm\"\n [classProgramControlName]=\"'fees_class_program_id_acacpm'\"\n [branchControlName]=\"'fees_class_program_branch_id_acabrn'\"\n [termControlName]=\"'fees_class_program_term_id_acapt'\"\n [sectionControlName]=\"'fees_program_term_section_id_acapts'\"\n [academicYearId]=\"feeStructureForm.get('fees_academic_year_id_acayr')?.value\"\n [entityId]=\"feeStructureForm.get('fees_entity_id_syen')?.value\"\n [disabled]=\"isViewMode()\"\n [showLabels]=\"true\"\n [gridCols]=\"'tw-grid-cols-1 md:tw-grid-cols-3'\">\n </cide-shared-program-section-selector-wrapper>\n\n <!-- Reservation Category Dropdown -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-4 tw-mt-4\">\n <cide-ele-select \n label=\"Reservation Category\" \n formControlName=\"fees_student_category_id_sygms\"\n [options]=\"studentCategories()\"\n [loading]=\"studentCategoriesLoading()\"\n placeholder=\"Select reservation category\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-3 tw-p-3 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200\">\n <cide-ele-input formControlName=\"fees_is_active\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col\">\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Active</span>\n <span class=\"tw-text-xs tw-text-gray-500\">Enable/disable this fee structure</span>\n </div>\n </div>\n </div>\n }\n\n @case ('items') {\n <!-- Fee Items Section -->\n <div class=\"tw-space-y-3\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-2\">\n <div>\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 tw-m-0\">Fee Items</h6>\n <p class=\"tw-text-xs tw-text-gray-500 tw-m-0\">Configure individual fee items for this structure</p>\n </div>\n <div class=\"tw-flex tw-items-center tw-gap-3\">\n <div class=\"tw-text-right\">\n <div class=\"tw-text-xs tw-text-gray-500\">Total Amount</div>\n <div class=\"tw-text-base tw-font-bold tw-text-green-600\">{{ formatCurrency(totalAmount()) }}</div>\n </div>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"add\"\n (click)=\"addFeeItem()\">\n Add Fee Item\n </button>\n </div>\n </div>\n\n <div formArrayName=\"fee_items\" class=\"tw-space-y-2 tw-pr-2\">\n @for (item of feeItemsArray.controls; track $index; let itemIndex = $index) {\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm hover:tw-shadow-md tw-transition-shadow tw-p-3\"\n [formGroupName]=\"itemIndex\">\n \n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-2\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <div class=\"tw-bg-blue-100 tw-p-1.5 tw-rounded\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">receipt</cide-ele-icon>\n </div>\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-gray-900\">Item #{{ itemIndex + 1 }}</h6>\n </div>\n <div class=\"tw-flex tw-items-center tw-gap-1\">\n @if (itemIndex > 0) {\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" \n (click)=\"moveItemUp(itemIndex)\" title=\"Move Up\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">arrow_upward</cide-ele-icon>\n </button>\n }\n @if (itemIndex < feeItemsArray.length - 1) {\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" \n (click)=\"moveItemDown(itemIndex)\" title=\"Move Down\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">arrow_downward</cide-ele-icon>\n </button>\n }\n <button cideEleButton type=\"button\" variant=\"danger\" size=\"xs\" leftIcon=\"delete\"\n (click)=\"removeFeeItem(itemIndex)\"\n [disabled]=\"feeItemsArray.length === 1\">\n Remove\n </button>\n </div>\n </div>\n\n <!-- Category, Code, Name in one row -->\n <div class=\"tw-grid\" style=\"grid-template-columns: 1fr 170px 1fr; gap: 1rem;\">\n <cide-ele-select \n label=\"Category\" \n formControlName=\"feesi_category_id_sygms\"\n [options]=\"feeCategoriesOptions()\"\n [loading]=\"feeCategoriesLoading()\"\n size=\"sm\"\n placeholder=\"Select Fee Category\">\n </cide-ele-select>\n\n <cide-ele-input \n label=\"Item Code\" \n formControlName=\"feesi_item_code\"\n size=\"sm\"\n placeholder=\"Auto-filled from category\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Item Name\" \n formControlName=\"feesi_item_name\"\n size=\"sm\"\n placeholder=\"Auto-filled from category\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-mt-2\">\n <cide-ele-textarea \n label=\"Description\" \n formControlName=\"feesi_description\"\n rows=\"1\" \n size=\"sm\">\n </cide-ele-textarea>\n </div>\n\n <!-- Amount Section -->\n <div class=\"tw-mt-2\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2\">\n <cide-ele-input \n [label]=\"item.get('feesi_is_amount_editable')?.value ? 'Base Amount (Default)' : 'Amount'\" \n formControlName=\"feesi_amount\"\n type=\"number\"\n size=\"sm\"\n [title]=\"item.get('feesi_is_amount_editable')?.value ? 'Default amount used when applying fee. Can be edited per student if editable.' : 'Fixed fee amount'\">\n </cide-ele-input>\n </div>\n\n <!-- Amount Editable Option -->\n <div class=\"tw-mt-2 tw-p-2 tw-bg-blue-50 tw-rounded tw-border tw-border-blue-200\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-mb-2\">\n <cide-ele-input formControlName=\"feesi_is_amount_editable\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <div class=\"tw-flex-1\">\n <span class=\"tw-text-xs tw-font-semibold tw-text-blue-900\">Allow Amount to be Edited</span>\n <p class=\"tw-text-xs tw-text-blue-700 tw-mt-0.5\">\n Enable this for fees that vary per student (e.g., Transport fee based on distance). \n When applying fees, you'll be asked to enter the amount within the specified range.\n </p>\n </div>\n </div>\n\n <!-- Min/Max Amount Fields (shown when editable is checked) -->\n @if (item.get('feesi_is_amount_editable')?.value) {\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2 tw-mt-2\">\n <cide-ele-input \n label=\"Minimum Amount\" \n formControlName=\"feesi_min_amount\"\n type=\"number\"\n size=\"sm\"\n placeholder=\"No minimum\"\n title=\"Minimum amount allowed when editing (leave empty for no minimum)\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Maximum Amount\" \n formControlName=\"feesi_max_amount\"\n type=\"number\"\n size=\"sm\"\n placeholder=\"No maximum\"\n title=\"Maximum amount allowed when editing (leave empty for no maximum)\">\n </cide-ele-input>\n </div>\n }\n </div>\n </div>\n\n <!-- Additional Options -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-2 tw-mt-2\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"feesi_is_mandatory\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Mandatory</span>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"feesi_is_refundable\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Refundable</span>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"feesi_is_installment_allowed\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Installment Allowed</span>\n </div>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2 tw-mt-2\">\n @if (item.get('feesi_is_installment_allowed')?.value) {\n <cide-ele-input \n label=\"Installment Count\" \n formControlName=\"feesi_installment_count\"\n type=\"number\"\n size=\"sm\">\n </cide-ele-input>\n }\n\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"feesi_tax_applicable\" type=\"checkbox\" size=\"sm\">\n </cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Tax Applicable</span>\n </div>\n </div>\n\n @if (item.get('feesi_tax_applicable')?.value) {\n <div class=\"tw-mt-2\">\n <cide-ele-input \n label=\"Tax Percentage\" \n formControlName=\"feesi_tax_percentage\"\n type=\"number\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n }\n\n <!-- Installment Details Table -->\n <div class=\"tw-mt-4 tw-p-3 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">schedule</cide-ele-icon>\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">\n @if (item.get('feesi_is_installment_allowed')?.value) {\n Installment Details ({{ item.get('feesi_installment_count')?.value || 1 }} Installments)\n } @else {\n Payment Details (Single Payment)\n }\n </h6>\n </div>\n </div>\n\n <div formArrayName=\"installments\" class=\"tw-space-y-3\">\n @for (installment of getInstallmentsArray(itemIndex).controls; track $index; let installmentIndex = $index) {\n <div class=\"tw-bg-white tw-rounded tw-border tw-border-gray-300 tw-p-3\"\n [formGroupName]=\"installmentIndex\">\n \n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <div class=\"tw-bg-blue-100 tw-p-1 tw-rounded\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-4 tw-h-4\">payments</cide-ele-icon>\n </div>\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-gray-900\">\n @if (item.get('feesi_is_installment_allowed')?.value) {\n Installment #{{ installment.get('installment_number')?.value }}\n } @else {\n Payment Details\n }\n </h6>\n </div>\n <div class=\"tw-text-sm tw-font-medium tw-text-green-600\">\n Amount: {{ formatCurrency(installment.get('installment_amount')?.value || 0) }}\n </div>\n </div>\n\n <!-- Installment Amount Distribution -->\n @if (item.get('feesi_is_installment_allowed')?.value) {\n <div class=\"tw-p-2 tw-bg-yellow-50 tw-rounded tw-border tw-border-yellow-200 tw-mb-2\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-2\">\n <cide-ele-select \n label=\"Distribution Type\" \n formControlName=\"distribution_type\"\n [options]=\"distributionTypeOptions\"\n size=\"sm\">\n </cide-ele-select>\n\n @if (installment.get('distribution_type')?.value === 'PERCENTAGE') {\n <cide-ele-input \n label=\"Percentage (%)\" \n formControlName=\"percentage\"\n type=\"number\"\n size=\"sm\"\n title=\"Percentage of total amount for this installment\">\n </cide-ele-input>\n <div class=\"tw-flex tw-flex-col tw-items-end tw-justify-end tw-gap-1\">\n @if (installmentIndex > 0) {\n <div class=\"tw-text-xs tw-text-blue-600 tw-font-medium\">\n Previous: {{ getPreviousInstallmentsPercentage(itemIndex, installmentIndex) }}%\n </div>\n }\n <div class=\"tw-text-xs tw-text-gray-600\">\n Calculated: {{ formatCurrency((item.get('feesi_amount')?.value || 0) * (installment.get('percentage')?.value || 0) / 100) }}\n </div>\n @if (installmentIndex === getInstallmentsArray(itemIndex).length - 1 && installmentIndex > 0) {\n <div class=\"tw-text-xs tw-font-semibold\" [class.tw-text-green-600]=\"(getPreviousInstallmentsPercentage(itemIndex, installmentIndex) + (installment.get('percentage')?.value || 0)) === 100\" [class.tw-text-red-600]=\"(getPreviousInstallmentsPercentage(itemIndex, installmentIndex) + (installment.get('percentage')?.value || 0)) !== 100\">\n Total: {{ getPreviousInstallmentsPercentage(itemIndex, installmentIndex) + (installment.get('percentage')?.value || 0) }}%\n </div>\n }\n </div>\n }\n\n @if (installment.get('distribution_type')?.value === 'FIXED_AMOUNT') {\n <cide-ele-input \n label=\"Fixed Amount\" \n formControlName=\"fixed_amount\"\n type=\"number\"\n size=\"sm\"\n title=\"Fixed amount for this installment\">\n </cide-ele-input>\n }\n </div>\n </div>\n }\n\n <!-- Due Date Fields -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2 tw-mb-2\">\n <cide-ele-input \n label=\"Due Date Offset (Days from Assignment)\" \n formControlName=\"due_date_offset_days\"\n type=\"number\"\n size=\"sm\"\n title=\"Days from assignment date\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Due Date (Fixed Date - Alternative)\" \n formControlName=\"due_date\"\n type=\"date\"\n size=\"sm\"\n title=\"Use fixed date instead of offset\">\n </cide-ele-input>\n </div>\n\n <!-- Collection Window -->\n <div class=\"tw-p-2 tw-bg-blue-50 tw-rounded tw-border tw-border-blue-200\">\n <div class=\"tw-flex tw-items-center tw-gap-1.5 tw-mb-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-3 tw-h-3\">schedule</cide-ele-icon>\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-blue-900 tw-m-0\">Collection Window</h6>\n </div>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2\">\n <cide-ele-input \n label=\"Start Offset (Days from Assignment)\" \n formControlName=\"collection_start_offset_days\"\n type=\"number\"\n size=\"sm\"\n title=\"Days from assignment date when collection can start\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"End Offset (Days from Assignment)\" \n formControlName=\"collection_end_offset_days\"\n type=\"number\"\n size=\"sm\"\n title=\"Days from assignment date when collection window ends\">\n </cide-ele-input>\n </div>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-2 tw-mt-2\">\n <cide-ele-input \n label=\"Start Date (Fixed Date - Alternative)\" \n formControlName=\"collection_start_date\"\n type=\"date\"\n size=\"sm\"\n title=\"Use fixed date instead of offset\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"End Date (Fixed Date - Alternative)\" \n formControlName=\"collection_end_date\"\n type=\"date\"\n size=\"sm\"\n title=\"Use fixed date instead of offset\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (feeItemsArray.length === 0) {\n <div class=\"tw-text-center tw-py-8 tw-text-gray-500\">\n <div class=\"tw-bg-white tw-p-3 tw-rounded-full tw-w-12 tw-h-12 tw-mx-auto tw-mb-3 tw-flex tw-items-center tw-justify-center\">\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-gray-400\">receipt</cide-ele-icon>\n </div>\n <h6 class=\"tw-text-sm tw-font-medium tw-text-gray-600 tw-mb-1\">No Fee Items Yet</h6>\n <p class=\"tw-text-xs tw-text-gray-500\">Click \"Add Fee Item\" to start adding fee items to this structure.</p>\n </div>\n }\n </div>\n }\n }\n \n <!-- Form Validation Errors -->\n @if (!isViewMode()) {\n <!-- Form Field Errors -->\n <div class=\"tw-w-full tw-mb-4\">\n <cide-form-field-error [formGroup]=\"feeStructureForm\"></cide-form-field-error>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-gap-3 tw-mt-6\">\n @if (!isEditMode()) {\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n }\n\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"onCancel()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n @if (!isInstallmentPercentagesValid()) {\n <div class=\"tw-w-full tw-mb-3 tw-p-2 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded tw-text-sm\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-text-red-700\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">error</cide-ele-icon>\n <span class=\"tw-font-medium\">Validation Error:</span>\n </div>\n <p class=\"tw-text-red-600 tw-mt-1 tw-ml-6\">\n All installment percentages must total exactly 100% before saving. Please adjust the percentages to continue.\n </p>\n </div>\n }\n \n <button cideEleButton type=\"submit\" variant=\"primary\" size=\"sm\" \n [disabled]=\"submitting() || loading() || !isInstallmentPercentagesValid()\" \n [loading]=\"submitting()\" \n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Fee Structure' : 'Create Fee Structure' }}\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </form>\n </div>\n</cide-lyt-shared-wrapper>\n\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport {\n cidePath,\n feesRoutesUrl,\n hostManagerRoutesUrl,\n generateStringFromObject,\n type MFeeStructure\n} from 'cloud-ide-lms-model';\n\n// Types for fee assignment (to be replaced with actual model types when available)\ninterface FeeAssignment {\n _id?: string;\n feeas_student_id?: string | { _id?: string; name?: string; class?: string; section?: string };\n feeas_fee_structure_id_feest?: string | { _id?: string; fees_structure_name?: string }; // Updated to match schema\n feeas_fee_structure_item_id_feesi?: string; // Updated to match schema\n feeas_academic_year_id_acayr?: string;\n feeas_entity_id_syen?: string;\n feeas_fee_category_sygms?: string;\n feeas_fee_name?: string;\n feeas_fee_description?: string;\n feeas_fee_type?: string;\n feeas_original_amount?: number;\n feeas_amount_after_discount?: number;\n feeas_discount_amount?: number;\n feeas_scholarship_amount?: number;\n feeas_tax_amount?: number;\n feeas_final_amount?: number;\n feeas_due_date?: Date;\n feeas_collection_start_date?: Date;\n feeas_collection_end_date?: Date;\n feeas_installment_count?: number;\n feeas_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\n feeas_amount_paid?: number;\n feeas_amount_remaining?: number;\n feeas_late_fee_applied?: number;\n feeas_remarks?: string;\n feeas_is_active?: boolean;\n feeas_assigned_by_user?: string;\n feeas_assigned_at?: Date;\n feeas_updated_at?: Date;\n student_name?: string;\n student_id?: string;\n class?: string;\n section?: string;\n fee_structure_name?: string;\n}\n\ninterface FeeAssignmentListPayload extends MFeeStructure {\n feeas_id?: string;\n feeas_student_id?: string;\n feeas_fee_structure_id_feest?: string; // Updated to match schema\n feeas_status?: string;\n}\n\ninterface FeeAssignmentInsertUpdatePayload {\n _id?: string;\n feeas_student_id?: string;\n feeas_fee_structure_id_feest?: string; // Updated to match schema field name\n feeas_fee_structure_item_id_feesi?: string; // Updated to match schema field name\n feeas_academic_year_id_acayr?: string;\n feeas_entity_id_syen?: string;\n feeas_fee_category_sygms?: string;\n feeas_fee_name?: string;\n feeas_fee_description?: string;\n feeas_fee_type?: string;\n feeas_original_amount?: number;\n feeas_amount_after_discount?: number;\n feeas_discount_amount?: number;\n feeas_scholarship_amount?: number;\n feeas_tax_amount?: number;\n feeas_final_amount?: number;\n feeas_due_date?: Date | string;\n feeas_collection_start_date?: Date | string;\n feeas_collection_end_date?: Date | string;\n feeas_installment_count?: number;\n feeas_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\n feeas_remarks?: string;\n feeas_is_active?: boolean;\n}\n\ninterface FeeAssignmentControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment[];\n total?: number;\n message?: string;\n}\n\ninterface FeeAssignmentByIdControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment;\n message?: string;\n}\n\ninterface FeeAssignmentInsertUpdateControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment;\n message?: string;\n}\n\ninterface FeeAssignmentDeletePayload {\n feeas_id: string;\n}\n\ninterface FeeAssignmentDeleteControllerResponse {\n success: boolean;\n code: number;\n message?: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideFeeFeeAssignmentService {\n private http = inject(HttpClient);\n\n /**\n * Get list of fee assignments\n * @param payload - Query parameters for filtering/pagination\n * @returns Observable of fee assignment list response\n */\n getFeeAssignmentList(payload: FeeAssignmentListPayload): Observable<FeeAssignmentControllerResponse> {\n const query = generateStringFromObject(payload);\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment,\n query\n ]);\n\n return this.http.get<FeeAssignmentControllerResponse>(url);\n }\n\n /**\n * Get fee assignment by ID\n * @param assignmentId - Fee assignment ID\n * @returns Observable of fee assignment data\n */\n getFeeAssignmentById(assignmentId: string): Observable<FeeAssignmentByIdControllerResponse> {\n const query = generateStringFromObject({ feeas_id: assignmentId });\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment,\n 'byId',\n query\n ]);\n\n return this.http.get<FeeAssignmentByIdControllerResponse>(url);\n }\n\n /**\n * Create or update fee assignment\n * @param data - Fee assignment data to save\n * @returns Observable of the save response\n */\n saveUpdateFeeAssignment(data: FeeAssignmentInsertUpdatePayload): Observable<FeeAssignmentInsertUpdateControllerResponse> {\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment\n ]);\n\n return this.http.post<FeeAssignmentInsertUpdateControllerResponse>(url, data);\n }\n\n /**\n * Delete fee assignment\n * @param assignmentId - Fee assignment ID\n * @returns Observable of the delete response\n */\n deleteFeeAssignment(assignmentId: string): Observable<FeeAssignmentDeleteControllerResponse> {\n const query = generateStringFromObject({ feeas_id: assignmentId });\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment,\n 'delete',\n query\n ]);\n\n return this.http.delete<FeeAssignmentDeleteControllerResponse>(url);\n }\n\n /**\n * Waive fee assignment\n * @param assignmentId - Fee assignment ID\n * @returns Observable of the waive response\n */\n waiveFeeAssignment(assignmentId: string): Observable<FeeAssignmentInsertUpdateControllerResponse> {\n const url = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module,\n feesRoutesUrl.assignment,\n 'waive'\n ]);\n\n return this.http.patch<FeeAssignmentInsertUpdateControllerResponse>(url, { feeas_id: assignmentId });\n }\n}\n\n","import { \n Component, \n signal, \n computed, \n viewChild, \n TemplateRef, \n DestroyRef, \n inject, \n OnInit,\n type OnDestroy \n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { \n CideEleDataGridComponent, \n CideIconComponent, \n CideEleButtonComponent, \n CideSelectComponent,\n type GridConfiguration, \n type GridEvent, \n CideEleDropdownComponent, \n type DropdownItem, \n type TemplateContext, \n type DropdownConfig, \n ConfirmationService,\n NotificationService \n} from 'cloud-ide-element';\nimport { \n generateStringFromObject\n} from 'cloud-ide-lms-model';\nimport { AppStateHelperService, CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { ACADEMIC_YEAR_SERVICE_TOKEN, type IAcademicYearService, CLASS_PROGRAM_MASTER_SERVICE_TOKEN, type IClassProgramMasterService } from 'cloud-ide-shared';\nimport { CideFeeFeeAssignmentService } from '../../services/fee-assignment.service';\n\n// Types\ninterface FeeAssignmentData {\n _id?: string;\n feeas_student_id?: string;\n student_name?: string;\n student_id?: string;\n class?: string;\n section?: string;\n fee_structure_name?: string;\n feeas_amount_original?: number;\n feeas_amount_paid?: number;\n feeas_amount_remaining?: number;\n feeas_due_date?: Date;\n feeas_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\n}\n\n@Component({\n selector: 'cide-fee-assignment-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideEleDropdownComponent,\n CideSelectComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './fee-assignment-list.component.html',\n styles: [`\n .fee-assignment-listing-container {\n @apply tw-w-full tw-h-full;\n }\n \n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class FeeAssignmentListComponent implements OnInit, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n private readonly appState = inject(AppStateHelperService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly notificationService = inject(NotificationService);\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\n private readonly classProgramService = inject<IClassProgramMasterService>(CLASS_PROGRAM_MASTER_SERVICE_TOKEN);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly rightsService = inject(RightsService);\n\n readonly studentDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('studentDetailsRendererTemplate');\n readonly amountRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('amountRendererTemplate');\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\n readonly actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n readonly feeAssignments = signal<FeeAssignmentData[]>([]);\n readonly loading = signal<boolean>(false);\n readonly error = signal<string | null>(null);\n\n readonly currentPage = signal<number>(1);\n readonly pageSize = signal<number>(10);\n readonly totalItems = signal<number>(0);\n readonly totalPages = signal<number>(0);\n\n readonly searchQuery = signal<string>('');\n readonly sortColumn = signal<string>('student_name');\n readonly sortDirection = signal<'asc' | 'desc'>('asc');\n\n readonly selectedStatusFilter = signal<string>('');\n readonly selectedAcademicYearFilter = signal<string>('');\n readonly selectedClassFilter = signal<string>('');\n readonly selectedSectionFilter = signal<string>('');\n\n readonly academicYearOptions = signal<Array<{value: string; label: string}>>([]);\n readonly classOptions = signal<Array<{value: string; label: string}>>([]);\n readonly sectionOptions = signal<Array<{value: string; label: string}>>([]);\n\n readonly stats = computed(() => ({\n total: this.feeAssignments().length,\n pending: this.feeAssignments().filter(a => a.feeas_status === 'PENDING').length,\n partial: this.feeAssignments().filter(a => a.feeas_status === 'PARTIALLY_PAID').length,\n paid: this.feeAssignments().filter(a => a.feeas_status === 'PAID').length\n }));\n\n readonly gridConfig = computed<GridConfiguration<FeeAssignmentData>>(() => ({\n id: 'fee-assignment-list-grid',\n columns: [\n {\n key: 'student_id',\n header: 'Student ID',\n type: 'text',\n width: '120px',\n truncate: true,\n align: 'left',\n sortable: true\n },\n {\n key: 'student',\n header: 'Student Details',\n type: 'custom',\n width: 'auto',\n truncate: true,\n align: 'left',\n renderer: 'studentDetailsRenderer',\n sortable: true\n },\n {\n key: 'fee_structure_name',\n header: 'Fee Structure',\n type: 'text',\n width: '200px',\n truncate: true,\n align: 'left',\n sortable: true\n },\n {\n key: 'total_amount',\n header: 'Total Amount',\n type: 'custom',\n width: '150px',\n truncate: false,\n align: 'right',\n renderer: 'amountRenderer',\n sortable: true\n },\n {\n key: 'feeas_due_date',\n header: 'Due Date',\n type: 'date',\n width: '120px',\n truncate: false,\n align: 'left',\n sortable: true\n },\n {\n key: 'feeas_status',\n header: 'Status',\n type: 'custom',\n width: '140px',\n truncate: false,\n align: 'center',\n renderer: 'statusRenderer'\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'custom',\n width: '80px',\n truncate: false,\n align: 'center',\n renderer: 'actionsDropdownRenderer'\n }\n ],\n data: this.feeAssignments(),\n trackBy: '_id',\n pagination: {\n enabled: true,\n pageSize: this.pageSize(),\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search by student name, ID...',\n searchableColumns: ['student_name', 'student_id'],\n debounceMs: 300,\n showClearButton: true\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: this.loading()\n },\n scroll: {\n enabled: true,\n maxHeight: '',\n minHeight: '',\n stickyHeader: true,\n virtualScroll: false,\n rowHeight: 50\n },\n export: {\n enabled: true,\n formats: ['csv', 'excel', 'pdf'],\n filename: 'fee-assignments',\n includeHeaders: true\n },\n responsive: true,\n striped: false,\n bordered: true,\n compact: false,\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\n }));\n\n // Rights computed signals\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n\n ngOnInit(): void {\n // Initialize rights for fee assignment management\n this.rightsService.initializeRights('fee_assignment');\n console.log('๐ฐ Fee Assignment List Component initialized');\n this.initializeBreadcrumbData();\n this.loadDropdownOptions();\n this.loadFeeAssignments();\n }\n\n private initializeBreadcrumbData(): void {\n this.breadcrumbData.set([\n {\n id: 'list',\n label: 'List',\n icon: 'list',\n url: undefined\n }\n ]);\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n private loadDropdownOptions(): void {\n // Load academic years\n this.academicYearService.getAcademicYearList({ pageIndex: 1, pageSize: 100, pagination: false }).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.academicYearOptions.set(response.data.map(ay => ({\n value: ay._id || '',\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\n })));\n }\n }\n });\n\n // Load class programs\n this.classProgramService.searchClassProgramMasters({ pagination: false }).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.classOptions.set(response.data.map(cp => ({\n value: cp._id || '',\n label: cp.acacpm_alise_title || ''\n })));\n }\n }\n });\n }\n\n loadFeeAssignments(): void {\n this.loading.set(true);\n this.error.set(null);\n\n const payload: any = {\n pagination: true,\n pageIndex: this.currentPage(),\n pageSize: this.pageSize(),\n query: this.searchQuery() || '',\n feeas_status: this.selectedStatusFilter() || undefined\n };\n\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n // Transform API response to component format\n this.feeAssignments.set(\n response.data.map((item: any) => ({\n _id: item._id,\n feeas_student_id: item.feeas_student_id,\n student_name: item.student_name || item.feeas_student_id?.name || 'N/A',\n student_id: item.student_id || item.feeas_student_id?._id || '',\n class: item.class || item.feeas_student_id?.class || 'N/A',\n section: item.section || item.feeas_student_id?.section || 'N/A',\n fee_structure_name: item.fee_structure_name || item.feeas_structure_id_fees?.fees_structure_name || 'N/A',\n feeas_amount_original: item.feeas_amount_original || 0,\n feeas_amount_paid: item.feeas_amount_paid || 0,\n feeas_amount_remaining: item.feeas_amount_remaining || item.feeas_final_amount || 0,\n feeas_due_date: item.feeas_due_date ? new Date(item.feeas_due_date) : undefined,\n feeas_status: item.feeas_status || 'PENDING'\n }))\n );\n this.totalItems.set(response.total || response.data.length);\n this.totalPages.set(Math.ceil((response.total || response.data.length) / this.pageSize()));\n } else {\n this.feeAssignments.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n }\n },\n error: (err) => {\n console.error('Error loading fee assignments:', err);\n this.error.set('Failed to load fee assignments');\n this.notificationService.error('Failed to load fee assignments');\n this.feeAssignments.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n }\n\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\n studentDetailsRenderer: this.studentDetailsRendererTemplate(),\n amountRenderer: this.amountRendererTemplate(),\n statusRenderer: this.statusRendererTemplate(),\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate()\n }));\n\n onGridEvent(event: GridEvent<any>): void {\n switch (event.type) {\n case 'pageChange':\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\n this.currentPage.set(event.data['pageIndex'] as number);\n this.pageSize.set(event.data['pageSize'] as number);\n this.loadFeeAssignments();\n }\n break;\n case 'search':\n this.searchQuery.set(event.data as string);\n this.currentPage.set(1);\n this.loadFeeAssignments();\n break;\n case 'refresh':\n this.loadFeeAssignments();\n break;\n case 'sort':\n if (event.data && typeof event.data === 'object' && 'column' in event.data && 'direction' in event.data) {\n this.sortColumn.set(event.data['column'] as string);\n this.sortDirection.set(event.data['direction'] as 'asc' | 'desc');\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n break;\n case 'export':\n if (event.data && typeof event.data === 'string') {\n this.handleExport(event.data);\n }\n break;\n default:\n console.log('๐ Unhandled grid event:', event.type);\n }\n }\n\n onStatusFilterChange(value: string | number | string[] | null | undefined): void {\n this.selectedStatusFilter.set(String(value || ''));\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n onAcademicYearFilterChange(value: string | number | string[] | null | undefined): void {\n this.selectedAcademicYearFilter.set(String(value || ''));\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n onClassFilterChange(value: string | number | string[] | null | undefined): void {\n this.selectedClassFilter.set(String(value || ''));\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n onSectionFilterChange(value: string | number | string[] | null | undefined): void {\n this.selectedSectionFilter.set(String(value || ''));\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n clearFilters(): void {\n this.selectedStatusFilter.set('');\n this.selectedAcademicYearFilter.set('');\n this.selectedClassFilter.set('');\n this.selectedSectionFilter.set('');\n this.searchQuery.set('');\n this.currentPage.set(1);\n this.loadFeeAssignments();\n }\n\n navigateToAssign(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to create fee assignments');\n return;\n }\n this.router.navigate(['/control-panel/assignment/create']);\n }\n\n bulkAssign(): void {\n if (!this.rightsService.hasRight('BULK_ASSIGN')) {\n this.notificationService.error('You do not have permission to perform bulk assignments');\n return;\n }\n this.notificationService.info('Bulk assignment feature will open in a new window.');\n }\n\n viewDetails(assignment: FeeAssignmentData): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view fee assignments');\n return;\n }\n console.log('View details:', assignment);\n const queryParams = generateStringFromObject({ feeas_id: assignment._id });\n this.router.navigate(['/control-panel/assignment/view', queryParams]);\n }\n\n modifyAssignment(assignment: FeeAssignmentData): void {\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to modify fee assignments');\n return;\n }\n console.log('Modify assignment:', assignment);\n const queryParams = generateStringFromObject({ feeas_id: assignment._id });\n this.router.navigate(['/control-panel/assignment/edit', queryParams]);\n }\n\n waiveOff(assignment: FeeAssignmentData): void {\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to waive fees');\n return;\n }\n this.confirmationService.ask({\n title: 'Waive Off Fee',\n message: `Are you sure you want to waive off the fee for ${assignment.student_name}? This action cannot be undone.`,\n confirmText: 'Waive Off',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.feeAssignmentService.waiveFeeAssignment(assignment._id || '').subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success('Fee waived off successfully.');\n this.loadFeeAssignments();\n } else {\n this.notificationService.error(response?.message || 'Failed to waive fee');\n }\n },\n error: (err) => {\n console.error('Error waiving fee:', err);\n this.notificationService.error('Failed to waive fee. Please try again.');\n }\n });\n }\n });\n }\n\n getDropdownConfig(): DropdownConfig {\n return {\n triggerIcon: 'more_vert',\n triggerSize: 'sm'\n };\n }\n\n getActionDropdownItems(assignment: FeeAssignmentData): DropdownItem[] {\n const items: DropdownItem[] = [];\n \n if (this.canView()) {\n items.push({\n id: 'view',\n label: 'View Details',\n icon: 'visibility',\n iconColor: 'tw-text-gray-400',\n textColor: 'tw-text-gray-700',\n hoverBgColor: 'hover:tw-bg-gray-100'\n });\n }\n \n if (this.canEdit()) {\n items.push({\n id: 'modify',\n label: 'Modify',\n icon: 'edit',\n iconColor: 'tw-text-blue-400',\n textColor: 'tw-text-blue-600',\n hoverBgColor: 'hover:tw-bg-blue-50'\n });\n \n items.push({\n id: 'waive',\n label: 'Waive Off',\n icon: 'cancel',\n iconColor: 'tw-text-red-400',\n textColor: 'tw-text-red-600',\n hoverBgColor: 'hover:tw-bg-red-50'\n });\n }\n \n return items;\n }\n\n onDropdownItemClick(item: DropdownItem, assignment: FeeAssignmentData): void {\n switch (item.id) {\n case 'view':\n this.viewDetails(assignment);\n break;\n case 'modify':\n this.modifyAssignment(assignment);\n break;\n case 'waive':\n this.waiveOff(assignment);\n break;\n default:\n console.log('โ Unknown dropdown item clicked:', item.id);\n }\n }\n\n private handleExport(format: string): void {\n console.log(`๐ค Exporting fee assignments as ${format}`);\n // TODO: Implement export functionality\n }\n\n formatCurrency(amount: number | undefined): string {\n if (!amount) return 'โน0.00';\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n formatDate(date: string | Date | null | undefined): string {\n if (!date) return '-';\n return new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n }\n\n getStatusBadgeClass(assignment: FeeAssignmentData): string {\n switch (assignment.feeas_status) {\n case 'PAID':\n return 'tw-bg-green-100 tw-text-green-800';\n case 'PARTIALLY_PAID':\n return 'tw-bg-blue-100 tw-text-blue-800';\n case 'PENDING':\n return 'tw-bg-yellow-100 tw-text-yellow-800';\n case 'WAIVED':\n return 'tw-bg-purple-100 tw-text-purple-800';\n case 'CANCELLED':\n return 'tw-bg-red-100 tw-text-red-800';\n default:\n return 'tw-bg-gray-100 tw-text-gray-800';\n }\n }\n\n getStatusText(assignment: FeeAssignmentData): string {\n return assignment.feeas_status || 'Unknown';\n }\n}\n","<!-- Fee Assignment Container -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_assignment' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"navigateToAssign()\">\n Assign Fees\n </button>\n <button cideEleButton variant=\"secondary\" size=\"sm\" leftIcon=\"group_add\" (click)=\"bulkAssign()\">\n Bulk Assignment\n </button>\n </div>\n\n <div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Stats Row -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-6 tw-py-4 tw-bg-gray-50 tw-border-b tw-border-gray-200\">\n <div class=\"tw-grid tw-grid-cols-1 sm:tw-grid-cols-4 tw-gap-4\">\n <div class=\"tw-bg-white tw-p-4 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-text-xs tw-text-gray-500 tw-mb-1\">Total Assigned</div>\n <div class=\"tw-text-2xl tw-font-bold tw-text-gray-900\">{{ stats().total }}</div>\n </div>\n <div class=\"tw-bg-white tw-p-4 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-text-xs tw-text-gray-500 tw-mb-1\">Pending</div>\n <div class=\"tw-text-2xl tw-font-bold tw-text-yellow-600\">{{ stats().pending }}</div>\n </div>\n <div class=\"tw-bg-white tw-p-4 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-text-xs tw-text-gray-500 tw-mb-1\">Partially Paid</div>\n <div class=\"tw-text-2xl tw-font-bold tw-text-blue-600\">{{ stats().partial }}</div>\n </div>\n <div class=\"tw-bg-white tw-p-4 tw-rounded-lg tw-border tw-border-gray-200\">\n <div class=\"tw-text-xs tw-text-gray-500 tw-mb-1\">Paid</div>\n <div class=\"tw-text-2xl tw-font-bold tw-text-green-600\">{{ stats().paid }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Filters Row -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-px-6 tw-py-4 tw-bg-gray-50 tw-border-b tw-border-gray-200\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-4 tw-gap-4\">\n <cide-ele-select \n label=\"Academic Year\" \n [options]=\"academicYearOptions()\"\n [ngModel]=\"selectedAcademicYearFilter()\"\n (ngModelChange)=\"onAcademicYearFilterChange($event)\"\n size=\"sm\"\n placeholder=\"All Academic Years\">\n </cide-ele-select>\n\n <cide-ele-select \n label=\"Class/Program\" \n [options]=\"classOptions()\"\n [ngModel]=\"selectedClassFilter()\"\n (ngModelChange)=\"onClassFilterChange($event)\"\n size=\"sm\"\n placeholder=\"All Classes\">\n </cide-ele-select>\n\n <cide-ele-select \n label=\"Section\" \n [options]=\"sectionOptions()\"\n [ngModel]=\"selectedSectionFilter()\"\n (ngModelChange)=\"onSectionFilterChange($event)\"\n size=\"sm\"\n placeholder=\"All Sections\">\n </cide-ele-select>\n\n <cide-ele-select \n label=\"Status\" \n [options]=\"[\n {value: '', label: 'All Status'},\n {value: 'PENDING', label: 'Pending'},\n {value: 'PARTIALLY_PAID', label: 'Partially Paid'},\n {value: 'PAID', label: 'Paid'},\n {value: 'WAIVED', label: 'Waived'}\n ]\"\n [ngModel]=\"selectedStatusFilter()\"\n (ngModelChange)=\"onStatusFilterChange($event)\"\n size=\"sm\"\n placeholder=\"All Status\">\n </cide-ele-select>\n </div>\n <div class=\"tw-mt-3\">\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"clearFilters()\">\n Clear Filters\n </button>\n </div>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-h-full tw-relative\">\n\n <!-- Data Grid Component -->\n <div class=\"tw-h-full tw-overflow-auto\">\n <cide-ele-data-grid [config]=\"gridConfig()\" [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n\n </div>\n </div>\n\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #studentDetailsRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-w-full\">\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.student_name || 'N/A' }}</div>\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate\">{{ row.class || '' }} / {{ row.section || '' }}</div>\n </div>\n</ng-template>\n\n<ng-template #amountRendererTemplate let-row=\"row\">\n <div class=\"tw-flex tw-flex-col tw-text-sm tw-items-end\">\n <span class=\"tw-text-gray-900 tw-font-semibold\">{{ formatCurrency(row.feeas_amount_original) }}</span>\n <div class=\"tw-text-xs tw-text-gray-500\">\n Paid: {{ formatCurrency(row.feeas_amount_paid) }}\n </div>\n <div class=\"tw-text-xs tw-font-semibold\" [ngClass]=\"row.feeas_amount_remaining > 0 ? 'tw-text-red-600' : 'tw-text-green-600'\">\n Outstanding: {{ formatCurrency(row.feeas_amount_remaining) }}\n </div>\n </div>\n</ng-template>\n\n<ng-template #statusRendererTemplate let-row=\"row\">\n <span class=\"tw-inline-flex tw-items-center tw-justify-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-text-center\"\n [ngClass]=\"getStatusBadgeClass(row)\">\n <cide-ele-icon size=\"2xs\" class=\"tw-mr-1\">\n {{ row.feeas_status === 'PAID' ? 'check_circle' : \n row.feeas_status === 'PARTIALLY_PAID' ? 'schedule' : \n row.feeas_status === 'PENDING' ? 'pending' : 'cancel' }}\n </cide-ele-icon>\n {{ getStatusText(row) }}\n </span>\n</ng-template>\n\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\n <cide-ele-dropdown \n [items]=\"getActionDropdownItems(row)\"\n [config]=\"getDropdownConfig()\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template>\n\n","import { \n Component, \n inject, \n signal, \n OnInit, \n DestroyRef, \n OnDestroy,\n computed\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { \n FormBuilder, \n FormGroup, \n ReactiveFormsModule, \n Validators,\n FormControl\n} from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { forkJoin } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { \n CideTextareaComponent, \n CideEleButtonComponent, \n CideIconComponent,\n NotificationService,\n ConfirmationService,\n CideFormFieldErrorComponent\n} from 'cloud-ide-element';\nimport { ComponentContextService } from 'cloud-ide-layout';\nimport { \n ENTITY_SERVICE_TOKEN, \n type IEntityService, \n ACADEMIC_YEAR_SERVICE_TOKEN, \n type IAcademicYearService\n} from 'cloud-ide-shared';\nimport {\n generateObjectFromString,\n generateStringFromObject,\n MAcademicYear,\n MFeeStructure,\n type feeStructureControllerResponse,\n type feeStructureByIdControllerResponse,\n type FeeStructure as FeeStructureType,\n FeeStructureResponse,\n FeeStructureItem,\n type FeeStructureByIdResponse,\n MFeeStructureGetByIdPayload\n} from 'cloud-ide-lms-model';\nimport { CideSelectComponent } from 'cloud-ide-element';\nimport { CideInputComponent } from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { ProgramSectionSelectorWrapperComponent } from 'cloud-ide-shared';\nimport { CideFeeFeeStructureService } from '../../../fee-structure-management/services/fee-structure.service';\nimport { CideFeeFeeAssignmentService } from '../../services/fee-assignment.service';\n\n// Types\ninterface Entity {\n _id?: string;\n syen_name?: string;\n syen_code?: string;\n}\n\ninterface AcademicYear {\n _id?: string;\n acayr_name?: string;\n acayr_code?: string;\n}\n\ninterface LocalFeeStructure {\n _id?: string;\n fees_structure_name?: string;\n fees_structure_code?: string;\n}\n\n// Fee assignment fee item type - extends FeeStructureItem to include all item properties\ntype FeeAssignmentFeeItem = FeeStructureItem & {\n fees_structure_name?: string;\n fees_category_name?: string;\n fees_total_amount?: number;\n fees_amount?: number;\n fees_structure_id?: string;\n discount_amount?: number;\n scholarship_amount?: number;\n};\n\n@Component({\n selector: 'cide-fee-assignment-create',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideSelectComponent,\n CideIconComponent,\n CideLytSharedWrapperComponent,\n ProgramSectionSelectorWrapperComponent,\n CideFormFieldErrorComponent\n ],\n templateUrl: './fee-assignment-create.component.html'\n})\nexport class FeeAssignmentCreateComponent implements OnInit, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n private readonly fb = inject(FormBuilder);\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly entityService = inject<IEntityService>(ENTITY_SERVICE_TOKEN);\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly componentContextService = inject(ComponentContextService);\n\n assignmentForm!: FormGroup;\n readonly loading = signal<boolean>(false);\n readonly submitting = signal<boolean>(false);\n\n readonly assignmentId = signal<string>('');\n readonly isEditMode = signal<boolean>(false);\n readonly isViewMode = signal<boolean>(false);\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n readonly entityOptions = signal<Entity[]>([]);\n readonly academicYearOptions = signal<AcademicYear[]>([]);\n readonly feeStructureOptions = signal<LocalFeeStructure[]>([]);\n readonly entityLoading = signal<boolean>(false);\n readonly academicYearLoading = signal<boolean>(false);\n readonly feeStructureLoading = signal<boolean>(false);\n\n // Fee insights\n readonly applicableFees = signal<FeeAssignmentFeeItem[]>([]);\n readonly feesLoading = signal<boolean>(false);\n readonly discountControls = signal<Map<string, FormControl>>(new Map());\n readonly scholarshipControls = signal<Map<string, FormControl>>(new Map());\n\n readonly feeSourceOptions = [\n { value: 'STRUCTURE', label: 'From Fee Structure' },\n { value: 'CUSTOM', label: 'Custom Fee' }\n ];\n\n readonly feeCategoryOptions = [\n { value: 'TUITION', label: 'Tuition' },\n { value: 'EXAM', label: 'Exam' },\n { value: 'LIBRARY', label: 'Library' },\n { value: 'LAB', label: 'Lab' },\n { value: 'SPORTS', label: 'Sports' },\n { value: 'TRANSPORT', label: 'Transport' },\n { value: 'HOSTEL', label: 'Hostel' },\n { value: 'OTHER', label: 'Other' }\n ];\n\n readonly feeTypeOptions = [\n { value: 'ONE_TIME', label: 'One Time' },\n { value: 'RECURRING', label: 'Recurring' }\n ];\n\n readonly showCustomFeeFields = computed(() => {\n return this.assignmentForm?.get('fee_source')?.value === 'CUSTOM';\n });\n\n readonly showFeeStructureField = computed(() => {\n return this.assignmentForm?.get('fee_source')?.value === 'STRUCTURE';\n });\n\n readonly totalAmount = computed(() => {\n const original = parseFloat(this.assignmentForm?.get('feeas_original_amount')?.value || '0') || 0;\n const discount = parseFloat(this.assignmentForm?.get('feeas_discount_amount')?.value || '0') || 0;\n const scholarship = parseFloat(this.assignmentForm?.get('feeas_scholarship_amount')?.value || '0') || 0;\n return Math.max(0, original - discount - scholarship);\n });\n\n constructor() {\n this.initializeForm();\n }\n\n private initializeForm(): void {\n this.assignmentForm = this.fb.group({\n // Student Information\n student_id: ['', [Validators.required]],\n student_search: [''],\n feeas_academic_year_id_acayr: ['', [Validators.required]],\n feeas_entity_id_syen: ['', [Validators.required]],\n \n // Academic Information (for fee structure loading)\n class_program_id: [''],\n branch_id: [''],\n term_id: [''],\n section_id: [''],\n \n // Fee Information\n fee_source: ['STRUCTURE', [Validators.required]],\n feeas_fee_structure_id_feest: [''],\n \n // Custom Fee Fields\n feeas_fee_category_sygms: [''],\n feeas_fee_name: [''],\n feeas_fee_type: ['ONE_TIME'],\n feeas_original_amount: [0, [Validators.required, Validators.min(0)]],\n \n // Payment Details\n feeas_due_date: ['', [Validators.required]],\n feeas_installment_count: [1, [Validators.min(1), Validators.max(12)]],\n \n // Discounts & Scholarships\n feeas_discount_amount: [0, [Validators.min(0)]],\n feeas_scholarship_amount: [0, [Validators.min(0)]],\n \n // Additional\n feeas_remarks: ['']\n });\n\n // Set conditional validators based on fee source\n this.assignmentForm.get('fee_source')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(source => {\n if (source === 'STRUCTURE') {\n this.assignmentForm.get('feeas_fee_structure_id_feest')?.setValidators([Validators.required]);\n this.assignmentForm.get('feeas_fee_category_sygms')?.clearValidators();\n this.assignmentForm.get('feeas_fee_name')?.clearValidators();\n this.assignmentForm.get('feeas_original_amount')?.clearValidators();\n } else if (source === 'CUSTOM') {\n this.assignmentForm.get('feeas_fee_structure_id_feest')?.clearValidators();\n this.assignmentForm.get('feeas_fee_category_sygms')?.setValidators([Validators.required]);\n this.assignmentForm.get('feeas_fee_name')?.setValidators([Validators.required]);\n this.assignmentForm.get('feeas_original_amount')?.setValidators([Validators.required, Validators.min(0)]);\n }\n this.assignmentForm.updateValueAndValidity();\n });\n\n // Watch for program/term/section changes to load fees\n this.assignmentForm.get('term_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.assignmentForm.get('fee_source')?.value === 'STRUCTURE') {\n this.loadApplicableFees();\n }\n });\n\n this.assignmentForm.get('section_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.assignmentForm.get('fee_source')?.value === 'STRUCTURE' && this.assignmentForm.get('term_id')?.value) {\n this.loadApplicableFees();\n }\n });\n\n // Watch for student search changes\n this.assignmentForm.get('student_search')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n this.onStudentSearch(value);\n });\n }\n\n private rightsService = inject(RightsService);\n\n ngOnInit(): void {\n // Initialize rights for fee assignment management\n this.rightsService.initializeRights('fee_assignment');\n this.initializeComponent();\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n private initializeComponent(): void {\n this.updateBreadcrumbData();\n\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\n const queryParams = params['query'];\n \n if (queryParams) {\n const queryData = generateObjectFromString(queryParams);\n if (queryData?.feeas_id) {\n this.assignmentId.set(queryData.feeas_id as string);\n this.isEditMode.set(true);\n this.loadAssignmentData(queryData.feeas_id as string);\n }\n } else {\n this.isEditMode.set(false);\n }\n\n // Always load dropdown options\n this.loadDropdownOptions();\n });\n\n // Check if view mode\n const path = this.route.snapshot.url.map(segment => segment.path).join('/');\n this.isViewMode.set(path.includes('view'));\n \n if (this.isViewMode()) {\n this.assignmentForm.disable();\n }\n\n // Update breadcrumb after mode is determined\n this.updateBreadcrumbData();\n }\n\n private loadDropdownOptions(): void {\n // Load entity options\n this.entityLoading.set(true);\n this.entityService.getEntityList({}).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.entityOptions.set(response.data);\n }\n this.entityLoading.set(false);\n },\n error: () => {\n this.entityLoading.set(false);\n }\n });\n\n // Load academic year options\n this.academicYearLoading.set(true);\n const academicYearPayload: MAcademicYear = {\n pageIndex: 1,\n pageSize: 100,\n pagination: false\n };\n this.academicYearService.getAcademicYearList(academicYearPayload).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.academicYearOptions.set(response.data);\n }\n this.academicYearLoading.set(false);\n },\n error: () => {\n this.academicYearLoading.set(false);\n }\n });\n\n // Load fee structure options\n this.loadFeeStructures();\n }\n\n private loadFeeStructures(): void {\n this.feeStructureLoading.set(true);\n const payload = new MFeeStructure({\n fees_is_active: true,\n pagination: false\n });\n \n this.feeStructureService.getFeeStructureList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n this.feeStructureOptions.set(\n response.data.map(fs => ({\n _id: fs._id,\n fees_structure_name: fs.fees_structure_name || '',\n fees_structure_code: fs.fees_structure_code || ''\n }))\n );\n } else {\n this.feeStructureOptions.set([]);\n }\n },\n error: (err) => {\n console.error('Error loading fee structures:', err);\n this.notificationService.error('Failed to load fee structures');\n this.feeStructureOptions.set([]);\n },\n complete: () => {\n this.feeStructureLoading.set(false);\n }\n });\n }\n\n private loadAssignmentData(id: string): void {\n this.loading.set(true);\n this.feeAssignmentService.getFeeAssignmentById(id).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const data = response.data;\n // Extract fee structure ID from response (could be string or populated object)\n const feeStructureId = typeof data.feeas_fee_structure_id_feest === 'string' \n ? data.feeas_fee_structure_id_feest \n : (data.feeas_fee_structure_id_feest as any)?._id || '';\n \n this.assignmentForm.patchValue({\n student_id: data.feeas_student_id || '',\n fee_source: feeStructureId ? 'STRUCTURE' : 'CUSTOM',\n feeas_fee_structure_id_feest: feeStructureId || '',\n feeas_fee_category_sygms: data.feeas_fee_category_sygms || '',\n feeas_fee_name: data.feeas_fee_name || '',\n feeas_fee_description: data.feeas_fee_description || '',\n feeas_fee_type: data.feeas_fee_type || 'ONE_TIME',\n feeas_original_amount: data.feeas_original_amount || 0,\n feeas_discount_amount: data.feeas_discount_amount || 0,\n feeas_scholarship_amount: data.feeas_scholarship_amount || 0,\n feeas_due_date: data.feeas_due_date ? new Date(data.feeas_due_date).toISOString().split('T')[0] : '',\n feeas_installment_count: data.feeas_installment_count || 1,\n feeas_remarks: data.feeas_remarks || ''\n });\n }\n },\n error: (err) => {\n console.error('Error loading assignment data:', err);\n this.notificationService.error('Failed to load assignment data');\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n }\n\n onStudentSearch(query: string | number | boolean | null | undefined): void {\n const searchQuery = String(query || '');\n if (searchQuery.length < 3) return;\n \n this.loading.set(true);\n // TODO: Implement student search API call\n // For now, this is a placeholder - should be replaced with actual student search service\n setTimeout(() => {\n this.assignmentForm.patchValue({ student_id: 'STU001' });\n this.loading.set(false);\n }, 500);\n }\n\n /**\n * Handler for program section selector value changes\n */\n onProgramSectionValuesChange(values: { classProgramId?: string | null; branchId?: string | null; termId?: string | null; sectionId?: string | null }): void {\n if (this.assignmentForm.get('fee_source')?.value === 'STRUCTURE') {\n this.loadApplicableFees();\n }\n }\n\n /**\n * Load applicable fees based on selected program/term/section\n */\n loadApplicableFees(): void {\n const classProgramId = this.assignmentForm.get('class_program_id')?.value;\n const branchId = this.assignmentForm.get('branch_id')?.value;\n const programTermId = this.assignmentForm.get('term_id')?.value;\n const sectionId = this.assignmentForm.get('section_id')?.value;\n const entityId = this.assignmentForm.get('feeas_entity_id_syen')?.value;\n const academicYearId = this.assignmentForm.get('feeas_academic_year_id_acayr')?.value;\n\n if (!classProgramId || !programTermId || !entityId || !academicYearId) {\n this.applicableFees.set([]);\n return;\n }\n\n this.feesLoading.set(true);\n\n // Build payload with all academic filters\n const payloadData: Partial<MFeeStructure> = {\n fees_class_program_id_acacpm: classProgramId,\n fees_class_program_term_id_acapt: programTermId,\n fees_entity_id_syen: entityId,\n fees_academic_year_id_acayr: academicYearId,\n fees_is_active: true,\n pagination: false,\n pageIndex: 1,\n pageSize: 100\n };\n\n // Include branch if selected\n if (branchId) {\n payloadData.fees_class_program_branch_id_acabrn = branchId;\n }\n\n // Include section if selected\n if (sectionId) {\n payloadData.fees_program_term_section_id_acapts = sectionId;\n }\n\n const payload = new MFeeStructure(payloadData);\n\n this.feeStructureService.getFeeStructureList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: feeStructureControllerResponse) => {\n if (response?.success && response?.data) {\n const feeStructures = Array.isArray(response.data) ? response.data : [];\n \n if (feeStructures.length === 0) {\n this.applicableFees.set([]);\n this.feesLoading.set(false);\n return;\n }\n \n // Fetch fee items for all structures in parallel\n const feeItemRequests = feeStructures.map(structure => \n this.feeStructureService.getFeeStructureById({ fees_id: structure._id || '' })\n .pipe(takeUntilDestroyed(this.destroyRef))\n );\n \n forkJoin(feeItemRequests).subscribe({\n next: (responses: feeStructureByIdControllerResponse[]) => {\n const allFeeItems: FeeAssignmentFeeItem[] = [];\n \n responses.forEach((itemResponse, index) => {\n if (itemResponse?.success && itemResponse?.data) {\n const structure = feeStructures[index];\n const isFeeStructureByIdResponse = (data: FeeStructureByIdResponse | FeeStructureResponse): data is FeeStructureByIdResponse => {\n return data !== null && typeof data === 'object' && 'fee_structure' in data;\n };\n \n let feeItems: FeeStructureItem[] = [];\n if (isFeeStructureByIdResponse(itemResponse.data)) {\n feeItems = itemResponse.data.fee_structure_items || [];\n }\n \n // Transform fee items to FeeAssignmentFeeItem format\n feeItems.forEach(item => {\n if (item.feesi_is_active !== false) {\n let categoryName = 'N/A';\n if (item.feesi_category_id_sygms) {\n if (typeof item.feesi_category_id_sygms === 'object' && item.feesi_category_id_sygms !== null) {\n categoryName = (item.feesi_category_id_sygms as any)?.sygms_title || \n (item.feesi_category_id_sygms as any)?.sygms_name || \n item.feesi_item_code || \n 'N/A';\n }\n } else {\n categoryName = item.feesi_item_code || 'N/A';\n }\n\n const feeItem: FeeAssignmentFeeItem = {\n ...item,\n fees_structure_id: structure._id,\n fees_structure_name: structure.fees_structure_name || '',\n fees_category_name: categoryName,\n fees_amount: item.feesi_amount || 0,\n fees_total_amount: item.feesi_amount || 0,\n discount_amount: 0,\n scholarship_amount: 0\n };\n\n allFeeItems.push(feeItem);\n\n // Create discount and scholarship controls for each fee item\n const feeId = item._id || '';\n if (feeId && !this.discountControls().has(feeId)) {\n const discountControl = this.fb.control(0, [Validators.min(0)]);\n this.discountControls.update(map => {\n const newMap = new Map(map);\n newMap.set(feeId, discountControl);\n return newMap;\n });\n this.assignmentForm.addControl(`discount_${feeId}`, discountControl);\n }\n\n if (feeId && !this.scholarshipControls().has(feeId)) {\n const scholarshipControl = this.fb.control(0, [Validators.min(0)]);\n this.scholarshipControls.update(map => {\n const newMap = new Map(map);\n newMap.set(feeId, scholarshipControl);\n return newMap;\n });\n this.assignmentForm.addControl(`scholarship_${feeId}`, scholarshipControl);\n }\n }\n });\n }\n });\n\n this.applicableFees.set(allFeeItems);\n },\n error: (err) => {\n console.error('Error loading fee items:', err);\n this.notificationService.error('Failed to load fee items');\n this.applicableFees.set([]);\n },\n complete: () => {\n this.feesLoading.set(false);\n }\n });\n } else {\n this.applicableFees.set([]);\n this.feesLoading.set(false);\n }\n },\n error: (err) => {\n console.error('Error loading fee structures:', err);\n this.notificationService.error('Failed to load fee structures');\n this.applicableFees.set([]);\n this.feesLoading.set(false);\n }\n });\n }\n\n /**\n * Get discount control for a fee item\n */\n getDiscountControl(feeId: string): FormControl {\n return this.discountControls().get(feeId) || this.fb.control(0);\n }\n\n /**\n * Get scholarship control for a fee item\n */\n getScholarshipControl(feeId: string): FormControl {\n return this.scholarshipControls().get(feeId) || this.fb.control(0);\n }\n\n /**\n * Get fee ID for tracking\n */\n getFeeId(fee: FeeAssignmentFeeItem): string {\n return fee._id || '';\n }\n\n /**\n * Get fee name\n */\n getFeeName(fee: FeeAssignmentFeeItem): string {\n return fee.feesi_item_name || fee.feesi_item_code || 'N/A';\n }\n\n /**\n * Get fee category\n */\n getFeeCategory(fee: FeeAssignmentFeeItem): string {\n return fee.fees_category_name || 'N/A';\n }\n\n /**\n * Get fee amount\n */\n getFeeAmount(fee: FeeAssignmentFeeItem): number {\n return fee.fees_amount || fee.fees_total_amount || 0;\n }\n\n /**\n * Calculate final amount for a fee item\n */\n calculateFinalAmount(fee: FeeAssignmentFeeItem): number {\n const original = this.getFeeAmount(fee);\n const discount = parseFloat(this.getDiscountControl(this.getFeeId(fee))?.value || '0') || 0;\n const scholarship = parseFloat(this.getScholarshipControl(this.getFeeId(fee))?.value || '0') || 0;\n return Math.max(0, original - discount - scholarship);\n }\n\n /**\n * Calculate total original amount\n */\n totalOriginalAmount = computed(() => {\n return this.applicableFees().reduce((sum, fee) => {\n return sum + this.getFeeAmount(fee);\n }, 0);\n });\n\n /**\n * Calculate total discount\n */\n totalDiscount = computed(() => {\n return this.applicableFees().reduce((sum, fee) => {\n const discount = parseFloat(this.getDiscountControl(this.getFeeId(fee))?.value || '0') || 0;\n return sum + discount;\n }, 0);\n });\n\n /**\n * Calculate total scholarship\n */\n totalScholarship = computed(() => {\n return this.applicableFees().reduce((sum, fee) => {\n const scholarship = parseFloat(this.getScholarshipControl(this.getFeeId(fee))?.value || '0') || 0;\n return sum + scholarship;\n }, 0);\n });\n\n /**\n * Calculate total final amount\n */\n totalFinalAmount = computed(() => {\n return this.applicableFees().reduce((sum, fee) => {\n return sum + this.calculateFinalAmount(fee);\n }, 0);\n });\n\n onSubmit(): void {\n const requiredRight = this.isEditMode() ? 'EDIT' : 'CREATE';\n if (!this.rightsService.hasRight(requiredRight)) {\n this.notificationService.error(`You do not have permission to ${this.isEditMode() ? 'edit' : 'create'} fee assignments`);\n return;\n }\n if (this.assignmentForm.invalid || this.submitting()) {\n this.assignmentForm.markAllAsTouched();\n this.notificationService.warning('Please fill in all required fields correctly.');\n return;\n }\n\n this.submitting.set(true);\n\n const formValue = this.assignmentForm.getRawValue();\n \n // If using fee structure, create assignments for each fee item\n if (formValue.fee_source === 'STRUCTURE' && this.applicableFees().length > 0) {\n // Create multiple fee assignments for each fee item\n const assignments = this.applicableFees().map(fee => {\n const discount = parseFloat(this.getDiscountControl(this.getFeeId(fee))?.value || '0') || 0;\n const scholarship = parseFloat(this.getScholarshipControl(this.getFeeId(fee))?.value || '0') || 0;\n const originalAmount = this.getFeeAmount(fee);\n const finalAmount = Math.max(0, originalAmount - discount - scholarship);\n\n return {\n _id: this.isEditMode() ? this.assignmentId() : undefined,\n feeas_student_id: formValue.student_id,\n feeas_fee_structure_id_feest: fee.fees_structure_id,\n feeas_fee_structure_item_id_feesi: fee._id,\n feeas_academic_year_id_acayr: formValue.feeas_academic_year_id_acayr,\n feeas_entity_id_syen: formValue.feeas_entity_id_syen,\n feeas_original_amount: originalAmount,\n feeas_discount_amount: discount,\n feeas_scholarship_amount: scholarship,\n feeas_final_amount: finalAmount,\n feeas_due_date: formValue.feeas_due_date ? new Date(formValue.feeas_due_date) : undefined,\n feeas_installment_count: formValue.feeas_installment_count || 1,\n feeas_remarks: formValue.feeas_remarks || ''\n };\n });\n\n // TODO: Implement bulk assignment API call\n // For now, create assignments one by one\n const assignmentPromises = assignments.map(assignment => \n this.feeAssignmentService.saveUpdateFeeAssignment(assignment)\n );\n\n forkJoin(assignmentPromises).subscribe({\n next: (responses) => {\n const allSuccess = responses.every(r => r?.success);\n if (allSuccess) {\n this.notificationService.success(\n `Successfully assigned ${assignments.length} fee(s) to student!`\n );\n this.router.navigate(['/control-panel/assignment']);\n } else {\n this.notificationService.error('Some fee assignments failed. Please check and try again.');\n }\n },\n error: (err) => {\n console.error('Error saving fee assignments:', err);\n this.notificationService.error('Failed to save fee assignments. Please try again.');\n },\n complete: () => {\n this.submitting.set(false);\n }\n });\n } else {\n // Custom fee assignment\n const payload = {\n _id: this.isEditMode() ? this.assignmentId() : undefined,\n feeas_student_id: formValue.student_id,\n feeas_fee_structure_id_feest: undefined,\n feeas_fee_structure_item_id_feesi: undefined,\n feeas_academic_year_id_acayr: formValue.feeas_academic_year_id_acayr,\n feeas_entity_id_syen: formValue.feeas_entity_id_syen,\n feeas_fee_category_sygms: formValue.feeas_fee_category_sygms,\n feeas_fee_name: formValue.feeas_fee_name,\n feeas_fee_type: formValue.feeas_fee_type || 'ONE_TIME',\n feeas_original_amount: formValue.feeas_original_amount || 0,\n feeas_discount_amount: formValue.feeas_discount_amount || 0,\n feeas_scholarship_amount: formValue.feeas_scholarship_amount || 0,\n feeas_due_date: formValue.feeas_due_date ? new Date(formValue.feeas_due_date) : undefined,\n feeas_installment_count: formValue.feeas_installment_count || 1,\n feeas_remarks: formValue.feeas_remarks || ''\n };\n \n this.feeAssignmentService.saveUpdateFeeAssignment(payload).subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success(\n `Fee assignment ${this.isEditMode() ? 'updated' : 'created'} successfully!`\n );\n this.router.navigate(['/control-panel/assignment']);\n } else {\n this.notificationService.error(response?.message || 'Failed to save fee assignment');\n }\n },\n error: (err) => {\n console.error('Error saving fee assignment:', err);\n this.notificationService.error('Failed to save fee assignment. Please try again.');\n },\n complete: () => {\n this.submitting.set(false);\n }\n });\n }\n }\n\n resetForm(): void {\n if (this.isEditMode() && this.assignmentId()) {\n // Reload data in edit mode\n this.loadAssignmentData(this.assignmentId()!);\n } else {\n // Reset to defaults in create mode\n if (this.assignmentForm.dirty) {\n this.confirmationService.ask({\n title: 'Reset Form?',\n message: 'Are you sure you want to reset the form? All unsaved changes will be lost.',\n confirmText: 'Reset',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.assignmentForm.reset({\n fee_source: 'STRUCTURE',\n feeas_fee_type: 'ONE_TIME',\n feeas_original_amount: 0,\n feeas_discount_amount: 0,\n feeas_scholarship_amount: 0,\n feeas_installment_count: 1\n });\n this.assignmentId.set('');\n this.isEditMode.set(false);\n this.notificationService.info('Form has been reset.');\n }\n });\n }\n }\n }\n\n onCancel(): void {\n if (this.assignmentForm.dirty) {\n this.confirmationService.ask({\n title: 'Discard Changes?',\n message: 'You have unsaved changes. Are you sure you want to leave?',\n confirmText: 'Discard',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.componentContextService.close(['/fees/assignment']);\n }\n });\n } else {\n this.componentContextService.close(['/fees/assignment']);\n }\n }\n\n getAcademicYearOptions(): Array<{ value: string; label: string }> {\n return this.academicYearOptions().map(ay => ({\n value: ay._id || '',\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\n }));\n }\n\n getFeeStructureOptions(): Array<{ value: string; label: string }> {\n return this.feeStructureOptions().map(fs => ({\n value: fs._id || '',\n label: `${fs.fees_structure_name || ''} (${fs.fees_structure_code || ''})`\n }));\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n /**\n * Update breadcrumb data based on mode\n */\n private updateBreadcrumbData(): void {\n const additionalItems: { id: string; label: string; icon?: string; url?: string }[] = [];\n\n if (this.isEditMode() || this.isViewMode()) {\n if (this.isViewMode()) {\n additionalItems.push({\n id: 'view',\n label: 'View',\n icon: 'visibility',\n url: undefined\n });\n } else {\n additionalItems.push({\n id: 'edit',\n label: 'Edit',\n icon: 'edit',\n url: undefined\n });\n }\n } else {\n // Create mode\n additionalItems.push({\n id: 'create',\n label: 'Create',\n icon: 'add',\n url: undefined\n });\n }\n\n this.breadcrumbData.set(additionalItems);\n }\n}\n\n","<!-- Fee Assignment Form -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_assignment' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n <div class=\"tw-w-full tw-h-full\">\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"assignmentForm\" \n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Form Content -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\n <div class=\"tw-space-y-6\">\n\n <!-- Student Information -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3\">Student Information</h6>\n \n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <div>\n <cide-ele-input \n label=\"Student *\" \n formControlName=\"student_search\"\n placeholder=\"Search student by name or ID...\"\n size=\"sm\"\n leadingIcon=\"search\">\n </cide-ele-input>\n </div>\n\n <cide-ele-select \n label=\"Academic Year *\" \n formControlName=\"feeas_academic_year_id_acayr\"\n [options]=\"getAcademicYearOptions()\"\n [loading]=\"academicYearLoading()\"\n size=\"sm\"\n leadingIcon=\"calendar_today\">\n </cide-ele-select>\n </div>\n \n <!-- Hidden entity field (populated from app state) -->\n <input type=\"hidden\" formControlName=\"feeas_entity_id_syen\">\n </div>\n\n <!-- Academic Information (for fee structure loading) -->\n @if (showFeeStructureField()) {\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-pb-2 tw-border-b-2 tw-border-indigo-200 dark:tw-border-indigo-800 tw-mb-4\">\n <cide-ele-icon class=\"tw-w-5 tw-h-5 tw-text-indigo-600 dark:tw-text-indigo-400\">school</cide-ele-icon>\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100\">Academic Information</h6>\n </div>\n \n <cide-shared-program-section-selector-wrapper\n [formGroup]=\"assignmentForm\"\n classProgramControlName=\"class_program_id\"\n branchControlName=\"branch_id\"\n termControlName=\"term_id\"\n sectionControlName=\"section_id\"\n [academicYearId]=\"assignmentForm.get('feeas_academic_year_id_acayr')?.value\"\n [entityId]=\"assignmentForm.get('feeas_entity_id_syen')?.value\"\n [disabled]=\"isViewMode()\"\n (valuesChange)=\"onProgramSectionValuesChange($event)\">\n </cide-shared-program-section-selector-wrapper>\n </div>\n }\n\n <!-- Fee Information -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3\">Fee Information</h6>\n \n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-select \n label=\"Fee Source *\" \n formControlName=\"fee_source\"\n [options]=\"feeSourceOptions\"\n size=\"sm\"\n leadingIcon=\"source\">\n </cide-ele-select>\n </div>\n\n <!-- Custom Fee Fields -->\n @if (showCustomFeeFields()) {\n <div class=\"tw-mt-4 tw-space-y-4\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-select \n label=\"Fee Category *\" \n formControlName=\"feeas_fee_category_sygms\"\n [options]=\"feeCategoryOptions\"\n size=\"sm\">\n </cide-ele-select>\n\n <cide-ele-input \n label=\"Fee Name *\" \n formControlName=\"feeas_fee_name\"\n placeholder=\"Enter fee name\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-select \n label=\"Fee Type *\" \n formControlName=\"feeas_fee_type\"\n [options]=\"feeTypeOptions\"\n size=\"sm\">\n </cide-ele-select>\n\n <cide-ele-input \n label=\"Amount *\" \n formControlName=\"feeas_original_amount\"\n type=\"number\"\n placeholder=\"0.00\"\n size=\"sm\"\n leadingIcon=\"currency_rupee\">\n </cide-ele-input>\n </div>\n </div>\n }\n </div>\n\n <!-- Payment Details -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3\">Payment Details</h6>\n \n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input \n label=\"Due Date *\" \n formControlName=\"feeas_due_date\"\n type=\"date\"\n size=\"sm\"\n leadingIcon=\"calendar_today\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Installments\" \n formControlName=\"feeas_installment_count\"\n type=\"number\"\n placeholder=\"1\"\n min=\"1\"\n max=\"12\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Fee Insights (for fee structure) -->\n @if (showFeeStructureField() && assignmentForm.get('term_id')?.value) {\n <div class=\"tw-bg-blue-50 dark:tw-bg-blue-900/20 tw-rounded-lg tw-border tw-border-blue-200 dark:tw-border-blue-800 tw-p-4\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-5 tw-h-5 tw-text-blue-600 dark:tw-text-blue-400\">account_balance</cide-ele-icon>\n Fee Insights\n </h6>\n @if (feesLoading()) {\n <span class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400\">Loading fees...</span>\n }\n </div>\n\n @if (feesLoading()) {\n <div class=\"tw-text-center tw-py-4\">\n <span class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400\">Loading applicable fees...</span>\n </div>\n } @else if (applicableFees().length > 0) {\n <div class=\"tw-overflow-x-auto\">\n <table class=\"tw-min-w-full tw-divide-y tw-divide-gray-200 dark:tw-divide-gray-700\">\n <thead class=\"tw-bg-gray-50 dark:tw-bg-gray-800\">\n <tr>\n <th class=\"tw-px-4 tw-py-2 tw-text-left tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Fee Name</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-left tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Category</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-right tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Original Amount</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-right tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Discount</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-right tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Scholarship</th>\n <th class=\"tw-px-4 tw-py-2 tw-text-right tw-text-xs tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-uppercase\">Final Amount</th>\n </tr>\n </thead>\n <tbody class=\"tw-bg-white dark:tw-bg-gray-800 tw-divide-y tw-divide-gray-200 dark:tw-divide-gray-700\">\n @for (fee of applicableFees(); track getFeeId(fee)) {\n <tr>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-text-gray-900 dark:tw-text-gray-100\">{{ getFeeName(fee) }}</td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-text-gray-600 dark:tw-text-gray-400\">{{ getFeeCategory(fee) }}</td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-text-gray-900 dark:tw-text-gray-100 tw-text-right\">{{ formatCurrency(getFeeAmount(fee)) }}</td>\n <td class=\"tw-px-4 tw-py-2\">\n <cide-ele-input\n type=\"number\"\n [formControl]=\"getDiscountControl(getFeeId(fee))\"\n placeholder=\"0.00\"\n size=\"sm\"\n class=\"tw-w-24\"\n [disabled]=\"isViewMode()\">\n </cide-ele-input>\n </td>\n <td class=\"tw-px-4 tw-py-2\">\n <cide-ele-input\n type=\"number\"\n [formControl]=\"getScholarshipControl(getFeeId(fee))\"\n placeholder=\"0.00\"\n size=\"sm\"\n class=\"tw-w-24\"\n [disabled]=\"isViewMode()\">\n </cide-ele-input>\n </td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-text-right\">\n {{ formatCurrency(calculateFinalAmount(fee)) }}\n </td>\n </tr>\n }\n </tbody>\n <tfoot class=\"tw-bg-gray-50 dark:tw-bg-gray-800\">\n <tr>\n <td colspan=\"2\" class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-text-right\">Total:</td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-text-right\">\n {{ formatCurrency(totalOriginalAmount()) }}\n </td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-blue-600 dark:tw-text-blue-400 tw-text-right\">\n {{ formatCurrency(totalDiscount()) }}\n </td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-semibold tw-text-purple-600 dark:tw-text-purple-400 tw-text-right\">\n {{ formatCurrency(totalScholarship()) }}\n </td>\n <td class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-bold tw-text-green-600 dark:tw-text-green-400 tw-text-right\">\n {{ formatCurrency(totalFinalAmount()) }}\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n } @else {\n <div class=\"tw-text-center tw-py-4 tw-text-sm tw-text-gray-500 dark:tw-text-gray-400\">\n No fee structure found for the selected program/term. Please select a program and term to view applicable fees.\n </div>\n }\n </div>\n }\n\n <!-- Discounts & Scholarships (for custom fees) -->\n @if (showCustomFeeFields()) {\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3\">Discounts & Scholarships</h6>\n \n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input \n label=\"Discount Amount\" \n formControlName=\"feeas_discount_amount\"\n type=\"number\"\n placeholder=\"0.00\"\n min=\"0\"\n size=\"sm\"\n leadingIcon=\"percent\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Scholarship Amount\" \n formControlName=\"feeas_scholarship_amount\"\n type=\"number\"\n placeholder=\"0.00\"\n min=\"0\"\n size=\"sm\"\n leadingIcon=\"school\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Amount Summary (for custom fees) -->\n <div class=\"tw-bg-gradient-to-r tw-from-blue-50 dark:tw-from-blue-900/20 tw-to-indigo-50 dark:tw-to-indigo-900/20 tw-rounded-lg tw-border tw-border-blue-200 dark:tw-border-blue-800 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-blue-900 dark:tw-text-blue-100 tw-mb-3\">Amount Summary</h6>\n \n <div class=\"tw-space-y-2\">\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-1\">\n <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">Original Amount:</span>\n <span class=\"tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100\">{{ formatCurrency(assignmentForm.get('feeas_original_amount')?.value || 0) }}</span>\n </div>\n \n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-1\">\n <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">Discount:</span>\n <span class=\"tw-font-semibold tw-text-red-600 dark:tw-text-red-400\">-{{ formatCurrency(assignmentForm.get('feeas_discount_amount')?.value || 0) }}</span>\n </div>\n \n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-1\">\n <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">Scholarship:</span>\n <span class=\"tw-font-semibold tw-text-red-600 dark:tw-text-red-400\">-{{ formatCurrency(assignmentForm.get('feeas_scholarship_amount')?.value || 0) }}</span>\n </div>\n \n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-t-2 tw-border-blue-300 dark:tw-border-blue-700 tw-mt-2\">\n <span class=\"tw-text-base tw-font-bold tw-text-blue-900 dark:tw-text-blue-100\">Total Amount:</span>\n <span class=\"tw-text-xl tw-font-bold tw-text-blue-700 dark:tw-text-blue-300\">{{ formatCurrency(totalAmount()) }}</span>\n </div>\n </div>\n </div>\n }\n\n <!-- Remarks -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <cide-ele-textarea \n label=\"Remarks\" \n formControlName=\"feeas_remarks\"\n placeholder=\"Enter any additional remarks...\"\n rows=\"2\" \n size=\"sm\">\n </cide-ele-textarea>\n </div>\n\n </div>\n\n <!-- Form Validation Errors -->\n @if (!isViewMode()) {\n <div class=\"tw-w-full tw-mt-6\">\n <cide-form-field-error [formGroup]=\"assignmentForm\"></cide-form-field-error>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-gap-3 tw-mt-6\">\n @if (!isEditMode()) {\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"resetForm()\" leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n }\n\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"onCancel()\" leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"submit\" variant=\"primary\" size=\"sm\" \n [disabled]=\"submitting() || assignmentForm.invalid || loading()\" \n [loading]=\"submitting()\" \n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Assignment' : 'Assign Fee' }}\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n </form>\n </div>\n</cide-lyt-shared-wrapper>\n\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n cidePath,\r\n feesRoutesUrl,\r\n hostManagerRoutesUrl,\r\n generateStringFromObject,\r\n type feePaymentControllerResponse,\r\n type MFeePayment,\r\n type feePaymentByIdControllerResponse,\r\n type MFeePaymentGetByIdPayload,\r\n type feePaymentInsertUpdateControllerResponse,\r\n type MFeePaymentInsertUpdatePayload,\r\n type feePaymentDeleteControllerResponse,\r\n type MFeePaymentDeletePayload\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideFeeFeePaymentService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Get list of fee payments\r\n * @param payload - Query parameters for filtering/pagination\r\n * @returns Observable of fee payment list response\r\n */\r\n getFeePaymentList(payload: MFeePayment): Observable<feePaymentControllerResponse> {\r\n console.log(\"payload\", payload)\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment,\r\n query\r\n ]);\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n /**\r\n * Get fee payment by ID\r\n * @param payload - Fee payment ID payload\r\n * @returns Observable of fee payment data\r\n */\r\n getFeePaymentById(payload: MFeePaymentGetByIdPayload): Observable<feePaymentByIdControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment,\r\n 'byId',\r\n query\r\n ]);\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n /**\r\n * Create or update fee payment\r\n * @param data - Fee payment data to save\r\n * @returns Observable of the save response\r\n */\r\n saveUpdateFeePayment(data: MFeePaymentInsertUpdatePayload): Observable<feePaymentInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment\r\n ]);\r\n\r\n return this.http.post(url, data);\r\n }\r\n\r\n /**\r\n * Delete fee payment\r\n * @param payload - Fee payment ID payload\r\n * @returns Observable of the delete response\r\n */\r\n deleteFeePayment(payload: MFeePaymentDeletePayload): Observable<feePaymentDeleteControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment,\r\n 'delete',\r\n query\r\n ]);\r\n\r\n return this.http.delete(url);\r\n }\r\n}\r\n\r\n","import { \n Component, \n signal, \n computed, \n viewChild, \n TemplateRef, \n DestroyRef, \n inject, \n OnInit,\n type OnDestroy \n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { \n CideEleDataGridComponent, \n CideIconComponent, \n CideEleButtonComponent, \n type GridConfiguration, \n type GridEvent, \n CideEleDropdownComponent, \n type DropdownItem, \n type TemplateContext, \n type DropdownConfig, \n ConfirmationService,\n NotificationService \n} from 'cloud-ide-element';\nimport { \n generateStringFromObject, \n MFeePayment \n} from 'cloud-ide-lms-model';\nimport { AppStateHelperService, RightsService } from 'cloud-ide-layout';\nimport { CideFeeFeePaymentService } from '../../services/fee-payment.service';\n\n// Types\ninterface FeePaymentData {\n _id?: string;\n feepay_receipt_number?: string;\n feepay_student_id?: string;\n student_name?: string;\n feepay_payment_date?: Date;\n feepay_payment_mode?: string;\n feepay_total_amount?: number;\n feepay_late_fee_amount?: number;\n feepay_status?: string;\n feepay_payment_reference?: string;\n is_reconciled?: boolean;\n}\n\n@Component({\n selector: 'cide-fee-payment-list',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideEleDropdownComponent\n ],\n templateUrl: './fee-payment-list.component.html',\n styles: [`\n .fee-payment-listing-container {\n @apply tw-w-full tw-h-full;\n }\n \n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class FeePaymentListComponent implements OnInit, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n private readonly router = inject(Router);\n private readonly appState = inject(AppStateHelperService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly notificationService = inject(NotificationService);\n private readonly rightsService = inject(RightsService);\n\n readonly paymentDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('paymentDetailsRendererTemplate');\n readonly amountRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('amountRendererTemplate');\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\n readonly actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\n\n readonly feePayments = signal<FeePaymentData[]>([]);\n readonly loading = signal<boolean>(false);\n readonly error = signal<string | null>(null);\n\n readonly currentPage = signal<number>(1);\n readonly pageSize = signal<number>(10);\n readonly totalItems = signal<number>(0);\n readonly totalPages = signal<number>(0);\n\n readonly searchQuery = signal<string>('');\n readonly sortColumn = signal<string>('feepay_payment_date');\n readonly sortDirection = signal<'asc' | 'desc'>('desc');\n\n readonly selectedStatusFilter = signal<string>('');\n readonly selectedPaymentModeFilter = signal<string>('');\n\n readonly gridConfig = computed<GridConfiguration<FeePaymentData>>(() => ({\n id: 'fee-payment-list-grid',\n columns: [\n {\n key: 'feepay_receipt_number',\n header: 'Receipt #',\n type: 'text',\n width: '140px',\n truncate: true,\n align: 'left',\n sortable: true\n },\n {\n key: 'details',\n header: 'Payment Details',\n type: 'custom',\n width: 'auto',\n truncate: true,\n align: 'left',\n renderer: 'paymentDetailsRenderer',\n sortable: true\n },\n {\n key: 'feepay_payment_date',\n header: 'Payment Date',\n type: 'date',\n width: '140px',\n truncate: false,\n align: 'left',\n sortable: true\n },\n {\n key: 'feepay_payment_mode',\n header: 'Payment Mode',\n type: 'text',\n width: '120px',\n truncate: false,\n align: 'left',\n sortable: true\n },\n {\n key: 'total_amount',\n header: 'Total Amount',\n type: 'custom',\n width: '150px',\n truncate: false,\n align: 'right',\n renderer: 'amountRenderer',\n sortable: true\n },\n {\n key: 'feepay_status',\n header: 'Status',\n type: 'custom',\n width: '140px',\n truncate: false,\n align: 'center',\n renderer: 'statusRenderer'\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'custom',\n width: '80px',\n truncate: false,\n align: 'center',\n renderer: 'actionsDropdownRenderer'\n }\n ],\n data: this.feePayments(),\n trackBy: '_id',\n pagination: {\n enabled: true,\n pageSize: this.pageSize(),\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search by receipt number, student name...',\n searchableColumns: ['feepay_receipt_number', 'student_name'],\n debounceMs: 300,\n showClearButton: true\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: this.loading()\n },\n scroll: {\n enabled: true,\n maxHeight: '',\n minHeight: '',\n stickyHeader: true,\n virtualScroll: false,\n rowHeight: 50\n },\n export: {\n enabled: true,\n formats: ['csv', 'excel', 'pdf'],\n filename: 'fee-payments',\n includeHeaders: true\n },\n responsive: true,\n striped: false,\n bordered: true,\n compact: false,\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\n }));\n\n // Rights computed signals\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n\n ngOnInit(): void {\n // Initialize rights for fee payment management\n this.rightsService.initializeRights('fee_payment');\n console.log('๐ฐ Fee Payment List Component initialized');\n this.loadFeePayments();\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n loadFeePayments(): void {\n this.loading.set(true);\n this.error.set(null);\n\n const payload: MFeePayment = new MFeePayment({\n pageIndex: this.currentPage(),\n pageSize: this.pageSize(),\n query: this.searchQuery() || \"\",\n sort: {\n key: this.sortColumn(),\n order: this.sortDirection()\n }\n });\n\n // Add filters\n const filterParams: any = {};\n if (this.selectedStatusFilter()) {\n filterParams.feepay_status = this.selectedStatusFilter();\n }\n if (this.selectedPaymentModeFilter()) {\n filterParams.feepay_payment_mode = this.selectedPaymentModeFilter();\n }\n Object.assign(payload, filterParams);\n\n this.feePaymentService.getFeePaymentList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n console.log('๐ฐ Fee payments loaded:', response.data);\n this.feePayments.set(response.data);\n this.totalItems.set(response.total || 0);\n this.totalPages.set(Math.ceil((response.total || 0) / this.pageSize()));\n \n if (response.data.length > 0) {\n this.notificationService.success(`Loaded ${response.data.length} payment(s) successfully.`);\n }\n } else {\n this.feePayments.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n this.notificationService.warning('No payments found.');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('โ Error loading fee payments:', error);\n this.error.set('Failed to load fee payments. Please try again.');\n this.feePayments.set([]);\n this.totalItems.set(0);\n this.totalPages.set(0);\n this.notificationService.error('Failed to load fee payments. Please try again.');\n this.loading.set(false);\n }\n });\n }\n\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\n paymentDetailsRenderer: this.paymentDetailsRendererTemplate(),\n amountRenderer: this.amountRendererTemplate(),\n statusRenderer: this.statusRendererTemplate(),\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate()\n }));\n\n onGridEvent(event: GridEvent<any>): void {\n switch (event.type) {\n case 'pageChange':\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\n this.currentPage.set(event.data['pageIndex'] as number);\n this.pageSize.set(event.data['pageSize'] as number);\n this.loadFeePayments();\n }\n break;\n case 'search':\n this.searchQuery.set(event.data as string);\n this.currentPage.set(1);\n this.loadFeePayments();\n break;\n case 'refresh':\n this.loadFeePayments();\n break;\n case 'sort':\n if (event.data && typeof event.data === 'object' && 'column' in event.data && 'direction' in event.data) {\n this.sortColumn.set(event.data['column'] as string);\n this.sortDirection.set(event.data['direction'] as 'asc' | 'desc');\n this.currentPage.set(1);\n this.loadFeePayments();\n }\n break;\n case 'export':\n if (event.data && typeof event.data === 'string') {\n this.handleExport(event.data);\n }\n break;\n default:\n console.log('๐ Unhandled grid event:', event.type);\n }\n }\n\n onStatusFilterChange(): void {\n this.currentPage.set(1);\n this.loadFeePayments();\n }\n\n onPaymentModeFilterChange(): void {\n this.currentPage.set(1);\n this.loadFeePayments();\n }\n\n clearFilters(): void {\n this.selectedStatusFilter.set('');\n this.selectedPaymentModeFilter.set('');\n this.searchQuery.set('');\n this.currentPage.set(1);\n this.loadFeePayments();\n }\n\n processPayment(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to process payments');\n return;\n }\n this.router.navigate(['/control-panel/payment/process']);\n }\n\n viewPayment(payment: FeePaymentData): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view payments');\n return;\n }\n const queryParams = generateStringFromObject({ feepay_id: payment._id });\n this.router.navigate(['/control-panel/payment/view', queryParams]);\n }\n\n printReceipt(payment: FeePaymentData): void {\n console.log('Print receipt:', payment);\n this.notificationService.info(`Printing receipt ${payment.feepay_receipt_number}`);\n }\n\n reconcilePayment(payment: FeePaymentData): void {\n this.confirmationService.ask({\n title: 'Reconcile Payment',\n message: `Are you sure you want to mark payment ${payment.feepay_receipt_number} as reconciled?`,\n confirmText: 'Reconcile',\n cancelText: 'Cancel',\n type: 'info'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n // TODO: Implement reconcile API call\n this.notificationService.success('Payment reconciled successfully.');\n this.loadFeePayments();\n }\n });\n }\n\n getDropdownConfig(): DropdownConfig {\n return {\n triggerIcon: 'more_vert',\n triggerSize: 'sm'\n };\n }\n\n getActionDropdownItems(payment: FeePaymentData): DropdownItem[] {\n const items: DropdownItem[] = [\n {\n id: 'view',\n label: 'View Details',\n icon: 'visibility',\n iconColor: 'tw-text-gray-400',\n textColor: 'tw-text-gray-700',\n hoverBgColor: 'hover:tw-bg-gray-100'\n },\n {\n id: 'receipt',\n label: 'Print Receipt',\n icon: 'print',\n iconColor: 'tw-text-blue-400',\n textColor: 'tw-text-blue-600',\n hoverBgColor: 'hover:tw-bg-blue-50'\n }\n ];\n\n if (!payment.is_reconciled) {\n items.push({\n id: 'reconcile',\n label: 'Reconcile',\n icon: 'check_circle',\n iconColor: 'tw-text-green-400',\n textColor: 'tw-text-green-600',\n hoverBgColor: 'hover:tw-bg-green-50'\n });\n }\n\n return items;\n }\n\n onDropdownItemClick(item: DropdownItem, payment: FeePaymentData): void {\n switch (item.id) {\n case 'view':\n this.viewPayment(payment);\n break;\n case 'receipt':\n this.printReceipt(payment);\n break;\n case 'reconcile':\n this.reconcilePayment(payment);\n break;\n default:\n console.log('โ Unknown dropdown item clicked:', item.id);\n }\n }\n\n private handleExport(format: string): void {\n console.log(`๐ค Exporting fee payments as ${format}`);\n // TODO: Implement export functionality\n }\n\n formatCurrency(amount: number | undefined): string {\n if (!amount) return 'โน0.00';\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n formatDate(date: string | Date | null | undefined): string {\n if (!date) return '-';\n return new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n }\n\n getStatusBadgeClass(payment: FeePaymentData): string {\n switch (payment.feepay_status) {\n case 'SUCCESS':\n case 'COMPLETED':\n return 'tw-bg-green-100 tw-text-green-800';\n case 'PENDING':\n return 'tw-bg-yellow-100 tw-text-yellow-800';\n case 'FAILED':\n return 'tw-bg-red-100 tw-text-red-800';\n default:\n return 'tw-bg-gray-100 tw-text-gray-800';\n }\n }\n\n getStatusText(payment: FeePaymentData): string {\n return payment.feepay_status || 'Unknown';\n }\n}\n","<!-- Fee Payment Container -->\r\n<div class=\"tw-table tw-w-full tw-h-full\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Payment Management</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div\r\n class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"processPayment()\">\r\n Record Payment\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-h-full tw-relative\">\r\n\r\n <!-- Data Grid Component -->\r\n <div class=\"tw-h-full tw-overflow-auto\">\r\n <cide-ele-data-grid [config]=\"gridConfig()\" [templateRenderers]=\"templateRenderers()\"\r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- Template Renderers -->\r\n<ng-template #paymentDetailsRendererTemplate let-row=\"row\">\r\n <div class=\"tw-flex tw-flex-col tw-w-full\">\r\n <div class=\"tw-font-medium tw-text-gray-900\">{{ row.student_name || 'N/A' }}</div>\r\n <div class=\"tw-text-sm tw-text-gray-500 tw-truncate\">ID: {{ row.feepay_student_id || 'N/A' }}</div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #amountRendererTemplate let-row=\"row\">\r\n <div class=\"tw-flex tw-flex-col tw-text-sm tw-items-end\">\r\n <span class=\"tw-text-gray-900 tw-font-semibold\">{{ formatCurrency(row.feepay_total_amount) }}</span>\r\n @if (row.feepay_late_fee_amount && row.feepay_late_fee_amount > 0) {\r\n <span class=\"tw-text-xs tw-text-red-600\">Late Fee: {{ formatCurrency(row.feepay_late_fee_amount) }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #statusRendererTemplate let-row=\"row\">\r\n <span class=\"tw-inline-flex tw-items-center tw-justify-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-text-center\"\r\n [ngClass]=\"getStatusBadgeClass(row)\">\r\n <cide-ele-icon size=\"2xs\" class=\"tw-mr-1\">\r\n {{ row.feepay_status === 'SUCCESS' || row.feepay_status === 'COMPLETED' ? 'check_circle' : \r\n row.feepay_status === 'PENDING' ? 'schedule' : 'error' }}\r\n </cide-ele-icon>\r\n {{ getStatusText(row) }}\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <cide-ele-dropdown \r\n [items]=\"getActionDropdownItems(row)\"\r\n [config]=\"getDropdownConfig()\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template>\r\n\r\n","import { Component, inject, signal, OnInit, computed, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent,\n NotificationService,\n ConfirmationService\n} from 'cloud-ide-element';\nimport { CideFeeFeePaymentService } from '../../services/fee-payment.service';\nimport { CideFeeFeeAssignmentService } from '../../../fee-assignment-management/services/fee-assignment.service';\nimport { RightsService } from 'cloud-ide-layout';\nimport { FeePayment, MFeePaymentInsertUpdatePayload } from 'cloud-ide-lms-model';\n\n// Types\ninterface OutstandingFee {\n id: string;\n assignment_id?: string;\n fee_head: string;\n fee_category: string;\n due_date: Date;\n outstanding_amount: number;\n late_fee: number;\n penalty?: number;\n is_overdue: boolean;\n}\n\ninterface Student {\n _id: string;\n name: string;\n student_id: string;\n class?: string;\n section?: string;\n}\n\n@Component({\n selector: 'cide-fee-payment-process',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent\n ],\n templateUrl: './fee-payment-process.component.html'\n})\nexport class FeePaymentProcessComponent implements OnInit {\n private readonly destroyRef = inject(DestroyRef);\n private readonly fb = inject(FormBuilder);\n private readonly router = inject(Router);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly rightsService = inject(RightsService);\n\n paymentForm: FormGroup = this.fb.group({\n student_id: ['', [Validators.required]],\n student_search: [''],\n feepay_payment_date: [new Date().toISOString().split('T')[0], [Validators.required]],\n feepay_payment_mode: ['CASH', [Validators.required]],\n feepay_payment_method: ['CASH', [Validators.required]],\n feepay_payment_reference: [''],\n feepay_bank_name: [''],\n feepay_bank_branch_name: [''],\n feepay_bank_ifsc_code: [''],\n feepay_instrument_date: [''],\n feepay_cheque_number: [''],\n feepay_cheque_date: [''],\n feepay_bank_account_number: [''],\n feepay_transaction_reference: [''],\n feepay_discount_percentage: [0, [Validators.min(0), Validators.max(100)]],\n feepay_discount_on: [''],\n feepay_discount_reason: [''],\n feepay_remarks: [''],\n pay_full_outstanding: [false],\n fee_items: this.fb.array([])\n });\n\n loading = signal<boolean>(false);\n submitting = signal<boolean>(false);\n selectedStudent = signal<Student | null>(null);\n outstandingFees = signal<OutstandingFee[]>([]);\n showChequeDetails = signal<boolean>(false);\n showBankDetails = signal<boolean>(false);\n\n // Payment method options\n readonly paymentMethodOptions = [\n { value: 'CASH', label: 'Cash' },\n { value: 'CHEQUE', label: 'Cheque' },\n { value: 'DD', label: 'DD' },\n { value: 'ONLINE', label: 'Online' },\n { value: 'CARD', label: 'Card' },\n { value: 'UPI', label: 'UPI' },\n { value: 'NET_BANKING', label: 'Net Banking' },\n { value: 'BANK_TRANSFER', label: 'Bank Transfer' }\n ];\n\n // Computed values\n readonly selectedFeeItems = computed(() => {\n const items = this.feeItemsArray.controls;\n return items.filter((control, index) => {\n const isSelected = control.get('is_selected')?.value;\n return isSelected;\n });\n });\n\n readonly totalFeeAmount = computed(() => {\n let total = 0;\n this.feeItemsArray.controls.forEach(control => {\n if (control.get('is_selected')?.value) {\n total += parseFloat(control.get('amount_paid')?.value || '0');\n }\n });\n return total;\n });\n\n readonly totalLateFee = computed(() => {\n let total = 0;\n this.feeItemsArray.controls.forEach(control => {\n if (control.get('is_selected')?.value) {\n total += parseFloat(control.get('late_fee')?.value || '0');\n }\n });\n return total;\n });\n\n readonly totalPenalty = computed(() => {\n let total = 0;\n this.feeItemsArray.controls.forEach(control => {\n if (control.get('is_selected')?.value) {\n total += parseFloat(control.get('penalty')?.value || '0');\n }\n });\n return total;\n });\n\n readonly totalPayable = computed(() => {\n return this.totalFeeAmount() + this.totalLateFee() + this.totalPenalty();\n });\n\n // Get fee items form array\n get feeItemsArray(): FormArray {\n return this.paymentForm.get('fee_items') as FormArray;\n }\n\n ngOnInit(): void {\n // Initialize rights for fee payment management\n this.rightsService.initializeRights('fee_payment');\n this.setupPaymentMethodListener();\n }\n\n private setupPaymentMethodListener(): void {\n this.paymentForm.get('feepay_payment_method')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(method => {\n this.showChequeDetails.set(method === 'CHEQUE' || method === 'DD');\n this.showBankDetails.set(method === 'BANK_TRANSFER' || method === 'NET_BANKING');\n\n // Set required validators based on payment method\n if (this.showChequeDetails()) {\n this.paymentForm.get('feepay_cheque_number')?.setValidators([Validators.required]);\n this.paymentForm.get('feepay_cheque_date')?.setValidators([Validators.required]);\n this.paymentForm.get('feepay_bank_name')?.setValidators([Validators.required]);\n } else {\n this.paymentForm.get('feepay_cheque_number')?.clearValidators();\n this.paymentForm.get('feepay_cheque_date')?.clearValidators();\n this.paymentForm.get('feepay_bank_name')?.clearValidators();\n }\n\n if (this.showBankDetails()) {\n this.paymentForm.get('feepay_transaction_reference')?.setValidators([Validators.required]);\n } else {\n this.paymentForm.get('feepay_transaction_reference')?.clearValidators();\n }\n\n this.paymentForm.updateValueAndValidity();\n });\n }\n\n onStudentSearch(query: string | number | boolean | null | undefined): void {\n const searchQuery = String(query || '');\n if (searchQuery.length < 3) return;\n\n this.loading.set(true);\n // TODO: Implement student search API call when student service is available\n // For now, using a placeholder - this should be replaced with actual student search service\n // The student search should return student details including _id, name, student_id, class, section\n console.warn('Student search API not yet implemented. Using placeholder.');\n \n // Placeholder: In production, this should call a student search service\n // For now, we'll allow manual entry of student ID\n setTimeout(() => {\n // This is a placeholder - replace with actual student search API call\n const mockStudent: Student = {\n _id: searchQuery, // Using query as student ID for now\n name: `Student ${searchQuery}`,\n student_id: searchQuery,\n class: 'N/A',\n section: 'N/A'\n };\n this.selectedStudent.set(mockStudent);\n this.paymentForm.patchValue({ student_id: mockStudent._id });\n this.loadOutstandingFees(mockStudent._id);\n this.loading.set(false);\n }, 500);\n }\n\n private loadOutstandingFees(studentId: string): void {\n this.loading.set(true);\n \n // Get outstanding fees from fee assignments\n const payload: any = {\n feeas_student_id: studentId,\n feeas_status: 'PENDING' // Get only pending or partially paid assignments\n };\n\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const today = new Date();\n const outstandingFees: OutstandingFee[] = response.data\n .filter((assignment: any) => {\n // Only include assignments with outstanding amount > 0\n const outstanding = assignment.feeas_amount_remaining || \n (assignment.feeas_final_amount || 0) - (assignment.feeas_amount_paid || 0);\n return outstanding > 0;\n })\n .map((assignment: any) => {\n const dueDate = assignment.feeas_due_date ? new Date(assignment.feeas_due_date) : null;\n const outstanding = assignment.feeas_amount_remaining || \n (assignment.feeas_final_amount || 0) - (assignment.feeas_amount_paid || 0);\n const lateFee = assignment.feeas_late_fee_applied || 0;\n \n return {\n id: assignment._id || '',\n assignment_id: assignment._id || '',\n fee_head: assignment.feeas_fee_name || 'Fee',\n fee_category: assignment.feeas_fee_category_sygms || 'OTHER',\n due_date: dueDate || new Date(),\n outstanding_amount: outstanding,\n late_fee: lateFee,\n penalty: 0,\n is_overdue: dueDate ? dueDate < today : false\n };\n });\n\n this.outstandingFees.set(outstandingFees);\n this.initializeFeeItems(outstandingFees);\n } else {\n this.outstandingFees.set([]);\n this.initializeFeeItems([]);\n }\n },\n error: (err) => {\n console.error('Error loading outstanding fees:', err);\n this.notificationService.error('Failed to load outstanding fees');\n this.outstandingFees.set([]);\n this.initializeFeeItems([]);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n }\n\n private initializeFeeItems(fees: OutstandingFee[]): void {\n // Clear existing items\n while (this.feeItemsArray.length !== 0) {\n this.feeItemsArray.removeAt(0);\n }\n\n // Add fee items\n fees.forEach(fee => {\n const itemGroup = this.fb.group({\n assignment_id: [fee.assignment_id],\n fee_head: [fee.fee_head],\n fee_category: [fee.fee_category],\n outstanding_amount: [fee.outstanding_amount],\n is_selected: [false],\n amount_paid: [fee.outstanding_amount, [Validators.required, Validators.min(0)]],\n late_fee: [fee.late_fee],\n penalty: [fee.penalty || 0]\n });\n\n // Set max validator for amount_paid\n itemGroup.get('amount_paid')?.setValidators([\n Validators.required,\n Validators.min(0),\n Validators.max(fee.outstanding_amount)\n ]);\n\n this.feeItemsArray.push(itemGroup);\n });\n }\n\n togglePayFullOutstanding(): void {\n const payFull = this.paymentForm.get('pay_full_outstanding')?.value;\n\n this.feeItemsArray.controls.forEach(control => {\n control.patchValue({ is_selected: payFull });\n if (payFull) {\n const outstanding = control.get('outstanding_amount')?.value || 0;\n control.patchValue({ amount_paid: outstanding });\n }\n });\n }\n\n selectAllFees(): void {\n this.feeItemsArray.controls.forEach(control => {\n control.patchValue({ is_selected: true });\n const outstanding = control.get('outstanding_amount')?.value || 0;\n control.patchValue({ amount_paid: outstanding });\n });\n }\n\n clearAllFees(): void {\n this.feeItemsArray.controls.forEach(control => {\n control.patchValue({ is_selected: false, amount_paid: 0 });\n });\n this.paymentForm.patchValue({ pay_full_outstanding: false });\n }\n\n toggleFeeItem(index: number): void {\n const control = this.feeItemsArray.at(index);\n const isSelected = control.get('is_selected')?.value;\n control.patchValue({ is_selected: !isSelected });\n\n if (!isSelected) {\n const outstanding = control.get('outstanding_amount')?.value || 0;\n control.patchValue({ amount_paid: outstanding });\n } else {\n control.patchValue({ amount_paid: 0 });\n }\n }\n\n onAmountChange(index: number, value: string | number | boolean | null | undefined): void {\n const control = this.feeItemsArray.at(index);\n const outstanding = control.get('outstanding_amount')?.value || 0;\n const numValue = parseFloat(String(value || '0')) || 0;\n\n if (numValue > outstanding) {\n control.patchValue({ amount_paid: outstanding });\n this.notificationService.warning('Amount cannot exceed outstanding amount.');\n }\n }\n\n onSubmit(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('You do not have permission to process payments');\n return;\n }\n if (this.paymentForm.invalid || this.submitting()) {\n this.paymentForm.markAllAsTouched();\n this.notificationService.warning('Please fill in all required fields correctly.');\n return;\n }\n\n if (this.selectedFeeItems().length === 0) {\n this.notificationService.warning('Please select at least one fee item to pay.');\n return;\n }\n\n if (this.totalPayable() <= 0) {\n this.notificationService.warning('Total payable amount must be greater than zero.');\n return;\n }\n\n this.submitting.set(true);\n\n const formValue = this.paymentForm.value;\n const selectedItems = this.feeItemsArray.controls\n .map((control, index) => ({ control, index }))\n .filter(({ control }) => control.get('is_selected')?.value)\n .map(({ control, index }) => ({\n assignment_id: control.get('assignment_id')?.value,\n amount_paid: control.get('amount_paid')?.value,\n late_fee: control.get('late_fee')?.value,\n penalty: control.get('penalty')?.value\n }));\n\n // Create payload with all fields - using Record to allow all schema fields\n const payloadData = {\n feepay_student_id: formValue.student_id,\n feepay_payment_date: new Date(formValue.feepay_payment_date),\n feepay_payment_mode: formValue.feepay_payment_mode,\n feepay_payment_reference: formValue.feepay_payment_reference ||\n formValue.feepay_cheque_number ||\n formValue.feepay_transaction_reference,\n feepay_bank_name: formValue.feepay_bank_name,\n feepay_bank_branch_name: formValue.feepay_bank_branch_name,\n feepay_bank_ifsc_code: formValue.feepay_bank_ifsc_code,\n feepay_instrument_date: formValue.feepay_instrument_date ? new Date(formValue.feepay_instrument_date) : undefined,\n feepay_cheque_number: formValue.feepay_cheque_number,\n feepay_cheque_date: formValue.feepay_cheque_date ? new Date(formValue.feepay_cheque_date) : undefined,\n feepay_bank_account_number: formValue.feepay_bank_account_number,\n feepay_transaction_reference: formValue.feepay_transaction_reference,\n feepay_discount_percentage: formValue.feepay_discount_percentage || 0,\n feepay_discount_on: formValue.feepay_discount_on,\n feepay_discount_reason: formValue.feepay_discount_reason,\n feepay_total_amount: this.totalPayable(),\n feepay_late_fee_amount: this.totalLateFee(),\n feepay_status: 'SUCCESS' as const,\n feepay_remarks: formValue.feepay_remarks\n } as FeePayment;\n\n const payload: MFeePaymentInsertUpdatePayload = new MFeePaymentInsertUpdatePayload(payloadData);\n\n this.feePaymentService.saveUpdateFeePayment(payload).subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success('Payment recorded successfully!');\n this.router.navigate(['/control-panel/payment']);\n } else {\n this.notificationService.error(response?.message || 'Failed to record payment.');\n this.submitting.set(false);\n }\n },\n error: (error) => {\n console.error('Error recording payment:', error);\n this.notificationService.error('Failed to record payment. Please try again.');\n this.submitting.set(false);\n }\n });\n }\n\n onCancel(): void {\n if (this.paymentForm.dirty) {\n this.confirmationService.ask({\n title: 'Discard Changes?',\n message: 'You have unsaved changes. Are you sure you want to leave?',\n confirmText: 'Discard',\n cancelText: 'Cancel',\n type: 'warning'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.router.navigate(['/control-panel/payment']);\n }\n });\n } else {\n this.router.navigate(['/control-panel/payment']);\n }\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n isOverdue(date: Date): boolean {\n return new Date(date) < new Date();\n }\n}\n","<!-- Payment Process Form -->\r\n<div class=\"tw-w-full tw-h-full\">\r\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"paymentForm\" \r\n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n \r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Record Payment</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0 sm:tw-space-x-3\">\r\n <!-- Back button or other actions can be added here if needed -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-6\">\r\n <div class=\"tw-transition-opacity tw-duration-300\" [class.tw-opacity-60]=\"loading()\">\r\n <div class=\"tw-space-y-4\">\r\n\r\n <!-- Student Information -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-p-4\">\r\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 tw-mb-3\">Student Information</h6>\r\n \r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <cide-ele-input \r\n label=\"Search Student *\" \r\n formControlName=\"student_search\"\r\n placeholder=\"Enter student name or ID...\"\r\n size=\"sm\"\r\n leadingIcon=\"search\"\r\n (ngModelChange)=\"onStudentSearch($event)\">\r\n </cide-ele-input>\r\n \r\n @if (selectedStudent()) {\r\n <div class=\"tw-mt-2 tw-p-2 tw-bg-green-50 tw-border tw-border-green-200 tw-rounded\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-green-900\">{{ selectedStudent()?.name }}</div>\r\n <div class=\"tw-text-xs tw-text-green-700\">ID: {{ selectedStudent()?.student_id }}</div>\r\n @if (selectedStudent()?.class) {\r\n <div class=\"tw-text-xs tw-text-green-600\">{{ selectedStudent()?.class }} / {{ selectedStudent()?.section }}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <cide-ele-input \r\n label=\"Payment Date *\" \r\n formControlName=\"feepay_payment_date\"\r\n type=\"date\"\r\n size=\"sm\"\r\n leadingIcon=\"calendar_today\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n\r\n <!-- Fee Selection -->\r\n @if (selectedStudent() && outstandingFees().length > 0) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-p-4\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900\">Select Fees to Pay</h6>\r\n <div class=\"tw-flex tw-items-center tw-gap-3\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-input \r\n formControlName=\"pay_full_outstanding\" \r\n type=\"checkbox\" \r\n size=\"sm\"\r\n (change)=\"togglePayFullOutstanding()\">\r\n </cide-ele-input>\r\n <span class=\"tw-text-sm tw-text-gray-700\">Pay full outstanding</span>\r\n </div>\r\n <button cideEleButton type=\"button\" variant=\"success\" size=\"xs\" (click)=\"selectAllFees()\">\r\n Select All\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"xs\" (click)=\"clearAllFees()\">\r\n Clear\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div formArrayName=\"fee_items\" class=\"tw-space-y-2 tw-max-h-80 tw-overflow-y-auto tw-border tw-border-gray-200 tw-rounded-lg tw-p-3\">\r\n @for (item of feeItemsArray.controls; track $index) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-2 tw-bg-gray-50 tw-rounded tw-border tw-border-gray-200\"\r\n [formGroupName]=\"$index\">\r\n \r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-1\">\r\n <cide-ele-input \r\n formControlName=\"is_selected\" \r\n type=\"checkbox\" \r\n size=\"sm\"\r\n (change)=\"toggleFeeItem($index)\">\r\n </cide-ele-input>\r\n \r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900\">\r\n {{ item.get('fee_head')?.value }}\r\n </div>\r\n <div class=\"tw-text-xs tw-text-gray-500\">\r\n Outstanding: {{ formatCurrency(item.get('outstanding_amount')?.value || 0) }}\r\n @if (item.get('late_fee')?.value > 0) {\r\n <span class=\"tw-text-red-600\"> | Late Fee: {{ formatCurrency(item.get('late_fee')?.value) }}</span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-input \r\n formControlName=\"amount_paid\"\r\n type=\"number\"\r\n placeholder=\"0.00\"\r\n size=\"sm\"\r\n [disabled]=\"!item.get('is_selected')?.value\"\r\n (ngModelChange)=\"onAmountChange($index, $event)\"\r\n class=\"tw-w-28\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Payment Details -->\r\n @if (selectedStudent()) {\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-p-4\">\r\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 tw-mb-3\">Payment Details</h6>\r\n \r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-select \r\n label=\"Payment Method *\" \r\n formControlName=\"feepay_payment_method\"\r\n [options]=\"paymentMethodOptions\"\r\n size=\"sm\"\r\n leadingIcon=\"payment\">\r\n </cide-ele-select>\r\n\r\n <cide-ele-select \r\n label=\"Payment Mode *\" \r\n formControlName=\"feepay_payment_mode\"\r\n [options]=\"[{value: 'OFFLINE', label: 'Offline'}, {value: 'ONLINE', label: 'Online'}]\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <!-- Cheque/DD Details -->\r\n @if (showChequeDetails()) {\r\n <div class=\"tw-mt-4 tw-p-3 tw-bg-blue-50 tw-rounded tw-border tw-border-blue-200\">\r\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-blue-900 tw-mb-3\">Cheque/DD Details</h6>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\r\n <cide-ele-input \r\n label=\"Cheque/DD Number *\" \r\n formControlName=\"feepay_cheque_number\"\r\n placeholder=\"Enter cheque/DD number\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input \r\n label=\"Cheque/DD Date *\" \r\n formControlName=\"feepay_cheque_date\"\r\n type=\"date\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-mt-3\">\r\n <cide-ele-input \r\n label=\"Bank Name *\" \r\n formControlName=\"feepay_bank_name\"\r\n placeholder=\"Enter bank name\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input \r\n label=\"Branch Name *\" \r\n formControlName=\"feepay_bank_branch_name\"\r\n placeholder=\"Enter branch name\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-mt-3\">\r\n <cide-ele-input \r\n label=\"IFSC Code *\" \r\n formControlName=\"feepay_bank_ifsc_code\"\r\n placeholder=\"Enter IFSC code\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-mt-3\">\r\n <cide-ele-input \r\n label=\"Instrument Date *\" \r\n formControlName=\"feepay_instrument_date\"\r\n type=\"date\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Bank Transfer Details -->\r\n @if (showBankDetails()) {\r\n <div class=\"tw-mt-4 tw-p-3 tw-bg-green-50 tw-rounded tw-border tw-border-green-200\">\r\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-green-900 tw-mb-3\">Bank Transfer Details</h6>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\r\n <cide-ele-input \r\n label=\"Bank Name\" \r\n formControlName=\"feepay_bank_name\"\r\n placeholder=\"Enter bank name\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input \r\n label=\"Branch Name\" \r\n formControlName=\"feepay_bank_branch_name\"\r\n placeholder=\"Enter branch name\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-mt-3\">\r\n <cide-ele-input \r\n label=\"IFSC Code\" \r\n formControlName=\"feepay_bank_ifsc_code\"\r\n placeholder=\"Enter IFSC code\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input \r\n label=\"Account Number\" \r\n formControlName=\"feepay_bank_account_number\"\r\n placeholder=\"Enter account number\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div class=\"tw-mt-3\">\r\n <cide-ele-input \r\n label=\"Transaction Reference *\" \r\n formControlName=\"feepay_transaction_reference\"\r\n placeholder=\"Enter transaction reference\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Discount Section -->\r\n <div class=\"tw-mt-4 tw-p-3 tw-bg-purple-50 tw-rounded tw-border tw-border-purple-200\">\r\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-purple-900 tw-mb-3\">Discount Information</h6>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\r\n <cide-ele-input \r\n label=\"Discount (%)\" \r\n formControlName=\"feepay_discount_percentage\"\r\n type=\"number\"\r\n placeholder=\"0\"\r\n size=\"sm\"\r\n [min]=\"0\"\r\n [max]=\"100\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-select \r\n label=\"Discount On\" \r\n formControlName=\"feepay_discount_on\"\r\n [options]=\"[{value: 'SUB_TOTAL', label: 'Sub Total'}, {value: 'FEE_HEAD', label: 'Fee Head'}, {value: 'TOTAL', label: 'Total'}, {value: 'INSTALLMENT', label: 'Installment'}]\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n <div class=\"tw-mt-3\">\r\n <cide-ele-textarea \r\n label=\"Discount Reason\" \r\n formControlName=\"feepay_discount_reason\"\r\n placeholder=\"Enter reason for discount...\"\r\n rows=\"2\"\r\n size=\"sm\">\r\n </cide-ele-textarea>\r\n </div>\r\n </div>\r\n\r\n <!-- Payment Reference -->\r\n <div class=\"tw-mt-4\">\r\n <cide-ele-input \r\n label=\"Payment Reference\" \r\n formControlName=\"feepay_payment_reference\"\r\n placeholder=\"Enter payment reference number\"\r\n size=\"sm\"\r\n leadingIcon=\"receipt\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <!-- Remarks -->\r\n <div class=\"tw-mt-4\">\r\n <cide-ele-textarea \r\n label=\"Remarks\" \r\n formControlName=\"feepay_remarks\"\r\n placeholder=\"Enter any additional remarks...\"\r\n rows=\"2\" \r\n size=\"sm\">\r\n </cide-ele-textarea>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Payment Summary -->\r\n @if (selectedStudent() && selectedFeeItems().length > 0) {\r\n <div class=\"tw-bg-gradient-to-r tw-from-green-50 tw-to-emerald-50 tw-rounded-lg tw-border tw-border-green-200 tw-p-4\">\r\n <h6 class=\"tw-text-base tw-font-semibold tw-text-green-900 tw-mb-3\">Payment Summary</h6>\r\n \r\n <div class=\"tw-space-y-3\">\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\r\n <span class=\"tw-text-gray-700\">Fee Amount:</span>\r\n <span class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(totalFeeAmount()) }}</span>\r\n </div>\r\n \r\n @if (totalLateFee() > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\r\n <span class=\"tw-text-gray-700\">Late Fee Amount:</span>\r\n <span class=\"tw-font-semibold tw-text-red-600\">{{ formatCurrency(totalLateFee()) }}</span>\r\n </div>\r\n }\r\n \r\n @if (totalPenalty() > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\r\n <span class=\"tw-text-gray-700\">Penalty Amount:</span>\r\n <span class=\"tw-font-semibold tw-text-red-600\">{{ formatCurrency(totalPenalty()) }}</span>\r\n </div>\r\n }\r\n \r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-3 tw-border-t-2 tw-border-green-300 tw-mt-2\">\r\n <span class=\"tw-text-lg tw-font-bold tw-text-green-900\">Total Payable:</span>\r\n <span class=\"tw-text-2xl tw-font-bold tw-text-green-700\">{{ formatCurrency(totalPayable()) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Form Validation Errors -->\r\n <!-- Action Buttons -->\r\n <div class=\"tw-flex tw-justify-end tw-gap-3 tw-mt-6\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"onCancel()\" leftIcon=\"close\"\r\n [disabled]=\"loading()\">\r\n Cancel\r\n </button>\r\n\r\n <button cideEleButton type=\"submit\" variant=\"primary\" size=\"sm\" \r\n [disabled]=\"submitting() || paymentForm.invalid || selectedFeeItems().length === 0 || loading()\" \r\n [loading]=\"submitting()\" \r\n leftIcon=\"save\">\r\n {{ submitting() ? 'Processing...' : 'Record Payment' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n\r\n","import { Component, inject, signal, OnInit, DestroyRef, computed } from '@angular/core';\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { HttpClient } from '@angular/common/http';\nimport { \n CideIconComponent,\n CideEleButtonComponent,\n NotificationService,\n CideEleFileManagerService\n} from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, RightsService } from 'cloud-ide-layout';\nimport { CideFeeFeePaymentService } from '../../services/fee-payment.service';\nimport { \n generateObjectFromString,\n generateStringFromObject,\n type feePaymentByIdControllerResponse,\n type MFeePaymentGetByIdPayload,\n type FeePayment,\n type controllerResponse,\n cidePath,\n hostManagerRoutesUrl\n} from 'cloud-ide-lms-model';\n\n@Component({\n selector: 'cide-fee-payment-view',\n standalone: true,\n imports: [\n CommonModule,\n DatePipe,\n CideIconComponent,\n CideEleButtonComponent,\n CideLytSharedWrapperComponent\n ],\n template: `\n <cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"shared_wrapper_setup_param\">\n @if (loading()) {\n <div class=\"tw-text-center tw-py-12\">\n <cide-ele-icon class=\"tw-text-6xl tw-text-gray-300 dark:tw-text-gray-600 tw-animate-spin\">refresh</cide-ele-icon>\n <p class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-4\">Loading receipt details...</p>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <cide-ele-icon class=\"tw-text-6xl tw-text-red-300 dark:tw-text-red-600\">error</cide-ele-icon>\n <p class=\"tw-text-sm tw-text-red-600 dark:tw-text-red-400 tw-mt-4\">{{ error() }}</p>\n <cide-ele-button variant=\"ghost\" size=\"sm\" type=\"button\" (btnClick)=\"retryLoad()\" class=\"tw-mt-4\">\n Retry\n </cide-ele-button>\n </div>\n } @else if (feePayment()) {\n @if (feePayment(); as payment) {\n <!-- Compact Header Section -->\n <div class=\"tw-mb-3 tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-3\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-gap-3\">\n <div class=\"tw-flex tw-items-center tw-gap-2.5 tw-flex-1 tw-min-w-0\">\n <div class=\"tw-w-8 tw-h-8 tw-bg-green-100 dark:tw-bg-green-900/30 tw-rounded tw-flex tw-items-center tw-justify-center tw-flex-shrink-0\">\n <cide-ele-icon class=\"tw-text-green-600 dark:tw-text-green-400 tw-text-base\">receipt</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1 tw-min-w-0\">\n <h2 class=\"tw-text-base tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-leading-tight tw-mb-1\">\n Fee Payment Receipt\n </h2>\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-wrap\">\n <span class=\"tw-text-xs tw-text-gray-600 dark:tw-text-gray-400\">\n Receipt #: {{ payment.feepay_receipt_number || 'N/A' }}\n </span>\n <span [class]=\"getStatusBadgeClass()\" class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\">\n {{ getStatusText() }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-shrink-0\">\n @if (!receiptHtml() && !generatingReceipt()) {\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"receipt\"\n (btnClick)=\"generateReceipt()\" title=\"Generate Receipt\" [loading]=\"generatingReceipt()\">\n Generate Receipt\n </button>\n }\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"sm\" leftIcon=\"visibility\"\n (btnClick)=\"viewReceipt()\" title=\"View Receipt\" [disabled]=\"generatingReceipt()\">\n View\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"sm\" leftIcon=\"print\"\n (btnClick)=\"printReceipt()\" title=\"Print Receipt\" [disabled]=\"generatingReceipt()\">\n Print\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"sm\" leftIcon=\"download\"\n (btnClick)=\"downloadReceipt()\" title=\"Download Receipt\" [disabled]=\"generatingReceipt()\">\n Download\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"sm\" leftIcon=\"arrow_back\"\n (btnClick)=\"goBack()\" title=\"Back to List\">\n Back\n </button>\n </div>\n </div>\n </div>\n\n <!-- Receipt Content -->\n <div class=\"tw-space-y-4\">\n <!-- Payment Summary Card -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-blue-500\">payment</cide-ele-icon>\n Payment Summary\n </h3>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-4\">\n <div>\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 dark:tw-text-gray-400 tw-uppercase tw-tracking-wide\">Payment Date</label>\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 dark:tw-text-gray-100 tw-mt-1\">\n {{ payment.feepay_payment_date | date:'MMM dd, yyyy' }}\n </p>\n </div>\n <div>\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 dark:tw-text-gray-400 tw-uppercase tw-tracking-wide\">Payment Mode</label>\n <p class=\"tw-text-sm tw-font-medium tw-text-gray-900 dark:tw-text-gray-100 tw-mt-1\">\n {{ payment.feepay_payment_mode || 'N/A' }}\n </p>\n </div>\n <div>\n <label class=\"tw-text-xs tw-font-medium tw-text-gray-500 dark:tw-text-gray-400 tw-uppercase tw-tracking-wide\">Total Amount</label>\n <p class=\"tw-text-lg tw-font-bold tw-text-green-600 dark:tw-text-green-400 tw-mt-1\">\n {{ formatCurrency(payment.feepay_total_amount || 0) }}\n </p>\n </div>\n </div>\n </div>\n\n <!-- Payment Details Grid -->\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <!-- Student Information -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-purple-500\">person</cide-ele-icon>\n Student Information\n </h3>\n <div class=\"tw-space-y-2 tw-text-xs\">\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Student ID:</span> <span class=\"tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_student_id || 'N/A' }}</span></div>\n @if (getStudentName()) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Name:</span> <span class=\"tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">{{ getStudentName() }}</span></div>\n }\n </div>\n </div>\n\n <!-- Payment Method Details -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-indigo-500\">account_balance</cide-ele-icon>\n Payment Method\n </h3>\n <div class=\"tw-space-y-2 tw-text-xs\">\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Mode:</span> <span class=\"tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_payment_mode || 'N/A' }}</span></div>\n @if (payment.feepay_payment_reference) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Reference:</span> <span class=\"tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_payment_reference }}</span></div>\n }\n @if (payment.feepay_bank_name) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Bank:</span> <span class=\"tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_bank_name }}</span></div>\n }\n @if (payment.feepay_cheque_number) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Cheque #:</span> <span class=\"tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_cheque_number }}</span></div>\n }\n @if (payment.feepay_transaction_reference) {\n <div><span class=\"tw-text-gray-500 dark:tw-text-gray-400\">Transaction ID:</span> <span class=\"tw-text-gray-900 dark:tw-text-gray-100\">{{ payment.feepay_transaction_reference }}</span></div>\n }\n </div>\n </div>\n </div>\n\n <!-- Amount Breakdown -->\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-3 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-green-500\">account_balance_wallet</cide-ele-icon>\n Amount Breakdown\n </h3>\n <div class=\"tw-space-y-2\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-2 tw-border-b tw-border-gray-200 dark:tw-border-gray-700\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Subtotal:</span>\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">\n {{ formatCurrency((payment.feepay_total_amount || 0) - (payment.feepay_late_fee_amount || 0) - (payment.feepay_discount_amount || 0)) }}\n </span>\n </div>\n @if (payment.feepay_late_fee_amount && payment.feepay_late_fee_amount > 0) {\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-2 tw-border-b tw-border-gray-200 dark:tw-border-gray-700\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Late Fee:</span>\n <span class=\"tw-text-sm tw-font-medium tw-text-red-600 dark:tw-text-red-400\">\n {{ formatCurrency(payment.feepay_late_fee_amount) }}\n </span>\n </div>\n }\n @if (payment.feepay_discount_amount && payment.feepay_discount_amount > 0) {\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-2 tw-border-b tw-border-gray-200 dark:tw-border-gray-700\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Discount:</span>\n <span class=\"tw-text-sm tw-font-medium tw-text-green-600 dark:tw-text-green-400\">\n -{{ formatCurrency(payment.feepay_discount_amount) }}\n </span>\n </div>\n @if (payment.feepay_discount_reason) {\n <div class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400 tw-mt-1\">\n Reason: {{ payment.feepay_discount_reason }}\n </div>\n }\n }\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-2 tw-pt-3 tw-border-t-2 tw-border-gray-300 dark:tw-border-gray-600\">\n <span class=\"tw-text-sm tw-font-bold tw-text-gray-900 dark:tw-text-gray-100\">Total Amount:</span>\n <span class=\"tw-text-lg tw-font-bold tw-text-green-600 dark:tw-text-green-400\">\n {{ formatCurrency(payment.feepay_total_amount || 0) }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Additional Information -->\n @if (payment.feepay_remarks) {\n <div class=\"tw-bg-white dark:tw-bg-gray-800 tw-rounded-lg tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-p-4\">\n <h3 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 dark:tw-text-gray-100 tw-mb-2 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-orange-500\">notes</cide-ele-icon>\n Remarks\n </h3>\n <p class=\"tw-text-xs tw-text-gray-700 dark:tw-text-gray-300\">{{ payment.feepay_remarks }}</p>\n </div>\n }\n </div>\n }\n }\n </cide-lyt-shared-wrapper>\n `,\n styles: [`\n :host {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\n }\n `]\n})\nexport class FeePaymentViewComponent implements OnInit {\n private readonly destroyRef = inject(DestroyRef);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n private readonly notificationService = inject(NotificationService);\n private readonly http = inject(HttpClient);\n private readonly rightsService = inject(RightsService);\n\n shared_wrapper_setup_param = {\n sypg_page_code: \"fee_payment\",\n breadcrumb_right_template: ''\n };\n\n loading = signal<boolean>(false);\n error = signal<string | null>(null);\n feePayment = signal<FeePayment | null>(null);\n generatingReceipt = signal<boolean>(false);\n receiptHtml = signal<string | null>(null);\n\n // Rights computed signals\n canView = computed(() => this.rightsService.hasRight('VIEW'));\n canPrint = computed(() => this.rightsService.hasRight('PRINT'));\n canDownload = computed(() => this.rightsService.hasRight('DOWNLOAD'));\n\n ngOnInit(): void {\n // Initialize rights for fee payment management\n this.rightsService.initializeRights('fee_payment');\n const query = this.route.snapshot.paramMap.get('query');\n if (query) {\n try {\n const parsed = generateObjectFromString(query) as { feepay_id?: string };\n if (parsed?.feepay_id) {\n this.loadFeePayment(parsed.feepay_id);\n } else {\n this.error.set('Invalid payment ID');\n }\n } catch (error) {\n console.error('Error parsing query:', error);\n this.error.set('Invalid query parameters');\n }\n } else {\n this.error.set('Payment ID is required');\n }\n }\n\n private loadFeePayment(id: string): void {\n this.loading.set(true);\n this.error.set(null);\n\n const payload: MFeePaymentGetByIdPayload = {\n feepay_id: id\n };\n\n this.feePaymentService.getFeePaymentById(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: feePaymentByIdControllerResponse) => {\n this.loading.set(false);\n if (response.success && response.data) {\n this.feePayment.set(response.data);\n } else {\n this.error.set(response.message || 'Failed to load payment details');\n }\n },\n error: (response: { error: controllerResponse }) => {\n this.loading.set(false);\n this.error.set(response?.error?.message || 'Failed to load payment details');\n }\n });\n }\n\n retryLoad(): void {\n const query = this.route.snapshot.paramMap.get('query');\n if (query) {\n try {\n const parsed = generateObjectFromString(query) as { feepay_id?: string };\n if (parsed?.feepay_id) {\n this.loadFeePayment(parsed.feepay_id);\n }\n } catch (error) {\n console.error('Error parsing query:', error);\n }\n }\n }\n\n getStatusText(): string {\n const status = this.feePayment()?.feepay_status;\n if (!status) return 'N/A';\n return status.charAt(0) + status.slice(1).toLowerCase();\n }\n\n getStatusBadgeClass(): string {\n const status = this.feePayment()?.feepay_status?.toUpperCase();\n if (status === 'SUCCESS' || status === 'COMPLETED') {\n return 'tw-bg-green-100 tw-text-green-800 dark:tw-bg-green-900/30 dark:tw-text-green-300';\n } else if (status === 'PENDING') {\n return 'tw-bg-yellow-100 tw-text-yellow-800 dark:tw-bg-yellow-900/30 dark:tw-text-yellow-300';\n } else if (status === 'FAILED' || status === 'CANCELLED') {\n return 'tw-bg-red-100 tw-text-red-800 dark:tw-bg-red-900/30 dark:tw-text-red-300';\n } else if (status === 'REFUNDED') {\n return 'tw-bg-blue-100 tw-text-blue-800 dark:tw-bg-blue-900/30 dark:tw-text-blue-300';\n }\n return 'tw-bg-gray-100 tw-text-gray-800 dark:tw-bg-gray-700 dark:tw-text-gray-300';\n }\n\n getStudentName(): string {\n // If student is populated, extract name\n const payment = this.feePayment();\n if (!payment) return '';\n // This would need to be populated from API response\n return '';\n }\n\n formatCurrency(amount: number): string {\n return new Intl.NumberFormat('en-IN', {\n style: 'currency',\n currency: 'INR',\n minimumFractionDigits: 2\n }).format(amount);\n }\n\n printReceipt(): void {\n const payment = this.feePayment();\n if (!payment?._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n // Generate receipt if not already generated\n if (!this.receiptHtml()) {\n this.generateReceipt(() => {\n this.printReceiptHtml();\n });\n } else {\n this.printReceiptHtml();\n }\n }\n\n private printReceiptHtml(): void {\n const html = this.receiptHtml();\n if (html) {\n const printWindow = window.open('', '_blank');\n if (printWindow) {\n printWindow.document.write(html);\n printWindow.document.close();\n printWindow.focus();\n setTimeout(() => {\n printWindow.print();\n printWindow.close();\n }, 250);\n }\n } else {\n // Fallback to browser print\n window.print();\n }\n }\n\n downloadReceipt(): void {\n if (!this.rightsService.hasRight('DOWNLOAD_RECEIPT')) {\n this.notificationService.error('You do not have permission to download receipts');\n return;\n }\n const payment = this.feePayment();\n if (!payment?._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n // Generate receipt if not already generated\n if (!this.receiptHtml()) {\n this.generateReceipt(() => {\n this.downloadReceiptPdf();\n });\n } else {\n this.downloadReceiptPdf();\n }\n }\n\n private downloadReceiptPdf(): void {\n const payment = this.feePayment();\n if (!payment?._id) {\n return;\n }\n\n const paymentId = payment._id;\n const receiptUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'fees',\n 'receipt',\n paymentId,\n 'pdf'\n ]);\n\n // Open in new tab for download\n window.open(receiptUrl, '_blank');\n this.notificationService.info('Downloading receipt PDF...');\n }\n\n generateReceipt(callback?: () => void): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to generate receipts');\n return;\n }\n const payment = this.feePayment();\n if (!payment?._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n this.generatingReceipt.set(true);\n\n const paymentId = payment._id;\n const generateUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'fees',\n 'receipt',\n 'generate',\n paymentId\n ]);\n\n this.http.post<any>(generateUrl, {}).subscribe({\n next: (response) => {\n this.generatingReceipt.set(false);\n if (response?.success && response?.data) {\n // Store receipt HTML if available\n if (response.data.receiptHtml) {\n this.receiptHtml.set(response.data.receiptHtml);\n }\n this.notificationService.success('Receipt generated successfully');\n if (callback) {\n callback();\n }\n } else {\n this.notificationService.error(response?.message || 'Failed to generate receipt');\n }\n },\n error: (err) => {\n console.error('Error generating receipt:', err);\n this.generatingReceipt.set(false);\n this.notificationService.error('Failed to generate receipt');\n }\n });\n }\n\n viewReceipt(): void {\n if (!this.rightsService.hasRight('VIEW')) {\n this.notificationService.error('You do not have permission to view receipts');\n return;\n }\n const payment = this.feePayment();\n if (!payment?._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n // Generate receipt if not already generated\n if (!this.receiptHtml()) {\n this.generateReceipt(() => {\n this.openReceiptInNewTab();\n });\n } else {\n this.openReceiptInNewTab();\n }\n }\n\n private openReceiptInNewTab(): void {\n const html = this.receiptHtml();\n if (html) {\n const newWindow = window.open('', '_blank');\n if (newWindow) {\n newWindow.document.write(html);\n newWindow.document.close();\n }\n } else {\n // Fallback: get receipt HTML from API\n const payment = this.feePayment();\n if (payment?._id) {\n const paymentId = payment._id;\n const receiptUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'fees',\n 'receipt',\n paymentId,\n 'html'\n ]);\n\n this.http.get<any>(receiptUrl).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const receiptHtml = response.data.html || response.data.receiptHtml;\n if (receiptHtml) {\n this.receiptHtml.set(receiptHtml);\n const newWindow = window.open('', '_blank');\n if (newWindow) {\n newWindow.document.write(receiptHtml);\n newWindow.document.close();\n }\n } else {\n this.notificationService.warning('Receipt HTML not available');\n }\n }\n },\n error: (err) => {\n console.error('Error loading receipt HTML:', err);\n this.notificationService.error('Failed to load receipt');\n }\n });\n }\n }\n }\n\n goBack(): void {\n this.router.navigate(['/control-panel/payment']);\n }\n}\n","import { Component, inject, signal, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'cide-discount-rules',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule],\r\n template: `\r\n <div class=\"discount-rules-container\">\r\n <div class=\"header\">\r\n <h1>Discount Rules Management</h1>\r\n <button class=\"btn btn-primary\" (click)=\"openRuleModal()\">Create New Rule</button>\r\n </div>\r\n\r\n <!-- Tabs -->\r\n <div class=\"tabs\">\r\n <button class=\"tab\" [class.active]=\"activeTab() === 'rules'\" (click)=\"activeTab.set('rules')\">Discount Rules</button>\r\n <button class=\"tab\" [class.active]=\"activeTab() === 'applied'\" (click)=\"activeTab.set('applied')\">Applied Discounts</button>\r\n <button class=\"tab\" [class.active]=\"activeTab() === 'scholarships'\" (click)=\"activeTab.set('scholarships')\">Scholarships</button>\r\n </div>\r\n\r\n <!-- Rules Tab -->\r\n @if (activeTab() === 'rules') {\r\n <div class=\"rules-section\">\r\n <div class=\"table-container\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th>Rule Name</th>\r\n <th>Rule Code</th>\r\n <th>Discount Type</th>\r\n <th>Discount Value</th>\r\n <th>Applies To</th>\r\n <th>Priority</th>\r\n <th>Auto Apply</th>\r\n <th>Status</th>\r\n <th>Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (rule of discountRules(); track rule.id) {\r\n <tr>\r\n <td>{{ rule.name }}</td>\r\n <td>{{ rule.code }}</td>\r\n <td><span class=\"badge\">{{ rule.discount_type }}</span></td>\r\n <td class=\"discount-value\">{{ rule.discount_type === 'PERCENTAGE' ? rule.value + '%' : 'โน' + rule.value }}</td>\r\n <td>{{ rule.applies_to }}</td>\r\n <td><span class=\"priority\">{{ rule.priority }}</span></td>\r\n <td><span class=\"status-badge\" [class.active]=\"rule.auto_apply\">{{ rule.auto_apply ? 'Yes' : 'No' }}</span></td>\r\n <td><span class=\"status-badge\" [class.active]=\"rule.status === 'ACTIVE'\">{{ rule.status }}</span></td>\r\n <td>\r\n <button class=\"btn-icon\" (click)=\"editRule(rule)\">โ๏ธ</button>\r\n <button class=\"btn-icon\" (click)=\"toggleRuleStatus(rule)\">๐</button>\r\n <button class=\"btn-icon\" (click)=\"deleteRule(rule)\">๐๏ธ</button>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Rule Modal -->\r\n @if (showRuleModal()) {\r\n <div class=\"modal-overlay\" (click)=\"closeRuleModal()\">\r\n <div class=\"modal-content\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"modal-header\">\r\n <h2>{{ editingRule() ? 'Edit' : 'Create' }} Discount Rule</h2>\r\n <button class=\"close-btn\" (click)=\"closeRuleModal()\">ร</button>\r\n </div>\r\n <form [formGroup]=\"ruleForm\" class=\"modal-body\">\r\n <div class=\"form-row\">\r\n <div class=\"form-group\">\r\n <label>Rule Name *</label>\r\n <input type=\"text\" formControlName=\"rule_name\" placeholder=\"e.g., Sibling Discount\" />\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Rule Code *</label>\r\n <input type=\"text\" formControlName=\"rule_code\" placeholder=\"e.g., SIBLING_DISC\" />\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Description</label>\r\n <textarea formControlName=\"description\" rows=\"3\" placeholder=\"Describe the discount rule...\"></textarea>\r\n </div>\r\n <div class=\"form-row\">\r\n <div class=\"form-group\">\r\n <label>Discount Type *</label>\r\n <select formControlName=\"discount_type\">\r\n <option value=\"PERCENTAGE\">Percentage</option>\r\n <option value=\"FIXED_AMOUNT\">Fixed Amount</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Discount Value *</label>\r\n <input type=\"number\" formControlName=\"discount_value\" placeholder=\"Enter value\" />\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Applies To Fee Categories *</label>\r\n <select formControlName=\"applies_to\" multiple>\r\n <option value=\"ALL\">All Categories</option>\r\n <option value=\"TUITION\">Tuition</option>\r\n <option value=\"EXAM\">Exam Fees</option>\r\n <option value=\"LIBRARY\">Library</option>\r\n <option value=\"LAB\">Lab</option>\r\n <option value=\"SPORTS\">Sports</option>\r\n <option value=\"TRANSPORT\">Transport</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Criteria (JSON Format)</label>\r\n <textarea formControlName=\"criteria_json\" rows=\"4\" placeholder='{\"sibling_count\": \">= 1\", \"staff_role\": \"TEACHER\"}'></textarea>\r\n <small>Define conditions for automatic discount application</small>\r\n </div>\r\n <div class=\"form-row\">\r\n <div class=\"form-group\">\r\n <label>Priority</label>\r\n <input type=\"number\" formControlName=\"priority\" placeholder=\"1\" />\r\n <small>Higher priority rules apply first</small>\r\n </div>\r\n <div class=\"form-group checkbox-group\">\r\n <label><input type=\"checkbox\" formControlName=\"auto_apply\" /> Auto Apply</label>\r\n <label><input type=\"checkbox\" formControlName=\"stackable\" /> Stackable with other discounts</label>\r\n </div>\r\n </div>\r\n <div class=\"form-row\">\r\n <div class=\"form-group\">\r\n <label>Valid From</label>\r\n <input type=\"date\" formControlName=\"valid_from\" />\r\n </div>\r\n <div class=\"form-group\">\r\n <label>Valid To</label>\r\n <input type=\"date\" formControlName=\"valid_to\" />\r\n </div>\r\n </div>\r\n </form>\r\n <div class=\"modal-footer\">\r\n <button class=\"btn btn-secondary\" (click)=\"closeRuleModal()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"saveRule()\" [disabled]=\"ruleForm.invalid\">Save Rule</button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .discount-rules-container { padding: 20px; }\r\n .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }\r\n .btn { padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; }\r\n .btn-primary { background: #007bff; color: white; }\r\n .btn-secondary { background: #6c757d; color: white; }\r\n .tabs { display: flex; gap: 10px; margin-bottom: 20px; border-bottom: 2px solid #e0e0e0; }\r\n .tab { padding: 12px 24px; background: none; border: none; border-bottom: 3px solid transparent; cursor: pointer; font-weight: 500; }\r\n .tab.active { border-bottom-color: #007bff; color: #007bff; }\r\n .table-container { overflow-x: auto; background: white; border-radius: 8px; border: 1px solid #e0e0e0; }\r\n table { width: 100%; border-collapse: collapse; }\r\n thead { background: #f8f9fa; }\r\n th { padding: 12px; text-align: left; font-weight: 600; border-bottom: 2px solid #dee2e6; }\r\n td { padding: 12px; border-bottom: 1px solid #dee2e6; }\r\n .badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; background: #e3f2fd; color: #1976d2; }\r\n .discount-value { font-weight: 600; color: #28a745; }\r\n .priority { display: inline-block; width: 30px; height: 30px; line-height: 30px; text-align: center; background: #ffc107; color: white; border-radius: 50%; font-weight: bold; }\r\n .status-badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; background: #f8d7da; color: #721c24; }\r\n .status-badge.active { background: #d4edda; color: #155724; }\r\n .btn-icon { background: none; border: none; cursor: pointer; font-size: 18px; padding: 4px; }\r\n .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; }\r\n .modal-content { background: white; border-radius: 8px; max-width: 800px; width: 90%; max-height: 90vh; overflow-y: auto; }\r\n .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 20px; border-bottom: 1px solid #e0e0e0; }\r\n .close-btn { background: none; border: none; font-size: 28px; cursor: pointer; color: #666; }\r\n .modal-body { padding: 20px; }\r\n .modal-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 20px; border-top: 1px solid #e0e0e0; }\r\n .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; }\r\n .form-group { margin-bottom: 15px; }\r\n .form-group label { display: block; margin-bottom: 5px; font-weight: 500; font-size: 14px; }\r\n .form-group input, .form-group select, .form-group textarea { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; }\r\n .form-group small { color: #666; font-size: 12px; }\r\n .checkbox-group { display: flex; flex-direction: column; gap: 8px; }\r\n .checkbox-group label { display: flex; align-items: center; gap: 8px; }\r\n `]\r\n})\r\nexport class DiscountRulesComponent implements OnInit {\r\n private fb = inject(FormBuilder);\r\n\r\n activeTab = signal<string>('rules');\r\n showRuleModal = signal<boolean>(false);\r\n editingRule = signal<any>(null);\r\n discountRules = signal<any[]>([]);\r\n\r\n ruleForm: FormGroup = this.fb.group({\r\n rule_name: ['', Validators.required],\r\n rule_code: ['', Validators.required],\r\n description: [''],\r\n discount_type: ['PERCENTAGE', Validators.required],\r\n discount_value: ['', [Validators.required, Validators.min(0)]],\r\n applies_to: [['ALL'], Validators.required],\r\n criteria_json: [''],\r\n priority: [1],\r\n auto_apply: [false],\r\n stackable: [false],\r\n valid_from: [''],\r\n valid_to: ['']\r\n });\r\n\r\n ngOnInit(): void {\r\n this.loadDiscountRules();\r\n }\r\n\r\n private loadDiscountRules(): void {\r\n // Mock data - replace with actual API call\r\n this.discountRules.set([\r\n { id: 1, name: 'Sibling 20% on term fees', code: 'SIBLING_TERM_20', discount_type: 'PERCENTAGE', value: 20, applies_to: 'Term Fees', priority: 1, auto_apply: true, status: 'ACTIVE' },\r\n { id: 2, name: 'Teachers 1st child โน2000 on exam fees', code: 'TEACHER_EXAM_2000', discount_type: 'FIXED_AMOUNT', value: 2000, applies_to: 'Exam Fees', priority: 2, auto_apply: true, status: 'ACTIVE' },\r\n { id: 3, name: 'Early Payment Discount', code: 'EARLY_PAY_10', discount_type: 'PERCENTAGE', value: 10, applies_to: 'All', priority: 3, auto_apply: false, status: 'ACTIVE' }\r\n ]);\r\n }\r\n\r\n openRuleModal(): void {\r\n this.editingRule.set(null);\r\n this.ruleForm.reset({ discount_type: 'PERCENTAGE', priority: 1, applies_to: ['ALL'] });\r\n this.showRuleModal.set(true);\r\n }\r\n\r\n closeRuleModal(): void {\r\n this.showRuleModal.set(false);\r\n }\r\n\r\n editRule(rule: any): void {\r\n this.editingRule.set(rule);\r\n this.ruleForm.patchValue(rule);\r\n this.showRuleModal.set(true);\r\n }\r\n\r\n saveRule(): void {\r\n if (this.ruleForm.valid) {\r\n console.log('Saving rule:', this.ruleForm.value);\r\n this.closeRuleModal();\r\n this.loadDiscountRules();\r\n }\r\n }\r\n\r\n toggleRuleStatus(rule: any): void {\r\n console.log('Toggle status:', rule);\r\n }\r\n\r\n deleteRule(rule: any): void {\r\n if (confirm('Are you sure you want to delete this rule?')) {\r\n console.log('Delete rule:', rule);\r\n }\r\n }\r\n}\r\n\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n cidePath,\r\n feesRoutesUrl,\r\n hostManagerRoutesUrl,\r\n generateStringFromObject,\r\n type feeReceiptTemplateControllerResponse,\r\n type MFeeReceiptTemplate,\r\n type feeReceiptTemplateByIdControllerResponse,\r\n type MFeeReceiptTemplateGetByIdPayload,\r\n type feeReceiptTemplateInsertUpdateControllerResponse,\r\n type MFeeReceiptTemplateInsertUpdatePayload,\r\n type feeReceiptTemplateDeleteControllerResponse,\r\n type MFeeReceiptTemplateDeletePayload,\r\n type feeReceiptTemplateToggleStatusControllerResponse,\r\n type MFeeReceiptTemplateToggleStatusPayload\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReceiptTemplateService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Get list of receipt templates\r\n * @param payload - Query parameters for filtering/pagination\r\n * @returns Observable of receipt template list response\r\n */\r\n getReceiptTemplateList(payload: MFeeReceiptTemplate): Observable<feeReceiptTemplateControllerResponse> {\r\n console.log(\"Receipt Template List Payload:\", payload);\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate,\r\n query\r\n ]);\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n /**\r\n * Get receipt template by ID\r\n * @param payload - Receipt template ID payload\r\n * @returns Observable of receipt template data\r\n */\r\n getReceiptTemplateById(payload: MFeeReceiptTemplateGetByIdPayload): Observable<feeReceiptTemplateByIdControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate,\r\n 'byId',\r\n query\r\n ]);\r\n\r\n return this.http.get(url);\r\n }\r\n\r\n /**\r\n * Create or update receipt template\r\n * @param data - Receipt template data to save\r\n * @returns Observable of the save response\r\n */\r\n saveUpdateReceiptTemplate(data: MFeeReceiptTemplateInsertUpdatePayload): Observable<feeReceiptTemplateInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate\r\n ]);\r\n\r\n return this.http.post(url, data);\r\n }\r\n\r\n /**\r\n * Delete receipt template\r\n * @param payload - Receipt template ID payload\r\n * @returns Observable of the delete response\r\n */\r\n deleteReceiptTemplate(payload: MFeeReceiptTemplateDeletePayload): Observable<feeReceiptTemplateDeleteControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate,\r\n 'delete',\r\n query\r\n ]);\r\n\r\n return this.http.delete(url);\r\n }\r\n\r\n /**\r\n * Toggle receipt template status\r\n * @param payload - Receipt template ID payload\r\n * @returns Observable of the toggle response\r\n */\r\n toggleReceiptTemplateStatus(payload: MFeeReceiptTemplateToggleStatusPayload): Observable<feeReceiptTemplateToggleStatusControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.receiptTemplate,\r\n 'toggle-status'\r\n ]);\r\n\r\n console.log('๐ Making PATCH request to toggle receipt template status:', { url, payload });\r\n return this.http.patch(url, payload);\r\n }\r\n}\r\n\r\n\r\n\r\n","import { Component, inject, signal, OnInit, OnDestroy, computed, ViewChild, ElementRef, input, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { DestroyRef } from '@angular/core';\nimport { startWith } from 'rxjs';\nimport {\n CideInputComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent,\n NotificationService,\n ConfirmationService\n} from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, CideLytSharedWrapperSetupParam } from 'cloud-ide-layout';\nimport { ReceiptTemplateService } from '../../services/receipt-template.service';\nimport { \n MFeeReceiptTemplate,\n MFeeReceiptTemplateGetByIdPayload,\n MFeeReceiptTemplateInsertUpdatePayload,\n type FeeReceiptTemplate} from 'cloud-ide-lms-model';\n\ninterface TagCategory {\n id: string;\n name: string;\n icon: string;\n tags: Tag[];\n}\n\ninterface Tag {\n code: string;\n description: string;\n example?: string;\n}\n\n@Component({\n selector: 'cide-receipt-template-designer',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './template-designer.component.html',\n styleUrl: './template-designer.component.scss'\n})\nexport class TemplateDesignerComponent extends CideLytSharedWrapperComponent implements OnInit, OnDestroy {\n public override shared_wrapper_setup_param = input<Partial<CideLytSharedWrapperSetupParam>>({\n sypg_page_code: \"receipt_template\"\n });\n private readonly fb = inject(FormBuilder);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly receiptTemplateService = inject(ReceiptTemplateService);\n private readonly cdr = inject(ChangeDetectorRef);\n \n @ViewChild('htmlEditor', { static: false }) htmlEditorRef?: ElementRef<HTMLTextAreaElement>;\n\n templateForm: FormGroup = this.fb.group({\n template_name: ['', Validators.required],\n template_code: ['', Validators.required],\n template_type: ['PAYMENT', Validators.required],\n template_for: ['BOTH'],\n is_default: [false],\n template_html: ['', Validators.required],\n css_styles: [''],\n tag_search: [''], // For tag search input\n preview_type: ['STUDENT'] // For preview type selector\n });\n\n readonly activeCategory = signal<string>('entity');\n readonly tagSearchQuery = signal<string>('');\n readonly loading = signal<boolean>(false);\n readonly saving = signal<boolean>(false);\n readonly currentTemplateId = signal<string | null>(null);\n readonly templates = signal<FeeReceiptTemplate[]>([]);\n readonly loadingTemplates = signal<boolean>(false);\n\n readonly tagCategories: TagCategory[] = [\n {\n id: 'entity',\n name: 'Entity/School',\n icon: 'business',\n tags: [\n { code: '[entity_id]', description: 'Entity ID', example: '65c78b6fa1194f56586a9f1a' },\n { code: '[entity_name]', description: 'Entity/School Name', example: 'Dream Dale Public School' },\n { code: '[entity_logo]', description: 'Entity Logo URL', example: 'https://...' },\n { code: '[entity_address]', description: 'Entity Address', example: 'Shastrinagar, Bhandara' },\n { code: '[entity_phone]', description: 'Entity Phone', example: '+91-1234567890' }\n ]\n },\n {\n id: 'student',\n name: 'Student Info',\n icon: 'person',\n tags: [\n { code: '[student_id]', description: 'Student ID', example: 'STU-2024-001' },\n { code: '[student_full_name]', description: 'Student Full Name', example: 'AASHI SANJAY NANDURKAR' },\n { code: '[student_first_name]', description: 'Student First Name', example: 'AASHI' },\n { code: '[student_last_name]', description: 'Student Last Name', example: 'NANDURKAR' },\n { code: '[student_gender]', description: 'Student Gender', example: 'Female' },\n { code: '[student_dob]', description: 'Date of Birth', example: '01/01/2010' },\n { code: '[student_email]', description: 'Student Email', example: 'student@example.com' },\n { code: '[student_phone]', description: 'Student Phone', example: '+91-9876543210' },\n { code: '[student_address]', description: 'Student Address', example: '123 Main Street' },\n { code: '[parent_name]', description: 'Parent/Guardian Name', example: 'SANJAY NANDURKAR' },\n { code: '[parent_phone]', description: 'Parent Phone', example: '+91-9876543210' }\n ]\n },\n {\n id: 'academic',\n name: 'Academic',\n icon: 'school',\n tags: [\n { code: '[academic_year_id]', description: 'Academic Year ID', example: '68bb3279c154ce23423aeb8a' },\n { code: '[academic_year_name]', description: 'Academic Year Name', example: 'AY 2023-2024' },\n { code: '[academic_year_code]', description: 'Academic Year Code', example: '2023-24' },\n { code: '[class_program_id]', description: 'Class/Program ID', example: '68bb3279c154ce23423aeb8b' },\n { code: '[class_program_name]', description: 'Class/Program Name', example: '4th Standard' },\n { code: '[branch_id]', description: 'Branch ID', example: '68bb3279c154ce23423aeb8c' },\n { code: '[branch_name]', description: 'Branch/Specialization Name', example: 'Science' },\n { code: '[term_id]', description: 'Term ID', example: '68bb3279c154ce23423aeb8d' },\n { code: '[term_name]', description: 'Term Name', example: 'First Term' },\n { code: '[section_id]', description: 'Section ID', example: '68bb3279c154ce23423aeb8e' },\n { code: '[section_name]', description: 'Section Name', example: 'A' }\n ]\n },\n {\n id: 'payment',\n name: 'Payment Info',\n icon: 'payment',\n tags: [\n { code: '[feepay_receipt_number]', description: 'Receipt Number', example: 'RCP-2024-001234' },\n { code: '[feepay_payment_date]', description: 'Payment Date', example: '09/12/2023' },\n { code: '[feepay_payment_mode]', description: 'Payment Mode', example: 'CASH' },\n { code: '[feepay_payment_reference]', description: 'Payment Reference', example: 'REF-123456' },\n { code: '[feepay_bank_name]', description: 'Bank Name', example: 'State Bank of India' },\n { code: '[feepay_bank_branch_name]', description: 'Bank Branch Name', example: 'Bhandara Main Branch' },\n { code: '[feepay_bank_ifsc_code]', description: 'Bank IFSC Code', example: 'SBIN0001234' },\n { code: '[feepay_bank_account_number]', description: 'Bank Account Number', example: '1234567890' },\n { code: '[feepay_cheque_number]', description: 'Cheque Number', example: 'CHQ-123456' },\n { code: '[feepay_cheque_date]', description: 'Cheque Date', example: '09/12/2023' },\n { code: '[feepay_transaction_reference]', description: 'Transaction Reference', example: 'TXN-123456' },\n { code: '[feepay_instrument_date]', description: 'Instrument Date', example: '09/12/2023' },\n { code: '[feepay_status]', description: 'Payment Status', example: 'SUCCESS' },\n { code: '[feepay_remarks]', description: 'Payment Remarks', example: 'Payment received' }\n ]\n },\n {\n id: 'fee_items',\n name: 'Fee Items (Dynamic)',\n icon: 'list',\n tags: [\n { code: '[fee_items_count]', description: 'Number of Fee Items', example: '3' },\n { code: '[fee_items_loop_start]', description: 'Start Loop for Fee Items', example: '<!-- Use with fee_items_loop_end -->' },\n { code: '[fee_items_loop_end]', description: 'End Loop for Fee Items', example: '<!-- Use with fee_items_loop_start -->' },\n { code: '[fee_item_index]', description: 'Current Item Index (0-based)', example: '0' },\n { code: '[fee_item_number]', description: 'Current Item Number (1-based)', example: '1' },\n { code: '[fee_item_id]', description: 'Fee Item ID', example: '68bb3279c154ce23423aeb8f' },\n { code: '[fee_item_name]', description: 'Fee Item Name', example: 'Tuition Fee' },\n { code: '[fee_item_code]', description: 'Fee Item Code', example: 'TUITION' },\n { code: '[fee_item_category]', description: 'Fee Category Name', example: 'Academic Fees' },\n { code: '[fee_item_description]', description: 'Fee Item Description', example: 'Monthly tuition fee' },\n { code: '[fee_item_amount]', description: 'Fee Item Amount', example: '5000.00' },\n { code: '[fee_item_amount_paid]', description: 'Amount Paid for This Item', example: '5000.00' },\n { code: '[fee_item_late_fee]', description: 'Late Fee for This Item', example: '0.00' },\n { code: '[fee_item_discount]', description: 'Discount Applied to This Item', example: '0.00' },\n { code: '[fee_item_total]', description: 'Total for This Item', example: '5000.00' }\n ]\n },\n {\n id: 'fee_structure',\n name: 'Fee Structure',\n icon: 'account_tree',\n tags: [\n { code: '[fee_structure_id]', description: 'Fee Structure ID', example: '68bb3279c154ce23423aeb90' },\n { code: '[fee_structure_name]', description: 'Fee Structure Name', example: 'Standard Fee Structure 2024' },\n { code: '[fee_structure_code]', description: 'Fee Structure Code', example: 'STD-2024' },\n { code: '[fee_structure_description]', description: 'Fee Structure Description', example: 'Standard fee structure for academic year 2024' }\n ]\n },\n {\n id: 'fee_assignment',\n name: 'Fee Assignment',\n icon: 'assignment',\n tags: [\n { code: '[fee_assignment_number]', description: 'Assignment Number', example: 'ASG-2024-001' },\n { code: '[fee_assignment_date]', description: 'Assignment Date', example: '01/04/2024' },\n { code: '[fee_due_date]', description: 'Fee Due Date', example: '30/04/2024' },\n { code: '[fee_collection_start_date]', description: 'Collection Start Date', example: '01/04/2024' },\n { code: '[fee_collection_end_date]', description: 'Collection End Date', example: '30/04/2024' },\n { code: '[fee_original_amount]', description: 'Original Fee Amount', example: '50000.00' },\n { code: '[fee_assigned_amount]', description: 'Assigned Amount', example: '50000.00' },\n { code: '[fee_paid_amount]', description: 'Total Paid Amount', example: '25000.00' },\n { code: '[fee_outstanding_amount]', description: 'Outstanding Amount', example: '25000.00' },\n { code: '[fee_payment_status]', description: 'Payment Status', example: 'PARTIALLY_PAID' },\n { code: '[fee_installment_count]', description: 'Installment Count', example: '4' },\n { code: '[fee_installment_amount]', description: 'Installment Amount', example: '12500.00' },\n { code: '[fee_paid_installments]', description: 'Paid Installments', example: '2' }\n ]\n },\n {\n id: 'amounts',\n name: 'Amounts',\n icon: 'currency_rupee',\n tags: [\n { code: '[feepay_total_amount]', description: 'Total Payment Amount', example: '17500.00' },\n { code: '[feepay_discount_amount]', description: 'Total Discount Amount', example: '500.00' },\n { code: '[feepay_discount_percentage]', description: 'Discount Percentage', example: '2.5' },\n { code: '[feepay_discount_reason]', description: 'Discount Reason', example: 'Early payment discount' },\n { code: '[feepay_late_fee_amount]', description: 'Total Late Fee Amount', example: '200.00' },\n { code: '[subtotal_amount]', description: 'Subtotal (Before Discount/Late Fee)', example: '17000.00' },\n { code: '[net_amount]', description: 'Net Amount (After Discount, Before Late Fee)', example: '16500.00' },\n { code: '[amount_in_words]', description: 'Amount in Words', example: 'Seventeen Thousand Five Hundred Rupees Only' },\n { code: '[currency_symbol]', description: 'Currency Symbol', example: 'โน' },\n { code: '[currency_code]', description: 'Currency Code', example: 'INR' }\n ]\n },\n {\n id: 'installments',\n name: 'Installments',\n icon: 'calendar_view_month',\n tags: [\n { code: '[installments_count]', description: 'Number of Installments', example: '4' },\n { code: '[installments_loop_start]', description: 'Start Loop for Installments', example: '<!-- Use with installments_loop_end -->' },\n { code: '[installments_loop_end]', description: 'End Loop for Installments', example: '<!-- Use with installments_loop_start -->' },\n { code: '[installment_number]', description: 'Installment Number (1-based)', example: '1' },\n { code: '[installment_due_date]', description: 'Installment Due Date', example: '01/04/2024' },\n { code: '[installment_amount]', description: 'Installment Amount', example: '12500.00' },\n { code: '[installment_percentage]', description: 'Installment Percentage', example: '25' },\n { code: '[installment_status]', description: 'Installment Status', example: 'PAID' },\n { code: '[installment_paid_date]', description: 'Installment Paid Date', example: '01/04/2024' }\n ]\n },\n {\n id: 'receipt',\n name: 'Receipt',\n icon: 'description',\n tags: [\n { code: '[receipt_number]', description: 'Receipt Number', example: 'RCP-2024-001234' },\n { code: '[receipt_date]', description: 'Receipt Date', example: '09/12/2023' },\n { code: '[receipt_generated_at]', description: 'Receipt Generated At', example: '09/12/2023 10:30 AM' },\n { code: '[receipt_generated_by]', description: 'Receipt Generated By', example: 'Admin User' }\n ]\n }\n ];\n\n readonly filteredTags = computed(() => {\n const category = this.tagCategories.find(cat => cat.id === this.activeCategory());\n if (!category) return [];\n \n const query = this.tagSearchQuery().toLowerCase();\n if (!query) return category.tags;\n \n return category.tags.filter(tag => \n tag.code.toLowerCase().includes(query) || \n tag.description.toLowerCase().includes(query)\n );\n });\n\n // Reactive signal for template HTML - tracks form control changes\n readonly templateHtmlSignal = toSignal(\n this.templateForm.get('template_html')!.valueChanges.pipe(\n startWith(this.templateForm.get('template_html')?.value || '')\n ),\n { initialValue: this.templateForm.get('template_html')?.value || '' }\n );\n\n // Reactive signal for preview type - tracks preview type changes\n readonly previewTypeSignal = toSignal(\n this.templateForm.get('preview_type')!.valueChanges.pipe(\n startWith(this.templateForm.get('preview_type')?.value || 'STUDENT')\n ),\n { initialValue: this.templateForm.get('preview_type')?.value || 'STUDENT' }\n );\n\n readonly previewHtml = computed(() => {\n // Access both signals to make computed reactive to both changes\n const templateHtml = this.templateHtmlSignal(); // Read to track dependency\n const previewType = this.previewTypeSignal(); // Read to track dependency\n // Use the reactive signal instead of reading directly from form\n const htmlContent = this.getPreviewWithSampleData();\n return this.sanitizer.bypassSecurityTrustHtml(htmlContent);\n });\n\n constructor() {\n super();\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n // Only load default template if no template ID is provided\n if (!this.currentTemplateId()) {\n this.loadDefaultTemplate();\n }\n this.setupFormListeners();\n }\n\n private setupFormListeners(): void {\n // Listen to tag search changes with debounce for better performance\n this.templateForm.get('tag_search')?.valueChanges\n .pipe(\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe((query: string | null) => {\n const searchQuery = query || '';\n this.onTagSearch(searchQuery);\n // Also update the signal directly to ensure computed signal updates\n this.tagSearchQuery.set(searchQuery);\n });\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n insertTag(tag: Tag): void {\n // Try to get textarea from ViewChild first\n let textarea = this.htmlEditorRef?.nativeElement;\n \n // If ViewChild is not available, try to find it in the DOM\n if (!textarea) {\n const textareaElement = document.querySelector('.template-html-editor') as HTMLTextAreaElement;\n if (textareaElement) {\n textarea = textareaElement;\n }\n }\n \n if (!textarea) {\n // Fallback: just append to the end\n const currentValue = this.templateForm.get('template_html')?.value || '';\n this.templateForm.patchValue({ template_html: currentValue + tag.code });\n return;\n }\n\n const start = textarea.selectionStart || 0;\n const end = textarea.selectionEnd || 0;\n const currentValue = this.templateForm.get('template_html')?.value || '';\n const newValue = currentValue.substring(0, start) + tag.code + currentValue.substring(end);\n \n this.templateForm.patchValue({ template_html: newValue });\n \n // Restore cursor position after tag insertion\n setTimeout(() => {\n textarea.focus();\n const newPosition = start + tag.code.length;\n textarea.setSelectionRange(newPosition, newPosition);\n }, 0);\n }\n\n private getPreviewWithSampleData(): string {\n // Use the reactive signal to ensure preview updates when template changes\n let html = this.templateHtmlSignal() || '';\n \n // Sample fee payment items data\n const sampleFeeItems = [\n { \n index: 0, \n number: 1,\n id: '68bb3279c154ce23423aeb8f',\n name: 'Tuition Fee',\n code: 'TUITION',\n category: 'Academic Fees',\n description: 'Monthly tuition fee',\n amount: 5000.00,\n amount_paid: 5000.00,\n late_fee: 0.00,\n discount: 0.00,\n total: 5000.00\n },\n { \n index: 1, \n number: 2,\n id: '68bb3279c154ce23423aeb90',\n name: 'Laboratory Fee',\n code: 'LABORATORY',\n category: 'Academic Fees',\n description: 'Laboratory equipment and materials',\n amount: 3000.00,\n amount_paid: 3000.00,\n late_fee: 0.00,\n discount: 500.00,\n total: 2500.00\n },\n { \n index: 2, \n number: 3,\n id: '68bb3279c154ce23423aeb91',\n name: 'Library Fee',\n code: 'LIBRARY',\n category: 'Academic Fees',\n description: 'Library membership fee',\n amount: 1000.00,\n amount_paid: 1000.00,\n late_fee: 0.00,\n discount: 0.00,\n total: 1000.00\n }\n ];\n\n // Sample installment data\n const sampleInstallments = [\n { number: 1, due_date: '01/04/2024', amount: 3000.00, percentage: 30, status: 'PAID', paid_date: '01/04/2024' },\n { number: 2, due_date: '01/05/2024', amount: 3000.00, percentage: 30, status: 'PAID', paid_date: '01/05/2024' },\n { number: 3, due_date: '01/06/2024', amount: 2000.00, percentage: 20, status: 'PENDING', paid_date: '' },\n { number: 4, due_date: '01/07/2024', amount: 2000.00, percentage: 20, status: 'PENDING', paid_date: '' }\n ];\n\n // Process fee items loop\n if (html.includes('[fee_items_loop_start]') && html.includes('[fee_items_loop_end]')) {\n const loopStart = html.indexOf('[fee_items_loop_start]');\n const loopEnd = html.indexOf('[fee_items_loop_end]');\n if (loopStart !== -1 && loopEnd !== -1) {\n const loopTemplate = html.substring(loopStart + '[fee_items_loop_start]'.length, loopEnd);\n let loopContent = '';\n \n sampleFeeItems.forEach((item, idx) => {\n let itemHtml = loopTemplate;\n itemHtml = itemHtml.replace(/\\[fee_item_index\\]/g, idx.toString());\n itemHtml = itemHtml.replace(/\\[fee_item_number\\]/g, item.number.toString());\n itemHtml = itemHtml.replace(/\\[fee_item_id\\]/g, item.id);\n itemHtml = itemHtml.replace(/\\[fee_item_name\\]/g, item.name);\n itemHtml = itemHtml.replace(/\\[fee_item_code\\]/g, item.code);\n itemHtml = itemHtml.replace(/\\[fee_item_category\\]/g, item.category);\n itemHtml = itemHtml.replace(/\\[fee_item_description\\]/g, item.description);\n itemHtml = itemHtml.replace(/\\[fee_item_amount\\]/g, item.amount.toFixed(2));\n itemHtml = itemHtml.replace(/\\[fee_item_amount_paid\\]/g, item.amount_paid.toFixed(2));\n itemHtml = itemHtml.replace(/\\[fee_item_late_fee\\]/g, item.late_fee.toFixed(2));\n itemHtml = itemHtml.replace(/\\[fee_item_discount\\]/g, item.discount.toFixed(2));\n itemHtml = itemHtml.replace(/\\[fee_item_total\\]/g, item.total.toFixed(2));\n loopContent += itemHtml;\n });\n \n html = html.substring(0, loopStart) + loopContent + html.substring(loopEnd + '[fee_items_loop_end]'.length);\n }\n }\n\n // Process installments loop\n if (html.includes('[installments_loop_start]') && html.includes('[installments_loop_end]')) {\n const loopStart = html.indexOf('[installments_loop_start]');\n const loopEnd = html.indexOf('[installments_loop_end]');\n if (loopStart !== -1 && loopEnd !== -1) {\n const loopTemplate = html.substring(loopStart + '[installments_loop_start]'.length, loopEnd);\n let loopContent = '';\n \n sampleInstallments.forEach((installment) => {\n let instHtml = loopTemplate;\n instHtml = instHtml.replace(/\\[installment_number\\]/g, installment.number.toString());\n instHtml = instHtml.replace(/\\[installment_due_date\\]/g, installment.due_date);\n instHtml = instHtml.replace(/\\[installment_amount\\]/g, installment.amount.toFixed(2));\n instHtml = instHtml.replace(/\\[installment_percentage\\]/g, installment.percentage.toString());\n instHtml = instHtml.replace(/\\[installment_status\\]/g, installment.status);\n instHtml = instHtml.replace(/\\[installment_paid_date\\]/g, installment.paid_date || 'N/A');\n loopContent += instHtml;\n });\n \n html = html.substring(0, loopStart) + loopContent + html.substring(loopEnd + '[installments_loop_end]'.length);\n }\n }\n\n // Calculate totals\n const totalAmount = sampleFeeItems.reduce((sum, item) => sum + item.amount, 0);\n const totalDiscount = sampleFeeItems.reduce((sum, item) => sum + item.discount, 0);\n const totalLateFee = sampleFeeItems.reduce((sum, item) => sum + item.late_fee, 0);\n const subtotal = totalAmount;\n const netAmount = subtotal - totalDiscount;\n const finalTotal = netAmount + totalLateFee;\n\n // Sample data for all tags (matching actual fee payment table structure)\n const sampleData: Record<string, string> = {\n // Entity/School\n '[entity_id]': '65c78b6fa1194f56586a9f1a',\n '[entity_name]': 'Dream Dale Public School, Bhandara',\n '[entity_logo]': 'https://via.placeholder.com/150',\n '[entity_address]': 'Shastrinagar, Near Dasara maidan, Bhandara-441904',\n '[entity_phone]': '+91-1234567890',\n \n // Student Info\n '[student_id]': 'STU-2024-001',\n '[student_full_name]': 'AASHI SANJAY NANDURKAR',\n '[student_first_name]': 'AASHI',\n '[student_last_name]': 'NANDURKAR',\n '[student_gender]': 'Female',\n '[student_dob]': '01/01/2010',\n '[student_email]': 'aashi.nandurkar@example.com',\n '[student_phone]': '+91-9876543210',\n '[student_address]': '123 Main Street, Bhandara',\n '[parent_name]': 'SANJAY NANDURKAR',\n '[parent_phone]': '+91-9876543211',\n \n // Academic\n '[academic_year_id]': '68bb3279c154ce23423aeb8a',\n '[academic_year_name]': 'AY 2023-2024',\n '[academic_year_code]': '2023-24',\n '[class_program_id]': '68bb3279c154ce23423aeb8b',\n '[class_program_name]': '4th Standard',\n '[branch_id]': '68bb3279c154ce23423aeb8c',\n '[branch_name]': 'Science',\n '[term_id]': '68bb3279c154ce23423aeb8d',\n '[term_name]': 'First Term',\n '[section_id]': '68bb3279c154ce23423aeb8e',\n '[section_name]': 'A',\n \n // Payment Info (from fee_payment table)\n '[feepay_receipt_number]': 'RCP-2024-001234',\n '[feepay_payment_date]': '09/12/2023',\n '[feepay_payment_mode]': 'CASH',\n '[feepay_payment_reference]': 'REF-123456',\n '[feepay_bank_name]': 'State Bank of India',\n '[feepay_bank_branch_name]': 'Bhandara Main Branch',\n '[feepay_bank_ifsc_code]': 'SBIN0001234',\n '[feepay_bank_account_number]': '1234567890',\n '[feepay_cheque_number]': 'CHQ-123456',\n '[feepay_cheque_date]': '09/12/2023',\n '[feepay_transaction_reference]': 'TXN-123456',\n '[feepay_instrument_date]': '09/12/2023',\n '[feepay_status]': 'SUCCESS',\n '[feepay_remarks]': 'Payment received successfully',\n \n // Fee Items (dynamic)\n '[fee_items_count]': sampleFeeItems.length.toString(),\n \n // Fee Structure\n '[fee_structure_id]': '68bb3279c154ce23423aeb90',\n '[fee_structure_name]': 'Standard Fee Structure 2024',\n '[fee_structure_code]': 'STD-2024',\n '[fee_structure_description]': 'Standard fee structure for academic year 2024',\n \n // Fee Assignment\n '[fee_assignment_number]': 'ASG-2024-001',\n '[fee_assignment_date]': '01/04/2024',\n '[fee_due_date]': '30/04/2024',\n '[fee_collection_start_date]': '01/04/2024',\n '[fee_collection_end_date]': '30/04/2024',\n '[fee_original_amount]': totalAmount.toFixed(2),\n '[fee_assigned_amount]': totalAmount.toFixed(2),\n '[fee_paid_amount]': finalTotal.toFixed(2),\n '[fee_outstanding_amount]': '0.00',\n '[fee_payment_status]': 'PARTIALLY_PAID',\n '[fee_installment_count]': sampleInstallments.length.toString(),\n '[fee_installment_amount]': (totalAmount / sampleInstallments.length).toFixed(2),\n '[fee_paid_installments]': '2',\n \n // Amounts\n '[feepay_total_amount]': finalTotal.toFixed(2),\n '[feepay_discount_amount]': totalDiscount.toFixed(2),\n '[feepay_discount_percentage]': totalDiscount > 0 ? ((totalDiscount / subtotal) * 100).toFixed(2) : '0.00',\n '[feepay_discount_reason]': 'Early payment discount',\n '[feepay_late_fee_amount]': totalLateFee.toFixed(2),\n '[subtotal_amount]': subtotal.toFixed(2),\n '[net_amount]': netAmount.toFixed(2),\n '[amount_in_words]': this.numberToWords(finalTotal),\n '[currency_symbol]': 'โน',\n '[currency_code]': 'INR',\n \n // Installments\n '[installments_count]': sampleInstallments.length.toString(),\n \n // Receipt\n '[receipt_number]': 'RCP-2024-001234',\n '[receipt_date]': '09/12/2023',\n '[receipt_generated_at]': new Date().toLocaleString('en-IN', { dateStyle: 'medium', timeStyle: 'short' }),\n '[receipt_generated_by]': 'Admin User'\n };\n\n // Process conditional tags (e.g., [field_name]...[/field_name])\n // These tags show content only if the field has a value\n const conditionalTagPattern = /\\[([a-z_]+)\\]([\\s\\S]*?)\\[\\/\\1\\]/gi;\n html = html.replace(conditionalTagPattern, (match: string, fieldName: string, content: string) => {\n const fieldValue = sampleData[`[${fieldName}]`];\n // Show content if field has a value (not empty, not 'N/A', not '0.00')\n if (fieldValue && fieldValue !== 'N/A' && fieldValue !== '0.00' && fieldValue.trim() !== '') {\n return content;\n }\n return ''; // Hide content if field is empty\n });\n\n // Replace all tags with sample data\n Object.entries(sampleData).forEach(([tag, value]) => {\n const escapedTag = tag.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n html = html.replace(new RegExp(escapedTag, 'g'), value);\n });\n\n return html;\n }\n\n private numberToWords(amount: number): string {\n // Simple number to words converter (can be enhanced)\n const ones = ['', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine'];\n const teens = ['Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n \n if (amount === 0) return 'Zero Rupees Only';\n \n let rupees = Math.floor(amount);\n const paise = Math.round((amount - rupees) * 100);\n \n let words = '';\n \n if (rupees >= 100000) {\n const lakhs = Math.floor(rupees / 100000);\n words += this.convertHundreds(lakhs) + ' Lakh ';\n rupees %= 100000;\n }\n \n if (rupees >= 1000) {\n const thousands = Math.floor(rupees / 1000);\n words += this.convertHundreds(thousands) + ' Thousand ';\n rupees %= 1000;\n }\n \n if (rupees > 0) {\n words += this.convertHundreds(rupees);\n }\n \n words = words.trim() + ' Rupees';\n \n if (paise > 0) {\n words += ' and ' + this.convertHundreds(paise) + ' Paise';\n }\n \n return words + ' Only';\n }\n\n private convertHundreds(num: number): string {\n const ones = ['', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine'];\n const teens = ['Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'];\n const tens = ['', '', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'];\n \n let result = '';\n \n if (num >= 100) {\n result += ones[Math.floor(num / 100)] + ' Hundred ';\n num %= 100;\n }\n \n if (num >= 20) {\n result += tens[Math.floor(num / 10)] + ' ';\n num %= 10;\n } else if (num >= 10) {\n result += teens[num - 10] + ' ';\n num = 0;\n }\n \n if (num > 0) {\n result += ones[num] + ' ';\n }\n \n return result.trim();\n }\n\n private loadDefaultTemplate(): void {\n const defaultTemplate = `<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; font-size: 12px; }\n .receipt-header { text-align: center; border-bottom: 2px solid #000; padding-bottom: 15px; margin-bottom: 20px; }\n .receipt-body { margin: 20px 0; }\n .receipt-footer { margin-top: 30px; text-align: center; border-top: 1px solid #000; padding-top: 15px; }\n table { width: 100%; border-collapse: collapse; margin: 15px 0; }\n table td { padding: 8px; border: 1px solid #ddd; }\n table th { padding: 8px; background-color: #f5f5f5; border: 1px solid #ddd; text-align: left; }\n .label { font-weight: bold; }\n .amount { font-size: 18px; font-weight: bold; }\n .text-right { text-align: right; }\n .text-center { text-align: center; }\n </style>\n</head>\n<body>\n <div class=\"receipt-header\">\n <h2>[entity_name]</h2>\n <p>[entity_address]</p>\n <p>Phone: [entity_phone]</p>\n <h3>FEE PAYMENT RECEIPT</h3>\n </div>\n <div class=\"receipt-body\">\n <table>\n <tr><td class=\"label\">Receipt Number:</td><td>[feepay_receipt_number]</td></tr>\n <tr><td class=\"label\">Receipt Date:</td><td>[feepay_payment_date]</td></tr>\n <tr><td class=\"label\">Student ID:</td><td>[student_id]</td></tr>\n <tr><td class=\"label\">Student Name:</td><td>[student_full_name]</td></tr>\n <tr><td class=\"label\">Class/Section:</td><td>[class_program_name] / [section_name]</td></tr>\n <tr><td class=\"label\">Academic Year:</td><td>[academic_year_name]</td></tr>\n <tr><td class=\"label\">Payment Mode:</td><td>[feepay_payment_mode]</td></tr>\n [feepay_bank_name]\n <tr><td class=\"label\">Bank Name:</td><td>[feepay_bank_name]</td></tr>\n [/feepay_bank_name]\n [feepay_cheque_number]\n <tr><td class=\"label\">Cheque Number:</td><td>[feepay_cheque_number]</td></tr>\n [/feepay_cheque_number]\n [feepay_transaction_reference]\n <tr><td class=\"label\">Transaction Reference:</td><td>[feepay_transaction_reference]</td></tr>\n [/feepay_transaction_reference]\n </table>\n \n <h4 style=\"margin-top: 20px; margin-bottom: 10px;\">Fee Items Details:</h4>\n <table>\n <thead>\n <tr>\n <th>Sr. No.</th>\n <th>Fee Item Name</th>\n <th>Category</th>\n <th class=\"text-right\">Amount</th>\n <th class=\"text-right\">Discount</th>\n <th class=\"text-right\">Late Fee</th>\n <th class=\"text-right\">Total</th>\n </tr>\n </thead>\n <tbody>\n [fee_items_loop_start]\n <tr>\n <td class=\"text-center\">[fee_item_number]</td>\n <td>[fee_item_name]</td>\n <td>[fee_item_category]</td>\n <td class=\"text-right\">[currency_symbol][fee_item_amount]</td>\n <td class=\"text-right\">[currency_symbol][fee_item_discount]</td>\n <td class=\"text-right\">[currency_symbol][fee_item_late_fee]</td>\n <td class=\"text-right\"><strong>[currency_symbol][fee_item_total]</strong></td>\n </tr>\n [fee_items_loop_end]\n </tbody>\n </table>\n \n <table style=\"margin-top: 20px;\">\n <tr>\n <td class=\"label\" style=\"width: 70%;\">Subtotal:</td>\n <td class=\"text-right\">[currency_symbol][subtotal_amount]</td>\n </tr>\n [feepay_discount_amount]\n <tr>\n <td class=\"label\">Discount ([feepay_discount_percentage]%):</td>\n <td class=\"text-right\">-[currency_symbol][feepay_discount_amount]</td>\n </tr>\n [/feepay_discount_amount]\n [feepay_late_fee_amount]\n <tr>\n <td class=\"label\">Late Fee:</td>\n <td class=\"text-right\">[currency_symbol][feepay_late_fee_amount]</td>\n </tr>\n [/feepay_late_fee_amount]\n <tr style=\"border-top: 2px solid #000;\">\n <td class=\"label\" style=\"font-size: 16px;\"><strong>Total Amount:</strong></td>\n <td class=\"text-right\" style=\"font-size: 18px;\"><strong>[currency_symbol][feepay_total_amount]</strong></td>\n </tr>\n <tr>\n <td colspan=\"2\" style=\"padding-top: 10px;\">\n <strong>Amount in Words:</strong> [amount_in_words]\n </td>\n </tr>\n </table>\n \n [fee_installment_count]\n <h4 style=\"margin-top: 20px; margin-bottom: 10px;\">Installment Details:</h4>\n <table>\n <thead>\n <tr>\n <th>Installment #</th>\n <th>Due Date</th>\n <th class=\"text-right\">Amount</th>\n <th class=\"text-right\">Percentage</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n [installments_loop_start]\n <tr>\n <td class=\"text-center\">[installment_number]</td>\n <td>[installment_due_date]</td>\n <td class=\"text-right\">[currency_symbol][installment_amount]</td>\n <td class=\"text-right\">[installment_percentage]%</td>\n <td>[installment_status]</td>\n </tr>\n [installments_loop_end]\n </tbody>\n </table>\n [/fee_installment_count]\n \n [feepay_remarks]\n <div style=\"margin-top: 20px; padding: 10px; background-color: #f9f9f9; border-left: 4px solid #007bff;\">\n <strong>Remarks:</strong> [feepay_remarks]\n </div>\n [/feepay_remarks]\n </div>\n <div class=\"receipt-footer\">\n <p>This is a computer generated receipt.</p>\n <p>Generated on: [receipt_generated_at]</p>\n <p style=\"margin-top: 30px;\">Authorised Signature</p>\n </div>\n</body>\n</html>`;\n\n this.templateForm.patchValue({\n template_name: 'Default Receipt Template',\n template_code: 'DEFAULT_RECEIPT',\n template_type: 'PAYMENT',\n template_html: defaultTemplate\n });\n }\n\n onCategoryChange(categoryId: string): void {\n this.activeCategory.set(categoryId);\n this.tagSearchQuery.set(''); // Clear search when changing category\n }\n\n onTagSearch(query: string): void {\n this.tagSearchQuery.set(query);\n }\n\n saveTemplate(): void {\n if (this.templateForm.invalid) {\n this.templateForm.markAllAsTouched();\n this.notificationService.warning('Please fill all required fields.');\n return;\n }\n\n this.saving.set(true);\n \n const formValue = this.templateForm.getRawValue();\n const templateData: MFeeReceiptTemplateInsertUpdatePayload = new MFeeReceiptTemplateInsertUpdatePayload({\n _id: this.currentTemplateId() || undefined,\n feert_template_name: formValue.template_name,\n feert_template_code: formValue.template_code,\n feert_template_html: formValue.template_html,\n feert_template_type: formValue.template_type as 'PAYMENT' | 'REFUND' | 'PROVISIONAL',\n feert_template_for: formValue.template_for as 'STUDENT' | 'OFFICE' | 'BOTH',\n feert_is_default: formValue.is_default || false,\n feert_status: 'ACTIVE'\n });\n \n this.receiptTemplateService.saveUpdateReceiptTemplate(templateData)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.currentTemplateId.set(response.data._id || null);\n this.notificationService.success('Template saved successfully!');\n } else {\n this.notificationService.error(response.message || 'Failed to save template');\n }\n this.saving.set(false);\n },\n error: (error) => {\n console.error('Error saving template:', error);\n this.notificationService.error('Failed to save template. Please try again.');\n this.saving.set(false);\n }\n });\n }\n\n loadTemplates(): void {\n this.loadingTemplates.set(true);\n const payload: MFeeReceiptTemplate = new MFeeReceiptTemplate({});\n \n this.receiptTemplateService.getReceiptTemplateList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n this.templates.set(response.data);\n \n if (this.templates().length === 0) {\n this.notificationService.info('No templates found. Create a new template to get started.');\n this.loadingTemplates.set(false);\n return;\n }\n\n // If only one template, load it directly\n if (this.templates().length === 1) {\n this.loadTemplateById(this.templates()[0]._id || '');\n this.loadingTemplates.set(false);\n return;\n }\n\n // For multiple templates, show selection\n this.showTemplateSelection();\n this.loadingTemplates.set(false);\n } else {\n this.notificationService.warning('No templates found.');\n this.loadingTemplates.set(false);\n }\n },\n error: (error) => {\n console.error('Error loading templates:', error);\n this.notificationService.error('Failed to load templates. Please try again.');\n this.loadingTemplates.set(false);\n }\n });\n }\n\n private showTemplateSelection(): void {\n // Create a simple selection message\n const templateList = this.templates().map((t, index) => \n `${index + 1}. ${t.feert_template_name} (${t.feert_template_code})`\n ).join('\\n');\n\n // Use confirmation service to show template list\n // In a production app, you'd use a proper modal with a select dropdown\n const message = `Select a template to load:\\n\\n${templateList}\\n\\nEnter template number (1-${this.templates().length}):`;\n \n // For now, load the first template and show info\n // In a real implementation, you'd have a proper selection dialog\n this.notificationService.info(`Found ${this.templates().length} template(s). Loading first template. Use the template list to select others.`);\n \n // Load first template by default\n if (this.templates().length > 0) {\n this.loadTemplateById(this.templates()[0]._id || '');\n }\n }\n\n\n loadTemplateById(templateId: string): void {\n if (!templateId) {\n this.notificationService.warning('Template ID is required.');\n return;\n }\n\n this.loading.set(true);\n const payload: MFeeReceiptTemplateGetByIdPayload = new MFeeReceiptTemplateGetByIdPayload({\n feert_id: templateId\n });\n\n this.receiptTemplateService.getReceiptTemplateById(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response.success && response.data) {\n const template = response.data;\n this.currentTemplateId.set(template._id || null);\n \n // Use setValue to ensure all form controls are updated\n this.templateForm.patchValue({\n template_name: template.feert_template_name || '',\n template_code: template.feert_template_code || '',\n template_type: template.feert_template_type || 'PAYMENT',\n template_for: template.feert_template_for || 'BOTH',\n is_default: template.feert_is_default || false,\n template_html: template.feert_template_html || '',\n css_styles: '' // Add CSS field if needed\n }, { emitEvent: true });\n \n // Force change detection to update the textarea\n this.cdr.detectChanges();\n \n // Scroll to top of textarea after a brief delay to ensure it's rendered\n setTimeout(() => {\n const textarea = this.htmlEditorRef?.nativeElement || document.querySelector('.template-html-editor') as HTMLTextAreaElement;\n if (textarea) {\n textarea.focus();\n textarea.scrollTop = 0;\n }\n }, 100);\n \n this.notificationService.success('Template loaded successfully!');\n } else {\n this.notificationService.error(response.message || 'Failed to load template');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('Error loading template:', error);\n this.notificationService.error('Failed to load template. Please try again.');\n this.loading.set(false);\n }\n });\n }\n}\n","<!-- Receipt Template Designer -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"shared_wrapper_setup_param()\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions class=\"tw-flex tw-items-center tw-gap-2\">\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"loadTemplates()\" leftIcon=\"folder_open\">\n Load Template\n </button>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"saveTemplate()\" leftIcon=\"save\"\n [disabled]=\"saving() || templateForm.invalid\" [loading]=\"saving()\">\n Save Template\n </button>\n </div>\n\n <!-- Main Content - Three Column Layout -->\n <div class=\"tw-w-full tw-h-full tw-overflow-hidden tw-flex tw-flex-col\" style=\"height: calc(100vh - 120px); max-width: 100vw;\">\n <div class=\"tw-grid tw-grid-cols-12 tw-gap-3 tw-flex-1 tw-min-h-0 tw-p-3\">\n \n <!-- Left Sidebar - Tag Categories & Tags -->\n <div class=\"tw-col-span-12 lg:tw-col-span-3 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden tw-flex tw-flex-col tw-min-w-0 tw-h-full\">\n <!-- Tag Categories Header -->\n <div class=\"tw-p-3 tw-border-b tw-border-gray-200 tw-bg-gray-50 tw-flex-shrink-0\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-2\">Available Tags</h6>\n <form [formGroup]=\"templateForm\">\n <cide-ele-input\n formControlName=\"tag_search\"\n placeholder=\"Search tags...\"\n size=\"sm\"\n leadingIcon=\"search\">\n </cide-ele-input>\n </form>\n </div>\n\n <!-- Category Tabs -->\n <div class=\"tw-flex tw-flex-wrap tw-gap-1 tw-p-2 tw-border-b tw-border-gray-200 tw-bg-gray-50 tw-overflow-x-auto\">\n @for (category of tagCategories; track category.id) {\n <button\n type=\"button\"\n class=\"tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-rounded tw-transition-colors tw-whitespace-nowrap\"\n [class.tw-bg-blue-100]=\"activeCategory() === category.id\"\n [class.tw-text-blue-700]=\"activeCategory() === category.id\"\n [class.tw-bg-gray-100]=\"activeCategory() !== category.id\"\n [class.tw-text-gray-700]=\"activeCategory() !== category.id\"\n (click)=\"onCategoryChange(category.id)\"\n [title]=\"category.name\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-inline-block tw-mr-1\">{{ category.icon }}</cide-ele-icon>\n <span class=\"tw-hidden sm:tw-inline\">{{ category.name }}</span>\n </button>\n }\n </div>\n\n <!-- Tags List -->\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-2 tw-min-h-0\">\n @if (filteredTags().length > 0) {\n <div class=\"tw-space-y-1\">\n @for (tag of filteredTags(); track tag.code) {\n <button\n type=\"button\"\n class=\"tw-w-full tw-text-left tw-p-2 tw-rounded tw-border tw-border-gray-200 tw-bg-white hover:tw-bg-blue-50 hover:tw-border-blue-300 tw-transition-colors tw-cursor-pointer tw-group\"\n (click)=\"insertTag(tag)\"\n [title]=\"tag.description\">\n <div class=\"tw-flex tw-items-start tw-justify-between tw-gap-2\">\n <div class=\"tw-flex-1 tw-min-w-0\">\n <code class=\"tw-text-xs tw-font-mono tw-text-blue-600 tw-font-semibold tw-block tw-break-all\">\n {{ tag.code }}\n </code>\n <span class=\"tw-text-xs tw-text-gray-600 tw-block tw-mt-1\">{{ tag.description }}</span>\n @if (tag.example) {\n <span class=\"tw-text-xs tw-text-gray-400 tw-block tw-mt-0.5\">e.g., {{ tag.example }}</span>\n }\n </div>\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-400 group-hover:tw-text-blue-600 tw-flex-shrink-0 tw-mt-0.5\">add_circle</cide-ele-icon>\n </div>\n </button>\n }\n </div>\n } @else {\n <div class=\"tw-text-center tw-py-8 tw-text-gray-500\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-mx-auto tw-mb-2 tw-text-gray-400\">search_off</cide-ele-icon>\n <p class=\"tw-text-xs\">No tags found</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Middle Column - HTML Editor -->\n <div class=\"tw-col-span-12 lg:tw-col-span-5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col tw-overflow-hidden tw-min-h-0 tw-min-w-0 tw-h-full\">\n <div class=\"tw-p-4 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-4\">Template Configuration</h6>\n \n <form [formGroup]=\"templateForm\" class=\"tw-space-y-3\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\n <cide-ele-input\n label=\"Template Name *\"\n formControlName=\"template_name\"\n placeholder=\"e.g., Standard Receipt\"\n size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-input\n label=\"Template Code *\"\n formControlName=\"template_code\"\n placeholder=\"e.g., STD_RECEIPT_01\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\n <cide-ele-select\n label=\"Template Type *\"\n formControlName=\"template_type\"\n [options]=\"[{value: 'PAYMENT', label: 'Payment Receipt'}, {value: 'REFUND', label: 'Refund Receipt'}, {value: 'PROVISIONAL', label: 'Provisional Receipt'}]\"\n size=\"sm\">\n </cide-ele-select>\n\n <cide-ele-select\n label=\"Template For\"\n formControlName=\"template_for\"\n [options]=\"[{value: 'STUDENT', label: 'Student'}, {value: 'OFFICE', label: 'Office'}, {value: 'BOTH', label: 'Both'}]\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-p-2 tw-bg-gray-50 tw-rounded\">\n <cide-ele-input formControlName=\"is_default\" type=\"checkbox\" size=\"sm\"></cide-ele-input>\n <span class=\"tw-text-xs tw-text-gray-700\">Set as Default Template</span>\n </div>\n </form>\n </div>\n\n <div class=\"tw-flex-1 tw-flex tw-flex-col tw-overflow-hidden tw-min-h-0 tw-h-full\">\n <div class=\"tw-p-3 tw-border-b tw-border-gray-200 tw-bg-gray-50 tw-flex-shrink-0\">\n <div class=\"tw-flex tw-items-center tw-justify-between\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900\">HTML Template *</h6>\n <span class=\"tw-text-xs tw-text-gray-500\">Click tags on left to insert or paste HTML here</span>\n </div>\n </div>\n <div class=\"tw-flex-1 tw-p-3 tw-overflow-hidden tw-min-h-0 tw-h-full\">\n <form [formGroup]=\"templateForm\" class=\"tw-h-full\">\n <textarea\n #htmlEditor\n formControlName=\"template_html\"\n placeholder=\"Enter HTML template code here... Use tags from the left sidebar or paste your HTML design.\"\n class=\"template-html-editor tw-w-full tw-h-full tw-p-3 tw-border tw-border-gray-300 tw-rounded-md tw-font-mono tw-text-xs tw-leading-relaxed tw-resize-none focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-blue-500 tw-bg-white tw-text-gray-900\"\n spellcheck=\"false\"></textarea>\n </form>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Live Preview -->\n <div class=\"tw-col-span-12 lg:tw-col-span-4 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col tw-overflow-hidden tw-min-w-0 tw-h-full\">\n <div class=\"tw-p-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <div class=\"tw-flex tw-items-center tw-justify-between\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900\">Live Preview</h6>\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-select\n formControlName=\"preview_type\"\n [options]=\"[{value: 'STUDENT', label: 'Student'}, {value: 'OFFICE', label: 'Office'}]\"\n size=\"xs\"\n class=\"tw-w-24\">\n </cide-ele-select>\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-400\" title=\"Auto-refreshes on template change\">sync</cide-ele-icon>\n </div>\n </div>\n </div>\n \n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-bg-gray-50 tw-min-h-0\">\n <div class=\"tw-bg-white tw-shadow-sm tw-rounded tw-p-4\" [innerHTML]=\"previewHtml()\"></div>\n </div>\n </div>\n\n </div>\n </div>\n</cide-lyt-shared-wrapper>\n\n","import { Component, inject, signal, OnInit, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport {\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideEleDataGridComponent,\n type GridConfiguration,\n type GridEvent,\n type SelectOption,\n NotificationService\n} from 'cloud-ide-element';\nimport { ACADEMIC_YEAR_SERVICE_TOKEN, CLASS_PROGRAM_MASTER_SERVICE_TOKEN, type IAcademicYearService, type IClassProgramMasterService } from 'cloud-ide-shared';\nimport { type academicYearControllerResponse, type AcaAcademicYear, type classProgramMasterControllerResponse, type AcaClassProgramMasterResponse, type MFeePayment } from 'cloud-ide-lms-model';\nimport { CideFeeFeePaymentService } from '../../../fee-payment-management/services/fee-payment.service';\n\ninterface CollectionByDateData {\n date: Date;\n receipt_count: number;\n cash: number;\n online: number;\n cheque: number;\n other: number;\n total: number;\n}\n\ninterface CollectionByClassData {\n class: string;\n student_count: number;\n receipt_count: number;\n total: number;\n average: number;\n}\n\n@Component({\n selector: 'cide-collection-report',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideEleDataGridComponent\n ],\n templateUrl: './collection-report.component.html',\n styleUrl: './collection-report.component.scss'\n})\nexport class CollectionReportComponent implements OnInit {\n private readonly fb = inject(FormBuilder);\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\n private readonly classProgramService = inject<IClassProgramMasterService>(CLASS_PROGRAM_MASTER_SERVICE_TOKEN);\n private readonly notificationService = inject(NotificationService);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n\n filterForm: FormGroup = this.fb.group({\n date_from: [''],\n date_to: [''],\n academic_year: [''],\n class_program: [''],\n payment_mode: ['']\n });\n\n readonly loading = signal<boolean>(false);\n readonly collectionByDate = signal<CollectionByDateData[]>([]);\n readonly collectionByClass = signal<CollectionByClassData[]>([]);\n readonly academicYearOptions = signal<SelectOption[]>([]);\n readonly classOptions = signal<SelectOption[]>([]);\n\n readonly paymentModeOptions = [\n { value: '', label: 'All Modes' },\n { value: 'CASH', label: 'Cash' },\n { value: 'ONLINE', label: 'Online' },\n { value: 'CHEQUE', label: 'Cheque' },\n { value: 'DD', label: 'DD' },\n { value: 'UPI', label: 'UPI' },\n { value: 'CARD', label: 'Card' },\n { value: 'NET_BANKING', label: 'Net Banking' },\n { value: 'BANK_TRANSFER', label: 'Bank Transfer' }\n ];\n\n readonly summary = computed(() => {\n const byDate = this.collectionByDate();\n return {\n total_collection: byDate.reduce((sum, row) => sum + row.total, 0),\n total_receipts: byDate.reduce((sum, row) => sum + row.receipt_count, 0),\n online_payments: byDate.reduce((sum, row) => sum + row.online, 0),\n cash_payments: byDate.reduce((sum, row) => sum + row.cash, 0)\n };\n });\n\n readonly totalReceipts = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.receipt_count, 0)\n );\n \n readonly totalCash = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.cash, 0)\n );\n \n readonly totalOnline = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.online, 0)\n );\n \n readonly totalCheque = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.cheque, 0)\n );\n \n readonly totalOther = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.other, 0)\n );\n \n readonly grandTotal = computed(() => \n this.collectionByDate().reduce((sum, row) => sum + row.total, 0)\n );\n\n // Grid configuration for Collection by Date\n readonly dateGridConfig = computed<GridConfiguration<CollectionByDateData>>(() => ({\n id: 'collection-by-date-grid',\n columns: [\n {\n key: 'date',\n header: 'Date',\n type: 'date',\n width: '120px',\n sortable: true\n },\n {\n key: 'receipt_count',\n header: 'Total Receipts',\n type: 'number',\n width: '120px',\n align: 'center',\n sortable: true\n },\n {\n key: 'cash',\n header: 'Cash',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'online',\n header: 'Online',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'cheque',\n header: 'Cheque',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'other',\n header: 'Other',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'total',\n header: 'Total Amount',\n type: 'number',\n width: '140px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n }\n ],\n data: this.collectionByDate(),\n trackBy: 'date',\n pagination: {\n enabled: false,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: false,\n showPageInfo: false,\n showRefresh: false\n },\n search: {\n enabled: false,\n placeholder: 'Search...',\n searchableColumns: [],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true\n }));\n\n // Grid configuration for Collection by Class\n readonly classGridConfig = computed<GridConfiguration<CollectionByClassData>>(() => ({\n id: 'collection-by-class-grid',\n columns: [\n {\n key: 'class',\n header: 'Class/Program',\n type: 'text',\n width: '200px',\n sortable: true\n },\n {\n key: 'student_count',\n header: 'Total Students',\n type: 'number',\n width: '140px',\n align: 'center',\n sortable: true\n },\n {\n key: 'receipt_count',\n header: 'Receipts',\n type: 'number',\n width: '120px',\n align: 'center',\n sortable: true\n },\n {\n key: 'total',\n header: 'Total Collected',\n type: 'number',\n width: '150px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'average',\n header: 'Average per Student',\n type: 'number',\n width: '160px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n }\n ],\n data: this.collectionByClass(),\n trackBy: 'class',\n pagination: {\n enabled: false,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: false,\n showPageInfo: false,\n showRefresh: false\n },\n search: {\n enabled: false,\n placeholder: 'Search...',\n searchableColumns: [],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true\n }));\n\n ngOnInit(): void {\n this.loadAcademicYears();\n this.loadClassPrograms();\n this.loadReportData();\n }\n\n private loadAcademicYears(): void {\n this.academicYearService.getAcademicYearList({ pageIndex: 1, pageSize: 100, pagination: false }).subscribe({\n next: (response: academicYearControllerResponse) => {\n if (response?.success && response?.data) {\n const academicYears: AcaAcademicYear[] = Array.isArray(response.data) ? response.data : [];\n this.academicYearOptions.set([\n { value: '', label: 'All Years' },\n ...academicYears.map((ay: AcaAcademicYear) => ({\n value: ay._id || '',\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\n }))\n ]);\n }\n },\n error: () => {\n this.academicYearOptions.set([{ value: '', label: 'All Years' }]);\n }\n });\n }\n\n private loadClassPrograms(): void {\n this.classProgramService.searchClassProgramMasters({ pagination: false }).subscribe({\n next: (response: classProgramMasterControllerResponse) => {\n if (response?.success && response?.data) {\n const classPrograms: AcaClassProgramMasterResponse[] = Array.isArray(response.data) ? response.data : [];\n this.classOptions.set([\n { value: '', label: 'All Classes' },\n ...classPrograms.map((cp: AcaClassProgramMasterResponse) => ({\n value: cp._id || '',\n label: cp.acacpm_alise_title || ''\n }))\n ]);\n }\n },\n error: () => {\n this.classOptions.set([{ value: '', label: 'All Classes' }]);\n }\n });\n }\n\n private loadReportData(): void {\n this.loading.set(true);\n \n // Build payload with filters from form\n const formValue = this.filterForm.value;\n const payload: MFeePayment = {\n pagination: false,\n query: undefined, // No search query field in filter form\n // Add payment mode filter if selected\n ...(formValue.payment_mode ? { feepay_payment_method: formValue.payment_mode } : {})\n // Add date range filters when available in API\n // feepay_payment_date_from: formValue.date_from,\n // feepay_payment_date_to: formValue.date_to\n };\n\n this.feePaymentService.getFeePaymentList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n // Aggregate data by date\n const dateMap = new Map<string, CollectionByDateData>();\n \n response.data.forEach((payment: any) => {\n const paymentDate = payment.feepay_payment_date ? new Date(payment.feepay_payment_date).toISOString().split('T')[0] : '';\n if (!paymentDate) return;\n \n if (!dateMap.has(paymentDate)) {\n dateMap.set(paymentDate, {\n date: new Date(paymentDate),\n receipt_count: 0,\n cash: 0,\n online: 0,\n cheque: 0,\n other: 0,\n total: 0\n });\n }\n \n const dayData = dateMap.get(paymentDate)!;\n dayData.receipt_count++;\n const amount = payment.feepay_amount_paid || payment.feepay_total_amount || 0;\n dayData.total += amount;\n \n const method = payment.feepay_payment_method || payment.feepay_payment_mode || '';\n if (method === 'CASH') {\n dayData.cash += amount;\n } else if (method === 'ONLINE' || method === 'UPI' || method === 'NET_BANKING' || method === 'CARD') {\n dayData.online += amount;\n } else if (method === 'CHEQUE' || method === 'DD') {\n dayData.cheque += amount;\n } else {\n dayData.other += amount;\n }\n });\n \n this.collectionByDate.set(Array.from(dateMap.values()).sort((a, b) => a.date.getTime() - b.date.getTime()));\n \n // TODO: Aggregate by class when class information is available in payment data\n // For now, using placeholder data structure\n this.collectionByClass.set([]);\n } else {\n this.collectionByDate.set([]);\n this.collectionByClass.set([]);\n }\n },\n error: (err) => {\n console.error('Error loading report data:', err);\n this.notificationService.error('Failed to load report data');\n this.collectionByDate.set([]);\n this.collectionByClass.set([]);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n }\n\n applyFilters(): void {\n this.loading.set(true);\n // Apply filters and reload report data\n this.loadReportData();\n this.notificationService.success('Report generated successfully');\n }\n\n exportToPDF(): void {\n this.notificationService.info('PDF export functionality will be implemented');\n }\n\n exportToExcel(): void {\n this.notificationService.info('Excel export functionality will be implemented');\n }\n\n onGridEvent(event: GridEvent<CollectionByDateData | CollectionByClassData>): void {\n // Handle grid events if needed\n console.log('Grid event:', event);\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n}\n","<!-- Collection Report Container -->\r\n<div class=\"tw-w-full tw-h-full\">\r\n <div class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n \r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">assessment</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Fee Collection Report</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-items-center tw-gap-3\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"exportToPDF()\" leftIcon=\"picture_as_pdf\">\r\n Export PDF\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"exportToExcel()\" leftIcon=\"table_chart\">\r\n Export Excel\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Filters Section -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <form [formGroup]=\"filterForm\" class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-5 tw-gap-4\">\r\n <cide-ele-input\r\n label=\"Date From\"\r\n formControlName=\"date_from\"\r\n type=\"date\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input\r\n label=\"Date To\"\r\n formControlName=\"date_to\"\r\n type=\"date\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-select\r\n label=\"Academic Year\"\r\n formControlName=\"academic_year\"\r\n [options]=\"academicYearOptions()\"\r\n size=\"sm\"\r\n placeholder=\"All Years\">\r\n </cide-ele-select>\r\n\r\n <cide-ele-select\r\n label=\"Class/Program\"\r\n formControlName=\"class_program\"\r\n [options]=\"classOptions()\"\r\n size=\"sm\"\r\n placeholder=\"All Classes\">\r\n </cide-ele-select>\r\n\r\n <cide-ele-select\r\n label=\"Payment Mode\"\r\n formControlName=\"payment_mode\"\r\n [options]=\"paymentModeOptions\"\r\n size=\"sm\"\r\n placeholder=\"All Modes\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-justify-end\">\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"applyFilters()\" leftIcon=\"search\"\r\n [disabled]=\"loading()\" [loading]=\"loading()\">\r\n Generate Report\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Summary Cards -->\r\n <div class=\"tw-table-row tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4 tw-border-b tw-border-gray-200\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-4 tw-gap-4\">\r\n <!-- Total Collection Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-bg-green-100 tw-rounded-full tw-p-3\">\r\n <cide-ele-icon class=\"tw-text-green-600 tw-w-6 tw-h-6\">account_balance_wallet</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Total Collection</div>\r\n <div class=\"tw-text-xl tw-font-bold tw-text-green-600\">{{ formatCurrency(summary().total_collection) }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Total Receipts Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-bg-blue-100 tw-rounded-full tw-p-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-6 tw-h-6\">receipt</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Total Receipts</div>\r\n <div class=\"tw-text-xl tw-font-bold tw-text-blue-600\">{{ summary().total_receipts }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Online Payments Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-bg-cyan-100 tw-rounded-full tw-p-3\">\r\n <cide-ele-icon class=\"tw-text-cyan-600 tw-w-6 tw-h-6\">language</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Online Payments</div>\r\n <div class=\"tw-text-xl tw-font-bold tw-text-cyan-600\">{{ formatCurrency(summary().online_payments) }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Cash Payments Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\r\n <div class=\"tw-bg-yellow-100 tw-rounded-full tw-p-3\">\r\n <cide-ele-icon class=\"tw-text-yellow-600 tw-w-6 tw-h-6\">money</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Cash Payments</div>\r\n <div class=\"tw-text-xl tw-font-bold tw-text-yellow-600\">{{ formatCurrency(summary().cash_payments) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4\">\r\n <div class=\"tw-space-y-6\">\r\n \r\n <!-- Collection by Date Section -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Collection by Date</h6>\r\n </div>\r\n <div class=\"tw-p-4\">\r\n <cide-ele-data-grid \r\n [config]=\"dateGridConfig()\" \r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n \r\n <!-- Footer Totals -->\r\n <div class=\"tw-mt-4 tw-pt-4 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-grid tw-grid-cols-7 tw-gap-4 tw-text-sm\">\r\n <div class=\"tw-font-semibold tw-text-gray-900\">TOTAL</div>\r\n <div class=\"tw-font-semibold tw-text-center tw-text-gray-900\">{{ totalReceipts() }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-gray-900\">{{ formatCurrency(totalCash()) }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-gray-900\">{{ formatCurrency(totalOnline()) }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-gray-900\">{{ formatCurrency(totalCheque()) }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-gray-900\">{{ formatCurrency(totalOther()) }}</div>\r\n <div class=\"tw-font-semibold tw-text-right tw-text-green-600\">{{ formatCurrency(grandTotal()) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Collection by Class Section -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Collection by Class/Program</h6>\r\n </div>\r\n <div class=\"tw-p-4\">\r\n <cide-ele-data-grid \r\n [config]=\"classGridConfig()\" \r\n (gridEvent)=\"onGridEvent($event)\">\r\n </cide-ele-data-grid>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Component, inject, signal, OnInit, computed, viewChild, TemplateRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { HttpClient } from '@angular/common/http';\nimport {\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n type GridConfiguration,\n type GridEvent,\n type TemplateContext,\n NotificationService\n} from 'cloud-ide-element';\nimport { CideLytSharedWrapperComponent, AppStateHelperService, RightsService } from 'cloud-ide-layout';\nimport { CideFeeFeeAssignmentService } from '../../../fee-assignment-management/services/fee-assignment.service';\nimport { CideFeeFeePaymentService } from '../../../fee-payment-management/services/fee-payment.service';\nimport { cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\n\ninterface FeeDetailData {\n _id?: string;\n fee_head: string;\n amount: number;\n discount: number;\n net_amount: number;\n paid: number;\n outstanding: number;\n due_date: Date;\n status: 'PAID' | 'PENDING' | 'PARTIALLY_PAID' | 'OVERDUE';\n [key: string]: unknown;\n}\n\ninterface PaymentHistoryData {\n _id?: string;\n receipt_number: string;\n date: Date;\n amount: number;\n mode: string;\n reference: string;\n [key: string]: unknown;\n}\n\n@Component({\n selector: 'cide-my-fee-statement',\n standalone: true,\n imports: [\n CommonModule,\n CideIconComponent,\n CideEleButtonComponent,\n CideEleDataGridComponent,\n CideLytSharedWrapperComponent\n ],\n templateUrl: './my-fee-statement.component.html',\n styleUrl: './my-fee-statement.component.scss'\n})\nexport class MyFeeStatementComponent implements OnInit {\n private readonly router = inject(Router);\n private readonly notificationService = inject(NotificationService);\n private readonly http = inject(HttpClient);\n private readonly appStateHelper = inject(AppStateHelperService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\n private readonly rightsService = inject(RightsService);\n\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\n readonly actionsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsRendererTemplate');\n readonly paymentHistoryRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('paymentHistoryRendererTemplate');\n\n readonly loading = signal<boolean>(false);\n readonly studentInfo = signal<{\n id: string;\n name: string;\n class: string;\n section: string;\n avatar: string;\n }>({\n id: 'STU-2024-001',\n name: 'John Doe',\n class: 'Class 10',\n section: 'A',\n avatar: ''\n });\n\n readonly feeDetails = signal<FeeDetailData[]>([]);\n readonly paymentHistory = signal<PaymentHistoryData[]>([]);\n\n readonly feeSummary = computed(() => {\n const details = this.feeDetails();\n return {\n total_fees: details.reduce((sum, fee) => sum + fee.amount, 0),\n paid_amount: details.reduce((sum, fee) => sum + fee.paid, 0),\n outstanding: details.reduce((sum, fee) => sum + fee.outstanding, 0),\n discount: details.reduce((sum, fee) => sum + fee.discount, 0)\n };\n });\n\n readonly feeDetailsGridConfig = computed<GridConfiguration<FeeDetailData>>(() => ({\n id: 'my-fee-details-grid',\n columns: [\n {\n key: 'fee_head',\n header: 'Fee Head',\n type: 'text',\n width: '200px',\n sortable: true\n },\n {\n key: 'amount',\n header: 'Amount',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'discount',\n header: 'Discount',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'net_amount',\n header: 'Net Amount',\n type: 'number',\n width: '130px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'paid',\n header: 'Paid',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'outstanding',\n header: 'Outstanding',\n type: 'number',\n width: '130px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'due_date',\n header: 'Due Date',\n type: 'date',\n width: '120px',\n sortable: true\n },\n {\n key: 'status',\n header: 'Status',\n type: 'custom',\n width: '140px',\n align: 'center',\n renderer: 'statusRenderer'\n }\n ],\n data: this.feeDetails(),\n trackBy: '_id',\n pagination: {\n enabled: false,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: false,\n showPageInfo: false,\n showRefresh: false\n },\n search: {\n enabled: false,\n placeholder: 'Search...',\n searchableColumns: [],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true\n }));\n\n readonly paymentHistoryGridConfig = computed<GridConfiguration<PaymentHistoryData>>(() => ({\n id: 'payment-history-grid',\n columns: [\n {\n key: 'receipt_number',\n header: 'Receipt Number',\n type: 'text',\n width: '150px',\n sortable: true\n },\n {\n key: 'date',\n header: 'Date',\n type: 'date',\n width: '150px',\n sortable: true\n },\n {\n key: 'amount',\n header: 'Amount',\n type: 'number',\n width: '120px',\n align: 'right',\n sortable: true,\n formatter: {\n type: 'currency',\n format: 'INR'\n }\n },\n {\n key: 'mode',\n header: 'Payment Mode',\n type: 'text',\n width: '150px',\n sortable: true\n },\n {\n key: 'reference',\n header: 'Reference',\n type: 'text',\n width: '150px',\n sortable: true\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'custom',\n width: '120px',\n align: 'center',\n renderer: 'paymentHistoryRenderer'\n }\n ],\n data: this.paymentHistory(),\n trackBy: '_id',\n pagination: {\n enabled: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search...',\n searchableColumns: ['receipt_number', 'mode'],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true\n }));\n\n readonly templateRenderers = computed(() => ({\n statusRenderer: this.statusRendererTemplate(),\n paymentHistoryRenderer: this.paymentHistoryRendererTemplate()\n }));\n\n ngOnInit(): void {\n // Initialize rights for fee statement (view-only)\n this.rightsService.initializeRights('fee_statement');\n this.loadFeeDetails();\n this.loadPaymentHistory();\n }\n\n private loadFeeDetails(): void {\n this.loading.set(true);\n \n // Get current user ID from app state\n const currentUser = this.appStateHelper.getCurrentUser();\n if (!currentUser?._id) {\n this.notificationService.error('User not authenticated');\n this.loading.set(false);\n return;\n }\n\n // Get student ID from admission form using user_id\n const userId = currentUser._id;\n const queryParams = new URLSearchParams({ admap_user_id_auth: userId }).toString();\n const admissionUrl = `${cidePath}${coreRoutesUrl}/admission/${queryParams}`;\n \n this.http.get<any>(admissionUrl).subscribe({\n next: (admissionResponse) => {\n let studentId: string | null = null;\n let admissionData: any = null;\n \n if (admissionResponse?.success && admissionResponse?.data) {\n admissionData = Array.isArray(admissionResponse.data) \n ? admissionResponse.data[0] \n : admissionResponse.data;\n studentId = admissionData?.admap_student_id || null;\n \n // Update student info\n if (admissionData) {\n const studentName = `${admissionData.admap_first_name || ''} ${admissionData.admap_middle_name || ''} ${admissionData.admap_last_name || ''}`.trim();\n this.studentInfo.set({\n id: studentId || 'N/A',\n name: studentName || 'N/A',\n class: admissionData.admap_class_program_name || 'N/A',\n section: admissionData.admap_program_term_section_name || 'N/A',\n avatar: admissionData.admap_photo_id_cyfm || ''\n });\n }\n }\n \n if (!studentId) {\n this.notificationService.warning('Student ID not found. Please ensure your admission is confirmed.');\n this.loading.set(false);\n return;\n }\n \n // Load fee assignments for this student\n const payload: any = {\n feeas_student_id: studentId,\n pageSize: 100 // Get all assignments\n };\n\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\n next: (response: any) => {\n if (response?.success && response?.data) {\n const today = new Date();\n const feeDetailsData: FeeDetailData[] = response.data.map((assignment: any) => {\n const originalAmount = assignment.feeas_original_amount || assignment.feeas_final_amount || 0;\n const discountAmount = assignment.feeas_discount_amount || 0;\n const netAmount = assignment.feeas_final_amount || (originalAmount - discountAmount);\n const paidAmount = assignment.feeas_amount_paid || assignment.feeas_paid_amount || 0;\n const outstandingAmount = assignment.feeas_outstanding_amount || \n assignment.feeas_amount_remaining || \n (netAmount - paidAmount);\n const dueDate = assignment.feeas_due_date ? new Date(assignment.feeas_due_date) : new Date();\n const isOverdue = dueDate < today && outstandingAmount > 0;\n \n let status: 'PAID' | 'PENDING' | 'PARTIALLY_PAID' | 'OVERDUE' = 'PENDING';\n if (outstandingAmount <= 0) {\n status = 'PAID';\n } else if (paidAmount > 0) {\n status = isOverdue ? 'OVERDUE' : 'PARTIALLY_PAID';\n } else {\n status = isOverdue ? 'OVERDUE' : 'PENDING';\n }\n \n return {\n _id: assignment._id,\n fee_head: assignment.feeas_fee_name || 'Fee',\n amount: originalAmount,\n discount: discountAmount,\n net_amount: netAmount,\n paid: paidAmount,\n outstanding: outstandingAmount,\n due_date: dueDate,\n status: status\n };\n });\n \n this.feeDetails.set(feeDetailsData);\n } else {\n this.feeDetails.set([]);\n }\n },\n error: (err: any) => {\n console.error('Error loading fee details:', err);\n this.notificationService.error('Failed to load fee details');\n this.feeDetails.set([]);\n this.loading.set(false);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n },\n error: (err: any) => {\n console.error('Error loading admission data:', err);\n this.notificationService.error('Failed to load student information');\n this.loading.set(false);\n }\n });\n }\n\n private loadPaymentHistory(): void {\n // Get current user ID from app state\n const currentUser = this.appStateHelper.getCurrentUser();\n if (!currentUser?._id) {\n return;\n }\n\n // Get student ID from admission form using user_id\n const userId = currentUser._id;\n const queryParams = new URLSearchParams({ admap_user_id_auth: userId }).toString();\n const admissionUrl = `${cidePath}${coreRoutesUrl}/admission/${queryParams}`;\n \n this.http.get<any>(admissionUrl).subscribe({\n next: (admissionResponse) => {\n let studentId: string | null = null;\n \n if (admissionResponse?.success && admissionResponse?.data) {\n const admissionData = Array.isArray(admissionResponse.data) \n ? admissionResponse.data[0] \n : admissionResponse.data;\n studentId = admissionData?.admap_student_id || null;\n }\n \n if (!studentId) {\n return;\n }\n \n // Load payment history for this student\n const payload: any = {\n feepay_student_id: studentId,\n pageSize: 100 // Get all payments\n };\n\n this.feePaymentService.getFeePaymentList(payload).subscribe({\n next: (response: any) => {\n if (response?.success && response?.data) {\n const paymentHistoryData: PaymentHistoryData[] = response.data.map((payment: any) => ({\n _id: payment._id,\n receipt_number: payment.feepay_receipt_number || 'N/A',\n date: payment.feepay_payment_date ? new Date(payment.feepay_payment_date) : new Date(),\n amount: payment.feepay_total_amount || 0,\n mode: payment.feepay_payment_mode || 'N/A',\n reference: payment.feepay_transaction_reference || \n payment.feepay_cheque_number || \n payment.feepay_payment_reference || \n 'N/A'\n }));\n \n this.paymentHistory.set(paymentHistoryData);\n } else {\n this.paymentHistory.set([]);\n }\n },\n error: (err: any) => {\n console.error('Error loading payment history:', err);\n this.notificationService.error('Failed to load payment history');\n this.paymentHistory.set([]);\n }\n });\n },\n error: (err: any) => {\n console.error('Error loading admission data for payment history:', err);\n }\n });\n }\n\n makePayment(): void {\n this.router.navigate(['/control-panel/fees/payment']);\n }\n\n downloadReceipt(payment: PaymentHistoryData): void {\n if (!payment._id) {\n this.notificationService.error('Payment ID not found');\n return;\n }\n\n // Get receipt PDF from API\n const receiptUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'fees',\n 'receipt',\n payment._id,\n 'pdf'\n ]);\n\n // Open in new tab for download\n window.open(receiptUrl, '_blank');\n this.notificationService.info(`Downloading receipt: ${payment.receipt_number}`);\n }\n\n isOverdue(fee: FeeDetailData): boolean {\n return new Date(fee.due_date) < new Date() && fee.outstanding > 0;\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n\n onGridEvent(event: GridEvent<Record<string, unknown>>): void {\n console.log('Grid event:', event);\n }\n}\n\n","<!-- My Fee Statement Container with Shared Wrapper -->\n<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'my_fee_statement' }\">\n \n <!-- Action Buttons in Breadcrumb Area -->\n <div breadcrumb-actions>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"makePayment()\" leftIcon=\"payment\"\n [disabled]=\"feeSummary().outstanding === 0 || loading()\">\n Make Payment\n </button>\n </div>\n\n <div class=\"tw-table tw-w-full tw-h-full\">\n\n <!-- Student Info Section -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4 tw-border-b tw-border-gray-200 tw-bg-gradient-to-r tw-from-blue-50 tw-to-purple-50\">\n <div class=\"tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-w-16 tw-h-16 tw-rounded-full tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-border-2 tw-border-white tw-shadow-sm\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-8 tw-h-8\">person</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <h6 class=\"tw-text-lg tw-font-semibold tw-text-gray-900 tw-mb-1\">{{ studentInfo().name }}</h6>\n <div class=\"tw-flex tw-flex-wrap tw-gap-4 tw-text-sm tw-text-gray-600\">\n <span><strong>Student ID:</strong> {{ studentInfo().id }}</span>\n <span><strong>Class:</strong> {{ studentInfo().class }}</span>\n <span><strong>Section:</strong> {{ studentInfo().section }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"tw-table-row tw-h-0\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4 tw-border-b tw-border-gray-200\">\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-4 tw-gap-4\">\n <!-- Total Fees Card -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-bg-blue-100 tw-rounded-full tw-p-3\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-6 tw-h-6\">account_balance_wallet</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Total Fees</div>\n <div class=\"tw-text-xl tw-font-bold tw-text-blue-600\">{{ formatCurrency(feeSummary().total_fees) }}</div>\n </div>\n </div>\n\n <!-- Paid Amount Card -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-bg-green-100 tw-rounded-full tw-p-3\">\n <cide-ele-icon class=\"tw-text-green-600 tw-w-6 tw-h-6\">check_circle</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Paid Amount</div>\n <div class=\"tw-text-xl tw-font-bold tw-text-green-600\">{{ formatCurrency(feeSummary().paid_amount) }}</div>\n </div>\n </div>\n\n <!-- Outstanding Card -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-bg-red-100 tw-rounded-full tw-p-3\">\n <cide-ele-icon class=\"tw-text-red-600 tw-w-6 tw-h-6\">warning</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Outstanding</div>\n <div class=\"tw-text-xl tw-font-bold tw-text-red-600\">{{ formatCurrency(feeSummary().outstanding) }}</div>\n </div>\n </div>\n\n <!-- Discount Card -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-p-4 tw-flex tw-items-center tw-gap-4\">\n <div class=\"tw-bg-yellow-100 tw-rounded-full tw-p-3\">\n <cide-ele-icon class=\"tw-text-yellow-600 tw-w-6 tw-h-6\">local_offer</cide-ele-icon>\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-xs tw-text-gray-600 tw-mb-1\">Total Discount</div>\n <div class=\"tw-text-xl tw-font-bold tw-text-yellow-600\">{{ formatCurrency(feeSummary().discount) }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"tw-table-row\">\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4\">\n <div class=\"tw-space-y-6\">\n \n <!-- Fee Details Section -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Fee Details</h6>\n </div>\n <div class=\"tw-p-4\">\n <cide-ele-data-grid \n [config]=\"feeDetailsGridConfig()\" \n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </div>\n\n <!-- Payment History Section -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Payment History</h6>\n </div>\n <div class=\"tw-p-4\">\n <cide-ele-data-grid \n [config]=\"paymentHistoryGridConfig()\" \n [templateRenderers]=\"templateRenderers()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Template Renderers -->\n<ng-template #statusRendererTemplate let-row=\"row\">\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [class.tw-bg-green-100]=\"row.status === 'PAID'\"\n [class.tw-text-green-800]=\"row.status === 'PAID'\"\n [class.tw-bg-yellow-100]=\"row.status === 'PENDING' || row.status === 'PARTIALLY_PAID'\"\n [class.tw-text-yellow-800]=\"row.status === 'PENDING' || row.status === 'PARTIALLY_PAID'\"\n [class.tw-bg-red-100]=\"row.status === 'OVERDUE'\"\n [class.tw-text-red-800]=\"row.status === 'OVERDUE'\">\n {{ row.status === 'PARTIALLY_PAID' ? 'PARTIALLY PAID' : row.status }}\n </span>\n</ng-template>\n\n<ng-template #actionsRendererTemplate let-row=\"row\">\n <!-- Actions if needed -->\n</ng-template>\n\n<ng-template #paymentHistoryRendererTemplate let-row=\"row\">\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"downloadReceipt(row)\" leftIcon=\"download\">\n Download\n </button>\n</ng-template>\n\n","import { Component, inject, signal, OnInit, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport {\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent,\n NotificationService,\n ConfirmationService\n} from 'cloud-ide-element';\nimport { AppStateHelperService } from 'cloud-ide-layout';\nimport { CideFeeFeeAssignmentService } from '../../../fee-assignment-management/services/fee-assignment.service';\nimport { HttpClient } from '@angular/common/http';\nimport { cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\n\n// Razorpay types (declare if not available)\ndeclare var Razorpay: any;\n\n// Process environment variables (for build-time replacement)\ndeclare var process: {\n env: {\n [key: string]: string | undefined;\n };\n};\n\ninterface OutstandingFee {\n id: string;\n fee_head: string;\n due_date: Date;\n outstanding: number;\n late_fee: number;\n is_overdue: boolean;\n}\n\n@Component({\n selector: 'cide-my-online-payment',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent\n ],\n templateUrl: './my-online-payment.component.html',\n styleUrl: './my-online-payment.component.scss'\n})\nexport class MyOnlinePaymentComponent implements OnInit {\n private readonly fb = inject(FormBuilder);\n private readonly router = inject(Router);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly appStateHelper = inject(AppStateHelperService);\n private readonly http = inject(HttpClient);\n\n readonly loading = signal<boolean>(false);\n readonly submitting = signal<boolean>(false);\n readonly selectedFees = signal<Set<string>>(new Set());\n readonly outstandingFees = signal<OutstandingFee[]>([]);\n\n paymentForm: FormGroup = this.fb.group({\n payment_method: ['', [Validators.required]],\n upi_id: [''],\n card_number: [''],\n expiry: [''],\n cvv: [''],\n bank: ['']\n });\n\n readonly paymentMethodOptions = [\n { value: 'UPI', label: 'UPI' },\n { value: 'CARD', label: 'Debit/Credit Card' },\n { value: 'NET_BANKING', label: 'Net Banking' }\n ];\n\n readonly bankOptions = [\n { value: 'SBI', label: 'State Bank of India' },\n { value: 'HDFC', label: 'HDFC Bank' },\n { value: 'ICICI', label: 'ICICI Bank' },\n { value: 'AXIS', label: 'Axis Bank' },\n { value: 'PNB', label: 'Punjab National Bank' }\n ];\n\n readonly selectedCount = computed(() => this.selectedFees().size);\n\n readonly totalFeeAmount = computed(() => {\n return this.outstandingFees()\n .filter(fee => this.selectedFees().has(fee.id))\n .reduce((sum, fee) => sum + fee.outstanding, 0);\n });\n\n readonly totalLateFee = computed(() => {\n return this.outstandingFees()\n .filter(fee => this.selectedFees().has(fee.id))\n .reduce((sum, fee) => sum + fee.late_fee, 0);\n });\n\n readonly subtotal = computed(() => this.totalFeeAmount() + this.totalLateFee());\n\n readonly convenienceFee = computed(() => {\n return Math.round(this.subtotal() * 0.02 * 100) / 100; // 2% convenience fee\n });\n\n readonly totalPayable = computed(() => this.subtotal() + this.convenienceFee());\n\n readonly selectedPaymentMethod = computed(() => this.paymentForm.get('payment_method')?.value);\n private studentId: string | null = null;\n private entityId: string | null = null;\n private academicYearId: string | null = null;\n\n ngOnInit(): void {\n this.loadOutstandingFees();\n }\n\n private loadOutstandingFees(): void {\n this.loading.set(true);\n \n // Get current user ID from app state\n const currentUser = this.appStateHelper.getCurrentUser();\n if (!currentUser?._id) {\n this.notificationService.error('User not authenticated');\n this.loading.set(false);\n return;\n }\n\n // Get student ID from admission form using user_id\n const userId = currentUser._id;\n // Use list endpoint with filter for admap_user_id_auth\n const queryParams = new URLSearchParams({ admap_user_id_auth: userId }).toString();\n const admissionUrl = `${cidePath}${coreRoutesUrl}/admission/${queryParams}`;\n \n this.http.get<any>(admissionUrl).subscribe({\n next: (admissionResponse) => {\n let studentId: string | null = null;\n \n if (admissionResponse?.success && admissionResponse?.data) {\n // Get student ID from admission form (data might be array or single object)\n const admissionData = Array.isArray(admissionResponse.data) \n ? admissionResponse.data[0] \n : admissionResponse.data;\n studentId = admissionData?.admap_student_id || null;\n this.studentId = studentId;\n this.entityId = admissionData?.admap_entity_id_syen || null;\n this.academicYearId = admissionData?.admap_academic_year_id_acayr || null;\n }\n \n if (!studentId) {\n this.notificationService.warning('Student ID not found. Please ensure your admission is confirmed.');\n this.loading.set(false);\n return;\n }\n \n // Get outstanding fees from fee assignments\n const payload: any = {\n feeas_student_id: studentId,\n feeas_payment_status: 'PENDING' // Get only pending or partially paid assignments\n // Note: feeas_payment_status field name matches the schema\n };\n\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const today = new Date();\n const outstandingFees = response.data\n .filter((assignment: any) => {\n // Only include assignments with outstanding amount > 0\n const outstanding = assignment.feeas_amount_remaining || \n (assignment.feeas_final_amount || 0) - (assignment.feeas_amount_paid || 0);\n return outstanding > 0;\n })\n .map((assignment: any) => {\n const dueDate = assignment.feeas_due_date ? new Date(assignment.feeas_due_date) : null;\n const outstanding = assignment.feeas_amount_remaining || \n (assignment.feeas_final_amount || 0) - (assignment.feeas_amount_paid || 0);\n const lateFee = assignment.feeas_late_fee_applied || 0;\n \n return {\n id: assignment._id || '',\n fee_head: assignment.feeas_fee_name || 'Fee',\n due_date: dueDate || new Date(),\n outstanding: outstanding,\n late_fee: lateFee,\n is_overdue: dueDate ? dueDate < today : false\n };\n });\n\n this.outstandingFees.set(outstandingFees);\n } else {\n this.outstandingFees.set([]);\n }\n },\n error: (err) => {\n console.error('Error loading outstanding fees:', err);\n this.notificationService.error('Failed to load outstanding fees');\n this.outstandingFees.set([]);\n this.loading.set(false);\n },\n complete: () => {\n this.loading.set(false);\n }\n });\n },\n error: (err) => {\n console.error('Error loading admission data:', err);\n this.notificationService.error('Failed to load student information');\n this.loading.set(false);\n }\n });\n }\n\n isSelected(fee: OutstandingFee): boolean {\n return this.selectedFees().has(fee.id);\n }\n\n toggleFee(fee: OutstandingFee): void {\n const newSet = new Set(this.selectedFees());\n if (newSet.has(fee.id)) {\n newSet.delete(fee.id);\n } else {\n newSet.add(fee.id);\n }\n this.selectedFees.set(newSet);\n }\n\n selectAll(): void {\n const allIds = new Set(this.outstandingFees().map(f => f.id));\n this.selectedFees.set(allIds);\n }\n\n selectOverdue(): void {\n const overdueIds = new Set(\n this.outstandingFees()\n .filter(f => f.is_overdue)\n .map(f => f.id)\n );\n this.selectedFees.set(overdueIds);\n }\n\n clearSelection(): void {\n this.selectedFees.set(new Set());\n }\n\n selectPaymentMethod(method: string): void {\n this.paymentForm.patchValue({ payment_method: method });\n \n // Clear other method fields\n if (method !== 'UPI') this.paymentForm.patchValue({ upi_id: '' });\n if (method !== 'CARD') {\n this.paymentForm.patchValue({ card_number: '', expiry: '', cvv: '' });\n }\n if (method !== 'NET_BANKING') this.paymentForm.patchValue({ bank: '' });\n }\n\n canProceed(): boolean {\n return this.selectedCount() > 0 && \n this.paymentForm.get('payment_method')?.value &&\n this.paymentForm.valid;\n }\n\n proceedToPayment(): void {\n if (!this.canProceed()) {\n this.notificationService.warning('Please select fees and payment method');\n return;\n }\n\n this.confirmationService.ask({\n title: 'Confirm Payment',\n message: `Do you want to proceed with payment of ${this.formatCurrency(this.totalPayable())}?`,\n confirmText: 'Pay Now',\n cancelText: 'Cancel',\n type: 'info'\n }).then((confirmed: boolean) => {\n if (confirmed) {\n this.submitPayment();\n }\n });\n }\n\n private submitPayment(): void {\n if (!this.studentId) {\n this.notificationService.error('Student ID not found');\n return;\n }\n\n this.submitting.set(true);\n\n // Get selected fee assignment IDs\n const selectedAssignmentIds = Array.from(this.selectedFees());\n const totalAmount = this.totalPayable();\n\n // Create payment order on backend\n const orderPayload = {\n amount: totalAmount,\n currency: 'INR',\n student_id: this.studentId,\n fee_assignment_ids: selectedAssignmentIds,\n entity_id: this.entityId,\n academic_year_id: this.academicYearId\n };\n\n const orderUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'payments',\n 'create-order'\n ]);\n\n this.http.post<any>(orderUrl, orderPayload).subscribe({\n next: (orderResponse) => {\n if (orderResponse?.success && orderResponse?.data) {\n const orderData = orderResponse.data;\n \n // Initialize Razorpay checkout\n this.initializeRazorpayCheckout({\n orderId: orderData.orderId,\n amount: orderData.amount * 100, // Convert to paise\n currency: orderData.currency || 'INR',\n name: 'Fee Payment',\n description: `Payment for ${selectedAssignmentIds.length} fee(s)`,\n prefill: {\n contact: this.appStateHelper.getCurrentUser()?.user_mobileno || '',\n email: this.appStateHelper.getCurrentUser()?.user_emailid || ''\n },\n notes: {\n student_id: this.studentId,\n fee_assignment_ids: selectedAssignmentIds.join(',')\n },\n handler: (response: any) => {\n this.handlePaymentSuccess(response, orderData.orderId, totalAmount, selectedAssignmentIds);\n },\n modal: {\n ondismiss: () => {\n this.submitting.set(false);\n this.notificationService.info('Payment cancelled');\n }\n }\n });\n } else {\n this.notificationService.error(orderResponse?.message || 'Failed to create payment order');\n this.submitting.set(false);\n }\n },\n error: (err) => {\n console.error('Error creating payment order:', err);\n this.notificationService.error('Failed to initialize payment. Please try again.');\n this.submitting.set(false);\n }\n });\n }\n\n private initializeRazorpayCheckout(options: any): void {\n // Check if Razorpay is available\n if (typeof Razorpay === 'undefined') {\n // Load Razorpay script dynamically\n const script = document.createElement('script');\n script.src = 'https://checkout.razorpay.com/v1/checkout.js';\n script.onload = () => {\n this.openRazorpayCheckout(options);\n };\n script.onerror = () => {\n this.notificationService.error('Failed to load payment gateway. Please refresh and try again.');\n this.submitting.set(false);\n };\n document.body.appendChild(script);\n } else {\n this.openRazorpayCheckout(options);\n }\n }\n\n private openRazorpayCheckout(options: any): void {\n try {\n const razorpayOptions = {\n key: process.env['RAZORPAY_KEY_ID'] || 'rzp_test_1DP5mmOlF5G5ag',\n amount: options.amount,\n currency: options.currency,\n name: options.name,\n description: options.description,\n order_id: options.orderId,\n prefill: options.prefill,\n notes: options.notes,\n handler: options.handler,\n modal: options.modal,\n theme: {\n color: '#2563eb'\n }\n };\n\n const razorpay = new Razorpay(razorpayOptions);\n razorpay.open();\n } catch (error) {\n console.error('Error opening Razorpay checkout:', error);\n this.notificationService.error('Failed to open payment gateway');\n this.submitting.set(false);\n }\n }\n\n private handlePaymentSuccess(\n paymentResponse: any,\n orderId: string,\n amount: number,\n assignmentIds: string[]\n ): void {\n // Verify payment on backend\n const verifyPayload = {\n payment_id: paymentResponse.razorpay_payment_id,\n order_id: orderId,\n signature: paymentResponse.razorpay_signature,\n amount: amount,\n student_id: this.studentId,\n fee_assignment_ids: assignmentIds,\n entity_id: this.entityId,\n academic_year_id: this.academicYearId\n };\n\n const verifyUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'payments',\n 'verify'\n ]);\n\n this.http.post<any>(verifyUrl, verifyPayload).subscribe({\n next: (verifyResponse) => {\n if (verifyResponse?.success && verifyResponse?.data?.verified) {\n this.notificationService.success('Payment processed successfully!');\n \n // Navigate to receipt or statement\n if (verifyResponse.data.receiptNumber) {\n // Navigate to receipt view\n this.router.navigate(['/control-panel/fees/payment/view', verifyResponse.data.paymentId]);\n } else {\n // Navigate to statement\n this.router.navigate(['/control-panel/fees/statement']);\n }\n } else {\n this.notificationService.error(verifyResponse?.message || 'Payment verification failed');\n this.submitting.set(false);\n }\n },\n error: (err) => {\n console.error('Error verifying payment:', err);\n this.notificationService.error('Payment verification failed. Please contact support.');\n this.submitting.set(false);\n }\n });\n }\n\n cancel(): void {\n this.router.navigate(['/control-panel/my-fees/statement']);\n }\n\n isOverdue(fee: OutstandingFee): boolean {\n return fee.is_overdue;\n }\n\n formatCurrency(amount: number): string {\n return `โน${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n}\n\n","<!-- My Online Payment Container -->\r\n<div class=\"tw-w-full tw-h-full\">\r\n <div class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-table-row tw-w-full tw-h-0\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n \r\n <!-- Title -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Online Fee Payment</h5>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-items-center tw-gap-3\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"cancel()\" leftIcon=\"arrow_back\">\r\n Back to Statement\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"tw-table-row\">\r\n <div class=\"tw-table-cell tw-w-full tw-px-6 tw-py-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\r\n \r\n <!-- Left Panel - Fee Selection -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden tw-flex tw-flex-col\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Select Fees to Pay</h6>\r\n </div>\r\n \r\n <!-- Quick Actions -->\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50 tw-flex tw-gap-2\">\r\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"selectAll()\">\r\n Select All\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"selectOverdue()\">\r\n Select Overdue\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"clearSelection()\">\r\n Clear\r\n </button>\r\n </div>\r\n\r\n <!-- Fee Items List -->\r\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-space-y-3\">\r\n @if (outstandingFees().length === 0) {\r\n <div class=\"tw-text-center tw-py-8 tw-text-gray-500\">\r\n <cide-ele-icon class=\"tw-w-12 tw-h-12 tw-mx-auto tw-mb-2 tw-text-gray-400\">check_circle</cide-ele-icon>\r\n <p class=\"tw-text-sm\">No outstanding fees</p>\r\n </div>\r\n } @else {\r\n @for (fee of outstandingFees(); track fee.id) {\r\n <div class=\"tw-p-3 tw-rounded-lg tw-border-2 tw-cursor-pointer tw-transition-colors\"\r\n [class.tw-border-blue-500]=\"isSelected(fee)\"\r\n [class.tw-bg-blue-50]=\"isSelected(fee)\"\r\n [class.tw-border-yellow-400]=\"!isSelected(fee) && isOverdue(fee)\"\r\n [class.tw-bg-yellow-50]=\"!isSelected(fee) && isOverdue(fee)\"\r\n [class.tw-border-gray-200]=\"!isSelected(fee) && !isOverdue(fee)\"\r\n (click)=\"toggleFee(fee)\">\r\n <div class=\"tw-flex tw-items-start tw-justify-between tw-gap-3\">\r\n <div class=\"tw-flex tw-items-start tw-gap-3 tw-flex-1\">\r\n <input \r\n type=\"checkbox\" \r\n [checked]=\"isSelected(fee)\"\r\n (change)=\"toggleFee(fee); $event.stopPropagation()\"\r\n class=\"tw-mt-1\">\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-mb-1\">\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ fee.fee_head }}</span>\r\n @if (isOverdue(fee)) {\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-yellow-100 tw-text-yellow-800\">\r\n Overdue\r\n </span>\r\n }\r\n </div>\r\n <div class=\"tw-text-xs tw-text-gray-600\">\r\n Due Date: {{ fee.due_date | date:'dd/MM/yyyy' }}\r\n </div>\r\n @if (fee.late_fee > 0) {\r\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\r\n Late Fee: {{ formatCurrency(fee.late_fee) }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tw-text-right\">\r\n <div class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(fee.outstanding) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Right Panel - Payment Summary & Gateway -->\r\n <div class=\"tw-space-y-4\">\r\n \r\n <!-- Payment Summary Card -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Payment Summary</h6>\r\n </div>\r\n <div class=\"tw-p-4 tw-space-y-3\">\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-600\">Selected Items</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ selectedCount() }}</span>\r\n </div>\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-600\">Fee Amount</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(totalFeeAmount()) }}</span>\r\n </div>\r\n @if (totalLateFee() > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-text-red-600\">\r\n <span>Late Fee</span>\r\n <span class=\"tw-font-medium\">{{ formatCurrency(totalLateFee()) }}</span>\r\n </div>\r\n }\r\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-font-semibold tw-pt-2 tw-border-t tw-border-gray-200\">\r\n <span>Subtotal</span>\r\n <span>{{ formatCurrency(subtotal()) }}</span>\r\n </div>\r\n @if (convenienceFee() > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-600\">Convenience Fee (2%)</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(convenienceFee()) }}</span>\r\n </div>\r\n }\r\n <div class=\"tw-flex tw-justify-between tw-text-lg tw-font-bold tw-pt-3 tw-border-t-2 tw-border-gray-300 tw-text-green-600\">\r\n <span>Total Payable</span>\r\n <span>{{ formatCurrency(totalPayable()) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Payment Method Selection -->\r\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-overflow-hidden\">\r\n <div class=\"tw-px-4 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <h6 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-m-0\">Select Payment Method</h6>\r\n </div>\r\n <div class=\"tw-p-4\">\r\n <form [formGroup]=\"paymentForm\" class=\"tw-space-y-4\">\r\n \r\n <!-- Payment Method Cards -->\r\n <div class=\"tw-grid tw-grid-cols-3 tw-gap-3 tw-mb-4\">\r\n @for (method of paymentMethodOptions; track method.value) {\r\n <button\r\n type=\"button\"\r\n class=\"tw-p-4 tw-rounded-lg tw-border-2 tw-text-center tw-transition-colors\"\r\n [class.tw-border-blue-500]=\"selectedPaymentMethod() === method.value\"\r\n [class.tw-bg-blue-50]=\"selectedPaymentMethod() === method.value\"\r\n [class.tw-border-gray-200]=\"selectedPaymentMethod() !== method.value\"\r\n (click)=\"selectPaymentMethod(method.value)\">\r\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-mx-auto tw-mb-2\"\r\n [class.tw-text-blue-600]=\"selectedPaymentMethod() === method.value\"\r\n [class.tw-text-gray-400]=\"selectedPaymentMethod() !== method.value\">\r\n @switch (method.value) {\r\n @case ('UPI') { account_balance_wallet }\r\n @case ('CARD') { credit_card }\r\n @case ('NET_BANKING') { account_balance }\r\n }\r\n </cide-ele-icon>\r\n <div class=\"tw-text-xs tw-font-medium\">{{ method.label }}</div>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- UPI Details -->\r\n @if (selectedPaymentMethod() === 'UPI') {\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200\">\r\n <cide-ele-input\r\n label=\"UPI ID *\"\r\n formControlName=\"upi_id\"\r\n placeholder=\"username@upi\"\r\n size=\"sm\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n </div>\r\n }\r\n\r\n <!-- Card Details -->\r\n @if (selectedPaymentMethod() === 'CARD') {\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200 tw-space-y-3\">\r\n <cide-ele-input\r\n label=\"Card Number *\"\r\n formControlName=\"card_number\"\r\n placeholder=\"1234 5678 9012 3456\"\r\n size=\"sm\"\r\n maxLength=\"19\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\r\n <cide-ele-input\r\n label=\"Expiry Date *\"\r\n formControlName=\"expiry\"\r\n placeholder=\"MM/YY\"\r\n size=\"sm\"\r\n maxLength=\"5\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n <cide-ele-input\r\n label=\"CVV *\"\r\n formControlName=\"cvv\"\r\n type=\"password\"\r\n placeholder=\"***\"\r\n size=\"sm\"\r\n maxLength=\"3\"\r\n [required]=\"true\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Net Banking Details -->\r\n @if (selectedPaymentMethod() === 'NET_BANKING') {\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200\">\r\n <cide-ele-select\r\n label=\"Select Bank *\"\r\n formControlName=\"bank\"\r\n [options]=\"bankOptions\"\r\n size=\"sm\"\r\n placeholder=\"Select Bank\"\r\n [required]=\"true\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"tw-flex tw-gap-3 tw-pt-4\">\r\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"cancel()\" class=\"tw-flex-1\">\r\n Cancel\r\n </button>\r\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"proceedToPayment()\"\r\n [disabled]=\"!canProceed() || submitting()\" [loading]=\"submitting()\" class=\"tw-flex-1\" leftIcon=\"payment\">\r\n Pay {{ formatCurrency(totalPayable()) }}\r\n </button>\r\n </div>\r\n\r\n <!-- Security Info -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-2 tw-pt-2 tw-text-xs tw-text-gray-500\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">lock</cide-ele-icon>\r\n <span>Secure payment powered by Razorpay</span>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Component, input, output, signal, computed, inject, OnInit, OnDestroy, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CideIconComponent,\n CideEleButtonComponent,\n NotificationService,\n CurrencyPipe\n} from 'cloud-ide-element';\nimport { CideFeeFeeStructureService } from '../../../collection/fee-structure-management/services/fee-structure.service';\nimport { CideFeeFeeAssignmentService } from '../../../collection/fee-assignment-management/services/fee-assignment.service';\nimport {\n type feeStructureByIdControllerResponse,\n type MFeeStructureGetByIdPayload,\n type FeeStructureByIdResponse,\n type FeeStructureResponse,\n type FeeStructureItem,\n type controllerResponse\n} from 'cloud-ide-lms-model';\nimport { RightsService } from 'cloud-ide-layout';\n\n// Type for fee data (can be from fee structure item or fee assignment)\nexport type FeeDetailsData = {\n _id?: string;\n fees_structure_name?: string;\n fees_structure_code?: string;\n fees_category_name?: string;\n fees_amount?: number;\n fees_total_amount?: number;\n discount?: number;\n finalAmount?: number;\n _feeItemData?: FeeStructureItem | any;\n _feeAssignmentData?: any;\n};\n\n@Component({\n selector: 'cide-fee-details-viewer',\n standalone: true,\n imports: [\n CommonModule,\n CideIconComponent,\n CurrencyPipe\n ],\n template: `\n <div class=\"tw-p-4 tw-overflow-y-auto tw-h-full\">\n @if (loading()) {\n <div class=\"tw-text-center tw-py-12\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400 tw-animate-spin tw-mx-auto tw-mb-2\">refresh</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-500\">Loading fee details...</span>\n </div>\n } @else if (error()) {\n <div class=\"tw-text-center tw-py-12\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-400 tw-mx-auto tw-mb-2\">error</cide-ele-icon>\n <p class=\"tw-text-sm tw-text-red-600\">{{ error() }}</p>\n </div>\n } @else {\n @if (feeDetails(); as details) {\n <div class=\"tw-space-y-4 tw-text-sm\">\n <!-- Basic Information -->\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Basic Information</h4>\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Fee Name:</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.name }}</span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Fee Code:</span>\n <span class=\"tw-text-gray-900\">{{ details.itemCode }}</span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Category:</span>\n <span class=\"tw-text-gray-900\">{{ details.category }}</span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Structure:</span>\n <span class=\"tw-text-gray-900\">{{ details.structureName }}</span>\n </div>\n </div>\n @if (details.description) {\n <div class=\"tw-mt-3 tw-pt-3 tw-border-t tw-border-gray-200\">\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Description:</span>\n <p class=\"tw-text-gray-900 tw-text-sm\">{{ details.description }}</p>\n </div>\n }\n </div>\n\n <!-- Amount Breakdown -->\n <div class=\"tw-bg-blue-50 tw-rounded-lg tw-p-3 tw-border tw-border-blue-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Amount Breakdown</h4>\n <div class=\"tw-space-y-2\">\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-gray-600\">Original Amount:</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.amount | currency }}</span>\n </div>\n @if (details.discount > 0) {\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-gray-600\">Discount Applied:</span>\n <span class=\"tw-font-medium tw-text-blue-600\">-{{ details.discount | currency }}</span>\n </div>\n }\n @if (details.taxApplicable && details.taxPercentage > 0) {\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-gray-600\">Tax ({{ details.taxPercentage }}%):</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ (details.finalAmount * details.taxPercentage) / 100 | currency }}</span>\n </div>\n }\n <div class=\"tw-flex tw-justify-between tw-items-center tw-pt-2 tw-border-t tw-border-blue-200\">\n <span class=\"tw-font-semibold tw-text-gray-900\">Final Amount:</span>\n <span class=\"tw-font-bold tw-text-green-600 tw-text-base\">{{ details.finalAmount | currency }}</span>\n </div>\n </div>\n </div>\n\n <!-- Installment Breakdown -->\n @if (details.installmentAllowed && details.installments && details.installments.length > 1) {\n <div class=\"tw-bg-purple-50 tw-rounded-lg tw-p-3 tw-border tw-border-purple-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Installment Plan</h4>\n <div class=\"tw-mb-2 tw-text-xs tw-text-gray-600\">\n Total Amount: <span class=\"tw-font-semibold\">{{ details.finalAmount | currency }}</span> \n divided into <span class=\"tw-font-semibold\">{{ details.installmentCount }}</span> installments\n </div>\n <div class=\"tw-overflow-x-auto\">\n <table class=\"tw-min-w-full tw-divide-y tw-divide-purple-200\">\n <thead class=\"tw-bg-purple-100\">\n <tr>\n <th class=\"tw-px-3 tw-py-2 tw-text-left tw-text-xs tw-font-semibold tw-text-gray-700\">Installment #</th>\n <th class=\"tw-px-3 tw-py-2 tw-text-right tw-text-xs tw-font-semibold tw-text-gray-700\">Amount</th>\n <th class=\"tw-px-3 tw-py-2 tw-text-left tw-text-xs tw-font-semibold tw-text-gray-700\">Due Date</th>\n <th class=\"tw-px-3 tw-py-2 tw-text-center tw-text-xs tw-font-semibold tw-text-gray-700\">Days from Assignment</th>\n <th class=\"tw-px-3 tw-py-2 tw-text-center tw-text-xs tw-font-semibold tw-text-gray-700\">Days from Previous</th>\n </tr>\n </thead>\n <tbody class=\"tw-bg-white tw-divide-y tw-divide-purple-200\">\n @for (installment of details.installments; track installment.number) {\n <tr>\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-900 tw-font-medium\">#{{ installment.number }}</td>\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-900 tw-text-right tw-font-semibold\">{{ installment.amount | currency }}</td>\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600\">{{ installment.dueDate || 'TBD' }}</td>\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600 tw-text-center\">\n @if (installment.daysFromAssignment !== undefined) {\n <span class=\"tw-font-medium\">{{ installment.daysFromAssignment }} days</span>\n } @else {\n <span class=\"tw-text-gray-400\">-</span>\n }\n </td>\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600 tw-text-center\">\n @if (installment.daysFromPrevious !== undefined) {\n <span class=\"tw-font-medium\">{{ installment.daysFromPrevious }} days</span>\n } @else {\n <span class=\"tw-text-gray-400\">-</span>\n }\n </td>\n </tr>\n }\n </tbody>\n <tfoot class=\"tw-bg-purple-100\">\n <tr>\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-font-bold tw-text-gray-900\">Total:</td>\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-font-bold tw-text-green-600 tw-text-right\">{{ details.finalAmount | currency }}</td>\n <td colspan=\"3\"></td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n } @else {\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-2\">Payment Information</h4>\n <div class=\"tw-space-y-1 tw-text-xs\">\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Payment Type:</span>\n <span class=\"tw-font-medium tw-text-gray-900\">One-time Payment</span>\n </div>\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Amount to Pay:</span>\n <span class=\"tw-font-bold tw-text-green-600\">{{ details.finalAmount | currency }}</span>\n </div>\n @if (details.installments && details.installments.length > 0 && details.installments[0].dueDate) {\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Due Date:</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.installments[0].dueDate }}</span>\n </div>\n }\n @if (details.dueDateOffset > 0) {\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Due Date Offset:</span>\n <span class=\"tw-text-gray-900\">{{ details.dueDateOffset }} days from assignment date</span>\n </div>\n }\n @if (details.installments && details.installments.length > 0 && details.installments[0].daysFromAssignment) {\n <div class=\"tw-flex tw-justify-between\">\n <span class=\"tw-text-gray-600\">Days from Assignment:</span>\n <span class=\"tw-text-gray-900\">{{ details.installments[0].daysFromAssignment }} days</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Fee Properties -->\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Fee Properties</h4>\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Mandatory:</span>\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\" [class]=\"details.isMandatory ? 'tw-bg-red-100 tw-text-red-800' : 'tw-bg-gray-100 tw-text-gray-800'\">\n {{ details.isMandatory ? 'Yes - Required' : 'No - Optional' }}\n </span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Refundable:</span>\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\" [class]=\"details.isRefundable ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-gray-100 tw-text-gray-800'\">\n {{ details.isRefundable ? 'Yes' : 'No' }}\n </span>\n </div>\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Amount Editable:</span>\n <span class=\"tw-text-gray-900 tw-text-sm\">{{ details.isAmountEditable ? 'Yes' : 'No' }}</span>\n </div>\n @if (details.isAmountEditable && (details.minAmount || details.maxAmount)) {\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Amount Range:</span>\n <span class=\"tw-text-gray-900 tw-text-sm\">\n {{ details.minAmount ? (details.minAmount | currency) : 'No min' }} - \n {{ details.maxAmount ? (details.maxAmount | currency) : 'No max' }}\n </span>\n </div>\n }\n @if (details.taxApplicable) {\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Tax Applicable:</span>\n <span class=\"tw-text-gray-900 tw-text-sm\">{{ details.taxPercentage }}%</span>\n </div>\n }\n @if (details.collectionStartOffset || details.collectionEndOffset) {\n <div>\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Collection Window:</span>\n <span class=\"tw-text-gray-900 tw-text-sm\">\n Day {{ details.collectionStartOffset }} to Day {{ details.collectionEndOffset }}\n </span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n }\n `]\n})\nexport class FeeDetailsViewerComponent implements OnInit, OnDestroy {\n // Inputs\n isOpen = input<boolean>(false);\n studentId = input<string | null>(null);\n feeId = input<string | null>(null);\n feeData = input<FeeDetailsData | null>(null); // For new applicable fees\n assignmentDate = input<Date | null>(null); // Assignment date for due date calculation\n discount = input<number>(0); // Discount amount to apply\n\n // Outputs\n closed = output<void>();\n\n // Services\n private readonly destroyRef = inject(DestroyRef);\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly notificationService = inject(NotificationService);\n private readonly rightsService = inject(RightsService);\n\n // State\n loading = signal(false);\n error = signal<string | null>(null);\n feeDetails = signal<any>(null);\n\n ngOnInit(): void {\n // Initialize rights for fee details viewer (view-only)\n this.rightsService.initializeRights('fee_statement');\n // Watch for changes in inputs and reload when they change\n this.loadFeeDetails();\n }\n\n private loadFeeDetails(): void {\n // Check if feeData signal input is available and has a value\n try {\n const feeDataValue = this.feeData?.();\n console.log('๐ FeeDetailsViewer - loadFeeDetails - feeDataValue:', feeDataValue);\n console.log('๐ FeeDetailsViewer - loadFeeDetails - _feeItemData:', feeDataValue?._feeItemData);\n \n if (feeDataValue) {\n // Use provided fee data (for new applicable fees)\n this.processFeeData(feeDataValue);\n return;\n }\n } catch (error) {\n // Signal input might not be initialized yet, continue to other checks\n console.warn('FeeData signal not yet initialized:', error);\n }\n \n // Fallback to loading from student/fee IDs\n const studentIdValue = this.studentId?.();\n const feeIdValue = this.feeId?.();\n \n if (studentIdValue && feeIdValue) {\n // Load existing fee assignment\n this.loadFeeAssignment();\n return;\n }\n \n if (feeIdValue) {\n // Load fee structure item\n this.loadFeeStructureItem();\n return;\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n private loadFeeAssignment(): void {\n if (!this.feeId() || !this.studentId()) return;\n\n this.loading.set(true);\n this.error.set(null);\n\n this.feeAssignmentService.getFeeAssignmentById(this.feeId()!)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n this.loading.set(false);\n if (response?.success && response?.data) {\n const assignment = response.data;\n // Transform fee assignment to fee details format\n this.processFeeAssignmentData(assignment);\n } else {\n this.error.set(response?.message || 'Failed to load fee assignment');\n }\n },\n error: (err: { error?: controllerResponse }) => {\n this.loading.set(false);\n this.error.set(err?.error?.message || 'Failed to load fee assignment');\n }\n });\n }\n\n private loadFeeStructureItem(): void {\n if (!this.feeId()) return;\n\n this.loading.set(true);\n this.error.set(null);\n\n // Extract fee structure ID from fee ID (assuming feeId is the structure item ID)\n // We need to get the structure first, then find the item\n // For now, let's assume feeId is the structure ID and we need to find the item\n const payload: MFeeStructureGetByIdPayload = {\n fees_id: this.feeId()!\n };\n\n this.feeStructureService.getFeeStructureById(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: feeStructureByIdControllerResponse) => {\n this.loading.set(false);\n if (response?.success && response?.data) {\n const isFeeStructureByIdResponse = (data: FeeStructureByIdResponse | FeeStructureResponse): data is FeeStructureByIdResponse => {\n return data !== null && typeof data === 'object' && 'fee_structure' in data;\n };\n\n if (isFeeStructureByIdResponse(response.data)) {\n const items = response.data.fee_structure_items || [];\n // If multiple items, we'd need to know which one - for now use first item\n // In real scenario, feeId should be the item ID\n if (items.length > 0) {\n const item = items[0];\n const structure = response.data.fee_structure;\n if (structure) {\n this.processFeeItemData(item, structure);\n } else {\n this.error.set('Fee structure data is missing');\n }\n } else {\n this.error.set('No fee items found in structure');\n }\n }\n } else {\n this.error.set(response?.message || 'Failed to load fee structure');\n }\n },\n error: (err: { error?: controllerResponse }) => {\n this.loading.set(false);\n this.error.set(err?.error?.message || 'Failed to load fee structure');\n }\n });\n }\n\n private processFeeData(fee: FeeDetailsData): void {\n console.log('๐ FeeDetailsViewer - processFeeData - fee:', fee);\n console.log('๐ FeeDetailsViewer - processFeeData - _feeItemData:', fee._feeItemData);\n \n // Ensure we have proper item data structure\n let itemData = fee._feeItemData;\n \n console.log('๐ FeeDetailsViewer - processFeeData - itemData before check:', itemData);\n console.log('๐ FeeDetailsViewer - processFeeData - itemData type:', typeof itemData);\n console.log('๐ FeeDetailsViewer - processFeeData - itemData keys:', itemData ? Object.keys(itemData) : 'null/undefined');\n \n // If _feeItemData doesn't exist or is incomplete, construct it from fee data\n if (!itemData || typeof itemData !== 'object' || Object.keys(itemData).length === 0) {\n console.warn('โ ๏ธ FeeDetailsViewer - _feeItemData is missing or empty, creating fallback');\n // Try to extract from fee object itself if it has the structure\n if (fee && typeof fee === 'object' && 'feesi_item_name' in fee) {\n itemData = fee as any; // Use fee as itemData if it has feesi_ fields\n } else {\n // Last resort: create minimal structure from available fee data\n itemData = {\n feesi_item_name: fee.fees_structure_name || 'N/A',\n feesi_item_code: fee.fees_structure_code || 'N/A',\n feesi_amount: fee.fees_amount || fee.fees_total_amount || 0,\n feesi_description: 'No description available',\n feesi_category_id_sygms: fee.fees_category_name || null,\n feesi_is_mandatory: false,\n feesi_is_refundable: false,\n feesi_is_amount_editable: false,\n feesi_is_installment_allowed: false,\n feesi_installment_count: 1,\n feesi_due_date_offset_days: 0,\n feesi_collection_start_offset_days: 0,\n feesi_collection_end_offset_days: 30,\n feesi_tax_applicable: false,\n feesi_tax_percentage: 0\n };\n }\n } else {\n // Ensure all required fields exist, using fee data as fallback\n // Only use fallback if the field is missing or empty\n if (!itemData.feesi_item_name || itemData.feesi_item_name === 'N/A') {\n itemData.feesi_item_name = fee.fees_structure_name || itemData.feesi_item_name || 'N/A';\n }\n if (!itemData.feesi_item_code || itemData.feesi_item_code === 'N/A') {\n itemData.feesi_item_code = fee.fees_structure_code || itemData.feesi_item_code || 'N/A';\n }\n if (itemData.feesi_amount === undefined || itemData.feesi_amount === null || itemData.feesi_amount === 0) {\n itemData.feesi_amount = fee.fees_amount || fee.fees_total_amount || itemData.feesi_amount || 0;\n }\n if (!itemData.feesi_description || itemData.feesi_description === 'No description available') {\n itemData.feesi_description = itemData.feesi_description || 'No description available';\n }\n \n // Ensure category is properly set\n if (!itemData.feesi_category_id_sygms || (typeof itemData.feesi_category_id_sygms === 'string' && itemData.feesi_category_id_sygms === 'N/A')) {\n // Try to preserve if it's an object, otherwise use category name from fee\n if (fee.fees_category_name && fee.fees_category_name !== 'N/A') {\n // If we have category name but not the ID object, we'll use the name\n // The category extraction in calculateAndSetFeeDetails will handle this\n }\n }\n }\n \n const finalAmount = (fee.fees_total_amount || fee.fees_amount || 0) - (this.discount() || fee.discount || 0);\n \n // Ensure assignmentDate is a Date object\n let assignmentDate: Date;\n try {\n const dateValue = this.assignmentDate();\n if (dateValue instanceof Date) {\n assignmentDate = dateValue;\n } else if (dateValue && typeof dateValue === 'string') {\n assignmentDate = new Date(dateValue);\n } else {\n assignmentDate = new Date();\n }\n } catch {\n assignmentDate = new Date();\n }\n \n // Ensure fee data has all required fields\n const feeDataWithDefaults: FeeDetailsData = {\n ...fee,\n fees_structure_name: fee.fees_structure_name || 'N/A',\n fees_structure_code: fee.fees_structure_code || 'N/A',\n fees_category_name: fee.fees_category_name || 'N/A',\n fees_amount: fee.fees_amount || fee.fees_total_amount || 0,\n fees_total_amount: fee.fees_total_amount || fee.fees_amount || 0,\n discount: fee.discount || this.discount() || 0,\n finalAmount: finalAmount,\n _feeItemData: itemData\n };\n \n this.calculateAndSetFeeDetails(itemData, feeDataWithDefaults, finalAmount, assignmentDate);\n }\n\n private processFeeAssignmentData(assignment: any): void {\n // Transform assignment data to fee details format\n const finalAmount = assignment.feeas_final_amount || assignment.feeas_total_amount || 0;\n \n // Ensure assignmentDate is a Date object\n let assignmentDate: Date;\n try {\n if (assignment.feeas_assignment_date) {\n assignmentDate = assignment.feeas_assignment_date instanceof Date \n ? assignment.feeas_assignment_date \n : new Date(assignment.feeas_assignment_date);\n } else {\n // Try to get from input signal, otherwise use current date\n const dateValue = this.assignmentDate();\n if (dateValue instanceof Date) {\n assignmentDate = dateValue;\n } else if (dateValue && typeof dateValue === 'string') {\n assignmentDate = new Date(dateValue);\n } else {\n assignmentDate = new Date();\n }\n }\n } catch {\n assignmentDate = new Date();\n }\n \n // Create a mock item data structure from assignment\n const itemData = {\n feesi_item_name: assignment.feeas_fee_name,\n feesi_item_code: assignment.feeas_fee_name,\n feesi_description: assignment.feeas_fee_description,\n feesi_amount: assignment.feeas_original_amount || 0,\n feesi_is_mandatory: true, // Assumed\n feesi_is_refundable: false, // Assumed\n feesi_is_installment_allowed: (assignment.feeas_installment_count || 1) > 1,\n feesi_installment_count: assignment.feeas_installment_count || 1,\n feesi_due_date_offset_days: assignment.feeas_due_date ? \n Math.floor((new Date(assignment.feeas_due_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 0,\n feesi_collection_start_offset_days: assignment.feeas_collection_start_date ? \n Math.floor((new Date(assignment.feeas_collection_start_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 0,\n feesi_collection_end_offset_days: assignment.feeas_collection_end_date ? \n Math.floor((new Date(assignment.feeas_collection_end_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 30,\n feesi_tax_applicable: false,\n feesi_tax_percentage: 0\n };\n\n const feeData: FeeDetailsData = {\n _id: assignment._id,\n fees_structure_name: typeof assignment.feeas_fee_structure_id_feest === 'object' \n ? (assignment.feeas_fee_structure_id_feest as any)?.fees_structure_name \n : assignment.fee_structure_name || 'Custom Fee',\n fees_category_name: assignment.feeas_fee_category_sygms || 'N/A',\n fees_amount: assignment.feeas_original_amount || 0,\n fees_total_amount: assignment.feeas_original_amount || 0,\n discount: assignment.feeas_discount_amount || 0,\n finalAmount: finalAmount,\n _feeItemData: itemData,\n _feeAssignmentData: assignment\n };\n\n this.calculateAndSetFeeDetails(itemData, feeData, finalAmount, assignmentDate);\n }\n\n private processFeeItemData(item: FeeStructureItem, structure: FeeStructureResponse): void {\n const finalAmount = (item.feesi_amount || 0) - (this.discount() || 0);\n \n // Ensure assignmentDate is a Date object\n let assignmentDate: Date;\n try {\n const dateValue = this.assignmentDate();\n if (dateValue instanceof Date) {\n assignmentDate = dateValue;\n } else if (dateValue && typeof dateValue === 'string') {\n assignmentDate = new Date(dateValue);\n } else {\n assignmentDate = new Date();\n }\n } catch {\n assignmentDate = new Date();\n }\n\n const feeData: FeeDetailsData = {\n _id: item._id,\n fees_structure_name: structure.fees_structure_name,\n fees_structure_code: structure.fees_structure_code,\n fees_category_name: typeof item.feesi_category_id_sygms === 'object' \n ? (item.feesi_category_id_sygms as any)?.sygms_title || 'N/A'\n : 'N/A',\n fees_amount: item.feesi_amount || 0,\n fees_total_amount: item.feesi_amount || 0,\n discount: this.discount(),\n finalAmount: finalAmount,\n _feeItemData: item\n };\n\n this.calculateAndSetFeeDetails(item, feeData, finalAmount, assignmentDate);\n }\n\n /**\n * Helper method to ensure a value is a Date object\n */\n private ensureDate(value: Date | string | null | undefined): Date {\n if (value instanceof Date) {\n return value;\n }\n if (value && typeof value === 'string') {\n const date = new Date(value);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n return new Date();\n }\n\n private calculateAndSetFeeDetails(\n itemData: any,\n feeData: FeeDetailsData,\n finalAmount: number,\n assignmentDate: Date | string | null | undefined\n ): void {\n // Ensure assignmentDate is always a Date object\n const assignmentDateObj = this.ensureDate(assignmentDate);\n \n const installmentCount = itemData.feesi_installment_count || 1;\n const installmentAllowed = itemData.feesi_is_installment_allowed || false;\n const daysBetweenInstallments = 30;\n\n // Calculate installment breakdown\n const installments: Array<{\n number: number;\n amount: number;\n dueDate?: string;\n daysFromAssignment?: number;\n daysFromPrevious?: number;\n }> = [];\n\n if (installmentAllowed && installmentCount > 1) {\n const installmentAmount = finalAmount / installmentCount;\n const baseAmount = Math.floor((installmentAmount * 100)) / 100;\n const remainder = Math.round((finalAmount - (baseAmount * installmentCount)) * 100) / 100;\n\n let previousDueDate: Date | null = null;\n\n for (let i = 1; i <= installmentCount; i++) {\n const amount = i === installmentCount ? baseAmount + remainder : baseAmount;\n\n let dueDate = '';\n let dueDateObj: Date | null = null;\n let daysFromAssignment = 0;\n let daysFromPrevious = 0;\n\n if (itemData.feesi_due_date_offset_days !== undefined && itemData.feesi_due_date_offset_days !== null) {\n if (i === 1) {\n dueDateObj = new Date(assignmentDateObj);\n dueDateObj.setDate(assignmentDateObj.getDate() + itemData.feesi_due_date_offset_days);\n daysFromAssignment = itemData.feesi_due_date_offset_days;\n } else {\n if (previousDueDate) {\n dueDateObj = new Date(previousDueDate);\n dueDateObj.setDate(previousDueDate.getDate() + daysBetweenInstallments);\n daysFromPrevious = daysBetweenInstallments;\n daysFromAssignment = Math.floor((dueDateObj.getTime() - assignmentDateObj.getTime()) / (1000 * 60 * 60 * 24));\n }\n }\n\n if (dueDateObj) {\n dueDate = dueDateObj.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n previousDueDate = dueDateObj;\n }\n }\n\n installments.push({\n number: i,\n amount: Math.round(amount * 100) / 100,\n dueDate,\n daysFromAssignment: daysFromAssignment > 0 ? daysFromAssignment : undefined,\n daysFromPrevious: daysFromPrevious > 0 ? daysFromPrevious : undefined\n });\n }\n } else {\n // Single payment\n let dueDate = '';\n let daysFromAssignment = 0;\n if (itemData.feesi_due_date_offset_days !== undefined && itemData.feesi_due_date_offset_days !== null) {\n const dueDateObj = new Date(assignmentDateObj);\n dueDateObj.setDate(assignmentDateObj.getDate() + itemData.feesi_due_date_offset_days);\n dueDate = dueDateObj.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n daysFromAssignment = itemData.feesi_due_date_offset_days;\n }\n\n installments.push({\n number: 1,\n amount: finalAmount,\n dueDate,\n daysFromAssignment: daysFromAssignment > 0 ? daysFromAssignment : undefined\n });\n }\n\n // Extract category name - check multiple sources\n let categoryName = 'N/A';\n if (feeData.fees_category_name && feeData.fees_category_name !== 'N/A' && feeData.fees_category_name.trim() !== '') {\n categoryName = feeData.fees_category_name;\n } else if (itemData.feesi_category_id_sygms) {\n if (typeof itemData.feesi_category_id_sygms === 'object' && itemData.feesi_category_id_sygms !== null) {\n categoryName = (itemData.feesi_category_id_sygms as any)?.sygms_title || \n (itemData.feesi_category_id_sygms as any)?.sygms_name || \n 'N/A';\n } else if (typeof itemData.feesi_category_id_sygms === 'string') {\n // If it's just an ID string, we can't resolve it here, use fallback\n categoryName = 'N/A';\n }\n }\n \n // Final fallback - try to get from item code or name\n if (categoryName === 'N/A' && itemData.feesi_item_code) {\n categoryName = itemData.feesi_item_code;\n }\n\n // Extract fee name - prioritize item name, then item code, then structure name\n const feeName = itemData.feesi_item_name || \n itemData.feesi_item_code || \n feeData.fees_structure_name || \n 'N/A';\n \n // Extract item code - prioritize item code, then structure code, then structure name\n const itemCode = itemData.feesi_item_code || \n feeData.fees_structure_code || \n feeData.fees_structure_name || \n 'N/A';\n \n // Extract structure name\n const structureName = feeData.fees_structure_name || \n feeData.fees_structure_code || \n 'N/A';\n \n // Extract description\n const description = itemData.feesi_description || \n feeData.fees_structure_name || \n 'No description available';\n\n this.feeDetails.set({\n name: feeName,\n category: categoryName,\n amount: itemData.feesi_amount || feeData.fees_amount || 0,\n discount: this.discount() || feeData.discount || 0,\n finalAmount: finalAmount > 0 ? finalAmount : (itemData.feesi_amount || feeData.fees_amount || 0),\n structureName: structureName,\n structureCode: feeData.fees_structure_code || 'N/A',\n itemCode: itemCode,\n description: description,\n isMandatory: itemData.feesi_is_mandatory || false,\n isRefundable: itemData.feesi_is_refundable || false,\n isAmountEditable: itemData.feesi_is_amount_editable || false,\n minAmount: itemData.feesi_min_amount,\n maxAmount: itemData.feesi_max_amount,\n installmentAllowed: installmentAllowed,\n installmentCount: installmentCount,\n installmentAmount: installmentAllowed && installmentCount > 1 ? finalAmount / installmentCount : finalAmount,\n installments: installments,\n dueDateOffset: itemData.feesi_due_date_offset_days || 0,\n collectionStartOffset: itemData.feesi_collection_start_offset_days || 0,\n collectionEndOffset: itemData.feesi_collection_end_offset_days || 0,\n taxApplicable: itemData.feesi_tax_applicable || false,\n taxPercentage: itemData.feesi_tax_percentage || 0,\n displayOrder: itemData.feesi_display_order || 0\n });\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n\n","/*\n * Public API Surface of cloud-ide-fees\n */\n\nexport * from './lib/cloud-ide-fees';\n\n// Routes\nexport * from './lib/cloud-ide-fees.routes';\n\n// Fee Structure Management\nexport * from './lib/collection/fee-structure-management/services/fee-structure.service';\nexport * from './lib/collection/fee-structure-management/components/fee-structure-list/fee-structure-list.component';\nexport * from './lib/collection/fee-structure-management/components/fee-structure-create/fee-structure-create.component';\n\n// Fee Assignment Management\nexport * from './lib/collection/fee-assignment-management/services/fee-assignment.service';\nexport * from './lib/collection/fee-assignment-management/components/fee-assignment-list/fee-assignment-list.component';\nexport * from './lib/collection/fee-assignment-management/components/fee-assignment-create/fee-assignment-create.component';\n\n// Fee Payment Management\nexport * from './lib/collection/fee-payment-management/services/fee-payment.service';\nexport * from './lib/collection/fee-payment-management/components/fee-payment-list/fee-payment-list.component';\nexport * from './lib/collection/fee-payment-management/components/fee-payment-process/fee-payment-process.component';\nexport * from './lib/collection/fee-payment-management/components/fee-payment-view/fee-payment-view.component';\n\n// Discount Management\nexport * from './lib/collection/discount-management/components/discount-rules/discount-rules.component';\n\n// Receipt Template\nexport * from './lib/collection/receipt-template/services/receipt-template.service';\nexport * from './lib/collection/receipt-template/components/template-designer/template-designer.component';\n\n// Reports\nexport * from './lib/collection/reports/components/collection-report/collection-report.component';\n\n// Student Fees (Integrated into Dashboard)\nexport * from './lib/collection/student-fees/components/my-fee-statement/my-fee-statement.component';\nexport * from './lib/collection/student-fees/components/my-online-payment/my-online-payment.component';\n\n// Shared Components\nexport * from './lib/shared/components/fee-details-viewer/fee-details-viewer.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
|