cloud-ide-fees 0.0.30 โ†’ 0.0.31

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';\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\nimport { AuthUserMstListPayload, authUserMstListControllerResponse } from 'cloud-ide-lms-model';\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 userMasterService = inject(CideCoreUserMasterService);\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) {\n this.assignmentForm.patchValue({ student_id: '' });\n return;\n }\n \n this.loading.set(true);\n \n // Search for students using user master service\n const payload: AuthUserMstListPayload = {\n query: searchQuery,\n pageIndex: 1,\n pageSize: 10,\n pagination: true\n };\n\n this.userMasterService.getUserList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: authUserMstListControllerResponse) => {\n if (response?.success && response?.data) {\n // Filter for students only\n const students = response.data.filter((user: any) => \n user.user_type_mapping?.syutm_user_type === 'STUDENT'\n );\n\n if (students.length === 0) {\n this.notificationService.warning('No students found matching your search.');\n this.assignmentForm.patchValue({ student_id: '' });\n this.loading.set(false);\n return;\n }\n\n // Use first matching student (or could show dropdown for multiple matches)\n const student = students[0];\n const studentId = student._id || '';\n \n if (studentId) {\n this.assignmentForm.patchValue({ student_id: studentId });\n this.notificationService.success(`Student found: ${student.user_fullname || 'Unknown'}`);\n } else {\n this.notificationService.warning('Student ID not found.');\n this.assignmentForm.patchValue({ student_id: '' });\n }\n } else {\n this.notificationService.warning('No students found matching your search.');\n this.assignmentForm.patchValue({ student_id: '' });\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error searching for students:', err);\n this.notificationService.error('Failed to search for students. Please try again.');\n this.assignmentForm.patchValue({ student_id: '' });\n this.loading.set(false);\n }\n });\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, AuthUserMstListPayload, authUserMstListControllerResponse } from 'cloud-ide-lms-model';\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\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 userMasterService = inject(CideCoreUserMasterService);\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) {\n this.selectedStudent.set(null);\n this.paymentForm.patchValue({ student_id: '' });\n return;\n }\n\n this.loading.set(true);\n \n // Search for students using user master service\n const payload: AuthUserMstListPayload = {\n query: searchQuery,\n pageIndex: 1,\n pageSize: 10,\n pagination: true\n };\n\n this.userMasterService.getUserList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: authUserMstListControllerResponse) => {\n if (response?.success && response?.data) {\n // Filter for students only\n const students = (response.data as any[]).filter((user: any) => \n user.user_type_mapping?.syutm_user_type === 'STUDENT'\n );\n\n if (students.length === 0) {\n this.notificationService.warning('No students found matching your search.');\n this.selectedStudent.set(null);\n this.paymentForm.patchValue({ student_id: '' });\n this.loading.set(false);\n return;\n }\n\n // Use first matching student (or could show dropdown for multiple matches)\n const student = students[0];\n const studentData: Student = {\n _id: student._id || '',\n name: student.user_fullname || 'Unknown',\n student_id: student.user_type_mapping?.syutm_type_specific_id || student._id || '',\n class: (student as any).class || 'N/A',\n section: (student as any).section || 'N/A'\n };\n\n this.selectedStudent.set(studentData);\n this.paymentForm.patchValue({ student_id: studentData._id });\n this.loadOutstandingFees(studentData._id);\n } else {\n this.notificationService.warning('No students found matching your search.');\n this.selectedStudent.set(null);\n this.paymentForm.patchValue({ student_id: '' });\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error searching for students:', err);\n this.notificationService.error('Failed to search for students. Please try again.');\n this.selectedStudent.set(null);\n this.paymentForm.patchValue({ student_id: '' });\n this.loading.set(false);\n }\n });\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 -->\n<div class=\"tw-w-full tw-h-full\">\n <form class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\" [formGroup]=\"paymentForm\" \n [class.tw-opacity-60]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n\n <!-- Header Section -->\n <div class=\"tw-table-row tw-w-full tw-h-0\">\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\">\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\">\n \n <!-- Title -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Record Payment</h5>\n </div>\n\n <!-- Actions -->\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\">\n <!-- Back button or other actions can be added here if needed -->\n </div>\n </div>\n </div>\n </div>\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-4\">\n\n <!-- Student Information -->\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 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=\"Search Student\" \n formControlName=\"student_search\"\n placeholder=\"Enter student name or ID...\"\n size=\"sm\"\n leadingIcon=\"search\"\n (ngModelChange)=\"onStudentSearch($event)\">\n </cide-ele-input>\n \n @if (selectedStudent()) {\n <div class=\"tw-mt-2 tw-p-2 tw-bg-green-50 tw-border tw-border-green-200 tw-rounded\">\n <div class=\"tw-text-sm tw-font-medium tw-text-green-900\">{{ selectedStudent()?.name }}</div>\n <div class=\"tw-text-xs tw-text-green-700\">ID: {{ selectedStudent()?.student_id }}</div>\n @if (selectedStudent()?.class) {\n <div class=\"tw-text-xs tw-text-green-600\">{{ selectedStudent()?.class }} / {{ selectedStudent()?.section }}</div>\n }\n </div>\n }\n </div>\n\n <cide-ele-input \n label=\"Payment Date\" \n formControlName=\"feepay_payment_date\"\n type=\"date\"\n size=\"sm\"\n leadingIcon=\"calendar_today\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Fee Selection -->\n @if (selectedStudent() && outstandingFees().length > 0) {\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 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\">Select Fees to Pay</h6>\n <div class=\"tw-flex tw-items-center tw-gap-3\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-input \n formControlName=\"pay_full_outstanding\" \n type=\"checkbox\" \n size=\"sm\"\n (change)=\"togglePayFullOutstanding()\">\n </cide-ele-input>\n <span class=\"tw-text-sm tw-text-gray-700\">Pay full outstanding</span>\n </div>\n <button cideEleButton type=\"button\" variant=\"success\" size=\"xs\" (click)=\"selectAllFees()\">\n Select All\n </button>\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"xs\" (click)=\"clearAllFees()\">\n Clear\n </button>\n </div>\n </div>\n\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\">\n @for (item of feeItemsArray.controls; track $index) {\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\"\n [formGroupName]=\"$index\">\n \n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-1\">\n <cide-ele-input \n formControlName=\"is_selected\" \n type=\"checkbox\" \n size=\"sm\"\n (change)=\"toggleFeeItem($index)\">\n </cide-ele-input>\n \n <div class=\"tw-flex-1\">\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900\">\n {{ item.get('fee_head')?.value }}\n </div>\n <div class=\"tw-text-xs tw-text-gray-500\">\n Outstanding: {{ formatCurrency(item.get('outstanding_amount')?.value || 0) }}\n @if (item.get('late_fee')?.value > 0) {\n <span class=\"tw-text-red-600\"> | Late Fee: {{ formatCurrency(item.get('late_fee')?.value) }}</span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-input \n formControlName=\"amount_paid\"\n type=\"number\"\n placeholder=\"0.00\"\n size=\"sm\"\n [disabled]=\"!item.get('is_selected')?.value\"\n (ngModelChange)=\"onAmountChange($index, $event)\"\n class=\"tw-w-28\">\n </cide-ele-input>\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Payment Details -->\n @if (selectedStudent()) {\n <div class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-p-4\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-gray-900 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-select \n label=\"Payment Method\" \n formControlName=\"feepay_payment_method\"\n [options]=\"paymentMethodOptions\"\n size=\"sm\"\n leadingIcon=\"payment\">\n </cide-ele-select>\n\n <cide-ele-select \n label=\"Payment Mode\" \n formControlName=\"feepay_payment_mode\"\n [options]=\"[{value: 'OFFLINE', label: 'Offline'}, {value: 'ONLINE', label: 'Online'}]\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <!-- Cheque/DD Details -->\n @if (showChequeDetails()) {\n <div class=\"tw-mt-4 tw-p-3 tw-bg-blue-50 tw-rounded tw-border tw-border-blue-200\">\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-blue-900 tw-mb-3\">Cheque/DD Details</h6>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\n <cide-ele-input \n label=\"Cheque/DD Number\" \n formControlName=\"feepay_cheque_number\"\n placeholder=\"Enter cheque/DD number\"\n size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Cheque/DD Date\" \n formControlName=\"feepay_cheque_date\"\n type=\"date\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-mt-3\">\n <cide-ele-input \n label=\"Bank Name\" \n formControlName=\"feepay_bank_name\"\n placeholder=\"Enter bank name\"\n size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Branch Name\" \n formControlName=\"feepay_bank_branch_name\"\n placeholder=\"Enter branch name\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n <div class=\"tw-mt-3\">\n <cide-ele-input \n label=\"IFSC Code\" \n formControlName=\"feepay_bank_ifsc_code\"\n placeholder=\"Enter IFSC code\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n <div class=\"tw-mt-3\">\n <cide-ele-input \n label=\"Instrument Date\" \n formControlName=\"feepay_instrument_date\"\n type=\"date\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n <!-- Bank Transfer Details -->\n @if (showBankDetails()) {\n <div class=\"tw-mt-4 tw-p-3 tw-bg-green-50 tw-rounded tw-border tw-border-green-200\">\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-green-900 tw-mb-3\">Bank Transfer Details</h6>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\n <cide-ele-input \n label=\"Bank Name\" \n formControlName=\"feepay_bank_name\"\n placeholder=\"Enter bank name\"\n size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Branch Name\" \n formControlName=\"feepay_bank_branch_name\"\n placeholder=\"Enter branch name\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-mt-3\">\n <cide-ele-input \n label=\"IFSC Code\" \n formControlName=\"feepay_bank_ifsc_code\"\n placeholder=\"Enter IFSC code\"\n size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-input \n label=\"Account Number\" \n formControlName=\"feepay_bank_account_number\"\n placeholder=\"Enter account number\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n <div class=\"tw-mt-3\">\n <cide-ele-input \n label=\"Transaction Reference\" \n formControlName=\"feepay_transaction_reference\"\n placeholder=\"Enter transaction reference\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n <!-- Discount Section -->\n <div class=\"tw-mt-4 tw-p-3 tw-bg-purple-50 tw-rounded tw-border tw-border-purple-200\">\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-purple-900 tw-mb-3\">Discount Information</h6>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3\">\n <cide-ele-input \n label=\"Discount (%)\" \n formControlName=\"feepay_discount_percentage\"\n type=\"number\"\n placeholder=\"0\"\n size=\"sm\"\n [min]=\"0\"\n [max]=\"100\">\n </cide-ele-input>\n\n <cide-ele-select \n label=\"Discount On\" \n formControlName=\"feepay_discount_on\"\n [options]=\"[{value: 'SUB_TOTAL', label: 'Sub Total'}, {value: 'FEE_HEAD', label: 'Fee Head'}, {value: 'TOTAL', label: 'Total'}, {value: 'INSTALLMENT', label: 'Installment'}]\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n <div class=\"tw-mt-3\">\n <cide-ele-textarea \n label=\"Discount Reason\" \n formControlName=\"feepay_discount_reason\"\n placeholder=\"Enter reason for discount...\"\n rows=\"2\"\n size=\"sm\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <!-- Payment Reference -->\n <div class=\"tw-mt-4\">\n <cide-ele-input \n label=\"Payment Reference\" \n formControlName=\"feepay_payment_reference\"\n placeholder=\"Enter payment reference number\"\n size=\"sm\"\n leadingIcon=\"receipt\">\n </cide-ele-input>\n </div>\n\n <!-- Remarks -->\n <div class=\"tw-mt-4\">\n <cide-ele-textarea \n label=\"Remarks\" \n formControlName=\"feepay_remarks\"\n placeholder=\"Enter any additional remarks...\"\n rows=\"2\" \n size=\"sm\">\n </cide-ele-textarea>\n </div>\n </div>\n }\n\n <!-- Payment Summary -->\n @if (selectedStudent() && selectedFeeItems().length > 0) {\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\">\n <h6 class=\"tw-text-base tw-font-semibold tw-text-green-900 tw-mb-3\">Payment Summary</h6>\n \n <div class=\"tw-space-y-3\">\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\n <span class=\"tw-text-gray-700\">Fee Amount:</span>\n <span class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(totalFeeAmount()) }}</span>\n </div>\n \n @if (totalLateFee() > 0) {\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\n <span class=\"tw-text-gray-700\">Late Fee Amount:</span>\n <span class=\"tw-font-semibold tw-text-red-600\">{{ formatCurrency(totalLateFee()) }}</span>\n </div>\n }\n \n @if (totalPenalty() > 0) {\n <div class=\"tw-flex tw-justify-between tw-items-center tw-py-2 tw-border-b tw-border-green-200\">\n <span class=\"tw-text-gray-700\">Penalty Amount:</span>\n <span class=\"tw-font-semibold tw-text-red-600\">{{ formatCurrency(totalPenalty()) }}</span>\n </div>\n }\n \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\">\n <span class=\"tw-text-lg tw-font-bold tw-text-green-900\">Total Payable:</span>\n <span class=\"tw-text-2xl tw-font-bold tw-text-green-700\">{{ formatCurrency(totalPayable()) }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Form Validation Errors -->\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-justify-end tw-gap-3 tw-mt-6\">\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() || paymentForm.invalid || selectedFeeItems().length === 0 || loading()\" \n [loading]=\"submitting()\" \n leftIcon=\"save\">\n {{ submitting() ? 'Processing...' : 'Record Payment' }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n</div>\n\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';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\n\n@Component({\n selector: 'cide-discount-rules',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n template: `\n <div class=\"discount-rules-container\">\n <div class=\"header\">\n <h1>Discount Rules Management</h1>\n <button class=\"btn btn-primary\" (click)=\"openRuleModal()\">Create New Rule</button>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab() === 'rules'\" (click)=\"activeTab.set('rules')\">Discount Rules</button>\n <button class=\"tab\" [class.active]=\"activeTab() === 'applied'\" (click)=\"activeTab.set('applied')\">Applied Discounts</button>\n <button class=\"tab\" [class.active]=\"activeTab() === 'scholarships'\" (click)=\"activeTab.set('scholarships')\">Scholarships</button>\n </div>\n\n <!-- Rules Tab -->\n @if (activeTab() === 'rules') {\n <div class=\"rules-section\">\n <div class=\"table-container\">\n <table>\n <thead>\n <tr>\n <th>Rule Name</th>\n <th>Rule Code</th>\n <th>Discount Type</th>\n <th>Discount Value</th>\n <th>Applies To</th>\n <th>Priority</th>\n <th>Auto Apply</th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (rule of discountRules(); track rule.id) {\n <tr>\n <td>{{ rule.name }}</td>\n <td>{{ rule.code }}</td>\n <td><span class=\"badge\">{{ rule.discount_type }}</span></td>\n <td class=\"discount-value\">{{ rule.discount_type === 'PERCENTAGE' ? rule.value + '%' : 'โ‚น' + rule.value }}</td>\n <td>{{ rule.applies_to }}</td>\n <td><span class=\"priority\">{{ rule.priority }}</span></td>\n <td><span class=\"status-badge\" [class.active]=\"rule.auto_apply\">{{ rule.auto_apply ? 'Yes' : 'No' }}</span></td>\n <td><span class=\"status-badge\" [class.active]=\"rule.status === 'ACTIVE'\">{{ rule.status }}</span></td>\n <td>\n <button class=\"btn-icon\" (click)=\"editRule(rule)\">โœ๏ธ</button>\n <button class=\"btn-icon\" (click)=\"toggleRuleStatus(rule)\">๐Ÿ”„</button>\n <button class=\"btn-icon\" (click)=\"deleteRule(rule)\">๐Ÿ—‘๏ธ</button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Rule Modal -->\n @if (showRuleModal()) {\n <div class=\"modal-overlay\" (click)=\"closeRuleModal()\">\n <div class=\"modal-content\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h2>{{ editingRule() ? 'Edit' : 'Create' }} Discount Rule</h2>\n <button class=\"close-btn\" (click)=\"closeRuleModal()\">ร—</button>\n </div>\n <form [formGroup]=\"ruleForm\" class=\"modal-body\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Rule Name</label>\n <input type=\"text\" formControlName=\"rule_name\" placeholder=\"e.g., Sibling Discount\" />\n </div>\n <div class=\"form-group\">\n <label>Rule Code</label>\n <input type=\"text\" formControlName=\"rule_code\" placeholder=\"e.g., SIBLING_DISC\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea formControlName=\"description\" rows=\"3\" placeholder=\"Describe the discount rule...\"></textarea>\n </div>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Discount Type</label>\n <select formControlName=\"discount_type\">\n <option value=\"PERCENTAGE\">Percentage</option>\n <option value=\"FIXED_AMOUNT\">Fixed Amount</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>Discount Value</label>\n <input type=\"number\" formControlName=\"discount_value\" placeholder=\"Enter value\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>Applies To Fee Categories</label>\n <select formControlName=\"applies_to\" multiple>\n <option value=\"ALL\">All Categories</option>\n <option value=\"TUITION\">Tuition</option>\n <option value=\"EXAM\">Exam Fees</option>\n <option value=\"LIBRARY\">Library</option>\n <option value=\"LAB\">Lab</option>\n <option value=\"SPORTS\">Sports</option>\n <option value=\"TRANSPORT\">Transport</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>Criteria (JSON Format)</label>\n <textarea formControlName=\"criteria_json\" rows=\"4\" placeholder='{\"sibling_count\": \">= 1\", \"staff_role\": \"TEACHER\"}'></textarea>\n <small>Define conditions for automatic discount application</small>\n </div>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Priority</label>\n <input type=\"number\" formControlName=\"priority\" placeholder=\"1\" />\n <small>Higher priority rules apply first</small>\n </div>\n <div class=\"form-group checkbox-group\">\n <label><input type=\"checkbox\" formControlName=\"auto_apply\" /> Auto Apply</label>\n <label><input type=\"checkbox\" formControlName=\"stackable\" /> Stackable with other discounts</label>\n </div>\n </div>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Valid From</label>\n <input type=\"date\" formControlName=\"valid_from\" />\n </div>\n <div class=\"form-group\">\n <label>Valid To</label>\n <input type=\"date\" formControlName=\"valid_to\" />\n </div>\n </div>\n </form>\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"closeRuleModal()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveRule()\" [disabled]=\"ruleForm.invalid\">Save Rule</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .discount-rules-container { padding: 20px; }\n .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }\n .btn { padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; }\n .btn-primary { background: #007bff; color: white; }\n .btn-secondary { background: #6c757d; color: white; }\n .tabs { display: flex; gap: 10px; margin-bottom: 20px; border-bottom: 2px solid #e0e0e0; }\n .tab { padding: 12px 24px; background: none; border: none; border-bottom: 3px solid transparent; cursor: pointer; font-weight: 500; }\n .tab.active { border-bottom-color: #007bff; color: #007bff; }\n .table-container { overflow-x: auto; background: white; border-radius: 8px; border: 1px solid #e0e0e0; }\n table { width: 100%; border-collapse: collapse; }\n thead { background: #f8f9fa; }\n th { padding: 12px; text-align: left; font-weight: 600; border-bottom: 2px solid #dee2e6; }\n td { padding: 12px; border-bottom: 1px solid #dee2e6; }\n .badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; background: #e3f2fd; color: #1976d2; }\n .discount-value { font-weight: 600; color: #28a745; }\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; }\n .status-badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; background: #f8d7da; color: #721c24; }\n .status-badge.active { background: #d4edda; color: #155724; }\n .btn-icon { background: none; border: none; cursor: pointer; font-size: 18px; padding: 4px; }\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; }\n .modal-content { background: white; border-radius: 8px; max-width: 800px; width: 90%; max-height: 90vh; overflow-y: auto; }\n .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 20px; border-bottom: 1px solid #e0e0e0; }\n .close-btn { background: none; border: none; font-size: 28px; cursor: pointer; color: #666; }\n .modal-body { padding: 20px; }\n .modal-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 20px; border-top: 1px solid #e0e0e0; }\n .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; }\n .form-group { margin-bottom: 15px; }\n .form-group label { display: block; margin-bottom: 5px; font-weight: 500; font-size: 14px; }\n .form-group input, .form-group select, .form-group textarea { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; }\n .form-group small { color: #666; font-size: 12px; }\n .checkbox-group { display: flex; flex-direction: column; gap: 8px; }\n .checkbox-group label { display: flex; align-items: center; gap: 8px; }\n `]\n})\nexport class DiscountRulesComponent implements OnInit {\n private fb = inject(FormBuilder);\n\n activeTab = signal<string>('rules');\n showRuleModal = signal<boolean>(false);\n editingRule = signal<any>(null);\n discountRules = signal<any[]>([]);\n\n ruleForm: FormGroup = this.fb.group({\n rule_name: ['', Validators.required],\n rule_code: ['', Validators.required],\n description: [''],\n discount_type: ['PERCENTAGE', Validators.required],\n discount_value: ['', [Validators.required, Validators.min(0)]],\n applies_to: [['ALL'], Validators.required],\n criteria_json: [''],\n priority: [1],\n auto_apply: [false],\n stackable: [false],\n valid_from: [''],\n valid_to: ['']\n });\n\n ngOnInit(): void {\n this.loadDiscountRules();\n }\n\n private loadDiscountRules(): void {\n // Mock data - replace with actual API call\n this.discountRules.set([\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' },\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' },\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' }\n ]);\n }\n\n openRuleModal(): void {\n this.editingRule.set(null);\n this.ruleForm.reset({ discount_type: 'PERCENTAGE', priority: 1, applies_to: ['ALL'] });\n this.showRuleModal.set(true);\n }\n\n closeRuleModal(): void {\n this.showRuleModal.set(false);\n }\n\n editRule(rule: any): void {\n this.editingRule.set(rule);\n this.ruleForm.patchValue(rule);\n this.showRuleModal.set(true);\n }\n\n saveRule(): void {\n if (this.ruleForm.valid) {\n console.log('Saving rule:', this.ruleForm.value);\n this.closeRuleModal();\n this.loadDiscountRules();\n }\n }\n\n toggleRuleStatus(rule: any): void {\n console.log('Toggle status:', rule);\n }\n\n deleteRule(rule: any): void {\n if (confirm('Are you sure you want to delete this rule?')) {\n console.log('Delete rule:', rule);\n }\n }\n}\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 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: '',\n name: '',\n class: '',\n section: '',\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 -->\n<div class=\"tw-w-full tw-h-full\">\n <div class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\">\n\n <!-- Header Section -->\n <div class=\"tw-table-row tw-w-full tw-h-0\">\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\">\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\">\n \n <!-- Title -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Online Fee Payment</h5>\n </div>\n\n <!-- Actions -->\n <div class=\"tw-flex tw-items-center tw-gap-3\">\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"cancel()\" leftIcon=\"arrow_back\">\n Back to Statement\n </button>\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-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\n \n <!-- Left Panel - Fee Selection -->\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\">\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\">Select Fees to Pay</h6>\n </div>\n \n <!-- Quick Actions -->\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\">\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"selectAll()\">\n Select All\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"selectOverdue()\">\n Select Overdue\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"clearSelection()\">\n Clear\n </button>\n </div>\n\n <!-- Fee Items List -->\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-space-y-3\">\n @if (outstandingFees().length === 0) {\n <div class=\"tw-text-center tw-py-8 tw-text-gray-500\">\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>\n <p class=\"tw-text-sm\">No outstanding fees</p>\n </div>\n } @else {\n @for (fee of outstandingFees(); track fee.id) {\n <div class=\"tw-p-3 tw-rounded-lg tw-border-2 tw-cursor-pointer tw-transition-colors\"\n [class.tw-border-blue-500]=\"isSelected(fee)\"\n [class.tw-bg-blue-50]=\"isSelected(fee)\"\n [class.tw-border-yellow-400]=\"!isSelected(fee) && isOverdue(fee)\"\n [class.tw-bg-yellow-50]=\"!isSelected(fee) && isOverdue(fee)\"\n [class.tw-border-gray-200]=\"!isSelected(fee) && !isOverdue(fee)\"\n (click)=\"toggleFee(fee)\">\n <div class=\"tw-flex tw-items-start tw-justify-between tw-gap-3\">\n <div class=\"tw-flex tw-items-start tw-gap-3 tw-flex-1\">\n <input \n type=\"checkbox\" \n [checked]=\"isSelected(fee)\"\n (change)=\"toggleFee(fee); $event.stopPropagation()\"\n class=\"tw-mt-1\">\n <div class=\"tw-flex-1\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-mb-1\">\n <span class=\"tw-font-medium tw-text-gray-900\">{{ fee.fee_head }}</span>\n @if (isOverdue(fee)) {\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\">\n Overdue\n </span>\n }\n </div>\n <div class=\"tw-text-xs tw-text-gray-600\">\n Due Date: {{ fee.due_date | date:'dd/MM/yyyy' }}\n </div>\n @if (fee.late_fee > 0) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n Late Fee: {{ formatCurrency(fee.late_fee) }}\n </div>\n }\n </div>\n </div>\n <div class=\"tw-text-right\">\n <div class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(fee.outstanding) }}</div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Right Panel - Payment Summary & Gateway -->\n <div class=\"tw-space-y-4\">\n \n <!-- Payment Summary Card -->\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 Summary</h6>\n </div>\n <div class=\"tw-p-4 tw-space-y-3\">\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-600\">Selected Items</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ selectedCount() }}</span>\n </div>\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-600\">Fee Amount</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(totalFeeAmount()) }}</span>\n </div>\n @if (totalLateFee() > 0) {\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-text-red-600\">\n <span>Late Fee</span>\n <span class=\"tw-font-medium\">{{ formatCurrency(totalLateFee()) }}</span>\n </div>\n }\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-font-semibold tw-pt-2 tw-border-t tw-border-gray-200\">\n <span>Subtotal</span>\n <span>{{ formatCurrency(subtotal()) }}</span>\n </div>\n @if (convenienceFee() > 0) {\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-600\">Convenience Fee (2%)</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(convenienceFee()) }}</span>\n </div>\n }\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\">\n <span>Total Payable</span>\n <span>{{ formatCurrency(totalPayable()) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Payment Method Selection -->\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\">Select Payment Method</h6>\n </div>\n <div class=\"tw-p-4\">\n <form [formGroup]=\"paymentForm\" class=\"tw-space-y-4\">\n \n <!-- Payment Method Cards -->\n <div class=\"tw-grid tw-grid-cols-3 tw-gap-3 tw-mb-4\">\n @for (method of paymentMethodOptions; track method.value) {\n <button\n type=\"button\"\n class=\"tw-p-4 tw-rounded-lg tw-border-2 tw-text-center tw-transition-colors\"\n [class.tw-border-blue-500]=\"selectedPaymentMethod() === method.value\"\n [class.tw-bg-blue-50]=\"selectedPaymentMethod() === method.value\"\n [class.tw-border-gray-200]=\"selectedPaymentMethod() !== method.value\"\n (click)=\"selectPaymentMethod(method.value)\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-mx-auto tw-mb-2\"\n [class.tw-text-blue-600]=\"selectedPaymentMethod() === method.value\"\n [class.tw-text-gray-400]=\"selectedPaymentMethod() !== method.value\">\n @switch (method.value) {\n @case ('UPI') { account_balance_wallet }\n @case ('CARD') { credit_card }\n @case ('NET_BANKING') { account_balance }\n }\n </cide-ele-icon>\n <div class=\"tw-text-xs tw-font-medium\">{{ method.label }}</div>\n </button>\n }\n </div>\n\n <!-- UPI Details -->\n @if (selectedPaymentMethod() === 'UPI') {\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200\">\n <cide-ele-input\n label=\"UPI ID\"\n formControlName=\"upi_id\"\n placeholder=\"username@upi\"\n size=\"sm\"\n [required]=\"true\">\n </cide-ele-input>\n </div>\n }\n\n <!-- Card Details -->\n @if (selectedPaymentMethod() === 'CARD') {\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200 tw-space-y-3\">\n <cide-ele-input\n label=\"Card Number\"\n formControlName=\"card_number\"\n placeholder=\"1234 5678 9012 3456\"\n size=\"sm\"\n maxLength=\"19\"\n [required]=\"true\">\n </cide-ele-input>\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\n <cide-ele-input\n label=\"Expiry Date\"\n formControlName=\"expiry\"\n placeholder=\"MM/YY\"\n size=\"sm\"\n maxLength=\"5\"\n [required]=\"true\">\n </cide-ele-input>\n <cide-ele-input\n label=\"CVV\"\n formControlName=\"cvv\"\n type=\"password\"\n placeholder=\"***\"\n size=\"sm\"\n maxLength=\"3\"\n [required]=\"true\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n <!-- Net Banking Details -->\n @if (selectedPaymentMethod() === 'NET_BANKING') {\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200\">\n <cide-ele-select\n label=\"Select Bank\"\n formControlName=\"bank\"\n [options]=\"bankOptions\"\n size=\"sm\"\n placeholder=\"Select Bank\"\n [required]=\"true\">\n </cide-ele-select>\n </div>\n }\n\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-gap-3 tw-pt-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"cancel()\" class=\"tw-flex-1\">\n Cancel\n </button>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"proceedToPayment()\"\n [disabled]=\"!canProceed() || submitting()\" [loading]=\"submitting()\" class=\"tw-flex-1\" leftIcon=\"payment\">\n Pay {{ formatCurrency(totalPayable()) }}\n </button>\n </div>\n\n <!-- Security Info -->\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-2 tw-pt-2 tw-text-xs tw-text-gray-500\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">lock</cide-ele-icon>\n <span>Secure payment powered by Razorpay</span>\n </div>\n </form>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\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/shared/components/fee-discount-form/fee-discount-form.component.ts","../../../projects/cloud-ide-fees/src/lib/shared/components/fee-scholarship-form/fee-scholarship-form.component.ts","../../../projects/cloud-ide-fees/src/lib/shared/components/fee-details-viewer/fee-details-viewer.component.ts","../../../projects/cloud-ide-fees/src/lib/shared/components/fee-applicable-fees/fee-applicable-fees.component.ts","../../../projects/cloud-ide-fees/src/lib/shared/components/fee-applicable-fees/fee-applicable-fees.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/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') || this.rightsService.hasRight('UPDATE'));\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\n // Diagnostic logging for rights\n setTimeout(() => {\n console.log('๐Ÿ” Debug: Current Page Code:', this.rightsService.getCurrentPageCode());\n console.log('๐Ÿ” Debug: All loaded rights for fee_structure:', this.rightsService.getRights());\n console.log('๐Ÿ” Debug: canEdit evaluation:', this.canEdit());\n }, 1000);\n\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 fees_entity_id_syen: this.appState.activeEntity()?._id || \"\",\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, 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 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 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 entityLoading = 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: [this.appStateService.activeAcademicYear()?._id || ''],\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\n // Diagnostic logging for rights\n setTimeout(() => {\n console.log('๐Ÿ’ฐ Fee Structure Create Component initialized');\n console.log('๐Ÿ” Debug: Current Page Code:', this.rightsService.getCurrentPageCode());\n console.log('๐Ÿ” Debug: All loaded rights for fee_structure:', this.rightsService.getRights());\n const hasEditAccess = this.rightsService.hasRight('EDIT') || this.rightsService.hasRight('UPDATE');\n console.log('๐Ÿ” Debug: Edit/Update access evaluation:', hasEditAccess);\n }, 1000);\n\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 // academicYearLoading.set(true); removed as we use appState\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 isEdit = this.isEditMode();\n const hasPermission = isEdit\n ? (this.rightsService.hasRight('EDIT') || this.rightsService.hasRight('UPDATE'))\n : this.rightsService.hasRight('CREATE');\n\n if (!hasPermission) {\n this.notificationService.error(`You do not have permission to ${isEdit ? '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 // Navigate to listing page on success\n this.componentContextService.close(['/control-panel/structure']);\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 name from app state\n */\n getAcademicYearName(): string {\n const activeYear = this.appStateService.activeAcademicYear();\n return activeYear?.acayr_name || activeYear?.acayr_code || '-';\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 - Always on one row -->\n <div class=\"tw-grid\" style=\"grid-template-columns: 170px 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 <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 </div>\n\n <div>\n <cide-ele-textarea label=\"Description\" formControlName=\"fees_structure_description\"\n placeholder=\"Enter detailed description of the fee structure...\" 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 [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\" [disabled]=\"isViewMode()\"\n [showLabels]=\"true\" [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 label=\"Reservation Category\" formControlName=\"fees_student_category_id_sygms\"\n [options]=\"studentCategories()\" [loading]=\"studentCategoriesLoading()\"\n placeholder=\"Select reservation category\" size=\"sm\">\n </cide-ele-select>\n </div>\n\n <div\n 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\" (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\n 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\" (click)=\"moveItemUp(itemIndex)\"\n 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) { <button cideEleButton type=\"button\" variant=\"ghost\"\n size=\"xs\" (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)\" [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 label=\"Category\" formControlName=\"feesi_category_id_sygms\"\n [options]=\"feeCategoriesOptions()\" [loading]=\"feeCategoriesLoading()\" size=\"sm\"\n placeholder=\"Select Fee Category\">\n </cide-ele-select>\n\n <cide-ele-input label=\"Item Code\" formControlName=\"feesi_item_code\" size=\"sm\"\n placeholder=\"Auto-filled from category\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Item Name\" formControlName=\"feesi_item_name\" 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 label=\"Description\" formControlName=\"feesi_description\" rows=\"1\" 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\" type=\"number\" 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 label=\"Minimum Amount\" formControlName=\"feesi_min_amount\" type=\"number\"\n size=\"sm\" placeholder=\"No minimum\"\n title=\"Minimum amount allowed when editing (leave empty for no minimum)\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Maximum Amount\" formControlName=\"feesi_max_amount\" type=\"number\"\n size=\"sm\" 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 label=\"Installment Count\" formControlName=\"feesi_installment_count\" 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 label=\"Tax Percentage\" formControlName=\"feesi_tax_percentage\" 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\n = $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 label=\"Distribution Type\" formControlName=\"distribution_type\"\n [options]=\"distributionTypeOptions\" size=\"sm\">\n </cide-ele-select>\n\n @if (installment.get('distribution_type')?.value === 'PERCENTAGE') {\n <cide-ele-input label=\"Percentage (%)\" formControlName=\"percentage\" type=\"number\" 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) *\n (installment.get('percentage')?.value || 0) / 100) }}\n </div>\n @if (installmentIndex === getInstallmentsArray(itemIndex).length - 1 && installmentIndex >\n 0) {\n <div class=\"tw-text-xs tw-font-semibold\"\n [class.tw-text-green-600]=\"(getPreviousInstallmentsPercentage(itemIndex, installmentIndex) + (installment.get('percentage')?.value || 0)) === 100\"\n [class.tw-text-red-600]=\"(getPreviousInstallmentsPercentage(itemIndex, installmentIndex) + (installment.get('percentage')?.value || 0)) !== 100\">\n Total: {{ getPreviousInstallmentsPercentage(itemIndex, installmentIndex) +\n (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 label=\"Fixed Amount\" formControlName=\"fixed_amount\" type=\"number\" 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 label=\"Due Date Offset (Days from Assignment)\"\n formControlName=\"due_date_offset_days\" type=\"number\" size=\"sm\"\n title=\"Days from assignment date\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Due Date (Fixed Date - Alternative)\" formControlName=\"due_date\"\n type=\"date\" size=\"sm\" 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 label=\"Start Offset (Days from Assignment)\"\n formControlName=\"collection_start_offset_days\" type=\"number\" size=\"sm\"\n title=\"Days from assignment date when collection can start\">\n </cide-ele-input>\n\n <cide-ele-input label=\"End Offset (Days from Assignment)\"\n formControlName=\"collection_end_offset_days\" type=\"number\" 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 label=\"Start Date (Fixed Date - Alternative)\"\n formControlName=\"collection_start_date\" type=\"date\" size=\"sm\"\n title=\"Use fixed date instead of offset\">\n </cide-ele-input>\n\n <cide-ele-input label=\"End Date (Fixed Date - Alternative)\"\n formControlName=\"collection_end_date\" type=\"date\" 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\n 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.\n </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\n continue.\n </p>\n </div>\n }\n\n <button cideEleButton type=\"submit\" variant=\"primary\" size=\"sm\"\n [disabled]=\"submitting() || loading() || !isInstallmentPercentagesValid()\" [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>","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)\nexport interface FeeAssignment {\n _id?: string;\n feeas_student_id_auth?: 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?: any;\n feeas_class_program_id_acacpm?: any;\n feeas_section_id_acapts?: any;\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_total_amount?: number; // Backend alias\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_outstanding_amount?: number; // Backend alias\n feeas_late_fee_applied?: number;\n feeas_remarks?: string;\n feeas_isactive?: 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\nexport interface FeeAssignmentListPayload extends MFeeStructure {\n feeas_id?: string;\n feeas_student_id_auth?: string;\n feeas_fee_structure_id_feest?: string; // Updated to match schema\n feeas_status?: string;\n}\n\nexport interface FeeAssignmentInsertUpdatePayload {\n _id?: string;\n feeas_student_id_auth?: 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_isactive?: boolean;\n}\n\nexport interface FeeAssignmentControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment[];\n total?: number;\n message?: string;\n}\n\nexport interface FeeAssignmentByIdControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment;\n message?: string;\n}\n\nexport interface FeeAssignmentInsertUpdateControllerResponse {\n success: boolean;\n code: number;\n data: FeeAssignment;\n message?: string;\n}\n\nexport interface FeeAssignmentDeletePayload {\n feeas_id: string;\n}\n\nexport interface 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, AppStateService } from 'cloud-ide-layout';\nimport { ACADEMIC_YEAR_SERVICE_TOKEN, type IAcademicYearService, CLASS_PROGRAM_MASTER_SERVICE_TOKEN, type IClassProgramMasterService, PROGRAM_TERM_SECTION_SERVICE_TOKEN, type IProgramTermSectionService } from 'cloud-ide-shared';\nimport { CideFeeFeeAssignmentService } from '../../services/fee-assignment.service';\n\n// Types\ninterface FeeAssignmentData {\n _id?: string;\n feeas_student_id_auth?: 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_discount?: 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 programTermSectionService = inject<IProgramTermSectionService>(PROGRAM_TERM_SECTION_SERVICE_TOKEN);\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\n private readonly rightsService = inject(RightsService);\n private readonly appStateService = inject(AppStateService);\n\n readonly studentDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('studentDetailsRendererTemplate');\n readonly amountRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('amountRendererTemplate');\n readonly dateRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('dateRendererTemplate');\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 {\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: 'custom',\n width: '120px',\n truncate: false,\n align: 'left',\n renderer: 'dateRenderer',\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 const entityId = this.appStateService.getActiveEntityValue()?._id;\n\n // Load academic years\n this.academicYearService.getAcademicYearList({\n pageIndex: 1,\n pageSize: 100,\n pagination: false,\n // Assuming academic year service might accept entity filter if updated, but keeping standard for now\n // If backend supports filtering ACAYR by entity, add it here.\n }).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 with Entity Context\n const classPayload: any = { pagination: false };\n if (entityId) {\n classPayload.acacpm_entity_id_syen = entityId;\n }\n\n this.classProgramService.searchClassProgramMasters(classPayload).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 entityId = this.appStateService.getActiveEntityValue()?._id;\n\n const payload: any = {\n pagination: true,\n pageIndex: this.currentPage(),\n pageSize: this.pageSize(),\n query: this.searchQuery() || '',\n feeas_payment_status: this.selectedStatusFilter() || undefined,\n feeas_academic_year_id_acayr: this.selectedAcademicYearFilter() || undefined,\n feeas_class_program_id_acacpm: this.selectedClassFilter() || undefined,\n feeas_section_id_acapts: this.selectedSectionFilter() || undefined,\n feeas_entity_id_syen: entityId || 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_auth: item.feeas_student_id_auth,\n student_name: item.student_name ||\n (item.feeas_admission_id_admap ?\n [item.feeas_admission_id_admap.admap_first_name, item.feeas_admission_id_admap.admap_middle_name, item.feeas_admission_id_admap.admap_last_name]\n .filter(n => !!n).join(' ') : null) ||\n item.feeas_student_id_auth?.name ||\n 'N/A',\n student_id: (typeof item.feeas_student_id_auth === 'string' ? item.feeas_student_id_auth : item.feeas_student_id_auth?._id) || '',\n class: this.formatClassDetails(item),\n section: item.section || item.feeas_section_id_acapts?.acapts_name || 'N/A',\n fee_structure_name: item.fee_structure_name || item.feeas_fee_structure_id_feest?.fees_structure_name || item.feeas_fee_name || 'N/A',\n feeas_amount_original: item.feeas_original_amount || item.feeas_total_amount || 0,\n feeas_amount_discount: item.feeas_discount_amount || 0,\n feeas_amount_paid: item.feeas_paid_amount || 0,\n feeas_amount_remaining: item.feeas_outstanding_amount !== undefined ? item.feeas_outstanding_amount : ((item.feeas_total_amount || 0) - (item.feeas_paid_amount || 0)),\n feeas_due_date: item.feeas_due_date ? new Date(item.feeas_due_date) : undefined,\n feeas_status: item.feeas_status || item.feeas_payment_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 dateRenderer: this.dateRendererTemplate(),\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 // Load sections when class filter changes\n this.selectedSectionFilter.set(''); // Reset section filter\n this.loadSections();\n }\n\n loadSections(): void {\n const classProgramId = this.selectedClassFilter();\n const entityId = this.appStateService.getActiveEntityValue()?._id;\n\n if (!classProgramId) {\n this.sectionOptions.set([]);\n return;\n }\n\n const payload: any = {\n pagination: false,\n acapts_program_id_acacpm: classProgramId,\n acapts_is_active: true\n };\n\n if (entityId) {\n payload.acapts_entity_id_syen = entityId;\n }\n\n this.programTermSectionService.getProgramTermSectionList(payload).subscribe({\n next: (response) => {\n if (response?.success && response.data) {\n this.sectionOptions.set(response.data.map(sec => ({\n value: sec._id || '',\n label: sec.acapts_name || ''\n })));\n } else {\n this.sectionOptions.set([]);\n }\n },\n error: (err) => {\n console.error('Error loading sections:', err);\n this.sectionOptions.set([]);\n }\n });\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 private formatClassDetails(item: any): string {\n if (item.feeas_admission_id_admap) {\n const admission = item.feeas_admission_id_admap;\n const program = admission.admap_class_program_id_acacpm?.acacpm_alise_title || '';\n const term = admission.admap_class_program_term_id_acapt?.acapt_name || '';\n const branch = admission.admap_class_program_branch_id_acabrn?.acabrn_name || '';\n\n let details = program;\n if (term) details += ` (${term})`;\n if (branch) details += ` - ${branch}`;\n\n if (details) return details;\n }\n\n // Fallback\n return item.class || item.feeas_class_program_id_acacpm?.acacpm_alise_title || 'N/A';\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 class=\"tw-flex tw-items-center tw-gap-2\">\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 label=\"Academic Year\" [options]=\"academicYearOptions()\"\n [ngModel]=\"selectedAcademicYearFilter()\" (ngModelChange)=\"onAcademicYearFilterChange($event)\" size=\"sm\"\n placeholder=\"All Academic Years\">\n </cide-ele-select>\n\n <cide-ele-select label=\"Class/Program\" [options]=\"classOptions()\" [ngModel]=\"selectedClassFilter()\"\n (ngModelChange)=\"onClassFilterChange($event)\" size=\"sm\" placeholder=\"All Classes\">\n </cide-ele-select>\n\n <cide-ele-select label=\"Section\" [options]=\"sectionOptions()\" [ngModel]=\"selectedSectionFilter()\"\n (ngModelChange)=\"onSectionFilterChange($event)\" size=\"sm\" placeholder=\"All Sections\">\n </cide-ele-select>\n\n <cide-ele-select label=\"Status\" [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 ]\" [ngModel]=\"selectedStatusFilter()\" (ngModelChange)=\"onStatusFilterChange($event)\" 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-flex tw-items-center tw-gap-2\">\n <span class=\"tw-font-medium tw-text-gray-900\">{{ row.student_name || 'N/A' }}</span>\n @if (row.student_id) {\n <span class=\"tw-px-1.5 tw-py-0.5 tw-rounded tw-bg-gray-100 tw-text-gray-600 tw-text-[10px] tw-font-medium\">\n {{ row.student_id }}\n </span>\n }\n </div>\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-mt-0.5\">\n @if (row.class || row.section) {\n {{ row.class || '' }} {{ row.section !== 'N/A' && row.section ? '/ ' + row.section : '' }}\n } @else {\n -\n }\n </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 @if (row.feeas_amount_discount > 0) {\n <div class=\"tw-text-xs tw-text-blue-600\">\n Discount: {{ formatCurrency(row.feeas_amount_discount) }}\n </div>\n }\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\"\n [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 #dateRendererTemplate let-row=\"row\">\n <div class=\"tw-text-sm tw-text-gray-900\">{{ formatDate(row.feeas_due_date) }}</div>\n</ng-template>\n\n<ng-template #statusRendererTemplate let-row=\"row\">\n <span\n 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 [items]=\"getActionDropdownItems(row)\" [config]=\"getDropdownConfig()\"\n (itemClick)=\"onDropdownItemClick($event, row)\">\n </cide-ele-dropdown>\n</ng-template>","\r\nimport { Component, inject, signal, computed, input, output, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { CideInputComponent, CideSelectComponent, CideTextareaComponent, CideEleButtonComponent, CurrencyPipe } from 'cloud-ide-element';\r\n\r\nexport interface FeeDiscountFormData {\r\n discount_type: 'PERCENTAGE' | 'FIXED_AMOUNT';\r\n discount_value: number;\r\n discount_reason_id?: string;\r\n discount_reason_title?: string;\r\n valid_from?: Date;\r\n valid_to?: Date;\r\n notes?: string;\r\n}\r\n\r\nexport interface FeeDiscountFormInputs {\r\n feeId: string;\r\n feeName: string;\r\n feeAmount: number;\r\n existingDiscount?: FeeDiscountFormData | null;\r\n discountReasonOptions: Array<{ value: string; label: string }>;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-fee-discount-form',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n CideInputComponent,\r\n CideSelectComponent,\r\n CideTextareaComponent,\r\n CideEleButtonComponent,\r\n CurrencyPipe\r\n ],\r\n template: `\r\n <div class=\"tw-p-4 tw-space-y-4\">\r\n <div class=\"tw-mb-4\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900\">\r\n {{ existingDiscount() ? 'Edit Discount' : 'Add Discount' }}\r\n </h3>\r\n <p class=\"tw-text-sm tw-text-gray-600 tw-mt-1\">{{ feeName() }}</p>\r\n </div>\r\n\r\n <form [formGroup]=\"discountForm\" class=\"tw-space-y-4\">\r\n <!-- Discount Type -->\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Discount Type *\r\n </label>\r\n <cide-ele-select\r\n formControlName=\"discount_type\"\r\n [options]=\"[{value: 'PERCENTAGE', label: 'Percentage'}, {value: 'FIXED_AMOUNT', label: 'Fixed Amount'}]\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <!-- Discount Value -->\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Discount Value *\r\n @if (discountForm.get('discount_type')?.value === 'PERCENTAGE') {\r\n <span class=\"tw-text-gray-500\">(%)</span>\r\n } @else {\r\n <span class=\"tw-text-gray-500\">(Amount)</span>\r\n }\r\n </label>\r\n <cide-ele-input\r\n type=\"number\"\r\n formControlName=\"discount_value\"\r\n [min]=\"0\"\r\n [max]=\"maxDiscountValue()\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <!-- Discount Reason -->\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Discount Reason\r\n </label>\r\n <cide-ele-select\r\n formControlName=\"discount_reason_id\"\r\n [options]=\"discountReasonOptions()\"\r\n placeholder=\"Select reason\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <!-- Valid From / Valid To -->\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Valid From\r\n </label>\r\n <cide-ele-input\r\n type=\"date\"\r\n formControlName=\"valid_from\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Valid To\r\n </label>\r\n <cide-ele-input\r\n type=\"date\"\r\n formControlName=\"valid_to\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n\r\n <!-- Notes -->\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Notes\r\n </label>\r\n <cide-ele-textarea\r\n formControlName=\"notes\"\r\n rows=\"2\"\r\n size=\"sm\">\r\n </cide-ele-textarea>\r\n </div>\r\n\r\n <!-- Calculated Discount Preview -->\r\n @if (calculatedDiscountAmount() > 0) {\r\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded tw-border tw-border-blue-200\">\r\n <p class=\"tw-text-sm tw-text-gray-700\">\r\n <span class=\"tw-font-medium\">Calculated Discount:</span>\r\n <span class=\"tw-ml-2 tw-font-semibold tw-text-blue-600\">\r\n {{ calculatedDiscountAmount() | currency }}\r\n </span>\r\n </p>\r\n </div>\r\n }\r\n </form>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-justify-end tw-gap-2 tw-pt-4 tw-border-t tw-border-gray-200\">\r\n <button\r\n type=\"button\"\r\n cideEleButton\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n (click)=\"onCancel()\">\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n cideEleButton\r\n variant=\"primary\"\r\n size=\"sm\"\r\n [disabled]=\"!discountForm.valid\"\r\n (click)=\"onSave()\">\r\n {{ existingDiscount() ? 'Update Discount' : 'Save Discount' }}\r\n </button>\r\n </div>\r\n </div>\r\n `\r\n})\r\nexport class FeeDiscountFormComponent {\r\n // Inputs\r\n readonly feeId = input.required<string>();\r\n readonly feeName = input.required<string>();\r\n readonly feeAmount = input.required<number>();\r\n readonly existingDiscount = input<FeeDiscountFormData | null>(null);\r\n readonly discountReasonOptions = input.required<Array<{ value: string; label: string }>>();\r\n\r\n // Outputs\r\n readonly saved = output<FeeDiscountFormData>();\r\n readonly cancelled = output<void>();\r\n\r\n // Form using signals (modern Angular approach)\r\n discountForm = new FormGroup({\r\n discount_type: new FormControl<'PERCENTAGE' | 'FIXED_AMOUNT'>('FIXED_AMOUNT', [Validators.required]),\r\n discount_value: new FormControl<number>(0, [Validators.required, Validators.min(0)]),\r\n discount_reason_id: new FormControl<string>(''),\r\n valid_from: new FormControl<string>(''),\r\n valid_to: new FormControl<string>(''),\r\n notes: new FormControl<string>('')\r\n });\r\n\r\n // Computed values\r\n readonly maxDiscountValue = computed(() => {\r\n const type = this.discountForm.get('discount_type')?.value;\r\n return type === 'PERCENTAGE' ? 100 : this.feeAmount();\r\n });\r\n\r\n readonly calculatedDiscountAmount = computed(() => {\r\n const type = this.discountForm.get('discount_type')?.value;\r\n const value = this.discountForm.get('discount_value')?.value || 0;\r\n\r\n if (!type || value <= 0) return 0;\r\n\r\n if (type === 'PERCENTAGE') {\r\n return (this.feeAmount() * value) / 100;\r\n } else {\r\n return Math.min(value, this.feeAmount());\r\n }\r\n });\r\n\r\n constructor() {\r\n // Initialize form with existing discount data\r\n effect(() => {\r\n const existing = this.existingDiscount();\r\n if (existing) {\r\n this.discountForm.patchValue({\r\n discount_type: existing.discount_type,\r\n discount_value: existing.discount_value,\r\n discount_reason_id: existing.discount_reason_id || '',\r\n valid_from: this.formatDateForInput(existing.valid_from),\r\n valid_to: this.formatDateForInput(existing.valid_to),\r\n notes: existing.notes || ''\r\n }, { emitEvent: false });\r\n } else {\r\n // Set default valid_from to today\r\n this.discountForm.patchValue({\r\n valid_from: this.getTodayDateString()\r\n }, { emitEvent: false });\r\n }\r\n });\r\n\r\n // Update max value when discount type changes\r\n effect(() => {\r\n const type = this.discountForm.get('discount_type')?.value;\r\n const control = this.discountForm.get('discount_value');\r\n if (control && type) {\r\n const max = type === 'PERCENTAGE' ? 100 : this.feeAmount();\r\n control.setValidators([\r\n Validators.required,\r\n Validators.min(0),\r\n Validators.max(max)\r\n ]);\r\n control.updateValueAndValidity();\r\n }\r\n });\r\n }\r\n\r\n onSave(): void {\r\n if (!this.discountForm.valid) return;\r\n\r\n const formValue = this.discountForm.value;\r\n const discountData: FeeDiscountFormData = {\r\n discount_type: formValue.discount_type!,\r\n discount_value: formValue.discount_value || 0,\r\n discount_reason_id: formValue.discount_reason_id || undefined,\r\n discount_reason_title: this.getDiscountReasonTitle(formValue.discount_reason_id || ''),\r\n valid_from: formValue.valid_from ? new Date(formValue.valid_from) : undefined,\r\n valid_to: formValue.valid_to ? new Date(formValue.valid_to) : undefined,\r\n notes: formValue.notes || undefined\r\n };\r\n\r\n this.saved.emit(discountData);\r\n }\r\n\r\n onCancel(): void {\r\n this.cancelled.emit();\r\n }\r\n\r\n private formatDateForInput(date?: Date): string {\r\n if (!date) return '';\r\n const d = new Date(date);\r\n return d.toISOString().split('T')[0];\r\n }\r\n\r\n private getTodayDateString(): string {\r\n return new Date().toISOString().split('T')[0];\r\n }\r\n\r\n private getDiscountReasonTitle(reasonId: string): string | undefined {\r\n if (!reasonId) return undefined;\r\n const reason = this.discountReasonOptions().find(r => r.value === reasonId);\r\n return reason?.label;\r\n }\r\n}\r\n","\r\nimport { Component, inject, signal, computed, input, output, effect } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { CideInputComponent, CideSelectComponent, CideTextareaComponent, CideEleButtonComponent, CurrencyPipe } from 'cloud-ide-element';\r\n\r\nexport interface FeeScholarshipFormData {\r\n scholarship_type_id?: string;\r\n scholarship_type_title?: string;\r\n scholarship_category: 'FULL' | 'PARTIAL';\r\n scholarship_percentage?: number;\r\n scholarship_amount: number;\r\n valid_from?: Date;\r\n valid_to?: Date;\r\n notes?: string;\r\n}\r\n\r\nexport interface FeeScholarshipFormInputs {\r\n feeId: string;\r\n feeName: string;\r\n feeAmount: number;\r\n existingScholarship?: FeeScholarshipFormData | null;\r\n scholarshipTypeOptions: Array<{ value: string; label: string }>;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-fee-scholarship-form',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n CideInputComponent,\r\n CideSelectComponent,\r\n CideTextareaComponent,\r\n CideEleButtonComponent,\r\n CurrencyPipe\r\n ],\r\n template: `\r\n <div class=\"tw-p-4 tw-space-y-4\">\r\n <div class=\"tw-mb-4\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900\">\r\n {{ existingScholarship() ? 'Edit Scholarship' : 'Add Scholarship' }}\r\n </h3>\r\n <p class=\"tw-text-sm tw-text-gray-600 tw-mt-1\">{{ feeName() }}</p>\r\n </div>\r\n\r\n <form [formGroup]=\"scholarshipForm\" class=\"tw-space-y-4\">\r\n <!-- Scholarship Type -->\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Scholarship Type\r\n </label>\r\n <cide-ele-select\r\n formControlName=\"scholarship_type_id\"\r\n [options]=\"scholarshipTypeOptions()\"\r\n placeholder=\"Select type\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <!-- Scholarship Category -->\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Scholarship Category *\r\n </label>\r\n <cide-ele-select\r\n formControlName=\"scholarship_category\"\r\n [options]=\"[{value: 'FULL', label: 'Full Scholarship'}, {value: 'PARTIAL', label: 'Partial Scholarship'}]\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <!-- Percentage or Amount (for PARTIAL) -->\r\n @if (scholarshipForm.get('scholarship_category')?.value === 'PARTIAL') {\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Percentage or Amount\r\n </label>\r\n <div class=\"tw-flex tw-gap-2 tw-items-center\">\r\n <cide-ele-input\r\n type=\"number\"\r\n formControlName=\"scholarship_percentage\"\r\n placeholder=\"Percentage\"\r\n [min]=\"0\"\r\n [max]=\"100\"\r\n size=\"sm\"\r\n class=\"tw-flex-1\">\r\n </cide-ele-input>\r\n <span class=\"tw-text-gray-500 tw-text-sm\">OR</span>\r\n <cide-ele-input\r\n type=\"number\"\r\n formControlName=\"scholarship_amount\"\r\n placeholder=\"Amount\"\r\n [min]=\"0\"\r\n [max]=\"feeAmount()\"\r\n size=\"sm\"\r\n class=\"tw-flex-1\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"tw-p-3 tw-bg-gray-50 tw-rounded tw-border tw-border-gray-200\">\r\n <p class=\"tw-text-xs tw-text-gray-600\">\r\n Full scholarship covers 100% of fees\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Valid From / Valid To -->\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Valid From\r\n </label>\r\n <cide-ele-input\r\n type=\"date\"\r\n formControlName=\"valid_from\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Valid To\r\n </label>\r\n <cide-ele-input\r\n type=\"date\"\r\n formControlName=\"valid_to\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n\r\n <!-- Notes -->\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-1\">\r\n Notes\r\n </label>\r\n <cide-ele-textarea\r\n formControlName=\"notes\"\r\n rows=\"2\"\r\n size=\"sm\">\r\n </cide-ele-textarea>\r\n </div>\r\n\r\n <!-- Calculated Scholarship Amount Preview -->\r\n @if (calculatedScholarshipAmount() > 0) {\r\n <div class=\"tw-p-3 tw-bg-purple-50 tw-rounded tw-border tw-border-purple-200\">\r\n <p class=\"tw-text-sm tw-text-gray-700\">\r\n <span class=\"tw-font-medium\">Scholarship Amount:</span>\r\n <span class=\"tw-ml-2 tw-font-semibold tw-text-purple-600\">\r\n {{ calculatedScholarshipAmount() | currency }}\r\n </span>\r\n </p>\r\n </div>\r\n }\r\n </form>\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-justify-end tw-gap-2 tw-pt-4 tw-border-t tw-border-gray-200\">\r\n <button\r\n type=\"button\"\r\n cideEleButton\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n (click)=\"onCancel()\">\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n cideEleButton\r\n variant=\"primary\"\r\n size=\"sm\"\r\n [disabled]=\"!scholarshipForm.valid\"\r\n (click)=\"onSave()\">\r\n {{ existingScholarship() ? 'Update Scholarship' : 'Save Scholarship' }}\r\n </button>\r\n </div>\r\n </div>\r\n `\r\n})\r\nexport class FeeScholarshipFormComponent {\r\n // Inputs\r\n readonly feeId = input.required<string>();\r\n readonly feeName = input.required<string>();\r\n readonly feeAmount = input.required<number>();\r\n readonly existingScholarship = input<FeeScholarshipFormData | null>(null);\r\n readonly scholarshipTypeOptions = input.required<Array<{ value: string; label: string }>>();\r\n\r\n // Outputs\r\n readonly saved = output<FeeScholarshipFormData>();\r\n readonly cancelled = output<void>();\r\n\r\n // Form using signals (modern Angular approach)\r\n scholarshipForm = new FormGroup({\r\n scholarship_type_id: new FormControl<string>(''),\r\n scholarship_category: new FormControl<'FULL' | 'PARTIAL'>('PARTIAL', [Validators.required]),\r\n scholarship_percentage: new FormControl<number | null>(null, [Validators.min(0), Validators.max(100)]),\r\n scholarship_amount: new FormControl<number>(0, [Validators.min(0)]),\r\n valid_from: new FormControl<string>(''),\r\n valid_to: new FormControl<string>(''),\r\n notes: new FormControl<string>('')\r\n });\r\n\r\n // Computed values\r\n readonly calculatedScholarshipAmount = computed(() => {\r\n const category = this.scholarshipForm.get('scholarship_category')?.value;\r\n const percentage = this.scholarshipForm.get('scholarship_percentage')?.value;\r\n const amount = this.scholarshipForm.get('scholarship_amount')?.value || 0;\r\n\r\n if (category === 'FULL') {\r\n return this.feeAmount();\r\n } else if (category === 'PARTIAL') {\r\n if (percentage && percentage > 0) {\r\n return (this.feeAmount() * percentage) / 100;\r\n } else if (amount > 0) {\r\n return Math.min(amount, this.feeAmount());\r\n }\r\n }\r\n return 0;\r\n });\r\n\r\n constructor() {\r\n // Initialize form with existing scholarship data\r\n effect(() => {\r\n const existing = this.existingScholarship();\r\n if (existing) {\r\n this.scholarshipForm.patchValue({\r\n scholarship_type_id: existing.scholarship_type_id || '',\r\n scholarship_category: existing.scholarship_category,\r\n scholarship_percentage: existing.scholarship_percentage || null,\r\n scholarship_amount: existing.scholarship_amount || 0,\r\n valid_from: this.formatDateForInput(existing.valid_from),\r\n valid_to: this.formatDateForInput(existing.valid_to),\r\n notes: existing.notes || ''\r\n }, { emitEvent: false });\r\n }\r\n });\r\n\r\n // Update validators when category changes\r\n effect(() => {\r\n const category = this.scholarshipForm.get('scholarship_category')?.value;\r\n const percentageControl = this.scholarshipForm.get('scholarship_percentage');\r\n const amountControl = this.scholarshipForm.get('scholarship_amount');\r\n\r\n if (category === 'PARTIAL') {\r\n // At least one of percentage or amount should be provided\r\n percentageControl?.setValidators([Validators.min(0), Validators.max(100)]);\r\n amountControl?.setValidators([Validators.min(0), Validators.max(this.feeAmount())]);\r\n } else {\r\n percentageControl?.clearValidators();\r\n amountControl?.clearValidators();\r\n }\r\n percentageControl?.updateValueAndValidity();\r\n amountControl?.updateValueAndValidity();\r\n });\r\n }\r\n\r\n onSave(): void {\r\n if (!this.scholarshipForm.valid) return;\r\n\r\n const formValue = this.scholarshipForm.value;\r\n const category = formValue.scholarship_category!;\r\n\r\n const scholarshipData: FeeScholarshipFormData = {\r\n scholarship_type_id: formValue.scholarship_type_id || undefined,\r\n scholarship_type_title: this.getScholarshipTypeTitle(formValue.scholarship_type_id || ''),\r\n scholarship_category: category,\r\n scholarship_percentage: category === 'PARTIAL' ? (formValue.scholarship_percentage || undefined) : undefined,\r\n scholarship_amount: category === 'FULL'\r\n ? this.feeAmount()\r\n : (category === 'PARTIAL' ? (formValue.scholarship_amount || 0) : 0),\r\n valid_from: formValue.valid_from ? new Date(formValue.valid_from) : undefined,\r\n valid_to: formValue.valid_to ? new Date(formValue.valid_to) : undefined,\r\n notes: formValue.notes || undefined\r\n };\r\n\r\n this.saved.emit(scholarshipData);\r\n }\r\n\r\n onCancel(): void {\r\n this.cancelled.emit();\r\n }\r\n\r\n private formatDateForInput(date?: Date): string {\r\n if (!date) return '';\r\n const d = new Date(date);\r\n return d.toISOString().split('T')[0];\r\n }\r\n\r\n private getScholarshipTypeTitle(typeId: string): string | undefined {\r\n if (!typeId) return undefined;\r\n const type = this.scholarshipTypeOptions().find(t => t.value === typeId);\r\n return type?.label;\r\n }\r\n}\r\n","import { Component, Input, output, signal, computed, inject, OnInit, OnDestroy, DestroyRef, effect } 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// Partial interfaces to avoid 'any'\nexport interface PartialFeeStructureItem {\n feesi_item_name?: string;\n feesi_item_code?: string;\n feesi_description?: string;\n feesi_amount?: number;\n feesi_category_id_sygms?: { sygms_title?: string; sygms_name?: string; _id?: string } | string | null;\n feesi_is_mandatory?: boolean;\n feesi_is_refundable?: boolean;\n feesi_is_amount_editable?: boolean;\n feesi_min_amount?: number;\n feesi_max_amount?: number;\n feesi_tax_applicable?: boolean;\n feesi_tax_percentage?: number;\n feesi_is_installment_allowed?: boolean;\n feesi_installment_count?: number;\n feesi_due_date_offset_days?: number;\n feesi_collection_start_offset_days?: number;\n feesi_collection_end_offset_days?: number;\n feesi_display_order?: number;\n}\n\nexport interface PartialFeeAssignment {\n _id?: string;\n fee_structure_name?: string;\n feeas_fee_structure_id_feest?: { fees_structure_name?: string } | string | null;\n feeas_fee_category_sygms?: string | null;\n feeas_fee_name?: string;\n feeas_fee_description?: string;\n feeas_original_amount?: number;\n feeas_total_amount?: number;\n feeas_final_amount?: number;\n feeas_discount_amount?: number;\n feeas_scholarship_amount?: number;\n feeas_assignment_date?: Date | string;\n feeas_installment_count?: number;\n feeas_due_date?: Date | string;\n feeas_collection_start_date?: Date | string;\n feeas_collection_end_date?: Date | string;\n}\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 scholarship?: number;\n finalAmount?: number;\n _feeItemData?: PartialFeeStructureItem;\n _feeAssignmentData?: PartialFeeAssignment;\n // Optional flattened properties\n feesi_item_name?: string;\n feesi_item_code?: string;\n feesi_amount?: number;\n feesi_description?: string;\n feesi_category_id_sygms?: { sygms_title?: string; sygms_name?: string; _id?: string } | string | null;\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.scholarship > 0) {\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-gray-600\">Scholarship Applied:</span>\n <span class=\"tw-font-medium tw-text-purple-600\">-{{ details.scholarship | 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 with backing signals\n private _isOpen = signal<boolean>(false);\n @Input() set isOpen(value: boolean) { this._isOpen.set(value); }\n get isOpen() { return this._isOpen(); }\n\n private _studentId = signal<string | null>(null);\n @Input() set studentId(value: string | null) { this._studentId.set(value); }\n get studentId() { return this._studentId(); }\n\n private _feeId = signal<string | null>(null);\n @Input() set feeId(value: string | null) { this._feeId.set(value); }\n get feeId() { return this._feeId(); }\n\n private _feeData = signal<FeeDetailsData | null>(null);\n @Input() set feeData(value: FeeDetailsData | null) { this._feeData.set(value); }\n get feeData() { return this._feeData(); }\n\n private _assignmentDate = signal<Date | null>(null);\n @Input() set assignmentDate(value: Date | null) { this._assignmentDate.set(value); }\n get assignmentDate() { return this._assignmentDate(); }\n\n private _discount = signal<number>(0);\n @Input() set discount(value: number) { this._discount.set(value); }\n get discount() { return this._discount(); }\n\n private _scholarship = signal<number>(0);\n @Input() set scholarship(value: number) { this._scholarship.set(value); }\n get scholarship() { return this._scholarship(); }\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 constructor() {\n // Watch for changes in inputs and reload when they change\n effect(() => {\n // Accessing the getters (which read signals) registers dependencies\n this.isOpen;\n this.studentId;\n this.feeId;\n this.feeData;\n this.assignmentDate;\n this.assignmentDate;\n this.discount;\n this.scholarship;\n\n this.loadFeeDetails();\n });\n }\n\n ngOnInit(): void {\n // Initialize rights for fee details viewer (view-only)\n this.rightsService.initializeRights('fee_statement');\n }\n\n /**\n * Helper to get value from input (handles signals and plain values)\n * This helper is no longer needed as getters now return unwrapped values.\n */\n // private getValue(input: any): any {\n // if (typeof input === 'function') {\n // try {\n // return input();\n // } catch {\n // return input;\n // }\n // }\n // // Check if it's a signal object (has a call signature)\n // if (input && typeof input === 'object' && '_value' in input) {\n // return (input as any)._value;\n // }\n // return input;\n // }\n\n private loadFeeDetails(): void {\n // Check if feeData 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 logic error in loadFeeDetails:', 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 // We use a temporary variable with a broader type to allow fallbacks, then cast to specific type\n let rawItemData: any = fee._feeItemData;\n\n // If _feeItemData doesn't exist or is incomplete, construct it from fee data\n if (!rawItemData || typeof rawItemData !== 'object' || Object.keys(rawItemData).length === 0) {\n console.warn('โš ๏ธ FeeDetailsViewer - _feeItemData is missing or empty, using fee object as fallback');\n rawItemData = fee;\n }\n\n // Ensure we have a valid itemData object to work with\n const itemData: PartialFeeStructureItem = rawItemData || {};\n\n // Robustly fill missing fields in itemData from top-level fee properties\n // This handles cases where data is flattened or mapped differently\n if (!itemData.feesi_item_name || itemData.feesi_item_name === 'N/A') {\n itemData.feesi_item_name = fee.fees_structure_name || fee.feesi_item_name || 'N/A';\n }\n\n if (!itemData.feesi_item_code || itemData.feesi_item_code === 'N/A') {\n itemData.feesi_item_code = fee.fees_structure_code || fee.feesi_item_code || 'N/A';\n }\n\n if (itemData.feesi_amount === undefined || itemData.feesi_amount === null) {\n itemData.feesi_amount = fee.fees_amount || fee.fees_total_amount || fee.feesi_amount || 0;\n }\n\n if (!itemData.feesi_description || itemData.feesi_description === 'No description available') {\n itemData.feesi_description = fee.feesi_description || 'No description available';\n }\n\n // Ensure category is properly set\n if (!itemData.feesi_category_id_sygms) {\n // Check if it exists at root\n if (fee.feesi_category_id_sygms) {\n itemData.feesi_category_id_sygms = fee.feesi_category_id_sygms;\n } else if (fee.fees_category_name && fee.fees_category_name !== 'N/A') {\n // We have a name but no ID object, that's fine, logic later handles name only\n }\n }\n\n const finalAmount = (fee.fees_total_amount || fee.fees_amount || 0) - (this.discount || fee.discount || 0) - (this.scholarship || fee.scholarship || 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 scholarship: fee.scholarship || this.scholarship || 0,\n finalAmount: finalAmount,\n _feeItemData: itemData\n };\n\n this.calculateAndSetFeeDetails(itemData, feeDataWithDefaults, finalAmount, assignmentDate);\n }\n\n private processFeeAssignmentData(assignment: PartialFeeAssignment): 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: PartialFeeStructureItem = {\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\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?.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 scholarship: assignment.feeas_scholarship_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) - (this.scholarship || 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 scholarship: this.scholarship,\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: PartialFeeStructureItem,\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.sygms_title ||\n itemData.feesi_category_id_sygms.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 && itemData.feesi_item_name !== 'N/A') ? itemData.feesi_item_name :\n (feeData.fees_structure_name && feeData.fees_structure_name !== 'N/A') ? feeData.fees_structure_name :\n (itemData.feesi_item_code && itemData.feesi_item_code !== 'N/A') ? itemData.feesi_item_code :\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 scholarship: this.scholarship || feeData.scholarship || 0,\n finalAmount: finalAmount,\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","\r\nimport { Component, OnInit, OnDestroy, inject, signal, computed, Input, Output, EventEmitter, effect, ViewChild, SimpleChanges, OnChanges } from '@angular/core';\r\nimport { CommonModule, CurrencyPipe } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormControl } from '@angular/forms';\r\nimport { DestroyRef } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { forkJoin } from 'rxjs';\r\nimport {\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideSelectComponent,\r\n NotificationService,\r\n CideEleFloatingContainerService,\r\n CurrencyService\r\n} from 'cloud-ide-element';\r\nimport { CideFeeFeeStructureService } from '../../../collection/fee-structure-management/services/fee-structure.service';\r\nimport {\r\n MFeeStructure,\r\n feeStructureControllerResponse,\r\n feeStructureByIdControllerResponse,\r\n FeeStructureByIdResponse,\r\n FeeStructureResponse,\r\n FeeStructureItem\r\n} from 'cloud-ide-lms-model';\r\nimport { FeeDiscountFormComponent, FeeDiscountFormData } from '../fee-discount-form/fee-discount-form.component';\r\nimport { FeeScholarshipFormComponent, FeeScholarshipFormData } from '../fee-scholarship-form/fee-scholarship-form.component';\r\nimport { FeeDetailsViewerComponent } from '../fee-details-viewer/fee-details-viewer.component';\r\nimport { CideFeeFeeAssignmentService, FeeAssignment, FeeAssignmentListPayload } from '../../../collection/fee-assignment-management/services/fee-assignment.service';\r\n\r\n// Types definition matching usage\r\nexport type ApplicableFeeItem = FeeStructureResponse & {\r\n fees_structure_name?: string;\r\n fees_category_name?: string;\r\n fees_total_amount?: number;\r\n fees_amount?: number;\r\n fees_structure_id?: string;\r\n _feeItemData?: FeeStructureItem | any;\r\n // Computed values\r\n discount?: number;\r\n scholarship?: number;\r\n final_amount?: number;\r\n is_assigned?: boolean;\r\n};\r\n\r\nexport type FeeStructureGroup = {\r\n structure_id: string;\r\n structure_name: string;\r\n structure_code?: string;\r\n fees: ApplicableFeeItem[];\r\n total_amount: number;\r\n};\r\n\r\ntype FeeDiscountData = {\r\n fee_id: string;\r\n discount_type: 'PERCENTAGE' | 'FIXED_AMOUNT';\r\n discount_value: number;\r\n discount_amount: number;\r\n discount_reason_id?: string;\r\n discount_reason_title?: string;\r\n valid_from?: Date;\r\n valid_to?: Date;\r\n notes?: string;\r\n};\r\n\r\ntype FeeScholarshipData = {\r\n fee_id: string;\r\n scholarship_type_id?: string;\r\n scholarship_type_title?: string;\r\n scholarship_category: 'FULL' | 'PARTIAL';\r\n scholarship_percentage?: number;\r\n scholarship_amount: number;\r\n valid_from?: Date;\r\n valid_to?: Date;\r\n notes?: string;\r\n};\r\n\r\ntype FeeDiscountScholarshipMap = Map<string, {\r\n discount?: FeeDiscountData;\r\n scholarship?: FeeScholarshipData;\r\n}>;\r\n\r\n@Component({\r\n selector: 'cide-fee-applicable-fees',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideSelectComponent,\r\n CurrencyPipe,\r\n FeeDetailsViewerComponent\r\n ],\r\n templateUrl: './fee-applicable-fees.component.html',\r\n styleUrl: './fee-applicable-fees.component.css'\r\n})\r\nexport class FeeApplicableFeesComponent implements OnChanges {\r\n private destroyRef = inject(DestroyRef);\r\n private fb = inject(FormBuilder);\r\n private feeStructureService = inject(CideFeeFeeStructureService);\r\n private assignmentService = inject(CideFeeFeeAssignmentService);\r\n private notificationService = inject(NotificationService);\r\n private floatingContainerService = inject(CideEleFloatingContainerService);\r\n private currencyPipe = inject(CurrencyPipe);\r\n\r\n // Inputs\r\n @Input() entityId: string | null = null;\r\n @Input() academicYearId: string = '';\r\n @Input() classProgramId: string = '';\r\n @Input() termId: string = '';\r\n @Input() branchId: string | null = null;\r\n @Input() sectionId: string | null = null;\r\n @Input() studentId: string | null = null;\r\n\r\n // Controls loading trigger\r\n @Input() set triggerLoad(value: boolean) {\r\n if (value) {\r\n this.loadApplicableFees();\r\n }\r\n }\r\n\r\n // Outputs\r\n @Output() feesCalculated = new EventEmitter<{\r\n fees: ApplicableFeeItem[],\r\n totalOriginal: number,\r\n totalDiscount: number,\r\n totalScholarship: number,\r\n totalFinal: number,\r\n structureId: string | null\r\n }>();\r\n\r\n // State\r\n loading = signal(false);\r\n applicableFees = signal<Array<ApplicableFeeItem>>([]);\r\n existingAssignments = signal<Array<FeeAssignment>>([]);\r\n feeStructureGroups = signal<Array<FeeStructureGroup>>([]);\r\n selectedFeeStructureId = signal<string | null>(null);\r\n\r\n feeDiscountScholarshipData = signal<FeeDiscountScholarshipMap>(new Map());\r\n viewingFeeDetails = signal<ApplicableFeeItem | null>(null);\r\n\r\n onStructureChange(value: string | number | string[]): void {\r\n this.selectedFeeStructureId.set(value ? String(value) : null);\r\n }\r\n\r\n constructor() {\r\n // Auto emit when calculations change\r\n effect(() => {\r\n const fees = this.getSelectedFeeStructureFees();\r\n if (fees.length > 0) {\r\n this.emitFeeData();\r\n } else {\r\n // Emit empty if no fees\r\n this.feesCalculated.emit({\r\n fees: [],\r\n totalOriginal: 0,\r\n totalDiscount: 0,\r\n totalScholarship: 0,\r\n totalFinal: 0,\r\n structureId: this.selectedFeeStructureId()\r\n });\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // If any of the structural inputs change, verify if we have enough info to load fees\r\n if (changes['classProgramId'] || changes['termId'] || changes['branchId'] || changes['sectionId'] || changes['academicYearId'] || changes['entityId'] || changes['studentId']) {\r\n // Check if we have minimum required fields to attempt loading\r\n if (this.classProgramId && this.termId && this.entityId && this.academicYearId) {\r\n this.loadApplicableFees();\r\n }\r\n }\r\n }\r\n\r\n loadApplicableFees(): void {\r\n if (!this.classProgramId || !this.termId || !this.entityId || !this.academicYearId) {\r\n // Missing required fields\r\n this.applicableFees.set([]);\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n\r\n const payloadData: Partial<MFeeStructure> = {\r\n fees_class_program_id_acacpm: this.classProgramId,\r\n fees_class_program_term_id_acapt: this.termId,\r\n fees_entity_id_syen: this.entityId,\r\n fees_academic_year_id_acayr: this.academicYearId,\r\n fees_is_active: true,\r\n pagination: false\r\n };\r\n\r\n if (this.branchId) {\r\n payloadData.fees_class_program_branch_id_acabrn = this.branchId;\r\n }\r\n\r\n if (this.sectionId) {\r\n payloadData.fees_program_term_section_id_acapts = this.sectionId;\r\n }\r\n\r\n const payload = new MFeeStructure(payloadData);\r\n\r\n // Load assignments in parallel if studentId exists\r\n if (this.studentId) {\r\n this.loadExistingAssignments();\r\n }\r\n\r\n this.feeStructureService.getFeeStructureList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: feeStructureControllerResponse) => {\r\n if (response?.success && response?.data) {\r\n const feeStructures = Array.isArray(response.data) ? response.data : [];\r\n\r\n if (feeStructures.length === 0) {\r\n this.applicableFees.set([]);\r\n this.loading.set(false);\r\n return;\r\n }\r\n\r\n const feeItemRequests = feeStructures.map(structure =>\r\n this.feeStructureService.getFeeStructureById({ fees_id: structure._id || '' })\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n );\r\n\r\n forkJoin(feeItemRequests).subscribe({\r\n next: (responses: feeStructureByIdControllerResponse[]) => {\r\n const allFeeItems: ApplicableFeeItem[] = [];\r\n\r\n responses.forEach((itemResponse, index) => {\r\n if (itemResponse?.success && itemResponse?.data) {\r\n const structure = feeStructures[index];\r\n const isFeeStructureByIdResponse = (data: any): data is FeeStructureByIdResponse => {\r\n return data && 'fee_structure' in data;\r\n };\r\n\r\n let feeItems: FeeStructureItem[] = [];\r\n if (isFeeStructureByIdResponse(itemResponse.data)) {\r\n feeItems = itemResponse.data.fee_structure_items || [];\r\n }\r\n\r\n feeItems.forEach(item => {\r\n if (item.feesi_is_active !== false) {\r\n // Extract category name\r\n let categoryName = 'N/A';\r\n if (item.feesi_category_id_sygms) {\r\n if (typeof item.feesi_category_id_sygms === 'object' && item.feesi_category_id_sygms !== null) {\r\n categoryName = (item.feesi_category_id_sygms as any)?.sygms_title ||\r\n (item.feesi_category_id_sygms as any)?.sygms_name ||\r\n item.feesi_item_code ||\r\n item.feesi_item_name ||\r\n 'N/A';\r\n } else if (typeof item.feesi_category_id_sygms === 'string') {\r\n categoryName = item.feesi_item_code || item.feesi_item_name || 'N/A';\r\n }\r\n } else {\r\n categoryName = item.feesi_item_code || item.feesi_item_name || 'N/A';\r\n }\r\n\r\n // Create deep copy of item data\r\n const feeItemDataCopy = {\r\n ...item,\r\n // Ensure needed fields\r\n feesi_category_id_sygms: item.feesi_category_id_sygms,\r\n feesi_item_name: item.feesi_item_name || '',\r\n feesi_item_code: item.feesi_item_code || '',\r\n feesi_amount: item.feesi_amount || 0\r\n };\r\n\r\n const feeItem: ApplicableFeeItem = {\r\n ...structure,\r\n _id: item._id || '',\r\n fees_structure_id: structure._id,\r\n fees_structure_name: structure.fees_structure_name || 'N/A',\r\n fees_structure_code: structure.fees_structure_code || '',\r\n fees_category_name: categoryName,\r\n fees_amount: item.feesi_amount || 0,\r\n fees_total_amount: item.feesi_amount || 0,\r\n _feeItemData: feeItemDataCopy\r\n } as ApplicableFeeItem;\r\n\r\n allFeeItems.push(feeItem);\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.applicableFees.set(allFeeItems);\r\n this.regroupFees(allFeeItems);\r\n\r\n // Auto-select first structure if not set\r\n const groups = this.feeStructureGroups();\r\n if (groups.length > 0 && !this.selectedFeeStructureId()) {\r\n this.selectedFeeStructureId.set(groups[0].structure_id);\r\n }\r\n\r\n this.loading.set(false);\r\n this.updateAssignmentStatus();\r\n },\r\n error: (err) => {\r\n console.error('Error loading fee items:', err);\r\n this.notificationService.error('Failed to load fee details.');\r\n this.loading.set(false);\r\n }\r\n });\r\n } else {\r\n this.applicableFees.set([]);\r\n this.loading.set(false);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Error loading fee structures:', err);\r\n this.notificationService.error('Failed to load fee structures.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n loadExistingAssignments(): void {\r\n const payload: FeeAssignmentListPayload = {\r\n feeas_student_id_auth: this.studentId || undefined,\r\n fees_academic_year_id_acayr: this.academicYearId, // inherited from MFeeStructure\r\n pagination: false\r\n };\r\n\r\n this.assignmentService.getFeeAssignmentList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (res) => {\r\n if (res.success && res.data) {\r\n this.existingAssignments.set(res.data);\r\n this.updateAssignmentStatus();\r\n }\r\n }\r\n });\r\n }\r\n\r\n updateAssignmentStatus(): void {\r\n const fees = this.applicableFees();\r\n const assignments = this.existingAssignments();\r\n\r\n if (fees.length === 0) return; // No fees to mark, but assignments might exist\r\n // Note: Even if assignments is empty, we should run this to clear is_assigned status if it was previously set\r\n\r\n const updatedFees = fees.map(fee => {\r\n const isAssigned = assignments.some(a => {\r\n const assignmentItemId = (typeof a.feeas_fee_structure_item_id_feesi === 'object' && a.feeas_fee_structure_item_id_feesi !== null)\r\n ? (a.feeas_fee_structure_item_id_feesi as any)._id\r\n : a.feeas_fee_structure_item_id_feesi;\r\n\r\n return assignmentItemId === fee._id;\r\n });\r\n return { ...fee, is_assigned: isAssigned };\r\n });\r\n\r\n // Update checks by value, if different set signal\r\n // Simple optimization: check if any status changed. For now just set.\r\n this.applicableFees.set(updatedFees);\r\n this.regroupFees(updatedFees);\r\n }\r\n\r\n regroupFees(allFeeItems: ApplicableFeeItem[]): void {\r\n const groupedFees = new Map<string, FeeStructureGroup>();\r\n allFeeItems.forEach((fee) => {\r\n const structureId = fee.fees_structure_id || 'unknown';\r\n if (!groupedFees.has(structureId)) {\r\n groupedFees.set(structureId, {\r\n structure_id: structureId,\r\n structure_name: fee.fees_structure_name || 'Unknown Structure',\r\n structure_code: (fee as any).fees_structure_code,\r\n fees: [],\r\n total_amount: 0\r\n });\r\n }\r\n const group = groupedFees.get(structureId)!;\r\n group.fees.push(fee);\r\n group.total_amount += fee.fees_amount || 0;\r\n });\r\n\r\n const groups = Array.from(groupedFees.values());\r\n this.feeStructureGroups.set(groups);\r\n }\r\n\r\n getFeeStructureOptions(): Array<{ value: string; label: string }> {\r\n return this.feeStructureGroups().map(group => ({\r\n value: group.structure_id,\r\n label: `${group.structure_name}${group.structure_code ? ' (' + group.structure_code + ')' : ''} - Total: ${this.currencyPipe.transform(group.total_amount, 'INR')}`\r\n }));\r\n }\r\n\r\n getSelectedFeeStructureFees(): ApplicableFeeItem[] {\r\n const selectedId = this.selectedFeeStructureId();\r\n if (!selectedId) return [];\r\n\r\n // Return fees filtered by selected structure\r\n const fees = this.applicableFees().filter(f => f.fees_structure_id === selectedId);\r\n return fees;\r\n }\r\n\r\n getFeeId(fee: ApplicableFeeItem): string {\r\n return fee._id || '';\r\n }\r\n\r\n // --- Calculations ---\r\n\r\n getDiscountData(feeId: string): FeeDiscountData | undefined {\r\n return this.feeDiscountScholarshipData().get(feeId)?.discount;\r\n }\r\n\r\n getScholarshipData(feeId: string): FeeScholarshipData | undefined {\r\n return this.feeDiscountScholarshipData().get(feeId)?.scholarship;\r\n }\r\n\r\n calculateFinalAmount(fee: ApplicableFeeItem): number {\r\n const feeId = this.getFeeId(fee);\r\n const originalAmount = fee.fees_amount || 0;\r\n\r\n const discountData = this.getDiscountData(feeId);\r\n const scholarshipData = this.getScholarshipData(feeId);\r\n\r\n let discountAmount = 0;\r\n if (discountData) {\r\n discountAmount = discountData.discount_amount;\r\n }\r\n\r\n let scholarshipAmount = 0;\r\n if (scholarshipData) {\r\n scholarshipAmount = scholarshipData.scholarship_amount;\r\n }\r\n\r\n return Math.max(0, originalAmount - discountAmount - scholarshipAmount);\r\n }\r\n\r\n // Totals for current selection\r\n totalOriginalAmount = computed(() => {\r\n return this.getSelectedFeeStructureFees().reduce((sum, fee) => sum + (fee.fees_amount || 0), 0);\r\n });\r\n\r\n totalDiscount = computed(() => {\r\n return this.getSelectedFeeStructureFees().reduce((sum, fee) => {\r\n const discount = this.getDiscountData(this.getFeeId(fee));\r\n return sum + (discount?.discount_amount || 0);\r\n }, 0);\r\n });\r\n\r\n totalScholarship = computed(() => {\r\n return this.getSelectedFeeStructureFees().reduce((sum, fee) => {\r\n const scholarship = this.getScholarshipData(this.getFeeId(fee));\r\n return sum + (scholarship?.scholarship_amount || 0);\r\n }, 0);\r\n });\r\n\r\n totalFinalAmount = computed(() => {\r\n return this.getSelectedFeeStructureFees().reduce((sum, fee) => sum + this.calculateFinalAmount(fee), 0);\r\n });\r\n\r\n // --- Actions ---\r\n\r\n openDiscountManagement(feeId: string): void {\r\n const fee = this.applicableFees().find(f => this.getFeeId(f) === feeId);\r\n if (!fee) return;\r\n\r\n const currentDiscount = this.getDiscountData(feeId);\r\n\r\n const inputs: any = {\r\n feeId: feeId,\r\n feeName: fee.fees_structure_name || 'Fee',\r\n feeAmount: fee.fees_amount || 0,\r\n currentDiscount: currentDiscount\r\n };\r\n\r\n (this.floatingContainerService as any).createContainer(\r\n FeeDiscountFormComponent,\r\n 'Manage Fee Discount',\r\n inputs,\r\n (result: FeeDiscountFormData) => {\r\n if (result) {\r\n this.applyDiscount(feeId, result, fee.fees_amount || 0);\r\n }\r\n }\r\n );\r\n }\r\n\r\n removeDiscount(feeId: string): void {\r\n this.updateFeeData(feeId, { discount: undefined });\r\n }\r\n\r\n openScholarshipManagement(feeId: string): void {\r\n const fee = this.applicableFees().find(f => this.getFeeId(f) === feeId);\r\n if (!fee) return;\r\n\r\n const currentScholarship = this.getScholarshipData(feeId);\r\n\r\n const inputs: any = {\r\n feeId: feeId,\r\n feeName: fee.fees_structure_name || 'Fee',\r\n feeAmount: fee.fees_amount || 0,\r\n currentScholarship: currentScholarship\r\n };\r\n\r\n (this.floatingContainerService as any).createContainer(\r\n FeeScholarshipFormComponent,\r\n 'Manage Fee Scholarship',\r\n inputs,\r\n (result: FeeScholarshipFormData) => {\r\n if (result) {\r\n this.applyScholarship(feeId, result, fee.fees_amount || 0);\r\n }\r\n }\r\n );\r\n }\r\n\r\n removeScholarship(feeId: string): void {\r\n this.updateFeeData(feeId, { scholarship: undefined });\r\n }\r\n\r\n applyDiscount(feeId: string, data: FeeDiscountFormData, feeAmount: number): void {\r\n let discountAmount = 0;\r\n if (data.discount_type === 'PERCENTAGE') {\r\n discountAmount = (feeAmount * data.discount_value) / 100;\r\n } else {\r\n discountAmount = data.discount_value;\r\n }\r\n // Cap at fee amount\r\n discountAmount = Math.min(discountAmount, feeAmount);\r\n\r\n const discountData: FeeDiscountData = {\r\n fee_id: feeId,\r\n discount_type: data.discount_type,\r\n discount_value: data.discount_value,\r\n discount_amount: discountAmount,\r\n discount_reason_id: data.discount_reason_id,\r\n notes: data.notes\r\n };\r\n\r\n this.updateFeeData(feeId, { discount: discountData });\r\n }\r\n\r\n applyScholarship(feeId: string, data: FeeScholarshipFormData, feeAmount: number): void {\r\n let scholarshipAmount = 0;\r\n if (data.scholarship_category === 'FULL') {\r\n scholarshipAmount = feeAmount;\r\n } else if (data.scholarship_category === 'PARTIAL' && data.scholarship_percentage) {\r\n scholarshipAmount = (feeAmount * data.scholarship_percentage) / 100;\r\n } else {\r\n scholarshipAmount = data.scholarship_amount || 0;\r\n }\r\n // Cap at fee amount (considering discount?) \r\n scholarshipAmount = Math.min(scholarshipAmount, feeAmount);\r\n\r\n const scholarshipData: FeeScholarshipData = {\r\n fee_id: feeId,\r\n scholarship_type_id: data.scholarship_type_id,\r\n scholarship_category: data.scholarship_category,\r\n scholarship_percentage: data.scholarship_percentage,\r\n scholarship_amount: scholarshipAmount,\r\n notes: data.notes\r\n };\r\n\r\n this.updateFeeData(feeId, { scholarship: scholarshipData });\r\n }\r\n\r\n private updateFeeData(feeId: string, changes: { discount?: FeeDiscountData, scholarship?: FeeScholarshipData }) {\r\n const currentMap = this.feeDiscountScholarshipData();\r\n const currentData = currentMap.get(feeId) || {};\r\n\r\n const newData = {\r\n ...currentData,\r\n ...changes\r\n };\r\n\r\n if (!newData.discount && !newData.scholarship) {\r\n currentMap.delete(feeId);\r\n } else {\r\n currentMap.set(feeId, newData);\r\n }\r\n\r\n this.feeDiscountScholarshipData.set(new Map(currentMap));\r\n this.emitFeeData();\r\n }\r\n\r\n private emitFeeData(): void {\r\n const fees = this.getSelectedFeeStructureFees();\r\n // Enrich with calculated values\r\n const enrichedFees = fees.map(f => {\r\n const feeId = this.getFeeId(f);\r\n const discount = this.getDiscountData(feeId)?.discount_amount || 0;\r\n const scholarship = this.getScholarshipData(feeId)?.scholarship_amount || 0;\r\n return {\r\n ...f,\r\n discount: discount,\r\n scholarship: scholarship,\r\n final_amount: this.calculateFinalAmount(f)\r\n };\r\n });\r\n\r\n this.feesCalculated.emit({\r\n fees: enrichedFees,\r\n totalOriginal: this.totalOriginalAmount(),\r\n totalDiscount: this.totalDiscount(),\r\n totalScholarship: this.totalScholarship(),\r\n totalFinal: this.totalFinalAmount(),\r\n structureId: this.selectedFeeStructureId()\r\n });\r\n }\r\n\r\n // --- Insights / Detailed View ---\r\n viewFeeDetails(fee: ApplicableFeeItem): void {\r\n this.viewingFeeDetails.set(fee);\r\n }\r\n}\r\n","<div class=\"tw-w-full\">\r\n <!-- Loading State -->\r\n @if (loading()) {\r\n <div class=\"tw-text-center tw-py-6 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200\">\r\n <cide-ele-icon class=\"tw-w-6 tw-h-6 tw-text-gray-400 tw-animate-spin tw-mx-auto tw-mb-2\">refresh</cide-ele-icon>\r\n <span class=\"tw-text-xs tw-text-gray-500\">Loading applicable fees...</span>\r\n </div>\r\n } @else if (applicableFees().length > 0) {\r\n <!-- Fee Structure Selection (if multiple structures) -->\r\n @if (feeStructureGroups().length > 1) {\r\n <div class=\"tw-mb-3 tw-p-3 tw-bg-gray-50 tw-rounded-lg tw-border tw-border-gray-200\">\r\n <label class=\"tw-text-xs tw-font-semibold tw-text-gray-700 tw-mb-2 tw-block\">Select Fee Structure</label>\r\n <cide-ele-select [options]=\"getFeeStructureOptions()\" [ngModel]=\"selectedFeeStructureId() || ''\"\r\n (ngModelChange)=\"onStructureChange($event)\" placeholder=\"Select a fee structure\">\r\n </cide-ele-select>\r\n </div>\r\n }\r\n\r\n <!-- Fee Items Table -->\r\n @if (getSelectedFeeStructureFees().length > 0) {\r\n <div class=\"tw-overflow-x-auto tw-rounded-lg tw-border tw-border-gray-200\">\r\n <table class=\"tw-min-w-full tw-divide-y tw-divide-gray-200 tw-bg-white\">\r\n <thead class=\"tw-bg-gray-50\">\r\n <tr>\r\n <th\r\n class=\"tw-px-4 tw-py-3 tw-text-left tw-text-xs tw-font-semibold tw-text-gray-700 tw-uppercase tw-tracking-wider tw-border-b tw-border-gray-200\">\r\n Fee Name</th>\r\n <th\r\n class=\"tw-px-4 tw-py-3 tw-text-left tw-text-xs tw-font-semibold tw-text-gray-700 tw-uppercase tw-tracking-wider tw-border-b tw-border-gray-200\">\r\n Category</th>\r\n <th\r\n class=\"tw-px-4 tw-py-3 tw-text-right tw-text-xs tw-font-semibold tw-text-gray-700 tw-uppercase tw-tracking-wider tw-border-b tw-border-gray-200\">\r\n Original Amount</th>\r\n <th\r\n class=\"tw-px-4 tw-py-3 tw-text-right tw-text-xs tw-font-semibold tw-text-gray-700 tw-uppercase tw-tracking-wider tw-border-b tw-border-gray-200\">\r\n Discount</th>\r\n <th\r\n class=\"tw-px-4 tw-py-3 tw-text-right tw-text-xs tw-font-semibold tw-text-gray-700 tw-uppercase tw-tracking-wider tw-border-b tw-border-gray-200\">\r\n Scholarship</th>\r\n <th\r\n class=\"tw-px-4 tw-py-3 tw-text-right tw-text-xs tw-font-semibold tw-text-gray-700 tw-uppercase tw-tracking-wider tw-border-b tw-border-gray-200\">\r\n Final Amount</th>\r\n <th\r\n class=\"tw-px-4 tw-py-3 tw-text-center tw-text-xs tw-font-semibold tw-text-gray-700 tw-uppercase tw-tracking-wider tw-border-b tw-border-gray-200\">\r\n Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"tw-bg-white tw-divide-y tw-divide-gray-200\">\r\n @for (fee of getSelectedFeeStructureFees(); track fee._id) {\r\n <tr class=\"tw-bg-white hover:tw-bg-gray-50 tw-transition-colors\">\r\n <td class=\"tw-px-4 tw-py-3 tw-text-sm tw-font-medium tw-text-gray-900 tw-bg-white\">\r\n {{ fee.fees_structure_name || 'N/A' }}\r\n @if (fee.fees_structure_code) {\r\n <span class=\"tw-text-gray-500 tw-ms-1\">({{ fee.fees_structure_code }})</span>\r\n }\r\n @if (fee.is_assigned) {\r\n <span\r\n class=\"tw-ml-2 tw-px-2 tw-py-0.5 tw-bg-yellow-100 tw-text-yellow-800 tw-text-xs tw-font-semibold tw-rounded-full\">\r\n Assigned\r\n </span>\r\n }\r\n </td>\r\n <td class=\"tw-px-4 tw-py-3 tw-text-sm tw-text-gray-600 tw-bg-white\">{{ fee.fees_category_name ||\r\n 'N/A' }}</td>\r\n <td class=\"tw-px-4 tw-py-3 tw-text-sm tw-text-gray-900 tw-text-right tw-font-medium tw-bg-white\">{{\r\n fee.fees_amount | currency }}</td>\r\n <td class=\"tw-px-4 tw-py-3 tw-bg-white\">\r\n @if (getDiscountData(getFeeId(fee)); as discount) {\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-justify-end\">\r\n <span class=\"tw-text-xs tw-text-gray-600\">\r\n {{ discount.discount_amount | currency }}\r\n @if (discount.discount_type === 'PERCENTAGE') {\r\n <span class=\"tw-text-gray-400\">({{ discount.discount_value }}%)</span>\r\n }\r\n </span>\r\n <button type=\"button\" cideEleButton variant=\"ghost\" size=\"xs\"\r\n (click)=\"openDiscountManagement(getFeeId(fee))\" title=\"Edit Discount\">\r\n <cide-ele-icon class=\"tw-w-3.5 tw-h-3.5\">edit</cide-ele-icon>\r\n </button>\r\n <button type=\"button\" cideEleButton variant=\"ghost\" size=\"xs\"\r\n (click)=\"removeDiscount(getFeeId(fee))\" title=\"Remove Discount\">\r\n <cide-ele-icon class=\"tw-w-3.5 tw-h-3.5\">close</cide-ele-icon>\r\n </button>\r\n </div>\r\n } @else {\r\n <button type=\"button\" cideEleButton variant=\"outline\" size=\"xs\"\r\n (click)=\"openDiscountManagement(getFeeId(fee))\" class=\"tw-ml-auto\">\r\n <cide-ele-icon class=\"tw-w-3.5 tw-h-3.5\">add</cide-ele-icon>\r\n Add Discount\r\n </button>\r\n }\r\n </td>\r\n <td class=\"tw-px-4 tw-py-3 tw-bg-white\">\r\n @if (getScholarshipData(getFeeId(fee)); as scholarship) {\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-justify-end\">\r\n <span class=\"tw-text-xs tw-text-gray-600\">\r\n {{ scholarship.scholarship_amount | currency }}\r\n @if (scholarship.scholarship_category === 'PARTIAL' &&\r\n scholarship.scholarship_percentage) {\r\n <span class=\"tw-text-gray-400\">({{ scholarship.scholarship_percentage }}%)</span>\r\n } @else if (scholarship.scholarship_category === 'FULL') {\r\n <span class=\"tw-text-gray-400\">(Full)</span>\r\n }\r\n </span>\r\n <button type=\"button\" cideEleButton variant=\"ghost\" size=\"xs\"\r\n (click)=\"openScholarshipManagement(getFeeId(fee))\" title=\"Edit Scholarship\">\r\n <cide-ele-icon class=\"tw-w-3.5 tw-h-3.5\">edit</cide-ele-icon>\r\n </button>\r\n <button type=\"button\" cideEleButton variant=\"ghost\" size=\"xs\"\r\n (click)=\"removeScholarship(getFeeId(fee))\" title=\"Remove Scholarship\">\r\n <cide-ele-icon class=\"tw-w-3.5 tw-h-3.5\">close</cide-ele-icon>\r\n </button>\r\n </div>\r\n } @else {\r\n <button type=\"button\" cideEleButton variant=\"outline\" size=\"xs\"\r\n (click)=\"openScholarshipManagement(getFeeId(fee))\" class=\"tw-ml-auto\">\r\n <cide-ele-icon class=\"tw-w-3.5 tw-h-3.5\">add</cide-ele-icon>\r\n Add Scholarship\r\n </button>\r\n }\r\n </td>\r\n <td class=\"tw-px-4 tw-py-3 tw-text-sm tw-font-semibold tw-text-gray-900 tw-text-right tw-bg-white\">\r\n {{ calculateFinalAmount(fee) | currency }}\r\n </td>\r\n <td class=\"tw-px-4 tw-py-3 tw-text-center tw-bg-white\">\r\n <button type=\"button\" cideEleButton variant=\"ghost\" size=\"sm\" (click)=\"viewFeeDetails(fee)\"\r\n title=\"View Details\">\r\n <cide-ele-icon>visibility</cide-ele-icon>\r\n </button>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n <tfoot class=\"tw-bg-gray-50 tw-border-t-2 tw-border-gray-200\">\r\n <tr>\r\n <td colspan=\"3\" class=\"tw-px-4 tw-py-3 tw-text-sm tw-font-bold tw-text-gray-900 tw-text-right\">\r\n Total:</td>\r\n <td class=\"tw-px-4 tw-py-3 tw-text-sm tw-font-bold tw-text-blue-600 tw-text-right\">\r\n {{ totalDiscount() | currency }}\r\n </td>\r\n <td class=\"tw-px-4 tw-py-3 tw-text-sm tw-font-bold tw-text-purple-600 tw-text-right\">\r\n {{ totalScholarship() | currency }}\r\n </td>\r\n <td class=\"tw-px-4 tw-py-3 tw-text-base tw-font-bold tw-text-green-600 tw-text-right\">\r\n {{ totalFinalAmount() | currency }}\r\n </td>\r\n <td></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n </div>\r\n } @else {\r\n <div class=\"tw-text-center tw-py-6 tw-bg-white tw-rounded-lg tw-border-2 tw-border-dashed tw-border-gray-200\">\r\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400 tw-mx-auto tw-mb-2\">account_balance</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-600\">No fees available for selected structure.</p>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"tw-text-center tw-py-6 tw-bg-white tw-rounded-lg tw-border-2 tw-border-dashed tw-border-gray-200\">\r\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-gray-400 tw-mx-auto tw-mb-2\">search_off</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-gray-600\">No applicable fees found.</p>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">Please ensure Class Program, Term, and Academic Year are\r\n selected.</p>\r\n </div>\r\n }\r\n</div>\r\n\r\n<!-- Detailed Fee Viewer Overlay -->\r\n@if (viewingFeeDetails()) {\r\n<!-- Note: Assuming cide-fee-details-viewer-wrapper exists or similar -->\r\n<div class=\"tw-fixed tw-inset-0 tw-z-[60] tw-bg-black/50 tw-flex tw-items-center tw-justify-center tw-p-4\">\r\n <div\r\n class=\"tw-bg-white tw-rounded-xl tw-shadow-2xl tw-w-full tw-max-w-4xl tw-max-h-[90vh] tw-overflow-hidden tw-flex tw-flex-col\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-4 tw-border-b tw-border-gray-200\">\r\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900\">Fee Details</h3>\r\n <button type=\"button\" cideEleButton variant=\"ghost\" size=\"sm\" (click)=\"viewingFeeDetails.set(null)\">\r\n <cide-ele-icon>close</cide-ele-icon>\r\n </button>\r\n </div>\r\n <div class=\"tw-p-0 tw-overflow-y-auto tw-flex-1\">\r\n <!-- Passing data to viewer. Construct FeeDetailsData object. \r\n Since viewingFeeDetails() returns ApplicableFeeItem which has compatible structure + _feeItemData \r\n -->\r\n <cide-fee-details-viewer [feeData]=\"{\r\n fees_structure_name: viewingFeeDetails()?.fees_structure_name,\r\n fees_category_name: viewingFeeDetails()?.fees_category_name,\r\n fees_amount: viewingFeeDetails()?.fees_amount,\r\n discount: getDiscountData(getFeeId(viewingFeeDetails()!))?.discount_amount,\r\n scholarship: getScholarshipData(getFeeId(viewingFeeDetails()!))?.scholarship_amount,\r\n _feeItemData: viewingFeeDetails()?._feeItemData\r\n }\" (closed)=\"viewingFeeDetails.set(null)\">\r\n </cide-fee-details-viewer>\r\n </div>\r\n </div>\r\n</div>\r\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 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, AppStateService } 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';\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\nimport { AuthUserMstListPayload, authUserMstListControllerResponse, AuthUserMst } from 'cloud-ide-lms-model';\nimport { FeeApplicableFeesComponent, ApplicableFeeItem } from '../../../../shared/components/fee-applicable-fees/fee-applicable-fees.component';\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// Extended user type for student search response which includes type mapping\ninterface StudentUser extends AuthUserMst {\n user_type_mapping?: {\n syutm_type_specific_id?: string;\n syutm_user_type?: string;\n };\n class?: string;\n section?: string;\n}\n\ninterface StudentDisplay {\n name: string;\n student_id: string;\n class: string;\n section: string;\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 CideLytSharedWrapperComponent,\n CideLytSharedWrapperComponent,\n ProgramSectionSelectorWrapperComponent,\n FeeApplicableFeesComponent,\n CideIconComponent\n // CideFormFieldErrorComponent\n ],\n templateUrl: './fee-assignment-create.component.html',\n styles: [`\n .glass-card {\n background: rgba(255, 255, 255, 0.9);\n backdrop-filter: blur(10px);\n border: 1px solid rgba(255, 255, 255, 0.2);\n box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n }\n .premium-gradient {\n background: linear-gradient(135deg, #f8fafc 0%, #eff6ff 100%);\n }\n `]\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 userMasterService = inject(CideCoreUserMasterService);\n private readonly componentContextService = inject(ComponentContextService);\n private readonly appStateService = inject(AppStateService);\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 feeStructureOptions = signal<LocalFeeStructure[]>([]);\n readonly entityLoading = signal<boolean>(false);\n\n readonly feeStructureLoading = signal<boolean>(false);\n\n // Fee insights - Removed old signals, now using selectedFeeItems from child component\n readonly selectedFeeItems = signal<ApplicableFeeItem[]>([]);\n readonly triggerLoad = signal<boolean>(false); // Trigger for child component\n readonly selectedStudent = signal<StudentDisplay | null>(null);\n\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\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.triggerLoad.set(true);\n // Reset trigger after short delay or expect component to handle. \n // Better: set true then false, or toggle?\n // Using a numeric counter or timestamp might be safer for 'trigger' pattern.\n // But strict boolean set true is fine if component reacts to 'true'.\n setTimeout(() => this.triggerLoad.set(false), 100);\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.triggerLoad.set(true);\n setTimeout(() => this.triggerLoad.set(false), 100);\n }\n });\n\n // Listen for student changes to update display card\n this.assignmentForm.get('student_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(id => {\n if (!id) {\n this.selectedStudent.set(null);\n } else {\n this.loadStudentDetails(id);\n }\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 const entityId = this.appStateService.getActiveEntityValue()?._id;\n\n // Set entity ID in form\n if (entityId) {\n this.assignmentForm.patchValue({ feeas_entity_id_syen: entityId });\n }\n\n // Load entity options (optional, mainly for admin reference)\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 const academicYearId = this.appStateService.getActiveAcademicYearValue()?._id;\n\n if (academicYearId) {\n this.assignmentForm.patchValue({ feeas_academic_year_id_acayr: academicYearId });\n }\n\n\n // Load fee structure options\n this.loadFeeStructures(entityId);\n\n // Load student options\n this.onStudentSearch('');\n }\n\n private loadFeeStructures(entityId?: string): void {\n const currentEntityId = entityId || this.appStateService.getActiveEntityValue()?._id;\n\n this.feeStructureLoading.set(true);\n const payload = new MFeeStructure({\n fees_is_active: true,\n pagination: false,\n fees_entity_id_syen: currentEntityId\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 // Silent error or specific notification?\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_auth || '',\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 // Populate student dropdown for edit mode\n if (data.feeas_student_id_auth) {\n let studentLabel = '';\n if (typeof data.feeas_student_id_auth === 'string') {\n studentLabel = data.feeas_student_id_auth;\n } else {\n studentLabel = (data.feeas_student_id_auth as any)?.name || (data.feeas_student_id_auth as any)?._id || '';\n }\n\n // Try to get name from admission if populated\n const admission = (data as any).feeas_admission_id_admap;\n if (admission && (admission.admap_first_name || admission.admap_last_name)) {\n studentLabel = `${admission.admap_first_name || ''} ${admission.admap_last_name || ''}`.trim() +\n (admission.admap_application_number ? ` (${admission.admap_application_number})` : '');\n }\n\n this.studentListOptions.set([{\n label: studentLabel,\n value: typeof data.feeas_student_id_auth === 'string' ? data.feeas_student_id_auth : (data.feeas_student_id_auth as any)?._id || ''\n }]);\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 private loadStudentDetails(studentId: string): void {\n const payload: any = {\n _id: studentId, // Query by ID\n pagination: false,\n syenm_entity_id_syen: this.appStateService.getActiveEntityValue()?._id || '',\n syutm_user_type: 'STUDENT'\n };\n\n this.userMasterService.getUserList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const data = Array.isArray(response.data) ? response.data : [response.data];\n if (data.length > 0) {\n const student = data[0] as any;\n this.selectedStudent.set({\n name: (student.admap_first_name || student.user_fullname || 'Unknown') + ' ' + (student.admap_last_name || ''),\n student_id: student.admap_student_id || student.user_type_mapping?.syutm_type_specific_id || student._id || '',\n class: student.class || 'N/A',\n section: student.section || 'N/A'\n });\n }\n }\n }\n });\n }\n\n readonly studentListOptions = signal<{ label: string; value: string }[]>([]);\n\n onStudentSearch(event: any): void {\n const searchQuery = typeof event === 'object' ? event?.query || '' : String(event || '');\n\n\n this.loading.set(true);\n\n // Search for students using user master service\n const payload: AuthUserMstListPayload = {\n query: searchQuery,\n pageIndex: 1,\n pageSize: 50, // Increase page size for dropdown\n pagination: true,\n syenm_entity_id_syen: this.appStateService.getActiveEntityValue()?._id || '',\n syutm_user_type: 'STUDENT' // Filter by student type on backend\n };\n\n this.userMasterService.getUserList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: authUserMstListControllerResponse) => {\n if (response?.success && response?.data) {\n // Map results to dropdown options\n // Relaxed client-side filtering: Trust backend filtering or check if it looks like a student\n // We use the data returned by the API directly\n const options = (response.data as StudentUser[]).map((user: StudentUser) => {\n const studentName = user.user_fullname || 'Unknown';\n const specificId = user.user_type_mapping?.syutm_type_specific_id || '';\n const userId = user._id || '';\n\n return {\n label: `${studentName}${specificId ? ' (' + specificId + ')' : ''}`,\n value: userId\n };\n });\n\n this.studentListOptions.set(options);\n\n if (options.length === 0) {\n // Optional: notification or just empty dropdown\n }\n } else {\n this.studentListOptions.set([]);\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error searching for students:', err);\n this.studentListOptions.set([]);\n this.loading.set(false);\n }\n });\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.triggerLoad.set(true);\n setTimeout(() => this.triggerLoad.set(false), 100);\n }\n }\n\n onFeesCalculated(data: { fees: ApplicableFeeItem[] }): void {\n this.selectedFeeItems.set(data.fees);\n }\n\n /**\n * Load applicable fees based on selected program/term/section\n */\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 using fee structure, create assignments for each fee item\n if (formValue.fee_source === 'STRUCTURE' && this.selectedFeeItems().length > 0) {\n // Create multiple fee assignments for each fee item\n const assignments = this.selectedFeeItems().map(fee => {\n const discount = fee.discount || 0;\n const scholarship = fee.scholarship || 0;\n const originalAmount = fee.fees_amount || 0;\n const finalAmount = fee.final_amount !== undefined ? fee.final_amount : Math.max(0, originalAmount - discount - scholarship);\n\n return {\n _id: this.isEditMode() ? this.assignmentId() : undefined,\n feeas_student_id_auth: 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_auth: 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\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","<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_assignment' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n\n <!-- Main Grid Layout -->\n <div class=\"tw-p-4 tw-grid tw-grid-cols-1 lg:tw-grid-cols-12 tw-gap-4 tw-h-[calc(100vh-140px)] tw-overflow-hidden\">\n\n <!-- Left Column: Forms (Col 8) -->\n <div class=\"lg:tw-col-span-8 tw-flex tw-flex-col tw-gap-4 tw-overflow-y-auto tw-pr-2\">\n\n <!-- Section 1: Student Context -->\n <div class=\"glass-card tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">person_search</cide-ele-icon>\n Student Context\n </h3>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4 tw-items-start\" [formGroup]=\"assignmentForm\">\n <div>\n <cide-ele-select label=\"Select Student\" formControlName=\"student_id\" [options]=\"studentListOptions()\"\n size=\"sm\" leadingIcon=\"person\" placeholder=\"Search student name or ID...\"\n (searchChange)=\"onStudentSearch($event)\">\n </cide-ele-select>\n </div>\n\n <!-- Selected Student Display -->\n @if (selectedStudent()) {\n <div\n class=\"premium-gradient tw-p-3 tw-rounded-lg tw-border tw-border-blue-100 tw-flex tw-items-center tw-gap-4\">\n <div\n class=\"tw-h-12 tw-w-12 tw-rounded-full tw-bg-blue-600 tw-flex tw-items-center tw-justify-center tw-text-white tw-font-bold tw-text-xl\">\n {{ selectedStudent()?.name?.[0] || '?' }}\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-sm tw-font-bold tw-text-gray-900\">{{ selectedStudent()?.name }}</div>\n <div class=\"tw-text-xs tw-text-gray-500\">ID: {{ selectedStudent()?.student_id }}</div>\n <div class=\"tw-text-[10px] tw-text-blue-600 tw-font-medium tw-mt-1\">\n {{ selectedStudent()?.class }} | {{ selectedStudent()?.section }}\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"tw-border tw-border-dashed tw-border-gray-300 tw-rounded-lg tw-p-3 tw-flex tw-items-center tw-justify-center tw-text-gray-400 tw-text-xs\">\n Select a student to view details\n </div>\n }\n </div>\n\n <!-- Academic Placement (Conditional for Structure) -->\n @if (showFeeStructureField()) {\n <div class=\"tw-mt-4 tw-pt-4 tw-border-t tw-border-gray-100\">\n <label class=\"tw-block tw-text-xs tw-font-medium tw-text-gray-500 tw-mb-2\">\n ACADEMIC PLACEMENT filters (Required for Fee Structure)\n </label>\n <cide-shared-program-section-selector-wrapper [formGroup]=\"assignmentForm\"\n classProgramControlName=\"class_program_id\" branchControlName=\"branch_id\" termControlName=\"term_id\"\n sectionControlName=\"section_id\" [academicYearId]=\"assignmentForm.get('feeas_academic_year_id_acayr')?.value\"\n [entityId]=\"assignmentForm.get('feeas_entity_id_syen')?.value\" [disabled]=\"isViewMode()\"\n (valuesChange)=\"onProgramSectionValuesChange($event)\">\n </cide-shared-program-section-selector-wrapper>\n </div>\n }\n </div>\n\n <!-- Section 2: Fee Configuration -->\n <div class=\"glass-card tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">settings</cide-ele-icon>\n Fee Configuration\n </h3>\n </div>\n\n <div class=\"tw-space-y-4\" [formGroup]=\"assignmentForm\">\n <!-- Source Selection -->\n <div class=\"tw-w-full md:tw-w-1/2\">\n <cide-ele-select label=\"Fee Assignment Mode\" formControlName=\"fee_source\" [options]=\"feeSourceOptions\"\n size=\"sm\" leadingIcon=\"tune\">\n </cide-ele-select>\n </div>\n\n <!-- Mode: Structure -->\n @if (showFeeStructureField()) {\n <div>\n <cide-fee-applicable-fees [entityId]=\"assignmentForm.get('feeas_entity_id_syen')?.value\"\n [academicYearId]=\"assignmentForm.get('feeas_academic_year_id_acayr')?.value\"\n [classProgramId]=\"assignmentForm.get('class_program_id')?.value\"\n [termId]=\"assignmentForm.get('term_id')?.value\" [branchId]=\"assignmentForm.get('branch_id')?.value\"\n [sectionId]=\"assignmentForm.get('section_id')?.value\"\n [studentId]=\"assignmentForm.get('student_id')?.value\" [triggerLoad]=\"triggerLoad()\"\n (feesCalculated)=\"onFeesCalculated($event)\">\n </cide-fee-applicable-fees>\n </div>\n }\n\n <!-- Mode: Custom -->\n @if (showCustomFeeFields()) {\n <div class=\"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 label=\"Category\" formControlName=\"feeas_fee_category_sygms\"\n [options]=\"feeCategoryOptions\" size=\"sm\"></cide-ele-select>\n <cide-ele-input label=\"Fee Name\" formControlName=\"feeas_fee_name\" placeholder=\"e.g. Late Fee\"\n size=\"sm\"></cide-ele-input>\n </div>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input label=\"Amount\" formControlName=\"feeas_original_amount\" type=\"number\" placeholder=\"0.00\"\n size=\"sm\" leadingIcon=\"currency_rupee\"></cide-ele-input>\n <cide-ele-select label=\"Type\" formControlName=\"feeas_fee_type\" [options]=\"feeTypeOptions\"\n size=\"sm\"></cide-ele-select>\n </div>\n\n <!-- Custom Discounts -->\n <div class=\"tw-bg-gray-50 tw-rounded tw-p-3 tw-border tw-border-gray-200\">\n <h6 class=\"tw-text-xs tw-font-semibold tw-text-gray-500 tw-uppercase tw-mb-3\">Manual Adjustments</h6>\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\n <cide-ele-input label=\"Discount\" formControlName=\"feeas_discount_amount\" type=\"number\" placeholder=\"0\"\n size=\"sm\"></cide-ele-input>\n <cide-ele-input label=\"Scholarship\" formControlName=\"feeas_scholarship_amount\" type=\"number\"\n placeholder=\"0\" size=\"sm\"></cide-ele-input>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Right Column: Summary & Actions (Col 4) -->\n <div class=\"lg:tw-col-span-4 tw-h-full\">\n <div\n class=\"glass-card tw-rounded-xl tw-h-full tw-flex tw-flex-col tw-overflow-hidden tw-border tw-border-gray-200\">\n\n <!-- Header -->\n <div class=\"tw-p-4 tw-bg-blue-600 tw-text-white\">\n <h3 class=\"tw-text-lg tw-font-bold\">Assignment Summary</h3>\n <p class=\"tw-text-blue-100 tw-text-xs\">Review terms and confirm assignment</p>\n </div>\n\n <div class=\"tw-flex-1 tw-p-4 tw-overflow-y-auto tw-space-y-4\" [formGroup]=\"assignmentForm\">\n\n <!-- Payment Terms Inputs -->\n <div class=\"tw-space-y-3\">\n <h6 class=\"tw-text-xs tw-font-bold tw-text-gray-700 tw-uppercase\">Payment Terms</h6>\n <cide-ele-input label=\"Due Date\" formControlName=\"feeas_due_date\" type=\"date\" size=\"sm\"></cide-ele-input>\n <cide-ele-input label=\"Installments\" formControlName=\"feeas_installment_count\" type=\"number\" placeholder=\"1\"\n min=\"1\" max=\"12\" size=\"sm\"></cide-ele-input>\n </div>\n\n <div class=\"tw-border-t tw-border-gray-100 tw-my-4\"></div>\n\n <!-- Totals -->\n <div class=\"tw-space-y-2\">\n @if(showCustomFeeFields()) {\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-500\">Original Amount</span>\n <span class=\"tw-font-medium\">{{ formatCurrency(assignmentForm.get('feeas_original_amount')?.value || 0)\n }}</span>\n </div>\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-500\">Adjustments</span>\n <span class=\"tw-text-red-500 tw-font-medium\">\n - {{ formatCurrency((assignmentForm.get('feeas_discount_amount')?.value || 0) +\n (assignmentForm.get('feeas_scholarship_amount')?.value || 0)) }}\n </span>\n </div>\n <div class=\"tw-border-t tw-border-gray-100 tw-pt-2 tw-mt-2\">\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-base tw-font-bold tw-text-gray-800\">Total Payable</span>\n <span class=\"tw-text-xl tw-font-bold tw-text-blue-600\">{{ formatCurrency(totalAmount()) }}</span>\n </div>\n </div>\n } @else {\n <!-- Structure Mode Totals (calculated by child component usually, but we have selectedFeeItems signal) -->\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-500\">Items Selected</span>\n <span class=\"tw-font-medium\">{{ selectedFeeItems().length }}</span>\n </div>\n\n <!-- Note: Ideally we'd sum up selectedFeeItems here for a live total, similar to Fee Payment Process -->\n <!-- For now, just showing item count as specific amounts are handled inside the child component mostly -->\n }\n </div>\n\n <!-- Remarks -->\n <div class=\"tw-mt-4\">\n <cide-ele-textarea label=\"Remarks\" formControlName=\"feeas_remarks\" placeholder=\"Optional notes...\"\n [rows]=\"3\" size=\"sm\"></cide-ele-textarea>\n </div>\n\n </div>\n\n <!-- Footer Actions -->\n <div class=\"tw-p-4 tw-bg-gray-50 tw-border-t tw-border-gray-100 tw-flex tw-flex-col tw-gap-2\">\n <button cideEleButton variant=\"primary\" class=\"tw-w-full tw-py-3\" [loading]=\"submitting()\"\n [disabled]=\"submitting() || assignmentForm.invalid || loading()\" (click)=\"onSubmit()\">\n {{ isEditMode() ? 'Update Assignment' : 'Confirm Assignment' }}\n </button>\n\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-2\">\n @if (!isEditMode()) {\n <button cideEleButton variant=\"ghost\" (click)=\"resetForm()\" [disabled]=\"loading()\">Reset</button>\n }\n <button cideEleButton variant=\"ghost\" (click)=\"onCancel()\" [disabled]=\"submitting()\">Cancel</button>\n </div>\n </div>\n\n </div>\n </div>\n\n </div>\n</cide-lyt-shared-wrapper>","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, CideLytSharedWrapperComponent, AppStateService } 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 CideLytSharedWrapperComponent\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 private readonly appStateService = inject(AppStateService);\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\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.initializeBreadcrumbData();\n this.loadFeePayments();\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 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<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_payment' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n\r\n <!-- Action Buttons in Breadcrumb Area -->\r\n <div breadcrumb-actions class=\"tw-flex tw-items-center tw-gap-2\">\r\n <button cideEleButton variant=\"primary\" size=\"sm\" leftIcon=\"add\" (click)=\"processPayment()\">\r\n Record Payment\r\n </button>\r\n </div>\r\n\r\n <div class=\"tw-table tw-w-full tw-h-full\">\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 </div>\r\n</cide-lyt-shared-wrapper>\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\r\n 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 [items]=\"getActionDropdownItems(row)\" [config]=\"getDropdownConfig()\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template>","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, toSignal } from '@angular/core/rxjs-interop';\nimport {\n CideInputComponent,\n CideTextareaComponent,\n CideEleButtonComponent,\n CideIconComponent,\n CideSelectComponent,\n CideEleDataGridComponent,\n GridConfiguration,\n GridEvent,\n TemplateRenderer,\n TemplateContext,\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 { GENERAL_MASTER_SERVICE_TOKEN, IGeneralMasterService } from 'cloud-ide-shared';\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\nimport { CideLytSharedWrapperComponent, AppStateService, RightsService } from 'cloud-ide-layout';\nimport { FeePayment, AuthUserMstListPayload, authUserMstListControllerResponse, MFeePaymentInsertUpdatePayload, feePaymentInsertUpdateControllerResponse } from 'cloud-ide-lms-model';\nimport { viewChild, TemplateRef } from '@angular/core';\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 academic_year_id?: 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 CideLytSharedWrapperComponent,\n CideEleDataGridComponent\n ],\n templateUrl: './fee-payment-process.component.html',\n styles: [`\n .glass-card {\n background: rgba(255, 255, 255, 0.9);\n backdrop-filter: blur(10px);\n border: 1px solid rgba(255, 255, 255, 0.2);\n box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n }\n .premium-gradient {\n background: linear-gradient(135deg, #f8fafc 0%, #eff6ff 100%);\n }\n `]\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 userMasterService = inject(CideCoreUserMasterService);\n private readonly notificationService = inject(NotificationService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly rightsService = inject(RightsService);\n private readonly appStateService = inject(AppStateService);\n private readonly generalMasterService = inject(GENERAL_MASTER_SERVICE_TOKEN) as unknown as IGeneralMasterService;\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: ['OFFLINE'],\n feepay_payment_method: ['', [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: ['SUB_TOTAL'],\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 // Grid ViewChilds for templates\n readonly selectTemplate = viewChild<TemplateRef<TemplateContext<OutstandingFee>>>('selectTemplate');\n readonly amountPaidTemplate = viewChild<TemplateRef<TemplateContext<OutstandingFee>>>('amountPaidTemplate');\n readonly outstandingTemplate = viewChild<TemplateRef<TemplateContext<OutstandingFee>>>('outstandingTemplate');\n readonly dateTemplate = viewChild<TemplateRef<TemplateContext<OutstandingFee>>>('dateTemplate');\n\n readonly templateRenderers = computed(() => ({\n selectRenderer: this.selectTemplate(),\n amountPaidRenderer: this.amountPaidTemplate(),\n outstandingRenderer: this.outstandingTemplate(),\n dateRenderer: this.dateTemplate()\n }));\n\n readonly gridConfig = computed<GridConfiguration<OutstandingFee>>(() => ({\n id: 'outstanding-fees-grid',\n columns: [\n { key: 'is_selected', header: '', type: 'custom', width: '40px', renderer: 'selectRenderer', align: 'center' },\n { key: 'fee_head', header: 'Fee Head', type: 'text', width: 'auto' },\n { key: 'fee_category', header: 'Category', type: 'text', width: '120px' },\n { key: 'due_date', header: 'Due Date', type: 'custom', width: '100px', renderer: 'dateRenderer' },\n { key: 'outstanding_amount', header: 'Outstanding', type: 'custom', width: '110px', renderer: 'outstandingRenderer', align: 'right' },\n { key: 'late_fee', header: 'Late Fee', type: 'number', width: '80px', align: 'right' },\n { key: 'amount_paid', header: 'Amount to Pay', type: 'custom', width: '130px', renderer: 'amountPaidRenderer', align: 'right' }\n ],\n data: this.outstandingFees(),\n trackBy: 'id',\n pagination: { enabled: false, pageSize: 100, pageSizeOptions: [100], showQuickJump: false, showPageInfo: false, showRefresh: false },\n search: { enabled: false, placeholder: '', searchableColumns: [] },\n loading: { useDefer: true, skeletonRows: 3, showOverlay: this.loading() },\n bordered: true,\n compact: true,\n striped: true,\n responsive: true,\n tableClass: 'tw-text-xs'\n }));\n\n // Track form values for reactive computations\n readonly formValues = toSignal(this.paymentForm.valueChanges, { initialValue: this.paymentForm.value });\n\n // Breadcrumb data for shared wrapper\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\n\n // Payment method options from General Master\n readonly paymentMethodOptions = signal<{ label: string; value: string }[]>([]);\n private readonly paymentMethodsRaw = signal<any[]>([]);\n private readonly paymentStatusesRaw = signal<any[]>([]);\n\n readonly studentListOptions = signal<{ label: string; value: string }[]>([]);\n\n // Computed values\n readonly selectedFeeItems = computed(() => {\n const values = this.formValues();\n const items = values.fee_items || [];\n return items.filter((item: any) => item.is_selected);\n });\n\n readonly totalFeeAmount = computed(() => {\n const values = this.formValues(); // usage tracks dependency\n const items = values.fee_items || [];\n return items.reduce((acc: number, item: any) => {\n if (item.is_selected) {\n return acc + (parseFloat(String(item.amount_paid || '0')) || 0);\n }\n return acc;\n }, 0);\n });\n\n readonly totalLateFee = computed(() => {\n const values = this.formValues();\n const items = values.fee_items || [];\n return items.reduce((acc: number, item: any) => {\n if (item.is_selected) {\n return acc + (parseFloat(String(item.late_fee || '0')) || 0);\n }\n return acc;\n }, 0);\n });\n\n readonly totalPenalty = computed(() => {\n const values = this.formValues();\n const items = values.fee_items || [];\n return items.reduce((acc: number, item: any) => {\n if (item.is_selected) {\n return acc + (parseFloat(String(item.penalty || '0')) || 0);\n }\n return acc;\n }, 0);\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 console.log('๐Ÿ’ฐ Fee Payment Process Component initialized');\n this.updateBreadcrumbData();\n this.loadPaymentMethodMasters();\n this.loadPaymentStatusMasters();\n this.setupFormListeners();\n this.setupPaymentMethodListener();\n }\n\n private loadPaymentStatusMasters(): void {\n this.generalMasterService.getMasterList({ sygmt_code: 'payment_status' }).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n this.paymentStatusesRaw.set(Array.isArray(response.data) ? response.data : [response.data]);\n }\n }\n });\n }\n\n private loadPaymentMethodMasters(): void {\n this.generalMasterService.getMasterList({ sygmt_code: 'payment_method' }).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const data = Array.isArray(response.data) ? response.data : [response.data];\n this.paymentMethodsRaw.set(data);\n const options = data.map((item: any) => ({\n label: item.sygms_title || '',\n value: item._id || ''\n }));\n this.paymentMethodOptions.set(options);\n\n if (options.length > 0 && !this.paymentForm.get('feepay_payment_method')?.value) {\n this.paymentForm.patchValue({ feepay_payment_method: options[0].value });\n }\n }\n },\n error: (err) => console.error('Error loading payment methods:', err)\n });\n }\n\n private setupFormListeners(): void {\n this.rightsService.initializeRights('fee_payment');\n this.onSearchStudents('');\n\n this.paymentForm.get('student_id')?.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(studentId => {\n if (studentId) {\n this.loadStudentDetails(studentId);\n } else {\n this.selectedStudent.set(null);\n this.outstandingFees.set([]);\n this.initializeFeeItems([]);\n }\n });\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 this.paymentForm.get('feepay_cheque_number')?.clearValidators();\n this.paymentForm.get('feepay_cheque_date')?.clearValidators();\n this.paymentForm.get('feepay_bank_name')?.clearValidators();\n this.paymentForm.get('feepay_transaction_reference')?.clearValidators();\n\n this.paymentForm.updateValueAndValidity();\n });\n }\n\n onStudentSearch(event: any): void {\n const query = typeof event === 'object' ? event.query : String(event || '');\n this.onSearchStudents(query);\n }\n\n private onSearchStudents(query: string): void {\n this.loading.set(true);\n const payload: AuthUserMstListPayload = {\n query,\n pageIndex: 1,\n pageSize: 50,\n pagination: true,\n syenm_entity_id_syen: this.appStateService.getActiveEntityValue()?._id || '',\n syutm_user_type: 'STUDENT'\n };\n\n this.userMasterService.getUserList(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response: authUserMstListControllerResponse) => {\n if (response?.success && response?.data) {\n const options = (response.data as any[]).map((user: any) => {\n const studentName = user.user_fullname || 'Unknown';\n const specificId = user.user_type_mapping?.syutm_type_specific_id || '';\n const userId = user._id || '';\n return {\n label: `${studentName}${specificId ? ' (' + specificId + ')' : ''}`,\n value: userId\n };\n });\n this.studentListOptions.set(options);\n } else {\n this.studentListOptions.set([]);\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error searching for students:', err);\n this.studentListOptions.set([]);\n this.loading.set(false);\n }\n });\n }\n\n onStudentSelect(event: any): void {\n const studentId = typeof event === 'object' ? (event.value || event._id) : event;\n if (studentId) {\n this.paymentForm.get('student_id')?.setValue(studentId);\n }\n }\n\n private loadStudentDetails(studentId: string): void {\n const payload: any = {\n _id: studentId,\n pagination: false,\n syenm_entity_id_syen: this.appStateService.getActiveEntityValue()?._id || '',\n syutm_user_type: 'STUDENT'\n };\n\n this.userMasterService.getUserList(payload).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const students = Array.isArray(response.data) ? response.data : [response.data];\n if (students.length > 0) {\n const studentData = students[0] as any;\n this.selectedStudent.set({\n _id: studentData._id || '',\n name: (studentData.admap_first_name || studentData.user_fullname || 'Unknown') + ' ' + (studentData.admap_last_name || ''),\n student_id: studentData.admap_student_id || studentData.user_type_mapping?.syutm_type_specific_id || studentData._id || '',\n class: studentData.class || 'N/A',\n section: studentData.section || 'N/A',\n academic_year_id: studentData.admap_academic_year_id_acayr?._id || studentData.admap_academic_year_id_acayr\n });\n this.loadOutstandingFees(studentId);\n }\n }\n },\n error: (err) => console.error('Error fetching student details:', err)\n });\n }\n\n private loadOutstandingFees(studentId: string): void {\n this.loading.set(true);\n const payload: any = {\n feeas_student_id_auth: studentId,\n feeas_entity_id_syen: this.appStateService.getActiveEntityValue()?._id,\n feeas_academic_year_id_acayr: this.appStateService.getActiveAcademicYearValue()?._id\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 const total = assignment.feeas_total_amount || 0;\n const paid = assignment.feeas_amount_paid || 0;\n const outstanding = assignment.feeas_outstanding_amount !== undefined ? assignment.feeas_outstanding_amount : (total - paid);\n return outstanding > 0 && assignment.feeas_status !== 'PAID';\n })\n .map((assignment: any) => {\n const total = assignment.feeas_total_amount || 0;\n const paid = assignment.feeas_amount_paid || 0;\n const outstanding = assignment.feeas_outstanding_amount !== undefined ? assignment.feeas_outstanding_amount : (total - paid);\n const lateFee = assignment.feeas_late_fee_applied || 0;\n const dueDate = assignment.feeas_due_date ? new Date(assignment.feeas_due_date) : null;\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?.sygms_title || 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\n // Try to discover class/section info from assignments if not already present or if we find something better\n const infoSource = response.data.find((a: any) =>\n a.feeas_class_program_id_acacpm?.acacpm_alise_title ||\n a.feeas_section_id_acapts?.acapts_name ||\n a.class || a.section\n );\n\n if (infoSource && this.selectedStudent()) {\n const current = this.selectedStudent()!;\n const newClass = infoSource.class || infoSource.feeas_class_program_id_acacpm?.acacpm_alise_title;\n const newSection = infoSource.section || infoSource.feeas_section_id_acapts?.acapts_name;\n\n if ((newClass && (current.class === 'N/A' || !current.class)) ||\n (newSection && (current.section === 'N/A' || !current.section))) {\n this.selectedStudent.set({\n ...current,\n class: newClass || current.class,\n section: newSection || current.section\n });\n }\n }\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error loading fees:', err);\n this.loading.set(false);\n }\n });\n }\n\n private initializeFeeItems(fees: OutstandingFee[]): void {\n const feeItems = this.paymentForm.get('fee_items') as FormArray;\n feeItems.clear();\n\n fees.forEach(fee => {\n feeItems.push(this.fb.group({\n is_selected: [false],\n assignment_id: [fee.assignment_id],\n fee_head: [fee.fee_head],\n fee_category: [fee.fee_category],\n due_date: [fee.due_date],\n outstanding_amount: [fee.outstanding_amount],\n late_fee: [fee.late_fee],\n penalty: [fee.penalty || 0],\n amount_paid: [0, [Validators.min(0), Validators.max(fee.outstanding_amount + fee.late_fee)]]\n }));\n });\n }\n\n toggleFeeItem(index: number): void {\n const item = this.feeItemsArray.at(index);\n const isSelected = item.get('is_selected')?.value;\n const outstanding = item.get('outstanding_amount')?.value || 0;\n const lateFee = item.get('late_fee')?.value || 0;\n const penalty = item.get('penalty')?.value || 0;\n\n item.get('amount_paid')?.setValue(isSelected ? (outstanding + lateFee + penalty) : 0);\n }\n\n selectAllFees(): void {\n this.feeItemsArray.controls.forEach((_, i) => {\n this.feeItemsArray.at(i).get('is_selected')?.setValue(true);\n this.toggleFeeItem(i);\n });\n }\n\n clearAllFees(): void {\n this.feeItemsArray.controls.forEach((_, i) => {\n this.feeItemsArray.at(i).get('is_selected')?.setValue(false);\n this.toggleFeeItem(i);\n });\n }\n\n onAmountChange(index: number, value: any): void {\n const item = this.feeItemsArray.at(index);\n const outstanding = item.get('outstanding_amount')?.value || 0;\n const lateFee = item.get('late_fee')?.value || 0;\n const penalty = item.get('penalty')?.value || 0;\n const max = outstanding + lateFee + penalty;\n const val = parseFloat(String(value || '0')) || 0;\n\n if (val > max) {\n item.get('amount_paid')?.setValue(max);\n this.notificationService.warning('Amount exceeds total payable');\n }\n }\n\n onSubmit(): void {\n if (!this.rightsService.hasRight('CREATE')) {\n this.notificationService.error('Insufficient permissions');\n return;\n }\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('Select fees to pay');\n return;\n }\n\n this.submitting.set(true);\n const val = this.paymentForm.value;\n const selectedGM = this.paymentMethodsRaw().find(m => m._id === val.feepay_payment_method);\n\n const payload: any = {\n feepay_student_id_auth: val.student_id,\n feepay_academic_year_id_acayr: this.selectedStudent()?.academic_year_id || this.outstandingFees()?.[0]?.id,\n feepay_entity_id_syen: this.appStateService.getActiveEntityValue()?._id,\n feepay_payment_date: new Date(val.feepay_payment_date),\n feepay_payment_mode_id_sygms: val.feepay_payment_method,\n feepay_payment_reference: val.feepay_payment_reference || val.feepay_cheque_number || val.feepay_transaction_reference,\n feepay_total_amount: this.totalPayable(),\n feepay_status_id_sygms: this.paymentStatusesRaw().find(s => s.sygms_code === 'feepay_status_success')?._id,\n feepay_remarks: val.feepay_remarks\n };\n\n this.feePaymentService.saveUpdateFeePayment(payload as MFeePaymentInsertUpdatePayload).subscribe({\n next: (res: feePaymentInsertUpdateControllerResponse) => {\n if (res?.success) {\n this.notificationService.success('Payment recorded');\n this.router.navigate(['/control-panel/payment']);\n } else {\n this.notificationService.error(res?.message || 'Failed');\n }\n this.submitting.set(false);\n },\n error: () => {\n this.notificationService.error('Error occurred');\n this.submitting.set(false);\n }\n });\n }\n\n onCancel(): void {\n if (this.paymentForm.dirty) {\n this.confirmationService.ask({\n title: 'Unsaved Changes',\n message: 'You have unsaved changes. Are you sure you want to leave?',\n confirmText: 'Yes, Leave',\n cancelText: 'Stay'\n }).then(res => res && this.router.navigate(['/control-panel/payment']));\n } else {\n this.router.navigate(['/control-panel/payment']);\n }\n }\n\n formatCurrency(amount: number): string {\n return `โ‚น${(amount || 0).toLocaleString('en-IN', { minimumFractionDigits: 2 })}`;\n }\n\n isOverdue(date: Date): boolean {\n return new Date(date) < new Date();\n }\n\n private updateBreadcrumbData(): void {\n this.breadcrumbData.set([\n {\n id: 'process',\n label: 'Process Payment',\n icon: 'payment',\n url: undefined\n }\n ]);\n }\n}\n","<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_payment' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n\n <!-- Main Content Grid -->\n <div class=\"tw-p-4 tw-grid tw-grid-cols-1 lg:tw-grid-cols-12 tw-gap-4 tw-h-[calc(100vh-140px)] tw-overflow-hidden\">\n\n <!-- Left: Form Controls (Col 8) -->\n <div class=\"lg:tw-col-span-8 tw-flex tw-flex-col tw-gap-4 tw-overflow-y-auto tw-pr-2\">\n\n <!-- Student Selection Card (Compact) -->\n <div class=\"glass-card tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">person_search</cide-ele-icon>\n Student Selection\n </h3>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4 tw-items-start\">\n <div [formGroup]=\"paymentForm\">\n <cide-ele-select label=\"Search Student\" placeholder=\"Enter student name or ID...\"\n [options]=\"studentListOptions()\" [loading]=\"loading()\" (searchChange)=\"onStudentSearch($event)\"\n (change)=\"onStudentSelect($event)\" size=\"sm\">\n </cide-ele-select>\n </div>\n\n @if (selectedStudent()) {\n <div\n class=\"premium-gradient tw-p-3 tw-rounded-lg tw-border tw-border-blue-100 tw-flex tw-items-center tw-gap-4\">\n <div\n class=\"tw-h-12 tw-w-12 tw-rounded-full tw-bg-blue-600 tw-flex tw-items-center tw-justify-center tw-text-white tw-font-bold tw-text-xl\">\n {{ selectedStudent()?.name?.[0] || '?' }}\n </div>\n <div class=\"tw-flex-1\">\n <div class=\"tw-text-sm tw-font-bold tw-text-gray-900\">{{ selectedStudent()?.name }}</div>\n <div class=\"tw-text-xs tw-text-gray-500\">ID: {{ selectedStudent()?.student_id }}</div>\n <div class=\"tw-text-[10px] tw-text-blue-600 tw-font-medium tw-mt-1\">\n {{ selectedStudent()?.class }} | {{ selectedStudent()?.section }}\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"tw-border tw-border-dashed tw-border-gray-300 tw-rounded-lg tw-p-3 tw-flex tw-items-center tw-justify-center tw-text-gray-400 tw-text-xs\">\n Select a student to view details\n </div>\n }\n </div>\n </div>\n\n <!-- Outstanding Fees Grid (Premium) -->\n <div\n class=\"glass-card tw-rounded-xl tw-flex-1 tw-flex tw-flex-col tw-overflow-hidden tw-border tw-border-gray-200\">\n <div class=\"tw-p-3 tw-border-b tw-border-gray-100 tw-flex tw-items-center tw-justify-between tw-bg-gray-50/50\">\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800 tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">account_balance_wallet</cide-ele-icon>\n Outstanding Fees\n </h3>\n\n @if (outstandingFees().length > 0) {\n <div class=\"tw-flex tw-gap-2\">\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"selectAllFees()\">Select All</button>\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"clearAllFees()\">Clear</button>\n </div>\n }\n </div>\n\n <div class=\"tw-flex-1 tw-overflow-hidden\">\n <cide-ele-data-grid [config]=\"gridConfig()\" [templateRenderers]=\"templateRenderers()\">\n </cide-ele-data-grid>\n </div>\n </div>\n\n <!-- Payment Method Card (Compact) -->\n <div class=\"glass-card tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-mb-3\">\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">payments</cide-ele-icon>\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800\">Payment Details</h3>\n </div>\n\n <div class=\"tw-grid tw-grid-cols-2 lg:tw-grid-cols-3 tw-gap-4\" [formGroup]=\"paymentForm\">\n <cide-ele-select formControlName=\"feepay_payment_method\" label=\"Method\" [options]=\"paymentMethodOptions()\"\n size=\"sm\">\n </cide-ele-select>\n\n <cide-ele-input formControlName=\"feepay_payment_date\" label=\"Date\" type=\"date\" size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-input formControlName=\"feepay_payment_reference\" label=\"Reference #\" placeholder=\"Ref/Receipt No\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Dynamic Fields -->\n <div [formGroup]=\"paymentForm\" class=\"tw-mt-4 tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-4\">\n @if (showChequeDetails()) {\n <cide-ele-input formControlName=\"feepay_cheque_number\" label=\"Cheque #\" size=\"sm\"></cide-ele-input>\n <cide-ele-input formControlName=\"feepay_cheque_date\" label=\"Cheque Date\" type=\"date\"\n size=\"sm\"></cide-ele-input>\n <cide-ele-input formControlName=\"feepay_bank_name\" label=\"Bank Name\" size=\"sm\"></cide-ele-input>\n }\n @if (showBankDetails()) {\n <cide-ele-input formControlName=\"feepay_transaction_reference\" label=\"Transaction ID\" size=\"sm\"\n class=\"tw-col-span-2\"></cide-ele-input>\n }\n </div>\n </div>\n </div>\n\n <!-- Right: Summary & Action (Col 4) -->\n <div class=\"lg:tw-col-span-4 tw-h-full\">\n <div\n class=\"glass-card tw-rounded-xl tw-h-full tw-flex tw-flex-col tw-overflow-hidden tw-border tw-border-gray-200\">\n <div class=\"tw-p-4 tw-bg-blue-600 tw-text-white\">\n <h3 class=\"tw-text-lg tw-font-bold\">Payment Summary</h3>\n <p class=\"tw-text-blue-100 tw-text-xs\">Confirm your selection and totals</p>\n </div>\n\n <div class=\"tw-flex-1 tw-p-4 tw-overflow-y-auto tw-space-y-4\">\n <!-- Breakdown -->\n <div class=\"tw-space-y-2\">\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-500\">Fees Selected</span>\n <span class=\"tw-font-medium\">{{ selectedFeeItems().length }}</span>\n </div>\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-500\">Sub-total</span>\n <span class=\"tw-font-medium\">{{ formatCurrency(totalFeeAmount()) }}</span>\n </div>\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-500\">Late Fee</span>\n <span class=\"tw-text-blue-600 tw-font-medium\">+ {{ formatCurrency(totalLateFee()) }}</span>\n </div>\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-500\">Penalty</span>\n <span class=\"tw-text-blue-600 tw-font-medium\">+ {{ formatCurrency(totalPenalty()) }}</span>\n </div>\n </div>\n\n <div class=\"tw-border-t tw-border-gray-100 tw-pt-4\">\n <div class=\"tw-flex tw-justify-between tw-items-center\">\n <span class=\"tw-text-base tw-font-bold tw-text-gray-800\">Total Payable</span>\n <span class=\"tw-text-xl tw-font-bold tw-text-blue-600\">{{ formatCurrency(totalPayable()) }}</span>\n </div>\n </div>\n\n <!-- Remarks -->\n <div class=\"tw-mt-6\" [formGroup]=\"paymentForm\">\n <cide-ele-textarea formControlName=\"feepay_remarks\" label=\"Remarks / Notes\"\n placeholder=\"Add payment notes...\" [rows]=\"2\" size=\"sm\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"tw-p-4 tw-bg-gray-50 tw-border-t tw-border-gray-100 tw-flex tw-flex-col tw-gap-2\">\n <button cideEleButton variant=\"primary\" class=\"tw-w-full tw-py-3\" [loading]=\"submitting()\"\n [disabled]=\"submitting() || paymentForm.invalid || selectedFeeItems().length === 0 || loading()\"\n (click)=\"onSubmit()\">\n Confirm & Record Payment\n </button>\n <button cideEleButton variant=\"ghost\" class=\"tw-w-full\" (click)=\"onCancel()\" [disabled]=\"submitting()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n </div>\n</cide-lyt-shared-wrapper>\n\n<!-- Grid Templates -->\n<ng-template #selectTemplate let-row=\"row\">\n <div class=\"tw-flex tw-items-center tw-justify-center\" [formGroup]=\"paymentForm\">\n <ng-container formArrayName=\"fee_items\">\n @for (item of feeItemsArray.controls; track $index) {\n @if (item.get('assignment_id')?.value === row.assignment_id) {\n <div [formGroupName]=\"$index\">\n <input type=\"checkbox\" formControlName=\"is_selected\" (change)=\"toggleFeeItem($index)\"\n class=\"tw-rounded tw-border-gray-300\">\n </div>\n }\n }\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #dateTemplate let-value=\"value\">\n <div class=\"tw-text-xs tw-text-gray-600\">{{ value | date:'dd MMM yyyy' }}</div>\n</ng-template>\n\n<ng-template #outstandingTemplate let-value=\"value\">\n <div class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(value) }}</div>\n</ng-template>\n\n<ng-template #amountPaidTemplate let-row=\"row\">\n <div class=\"tw-flex tw-justify-end\" [formGroup]=\"paymentForm\">\n <ng-container formArrayName=\"fee_items\">\n @for (item of feeItemsArray.controls; track $index) {\n @if (item.get('assignment_id')?.value === row.assignment_id) {\n <div [formGroupName]=\"$index\" class=\"tw-w-24\">\n <cide-ele-input formControlName=\"amount_paid\" size=\"xs\" type=\"number\" [labelHide]=\"true\"\n (onValueChange)=\"onAmountChange($index, $event)\">\n </cide-ele-input>\n </div>\n }\n }\n </ng-container>\n </div>\n</ng-template>","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';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\n\n@Component({\n selector: 'cide-discount-rules',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n template: `\n <div class=\"discount-rules-container\">\n <div class=\"header\">\n <h1>Discount Rules Management</h1>\n <button class=\"btn btn-primary\" (click)=\"openRuleModal()\">Create New Rule</button>\n </div>\n\n <!-- Tabs -->\n <div class=\"tabs\">\n <button class=\"tab\" [class.active]=\"activeTab() === 'rules'\" (click)=\"activeTab.set('rules')\">Discount Rules</button>\n <button class=\"tab\" [class.active]=\"activeTab() === 'applied'\" (click)=\"activeTab.set('applied')\">Applied Discounts</button>\n <button class=\"tab\" [class.active]=\"activeTab() === 'scholarships'\" (click)=\"activeTab.set('scholarships')\">Scholarships</button>\n </div>\n\n <!-- Rules Tab -->\n @if (activeTab() === 'rules') {\n <div class=\"rules-section\">\n <div class=\"table-container\">\n <table>\n <thead>\n <tr>\n <th>Rule Name</th>\n <th>Rule Code</th>\n <th>Discount Type</th>\n <th>Discount Value</th>\n <th>Applies To</th>\n <th>Priority</th>\n <th>Auto Apply</th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (rule of discountRules(); track rule.id) {\n <tr>\n <td>{{ rule.name }}</td>\n <td>{{ rule.code }}</td>\n <td><span class=\"badge\">{{ rule.discount_type }}</span></td>\n <td class=\"discount-value\">{{ rule.discount_type === 'PERCENTAGE' ? rule.value + '%' : 'โ‚น' + rule.value }}</td>\n <td>{{ rule.applies_to }}</td>\n <td><span class=\"priority\">{{ rule.priority }}</span></td>\n <td><span class=\"status-badge\" [class.active]=\"rule.auto_apply\">{{ rule.auto_apply ? 'Yes' : 'No' }}</span></td>\n <td><span class=\"status-badge\" [class.active]=\"rule.status === 'ACTIVE'\">{{ rule.status }}</span></td>\n <td>\n <button class=\"btn-icon\" (click)=\"editRule(rule)\">โœ๏ธ</button>\n <button class=\"btn-icon\" (click)=\"toggleRuleStatus(rule)\">๐Ÿ”„</button>\n <button class=\"btn-icon\" (click)=\"deleteRule(rule)\">๐Ÿ—‘๏ธ</button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- Rule Modal -->\n @if (showRuleModal()) {\n <div class=\"modal-overlay\" (click)=\"closeRuleModal()\">\n <div class=\"modal-content\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h2>{{ editingRule() ? 'Edit' : 'Create' }} Discount Rule</h2>\n <button class=\"close-btn\" (click)=\"closeRuleModal()\">ร—</button>\n </div>\n <form [formGroup]=\"ruleForm\" class=\"modal-body\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Rule Name</label>\n <input type=\"text\" formControlName=\"rule_name\" placeholder=\"e.g., Sibling Discount\" />\n </div>\n <div class=\"form-group\">\n <label>Rule Code</label>\n <input type=\"text\" formControlName=\"rule_code\" placeholder=\"e.g., SIBLING_DISC\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>Description</label>\n <textarea formControlName=\"description\" rows=\"3\" placeholder=\"Describe the discount rule...\"></textarea>\n </div>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Discount Type</label>\n <select formControlName=\"discount_type\">\n <option value=\"PERCENTAGE\">Percentage</option>\n <option value=\"FIXED_AMOUNT\">Fixed Amount</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>Discount Value</label>\n <input type=\"number\" formControlName=\"discount_value\" placeholder=\"Enter value\" />\n </div>\n </div>\n <div class=\"form-group\">\n <label>Applies To Fee Categories</label>\n <select formControlName=\"applies_to\" multiple>\n <option value=\"ALL\">All Categories</option>\n <option value=\"TUITION\">Tuition</option>\n <option value=\"EXAM\">Exam Fees</option>\n <option value=\"LIBRARY\">Library</option>\n <option value=\"LAB\">Lab</option>\n <option value=\"SPORTS\">Sports</option>\n <option value=\"TRANSPORT\">Transport</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>Criteria (JSON Format)</label>\n <textarea formControlName=\"criteria_json\" rows=\"4\" placeholder='{\"sibling_count\": \">= 1\", \"staff_role\": \"TEACHER\"}'></textarea>\n <small>Define conditions for automatic discount application</small>\n </div>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Priority</label>\n <input type=\"number\" formControlName=\"priority\" placeholder=\"1\" />\n <small>Higher priority rules apply first</small>\n </div>\n <div class=\"form-group checkbox-group\">\n <label><input type=\"checkbox\" formControlName=\"auto_apply\" /> Auto Apply</label>\n <label><input type=\"checkbox\" formControlName=\"stackable\" /> Stackable with other discounts</label>\n </div>\n </div>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Valid From</label>\n <input type=\"date\" formControlName=\"valid_from\" />\n </div>\n <div class=\"form-group\">\n <label>Valid To</label>\n <input type=\"date\" formControlName=\"valid_to\" />\n </div>\n </div>\n </form>\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"closeRuleModal()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveRule()\" [disabled]=\"ruleForm.invalid\">Save Rule</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .discount-rules-container { padding: 20px; }\n .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }\n .btn { padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; }\n .btn-primary { background: #007bff; color: white; }\n .btn-secondary { background: #6c757d; color: white; }\n .tabs { display: flex; gap: 10px; margin-bottom: 20px; border-bottom: 2px solid #e0e0e0; }\n .tab { padding: 12px 24px; background: none; border: none; border-bottom: 3px solid transparent; cursor: pointer; font-weight: 500; }\n .tab.active { border-bottom-color: #007bff; color: #007bff; }\n .table-container { overflow-x: auto; background: white; border-radius: 8px; border: 1px solid #e0e0e0; }\n table { width: 100%; border-collapse: collapse; }\n thead { background: #f8f9fa; }\n th { padding: 12px; text-align: left; font-weight: 600; border-bottom: 2px solid #dee2e6; }\n td { padding: 12px; border-bottom: 1px solid #dee2e6; }\n .badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; background: #e3f2fd; color: #1976d2; }\n .discount-value { font-weight: 600; color: #28a745; }\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; }\n .status-badge { padding: 4px 12px; border-radius: 12px; font-size: 12px; background: #f8d7da; color: #721c24; }\n .status-badge.active { background: #d4edda; color: #155724; }\n .btn-icon { background: none; border: none; cursor: pointer; font-size: 18px; padding: 4px; }\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; }\n .modal-content { background: white; border-radius: 8px; max-width: 800px; width: 90%; max-height: 90vh; overflow-y: auto; }\n .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 20px; border-bottom: 1px solid #e0e0e0; }\n .close-btn { background: none; border: none; font-size: 28px; cursor: pointer; color: #666; }\n .modal-body { padding: 20px; }\n .modal-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 20px; border-top: 1px solid #e0e0e0; }\n .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; }\n .form-group { margin-bottom: 15px; }\n .form-group label { display: block; margin-bottom: 5px; font-weight: 500; font-size: 14px; }\n .form-group input, .form-group select, .form-group textarea { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; }\n .form-group small { color: #666; font-size: 12px; }\n .checkbox-group { display: flex; flex-direction: column; gap: 8px; }\n .checkbox-group label { display: flex; align-items: center; gap: 8px; }\n `]\n})\nexport class DiscountRulesComponent implements OnInit {\n private fb = inject(FormBuilder);\n\n activeTab = signal<string>('rules');\n showRuleModal = signal<boolean>(false);\n editingRule = signal<any>(null);\n discountRules = signal<any[]>([]);\n\n ruleForm: FormGroup = this.fb.group({\n rule_name: ['', Validators.required],\n rule_code: ['', Validators.required],\n description: [''],\n discount_type: ['PERCENTAGE', Validators.required],\n discount_value: ['', [Validators.required, Validators.min(0)]],\n applies_to: [['ALL'], Validators.required],\n criteria_json: [''],\n priority: [1],\n auto_apply: [false],\n stackable: [false],\n valid_from: [''],\n valid_to: ['']\n });\n\n ngOnInit(): void {\n this.loadDiscountRules();\n }\n\n private loadDiscountRules(): void {\n // Mock data - replace with actual API call\n this.discountRules.set([\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' },\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' },\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' }\n ]);\n }\n\n openRuleModal(): void {\n this.editingRule.set(null);\n this.ruleForm.reset({ discount_type: 'PERCENTAGE', priority: 1, applies_to: ['ALL'] });\n this.showRuleModal.set(true);\n }\n\n closeRuleModal(): void {\n this.showRuleModal.set(false);\n }\n\n editRule(rule: any): void {\n this.editingRule.set(rule);\n this.ruleForm.patchValue(rule);\n this.showRuleModal.set(true);\n }\n\n saveRule(): void {\n if (this.ruleForm.valid) {\n console.log('Saving rule:', this.ruleForm.value);\n this.closeRuleModal();\n this.loadDiscountRules();\n }\n }\n\n toggleRuleStatus(rule: any): void {\n console.log('Toggle status:', rule);\n }\n\n deleteRule(rule: any): void {\n if (confirm('Are you sure you want to delete this rule?')) {\n console.log('Delete rule:', rule);\n }\n }\n}\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 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: '',\n name: '',\n class: '',\n section: '',\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 -->\n<div class=\"tw-w-full tw-h-full\">\n <div class=\"tw-w-full tw-table tw-h-full tw-bg-transparent\">\n\n <!-- Header Section -->\n <div class=\"tw-table-row tw-w-full tw-h-0\">\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\">\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\">\n \n <!-- Title -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">payment</cide-ele-icon>\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Online Fee Payment</h5>\n </div>\n\n <!-- Actions -->\n <div class=\"tw-flex tw-items-center tw-gap-3\">\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"cancel()\" leftIcon=\"arrow_back\">\n Back to Statement\n </button>\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-grid tw-grid-cols-1 lg:tw-grid-cols-2 tw-gap-6\">\n \n <!-- Left Panel - Fee Selection -->\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\">\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\">Select Fees to Pay</h6>\n </div>\n \n <!-- Quick Actions -->\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\">\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"selectAll()\">\n Select All\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"selectOverdue()\">\n Select Overdue\n </button>\n <button cideEleButton type=\"button\" variant=\"ghost\" size=\"xs\" (click)=\"clearSelection()\">\n Clear\n </button>\n </div>\n\n <!-- Fee Items List -->\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-space-y-3\">\n @if (outstandingFees().length === 0) {\n <div class=\"tw-text-center tw-py-8 tw-text-gray-500\">\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>\n <p class=\"tw-text-sm\">No outstanding fees</p>\n </div>\n } @else {\n @for (fee of outstandingFees(); track fee.id) {\n <div class=\"tw-p-3 tw-rounded-lg tw-border-2 tw-cursor-pointer tw-transition-colors\"\n [class.tw-border-blue-500]=\"isSelected(fee)\"\n [class.tw-bg-blue-50]=\"isSelected(fee)\"\n [class.tw-border-yellow-400]=\"!isSelected(fee) && isOverdue(fee)\"\n [class.tw-bg-yellow-50]=\"!isSelected(fee) && isOverdue(fee)\"\n [class.tw-border-gray-200]=\"!isSelected(fee) && !isOverdue(fee)\"\n (click)=\"toggleFee(fee)\">\n <div class=\"tw-flex tw-items-start tw-justify-between tw-gap-3\">\n <div class=\"tw-flex tw-items-start tw-gap-3 tw-flex-1\">\n <input \n type=\"checkbox\" \n [checked]=\"isSelected(fee)\"\n (change)=\"toggleFee(fee); $event.stopPropagation()\"\n class=\"tw-mt-1\">\n <div class=\"tw-flex-1\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-mb-1\">\n <span class=\"tw-font-medium tw-text-gray-900\">{{ fee.fee_head }}</span>\n @if (isOverdue(fee)) {\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\">\n Overdue\n </span>\n }\n </div>\n <div class=\"tw-text-xs tw-text-gray-600\">\n Due Date: {{ fee.due_date | date:'dd/MM/yyyy' }}\n </div>\n @if (fee.late_fee > 0) {\n <div class=\"tw-text-xs tw-text-red-600 tw-mt-1\">\n Late Fee: {{ formatCurrency(fee.late_fee) }}\n </div>\n }\n </div>\n </div>\n <div class=\"tw-text-right\">\n <div class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(fee.outstanding) }}</div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n </div>\n\n <!-- Right Panel - Payment Summary & Gateway -->\n <div class=\"tw-space-y-4\">\n \n <!-- Payment Summary Card -->\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 Summary</h6>\n </div>\n <div class=\"tw-p-4 tw-space-y-3\">\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-600\">Selected Items</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ selectedCount() }}</span>\n </div>\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-600\">Fee Amount</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(totalFeeAmount()) }}</span>\n </div>\n @if (totalLateFee() > 0) {\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-text-red-600\">\n <span>Late Fee</span>\n <span class=\"tw-font-medium\">{{ formatCurrency(totalLateFee()) }}</span>\n </div>\n }\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-font-semibold tw-pt-2 tw-border-t tw-border-gray-200\">\n <span>Subtotal</span>\n <span>{{ formatCurrency(subtotal()) }}</span>\n </div>\n @if (convenienceFee() > 0) {\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\n <span class=\"tw-text-gray-600\">Convenience Fee (2%)</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(convenienceFee()) }}</span>\n </div>\n }\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\">\n <span>Total Payable</span>\n <span>{{ formatCurrency(totalPayable()) }}</span>\n </div>\n </div>\n </div>\n\n <!-- Payment Method Selection -->\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\">Select Payment Method</h6>\n </div>\n <div class=\"tw-p-4\">\n <form [formGroup]=\"paymentForm\" class=\"tw-space-y-4\">\n \n <!-- Payment Method Cards -->\n <div class=\"tw-grid tw-grid-cols-3 tw-gap-3 tw-mb-4\">\n @for (method of paymentMethodOptions; track method.value) {\n <button\n type=\"button\"\n class=\"tw-p-4 tw-rounded-lg tw-border-2 tw-text-center tw-transition-colors\"\n [class.tw-border-blue-500]=\"selectedPaymentMethod() === method.value\"\n [class.tw-bg-blue-50]=\"selectedPaymentMethod() === method.value\"\n [class.tw-border-gray-200]=\"selectedPaymentMethod() !== method.value\"\n (click)=\"selectPaymentMethod(method.value)\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-mx-auto tw-mb-2\"\n [class.tw-text-blue-600]=\"selectedPaymentMethod() === method.value\"\n [class.tw-text-gray-400]=\"selectedPaymentMethod() !== method.value\">\n @switch (method.value) {\n @case ('UPI') { account_balance_wallet }\n @case ('CARD') { credit_card }\n @case ('NET_BANKING') { account_balance }\n }\n </cide-ele-icon>\n <div class=\"tw-text-xs tw-font-medium\">{{ method.label }}</div>\n </button>\n }\n </div>\n\n <!-- UPI Details -->\n @if (selectedPaymentMethod() === 'UPI') {\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200\">\n <cide-ele-input\n label=\"UPI ID\"\n formControlName=\"upi_id\"\n placeholder=\"username@upi\"\n size=\"sm\"\n [required]=\"true\">\n </cide-ele-input>\n </div>\n }\n\n <!-- Card Details -->\n @if (selectedPaymentMethod() === 'CARD') {\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200 tw-space-y-3\">\n <cide-ele-input\n label=\"Card Number\"\n formControlName=\"card_number\"\n placeholder=\"1234 5678 9012 3456\"\n size=\"sm\"\n maxLength=\"19\"\n [required]=\"true\">\n </cide-ele-input>\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\n <cide-ele-input\n label=\"Expiry Date\"\n formControlName=\"expiry\"\n placeholder=\"MM/YY\"\n size=\"sm\"\n maxLength=\"5\"\n [required]=\"true\">\n </cide-ele-input>\n <cide-ele-input\n label=\"CVV\"\n formControlName=\"cvv\"\n type=\"password\"\n placeholder=\"***\"\n size=\"sm\"\n maxLength=\"3\"\n [required]=\"true\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n <!-- Net Banking Details -->\n @if (selectedPaymentMethod() === 'NET_BANKING') {\n <div class=\"tw-p-3 tw-bg-blue-50 tw-rounded-lg tw-border tw-border-blue-200\">\n <cide-ele-select\n label=\"Select Bank\"\n formControlName=\"bank\"\n [options]=\"bankOptions\"\n size=\"sm\"\n placeholder=\"Select Bank\"\n [required]=\"true\">\n </cide-ele-select>\n </div>\n }\n\n <!-- Action Buttons -->\n <div class=\"tw-flex tw-gap-3 tw-pt-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"sm\" (click)=\"cancel()\" class=\"tw-flex-1\">\n Cancel\n </button>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" (click)=\"proceedToPayment()\"\n [disabled]=\"!canProceed() || submitting()\" [loading]=\"submitting()\" class=\"tw-flex-1\" leftIcon=\"payment\">\n Pay {{ formatCurrency(totalPayable()) }}\n </button>\n </div>\n\n <!-- Security Info -->\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-2 tw-pt-2 tw-text-xs tw-text-gray-500\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">lock</cide-ele-icon>\n <span>Secure payment powered by Razorpay</span>\n </div>\n </form>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\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","CurrencyPipe"],"mappings":"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"}