cloud-ide-fees 0.0.41 → 0.0.44
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.
- package/fesm2022/{cloud-ide-fees-cloud-ide-fees-Cyb9Q9l7.mjs → cloud-ide-fees-cloud-ide-fees-DwymPnFD.mjs} +18 -16
- package/fesm2022/cloud-ide-fees-cloud-ide-fees-DwymPnFD.mjs.map +1 -0
- package/fesm2022/{cloud-ide-fees-discount-rule-manager.component-CTgMTze9.mjs → cloud-ide-fees-discount-rule-manager.component-B2322yJN.mjs} +3 -3
- package/fesm2022/{cloud-ide-fees-discount-rule-manager.component-CTgMTze9.mjs.map → cloud-ide-fees-discount-rule-manager.component-B2322yJN.mjs.map} +1 -1
- package/fesm2022/cloud-ide-fees.mjs +1 -1
- package/package.json +1 -1
- package/README.md +0 -63
- package/fesm2022/cloud-ide-fees-cloud-ide-fees-Cyb9Q9l7.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-ide-fees-cloud-ide-fees-DwymPnFD.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/discount-management/services/discount-rule.service.ts","../../../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/shared/components/student-selection-wrapper/student-selection-wrapper.component.ts","../../../projects/cloud-ide-fees/src/lib/shared/components/student-selection-wrapper/student-selection-wrapper.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-rule-manager/discount-rule-manager.component').then(c => c.DiscountRuleManagerComponent),\n title: 'Discount Rules Management',\n canActivate: [authGuard],\n data: { sypg_page_code: \"fee_discount_rule\" }\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: 'online-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: 'online-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","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 // Register dependencies on rights for reactivity\n this.canCreate();\n this.canEdit();\n this.canView();\n this.canDelete();\n\n return {\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: 'auto',\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\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 | string) => {\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 @if (canCreate()) {\n <button cideEleButton variant=\"primary\" size=\"xs\" leftIcon=\"add\" (click)=\"createFeeStructure()\" [adaptive]=\"true\">\n Create Fee Structure\n </button>\n\n }\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\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.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 [items]=\"getActionDropdownItems(row)\" [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>","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: [100], // 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 | string) => {\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 | string) => {\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 | string) => {\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 | string) => {\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=\"xs\" (click)=\"onCancel()\" leftIcon=\"arrow_back\" [adaptive]=\"true\">\n Back to List\n </button>\n\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';\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 MFeeStructure\r\n} from 'cloud-ide-lms-model';\r\n\r\n// Types for fee assignment (to be replaced with actual model types when available)\r\nexport interface FeeAssignment {\r\n _id?: string;\r\n feeas_student_id_auth?: string | { _id?: string; name?: string; class?: string; section?: string };\r\n feeas_fee_structure_id_feest?: string | { _id?: string; fees_structure_name?: string }; // Updated to match schema\r\n feeas_fee_structure_item_id_feesi?: string; // Updated to match schema\r\n feeas_academic_year_id_acayr?: string;\r\n feeas_entity_id_syen?: string;\r\n feeas_fee_category_sygms?: any;\r\n feeas_class_program_id_acacpm?: any;\r\n feeas_section_id_acapts?: any;\r\n feeas_fee_name?: string;\r\n feeas_fee_description?: string;\r\n feeas_fee_type?: string;\r\n feeas_original_amount?: number;\r\n feeas_amount_after_discount?: number;\r\n feeas_discount_amount?: number;\r\n feeas_scholarship_amount?: number;\r\n feeas_tax_amount?: number;\r\n feeas_final_amount?: number;\r\n feeas_total_amount?: number; // Backend alias\r\n feeas_due_date?: Date;\r\n feeas_collection_start_date?: Date;\r\n feeas_collection_end_date?: Date;\r\n feeas_installment_count?: number;\r\n feeas_payment_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\r\n feeas_amount_paid?: number;\r\n feeas_amount_remaining?: number;\r\n feeas_outstanding_amount?: number; // Backend alias\r\n feeas_late_fee_applied?: number;\r\n feeas_remarks?: string;\r\n feeas_isactive?: boolean;\r\n feeas_assigned_by_user?: string;\r\n feeas_assigned_at?: Date;\r\n feeas_updated_at?: Date;\r\n student_name?: string;\r\n student_id?: string;\r\n class?: string;\r\n section?: string;\r\n fee_structure_name?: string;\r\n}\r\n\r\nexport interface FeeAssignmentListPayload extends MFeeStructure {\r\n feeas_id?: string;\r\n feeas_student_id_auth?: string;\r\n feeas_fee_structure_id_feest?: string; // Updated to match schema\r\n feeas_payment_status?: string;\r\n}\r\n\r\nexport interface FeeAssignmentInsertUpdatePayload {\r\n _id?: string;\r\n feeas_student_id_auth?: string;\r\n feeas_fee_structure_id_feest?: string; // Updated to match schema field name\r\n feeas_fee_structure_item_id_feesi?: string; // Updated to match schema field name\r\n feeas_academic_year_id_acayr?: string;\r\n feeas_entity_id_syen?: string;\r\n feeas_fee_category_sygms?: string;\r\n feeas_fee_name?: string;\r\n feeas_fee_description?: string;\r\n feeas_fee_type?: string;\r\n feeas_original_amount?: number;\r\n feeas_amount_after_discount?: number;\r\n feeas_discount_amount?: number;\r\n feeas_scholarship_amount?: number;\r\n feeas_tax_amount?: number;\r\n feeas_final_amount?: number;\r\n feeas_due_date?: Date | string;\r\n feeas_collection_start_date?: Date | string;\r\n feeas_collection_end_date?: Date | string;\r\n feeas_installment_count?: number;\r\n feeas_payment_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\r\n feeas_remarks?: string;\r\n feeas_isactive?: boolean;\r\n}\r\n\r\nexport interface FeeAssignmentControllerResponse {\r\n success: boolean;\r\n code: number;\r\n data: FeeAssignment[];\r\n total?: number;\r\n message?: string;\r\n}\r\n\r\nexport interface FeeAssignmentByIdControllerResponse {\r\n success: boolean;\r\n code: number;\r\n data: FeeAssignment;\r\n message?: string;\r\n}\r\n\r\nexport interface FeeAssignmentInsertUpdateControllerResponse {\r\n success: boolean;\r\n code: number;\r\n data: FeeAssignment;\r\n message?: string;\r\n}\r\n\r\nexport interface FeeAssignmentDeletePayload {\r\n feeas_id: string;\r\n}\r\n\r\nexport interface FeeAssignmentDeleteControllerResponse {\r\n success: boolean;\r\n code: number;\r\n message?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideFeeFeeAssignmentService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Get list of fee assignments\r\n * @param payload - Query parameters for filtering/pagination\r\n * @returns Observable of fee assignment list response\r\n */\r\n getFeeAssignmentList(payload: FeeAssignmentListPayload): Observable<FeeAssignmentControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.assignment,\r\n query\r\n ]);\r\n\r\n return this.http.get<FeeAssignmentControllerResponse>(url);\r\n }\r\n\r\n /**\r\n * Get fee assignment by ID\r\n * @param assignmentId - Fee assignment ID\r\n * @returns Observable of fee assignment data\r\n */\r\n getFeeAssignmentById(assignmentId: string): Observable<FeeAssignmentByIdControllerResponse> {\r\n const query = generateStringFromObject({ feeas_id: assignmentId });\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.assignment,\r\n 'byId',\r\n query\r\n ]);\r\n\r\n return this.http.get<FeeAssignmentByIdControllerResponse>(url);\r\n }\r\n\r\n /**\r\n * Create or update fee assignment\r\n * @param data - Fee assignment data to save\r\n * @returns Observable of the save response\r\n */\r\n saveUpdateFeeAssignment(data: FeeAssignmentInsertUpdatePayload): Observable<FeeAssignmentInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.assignment\r\n ]);\r\n\r\n return this.http.post<FeeAssignmentInsertUpdateControllerResponse>(url, data);\r\n }\r\n\r\n /**\r\n * Delete fee assignment\r\n * @param assignmentId - Fee assignment ID\r\n * @returns Observable of the delete response\r\n */\r\n deleteFeeAssignment(assignmentId: string): Observable<FeeAssignmentDeleteControllerResponse> {\r\n const query = generateStringFromObject({ feeas_id: assignmentId });\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.assignment,\r\n 'delete',\r\n query\r\n ]);\r\n\r\n return this.http.delete<FeeAssignmentDeleteControllerResponse>(url);\r\n }\r\n\r\n /**\r\n * Waive fee assignment\r\n * @param assignmentId - Fee assignment ID\r\n * @returns Observable of the waive response\r\n */\r\n waiveFeeAssignment(assignmentId: string): Observable<FeeAssignmentInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.assignment,\r\n 'waive'\r\n ]);\r\n\r\n return this.http.patch<FeeAssignmentInsertUpdateControllerResponse>(url, { feeas_id: assignmentId });\r\n }\r\n}\r\n\r\n","import {\r\n Component,\r\n signal,\r\n computed,\r\n viewChild,\r\n TemplateRef,\r\n DestroyRef,\r\n inject,\r\n OnInit,\r\n type OnDestroy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n CideEleDataGridComponent,\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideSelectComponent,\r\n type GridConfiguration,\r\n type GridEvent,\r\n CideEleDropdownComponent,\r\n type DropdownItem,\r\n type TemplateContext,\r\n type DropdownConfig,\r\n ConfirmationService,\r\n NotificationService\r\n} from 'cloud-ide-element';\r\nimport {\r\n generateStringFromObject\r\n} from 'cloud-ide-lms-model';\r\nimport { AppStateHelperService, CideLytSharedWrapperComponent, RightsService, AppStateService } from 'cloud-ide-layout';\r\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';\r\nimport { CideFeeFeeAssignmentService } from '../../services/fee-assignment.service';\r\n\r\n// Types\r\ninterface FeeAssignmentData {\r\n _id?: string;\r\n feeas_student_id_auth?: string;\r\n student_name?: string;\r\n student_id?: string;\r\n class?: string;\r\n section?: string;\r\n fee_structure_name?: string;\r\n feeas_amount_original?: number;\r\n feeas_amount_discount?: number;\r\n feeas_amount_scholarship?: number;\r\n feeas_amount_paid?: number;\r\n feeas_amount_remaining?: number;\r\n feeas_due_date?: Date;\r\n feeas_payment_status?: 'PENDING' | 'PARTIALLY_PAID' | 'PAID' | 'WAIVED' | 'CANCELLED';\r\n}\r\n\r\n@Component({\r\n selector: 'cide-fee-assignment-list',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideEleDataGridComponent,\r\n CideEleDropdownComponent,\r\n CideSelectComponent,\r\n CideLytSharedWrapperComponent\r\n ],\r\n templateUrl: './fee-assignment-list.component.html',\r\n styles: [`\r\n .fee-assignment-listing-container {\r\n @apply tw-w-full tw-h-full;\r\n }\r\n \r\n :host {\r\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\r\n }\r\n `]\r\n})\r\nexport class FeeAssignmentListComponent implements OnInit, OnDestroy {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly router = inject(Router);\r\n private readonly appState = inject(AppStateHelperService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly notificationService = inject(NotificationService);\r\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\r\n private readonly classProgramService = inject<IClassProgramMasterService>(CLASS_PROGRAM_MASTER_SERVICE_TOKEN);\r\n private readonly programTermSectionService = inject<IProgramTermSectionService>(PROGRAM_TERM_SECTION_SERVICE_TOKEN);\r\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\r\n private readonly rightsService = inject(RightsService);\r\n private readonly appStateService = inject(AppStateService);\r\n\r\n readonly studentDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('studentDetailsRendererTemplate');\r\n readonly amountRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('amountRendererTemplate');\r\n readonly dateRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('dateRendererTemplate');\r\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\r\n readonly actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\r\n\r\n // Breadcrumb data for shared wrapper\r\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\r\n\r\n readonly feeAssignments = signal<FeeAssignmentData[]>([]);\r\n readonly loading = signal<boolean>(false);\r\n readonly error = signal<string | null>(null);\r\n\r\n readonly currentPage = signal<number>(1);\r\n readonly pageSize = signal<number>(10);\r\n readonly totalItems = signal<number>(0);\r\n readonly totalPages = signal<number>(0);\r\n\r\n readonly searchQuery = signal<string>('');\r\n readonly sortColumn = signal<string>('student_name');\r\n readonly sortDirection = signal<'asc' | 'desc'>('asc');\r\n\r\n readonly selectedStatusFilter = signal<string>('');\r\n readonly selectedAcademicYearFilter = signal<string>('');\r\n readonly selectedClassFilter = signal<string>('');\r\n readonly selectedSectionFilter = signal<string>('');\r\n\r\n readonly academicYearOptions = signal<Array<{ value: string; label: string }>>([]);\r\n readonly classOptions = signal<Array<{ value: string; label: string }>>([]);\r\n readonly sectionOptions = signal<Array<{ value: string; label: string }>>([]);\r\n\r\n readonly stats = computed(() => ({\r\n total: this.feeAssignments().length,\r\n pending: this.feeAssignments().filter(a => a.feeas_payment_status === 'PENDING').length,\r\n partial: this.feeAssignments().filter(a => a.feeas_payment_status === 'PARTIALLY_PAID').length,\r\n paid: this.feeAssignments().filter(a => a.feeas_payment_status === 'PAID').length\r\n }));\r\n\r\n readonly gridConfig = computed<GridConfiguration<FeeAssignmentData>>(() => {\r\n // Register dependencies on rights for reactivity\r\n this.canCreate();\r\n this.canEdit();\r\n this.canView();\r\n this.canDelete();\r\n this.canBulkAssign();\r\n\r\n return {\r\n id: 'fee-assignment-list-grid',\r\n columns: [\r\n\r\n {\r\n key: 'student',\r\n header: 'Student Details',\r\n type: 'custom',\r\n width: 'auto',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'studentDetailsRenderer',\r\n sortable: true,\r\n groupable: true,\r\n valueGetter: 'student_name'\r\n },\r\n {\r\n key: 'fee_structure_name',\r\n header: 'Fee Structure',\r\n type: 'text',\r\n width: '200px',\r\n truncate: true,\r\n align: 'left',\r\n sortable: true,\r\n groupable: true\r\n },\r\n {\r\n key: 'total_amount',\r\n header: 'Total Amount',\r\n type: 'custom',\r\n width: '150px',\r\n truncate: false,\r\n align: 'right',\r\n renderer: 'amountRenderer',\r\n sortable: true,\r\n aggregatable: true,\r\n aggregationType: 'sum',\r\n formatter: { type: 'currency', format: 'INR' },\r\n valueGetter: 'feeas_amount_original'\r\n },\r\n {\r\n key: 'feeas_amount_paid',\r\n header: 'Paid Amount',\r\n type: 'number',\r\n width: '150px',\r\n align: 'right',\r\n sortable: true,\r\n aggregatable: true,\r\n aggregationType: 'sum',\r\n formatter: { type: 'currency', format: 'INR' }\r\n },\r\n {\r\n key: 'feeas_amount_remaining',\r\n header: 'Outstanding Amount',\r\n type: 'number',\r\n width: '150px',\r\n align: 'right',\r\n sortable: true,\r\n aggregatable: true,\r\n aggregationType: 'sum',\r\n formatter: { type: 'currency', format: 'INR' }\r\n },\r\n\r\n {\r\n key: 'feeas_due_date',\r\n header: 'Due Date',\r\n type: 'custom',\r\n width: '120px',\r\n truncate: false,\r\n align: 'left',\r\n renderer: 'dateRenderer',\r\n sortable: true\r\n },\r\n {\r\n key: 'feeas_payment_status',\r\n header: 'Status',\r\n type: 'custom',\r\n width: '140px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'statusRenderer'\r\n },\r\n {\r\n key: 'actions',\r\n header: 'Actions',\r\n type: 'custom',\r\n width: '80px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'actionsDropdownRenderer'\r\n }\r\n ],\r\n data: this.feeAssignments(),\r\n trackBy: '_id',\r\n pagination: {\r\n enabled: true,\r\n pageSize: this.pageSize(),\r\n pageSizeOptions: [10, 25, 50, 100],\r\n showQuickJump: true,\r\n showPageInfo: true,\r\n showRefresh: true\r\n },\r\n search: {\r\n enabled: true,\r\n placeholder: 'Search by student name, ID...',\r\n searchableColumns: ['student_name', 'student_id'],\r\n debounceMs: 300,\r\n showClearButton: true\r\n },\r\n loading: {\r\n useDefer: true,\r\n skeletonRows: 5,\r\n showOverlay: this.loading()\r\n },\r\n scroll: {\r\n enabled: true,\r\n maxHeight: '',\r\n minHeight: '',\r\n stickyHeader: true,\r\n virtualScroll: false,\r\n rowHeight: 50\r\n },\r\n export: {\r\n enabled: true,\r\n formats: ['csv', 'excel', 'pdf'],\r\n filename: 'fee-assignments',\r\n includeHeaders: true\r\n },\r\n responsive: true,\r\n striped: false,\r\n bordered: true,\r\n compact: false,\r\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\r\n };\r\n });\r\n\r\n // Rights computed signals\r\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\r\n canBulkAssign = computed(() => this.rightsService.hasRight('BULK_ASSIGN'));\r\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\r\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\r\n canView = computed(() => this.rightsService.hasRight('VIEW'));\r\n\r\n ngOnInit(): void {\r\n // Initialize rights for fee assignment management\r\n this.rightsService.initializeRights('fee_assignment');\r\n console.log('💰 Fee Assignment List Component initialized');\r\n\r\n // Debug Rights\r\n setTimeout(() => {\r\n console.log('🔐 Rights Debug:', {\r\n create: this.rightsService.hasRight('CREATE'),\r\n edit: this.rightsService.hasRight('EDIT'),\r\n view: this.rightsService.hasRight('VIEW'),\r\n delete: this.rightsService.hasRight('DELETE')\r\n });\r\n }, 1000);\r\n\r\n this.initializeBreadcrumbData();\r\n this.loadDropdownOptions();\r\n this.loadFeeAssignments();\r\n }\r\n\r\n private initializeBreadcrumbData(): void {\r\n this.breadcrumbData.set([\r\n {\r\n id: 'list',\r\n label: 'List',\r\n icon: 'list',\r\n url: undefined\r\n }\r\n ]);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup if needed\r\n }\r\n\r\n private loadDropdownOptions(): void {\r\n const entityId = this.appStateService.getActiveEntityValue()?._id;\r\n\r\n // Load academic years\r\n this.academicYearService.getAcademicYearList({\r\n pageIndex: 1,\r\n pageSize: 100,\r\n pagination: false,\r\n // Assuming academic year service might accept entity filter if updated, but keeping standard for now\r\n // If backend supports filtering ACAYR by entity, add it here.\r\n }).subscribe({\r\n next: (response) => {\r\n if (response?.success && response.data) {\r\n this.academicYearOptions.set(response.data.map(ay => ({\r\n value: ay._id || '',\r\n label: `${ay.acayr_name || ''} (${ay.acayr_code || ''})`\r\n })));\r\n }\r\n }\r\n });\r\n\r\n // Load class programs with Entity Context\r\n const classPayload: any = { pagination: false };\r\n if (entityId) {\r\n classPayload.acacpm_entity_id_syen = entityId;\r\n }\r\n\r\n this.classProgramService.searchClassProgramMasters(classPayload).subscribe({\r\n next: (response) => {\r\n if (response?.success && response.data) {\r\n this.classOptions.set(response.data.map(cp => ({\r\n value: cp._id || '',\r\n label: cp.acacpm_alise_title || ''\r\n })));\r\n }\r\n }\r\n });\r\n }\r\n\r\n loadFeeAssignments(): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n const entityId = this.appStateService.getActiveEntityValue()?._id;\r\n\r\n const payload: any = {\r\n pagination: true,\r\n pageIndex: this.currentPage(),\r\n pageSize: this.pageSize(),\r\n query: this.searchQuery() || '',\r\n feeas_payment_status: this.selectedStatusFilter() || undefined,\r\n feeas_academic_year_id_acayr: this.selectedAcademicYearFilter() || undefined,\r\n feeas_class_program_id_acacpm: this.selectedClassFilter() || undefined,\r\n feeas_section_id_acapts: this.selectedSectionFilter() || undefined,\r\n feeas_entity_id_syen: entityId || undefined\r\n };\r\n\r\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data) {\r\n // Transform API response to component format\r\n this.feeAssignments.set(\r\n response.data.map((item: any) => ({\r\n _id: item._id,\r\n feeas_student_id_auth: item.feeas_student_id_auth,\r\n student_name: item.student_name ||\r\n (item.feeas_admission_id_admap ?\r\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]\r\n .filter(n => !!n).join(' ') : null) ||\r\n (item.feeas_student_id_auth?.user_fullname) ||\r\n (item.feeas_student_id_auth?.user_firstname ?\r\n [item.feeas_student_id_auth.user_firstname, item.feeas_student_id_auth.user_lastname].filter(n => !!n).join(' ') : null) ||\r\n 'N/A',\r\n student_id: (typeof item.feeas_student_id_auth === 'string' ? item.feeas_student_id_auth : (item.feeas_student_id_auth?.user_username || item.feeas_student_id_auth?._id)) || '',\r\n class: this.formatClassDetails(item),\r\n section: item.section || item.feeas_section_id_acapts?.acapts_name || 'N/A',\r\n fee_structure_name: item.fee_structure_name || item.feeas_fee_structure_id_feest?.fees_structure_name || item.feeas_fee_name || 'N/A',\r\n feeas_amount_original: item.feeas_original_amount || item.feeas_total_amount || 0,\r\n feeas_amount_discount: item.feeas_discount_amount || 0,\r\n feeas_amount_scholarship: item.feeas_scholarship_amount || 0,\r\n feeas_amount_paid: item.feeas_paid_amount || 0,\r\n feeas_amount_remaining: item.feeas_outstanding_amount ?? ((item.feeas_total_amount || 0) - (item.feeas_paid_amount || 0)),\r\n feeas_due_date: item.feeas_due_date ? new Date(item.feeas_due_date) : undefined,\r\n feeas_payment_status: item.feeas_payment_status || item.feeas_status || 'PENDING'\r\n }))\r\n );\r\n this.totalItems.set(response.total || response.data.length);\r\n this.totalPages.set(Math.ceil((response.total || response.data.length) / this.pageSize()));\r\n } else {\r\n this.feeAssignments.set([]);\r\n this.totalItems.set(0);\r\n this.totalPages.set(0);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Error loading fee assignments:', err);\r\n this.error.set('Failed to load fee assignments');\r\n this.notificationService.error('Failed to load fee assignments');\r\n this.feeAssignments.set([]);\r\n this.totalItems.set(0);\r\n this.totalPages.set(0);\r\n },\r\n complete: () => {\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\r\n studentDetailsRenderer: this.studentDetailsRendererTemplate(),\r\n amountRenderer: this.amountRendererTemplate(),\r\n dateRenderer: this.dateRendererTemplate(),\r\n statusRenderer: this.statusRendererTemplate(),\r\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate()\r\n }));\r\n\r\n onGridEvent(event: GridEvent<any>): void {\r\n switch (event.type) {\r\n case 'pageChange':\r\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\r\n this.currentPage.set(event.data['pageIndex'] as number);\r\n this.pageSize.set(event.data['pageSize'] as number);\r\n this.loadFeeAssignments();\r\n }\r\n break;\r\n case 'search':\r\n this.searchQuery.set(event.data as string);\r\n this.currentPage.set(1);\r\n this.loadFeeAssignments();\r\n break;\r\n case 'refresh':\r\n this.loadFeeAssignments();\r\n break;\r\n case 'sort':\r\n if (event.data && typeof event.data === 'object' && 'column' in event.data && 'direction' in event.data) {\r\n this.sortColumn.set(event.data['column'] as string);\r\n this.sortDirection.set(event.data['direction'] as 'asc' | 'desc');\r\n this.currentPage.set(1);\r\n this.loadFeeAssignments();\r\n }\r\n break;\r\n case 'export':\r\n if (event.data && typeof event.data === 'string') {\r\n this.handleExport(event.data);\r\n }\r\n break;\r\n default:\r\n console.log('🔄 Unhandled grid event:', event.type);\r\n }\r\n }\r\n\r\n onStatusFilterChange(value: string | number | string[] | null | undefined): void {\r\n this.selectedStatusFilter.set(String(value || ''));\r\n this.currentPage.set(1);\r\n this.loadFeeAssignments();\r\n }\r\n\r\n onAcademicYearFilterChange(value: string | number | string[] | null | undefined): void {\r\n this.selectedAcademicYearFilter.set(String(value || ''));\r\n this.currentPage.set(1);\r\n this.loadFeeAssignments();\r\n }\r\n\r\n onClassFilterChange(value: string | number | string[] | null | undefined): void {\r\n this.selectedClassFilter.set(String(value || ''));\r\n this.currentPage.set(1);\r\n this.loadFeeAssignments();\r\n // Load sections when class filter changes\r\n this.selectedSectionFilter.set(''); // Reset section filter\r\n this.loadSections();\r\n }\r\n\r\n loadSections(): void {\r\n const classProgramId = this.selectedClassFilter();\r\n const entityId = this.appStateService.getActiveEntityValue()?._id;\r\n\r\n if (!classProgramId) {\r\n this.sectionOptions.set([]);\r\n return;\r\n }\r\n\r\n const payload: any = {\r\n pagination: false,\r\n acapts_program_id_acacpm: classProgramId,\r\n acapts_is_active: true\r\n };\r\n\r\n if (entityId) {\r\n payload.acapts_entity_id_syen = entityId;\r\n }\r\n\r\n this.programTermSectionService.getProgramTermSectionList(payload).subscribe({\r\n next: (response) => {\r\n if (response?.success && response.data) {\r\n this.sectionOptions.set(response.data.map(sec => ({\r\n value: sec._id || '',\r\n label: sec.acapts_name || ''\r\n })));\r\n } else {\r\n this.sectionOptions.set([]);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Error loading sections:', err);\r\n this.sectionOptions.set([]);\r\n }\r\n });\r\n }\r\n\r\n onSectionFilterChange(value: string | number | string[] | null | undefined): void {\r\n this.selectedSectionFilter.set(String(value || ''));\r\n this.currentPage.set(1);\r\n this.loadFeeAssignments();\r\n }\r\n\r\n clearFilters(): void {\r\n this.selectedStatusFilter.set('');\r\n this.selectedAcademicYearFilter.set('');\r\n this.selectedClassFilter.set('');\r\n this.selectedSectionFilter.set('');\r\n this.searchQuery.set('');\r\n this.currentPage.set(1);\r\n this.loadFeeAssignments();\r\n }\r\n\r\n navigateToAssign(): void {\r\n if (!this.rightsService.hasRight('CREATE')) {\r\n this.notificationService.error('You do not have permission to create fee assignments');\r\n return;\r\n }\r\n this.router.navigate(['/control-panel/assignment/create']);\r\n }\r\n\r\n bulkAssign(): void {\r\n if (!this.rightsService.hasRight('BULK_ASSIGN')) {\r\n this.notificationService.error('You do not have permission to perform bulk assignments');\r\n return;\r\n }\r\n this.notificationService.info('Bulk assignment feature will open in a new window.');\r\n }\r\n\r\n viewDetails(assignment: FeeAssignmentData): void {\r\n if (!this.rightsService.hasRight('VIEW')) {\r\n this.notificationService.error('You do not have permission to view fee assignments');\r\n return;\r\n }\r\n console.log('View details:', assignment);\r\n const queryParams = generateStringFromObject({ feeas_id: assignment._id });\r\n this.router.navigate(['/control-panel/assignment/view', queryParams]);\r\n }\r\n\r\n modifyAssignment(assignment: FeeAssignmentData): void {\r\n if (!this.rightsService.hasRight('EDIT')) {\r\n this.notificationService.error('You do not have permission to modify fee assignments');\r\n return;\r\n }\r\n console.log('Modify assignment:', assignment);\r\n const queryParams = generateStringFromObject({ feeas_id: assignment._id });\r\n this.router.navigate(['/control-panel/assignment/edit', queryParams]);\r\n }\r\n\r\n waiveOff(assignment: FeeAssignmentData): void {\r\n if (!this.rightsService.hasRight('EDIT')) {\r\n this.notificationService.error('You do not have permission to waive fees');\r\n return;\r\n }\r\n this.confirmationService.ask({\r\n title: 'Waive Off Fee',\r\n message: `Are you sure you want to waive off the fee for ${assignment.student_name}? This action cannot be undone.`,\r\n confirmText: 'Waive Off',\r\n cancelText: 'Cancel',\r\n type: 'warning'\r\n }).then((confirmed: boolean | string) => {\r\n if (confirmed) {\r\n this.feeAssignmentService.waiveFeeAssignment(assignment._id || '').subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.notificationService.success('Fee waived off successfully.');\r\n this.loadFeeAssignments();\r\n } else {\r\n this.notificationService.error(response?.message || 'Failed to waive fee');\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Error waiving fee:', err);\r\n this.notificationService.error('Failed to waive fee. Please try again.');\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n getDropdownConfig(): DropdownConfig {\r\n return {\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm'\r\n };\r\n }\r\n\r\n getActionDropdownItems(assignment: FeeAssignmentData): DropdownItem[] {\r\n const items: DropdownItem[] = [];\r\n\r\n if (this.rightsService.hasRight('VIEW')) {\r\n items.push({\r\n id: 'view',\r\n label: 'View Details',\r\n icon: 'visibility',\r\n iconColor: 'tw-text-gray-400',\r\n textColor: 'tw-text-gray-700',\r\n hoverBgColor: 'hover:tw-bg-gray-100'\r\n });\r\n }\r\n\r\n if (this.rightsService.hasRight('EDIT')) {\r\n items.push({\r\n id: 'modify',\r\n label: 'Modify',\r\n icon: 'edit',\r\n iconColor: 'tw-text-blue-400',\r\n textColor: 'tw-text-blue-600',\r\n hoverBgColor: 'hover:tw-bg-blue-50'\r\n });\r\n\r\n items.push({\r\n id: 'waive',\r\n label: 'Waive Off',\r\n icon: 'cancel',\r\n iconColor: 'tw-text-red-400',\r\n textColor: 'tw-text-red-600',\r\n hoverBgColor: 'hover:tw-bg-red-50'\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n onDropdownItemClick(item: DropdownItem, assignment: FeeAssignmentData): void {\r\n switch (item.id) {\r\n case 'view':\r\n this.viewDetails(assignment);\r\n break;\r\n case 'modify':\r\n this.modifyAssignment(assignment);\r\n break;\r\n case 'waive':\r\n this.waiveOff(assignment);\r\n break;\r\n default:\r\n console.log('❓ Unknown dropdown item clicked:', item.id);\r\n }\r\n }\r\n\r\n private handleExport(format: string): void {\r\n console.log(`📤 Exporting fee assignments as ${format}`);\r\n // TODO: Implement export functionality\r\n }\r\n\r\n formatCurrency(amount: number | undefined): string {\r\n if (!amount) return '₹0.00';\r\n return `₹${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\r\n }\r\n\r\n formatDate(date: string | Date | null | undefined): string {\r\n if (!date) return '-';\r\n return new Date(date).toLocaleDateString('en-US', {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric'\r\n });\r\n }\r\n\r\n getStatusBadgeClass(assignment: FeeAssignmentData): string {\r\n switch (assignment.feeas_payment_status) {\r\n case 'PAID':\r\n return 'tw-bg-green-100 tw-text-green-800';\r\n case 'PARTIALLY_PAID':\r\n return 'tw-bg-blue-100 tw-text-blue-800';\r\n case 'PENDING':\r\n return 'tw-bg-yellow-100 tw-text-yellow-800';\r\n case 'WAIVED':\r\n return 'tw-bg-purple-100 tw-text-purple-800';\r\n case 'CANCELLED':\r\n return 'tw-bg-red-100 tw-text-red-800';\r\n default:\r\n return 'tw-bg-gray-100 tw-text-gray-800';\r\n }\r\n }\r\n\r\n getStatusText(assignment: FeeAssignmentData): string {\r\n return assignment.feeas_payment_status || 'Unknown';\r\n }\r\n private formatClassDetails(item: any): string {\r\n if (item.feeas_admission_id_admap) {\r\n const admission = item.feeas_admission_id_admap;\r\n const program = admission.admap_class_program_id_acacpm?.acacpm_alise_title || '';\r\n const term = admission.admap_class_program_term_id_acapt?.acapt_name || '';\r\n const branch = admission.admap_class_program_branch_id_acabrn?.acabrn_name || '';\r\n\r\n let details = program;\r\n if (term) details += ` (${term})`;\r\n if (branch) details += ` - ${branch}`;\r\n\r\n if (details) return details;\r\n }\r\n\r\n // Try to get from Fee Structure\r\n if (item.feeas_fee_structure_id_feest) {\r\n const fs = item.feeas_fee_structure_id_feest;\r\n const program = fs.fees_class_program_id_acacpm?.acacpm_alise_title || '';\r\n const term = fs.fees_class_program_term_id_acapt?.acapt_name || '';\r\n const branch = fs.fees_class_program_branch_id_acabrn?.acabrn_name || '';\r\n\r\n let details = program;\r\n if (term) details += ` (${term})`;\r\n if (branch) details += ` - ${branch}`;\r\n\r\n if (details) return details;\r\n }\r\n\r\n // Fallback to direct fields\r\n const directProgram = item.feeas_class_program_id_acacpm?.acacpm_alise_title || item.class || '';\r\n const directSection = item.feeas_section_id_acapts?.acapts_name || item.section || '';\r\n\r\n let directDetails = directProgram;\r\n if (directSection && directSection !== 'N/A') directDetails += ` - ${directSection}`;\r\n\r\n return directDetails || 'N/A';\r\n }\r\n}\r\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 @if (canCreate()) {\n <button cideEleButton variant=\"primary\" size=\"xs\" leftIcon=\"add\" (click)=\"navigateToAssign()\" [adaptive]=\"true\">\n Assign Fees\n </button>\n }\n @if (canBulkAssign()) {\n <button cideEleButton variant=\"secondary\" size=\"xs\" leftIcon=\"group_add\" (click)=\"bulkAssign()\" [adaptive]=\"true\">\n Bulk Assignment\n </button>\n }\n\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 @if (row.feeas_amount_scholarship > 0) {\n <div class=\"tw-text-xs tw-text-purple-600\">\n Scholarship: {{ formatCurrency(row.feeas_amount_scholarship) }}\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_payment_status === 'PAID' ? 'check_circle' :\n row.feeas_payment_status === 'PARTIALLY_PAID' ? 'schedule' :\n row.feeas_payment_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>","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 feeDiscountRuleControllerResponse,\r\n MFeeDiscountRule,\r\n feeDiscountRuleByIdControllerResponse,\r\n MFeeDiscountRuleGetByIdPayload,\r\n feeDiscountRuleInsertUpdateControllerResponse,\r\n MFeeDiscountRuleInsertUpdatePayload,\r\n feeDiscountRuleDeleteControllerResponse,\r\n MFeeDiscountRuleDeletePayload,\r\n feeDiscountRuleToggleStatusControllerResponse,\r\n MFeeDiscountRuleToggleStatusPayload\r\n} from 'cloud-ide-lms-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideFeeDiscountRuleService {\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Get list of discount rules\r\n * @param payload - Query parameters for filtering/pagination\r\n * @returns Observable of discount rule list response\r\n */\r\n getDiscountRuleList(payload: MFeeDiscountRule): Observable<feeDiscountRuleControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.discountRule,\r\n query\r\n ]);\r\n\r\n return this.http.get<feeDiscountRuleControllerResponse>(url);\r\n }\r\n\r\n /**\r\n * Get discount rule by ID\r\n * @param payload - Discount rule ID payload\r\n * @returns Observable of discount rule data\r\n */\r\n getDiscountRuleById(payload: MFeeDiscountRuleGetByIdPayload): Observable<feeDiscountRuleByIdControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.discountRule,\r\n 'byId',\r\n query\r\n ]);\r\n\r\n return this.http.get<feeDiscountRuleByIdControllerResponse>(url);\r\n }\r\n\r\n /**\r\n * Create or update discount rule\r\n * @param payload - Discount rule data\r\n * @returns Observable of operation result\r\n */\r\n saveDiscountRule(payload: MFeeDiscountRuleInsertUpdatePayload): Observable<feeDiscountRuleInsertUpdateControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.discountRule\r\n ]);\r\n\r\n return this.http.post<feeDiscountRuleInsertUpdateControllerResponse>(url, payload);\r\n }\r\n\r\n /**\r\n * Delete discount rule\r\n * @param payload - Discount rule ID payload\r\n * @returns Observable of operation result\r\n */\r\n deleteDiscountRule(payload: MFeeDiscountRuleDeletePayload): Observable<feeDiscountRuleDeleteControllerResponse> {\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.discountRule,\r\n 'delete',\r\n query\r\n ]);\r\n\r\n return this.http.delete<feeDiscountRuleDeleteControllerResponse>(url);\r\n }\r\n\r\n /**\r\n * Toggle discount rule status\r\n * @param payload - Discount rule ID payload\r\n * @returns Observable of operation result\r\n */\r\n toggleDiscountRuleStatus(payload: MFeeDiscountRuleToggleStatusPayload): Observable<feeDiscountRuleToggleStatusControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.discountRule,\r\n 'toggle-status'\r\n ]);\r\n\r\n return this.http.patch<feeDiscountRuleToggleStatusControllerResponse>(url, payload);\r\n }\r\n\r\n /**\r\n * Sync discount rule to existing assignments\r\n * @param payload - Discount rule ID payload\r\n * @returns Observable of operation result\r\n */\r\n syncDiscountRule(payload: { feedr_id: string }): Observable<any> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.discountRule,\r\n 'sync'\r\n ]);\r\n\r\n return this.http.post(url, payload);\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 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';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n NotificationService,\r\n CurrencyPipe\r\n} from 'cloud-ide-element';\r\nimport { CideFeeFeeStructureService } from '../../../collection/fee-structure-management/services/fee-structure.service';\r\nimport { CideFeeFeeAssignmentService } from '../../../collection/fee-assignment-management/services/fee-assignment.service';\r\nimport {\r\n type feeStructureByIdControllerResponse,\r\n type MFeeStructureGetByIdPayload,\r\n type FeeStructureByIdResponse,\r\n type FeeStructureResponse,\r\n type FeeStructureItem,\r\n type controllerResponse\r\n} from 'cloud-ide-lms-model';\r\nimport { RightsService } from 'cloud-ide-layout';\r\n\r\n// Partial interfaces to avoid 'any'\r\nexport interface PartialFeeStructureItem {\r\n feesi_item_name?: string;\r\n feesi_item_code?: string;\r\n feesi_description?: string;\r\n feesi_amount?: number;\r\n feesi_category_id_sygms?: { sygms_title?: string; _id?: string } | string | null;\r\n feesi_is_mandatory?: boolean;\r\n feesi_is_refundable?: boolean;\r\n feesi_is_amount_editable?: boolean;\r\n feesi_min_amount?: number;\r\n feesi_max_amount?: number;\r\n feesi_tax_applicable?: boolean;\r\n feesi_tax_percentage?: number;\r\n feesi_is_installment_allowed?: boolean;\r\n feesi_installment_count?: number;\r\n feesi_due_date_offset_days?: number;\r\n feesi_collection_start_offset_days?: number;\r\n feesi_collection_end_offset_days?: number;\r\n feesi_display_order?: number;\r\n}\r\n\r\nexport interface PartialFeeAssignment {\r\n _id?: string;\r\n fee_structure_name?: string;\r\n feeas_fee_structure_id_feest?: { fees_structure_name?: string } | string | null;\r\n feeas_fee_category_sygms?: string | null;\r\n feeas_fee_name?: string;\r\n feeas_fee_description?: string;\r\n feeas_original_amount?: number;\r\n feeas_total_amount?: number;\r\n feeas_final_amount?: number;\r\n feeas_discount_amount?: number;\r\n feeas_scholarship_amount?: number;\r\n feeas_assignment_date?: Date | string;\r\n feeas_installment_count?: number;\r\n feeas_due_date?: Date | string;\r\n feeas_collection_start_date?: Date | string;\r\n feeas_collection_end_date?: Date | string;\r\n}\r\n\r\n// Type for fee data (can be from fee structure item or fee assignment)\r\nexport type FeeDetailsData = {\r\n _id?: string;\r\n fees_structure_name?: string;\r\n fees_structure_code?: string;\r\n fees_category_name?: string;\r\n fees_amount?: number;\r\n fees_total_amount?: number;\r\n discount?: number;\r\n scholarship?: number;\r\n finalAmount?: number;\r\n _feeItemData?: PartialFeeStructureItem;\r\n _feeAssignmentData?: PartialFeeAssignment;\r\n // Optional flattened properties\r\n feesi_item_name?: string;\r\n feesi_item_code?: string;\r\n feesi_amount?: number;\r\n feesi_description?: string;\r\n feesi_category_id_sygms?: { sygms_title?: string; _id?: string } | string | null;\r\n};\r\n\r\n@Component({\r\n selector: 'cide-fee-details-viewer',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n CideIconComponent,\r\n CurrencyPipe\r\n ],\r\n template: `\r\n <div class=\"tw-p-4 tw-overflow-y-auto tw-h-full\">\r\n @if (loading()) {\r\n <div class=\"tw-text-center tw-py-12\">\r\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>\r\n <span class=\"tw-text-sm tw-text-gray-500\">Loading fee details...</span>\r\n </div>\r\n } @else if (error()) {\r\n <div class=\"tw-text-center tw-py-12\">\r\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>\r\n <p class=\"tw-text-sm tw-text-red-600\">{{ error() }}</p>\r\n </div>\r\n } @else {\r\n @if (feeDetails(); as details) {\r\n <div class=\"tw-space-y-4 tw-text-sm\">\r\n <!-- Basic Information -->\r\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\r\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Basic Information</h4>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Fee Name:</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.name }}</span>\r\n </div>\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Fee Code:</span>\r\n <span class=\"tw-text-gray-900\">{{ details.itemCode }}</span>\r\n </div>\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Category:</span>\r\n <span class=\"tw-text-gray-900\">{{ details.category }}</span>\r\n </div>\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Structure:</span>\r\n <span class=\"tw-text-gray-900\">{{ details.structureName }}</span>\r\n </div>\r\n </div>\r\n @if (details.description) {\r\n <div class=\"tw-mt-3 tw-pt-3 tw-border-t tw-border-gray-200\">\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Description:</span>\r\n <p class=\"tw-text-gray-900 tw-text-sm\">{{ details.description }}</p>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Amount Breakdown -->\r\n <div class=\"tw-bg-blue-50 tw-rounded-lg tw-p-3 tw-border tw-border-blue-200\">\r\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Amount Breakdown</h4>\r\n <div class=\"tw-space-y-2\">\r\n <div class=\"tw-flex tw-justify-between tw-items-center\">\r\n <span class=\"tw-text-gray-600\">Original Amount:</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.amount | currency }}</span>\r\n </div>\r\n @if (details.discount > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-items-center\">\r\n <span class=\"tw-text-gray-600\">Discount Applied:</span>\r\n <span class=\"tw-font-medium tw-text-blue-600\">-{{ details.discount | currency }}</span>\r\n </div>\r\n }\r\n @if (details.scholarship > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-items-center\">\r\n <span class=\"tw-text-gray-600\">Scholarship Applied:</span>\r\n <span class=\"tw-font-medium tw-text-purple-600\">-{{ details.scholarship | currency }}</span>\r\n </div>\r\n }\r\n @if (details.taxApplicable && details.taxPercentage > 0) {\r\n <div class=\"tw-flex tw-justify-between tw-items-center\">\r\n <span class=\"tw-text-gray-600\">Tax ({{ details.taxPercentage }}%):</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ (details.finalAmount * details.taxPercentage) / 100 | currency }}</span>\r\n </div>\r\n }\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-pt-2 tw-border-t tw-border-blue-200\">\r\n <span class=\"tw-font-semibold tw-text-gray-900\">Final Amount:</span>\r\n <span class=\"tw-font-bold tw-text-green-600 tw-text-base\">{{ details.finalAmount | currency }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Installment Breakdown -->\r\n @if (details.installmentAllowed && details.installments && details.installments.length > 1) {\r\n <div class=\"tw-bg-purple-50 tw-rounded-lg tw-p-3 tw-border tw-border-purple-200\">\r\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Installment Plan</h4>\r\n <div class=\"tw-mb-2 tw-text-xs tw-text-gray-600\">\r\n Total Amount: <span class=\"tw-font-semibold\">{{ details.finalAmount | currency }}</span> \r\n divided into <span class=\"tw-font-semibold\">{{ details.installmentCount }}</span> installments\r\n </div>\r\n <div class=\"tw-overflow-x-auto\">\r\n <table class=\"tw-min-w-full tw-divide-y tw-divide-purple-200\">\r\n <thead class=\"tw-bg-purple-100\">\r\n <tr>\r\n <th class=\"tw-px-3 tw-py-2 tw-text-left tw-text-xs tw-font-semibold tw-text-gray-700\">Installment #</th>\r\n <th class=\"tw-px-3 tw-py-2 tw-text-right tw-text-xs tw-font-semibold tw-text-gray-700\">Amount</th>\r\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>\r\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>\r\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>\r\n </tr>\r\n </thead>\r\n <tbody class=\"tw-bg-white tw-divide-y tw-divide-purple-200\">\r\n @for (installment of details.installments; track installment.number) {\r\n <tr>\r\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-900 tw-font-medium\">#{{ installment.number }}</td>\r\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>\r\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600\">{{ installment.dueDate || 'TBD' }}</td>\r\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600 tw-text-center\">\r\n @if (installment.daysFromAssignment !== undefined) {\r\n <span class=\"tw-font-medium\">{{ installment.daysFromAssignment }} days</span>\r\n } @else {\r\n <span class=\"tw-text-gray-400\">-</span>\r\n }\r\n </td>\r\n <td class=\"tw-px-3 tw-py-2 tw-text-xs tw-text-gray-600 tw-text-center\">\r\n @if (installment.daysFromPrevious !== undefined) {\r\n <span class=\"tw-font-medium\">{{ installment.daysFromPrevious }} days</span>\r\n } @else {\r\n <span class=\"tw-text-gray-400\">-</span>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n <tfoot class=\"tw-bg-purple-100\">\r\n <tr>\r\n <td class=\"tw-px-3 tw-py-2 tw-text-sm tw-font-bold tw-text-gray-900\">Total:</td>\r\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>\r\n <td colspan=\"3\"></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\r\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-2\">Payment Information</h4>\r\n <div class=\"tw-space-y-1 tw-text-xs\">\r\n <div class=\"tw-flex tw-justify-between\">\r\n <span class=\"tw-text-gray-600\">Payment Type:</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">One-time Payment</span>\r\n </div>\r\n <div class=\"tw-flex tw-justify-between\">\r\n <span class=\"tw-text-gray-600\">Amount to Pay:</span>\r\n <span class=\"tw-font-bold tw-text-green-600\">{{ details.finalAmount | currency }}</span>\r\n </div>\r\n @if (details.installments && details.installments.length > 0 && details.installments[0].dueDate) {\r\n <div class=\"tw-flex tw-justify-between\">\r\n <span class=\"tw-text-gray-600\">Due Date:</span>\r\n <span class=\"tw-font-medium tw-text-gray-900\">{{ details.installments[0].dueDate }}</span>\r\n </div>\r\n }\r\n @if (details.dueDateOffset > 0) {\r\n <div class=\"tw-flex tw-justify-between\">\r\n <span class=\"tw-text-gray-600\">Due Date Offset:</span>\r\n <span class=\"tw-text-gray-900\">{{ details.dueDateOffset }} days from assignment date</span>\r\n </div>\r\n }\r\n @if (details.installments && details.installments.length > 0 && details.installments[0].daysFromAssignment) {\r\n <div class=\"tw-flex tw-justify-between\">\r\n <span class=\"tw-text-gray-600\">Days from Assignment:</span>\r\n <span class=\"tw-text-gray-900\">{{ details.installments[0].daysFromAssignment }} days</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Fee Properties -->\r\n <div class=\"tw-bg-gray-50 tw-rounded-lg tw-p-3 tw-border tw-border-gray-200\">\r\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-3\">Fee Properties</h4>\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-3\">\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Mandatory:</span>\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\" [class]=\"details.isMandatory ? 'tw-bg-red-100 tw-text-red-800' : 'tw-bg-gray-100 tw-text-gray-800'\">\r\n {{ details.isMandatory ? 'Yes - Required' : 'No - Optional' }}\r\n </span>\r\n </div>\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Refundable:</span>\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\" [class]=\"details.isRefundable ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-gray-100 tw-text-gray-800'\">\r\n {{ details.isRefundable ? 'Yes' : 'No' }}\r\n </span>\r\n </div>\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Amount Editable:</span>\r\n <span class=\"tw-text-gray-900 tw-text-sm\">{{ details.isAmountEditable ? 'Yes' : 'No' }}</span>\r\n </div>\r\n @if (details.isAmountEditable && (details.minAmount || details.maxAmount)) {\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Amount Range:</span>\r\n <span class=\"tw-text-gray-900 tw-text-sm\">\r\n {{ details.minAmount ? (details.minAmount | currency) : 'No min' }} - \r\n {{ details.maxAmount ? (details.maxAmount | currency) : 'No max' }}\r\n </span>\r\n </div>\r\n }\r\n @if (details.taxApplicable) {\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Tax Applicable:</span>\r\n <span class=\"tw-text-gray-900 tw-text-sm\">{{ details.taxPercentage }}%</span>\r\n </div>\r\n }\r\n @if (details.collectionStartOffset || details.collectionEndOffset) {\r\n <div>\r\n <span class=\"tw-text-gray-500 tw-block tw-text-xs tw-mb-1\">Collection Window:</span>\r\n <span class=\"tw-text-gray-900 tw-text-sm\">\r\n Day {{ details.collectionStartOffset }} to Day {{ details.collectionEndOffset }}\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n}\r\n`]\r\n})\r\nexport class FeeDetailsViewerComponent implements OnInit, OnDestroy {\r\n // Inputs with backing signals\r\n private _isOpen = signal<boolean>(false);\r\n @Input() set isOpen(value: boolean) { this._isOpen.set(value); }\r\n get isOpen() { return this._isOpen(); }\r\n\r\n private _studentId = signal<string | null>(null);\r\n @Input() set studentId(value: string | null) { this._studentId.set(value); }\r\n get studentId() { return this._studentId(); }\r\n\r\n private _feeId = signal<string | null>(null);\r\n @Input() set feeId(value: string | null) { this._feeId.set(value); }\r\n get feeId() { return this._feeId(); }\r\n\r\n private _feeData = signal<FeeDetailsData | null>(null);\r\n @Input() set feeData(value: FeeDetailsData | null) { this._feeData.set(value); }\r\n get feeData() { return this._feeData(); }\r\n\r\n private _assignmentDate = signal<Date | null>(null);\r\n @Input() set assignmentDate(value: Date | null) { this._assignmentDate.set(value); }\r\n get assignmentDate() { return this._assignmentDate(); }\r\n\r\n private _discount = signal<number>(0);\r\n @Input() set discount(value: number) { this._discount.set(value); }\r\n get discount() { return this._discount(); }\r\n\r\n private _scholarship = signal<number>(0);\r\n @Input() set scholarship(value: number) { this._scholarship.set(value); }\r\n get scholarship() { return this._scholarship(); }\r\n\r\n // Outputs\r\n closed = output<void>();\r\n\r\n // Services\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\r\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\r\n private readonly notificationService = inject(NotificationService);\r\n private readonly rightsService = inject(RightsService);\r\n\r\n // State\r\n loading = signal(false);\r\n error = signal<string | null>(null);\r\n feeDetails = signal<any>(null);\r\n\r\n constructor() {\r\n // Watch for changes in inputs and reload when they change\r\n effect(() => {\r\n // Accessing the getters (which read signals) registers dependencies\r\n this.isOpen;\r\n this.studentId;\r\n this.feeId;\r\n this.feeData;\r\n this.assignmentDate;\r\n this.assignmentDate;\r\n this.discount;\r\n this.scholarship;\r\n console.log('🔍 FeeDetailsViewer - isOpen:', this.isOpen);\r\n console.log('🔍 FeeDetailsViewer - studentId:', this.studentId);\r\n console.log('🔍 FeeDetailsViewer - feeId:', this.feeId);\r\n console.log('🔍 FeeDetailsViewer - feeData:', this.feeData);\r\n console.log('🔍 FeeDetailsViewer - assignmentDate:', this.assignmentDate);\r\n console.log('🔍 FeeDetailsViewer - discount:', this.discount);\r\n console.log('🔍 FeeDetailsViewer - scholarship:', this.scholarship);\r\n this.loadFeeDetails();\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Initialize rights for fee details viewer (view-only)\r\n this.rightsService.initializeRights('fee_statement');\r\n }\r\n\r\n /**\r\n * Helper to get value from input (handles signals and plain values)\r\n * This helper is no longer needed as getters now return unwrapped values.\r\n */\r\n // private getValue(input: any): any {\r\n // if (typeof input === 'function') {\r\n // try {\r\n // return input();\r\n // } catch {\r\n // return input;\r\n // }\r\n // }\r\n // // Check if it's a signal object (has a call signature)\r\n // if (input && typeof input === 'object' && '_value' in input) {\r\n // return (input as any)._value;\r\n // }\r\n // return input;\r\n // }\r\n\r\n private loadFeeDetails(): void {\r\n // Check if feeData input is available and has a value\r\n try {\r\n const feeDataValue = this.feeData;\r\n console.log('🔍 FeeDetailsViewer - loadFeeDetails - feeDataValue:', feeDataValue);\r\n console.log('🔍 FeeDetailsViewer - loadFeeDetails - _feeItemData:', feeDataValue?._feeItemData);\r\n\r\n if (feeDataValue) {\r\n // Use provided fee data (for new applicable fees)\r\n this.processFeeData(feeDataValue);\r\n return;\r\n }\r\n } catch (error) {\r\n // Signal input might not be initialized yet, continue to other checks\r\n console.warn('FeeData logic error in loadFeeDetails:', error);\r\n }\r\n\r\n // Fallback to loading from student/fee IDs\r\n const studentIdValue = this.studentId;\r\n const feeIdValue = this.feeId;\r\n\r\n if (studentIdValue && feeIdValue) {\r\n // Load existing fee assignment\r\n this.loadFeeAssignment();\r\n return;\r\n }\r\n\r\n if (feeIdValue) {\r\n // Load fee structure item\r\n this.loadFeeStructureItem();\r\n return;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup handled by takeUntilDestroyed\r\n }\r\n\r\n private loadFeeAssignment(): void {\r\n if (!this.feeId || !this.studentId) return;\r\n\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n this.feeAssignmentService.getFeeAssignmentById(this.feeId!)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n this.loading.set(false);\r\n if (response?.success && response?.data) {\r\n const assignment = response.data;\r\n // Transform fee assignment to fee details format\r\n this.processFeeAssignmentData(assignment);\r\n } else {\r\n this.error.set(response?.message || 'Failed to load fee assignment');\r\n }\r\n },\r\n error: (err: { error?: controllerResponse }) => {\r\n this.loading.set(false);\r\n this.error.set(err?.error?.message || 'Failed to load fee assignment');\r\n }\r\n });\r\n }\r\n\r\n private loadFeeStructureItem(): void {\r\n if (!this.feeId) return;\r\n\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n // Extract fee structure ID from fee ID (assuming feeId is the structure item ID)\r\n // We need to get the structure first, then find the item\r\n // For now, let's assume feeId is the structure ID and we need to find the item\r\n const payload: MFeeStructureGetByIdPayload = {\r\n fees_id: this.feeId!\r\n };\r\n\r\n this.feeStructureService.getFeeStructureById(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: feeStructureByIdControllerResponse) => {\r\n this.loading.set(false);\r\n if (response?.success && response?.data) {\r\n const isFeeStructureByIdResponse = (data: FeeStructureByIdResponse | FeeStructureResponse): data is FeeStructureByIdResponse => {\r\n return data !== null && typeof data === 'object' && 'fee_structure' in data;\r\n };\r\n\r\n if (isFeeStructureByIdResponse(response.data)) {\r\n const items = response.data.fee_structure_items || [];\r\n // If multiple items, we'd need to know which one - for now use first item\r\n // In real scenario, feeId should be the item ID\r\n if (items.length > 0) {\r\n const item = items[0];\r\n const structure = response.data.fee_structure;\r\n if (structure) {\r\n this.processFeeItemData(item, structure);\r\n } else {\r\n this.error.set('Fee structure data is missing');\r\n }\r\n } else {\r\n this.error.set('No fee items found in structure');\r\n }\r\n }\r\n } else {\r\n this.error.set(response?.message || 'Failed to load fee structure');\r\n }\r\n },\r\n error: (err: { error?: controllerResponse }) => {\r\n this.loading.set(false);\r\n this.error.set(err?.error?.message || 'Failed to load fee structure');\r\n }\r\n });\r\n }\r\n\r\n private processFeeData(fee: FeeDetailsData): void {\r\n console.log('🔍 FeeDetailsViewer - processFeeData - fee:', fee);\r\n console.log('🔍 FeeDetailsViewer - processFeeData - _feeItemData:', fee?._feeItemData);\r\n\r\n // Ensure we have proper item data structure\r\n // We use a temporary variable with a broader type to allow fallbacks, then cast to specific type\r\n let rawItemData: any = fee._feeItemData;\r\n\r\n // If _feeItemData doesn't exist or is incomplete, construct it from fee data\r\n if (!rawItemData || typeof rawItemData !== 'object' || Object.keys(rawItemData).length === 0) {\r\n console.warn('⚠️ FeeDetailsViewer - _feeItemData is missing or empty, using fee object as fallback');\r\n rawItemData = fee;\r\n }\r\n\r\n // Ensure we have a valid itemData object to work with\r\n const itemData: PartialFeeStructureItem = rawItemData || {};\r\n\r\n // Robustly fill missing fields in itemData from top-level fee properties\r\n // This handles cases where data is flattened or mapped differently\r\n if (!itemData.feesi_item_name || itemData.feesi_item_name === 'N/A') {\r\n itemData.feesi_item_name = fee.fees_structure_name || fee.feesi_item_name || 'N/A';\r\n }\r\n\r\n if (!itemData.feesi_item_code || itemData.feesi_item_code === 'N/A') {\r\n itemData.feesi_item_code = fee.fees_structure_code || fee.feesi_item_code || 'N/A';\r\n }\r\n\r\n if (itemData.feesi_amount === undefined || itemData.feesi_amount === null) {\r\n itemData.feesi_amount = fee.fees_amount || fee.fees_total_amount || fee.feesi_amount || 0;\r\n }\r\n\r\n if (!itemData.feesi_description || itemData.feesi_description === 'No description available') {\r\n itemData.feesi_description = fee.feesi_description || 'No description available';\r\n }\r\n\r\n // Ensure category is properly set\r\n if (!itemData.feesi_category_id_sygms) {\r\n // Check if it exists at root\r\n if (fee.feesi_category_id_sygms) {\r\n itemData.feesi_category_id_sygms = fee.feesi_category_id_sygms;\r\n } else if (fee.fees_category_name && fee.fees_category_name !== 'N/A') {\r\n // We have a name but no ID object, that's fine, logic later handles name only\r\n }\r\n }\r\n\r\n // Final amount logic: prioritize total_amount, then base amount minus discounts\r\n const totalBase = Number(fee.fees_total_amount) || Number(fee.fees_amount) || 0;\r\n const discountVal = Number(this.discount) || Number(fee.discount) || 0;\r\n const scholarshipVal = Number(this.scholarship) || Number(fee.scholarship) || 0;\r\n\r\n // If we have fees_total_amount, assume it's already net of discounts (common in assignments)\r\n // Otherwise, calculate net amount\r\n let finalAmount = 0;\r\n if (Number(fee.fees_total_amount) > 0) {\r\n finalAmount = Number(fee.fees_total_amount);\r\n } else {\r\n finalAmount = Math.max(0, totalBase - discountVal - scholarshipVal);\r\n }\r\n\r\n // Double check that finalAmount is not NaN\r\n if (isNaN(finalAmount)) finalAmount = 0;\r\n\r\n // Ensure assignmentDate is a Date object\r\n let assignmentDate: Date;\r\n try {\r\n const dateValue = this.assignmentDate;\r\n if (dateValue instanceof Date) {\r\n assignmentDate = dateValue;\r\n } else if (dateValue && typeof dateValue === 'string') {\r\n assignmentDate = new Date(dateValue);\r\n } else {\r\n assignmentDate = new Date();\r\n }\r\n } catch {\r\n assignmentDate = new Date();\r\n }\r\n\r\n // Ensure fee data has all required fields\r\n const feeDataWithDefaults: FeeDetailsData = {\r\n ...fee,\r\n fees_structure_name: fee.fees_structure_name || 'N/A',\r\n fees_structure_code: fee.fees_structure_code || 'N/A',\r\n fees_category_name: fee.fees_category_name || 'N/A',\r\n fees_amount: fee.fees_amount || fee.fees_total_amount || 0,\r\n fees_total_amount: fee.fees_total_amount || fee.fees_amount || 0,\r\n discount: fee.discount || this.discount || 0,\r\n scholarship: fee.scholarship || this.scholarship || 0,\r\n finalAmount: finalAmount,\r\n _feeItemData: itemData\r\n };\r\n\r\n this.calculateAndSetFeeDetails(itemData, feeDataWithDefaults, finalAmount, assignmentDate);\r\n }\r\n\r\n private processFeeAssignmentData(assignment: PartialFeeAssignment): void {\r\n // Transform assignment data to fee details format\r\n const totalAmount = Number(assignment.feeas_total_amount) || Number(assignment.feeas_final_amount) || Number(assignment.feeas_original_amount) || 0;\r\n const finalAmount = totalAmount;\r\n\r\n // Ensure assignmentDate is a Date object\r\n let assignmentDate: Date;\r\n try {\r\n if (assignment.feeas_assignment_date) {\r\n assignmentDate = assignment.feeas_assignment_date instanceof Date\r\n ? assignment.feeas_assignment_date\r\n : new Date(assignment.feeas_assignment_date);\r\n } else {\r\n // Try to get from input signal, otherwise use current date\r\n const dateValue = this.assignmentDate;\r\n if (dateValue instanceof Date) {\r\n assignmentDate = dateValue;\r\n } else if (dateValue && typeof dateValue === 'string') {\r\n assignmentDate = new Date(dateValue);\r\n } else {\r\n assignmentDate = new Date();\r\n }\r\n }\r\n } catch {\r\n assignmentDate = new Date();\r\n }\r\n\r\n // Create a mock item data structure from assignment\r\n const itemData: PartialFeeStructureItem = {\r\n feesi_item_name: assignment.feeas_fee_name,\r\n feesi_item_code: assignment.feeas_fee_name,\r\n feesi_description: assignment.feeas_fee_description,\r\n feesi_amount: assignment.feeas_original_amount || 0,\r\n feesi_is_mandatory: true, // Assumed\r\n feesi_is_refundable: false, // Assumed\r\n feesi_is_installment_allowed: (assignment.feeas_installment_count || 1) > 1,\r\n feesi_installment_count: assignment.feeas_installment_count || 1,\r\n feesi_due_date_offset_days: assignment.feeas_due_date ?\r\n Math.floor((new Date(assignment.feeas_due_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 0,\r\n feesi_collection_start_offset_days: assignment.feeas_collection_start_date ?\r\n Math.floor((new Date(assignment.feeas_collection_start_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 0,\r\n feesi_collection_end_offset_days: assignment.feeas_collection_end_date ?\r\n Math.floor((new Date(assignment.feeas_collection_end_date).getTime() - assignmentDate.getTime()) / (1000 * 60 * 60 * 24)) : 30,\r\n feesi_tax_applicable: false,\r\n feesi_tax_percentage: 0\r\n };\r\n\r\n\r\n\r\n const feeData: FeeDetailsData = {\r\n _id: assignment._id,\r\n fees_structure_name: typeof assignment.feeas_fee_structure_id_feest === 'object'\r\n ? assignment.feeas_fee_structure_id_feest?.fees_structure_name\r\n : assignment.fee_structure_name || 'Custom Fee',\r\n fees_category_name: assignment.feeas_fee_category_sygms || 'N/A',\r\n fees_amount: Number(assignment.feeas_original_amount) || 0,\r\n fees_total_amount: totalAmount,\r\n discount: Number(assignment.feeas_discount_amount) || 0,\r\n scholarship: Number(assignment.feeas_scholarship_amount) || 0,\r\n finalAmount: finalAmount,\r\n _feeItemData: itemData,\r\n _feeAssignmentData: assignment\r\n };\r\n\r\n this.calculateAndSetFeeDetails(itemData, feeData, finalAmount, assignmentDate);\r\n }\r\n\r\n private processFeeItemData(item: FeeStructureItem, structure: FeeStructureResponse): void {\r\n const totalAmount = Number(item.feesi_amount) || 0;\r\n const finalAmount = totalAmount - (Number(this.discount) || 0) - (Number(this.scholarship) || 0);\r\n\r\n // Ensure assignmentDate is a Date object\r\n let assignmentDate: Date;\r\n try {\r\n const dateValue = this.assignmentDate;\r\n if (dateValue instanceof Date) {\r\n assignmentDate = dateValue;\r\n } else if (dateValue && typeof dateValue === 'string') {\r\n assignmentDate = new Date(dateValue);\r\n } else {\r\n assignmentDate = new Date();\r\n }\r\n } catch {\r\n assignmentDate = new Date();\r\n }\r\n\r\n const feeData: FeeDetailsData = {\r\n _id: item._id,\r\n fees_structure_name: structure.fees_structure_name,\r\n fees_structure_code: structure.fees_structure_code,\r\n fees_category_name: typeof item.feesi_category_id_sygms === 'object'\r\n ? (item.feesi_category_id_sygms as any)?.sygms_title || 'N/A'\r\n : 'N/A',\r\n fees_amount: Number(item.feesi_amount) || 0,\r\n fees_total_amount: totalAmount,\r\n discount: Number(this.discount) || 0,\r\n scholarship: Number(this.scholarship) || 0,\r\n finalAmount: finalAmount,\r\n _feeItemData: item\r\n };\r\n\r\n this.calculateAndSetFeeDetails(item, feeData, finalAmount, assignmentDate);\r\n }\r\n\r\n /**\r\n * Helper method to ensure a value is a Date object\r\n */\r\n private ensureDate(value: Date | string | null | undefined): Date {\r\n if (value instanceof Date) {\r\n return value;\r\n }\r\n if (value && typeof value === 'string') {\r\n const date = new Date(value);\r\n if (!isNaN(date.getTime())) {\r\n return date;\r\n }\r\n }\r\n return new Date();\r\n }\r\n\r\n private calculateAndSetFeeDetails(\r\n itemData: PartialFeeStructureItem,\r\n feeData: FeeDetailsData,\r\n finalAmount: number,\r\n assignmentDate: Date | string | null | undefined\r\n ): void {\r\n // Ensure assignmentDate is always a Date object\r\n const assignmentDateObj = this.ensureDate(assignmentDate);\r\n\r\n const installmentCount = itemData.feesi_installment_count || 1;\r\n const installmentAllowed = itemData.feesi_is_installment_allowed || false;\r\n const daysBetweenInstallments = 30;\r\n\r\n // Calculate installment breakdown\r\n const installments: Array<{\r\n number: number;\r\n amount: number;\r\n dueDate?: string;\r\n daysFromAssignment?: number;\r\n daysFromPrevious?: number;\r\n }> = [];\r\n\r\n if (installmentAllowed && installmentCount > 1) {\r\n const installmentAmount = finalAmount / installmentCount;\r\n const baseAmount = Math.floor((installmentAmount * 100)) / 100;\r\n const remainder = Math.round((finalAmount - (baseAmount * installmentCount)) * 100) / 100;\r\n\r\n let previousDueDate: Date | null = null;\r\n\r\n for (let i = 1; i <= installmentCount; i++) {\r\n const amount = i === installmentCount ? baseAmount + remainder : baseAmount;\r\n\r\n let dueDate = '';\r\n let dueDateObj: Date | null = null;\r\n let daysFromAssignment = 0;\r\n let daysFromPrevious = 0;\r\n\r\n if (itemData.feesi_due_date_offset_days !== undefined && itemData.feesi_due_date_offset_days !== null) {\r\n if (i === 1) {\r\n dueDateObj = new Date(assignmentDateObj);\r\n dueDateObj.setDate(assignmentDateObj.getDate() + itemData.feesi_due_date_offset_days);\r\n daysFromAssignment = itemData.feesi_due_date_offset_days;\r\n } else {\r\n if (previousDueDate) {\r\n dueDateObj = new Date(previousDueDate);\r\n dueDateObj.setDate(previousDueDate.getDate() + daysBetweenInstallments);\r\n daysFromPrevious = daysBetweenInstallments;\r\n daysFromAssignment = Math.floor((dueDateObj.getTime() - assignmentDateObj.getTime()) / (1000 * 60 * 60 * 24));\r\n }\r\n }\r\n\r\n if (dueDateObj) {\r\n dueDate = dueDateObj.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\r\n previousDueDate = dueDateObj;\r\n }\r\n }\r\n\r\n installments.push({\r\n number: i,\r\n amount: Math.round(amount * 100) / 100,\r\n dueDate,\r\n daysFromAssignment: daysFromAssignment > 0 ? daysFromAssignment : undefined,\r\n daysFromPrevious: daysFromPrevious > 0 ? daysFromPrevious : undefined\r\n });\r\n }\r\n } else {\r\n // Single payment\r\n let dueDate = '';\r\n let daysFromAssignment = 0;\r\n if (itemData.feesi_due_date_offset_days !== undefined && itemData.feesi_due_date_offset_days !== null) {\r\n const dueDateObj = new Date(assignmentDateObj);\r\n dueDateObj.setDate(assignmentDateObj.getDate() + itemData.feesi_due_date_offset_days);\r\n dueDate = dueDateObj.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\r\n daysFromAssignment = itemData.feesi_due_date_offset_days;\r\n }\r\n\r\n installments.push({\r\n number: 1,\r\n amount: finalAmount,\r\n dueDate,\r\n daysFromAssignment: daysFromAssignment > 0 ? daysFromAssignment : undefined\r\n });\r\n }\r\n\r\n // Extract category name - check multiple sources\r\n let categoryName = 'N/A';\r\n if (feeData.fees_category_name && feeData.fees_category_name !== 'N/A' && feeData.fees_category_name.trim() !== '') {\r\n categoryName = feeData.fees_category_name;\r\n } else if (itemData.feesi_category_id_sygms) {\r\n if (typeof itemData.feesi_category_id_sygms === 'object' && itemData.feesi_category_id_sygms !== null) {\r\n categoryName = itemData.feesi_category_id_sygms.sygms_title ||\r\n 'N/A';\r\n } else if (typeof itemData.feesi_category_id_sygms === 'string') {\r\n // If it's just an ID string, we can't resolve it here, use fallback\r\n categoryName = 'N/A';\r\n }\r\n }\r\n\r\n // Final fallback - try to get from item code or name\r\n if (categoryName === 'N/A' && itemData.feesi_item_code) {\r\n categoryName = itemData.feesi_item_code;\r\n }\r\n\r\n // Extract fee name - prioritize item name, then item code, then structure name\r\n const feeName = (itemData.feesi_item_name && itemData.feesi_item_name !== 'N/A') ? itemData.feesi_item_name :\r\n (feeData.fees_structure_name && feeData.fees_structure_name !== 'N/A') ? feeData.fees_structure_name :\r\n (itemData.feesi_item_code && itemData.feesi_item_code !== 'N/A') ? itemData.feesi_item_code :\r\n 'N/A';\r\n\r\n // Extract item code - prioritize item code, then structure code, then structure name\r\n const itemCode = itemData.feesi_item_code ||\r\n feeData.fees_structure_code ||\r\n feeData.fees_structure_name ||\r\n 'N/A';\r\n\r\n // Extract structure name\r\n const structureName = feeData.fees_structure_name ||\r\n feeData.fees_structure_code ||\r\n 'N/A';\r\n\r\n // Extract description\r\n const description = itemData.feesi_description ||\r\n feeData.fees_structure_name ||\r\n 'No description available';\r\n\r\n this.feeDetails.set({\r\n name: feeName,\r\n category: categoryName,\r\n amount: itemData.feesi_amount || feeData.fees_amount || 0,\r\n discount: this.discount || feeData.discount || 0,\r\n scholarship: this.scholarship || feeData.scholarship || 0,\r\n finalAmount: finalAmount,\r\n structureName: structureName,\r\n structureCode: feeData.fees_structure_code || 'N/A',\r\n itemCode: itemCode,\r\n description: description,\r\n isMandatory: itemData.feesi_is_mandatory || false,\r\n isRefundable: itemData.feesi_is_refundable || false,\r\n isAmountEditable: itemData.feesi_is_amount_editable || false,\r\n minAmount: itemData.feesi_min_amount,\r\n maxAmount: itemData.feesi_max_amount,\r\n installmentAllowed: installmentAllowed,\r\n installmentCount: installmentCount,\r\n installmentAmount: installmentAllowed && installmentCount > 1 ? finalAmount / installmentCount : finalAmount,\r\n installments: installments,\r\n dueDateOffset: itemData.feesi_due_date_offset_days || 0,\r\n collectionStartOffset: itemData.feesi_collection_start_offset_days || 0,\r\n collectionEndOffset: itemData.feesi_collection_end_offset_days || 0,\r\n taxApplicable: itemData.feesi_tax_applicable || false,\r\n taxPercentage: itemData.feesi_tax_percentage || 0,\r\n displayOrder: itemData.feesi_display_order || 0\r\n });\r\n }\r\n\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n\r\n","\r\nimport { Component, inject, signal, computed, input, output, effect, OnInit } 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 ApplicableFeeItem,\r\n FeeDiscountData,\r\n FeeScholarshipData\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\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 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 providers: [CurrencyPipe]\r\n})\r\nexport class FeeApplicableFeesComponent implements OnInit {\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 as Signals\r\n readonly entityId = input<string | null>(null);\r\n readonly academicYearId = input<string>('');\r\n readonly classProgramId = input<string>('');\r\n readonly termId = input<string>('');\r\n readonly branchId = input<string | null>(null);\r\n readonly sectionId = input<string | null>(null);\r\n readonly studentId = input<string | null>(null);\r\n\r\n // Outputs as Signals\r\n readonly feesCalculated = output<{\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 readonly loading = signal(false);\r\n readonly applicableFees = signal<Array<ApplicableFeeItem>>([]);\r\n readonly existingAssignments = signal<Array<FeeAssignment>>([]);\r\n readonly feeStructureGroups = signal<Array<FeeStructureGroup>>([]);\r\n readonly selectedFeeStructureId = signal<string | null>(null);\r\n\r\n readonly feeDiscountScholarshipData = signal<FeeDiscountScholarshipMap>(new Map());\r\n readonly viewingFeeDetails = signal<ApplicableFeeItem | null>(null);\r\n readonly selectedFeeIds = signal<Set<string>>(new Set()); // IDs of selected fees\r\n\r\n readonly feeStructureOptions = computed(() => {\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 readonly selectedStructureFees = computed(() => {\r\n const selectedId = this.selectedFeeStructureId();\r\n const fees = this.applicableFees();\r\n if (!selectedId || fees.length === 0) return [];\r\n return fees.filter(f => f.fees_structure_id === selectedId);\r\n });\r\n\r\n onStructureChange(event: any): void {\r\n const value = (event && typeof event === 'object' && 'value' in event) ? event.value : event;\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.selectedStructureFees();\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 ngOnInit(): void {\r\n this.registerFloatingContainerComponents();\r\n }\r\n\r\n private async registerFloatingContainerComponents(): Promise<void> {\r\n // Register fee discount form component\r\n if (!this.floatingContainerService.isComponentRegistered('fee-discount-form')) {\r\n try {\r\n this.floatingContainerService.registerComponent('fee-discount-form', FeeDiscountFormComponent);\r\n } catch (error) {\r\n console.error('❌ Failed to register fee discount form component:', error);\r\n }\r\n }\r\n\r\n // Register fee scholarship form component\r\n if (!this.floatingContainerService.isComponentRegistered('fee-scholarship-form')) {\r\n try {\r\n this.floatingContainerService.registerComponent('fee-scholarship-form', FeeScholarshipFormComponent);\r\n } catch (error) {\r\n console.error('❌ Failed to register fee scholarship form component:', error);\r\n }\r\n }\r\n\r\n // Register fee details viewer component\r\n if (!this.floatingContainerService.isComponentRegistered('fee-details-viewer')) {\r\n try {\r\n this.floatingContainerService.registerComponent('fee-details-viewer', FeeDetailsViewerComponent);\r\n } catch (error) {\r\n console.error('❌ Failed to register fee details viewer component:', error);\r\n }\r\n }\r\n }\r\n\r\n // Initial Load / Reactivity Effect\r\n private readonly triggerLoadEffect = effect(() => {\r\n const cpId = this.classProgramId();\r\n const termId = this.termId();\r\n const entityId = this.entityId();\r\n const ayId = this.academicYearId();\r\n const branchId = this.branchId();\r\n const sectionId = this.sectionId();\r\n console.log(cpId, \"g\", termId, \"d\", entityId, ayId, branchId, sectionId, \"signa rights\");\r\n\r\n // Only trigger if minimal required fields are present\r\n if (cpId && entityId && ayId) {\r\n this.loadApplicableFees();\r\n } else {\r\n // Should we clear if invalid? Or just keep? \r\n // Usually clear to avoid stale data if filters are cleared.\r\n this.applicableFees.set([]);\r\n }\r\n }, { allowSignalWrites: true });\r\n\r\n loadApplicableFees(): void {\r\n if (!this.classProgramId() || !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() || undefined,\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() || undefined;\r\n }\r\n\r\n if (this.sectionId()) {\r\n payloadData.fees_program_term_section_id_acapts = this.sectionId() || undefined;\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_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 // Initialize selection: Select only UNASSIGNED fees by default\r\n const unassignedIds = new Set(updatedFees.filter(f => !f.is_assigned).map(f => this.getFeeId(f)));\r\n this.selectedFeeIds.set(unassignedIds);\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 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.selectedStructureFees()\r\n .filter(f => this.selectedFeeIds().has(this.getFeeId(f)))\r\n .reduce((sum, fee) => sum + (fee.fees_amount || 0), 0);\r\n });\r\n\r\n totalDiscount = computed(() => {\r\n return this.selectedStructureFees()\r\n .filter(f => this.selectedFeeIds().has(this.getFeeId(f)))\r\n .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.selectedStructureFees()\r\n .filter(f => this.selectedFeeIds().has(this.getFeeId(f)))\r\n .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.selectedStructureFees()\r\n .filter(f => this.selectedFeeIds().has(this.getFeeId(f)))\r\n .reduce((sum, fee) => sum + this.calculateFinalAmount(fee), 0);\r\n });\r\n\r\n // --- Actions ---\r\n\r\n async openDiscountManagement(feeId: string): Promise<void> {\r\n console.log('Open Discount Management clicked for:', feeId);\r\n const fee = this.applicableFees().find(f => this.getFeeId(f) === feeId);\r\n if (!fee) {\r\n console.error('Fee not found for id:', feeId);\r\n return;\r\n }\r\n\r\n // Ensure component is registered\r\n if (!this.floatingContainerService.isComponentRegistered('fee-discount-form')) {\r\n console.log('Registering fee-discount-form...');\r\n await this.registerFloatingContainerComponents();\r\n } else {\r\n console.log('fee-discount-form already registered');\r\n }\r\n\r\n const currentDiscount = this.getDiscountData(feeId);\r\n\r\n const containerId = this.floatingContainerService.show({\r\n id: `discount-form-${feeId}-${Date.now()}`,\r\n title: currentDiscount ? 'Edit Discount' : 'Add Discount',\r\n icon: 'local_offer',\r\n width: '500px',\r\n height: '600px',\r\n minWidth: '400px',\r\n minHeight: '400px',\r\n maxWidth: '90vw',\r\n maxHeight: '90vh',\r\n resizable: true,\r\n draggable: true,\r\n closable: true,\r\n minimizable: true,\r\n maximizable: true,\r\n backdrop: false,\r\n componentId: 'fee-discount-form',\r\n componentConfig: {\r\n inputs: {\r\n feeId: signal(feeId),\r\n feeName: signal(fee.fees_structure_name || 'Fee'),\r\n feeAmount: signal(fee.fees_amount || 0),\r\n existingDiscount: signal(currentDiscount),\r\n discountReasonOptions: signal(this.getDiscountReasonOptions()) // We need to check if this method exists or needs adding\r\n },\r\n outputs: {\r\n saved: (result: any) => {\r\n this.applyDiscount(feeId, result, fee.fees_amount || 0);\r\n this.floatingContainerService.hide(containerId);\r\n },\r\n cancelled: () => {\r\n this.floatingContainerService.hide(containerId);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.floatingContainerService.bringToFront(containerId);\r\n }\r\n\r\n removeDiscount(feeId: string): void {\r\n this.updateFeeData(feeId, { discount: undefined });\r\n }\r\n\r\n async openScholarshipManagement(feeId: string): Promise<void> {\r\n const fee = this.applicableFees().find(f => this.getFeeId(f) === feeId);\r\n if (!fee) return;\r\n\r\n // Ensure component is registered\r\n if (!this.floatingContainerService.isComponentRegistered('fee-scholarship-form')) {\r\n await this.registerFloatingContainerComponents();\r\n }\r\n\r\n const currentScholarship = this.getScholarshipData(feeId);\r\n\r\n const containerId = this.floatingContainerService.show({\r\n id: `scholarship-form-${feeId}-${Date.now()}`,\r\n title: currentScholarship ? 'Edit Scholarship' : 'Add Scholarship',\r\n icon: 'school',\r\n width: '500px',\r\n height: '650px',\r\n minWidth: '400px',\r\n minHeight: '450px',\r\n maxWidth: '90vw',\r\n maxHeight: '90vh',\r\n resizable: true,\r\n draggable: true,\r\n closable: true,\r\n minimizable: true,\r\n maximizable: true,\r\n backdrop: false,\r\n componentId: 'fee-scholarship-form',\r\n componentConfig: {\r\n inputs: {\r\n feeId: signal(feeId),\r\n feeName: signal(fee.fees_structure_name || 'Fee'),\r\n feeAmount: signal(fee.fees_amount || 0),\r\n existingScholarship: signal(currentScholarship),\r\n scholarshipTypeOptions: signal(this.getScholarshipTypeOptions()) // We need to check if this method exists or needs adding\r\n },\r\n outputs: {\r\n saved: (result: any) => {\r\n this.applyScholarship(feeId, result, fee.fees_amount || 0);\r\n this.floatingContainerService.hide(containerId);\r\n },\r\n cancelled: () => {\r\n this.floatingContainerService.hide(containerId);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.floatingContainerService.bringToFront(containerId);\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 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 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.selectedStructureFees();\r\n // Enrich with calculated values\r\n // Filter by selection for final output\r\n const selectedIds = this.selectedFeeIds();\r\n\r\n const enrichedFees = fees\r\n .filter((f: ApplicableFeeItem) => !f.is_assigned && selectedIds.has(this.getFeeId(f)))\r\n .map((f: ApplicableFeeItem) => {\r\n const feeId = this.getFeeId(f);\r\n const discountData = this.getDiscountData(feeId);\r\n const scholarshipData = this.getScholarshipData(feeId);\r\n const discount = discountData?.discount_amount || 0;\r\n const scholarship = scholarshipData?.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 discountData: discountData,\r\n scholarshipData: scholarshipData\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 // --- Insights / Detailed View ---\r\n async viewFeeDetails(fee: ApplicableFeeItem): Promise<void> {\r\n const feeData = this.getFeeDataForViewer(fee);\r\n if (!feeData) return;\r\n\r\n // Ensure component is registered\r\n if (!this.floatingContainerService.isComponentRegistered('fee-details-viewer')) {\r\n await this.registerFloatingContainerComponents();\r\n }\r\n\r\n const containerId = this.floatingContainerService.show({\r\n id: `fee-details-${fee._id}-${Date.now()}`,\r\n title: `Complete Fee Details - ${feeData.fees_structure_name || 'Fee'}`,\r\n icon: 'receipt_long',\r\n width: '750px',\r\n height: '700px',\r\n minWidth: '600px',\r\n minHeight: '500px',\r\n maxWidth: '90vw',\r\n maxHeight: '90vh',\r\n resizable: true,\r\n draggable: true,\r\n closable: true,\r\n minimizable: true,\r\n maximizable: true,\r\n backdrop: false,\r\n componentId: 'fee-details-viewer',\r\n componentConfig: {\r\n inputs: {\r\n isOpen: true,\r\n feeData: feeData,\r\n assignmentDate: new Date(),\r\n discount: feeData.discount || 0,\r\n scholarship: feeData.scholarship || 0\r\n } as any,\r\n outputs: {\r\n closed: () => {\r\n this.floatingContainerService.hide(containerId);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.floatingContainerService.bringToFront(containerId);\r\n }\r\n\r\n // Helper methods for viewer\r\n getFeeDataForViewer(fee: ApplicableFeeItem): any | null {\r\n if (!fee) return null;\r\n\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 discountAmount = discountData?.discount_amount || 0;\r\n\r\n const finalAmount = this.calculateFinalAmount(fee);\r\n\r\n // Get the original fee item data\r\n let feeItemData = (fee as any)._feeItemData;\r\n\r\n // If _feeItemData is missing or empty, construct a robust fallback to prevent viewer errors\r\n if (!feeItemData || Object.keys(feeItemData).length === 0) {\r\n feeItemData = {\r\n feesi_item_name: fee.fees_structure_name || 'N/A',\r\n feesi_item_code: (fee as any).fees_structure_code || 'N/A',\r\n feesi_amount: originalAmount,\r\n feesi_description: 'No description available',\r\n feesi_category_id_sygms: null,\r\n feesi_is_mandatory: false,\r\n feesi_is_refundable: false,\r\n feesi_is_amount_editable: false,\r\n feesi_is_installment_allowed: false,\r\n feesi_installment_count: 1,\r\n feesi_due_date_offset_days: 0,\r\n feesi_collection_start_offset_days: 0,\r\n feesi_collection_end_offset_days: 30,\r\n feesi_tax_applicable: false,\r\n feesi_tax_percentage: 0,\r\n feesi_display_order: 0\r\n };\r\n } else {\r\n // Ensure essential fields exist even if _feeItemData is partial\r\n feeItemData.feesi_item_name = feeItemData.feesi_item_name || fee.fees_structure_name || 'N/A';\r\n feeItemData.feesi_amount = feeItemData.feesi_amount ?? originalAmount;\r\n }\r\n\r\n const scholarshipData = this.getScholarshipData(feeId);\r\n const scholarshipAmount = scholarshipData?.scholarship_amount || 0;\r\n\r\n return {\r\n _id: fee._id,\r\n fees_structure_name: fee.fees_structure_name || 'N/A',\r\n fees_structure_code: (fee as any).fees_structure_code || 'N/A',\r\n fees_category_name: fee.fees_category_name || 'N/A',\r\n fees_amount: originalAmount,\r\n fees_total_amount: originalAmount,\r\n discount: discountAmount,\r\n scholarship: scholarshipAmount,\r\n finalAmount: finalAmount,\r\n _feeItemData: feeItemData\r\n };\r\n }\r\n\r\n // Stub methods for missing service calls (since we don't have GeneralMasterService here yet)\r\n // These should ideally load from an API or service\r\n getDiscountReasonOptions(): Array<{ value: string; label: string }> {\r\n return [];\r\n }\r\n\r\n getScholarshipTypeOptions(): Array<{ value: string; label: string }> {\r\n return [];\r\n }\r\n\r\n // --- Selection Logic ---\r\n\r\n // Check if fee is selected\r\n isSelected(feeId: string): boolean {\r\n return this.selectedFeeIds().has(feeId);\r\n }\r\n\r\n // Toggle single fee selection\r\n toggleFeeSelection(feeId: string): void {\r\n const currentSet = new Set(this.selectedFeeIds());\r\n if (currentSet.has(feeId)) {\r\n currentSet.delete(feeId);\r\n } else {\r\n currentSet.add(feeId);\r\n }\r\n this.selectedFeeIds.set(currentSet);\r\n this.emitFeeData();\r\n }\r\n\r\n // Toggle select all\r\n toggleSelectAll(checked: boolean): void {\r\n const currentFees = this.selectedStructureFees();\r\n const currentSet = new Set(this.selectedFeeIds());\r\n\r\n if (checked) {\r\n currentFees.forEach(f => {\r\n if (!f.is_assigned) {\r\n currentSet.add(this.getFeeId(f));\r\n }\r\n });\r\n } else {\r\n // Uncheck all unassigned fees\r\n currentFees.forEach(f => {\r\n if (!f.is_assigned) {\r\n currentSet.delete(this.getFeeId(f));\r\n }\r\n });\r\n }\r\n this.selectedFeeIds.set(currentSet);\r\n this.emitFeeData();\r\n }\r\n\r\n // Check if all selectable fees are selected\r\n isAllSelected(): boolean {\r\n const currentFees = this.selectedStructureFees();\r\n if (currentFees.length === 0) return false;\r\n\r\n const selectedIds = this.selectedFeeIds();\r\n const selectableFees = currentFees.filter(f => !f.is_assigned);\r\n if (selectableFees.length === 0) return true; // Nothing left to select\r\n\r\n // Check if every UNASSIGNED fee in current view is in selected set\r\n return selectableFees.every(f => selectedIds.has(this.getFeeId(f)));\r\n }\r\n\r\n // Check for indeterminate state (some selected, some not)\r\n isIndeterminate(): boolean {\r\n const currentFees = this.selectedStructureFees();\r\n if (currentFees.length === 0) return false;\r\n\r\n const selectedIds = this.selectedFeeIds();\r\n const selectableFees = currentFees.filter(f => !f.is_assigned);\r\n if (selectableFees.length === 0) return false;\r\n\r\n const selectedCount = selectableFees.filter(f => selectedIds.has(this.getFeeId(f))).length;\r\n\r\n return selectedCount > 0 && selectedCount < selectableFees.length;\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]=\"feeStructureOptions()\" [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 (selectedStructureFees().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 class=\"tw-px-4 tw-py-3 tw-w-10 tw-border-b tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center\">\r\n <input type=\"checkbox\"\r\n class=\"tw-w-4 tw-h-4 tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500\"\r\n [checked]=\"isAllSelected()\" [indeterminate]=\"isIndeterminate()\"\r\n (change)=\"toggleSelectAll($any($event.target).checked)\">\r\n </div>\r\n </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 tw-min-w-[250px]\">\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 tw-whitespace-nowrap\">\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 tw-whitespace-nowrap tw-min-w-[120px]\">\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 tw-min-w-[160px]\">\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 tw-min-w-[160px]\">\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 tw-whitespace-nowrap tw-min-w-[120px]\">\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 tw-w-[80px]\">\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 selectedStructureFees(); 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-border-b tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center\">\r\n <input type=\"checkbox\"\r\n class=\"tw-w-4 tw-h-4 tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\r\n [checked]=\"fee.is_assigned || isSelected(getFeeId(fee))\" [disabled]=\"!!fee.is_assigned\"\r\n (change)=\"toggleFeeSelection(getFeeId(fee))\">\r\n </div>\r\n </td>\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>","import {\r\n Component,\r\n inject,\r\n signal,\r\n OnInit,\r\n DestroyRef,\r\n OnDestroy,\r\n computed\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n FormControl\r\n} from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\r\nimport { forkJoin } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport {\r\n CideTextareaComponent,\r\n CideEleButtonComponent,\r\n CideIconComponent,\r\n NotificationService,\r\n ConfirmationService,\r\n CideFormFieldErrorComponent\r\n} from 'cloud-ide-element';\r\nimport { ComponentContextService } from 'cloud-ide-layout';\r\nimport {\r\n ENTITY_SERVICE_TOKEN,\r\n type IEntityService,\r\n ACADEMIC_YEAR_SERVICE_TOKEN,\r\n type IAcademicYearService,\r\n GENERAL_MASTER_SERVICE_TOKEN,\r\n type IGeneralMasterService\r\n} from 'cloud-ide-shared';\r\nimport {\r\n generateObjectFromString,\r\n MAcademicYear,\r\n MFeeStructure,\r\n type feeStructureControllerResponse,\r\n type feeStructureByIdControllerResponse,\r\n type FeeStructure as FeeStructureType,\r\n FeeStructureResponse,\r\n FeeStructureItem,\r\n type FeeStructureByIdResponse,\r\n MFeeStructureGetByIdPayload,\r\n type IGeneralMasterListRequest,\r\n type generalMasterListControllerResponse,\r\n type ICoreSygms\r\n} from 'cloud-ide-lms-model';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { CideSelectComponent } from 'cloud-ide-element';\r\nimport { CideInputComponent } from 'cloud-ide-element';\r\nimport { CideLytSharedWrapperComponent, RightsService, AppStateService, CideLytRequestService } from 'cloud-ide-layout';\r\nimport { ProgramSectionSelectorWrapperComponent } from 'cloud-ide-shared';\r\nimport { CideFeeFeeStructureService } from '../../../fee-structure-management/services/fee-structure.service';\r\nimport { CideFeeFeeAssignmentService } from '../../services/fee-assignment.service';\r\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\r\nimport {\r\n AuthUserMstListPayload,\r\n authUserMstListControllerResponse,\r\n AuthUserMst,\r\n MFeeDiscountRule,\r\n FeeDiscountRule,\r\n ApplicableFeeItem,\r\n FeeDiscountData,\r\n FeeScholarshipData\r\n} from 'cloud-ide-lms-model';\r\nimport { CideFeeDiscountRuleService } from '../../../discount-management/services/discount-rule.service';\r\nimport { FeeApplicableFeesComponent } from '../../../../shared/components/fee-applicable-fees/fee-applicable-fees.component';\r\n\r\n// Types\r\ninterface Entity {\r\n _id?: string;\r\n syen_name?: string;\r\n syen_code?: string;\r\n}\r\n\r\ninterface AcademicYear {\r\n _id?: string;\r\n acayr_name?: string;\r\n acayr_code?: string;\r\n}\r\n\r\ninterface LocalFeeStructure {\r\n _id?: string;\r\n fees_structure_name?: string;\r\n fees_structure_code?: string;\r\n}\r\n\r\n// Fee assignment fee item type - extends FeeStructureItem to include all item properties\r\ntype FeeAssignmentFeeItem = FeeStructureItem & {\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 discount_amount?: number;\r\n scholarship_amount?: number;\r\n};\r\n\r\n// Extended user type for student search response which includes type mapping\r\ninterface StudentUser extends AuthUserMst {\r\n user_type_mapping?: {\r\n syutm_type_specific_id?: string;\r\n syutm_user_type?: string;\r\n };\r\n class?: string;\r\n section?: string;\r\n}\r\n\r\ninterface StudentDisplay {\r\n name: string;\r\n student_id: string;\r\n class: string;\r\n section: string;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-fee-assignment-create',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n CideInputComponent,\r\n CideEleButtonComponent,\r\n CideSelectComponent,\r\n CideLytSharedWrapperComponent,\r\n ProgramSectionSelectorWrapperComponent,\r\n FeeApplicableFeesComponent,\r\n CideIconComponent\r\n // CideFormFieldErrorComponent\r\n ],\r\n templateUrl: './fee-assignment-create.component.html',\r\n styles: [`\r\n .glass-card {\r\n background: rgba(255, 255, 255, 0.9);\r\n backdrop-filter: blur(10px);\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\r\n }\r\n .premium-gradient {\r\n background: linear-gradient(135deg, #f8fafc 0%, #eff6ff 100%);\r\n }\r\n `]\r\n})\r\nexport class FeeAssignmentCreateComponent implements OnInit, OnDestroy {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly fb = inject(FormBuilder);\r\n private readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly notificationService = inject(NotificationService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly entityService = inject<IEntityService>(ENTITY_SERVICE_TOKEN);\r\n private readonly academicYearService = inject<IAcademicYearService>(ACADEMIC_YEAR_SERVICE_TOKEN);\r\n private readonly generalMasterService = inject<IGeneralMasterService>(GENERAL_MASTER_SERVICE_TOKEN);\r\n private readonly feeStructureService = inject(CideFeeFeeStructureService);\r\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\r\n private readonly userMasterService = inject(CideCoreUserMasterService);\r\n private readonly componentContextService = inject(ComponentContextService);\r\n private readonly appStateService = inject(AppStateService);\r\n private readonly requestService = inject(CideLytRequestService);\r\n private readonly discountRuleService = inject(CideFeeDiscountRuleService);\r\n\r\n assignmentForm!: FormGroup;\r\n readonly loading = signal<boolean>(false);\r\n readonly submitting = signal<boolean>(false);\r\n\r\n readonly assignmentId = signal<string>('');\r\n readonly isEditMode = signal<boolean>(false);\r\n readonly isViewMode = signal<boolean>(false);\r\n\r\n // Breadcrumb data for shared wrapper\r\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\r\n\r\n readonly entityOptions = signal<Entity[]>([]);\r\n readonly feeStructureOptions = signal<LocalFeeStructure[]>([]);\r\n readonly entityLoading = signal<boolean>(false);\r\n\r\n readonly feeStructureLoading = signal<boolean>(false);\r\n\r\n // Fee insights - Removed old signals, now using selectedFeeItems from child component\r\n readonly selectedFeeItems = signal<ApplicableFeeItem[]>([]);\r\n readonly triggerLoad = signal<boolean>(false); // Trigger for child component\r\n readonly selectedStudent = signal<StudentDisplay | null>(null);\r\n readonly feeSourceOptions = [\r\n { value: 'STRUCTURE', label: 'From Fee Structure' },\r\n { value: 'CUSTOM', label: 'Custom Fee' }\r\n ];\r\n\r\n readonly discountRules = signal<FeeDiscountRule[]>([]);\r\n readonly discountRuleOptions = computed(() => {\r\n return this.discountRules().map(rule => ({\r\n value: rule._id || '',\r\n label: `${rule.feedr_name} (${rule.feedr_discount_type === 'PERCENTAGE' ? rule.feedr_discount_value + '%' : '₹' + rule.feedr_discount_value})`\r\n }));\r\n });\r\n\r\n readonly feeCategories = signal<ICoreSygms[]>([]);\r\n readonly feeCategoriesLoading = signal<boolean>(false);\r\n readonly feeCategoryOptions = computed(() => {\r\n return this.feeCategories().map(cat => ({\r\n value: cat._id || '',\r\n label: cat.sygms_title || cat.sygms_code || ''\r\n }));\r\n });\r\n\r\n readonly feeTypeOptions = [\r\n { value: 'ONE_TIME', label: 'One Time' },\r\n { value: 'RECURRING', label: 'Recurring' }\r\n ];\r\n\r\n // Create signals for form values to use in computed\r\n readonly feeSource = signal<string>('STRUCTURE');\r\n readonly originalAmount = signal<number>(0);\r\n readonly discountAmount = signal<number>(0);\r\n readonly scholarshipAmount = signal<number>(0);\r\n\r\n // Signals for Structure IDs (to ensure reactive template bindings)\r\n readonly classProgramId = signal<string>('');\r\n readonly branchId = signal<string>('');\r\n readonly termId = signal<string>('');\r\n readonly sectionId = signal<string>('');\r\n readonly studentId = signal<string>('');\r\n\r\n readonly showCustomFeeFields = computed(() => {\r\n return this.feeSource() === 'CUSTOM';\r\n });\r\n\r\n readonly showFeeStructureField = computed(() => {\r\n return this.feeSource() === 'STRUCTURE';\r\n });\r\n\r\n readonly totalAmount = computed(() => {\r\n const original = this.originalAmount() || 0;\r\n const discount = this.discountAmount() || 0;\r\n const scholarship = this.scholarshipAmount() || 0;\r\n return Math.max(0, original - discount - scholarship);\r\n });\r\n\r\n constructor() {\r\n this.initializeForm();\r\n }\r\n\r\n private initializeForm(): void {\r\n this.assignmentForm = this.fb.group({\r\n // Student Information\r\n feeas_student_id_auth: ['', [Validators.required]],\r\n\r\n feeas_academic_year_id_acayr: ['', [Validators.required]],\r\n feeas_entity_id_syen: ['', [Validators.required]],\r\n\r\n // Academic Information (for fee structure loading)\r\n class_program_id: [''],\r\n branch_id: [''],\r\n term_id: [''],\r\n section_id: [''],\r\n\r\n // Fee Information\r\n fee_source: ['STRUCTURE', [Validators.required]],\r\n feeas_fee_structure_id_feest: [''],\r\n\r\n // Custom Fee Fields\r\n feeas_fee_category_sygms: [''],\r\n feeas_fee_name: [''],\r\n feeas_fee_type: ['ONE_TIME'],\r\n discount_rule_id: [''],\r\n feeas_original_amount: [0, [Validators.required, Validators.min(0)]],\r\n\r\n // Discounts & Scholarships\r\n feeas_discount_amount: [0, [Validators.min(0)]],\r\n feeas_scholarship_amount: [0, [Validators.min(0)]]\r\n });\r\n\r\n // Set conditional validators based on fee source\r\n this.assignmentForm.get('fee_source')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(source => {\r\n this.feeSource.set(source); // Update signal\r\n if (source === 'STRUCTURE') {\r\n this.assignmentForm.get('feeas_fee_structure_id_feest')?.setValidators([Validators.required]);\r\n this.assignmentForm.get('feeas_fee_category_sygms')?.clearValidators();\r\n this.assignmentForm.get('feeas_fee_name')?.clearValidators();\r\n this.assignmentForm.get('feeas_original_amount')?.clearValidators();\r\n } else if (source === 'CUSTOM') {\r\n this.assignmentForm.get('feeas_fee_structure_id_feest')?.clearValidators();\r\n this.assignmentForm.get('feeas_fee_category_sygms')?.setValidators([Validators.required]);\r\n this.assignmentForm.get('feeas_fee_name')?.setValidators([Validators.required]);\r\n this.assignmentForm.get('feeas_original_amount')?.setValidators([Validators.required, Validators.min(0)]);\r\n }\r\n this.assignmentForm.updateValueAndValidity();\r\n });\r\n\r\n // Listen for entity or academic year changes to load manual discount rules\r\n this.assignmentForm.get('feeas_entity_id_syen')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.loadManualDiscountRules());\r\n\r\n this.assignmentForm.get('feeas_academic_year_id_acayr')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.loadManualDiscountRules());\r\n\r\n // Listen for discount rule selection\r\n this.assignmentForm.get('discount_rule_id')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(ruleId => this.applySelectedDiscountRule(ruleId));\r\n\r\n // Update amount signals\r\n this.assignmentForm.get('feeas_original_amount')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(val => this.originalAmount.set(parseFloat(val || '0')));\r\n\r\n this.assignmentForm.get('feeas_discount_amount')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(val => this.discountAmount.set(parseFloat(val || '0')));\r\n\r\n this.assignmentForm.get('feeas_scholarship_amount')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(val => this.scholarshipAmount.set(parseFloat(val || '0')));\r\n\r\n // Watch for program/term/section changes to update signals\r\n this.assignmentForm.get('class_program_id')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(val => this.classProgramId.set(val || ''));\r\n\r\n this.assignmentForm.get('branch_id')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(val => this.branchId.set(val || ''));\r\n\r\n this.assignmentForm.get('term_id')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(val => this.termId.set(val || ''));\r\n\r\n this.assignmentForm.get('section_id')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(val => this.sectionId.set(val || ''));\r\n\r\n // Listen for student changes to update display card and signal\r\n this.assignmentForm.get('feeas_student_id_auth')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(id => {\r\n this.studentId.set(id || '');\r\n if (!id) {\r\n this.selectedStudent.set(null);\r\n } else {\r\n this.loadStudentDetails(id);\r\n }\r\n });\r\n }\r\n\r\n private rightsService = inject(RightsService);\r\n\r\n ngOnInit(): void {\r\n // Initialize rights for fee assignment management\r\n this.rightsService.initializeRights('fee_assignment');\r\n this.initializeComponent();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup if needed\r\n }\r\n\r\n loadManualDiscountRules(): void {\r\n const entityId = this.assignmentForm.get('feeas_entity_id_syen')?.value;\r\n const academicYearId = this.assignmentForm.get('feeas_academic_year_id_acayr')?.value;\r\n\r\n if (!entityId || !academicYearId) return;\r\n\r\n const payload = new MFeeDiscountRule({\r\n feedr_entity_id_syen: entityId,\r\n feedr_academic_year_id_acayr: academicYearId,\r\n feedr_mode: 'MANUAL',\r\n feedr_status: 'ACTIVE',\r\n pageSize: 100\r\n } as any);\r\n\r\n this.discountRuleService.getDiscountRuleList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((res: any) => {\r\n if (res.success) {\r\n this.discountRules.set(res.data || []);\r\n }\r\n });\r\n }\r\n\r\n applySelectedDiscountRule(ruleId: string): void {\r\n if (!ruleId) {\r\n this.assignmentForm.get('feeas_discount_amount')?.setValue(0);\r\n return;\r\n }\r\n\r\n const rule = this.discountRules().find(r => r._id === ruleId);\r\n if (rule) {\r\n const originalAmount = this.assignmentForm.get('feeas_original_amount')?.value || 0;\r\n let calculatedDiscount = 0;\r\n\r\n if (rule.feedr_discount_type === 'PERCENTAGE') {\r\n calculatedDiscount = (originalAmount * (rule.feedr_discount_value || 0)) / 100;\r\n } else {\r\n calculatedDiscount = rule.feedr_discount_value || 0;\r\n }\r\n\r\n this.assignmentForm.get('feeas_discount_amount')?.setValue(calculatedDiscount);\r\n }\r\n }\r\n\r\n private initializeComponent(): void {\r\n this.updateBreadcrumbData();\r\n\r\n this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {\r\n const queryParams = params['query'];\r\n\r\n if (queryParams) {\r\n const queryData = generateObjectFromString(queryParams);\r\n if (queryData?.feeas_id) {\r\n this.assignmentId.set(queryData.feeas_id as string);\r\n this.isEditMode.set(true);\r\n this.loadAssignmentData(queryData.feeas_id as string);\r\n }\r\n } else {\r\n this.isEditMode.set(false);\r\n }\r\n\r\n // Always load dropdown options\r\n this.loadDropdownOptions();\r\n });\r\n\r\n // Check if view mode\r\n const path = this.route.snapshot.url.map(segment => segment.path).join('/');\r\n this.isViewMode.set(path.includes('view'));\r\n\r\n if (this.isViewMode()) {\r\n this.assignmentForm.disable();\r\n }\r\n\r\n // Update breadcrumb after mode is determined\r\n this.updateBreadcrumbData();\r\n }\r\n\r\n private loadDropdownOptions(): void {\r\n const entityId = this.appStateService.getActiveEntityValue()?._id;\r\n\r\n // Set entity ID in form\r\n if (entityId) {\r\n this.assignmentForm.patchValue({ feeas_entity_id_syen: entityId });\r\n }\r\n\r\n // Load entity options (optional, mainly for admin reference)\r\n this.entityLoading.set(true);\r\n this.entityService.getEntityList({}).subscribe({\r\n next: (response) => {\r\n if (response?.success && response.data) {\r\n this.entityOptions.set(response.data);\r\n }\r\n this.entityLoading.set(false);\r\n },\r\n error: () => {\r\n this.entityLoading.set(false);\r\n }\r\n });\r\n\r\n // Load academic year options\r\n const academicYearId = this.appStateService.getActiveAcademicYearValue()?._id;\r\n\r\n if (academicYearId) {\r\n this.assignmentForm.patchValue({ feeas_academic_year_id_acayr: academicYearId });\r\n }\r\n\r\n\r\n // Load fee structure options\r\n this.loadFeeStructures(entityId);\r\n\r\n // Load fee categories\r\n this.loadFeeCategories(entityId);\r\n\r\n // Load student options\r\n this.onStudentSearch('');\r\n }\r\n\r\n private loadFeeCategories(entityId?: string): void {\r\n this.feeCategoriesLoading.set(true);\r\n\r\n const currentEntityId = entityId || this.appStateService.getActiveEntityValue()?._id;\r\n\r\n const payload: IGeneralMasterListRequest = {\r\n sygmt_code: 'fee_category'\r\n };\r\n\r\n if (currentEntityId) {\r\n payload.sygms_entity_id_syen = currentEntityId;\r\n }\r\n\r\n this.generalMasterService.getMasterList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: generalMasterListControllerResponse) => {\r\n if (response?.success && response?.data) {\r\n const categories: ICoreSygms[] = Array.isArray(response.data) ? response.data : [];\r\n const activeCategories = categories.filter((category: ICoreSygms) => category.sygms_isactive !== false);\r\n this.feeCategories.set(activeCategories);\r\n }\r\n this.feeCategoriesLoading.set(false);\r\n },\r\n error: (error: unknown) => {\r\n console.error('Error loading fee categories:', error);\r\n this.feeCategoriesLoading.set(false);\r\n }\r\n });\r\n }\r\n\r\n private loadFeeStructures(entityId?: string): void {\r\n const currentEntityId = entityId || this.appStateService.getActiveEntityValue()?._id;\r\n\r\n this.feeStructureLoading.set(true);\r\n const payload = new MFeeStructure({\r\n fees_is_active: true,\r\n pagination: false,\r\n fees_entity_id_syen: currentEntityId\r\n });\r\n\r\n this.feeStructureService.getFeeStructureList(payload).subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data) {\r\n this.feeStructureOptions.set(\r\n response.data.map(fs => ({\r\n _id: fs._id,\r\n fees_structure_name: fs.fees_structure_name || '',\r\n fees_structure_code: fs.fees_structure_code || ''\r\n }))\r\n );\r\n } else {\r\n this.feeStructureOptions.set([]);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Error loading fee structures:', err);\r\n // Silent error or specific notification?\r\n // this.notificationService.error('Failed to load fee structures');\r\n this.feeStructureOptions.set([]);\r\n },\r\n complete: () => {\r\n this.feeStructureLoading.set(false);\r\n }\r\n });\r\n }\r\n\r\n private loadAssignmentData(id: string): void {\r\n this.loading.set(true);\r\n this.feeAssignmentService.getFeeAssignmentById(id).subscribe({\r\n next: (response: any) => {\r\n if (response?.success && response?.data) {\r\n const data = response.data;\r\n // Extract fee structure ID from response (could be string or populated object)\r\n const feeStructureId = typeof data.feeas_fee_structure_id_feest === 'string'\r\n ? data.feeas_fee_structure_id_feest\r\n : (data.feeas_fee_structure_id_feest as any)?._id || '';\r\n\r\n this.assignmentForm.patchValue({\r\n feeas_student_id_auth: data.feeas_student_id_auth || '',\r\n fee_source: feeStructureId ? 'STRUCTURE' : 'CUSTOM',\r\n feeas_fee_structure_id_feest: feeStructureId || '',\r\n feeas_fee_category_sygms: data.feeas_fee_category_sygms || '',\r\n feeas_fee_name: data.feeas_fee_name || '',\r\n feeas_fee_description: data.feeas_fee_description || '',\r\n feeas_fee_type: data.feeas_fee_type || 'ONE_TIME',\r\n feeas_original_amount: data.feeas_original_amount || 0,\r\n feeas_discount_amount: data.feeas_discount_amount || 0,\r\n feeas_scholarship_amount: data.feeas_scholarship_amount || 0\r\n });\r\n\r\n // Populate student dropdown for edit mode\r\n if (data.feeas_student_id_auth) {\r\n let studentLabel = '';\r\n if (typeof data.feeas_student_id_auth === 'string') {\r\n studentLabel = data.feeas_student_id_auth;\r\n } else {\r\n studentLabel = (data.feeas_student_id_auth as any)?.name || (data.feeas_student_id_auth as any)?._id || '';\r\n }\r\n\r\n // Try to get name from admission if populated\r\n const admission = (data as any).feeas_admission_id_admap;\r\n if (admission && (admission.admap_first_name || admission.admap_last_name)) {\r\n studentLabel = `${admission.admap_first_name || ''} ${admission.admap_last_name || ''}`.trim() +\r\n (admission.admap_application_number ? ` (${admission.admap_application_number})` : '');\r\n }\r\n\r\n this.studentListOptions.set([{\r\n label: studentLabel,\r\n value: typeof data.feeas_student_id_auth === 'string' ? data.feeas_student_id_auth : (data.feeas_student_id_auth as any)?._id || ''\r\n }]);\r\n }\r\n }\r\n },\r\n error: (err: any) => {\r\n console.error('Error loading assignment data:', err);\r\n this.notificationService.error('Failed to load assignment data');\r\n },\r\n complete: () => {\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n private loadStudentDetails(studentId: string): void {\r\n const payload: any = {\r\n _id: studentId, // Query by ID\r\n pagination: false,\r\n syenm_entity_id_syen: this.appStateService.getActiveEntityValue()?._id || '',\r\n syutm_user_type: 'STUDENT'\r\n };\r\n\r\n this.userMasterService.getUserList(payload).subscribe({\r\n next: (response: any) => {\r\n if (response?.success && response?.data) {\r\n const data = Array.isArray(response.data) ? response.data : [response.data];\r\n if (data.length > 0) {\r\n const student = data[0] as any;\r\n this.selectedStudent.set({\r\n name: (student.admap_first_name || student.user_fullname || 'Unknown') + ' ' + (student.admap_last_name || ''),\r\n student_id: student.admap_student_id || student.user_type_mapping?.syutm_type_specific_id || student._id || '',\r\n class: student.class || 'N/A',\r\n section: student.section || 'N/A'\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n readonly studentListOptions = signal<{ label: string; value: string }[]>([]);\r\n\r\n onStudentSearch(event: any): void {\r\n const searchQuery = typeof event === 'object' ? event?.query || '' : String(event || '');\r\n\r\n\r\n this.loading.set(true);\r\n\r\n // Search for students using user master service\r\n const payload: AuthUserMstListPayload = {\r\n query: searchQuery,\r\n pageIndex: 1,\r\n pageSize: 50, // Increase page size for dropdown\r\n pagination: true,\r\n syenm_entity_id_syen: this.appStateService.getActiveEntityValue()?._id || '',\r\n syutm_user_type: 'STUDENT' // Filter by student type on backend\r\n };\r\n\r\n this.userMasterService.getUserList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: authUserMstListControllerResponse) => {\r\n if (response?.success && response?.data) {\r\n // Map results to dropdown options\r\n // Relaxed client-side filtering: Trust backend filtering or check if it looks like a student\r\n // We use the data returned by the API directly\r\n const options = (response.data as StudentUser[]).map((user: StudentUser) => {\r\n const studentName = user.user_fullname || 'Unknown';\r\n const specificId = user.user_type_mapping?.syutm_type_specific_id || '';\r\n const userId = user._id || '';\r\n\r\n return {\r\n label: `${studentName}${specificId ? ' (' + specificId + ')' : ''}`,\r\n value: userId\r\n };\r\n });\r\n\r\n this.studentListOptions.set(options);\r\n\r\n if (options.length === 0) {\r\n // Optional: notification or just empty dropdown\r\n }\r\n } else {\r\n this.studentListOptions.set([]);\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error searching for students:', err);\r\n this.studentListOptions.set([]);\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handler for program section selector value changes\r\n * Note: We don't trigger load here anymore as form value changes drive the signals\r\n */\r\n onProgramSectionValuesChange(values: { classProgramId?: string | null; branchId?: string | null; termId?: string | null; sectionId?: string | null }): void {\r\n // No-op: Signals handle reactivity now\r\n }\r\n\r\n onFeesCalculated(data: { fees: ApplicableFeeItem[] }): void {\r\n this.selectedFeeItems.set(data.fees);\r\n }\r\n\r\n /**\r\n * Load applicable fees based on selected program/term/section\r\n */\r\n\r\n\r\n onSubmit(): void {\r\n const requiredRight = this.isEditMode() ? 'EDIT' : 'CREATE';\r\n if (!this.rightsService.hasRight(requiredRight)) {\r\n this.notificationService.error(`You do not have permission to ${this.isEditMode() ? 'edit' : 'create'} fee assignments`);\r\n return;\r\n }\r\n if (this.assignmentForm.invalid || this.submitting()) {\r\n this.assignmentForm.markAllAsTouched();\r\n this.notificationService.warning('Please fill in all required fields correctly.');\r\n return;\r\n }\r\n\r\n this.submitting.set(true);\r\n\r\n const formValue = this.assignmentForm.getRawValue();\r\n\r\n // If using fee structure, create assignments for each fee item\r\n // If using fee structure, create assignments for each fee item\r\n if (formValue.fee_source === 'STRUCTURE' && this.selectedFeeItems().length > 0) {\r\n // Create multiple fee assignments for each fee item\r\n const assignments = this.selectedFeeItems().map(fee => {\r\n const discount = fee.discount || 0;\r\n const scholarship = fee.scholarship || 0;\r\n const originalAmount = fee.fees_amount || 0;\r\n // Calculate final amount correctly\r\n const finalAmount = fee.final_amount !== undefined ? fee.final_amount : Math.max(0, originalAmount - discount - scholarship);\r\n\r\n return {\r\n _id: this.isEditMode() ? this.assignmentId() : undefined,\r\n feeas_student_id_auth: formValue.feeas_student_id_auth,\r\n feeas_fee_structure_id_feest: fee.fees_structure_id,\r\n feeas_fee_structure_item_id_feesi: fee._id,\r\n feeas_academic_year_id_acayr: formValue.feeas_academic_year_id_acayr,\r\n feeas_entity_id_syen: formValue.feeas_entity_id_syen,\r\n feeas_class_program_id_acacpm: formValue.class_program_id || undefined,\r\n feeas_section_id_acapts: formValue.section_id || undefined,\r\n feeas_admission_id_admap: (this.selectedStudent() as any)?.admap_id || undefined,\r\n // Minimal payload - Backend populates Name, Category, Type, etc.\r\n feeas_original_amount: originalAmount,\r\n feeas_discount_amount: discount,\r\n feeas_scholarship_amount: scholarship,\r\n feeas_final_amount: finalAmount,\r\n feeas_assigned_amount: finalAmount // Ensure assigned amount is set with final amount\r\n };\r\n });\r\n\r\n\r\n // Call bulk update API\r\n this.feeAssignmentService.saveUpdateFeeAssignment(assignments as any).subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.notificationService.success(\r\n `Successfully assigned ${assignments.length} fee(s) to student!`\r\n );\r\n // Refresh list and close tab\r\n this.requestService.forceRefreshRoute('/control-panel/assignment');\r\n this.componentContextService.close(['/control-panel/assignment']);\r\n } else {\r\n this.notificationService.error(response?.message || 'Some fee assignments failed. Please check and try again.');\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Error saving fee assignments:', err);\r\n this.notificationService.error('Failed to save fee assignments. Please try again.');\r\n },\r\n complete: () => {\r\n this.submitting.set(false);\r\n }\r\n });\r\n } else {\r\n // Custom fee assignment\r\n const payload = {\r\n _id: this.isEditMode() ? this.assignmentId() : undefined,\r\n feeas_student_id_auth: formValue.feeas_student_id_auth,\r\n feeas_fee_structure_id_feest: undefined,\r\n feeas_fee_structure_item_id_feesi: undefined,\r\n feeas_academic_year_id_acayr: formValue.feeas_academic_year_id_acayr,\r\n feeas_entity_id_syen: formValue.feeas_entity_id_syen,\r\n feeas_class_program_id_acacpm: formValue.class_program_id || undefined,\r\n feeas_section_id_acapts: formValue.section_id || undefined,\r\n feeas_admission_id_admap: (this.selectedStudent() as any)?.admap_id || undefined,\r\n feeas_fee_category_sygms: formValue.feeas_fee_category_sygms,\r\n feeas_fee_name: formValue.feeas_fee_name,\r\n feeas_fee_type: formValue.feeas_fee_type || 'ONE_TIME',\r\n feeas_original_amount: formValue.feeas_original_amount || 0,\r\n feeas_due_date: formValue.feeas_due_date, // Include due date\r\n feeas_discount_amount: formValue.feeas_discount_amount || 0,\r\n feeas_scholarship_amount: formValue.feeas_scholarship_amount || 0\r\n };\r\n\r\n this.feeAssignmentService.saveUpdateFeeAssignment(payload).subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.notificationService.success(\r\n `Fee assignment ${this.isEditMode() ? 'updated' : 'created'} successfully!`\r\n );\r\n // Refresh list and close tab\r\n this.requestService.forceRefreshRoute('/control-panel/assignment');\r\n this.componentContextService.close(['/control-panel/assignment']);\r\n } else {\r\n this.notificationService.error(response?.message || 'Failed to save fee assignment');\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Error saving fee assignment:', err);\r\n this.notificationService.error('Failed to save fee assignment. Please try again.');\r\n },\r\n complete: () => {\r\n this.submitting.set(false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n resetForm(): void {\r\n if (this.isEditMode() && this.assignmentId()) {\r\n // Reload data in edit mode\r\n this.loadAssignmentData(this.assignmentId()!);\r\n } else {\r\n // Reset to defaults in create mode\r\n if (this.assignmentForm.dirty) {\r\n this.confirmationService.ask({\r\n title: 'Reset Form?',\r\n message: 'Are you sure you want to reset the form? All unsaved changes will be lost.',\r\n confirmText: 'Reset',\r\n cancelText: 'Cancel',\r\n type: 'warning'\r\n }).then((confirmed: boolean | string) => {\r\n if (confirmed) {\r\n this.assignmentForm.reset({\r\n fee_source: 'STRUCTURE',\r\n feeas_fee_type: 'ONE_TIME',\r\n feeas_original_amount: 0,\r\n feeas_discount_amount: 0,\r\n feeas_scholarship_amount: 0\r\n });\r\n this.assignmentId.set('');\r\n this.isEditMode.set(false);\r\n this.notificationService.info('Form has been reset.');\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n if (this.assignmentForm.dirty) {\r\n this.confirmationService.ask({\r\n title: 'Discard Changes?',\r\n message: 'You have unsaved changes. Are you sure you want to leave?',\r\n confirmText: 'Discard',\r\n cancelText: 'Cancel',\r\n type: 'warning'\r\n }).then((confirmed: boolean | string) => {\r\n if (confirmed) {\r\n this.componentContextService.close(['/control-panel/assignment']);\r\n }\r\n });\r\n } else {\r\n this.componentContextService.close(['/control-panel/assignment']);\r\n }\r\n }\r\n\r\n getFeeStructureOptions(): Array<{ value: string; label: string }> {\r\n return this.feeStructureOptions().map(fs => ({\r\n value: fs._id || '',\r\n label: `${fs.fees_structure_name || ''} (${fs.fees_structure_code || ''})`\r\n }));\r\n }\r\n\r\n formatCurrency(amount: number): string {\r\n return `₹${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\r\n }\r\n\r\n /**\r\n * Update breadcrumb data based on mode\r\n */\r\n private updateBreadcrumbData(): void {\r\n const additionalItems: { id: string; label: string; icon?: string; url?: string }[] = [];\r\n\r\n if (this.isEditMode() || this.isViewMode()) {\r\n if (this.isViewMode()) {\r\n additionalItems.push({\r\n id: 'view',\r\n label: 'View',\r\n icon: 'visibility',\r\n url: undefined\r\n });\r\n } else {\r\n additionalItems.push({\r\n id: 'edit',\r\n label: 'Edit',\r\n icon: 'edit',\r\n url: undefined\r\n });\r\n }\r\n } else {\r\n // Create mode\r\n additionalItems.push({\r\n id: 'create',\r\n label: 'Create',\r\n icon: 'add',\r\n url: undefined\r\n });\r\n }\r\n\r\n this.breadcrumbData.set(additionalItems);\r\n }\r\n}\r\n\r\n","<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_assignment' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n\r\n <!-- Main Grid Layout -->\r\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\">\r\n\r\n <!-- Main Column: Form Area (Centered) -->\r\n <div class=\"lg:tw-col-span-10 lg:tw-col-start-2 tw-flex tw-flex-col tw-gap-4 tw-overflow-y-auto tw-pr-2\">\r\n <!-- Section 1: Student Context -->\r\n <div class=\"glass-card tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">person_search</cide-ele-icon>\r\n Student Context\r\n </h3>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4 tw-items-start\" [formGroup]=\"assignmentForm\">\r\n <div>\r\n <cide-ele-select label=\"Select Student\" formControlName=\"feeas_student_id_auth\"\r\n [options]=\"studentListOptions()\" size=\"sm\" leadingIcon=\"person\" placeholder=\"Search student name or ID...\"\r\n (searchChange)=\"onStudentSearch($event)\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <!-- Selected Student Display -->\r\n @if (selectedStudent()) {\r\n <div\r\n class=\"premium-gradient tw-p-3 tw-rounded-lg tw-border tw-border-blue-100 tw-flex tw-items-center tw-gap-4\">\r\n <div\r\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\">\r\n {{ selectedStudent()?.name?.[0] || '?' }}\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-bold tw-text-gray-900\">{{ selectedStudent()?.name }}</div>\r\n <div class=\"tw-text-xs tw-text-gray-500\">ID: {{ selectedStudent()?.student_id }}</div>\r\n <div class=\"tw-text-[10px] tw-text-blue-600 tw-font-medium tw-mt-1\">\r\n {{ selectedStudent()?.class }} | {{ selectedStudent()?.section }}\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div\r\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\">\r\n Select a student to view details\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Academic Placement (Conditional for Structure) -->\r\n @if (showFeeStructureField()) {\r\n <div class=\"tw-mt-4 tw-pt-4 tw-border-t tw-border-gray-100\">\r\n <label class=\"tw-block tw-text-xs tw-font-medium tw-text-gray-500 tw-mb-2\">\r\n ACADEMIC PLACEMENT filters (Required for Fee Structure)\r\n </label>\r\n <cide-shared-program-section-selector-wrapper [formGroup]=\"assignmentForm\"\r\n classProgramControlName=\"class_program_id\" branchControlName=\"branch_id\" termControlName=\"term_id\"\r\n sectionControlName=\"section_id\" [academicYearId]=\"assignmentForm.get('feeas_academic_year_id_acayr')?.value\"\r\n [entityId]=\"assignmentForm.get('feeas_entity_id_syen')?.value\" [disabled]=\"isViewMode()\"\r\n (valuesChange)=\"onProgramSectionValuesChange($event)\">\r\n </cide-shared-program-section-selector-wrapper>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Section 2: Fee Configuration -->\r\n <div class=\"glass-card tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">settings</cide-ele-icon>\r\n Fee Configuration\r\n </h3>\r\n </div>\r\n\r\n <div class=\"tw-space-y-4\" [formGroup]=\"assignmentForm\">\r\n <!-- Source Selection -->\r\n <div class=\"tw-w-full md:tw-w-1/2\">\r\n <cide-ele-select label=\"Fee Assignment Mode\" formControlName=\"fee_source\" [options]=\"feeSourceOptions\"\r\n size=\"sm\" leadingIcon=\"tune\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <!-- Mode: Structure -->\r\n @if (showFeeStructureField()) {\r\n <div>\r\n <cide-fee-applicable-fees [entityId]=\"assignmentForm.get('feeas_entity_id_syen')?.value\"\r\n [academicYearId]=\"assignmentForm.get('feeas_academic_year_id_acayr')?.value\"\r\n [classProgramId]=\"classProgramId()\" [termId]=\"termId()\" [branchId]=\"branchId()\" [sectionId]=\"sectionId()\"\r\n [studentId]=\"studentId()\" (feesCalculated)=\"onFeesCalculated($event)\">\r\n </cide-fee-applicable-fees>\r\n </div>\r\n }\r\n\r\n <!-- Mode: Custom -->\r\n @if (showCustomFeeFields()) {\r\n <div class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-select label=\"Category\" formControlName=\"feeas_fee_category_sygms\"\r\n [options]=\"feeCategoryOptions()\" size=\"sm\"></cide-ele-select>\r\n <cide-ele-input label=\"Fee Name\" formControlName=\"feeas_fee_name\" placeholder=\"e.g. Late Fee\"\r\n size=\"sm\"></cide-ele-input>\r\n </div>\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-input label=\"Amount\" formControlName=\"feeas_original_amount\" type=\"number\" placeholder=\"0.00\"\r\n size=\"sm\" leadingIcon=\"currency_rupee\"></cide-ele-input>\r\n <cide-ele-select label=\"Type\" formControlName=\"feeas_fee_type\" [options]=\"feeTypeOptions\"\r\n size=\"sm\"></cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-input label=\"Due Date\" formControlName=\"feeas_due_date\" type=\"date\" size=\"sm\"\r\n leadingIcon=\"event\"></cide-ele-input>\r\n </div>\r\n\r\n <!-- Discounts & Scholarships -->\r\n <div class=\"tw-bg-gray-50 tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\r\n <h6\r\n class=\"tw-text-xs tw-font-bold tw-text-gray-500 tw-uppercase tw-mb-4 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon size=\"xs\">redeem</cide-ele-icon> Discounts & Scholarships\r\n </h6>\r\n\r\n <div class=\"tw-space-y-4\">\r\n <!-- Discount Rule Selector -->\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-select label=\"Apply Discount Rule\" formControlName=\"discount_rule_id\"\r\n [options]=\"discountRuleOptions()\" size=\"sm\" leadingIcon=\"percent\" placeholder=\"Select rule...\">\r\n </cide-ele-select>\r\n\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-pt-6\">\r\n @if (totalAmount() < originalAmount()) { <span\r\n class=\"tw-text-[10px] tw-font-bold tw-text-green-600 tw-bg-green-50 tw-px-2 tw-py-1 tw-rounded\">\r\n SAVE ₹{{ originalAmount() - totalAmount() | number:'1.2-2' }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-input label=\"Manual Discount\" formControlName=\"feeas_discount_amount\" type=\"number\"\r\n placeholder=\"0.00\" size=\"sm\" leadingIcon=\"remove_circle_outline\"></cide-ele-input>\r\n <cide-ele-input label=\"Scholarship\" formControlName=\"feeas_scholarship_amount\" type=\"number\"\r\n placeholder=\"0.00\" size=\"sm\" leadingIcon=\"school\"></cide-ele-input>\r\n </div>\r\n </div>\r\n\r\n <!-- Calculation Summary -->\r\n <div class=\"tw-mt-4 tw-pt-4 tw-border-t tw-border-gray-200 tw-flex tw-flex-col tw-gap-1\">\r\n <div class=\"tw-flex tw-justify-between tw-text-xs tw-text-gray-500\">\r\n <span>Gross Amount:</span>\r\n <span>₹{{ originalAmount() | number:'1.2-2' }}</span>\r\n </div>\r\n <div class=\"tw-flex tw-justify-between tw-text-sm tw-font-bold tw-text-blue-600\">\r\n <span>Net Payable:</span>\r\n <span>₹{{ totalAmount() | number:'1.2-2' }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Footer Actions moved inside the main structure -->\r\n <div class=\"tw-mt-6 tw-pt-6 tw-border-t tw-border-gray-100 tw-flex tw-items-center tw-justify-end tw-gap-3\">\r\n <button cideEleButton variant=\"ghost\" (click)=\"onCancel()\" [disabled]=\"submitting()\">Cancel</button>\r\n\r\n @if (!isEditMode()) {\r\n <button cideEleButton variant=\"ghost\" (click)=\"resetForm()\" [disabled]=\"loading()\">Reset Form</button>\r\n }\r\n\r\n <button cideEleButton variant=\"primary\" class=\"tw-px-8\" [loading]=\"submitting()\"\r\n [disabled]=\"submitting() || assignmentForm.invalid || loading()\" (click)=\"onSubmit()\">\r\n {{ isEditMode() ? 'Update Assignment' : 'Confirm & Assign Fees' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\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 type feePaymentApproveControllerResponse,\r\n type MFeePaymentApprovePayload,\r\n type feePaymentReconcileControllerResponse, // Add this\r\n type MFeePaymentReconcilePayload // Add this\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 * Approve fee payment\r\n * @param payload - Fee payment ID payload\r\n * @returns Observable of the approval response\r\n */\r\n approveFeePayment(payload: MFeePaymentApprovePayload): Observable<feePaymentApproveControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment,\r\n 'approve'\r\n ]);\r\n\r\n return this.http.post(url, payload);\r\n }\r\n\r\n /**\r\n * Reconcile fee payment\r\n * @param payload - Fee payment reconcile payload\r\n * @returns Observable of the reconcile response\r\n */\r\n reconcileFeePayment(payload: MFeePaymentReconcilePayload): Observable<feePaymentReconcileControllerResponse> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n feesRoutesUrl.module,\r\n feesRoutesUrl.payment,\r\n 'reconcile'\r\n ]);\r\n\r\n return this.http.post(url, payload);\r\n }\r\n\r\n /**\r\n * Generate receipt for a payment\r\n * @param paymentId - The ID of the payment\r\n * @returns Observable of the generation response\r\n */\r\n generateReceipt(paymentId: string): Observable<any> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n 'fees',\r\n 'receipt',\r\n 'generate',\r\n paymentId\r\n ]);\r\n return this.http.post(url, {});\r\n }\r\n\r\n /**\r\n * Get receipt HTML for a payment\r\n * @param paymentId - The ID of the payment\r\n * @returns Observable with receipt HTML\r\n */\r\n getReceiptHtml(paymentId: string): Observable<any> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n 'fees',\r\n 'receipt',\r\n paymentId,\r\n 'html'\r\n ]);\r\n return this.http.get(url);\r\n }\r\n}\r\n\r\n","import {\r\n Component,\r\n signal,\r\n computed,\r\n viewChild,\r\n TemplateRef,\r\n DestroyRef,\r\n inject,\r\n OnInit,\r\n type OnDestroy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { debounceTime } from 'rxjs';\r\nimport {\r\n CideEleDataGridComponent,\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n type GridConfiguration,\r\n type GridEvent,\r\n CideEleDropdownComponent,\r\n type DropdownItem,\r\n type TemplateContext,\r\n type DropdownConfig,\r\n ConfirmationService,\r\n NotificationService,\r\n CideSelectComponent,\r\n CideInputComponent\r\n} from 'cloud-ide-element';\r\nimport {\r\n generateStringFromObject,\r\n MFeePayment,\r\n MFeePaymentApprovePayload,\r\n MFeePaymentReconcilePayload, // Add this\r\n AuthUserMstListPayload\r\n} from 'cloud-ide-lms-model';\r\nimport { AppStateHelperService, RightsService, CideLytSharedWrapperComponent, AppStateService } from 'cloud-ide-layout';\r\nimport { ProgramSectionSelectorWrapperComponent } from 'cloud-ide-shared';\r\nimport { CideFeeFeePaymentService } from '../../services/fee-payment.service';\r\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\r\n\r\n// Types\r\ninterface FeePaymentData {\r\n _id?: string;\r\n feepay_receipt_number?: string;\r\n feepay_student_id_auth?: string;\r\n student_name?: string;\r\n feepay_payment_date?: Date;\r\n feepay_payment_mode_id_sygms?: string;\r\n payment_mode_title?: string;\r\n feepay_total_amount?: number;\r\n feepay_late_fee_amount?: number;\r\n feepay_status_id_sygms?: string;\r\n status_title?: string;\r\n class_program_title?: string;\r\n term_title?: string;\r\n feepay_payment_reference?: string;\r\n feepay_is_reconciled?: boolean; // Updated field name\r\n}\r\n\r\n@Component({\r\n selector: 'cide-fee-payment-list',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideEleDataGridComponent,\r\n CideEleDropdownComponent,\r\n CideLytSharedWrapperComponent,\r\n CideSelectComponent,\r\n CideInputComponent,\r\n ProgramSectionSelectorWrapperComponent\r\n ],\r\n templateUrl: './fee-payment-list.component.html',\r\n styles: [`\r\n .fee-payment-listing-container {\r\n @apply tw-w-full tw-h-full;\r\n }\r\n \r\n :host {\r\n @apply tw-w-full tw-h-full tw-flex tw-flex-col;\r\n }\r\n `]\r\n})\r\nexport class FeePaymentListComponent implements OnInit, OnDestroy {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\r\n private readonly router = inject(Router);\r\n private readonly appState = inject(AppStateHelperService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly notificationService = inject(NotificationService);\r\n private readonly rightsService = inject(RightsService);\r\n private readonly appStateService = inject(AppStateService);\r\n private readonly userMasterService = inject(CideCoreUserMasterService);\r\n private readonly fb = inject(FormBuilder);\r\n\r\n // Filter Form\r\n readonly filterForm: FormGroup = this.fb.group({\r\n class_id: [''],\r\n term_id: [''],\r\n section_id: [''],\r\n student_id: [''],\r\n receipt_no: [''],\r\n status: [''],\r\n payment_mode: [''],\r\n is_reconciled: ['']\r\n });\r\n\r\n // Role detection\r\n readonly isStudent = computed(() => {\r\n const user = this.appState.currentUser();\r\n return (user as any)?.user_type_mapping?.syutm_user_type === 'STUDENT';\r\n });\r\n\r\n // Student list options for admin filter\r\n readonly studentListOptions = signal<{ label: string; value: string }[]>([]);\r\n\r\n // Breadcrumb data for shared wrapper\r\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\r\n\r\n readonly paymentDetailsRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('paymentDetailsRendererTemplate');\r\n readonly amountRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('amountRendererTemplate');\r\n readonly statusRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('statusRendererTemplate');\r\n readonly actionsDropdownRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('actionsDropdownRendererTemplate');\r\n readonly dateRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('dateRendererTemplate');\r\n readonly reconciledRendererTemplate = viewChild.required<TemplateRef<TemplateContext>>('reconciledRendererTemplate');\r\n\r\n readonly feePayments = signal<FeePaymentData[]>([]);\r\n readonly loading = signal<boolean>(false);\r\n readonly error = signal<string | null>(null);\r\n\r\n readonly currentPage = signal<number>(1);\r\n readonly pageSize = signal<number>(10);\r\n readonly totalItems = signal<number>(0);\r\n readonly totalPages = signal<number>(0);\r\n\r\n readonly searchQuery = signal<string>('');\r\n readonly sortColumn = signal<string>('feepay_payment_date');\r\n readonly sortDirection = signal<'asc' | 'desc'>('desc');\r\n\r\n readonly selectedStatusFilter = signal<string>('');\r\n readonly selectedPaymentModeFilter = signal<string>('');\r\n\r\n readonly gridConfig = computed<GridConfiguration<FeePaymentData>>(() => ({\r\n id: 'fee-payment-list-grid',\r\n columns: [\r\n {\r\n key: 'feepay_receipt_number',\r\n header: 'Receipt #',\r\n type: 'text',\r\n width: '140px',\r\n truncate: true,\r\n align: 'left',\r\n sortable: true\r\n },\r\n {\r\n key: 'details',\r\n header: 'Payment Details',\r\n type: 'custom',\r\n width: 'auto',\r\n truncate: true,\r\n align: 'left',\r\n renderer: 'paymentDetailsRenderer',\r\n sortable: true\r\n },\r\n {\r\n key: 'feepay_payment_date',\r\n header: 'Payment Date',\r\n type: 'custom',\r\n width: '140px',\r\n truncate: false,\r\n align: 'left',\r\n renderer: 'dateRenderer',\r\n sortable: true\r\n },\r\n {\r\n key: 'payment_mode_title',\r\n header: 'Payment Mode',\r\n type: 'text',\r\n width: '120px',\r\n truncate: false,\r\n align: 'left',\r\n sortable: true\r\n },\r\n {\r\n key: 'total_amount',\r\n header: 'Total Amount',\r\n type: 'custom',\r\n width: '150px',\r\n truncate: false,\r\n align: 'right',\r\n renderer: 'amountRenderer',\r\n sortable: true\r\n },\r\n {\r\n key: 'feepay_is_reconciled',\r\n header: 'Reconciled',\r\n type: 'custom',\r\n width: '100px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'reconciledRenderer',\r\n sortable: true\r\n },\r\n {\r\n key: 'feepay_status_id_sygms',\r\n header: 'Status',\r\n type: 'custom',\r\n width: '140px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'statusRenderer'\r\n },\r\n {\r\n key: 'actions',\r\n header: 'Actions',\r\n type: 'custom',\r\n width: '80px',\r\n truncate: false,\r\n align: 'center',\r\n renderer: 'actionsDropdownRenderer'\r\n }\r\n ],\r\n data: this.feePayments(),\r\n trackBy: '_id',\r\n pagination: {\r\n enabled: true,\r\n pageSize: this.pageSize(),\r\n pageSizeOptions: [10, 25, 50, 100],\r\n showQuickJump: true,\r\n showPageInfo: true,\r\n showRefresh: true\r\n },\r\n search: {\r\n enabled: true,\r\n placeholder: 'Search by receipt number, student name...',\r\n searchableColumns: ['feepay_receipt_number', 'student_name'],\r\n debounceMs: 300,\r\n showClearButton: true\r\n },\r\n loading: {\r\n useDefer: true,\r\n skeletonRows: 5,\r\n showOverlay: this.loading()\r\n },\r\n scroll: {\r\n enabled: true,\r\n maxHeight: '',\r\n minHeight: '',\r\n stickyHeader: true,\r\n virtualScroll: false,\r\n rowHeight: 50\r\n },\r\n export: {\r\n enabled: true,\r\n formats: ['csv', 'excel', 'pdf'],\r\n filename: 'fee-payments',\r\n includeHeaders: true\r\n },\r\n responsive: true,\r\n striped: false,\r\n bordered: true,\r\n compact: false,\r\n tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'\r\n }));\r\n\r\n // Rights computed signals\r\n canCreate = computed(() => this.rightsService.hasRight('CREATE'));\r\n canEdit = computed(() => this.rightsService.hasRight('EDIT'));\r\n canDelete = computed(() => this.rightsService.hasRight('DELETE'));\r\n canView = computed(() => this.rightsService.hasRight('VIEW'));\r\n\r\n ngOnInit(): void {\r\n // Initialize rights for fee payment management\r\n this.rightsService.initializeRights('fee_payment');\r\n console.log('💰 Fee Payment List Component initialized');\r\n this.initializeBreadcrumbData();\r\n\r\n // If student, automatically set the student filter\r\n if (this.isStudent()) {\r\n const user = this.appState.currentUser();\r\n const authUserId = user?._id;\r\n if (authUserId) {\r\n this.filterForm.get('student_id')?.setValue(authUserId);\r\n }\r\n }\r\n\r\n this.loadFeePayments();\r\n\r\n // Listen for filter changes\r\n this.filterForm.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(300))\r\n .subscribe(() => {\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n });\r\n }\r\n\r\n resetFilters(): void {\r\n const defaultValues: any = {\r\n class_id: '',\r\n term_id: '',\r\n section_id: '',\r\n receipt_no: '',\r\n status: '',\r\n payment_mode: '',\r\n is_reconciled: ''\r\n };\r\n\r\n // Don't reset student_id if it's a student user\r\n if (!this.isStudent()) {\r\n defaultValues.student_id = '';\r\n }\r\n\r\n this.filterForm.patchValue(defaultValues);\r\n }\r\n\r\n onStudentSearch(query: any): void {\r\n const searchQuery = typeof query === 'string' ? query : query?.detail?.value || '';\r\n if (!searchQuery && searchQuery !== '') {\r\n this.studentListOptions.set([]);\r\n return;\r\n }\r\n\r\n const payload: AuthUserMstListPayload = {\r\n query: searchQuery,\r\n pageIndex: 1,\r\n pageSize: 50,\r\n pagination: true,\r\n syenm_entity_id_syen: this.appState.getActiveEntityId(),\r\n syutm_user_type: 'STUDENT'\r\n };\r\n\r\n this.userMasterService.getUserList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(res => {\r\n if (res && res.data) {\r\n const options = res.data.map((u: any) => ({\r\n label: `${u.syutm_first_name} ${u.syutm_last_name} (${u.syutm_user_id_auth})`,\r\n value: u._id\r\n }));\r\n this.studentListOptions.set(options);\r\n }\r\n });\r\n }\r\n\r\n private initializeBreadcrumbData(): void {\r\n this.breadcrumbData.set([\r\n {\r\n id: 'list',\r\n label: 'List',\r\n icon: 'list',\r\n url: undefined\r\n }\r\n ]);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup if needed\r\n }\r\n\r\n loadFeePayments(): void {\r\n this.loading.set(true);\r\n this.error.set(null);\r\n\r\n const payload: MFeePayment = new MFeePayment({\r\n pageIndex: this.currentPage(),\r\n pageSize: this.pageSize(),\r\n query: this.searchQuery() || \"\",\r\n sort: {\r\n key: this.sortColumn(),\r\n order: this.sortDirection()\r\n }\r\n });\r\n\r\n // Add filters\r\n const filterValues = this.filterForm.value;\r\n const filterParams: any = {};\r\n\r\n if (filterValues.status) {\r\n filterParams.feepay_status_id_sygms = filterValues.status;\r\n }\r\n if (filterValues.payment_mode) {\r\n filterParams.feepay_payment_mode_id_sygms = filterValues.payment_mode;\r\n }\r\n if (filterValues.class_id) {\r\n filterParams.class_id = filterValues.class_id;\r\n }\r\n if (filterValues.term_id) {\r\n filterParams.term_id = filterValues.term_id;\r\n }\r\n if (filterValues.section_id) {\r\n filterParams.section_id = filterValues.section_id;\r\n }\r\n if (filterValues.student_id) {\r\n filterParams.feepay_student_id_auth = filterValues.student_id;\r\n }\r\n if (filterValues.receipt_no) {\r\n filterParams.receipt_no = filterValues.receipt_no;\r\n }\r\n if (filterValues.is_reconciled !== undefined && filterValues.is_reconciled !== null && filterValues.is_reconciled !== '') {\r\n filterParams.feepay_is_reconciled = filterValues.is_reconciled;\r\n }\r\n\r\n // CRITICAL: Add entity filter to prevent cross-entity data leakage\r\n filterParams.feepay_entity_id_syen = this.appState.getActiveEntityId();\r\n\r\n Object.assign(payload, filterParams);\r\n\r\n this.feePaymentService.getFeePaymentList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success && response.data) {\r\n console.log('💰 Fee payments loaded:', response.data);\r\n this.feePayments.set(response.data);\r\n this.totalItems.set(response.total || 0);\r\n this.totalPages.set(Math.ceil((response.total || 0) / this.pageSize()));\r\n\r\n if (response.data.length > 0) {\r\n this.notificationService.success(`Loaded ${response.data.length} payment(s) successfully.`);\r\n }\r\n } else {\r\n this.feePayments.set([]);\r\n this.totalItems.set(0);\r\n this.totalPages.set(0);\r\n this.notificationService.warning('No payments found.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error loading fee payments:', error);\r\n this.error.set('Failed to load fee payments. Please try again.');\r\n this.feePayments.set([]);\r\n this.totalItems.set(0);\r\n this.totalPages.set(0);\r\n this.notificationService.error('Failed to load fee payments. Please try again.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n templateRenderers = computed((): Record<string, TemplateRef<TemplateContext>> => ({\r\n paymentDetailsRenderer: this.paymentDetailsRendererTemplate(),\r\n amountRenderer: this.amountRendererTemplate(),\r\n statusRenderer: this.statusRendererTemplate(),\r\n actionsDropdownRenderer: this.actionsDropdownRendererTemplate(),\r\n dateRenderer: this.dateRendererTemplate(),\r\n reconciledRenderer: this.reconciledRendererTemplate()\r\n }));\r\n\r\n onGridEvent(event: GridEvent<any>): void {\r\n switch (event.type) {\r\n case 'pageChange':\r\n if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {\r\n this.currentPage.set(event.data['pageIndex'] as number);\r\n this.pageSize.set(event.data['pageSize'] as number);\r\n this.loadFeePayments();\r\n }\r\n break;\r\n case 'search':\r\n this.searchQuery.set(event.data as string);\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n break;\r\n case 'refresh':\r\n this.loadFeePayments();\r\n break;\r\n case 'sort':\r\n if (event.data && typeof event.data === 'object' && 'column' in event.data && 'direction' in event.data) {\r\n this.sortColumn.set(event.data['column'] as string);\r\n this.sortDirection.set(event.data['direction'] as 'asc' | 'desc');\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n }\r\n break;\r\n case 'export':\r\n if (event.data && typeof event.data === 'string') {\r\n this.handleExport(event.data);\r\n }\r\n break;\r\n default:\r\n console.log('🔄 Unhandled grid event:', event.type);\r\n }\r\n }\r\n\r\n onStatusFilterChange(): void {\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n }\r\n\r\n onPaymentModeFilterChange(): void {\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n }\r\n\r\n clearFilters(): void {\r\n this.selectedStatusFilter.set('');\r\n this.selectedPaymentModeFilter.set('');\r\n this.searchQuery.set('');\r\n this.currentPage.set(1);\r\n this.loadFeePayments();\r\n }\r\n\r\n processPayment(): void {\r\n if (!this.rightsService.hasRight('CREATE')) {\r\n this.notificationService.error('You do not have permission to process payments');\r\n return;\r\n }\r\n this.router.navigate(['/control-panel/payment/process']);\r\n }\r\n\r\n viewPayment(payment: FeePaymentData): void {\r\n if (!this.rightsService.hasRight('VIEW')) {\r\n this.notificationService.error('You do not have permission to view payments');\r\n return;\r\n }\r\n const queryParams = generateStringFromObject({ feepay_id: payment._id });\r\n this.router.navigate(['/control-panel/payment/view', queryParams]);\r\n }\r\n\r\n printReceipt(payment: FeePaymentData): void {\r\n if (!payment?._id) {\r\n this.notificationService.error('Payment ID not found');\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n this.notificationService.info('Generating receipt...');\r\n\r\n this.feePaymentService.generateReceipt(payment._id).subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n // If HTML returned directly\r\n const html = response.data?.receiptHtml || response.data?.html;\r\n if (html) {\r\n this.printHtml(html);\r\n this.loading.set(false);\r\n } else {\r\n // Fetch HTML if not in generate response\r\n this.feePaymentService.getReceiptHtml(payment._id!).subscribe({\r\n next: (htmlRes) => {\r\n const fetchedHtml = htmlRes?.data?.html || htmlRes?.data?.receiptHtml;\r\n if (fetchedHtml) {\r\n this.printHtml(fetchedHtml);\r\n } else {\r\n this.notificationService.error('Receipt HTML not available');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: () => {\r\n this.notificationService.error('Failed to load receipt HTML');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n } else {\r\n this.notificationService.error(response?.message || 'Failed to generate receipt');\r\n this.loading.set(false);\r\n }\r\n },\r\n error: (err) => {\r\n console.error('Error printing receipt:', err);\r\n this.notificationService.error('Failed to print receipt');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n private printHtml(html: string): void {\r\n const printWindow = window.open('', '_blank');\r\n if (printWindow) {\r\n printWindow.document.write(html);\r\n printWindow.document.close();\r\n printWindow.focus();\r\n setTimeout(() => {\r\n printWindow.print();\r\n printWindow.close();\r\n }, 500);\r\n }\r\n }\r\n\r\n reconcilePayment(payment: FeePaymentData): void {\r\n if (!this.rightsService.hasRight('EDIT')) {\r\n this.notificationService.error('You do not have permission to reconcile payments');\r\n return;\r\n }\r\n\r\n this.confirmationService.ask({\r\n title: 'Reconcile Payment',\r\n message: `Are you sure you want to mark payment ${payment.feepay_receipt_number} as reconciled? This action cannot be undone.`,\r\n confirmText: 'Reconcile',\r\n cancelText: 'Cancel',\r\n type: 'warning',\r\n showInput: true,\r\n inputLabel: 'Reconciliation Remarks',\r\n inputPlaceholder: 'Enter reconciliation remarks (optional)...',\r\n inputValue: 'Manual Reconciliation'\r\n }).then((result: boolean | string) => {\r\n if (result !== false) {\r\n this.loading.set(true);\r\n const payload: MFeePaymentReconcilePayload = new MFeePaymentReconcilePayload({\r\n feepay_id: payment._id,\r\n feepay_reconciled_date: new Date(),\r\n feepay_reconciled_remarks: typeof result === 'string' ? result : ''\r\n });\r\n\r\n this.feePaymentService.reconcileFeePayment(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.notificationService.success('Payment reconciled successfully.');\r\n this.loadFeePayments();\r\n } else {\r\n this.notificationService.error(response?.message || 'Failed to reconcile payment.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error reconciling payment:', error);\r\n this.notificationService.error('Failed to reconcile payment. Please try again.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n approvePayment(payment: FeePaymentData): void {\r\n if (!this.rightsService.hasRight('EDIT')) {\r\n this.notificationService.error('You do not have permission to approve payments');\r\n return;\r\n }\r\n\r\n this.confirmationService.ask({\r\n title: 'Approve Payment',\r\n message: `Are you sure you want to approve payment ${payment.feepay_receipt_number}? This will update the associated fee assignments.`,\r\n confirmText: 'Approve',\r\n cancelText: 'Cancel',\r\n type: 'success'\r\n }).then((confirmed: boolean | string) => {\r\n if (confirmed === true) {\r\n this.loading.set(true);\r\n const payload: MFeePaymentApprovePayload = new MFeePaymentApprovePayload({\r\n feepay_id: payment._id\r\n });\r\n\r\n this.feePaymentService.approveFeePayment(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success) {\r\n this.notificationService.success('Payment approved successfully.');\r\n this.loadFeePayments();\r\n } else {\r\n this.notificationService.error(response?.message || 'Failed to approve payment.');\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (error) => {\r\n console.error('❌ Error approving payment:', error);\r\n this.notificationService.error('Failed to approve payment. Please try again.');\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n getDropdownConfig(): DropdownConfig {\r\n return {\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm'\r\n };\r\n }\r\n\r\n getActionDropdownItems(payment: FeePaymentData): DropdownItem[] {\r\n const items: DropdownItem[] = [\r\n {\r\n id: 'view',\r\n label: 'View Details',\r\n icon: 'visibility',\r\n iconColor: 'tw-text-gray-400',\r\n textColor: 'tw-text-gray-700',\r\n hoverBgColor: 'hover:tw-bg-gray-100'\r\n },\r\n {\r\n id: 'receipt',\r\n label: 'Print Receipt',\r\n icon: 'print',\r\n iconColor: 'tw-text-blue-400',\r\n textColor: 'tw-text-blue-600',\r\n hoverBgColor: 'hover:tw-bg-blue-50'\r\n }\r\n ];\r\n\r\n if (!payment.feepay_is_reconciled) {\r\n items.push({\r\n id: 'reconcile',\r\n label: 'Reconcile',\r\n icon: 'check_circle',\r\n iconColor: 'tw-text-green-400',\r\n textColor: 'tw-text-green-600',\r\n hoverBgColor: 'hover:tw-bg-green-50'\r\n });\r\n }\r\n\r\n if (payment.feepay_status_id_sygms === 'feepay_status_pending' ||\r\n payment.status_title?.toLowerCase().includes('pending')) {\r\n items.push({\r\n id: 'approve',\r\n label: 'Approve Payment',\r\n icon: 'verified',\r\n iconColor: 'tw-text-green-500',\r\n textColor: 'tw-text-green-700',\r\n hoverBgColor: 'hover:tw-bg-green-50'\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n\r\n onDropdownItemClick(item: DropdownItem, payment: FeePaymentData): void {\r\n switch (item.id) {\r\n case 'view':\r\n this.viewPayment(payment);\r\n break;\r\n case 'receipt':\r\n this.printReceipt(payment);\r\n break;\r\n case 'reconcile':\r\n this.reconcilePayment(payment);\r\n break;\r\n case 'approve':\r\n this.approvePayment(payment);\r\n break;\r\n default:\r\n console.log('❓ Unknown dropdown item clicked:', item.id);\r\n }\r\n }\r\n\r\n private handleExport(format: string): void {\r\n console.log(`📤 Exporting fee payments as ${format}`);\r\n // TODO: Implement export functionality\r\n }\r\n\r\n formatCurrency(amount: number | undefined): string {\r\n if (!amount) return '₹0.00';\r\n return `₹${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\r\n }\r\n\r\n formatDate(date: string | Date | null | undefined): string {\r\n if (!date) return '-';\r\n return new Date(date).toLocaleDateString('en-US', {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric'\r\n });\r\n }\r\n\r\n getStatusBadgeClass(payment: FeePaymentData): string {\r\n const status = (payment.feepay_status_id_sygms || '').toLowerCase();\r\n\r\n if (status === 'feepay_status_success' || status === 'success' || status === 'completed') {\r\n return 'tw-bg-green-100 tw-text-green-800';\r\n } else if (status === 'feepay_status_pending' || status === 'pending') {\r\n return 'tw-bg-yellow-100 tw-text-yellow-800';\r\n } else if (status === 'feepay_status_failed' || status === 'feepay_status_cancelled' || status === 'failed' || status === 'cancelled') {\r\n return 'tw-bg-red-100 tw-text-red-800';\r\n } else if (status === 'feepay_status_refunded' || status === 'refunded') {\r\n return 'tw-bg-blue-100 tw-text-blue-800';\r\n }\r\n\r\n switch (status.toUpperCase()) {\r\n case 'SUCCESS':\r\n case 'COMPLETED':\r\n return 'tw-bg-green-100 tw-text-green-800';\r\n case 'PENDING':\r\n return 'tw-bg-yellow-100 tw-text-yellow-800';\r\n case 'FAILED':\r\n return 'tw-bg-red-100 tw-text-red-800';\r\n default:\r\n return 'tw-bg-gray-100 tw-text-gray-800';\r\n }\r\n }\r\n\r\n getStatusText(payment: FeePaymentData): string {\r\n return payment.feepay_status_id_sygms || 'Unknown';\r\n }\r\n}\r\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=\"xs\" leftIcon=\"add\" (click)=\"processPayment()\" [adaptive]=\"true\">\r\n Record Payment\r\n </button>\r\n\r\n </div>\r\n\r\n <div class=\"tw-flex tw-flex-col tw-w-full tw-h-full\">\r\n <!-- Filter Section -->\r\n <div class=\"tw-p-4 tw-bg-gray-50/50 tw-border-b tw-border-gray-200\">\r\n <form [formGroup]=\"filterForm\" class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 lg:tw-grid-cols-12 tw-gap-4 tw-items-end\">\r\n\r\n <!-- Receipt Filter -->\r\n <div class=\"tw-col-span-1 lg:tw-col-span-2\">\r\n <cide-ele-input formControlName=\"receipt_no\" label=\"Receipt #\" placeholder=\"Search Receipt...\" size=\"md\"\r\n leftIcon=\"receipt\"></cide-ele-input>\r\n </div>\r\n\r\n <!-- Academic Filters -->\r\n <div class=\"tw-col-span-1 lg:tw-col-span-6\">\r\n <cide-shared-program-section-selector-wrapper [formGroup]=\"filterForm\" classProgramControlName=\"class_id\"\r\n termControlName=\"term_id\" sectionControlName=\"section_id\" [showLabels]=\"true\"\r\n [gridCols]=\"'tw-grid-cols-1 md:tw-grid-cols-3'\"></cide-shared-program-section-selector-wrapper>\r\n </div>\r\n\r\n <!-- Student Filter (Admin Only) -->\r\n @if (!isStudent()) {\r\n <div class=\"tw-col-span-1 lg:tw-col-span-3\">\r\n <cide-ele-select formControlName=\"student_id\" label=\"Student\" placeholder=\"Search Student...\"\r\n [options]=\"studentListOptions()\" [searchable]=\"true\" (searchChange)=\"onStudentSearch($event)\"\r\n leftIcon=\"person\" size=\"md\"></cide-ele-select>\r\n </div>\r\n }\r\n\r\n <!-- Reconciliation Filter -->\r\n <div class=\"tw-col-span-1 lg:tw-col-span-2\">\r\n <cide-ele-select formControlName=\"is_reconciled\" label=\"Reconciled\" placeholder=\"All\" [options]=\"[\r\n { label: 'All', value: '' },\r\n { label: 'Reconciled', value: 'true' },\r\n { label: 'Not Reconciled', value: 'false' }\r\n ]\" size=\"md\" leftIcon=\"fact_check\"></cide-ele-select>\r\n </div>\r\n\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-col-span-1 lg:tw-col-span-1 tw-flex tw-justify-end\">\r\n <button cideEleButton variant=\"ghost\" type=\"button\" (click)=\"resetFilters()\" leftIcon=\"filter_list_off\"\r\n size=\"md\" class=\"tw-w-full tw-justify-center\">\r\n Reset\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <!-- Grid Section -->\r\n <div class=\"tw-flex-1 tw-relative\">\r\n <div class=\"tw-absolute tw-inset-0 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 </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-xs tw-text-blue-600 tw-font-medium\">\r\n {{ row.class_program_title || '-' }} {{ row.term_title ? '/ ' + row.term_title : '' }}\r\n </div>\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\">ID: {{ row.feepay_student_id_auth || 'N/A' }}</div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #dateRendererTemplate let-row=\"row\">\r\n <span class=\"tw-text-sm tw-text-gray-900\">{{ formatDate(row.feepay_payment_date) }}</span>\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_id_sygms === 'SUCCESS' || row.feepay_status_id_sygms === 'COMPLETED' ? 'check_circle' :\r\n row.feepay_status_id_sygms === 'PENDING' ? 'schedule' : 'error' }}\r\n </cide-ele-icon>\r\n {{ row.status_title || getStatusText(row) }}\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #reconciledRendererTemplate let-row=\"row\">\r\n <div class=\"tw-flex tw-justify-center\">\r\n @if (row.feepay_is_reconciled) {\r\n <cide-ele-icon size=\"sm\" class=\"tw-text-green-500\" title=\"Reconciled\">check_circle</cide-ele-icon>\r\n } @else {\r\n <cide-ele-icon size=\"sm\" class=\"tw-text-gray-300\" title=\"Not Reconciled\">history</cide-ele-icon>\r\n }\r\n </div>\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';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n CideInputComponent,\r\n CideTextareaComponent,\r\n CideEleButtonComponent,\r\n CideIconComponent,\r\n CideSelectComponent,\r\n CideEleDataGridComponent,\r\n GridConfiguration,\r\n GridEvent,\r\n TemplateRenderer,\r\n TemplateContext,\r\n NotificationService,\r\n ConfirmationService\r\n} from 'cloud-ide-element';\r\nimport { CideFeeFeePaymentService } from '../../services/fee-payment.service';\r\nimport { CideFeeFeeAssignmentService } from '../../../fee-assignment-management/services/fee-assignment.service';\r\nimport { GENERAL_MASTER_SERVICE_TOKEN, IGeneralMasterService } from 'cloud-ide-shared';\r\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\r\nimport { CideLytSharedWrapperComponent, AppStateService, RightsService } from 'cloud-ide-layout';\r\nimport { FeePayment, AuthUserMstListPayload, authUserMstListControllerResponse, MFeePaymentInsertUpdatePayload, feePaymentInsertUpdateControllerResponse } from 'cloud-ide-lms-model';\r\nimport { viewChild, TemplateRef } from '@angular/core';\r\n\r\n// Types\r\ninterface OutstandingFee {\r\n id: string;\r\n assignment_id?: string;\r\n fee_head: string;\r\n fee_category: string;\r\n due_date: Date;\r\n outstanding_amount: number;\r\n late_fee: number;\r\n penalty?: number;\r\n is_overdue: boolean;\r\n}\r\n\r\ninterface Student {\r\n _id: string;\r\n name: string;\r\n student_id: string;\r\n class?: string;\r\n section?: string;\r\n academic_year_id?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-fee-payment-process',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n CideInputComponent,\r\n CideTextareaComponent,\r\n CideEleButtonComponent,\r\n CideIconComponent,\r\n CideSelectComponent,\r\n CideLytSharedWrapperComponent,\r\n CideEleDataGridComponent\r\n ],\r\n templateUrl: './fee-payment-process.component.html',\r\n styles: [`\r\n .glass-card {\r\n background: rgba(255, 255, 255, 0.9);\r\n backdrop-filter: blur(10px);\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\r\n }\r\n .premium-gradient {\r\n background: linear-gradient(135deg, #f8fafc 0%, #eff6ff 100%);\r\n }\r\n `]\r\n})\r\nexport class FeePaymentProcessComponent implements OnInit {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly fb = inject(FormBuilder);\r\n private readonly router = inject(Router);\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly feePaymentService = inject(CideFeeFeePaymentService);\r\n private readonly feeAssignmentService = inject(CideFeeFeeAssignmentService);\r\n private readonly userMasterService = inject(CideCoreUserMasterService);\r\n private readonly notificationService = inject(NotificationService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly rightsService = inject(RightsService);\r\n private readonly appStateService = inject(AppStateService);\r\n private readonly generalMasterService = inject(GENERAL_MASTER_SERVICE_TOKEN) as unknown as IGeneralMasterService;\r\n\r\n paymentForm: FormGroup = this.fb.group({\r\n feepay_student_id_auth: ['', [Validators.required]],\r\n student_search: [''],\r\n feepay_payment_date: [new Date().toISOString().split('T')[0], [Validators.required]],\r\n feepay_payment_mode: ['OFFLINE'],\r\n feepay_payment_method: ['', [Validators.required]],\r\n feepay_payment_reference: [''],\r\n feepay_bank_name: [''],\r\n feepay_bank_branch_name: [''],\r\n feepay_bank_ifsc_code: [''],\r\n feepay_instrument_date: [''],\r\n feepay_cheque_number: [''],\r\n feepay_cheque_date: [''],\r\n feepay_bank_account_number: [''],\r\n feepay_transaction_reference: [''],\r\n feepay_discount_percentage: [0, [Validators.min(0), Validators.max(100)]],\r\n feepay_discount_on: ['SUB_TOTAL'],\r\n feepay_discount_reason: [''],\r\n feepay_remarks: [''],\r\n pay_full_outstanding: [false],\r\n fee_items: this.fb.array([])\r\n });\r\n\r\n loading = signal<boolean>(false);\r\n submitting = signal<boolean>(false);\r\n selectedStudent = signal<Student | null>(null);\r\n outstandingFees = signal<OutstandingFee[]>([]);\r\n showChequeDetails = signal<boolean>(false);\r\n showBankDetails = signal<boolean>(false);\r\n\r\n // Grid ViewChilds for templates\r\n readonly selectTemplate = viewChild<TemplateRef<TemplateContext<OutstandingFee>>>('selectTemplate');\r\n readonly amountPaidTemplate = viewChild<TemplateRef<TemplateContext<OutstandingFee>>>('amountPaidTemplate');\r\n readonly outstandingTemplate = viewChild<TemplateRef<TemplateContext<OutstandingFee>>>('outstandingTemplate');\r\n readonly dateTemplate = viewChild<TemplateRef<TemplateContext<OutstandingFee>>>('dateTemplate');\r\n\r\n readonly templateRenderers = computed(() => ({\r\n selectRenderer: this.selectTemplate(),\r\n amountPaidRenderer: this.amountPaidTemplate(),\r\n outstandingRenderer: this.outstandingTemplate(),\r\n dateRenderer: this.dateTemplate()\r\n }));\r\n\r\n readonly gridConfig = computed<GridConfiguration<OutstandingFee>>(() => ({\r\n id: 'outstanding-fees-grid',\r\n columns: [\r\n { key: 'is_selected', header: '', type: 'custom', width: '40px', renderer: 'selectRenderer', align: 'center' },\r\n { key: 'fee_head', header: 'Fee Head', type: 'text', width: 'auto' },\r\n { key: 'fee_category', header: 'Category', type: 'text', width: '120px' },\r\n { key: 'due_date', header: 'Due Date', type: 'custom', width: '100px', renderer: 'dateRenderer' },\r\n { key: 'outstanding_amount', header: 'Outstanding', type: 'custom', width: '110px', renderer: 'outstandingRenderer', align: 'right' },\r\n { key: 'late_fee', header: 'Late Fee', type: 'number', width: '80px', align: 'right' },\r\n { key: 'amount_paid', header: 'Amount to Pay', type: 'custom', width: '130px', renderer: 'amountPaidRenderer', align: 'right' }\r\n ],\r\n data: this.outstandingFees(),\r\n trackBy: 'id',\r\n pagination: { enabled: false, pageSize: 100, pageSizeOptions: [100], showQuickJump: false, showPageInfo: false, showRefresh: false },\r\n search: { enabled: false, placeholder: '', searchableColumns: [] },\r\n loading: { useDefer: true, skeletonRows: 3, showOverlay: this.loading() },\r\n bordered: true,\r\n compact: true,\r\n striped: true,\r\n responsive: true,\r\n tableClass: 'tw-text-xs'\r\n }));\r\n\r\n // Track form values for reactive computations\r\n private readonly _formValueSignal = signal<any>(this.paymentForm.value);\r\n readonly formValues = this._formValueSignal.asReadonly();\r\n\r\n // Breadcrumb data for shared wrapper\r\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\r\n\r\n // Payment method options from General Master\r\n readonly paymentMethodOptions = signal<{ label: string; value: string }[]>([]);\r\n private readonly paymentMethodsRaw = signal<any[]>([]);\r\n private readonly paymentStatusesRaw = signal<any[]>([]);\r\n\r\n readonly studentListOptions = signal<{ label: string; value: string }[]>([]);\r\n\r\n // Computed values\r\n readonly selectedFeeItems = computed(() => {\r\n const values = this.formValues();\r\n const items = values.fee_items || [];\r\n return items.filter((item: any) => item.is_selected);\r\n });\r\n\r\n readonly totalFeeAmount = computed(() => {\r\n const values = this.formValues(); // usage tracks dependency\r\n const items = values.fee_items || [];\r\n return items.reduce((acc: number, item: any) => {\r\n if (item.is_selected) {\r\n return acc + (parseFloat(String(item.amount_paid || '0')) || 0);\r\n }\r\n return acc;\r\n }, 0);\r\n });\r\n\r\n readonly totalLateFee = computed(() => {\r\n const values = this.formValues();\r\n const items = values.fee_items || [];\r\n return items.reduce((acc: number, item: any) => {\r\n if (item.is_selected) {\r\n return acc + (parseFloat(String(item.late_fee || '0')) || 0);\r\n }\r\n return acc;\r\n }, 0);\r\n });\r\n\r\n readonly totalPenalty = computed(() => {\r\n const values = this.formValues();\r\n const items = values.fee_items || [];\r\n return items.reduce((acc: number, item: any) => {\r\n if (item.is_selected) {\r\n return acc + (parseFloat(String(item.penalty || '0')) || 0);\r\n }\r\n return acc;\r\n }, 0);\r\n });\r\n\r\n readonly totalPayable = computed(() => {\r\n return this.totalFeeAmount() + this.totalLateFee() + this.totalPenalty();\r\n });\r\n\r\n // Get fee items form array\r\n get feeItemsArray(): FormArray {\r\n return this.paymentForm.get('fee_items') as FormArray;\r\n }\r\n\r\n ngOnInit(): void {\r\n console.log('💰 Fee Payment Process Component initialized');\r\n this.updateBreadcrumbData();\r\n this.loadPaymentMethodMasters();\r\n this.loadPaymentStatusMasters();\r\n this.setupFormListeners();\r\n this.setupPaymentMethodListener();\r\n\r\n // Ensure form signal is updated\r\n this.paymentForm.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(val => {\r\n this._formValueSignal.set(val);\r\n });\r\n\r\n // Check for studentId and feeIds in query parameters\r\n const studentId = this.route.snapshot.queryParamMap.get('studentId');\r\n if (studentId) {\r\n this.paymentForm.get('feepay_student_id_auth')?.setValue(studentId);\r\n }\r\n }\r\n\r\n private loadPaymentStatusMasters(): void {\r\n this.generalMasterService.getMasterList({ sygmt_code: 'payment_status' }).subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data) {\r\n this.paymentStatusesRaw.set(Array.isArray(response.data) ? response.data : [response.data]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private loadPaymentMethodMasters(): void {\r\n this.generalMasterService.getMasterList({ sygmt_code: 'payment_method' }).subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data) {\r\n const data = Array.isArray(response.data) ? response.data : [response.data];\r\n this.paymentMethodsRaw.set(data);\r\n const options = data.map((item: any) => ({\r\n label: item.sygms_title || '',\r\n value: item._id || ''\r\n }));\r\n this.paymentMethodOptions.set(options);\r\n\r\n if (options.length > 0 && !this.paymentForm.get('feepay_payment_method')?.value) {\r\n this.paymentForm.patchValue({ feepay_payment_method: options[0].value });\r\n }\r\n }\r\n },\r\n error: (err) => console.error('Error loading payment methods:', err)\r\n });\r\n }\r\n\r\n private setupFormListeners(): void {\r\n this.rightsService.initializeRights('fee_payment');\r\n this.onSearchStudents('');\r\n\r\n this.paymentForm.get('feepay_student_id_auth')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(studentId => {\r\n if (studentId) {\r\n this.loadStudentDetails(studentId);\r\n } else {\r\n this.selectedStudent.set(null);\r\n this.outstandingFees.set([]);\r\n this.initializeFeeItems([]);\r\n }\r\n });\r\n }\r\n\r\n private setupPaymentMethodListener(): void {\r\n this.paymentForm.get('feepay_payment_method')?.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(methodId => {\r\n // Find the selected method object to check its code\r\n const selectedMethod = this.paymentMethodsRaw().find(m => m._id === methodId);\r\n const code = selectedMethod?.sygms_code;\r\n\r\n const isChequeOrDD = code === 'pm_cheque' || code === 'pm_demand_draft';\r\n const isBankTransfer = code === 'pm_online_transfer'; // Manual online transfer\r\n\r\n this.showChequeDetails.set(isChequeOrDD);\r\n this.showBankDetails.set(isBankTransfer);\r\n\r\n const ctrlChequeNo = this.paymentForm.get('feepay_cheque_number');\r\n const ctrlChequeDate = this.paymentForm.get('feepay_cheque_date');\r\n const ctrlBankName = this.paymentForm.get('feepay_bank_name');\r\n const ctrlTransRef = this.paymentForm.get('feepay_transaction_reference');\r\n\r\n // Reset validators\r\n ctrlChequeNo?.clearValidators();\r\n ctrlChequeNo?.updateValueAndValidity();\r\n\r\n ctrlChequeDate?.clearValidators();\r\n ctrlChequeDate?.updateValueAndValidity();\r\n\r\n ctrlBankName?.clearValidators();\r\n ctrlBankName?.updateValueAndValidity();\r\n\r\n ctrlTransRef?.clearValidators();\r\n ctrlTransRef?.updateValueAndValidity();\r\n\r\n // Apply conditional validators\r\n if (isChequeOrDD) {\r\n ctrlChequeNo?.setValidators([Validators.required]);\r\n ctrlChequeDate?.setValidators([Validators.required]);\r\n ctrlBankName?.setValidators([Validators.required]);\r\n }\r\n\r\n if (isBankTransfer) {\r\n ctrlTransRef?.setValidators([Validators.required]);\r\n }\r\n\r\n // For UPI/Card, we might want transaction ref mandatory too, \r\n // but usually manual entry might be flexible. \r\n // If code is pm_upi or pm_debit_credit_card, maybe require trans ref?\r\n if (code === 'pm_upi' || code === 'pm_debit_credit_card') {\r\n ctrlTransRef?.setValidators([Validators.required]);\r\n }\r\n\r\n this.paymentForm.updateValueAndValidity();\r\n });\r\n }\r\n\r\n onStudentSearch(event: any): void {\r\n const query = typeof event === 'object' ? event.query : String(event || '');\r\n this.onSearchStudents(query);\r\n }\r\n\r\n private onSearchStudents(query: string): void {\r\n this.loading.set(true);\r\n const payload: AuthUserMstListPayload = {\r\n query,\r\n pageIndex: 1,\r\n pageSize: 50,\r\n pagination: true,\r\n syenm_entity_id_syen: this.appStateService.getActiveEntityValue()?._id || '',\r\n syutm_user_type: 'STUDENT'\r\n };\r\n\r\n this.userMasterService.getUserList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response: authUserMstListControllerResponse) => {\r\n if (response?.success && response?.data) {\r\n const options = (response.data as any[]).map((user: any) => {\r\n const studentName = user.user_fullname || 'Unknown';\r\n const specificId = user.user_type_mapping?.syutm_type_specific_id || '';\r\n const userId = user._id || '';\r\n return {\r\n label: `${studentName}${specificId ? ' (' + specificId + ')' : ''}`,\r\n value: userId\r\n };\r\n });\r\n this.studentListOptions.set(options);\r\n } else {\r\n this.studentListOptions.set([]);\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error searching for students:', err);\r\n this.studentListOptions.set([]);\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n onStudentSelect(event: any): void {\r\n const studentId = typeof event === 'object' ? (event.value || event._id) : event;\r\n if (studentId) {\r\n this.paymentForm.get('feepay_student_id_auth')?.setValue(studentId);\r\n }\r\n }\r\n\r\n private loadStudentDetails(studentId: string): void {\r\n const payload: any = {\r\n _id: studentId,\r\n pagination: false,\r\n syenm_entity_id_syen: this.appStateService.getActiveEntityValue()?._id || '',\r\n syutm_user_type: 'STUDENT'\r\n };\r\n\r\n this.userMasterService.getUserList(payload).subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data) {\r\n const students = Array.isArray(response.data) ? response.data : [response.data];\r\n if (students.length > 0) {\r\n const studentData = students[0] as any;\r\n this.selectedStudent.set({\r\n _id: studentData._id || '',\r\n name: (studentData.admap_first_name || studentData.user_fullname || 'Unknown') + ' ' + (studentData.admap_last_name || ''),\r\n student_id: studentData.admap_student_id || studentData.user_type_mapping?.syutm_type_specific_id || studentData._id || '',\r\n class: studentData.class || 'N/A',\r\n section: studentData.section || 'N/A',\r\n academic_year_id: studentData.admap_academic_year_id_acayr?._id || studentData.admap_academic_year_id_acayr\r\n });\r\n this.loadOutstandingFees(studentId);\r\n }\r\n }\r\n },\r\n error: (err) => console.error('Error fetching student details:', err)\r\n });\r\n }\r\n\r\n private loadOutstandingFees(studentId: string): void {\r\n this.loading.set(true);\r\n const payload: any = {\r\n feeas_student_id_auth: studentId,\r\n feeas_entity_id_syen: this.appStateService.getActiveEntityValue()?._id,\r\n feeas_academic_year_id_acayr: this.appStateService.getActiveAcademicYearValue()?._id\r\n };\r\n\r\n this.feeAssignmentService.getFeeAssignmentList(payload).subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data) {\r\n const today = new Date();\r\n const outstandingFees: OutstandingFee[] = response.data\r\n .filter((assignment: any) => {\r\n const total = assignment.feeas_total_amount || 0;\r\n const paid = assignment.feeas_amount_paid || 0;\r\n const outstanding = assignment.feeas_outstanding_amount !== undefined ? assignment.feeas_outstanding_amount : (total - paid);\r\n return outstanding > 0 && assignment.feeas_payment_status !== 'PAID';\r\n })\r\n .map((assignment: any) => {\r\n const total = assignment.feeas_total_amount || 0;\r\n const paid = assignment.feeas_amount_paid || 0;\r\n const outstanding = assignment.feeas_outstanding_amount !== undefined ? assignment.feeas_outstanding_amount : (total - paid);\r\n const lateFee = assignment.feeas_late_fee_applied || 0;\r\n const dueDate = assignment.feeas_due_date ? new Date(assignment.feeas_due_date) : null;\r\n\r\n return {\r\n id: assignment._id || '',\r\n assignment_id: assignment._id || '',\r\n fee_head: assignment.feeas_fee_name || 'Fee',\r\n fee_category: assignment.feeas_fee_category_sygms?.sygms_title || assignment.feeas_fee_category_sygms || 'OTHER',\r\n due_date: dueDate || new Date(),\r\n outstanding_amount: outstanding,\r\n late_fee: lateFee,\r\n penalty: 0,\r\n is_overdue: dueDate ? dueDate < today : false\r\n };\r\n });\r\n\r\n this.outstandingFees.set(outstandingFees);\r\n this.initializeFeeItems(outstandingFees);\r\n\r\n // Check for pre-selected fee IDs from query parameters\r\n const feeIdsParam = this.route.snapshot.queryParamMap.get('feeIds');\r\n if (feeIdsParam) {\r\n const feeIds = feeIdsParam.split(',');\r\n this.feeItemsArray.controls.forEach((control, i) => {\r\n const assignmentId = control.get('assignment_id')?.value;\r\n if (feeIds.includes(assignmentId)) {\r\n this.toggleFeeItem(i, { target: { checked: true } });\r\n }\r\n });\r\n }\r\n\r\n // Try to discover class/section info from assignments if not already present or if we find something better\r\n const infoSource = response.data.find((a: any) =>\r\n a.feeas_class_program_id_acacpm?.acacpm_alise_title ||\r\n a.feeas_section_id_acapts?.acapts_name ||\r\n a.class || a.section\r\n );\r\n\r\n if (infoSource && this.selectedStudent()) {\r\n const current = this.selectedStudent()!;\r\n const newClass = infoSource.class || infoSource.feeas_class_program_id_acacpm?.acacpm_alise_title;\r\n const newSection = infoSource.section || infoSource.feeas_section_id_acapts?.acapts_name;\r\n\r\n if ((newClass && (current.class === 'N/A' || !current.class)) ||\r\n (newSection && (current.section === 'N/A' || !current.section))) {\r\n this.selectedStudent.set({\r\n ...current,\r\n class: newClass || current.class,\r\n section: newSection || current.section\r\n });\r\n }\r\n }\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error loading fees:', err);\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n private initializeFeeItems(fees: OutstandingFee[]): void {\r\n const feeItems = this.paymentForm.get('fee_items') as FormArray;\r\n feeItems.clear();\r\n\r\n fees.forEach(fee => {\r\n feeItems.push(this.fb.group({\r\n is_selected: [false],\r\n assignment_id: [fee.assignment_id],\r\n fee_head: [fee.fee_head],\r\n fee_category: [fee.fee_category],\r\n due_date: [fee.due_date],\r\n outstanding_amount: [fee.outstanding_amount],\r\n late_fee: [fee.late_fee],\r\n penalty: [fee.penalty || 0],\r\n amount_paid: [0, [Validators.min(0), Validators.max(fee.outstanding_amount + fee.late_fee)]]\r\n }));\r\n });\r\n }\r\n\r\n toggleFeeItem(index: number, event?: any): void {\r\n const item = this.feeItemsArray.at(index);\r\n\r\n // If event is provided, use it directly (more reliable)\r\n const isSelected = event ? event.target.checked : item.get('is_selected')?.value;\r\n\r\n const outstanding = item.get('outstanding_amount')?.value || 0;\r\n const lateFee = item.get('late_fee')?.value || 0;\r\n const penalty = item.get('penalty')?.value || 0;\r\n\r\n // Update values and ensure events are emitted\r\n item.get('is_selected')?.setValue(isSelected, { emitEvent: false });\r\n item.get('amount_paid')?.setValue(isSelected ? (outstanding + lateFee + penalty) : 0, { emitEvent: true });\r\n\r\n // Explicitly trigger form-wide value changes to update signals\r\n this.paymentForm.updateValueAndValidity({ emitEvent: true });\r\n this._formValueSignal.set(this.paymentForm.value);\r\n }\r\n\r\n selectAllFees(): void {\r\n this.feeItemsArray.controls.forEach((_, i) => {\r\n this.feeItemsArray.at(i).get('is_selected')?.setValue(true);\r\n this.toggleFeeItem(i);\r\n });\r\n }\r\n\r\n clearAllFees(): void {\r\n this.feeItemsArray.controls.forEach((_, i) => {\r\n this.feeItemsArray.at(i).get('is_selected')?.setValue(false);\r\n this.toggleFeeItem(i);\r\n });\r\n }\r\n\r\n\r\n onSubmit(): void {\r\n if (!this.rightsService.hasRight('CREATE')) {\r\n this.notificationService.error('Insufficient permissions');\r\n return;\r\n }\r\n\r\n if (this.paymentForm.invalid || this.submitting()) {\r\n this.paymentForm.markAllAsTouched();\r\n this.notificationService.warning('Please fill in all required fields correctly.');\r\n return;\r\n }\r\n\r\n if (this.selectedFeeItems().length === 0) {\r\n this.notificationService.warning('Select fees to pay');\r\n return;\r\n }\r\n\r\n this.submitting.set(true);\r\n const val = this.paymentForm.value;\r\n const selectedGM = this.paymentMethodsRaw().find(m => m._id === val.feepay_payment_method);\r\n\r\n const payload: any = {\r\n feepay_student_id_auth: val.feepay_student_id_auth,\r\n feepay_academic_year_id_acayr: this.selectedStudent()?.academic_year_id || this.outstandingFees()?.[0]?.id,\r\n feepay_entity_id_syen: this.appStateService.getActiveEntityValue()?._id,\r\n feepay_payment_date: new Date(val.feepay_payment_date),\r\n feepay_payment_mode_id_sygms: val.feepay_payment_method,\r\n feepay_payment_reference: val.feepay_payment_reference || val.feepay_cheque_number || val.feepay_transaction_reference,\r\n feepay_total_amount: this.totalPayable(),\r\n feepay_status_id_sygms: this.paymentStatusesRaw().find(s => s.sygms_code === 'feepay_status_success')?._id,\r\n feepay_remarks: val.feepay_remarks,\r\n fee_items: this.selectedFeeItems().map((item: any) => ({\r\n feepayit_assignment_id_feeas: item.assignment_id,\r\n feepayit_amount_paid: item.amount_paid,\r\n feepayit_late_fee: item.late_fee,\r\n feepayit_discount_applied: 0,\r\n feepayit_item_name: item.fee_head\r\n }))\r\n };\r\n\r\n this.feePaymentService.saveUpdateFeePayment(payload as MFeePaymentInsertUpdatePayload).subscribe({\r\n next: (res: feePaymentInsertUpdateControllerResponse) => {\r\n if (res?.success) {\r\n this.notificationService.success('Payment recorded');\r\n this.router.navigate(['/control-panel/payment']);\r\n } else {\r\n this.notificationService.error(res?.message || 'Failed');\r\n }\r\n this.submitting.set(false);\r\n },\r\n error: () => {\r\n this.notificationService.error('Error occurred');\r\n this.submitting.set(false);\r\n }\r\n });\r\n }\r\n\r\n onCancel(): void {\r\n if (this.paymentForm.dirty) {\r\n this.confirmationService.ask({\r\n title: 'Unsaved Changes',\r\n message: 'You have unsaved changes. Are you sure you want to leave?',\r\n confirmText: 'Yes, Leave',\r\n cancelText: 'Stay'\r\n }).then((confirmed: boolean | string) => {\r\n if (confirmed) {\r\n this.router.navigate(['/control-panel/payment']);\r\n }\r\n });\r\n } else {\r\n this.router.navigate(['/control-panel/payment']);\r\n }\r\n }\r\n\r\n formatCurrency(amount: number): string {\r\n return `₹${(amount || 0).toLocaleString('en-IN', { minimumFractionDigits: 2 })}`;\r\n }\r\n\r\n isOverdue(date: Date): boolean {\r\n return new Date(date) < new Date();\r\n }\r\n\r\n private updateBreadcrumbData(): void {\r\n this.breadcrumbData.set([\r\n {\r\n id: 'process',\r\n label: 'Process Payment',\r\n icon: 'payment',\r\n url: undefined\r\n }\r\n ]);\r\n }\r\n}\r\n","<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'fee_payment' }\"\r\n [breadcrumb_data]=\"breadcrumbData()\">\r\n\r\n <!-- Main Content Grid -->\r\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\">\r\n\r\n <!-- Left: Form Controls (Col 8) -->\r\n <div class=\"lg:tw-col-span-8 tw-flex tw-flex-col tw-gap-4 tw-overflow-y-auto tw-pr-2\">\r\n\r\n <!-- Student Selection Card (Compact) -->\r\n <div class=\"glass-card tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">person_search</cide-ele-icon>\r\n Student Selection\r\n </h3>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-4 tw-items-start\">\r\n <div [formGroup]=\"paymentForm\">\r\n <cide-ele-select formControlName=\"feepay_student_id_auth\" label=\"Search Student\"\r\n placeholder=\"Enter student name or ID...\" [options]=\"studentListOptions()\" [loading]=\"loading()\"\r\n (searchChange)=\"onStudentSearch($event)\" (change)=\"onStudentSelect($event)\" size=\"sm\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n @if (selectedStudent()) {\r\n <div\r\n class=\"premium-gradient tw-p-3 tw-rounded-lg tw-border tw-border-blue-100 tw-flex tw-items-center tw-gap-4\">\r\n <div\r\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\">\r\n {{ selectedStudent()?.name?.[0] || '?' }}\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-bold tw-text-gray-900\">{{ selectedStudent()?.name }}</div>\r\n <div class=\"tw-text-xs tw-text-gray-500\">ID: {{ selectedStudent()?.student_id }}</div>\r\n <div class=\"tw-text-[10px] tw-text-blue-600 tw-font-medium tw-mt-1\">\r\n {{ selectedStudent()?.class }} | {{ selectedStudent()?.section }}\r\n </div>\r\n </div>\r\n </div>\r\n } @else {\r\n <div\r\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\">\r\n Select a student to view details\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Outstanding Fees Grid (Premium) -->\r\n <div\r\n class=\"glass-card tw-rounded-xl tw-flex-1 tw-flex tw-flex-col tw-overflow-hidden tw-border tw-border-gray-200\">\r\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\">\r\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800 tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">account_balance_wallet</cide-ele-icon>\r\n Outstanding Fees\r\n </h3>\r\n\r\n @if (outstandingFees().length > 0) {\r\n <div class=\"tw-flex tw-gap-2\">\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"selectAllFees()\">Select All</button>\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"clearAllFees()\">Clear</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"tw-flex-1 tw-overflow-hidden\">\r\n <cide-ele-data-grid [config]=\"gridConfig()\" [templateRenderers]=\"templateRenderers()\">\r\n </cide-ele-data-grid>\r\n </div>\r\n </div>\r\n\r\n <!-- Payment Method Card (Compact) -->\r\n <div class=\"glass-card tw-rounded-xl tw-p-4 tw-border tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-mb-3\">\r\n <cide-ele-icon size=\"sm\" class=\"tw-text-blue-600\">payments</cide-ele-icon>\r\n <h3 class=\"tw-text-sm tw-font-bold tw-text-gray-800\">Payment Details</h3>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-2 lg:tw-grid-cols-3 tw-gap-4\" [formGroup]=\"paymentForm\">\r\n <cide-ele-select formControlName=\"feepay_payment_method\" label=\"Method\" [options]=\"paymentMethodOptions()\"\r\n size=\"sm\">\r\n </cide-ele-select>\r\n\r\n <cide-ele-input formControlName=\"feepay_payment_date\" label=\"Date\" type=\"date\" size=\"sm\">\r\n </cide-ele-input>\r\n\r\n <cide-ele-input formControlName=\"feepay_payment_reference\" label=\"Reference #\" placeholder=\"Ref/Receipt No\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <!-- Dynamic Fields -->\r\n <div [formGroup]=\"paymentForm\" class=\"tw-mt-4 tw-grid tw-grid-cols-1 md:tw-grid-cols-3 tw-gap-4\">\r\n @if (showChequeDetails()) {\r\n <cide-ele-input formControlName=\"feepay_cheque_number\" label=\"Cheque #\" size=\"sm\"></cide-ele-input>\r\n <cide-ele-input formControlName=\"feepay_cheque_date\" label=\"Cheque Date\" type=\"date\"\r\n size=\"sm\"></cide-ele-input>\r\n <cide-ele-input formControlName=\"feepay_bank_name\" label=\"Bank Name\" size=\"sm\"></cide-ele-input>\r\n }\r\n @if (showBankDetails()) {\r\n <cide-ele-input formControlName=\"feepay_transaction_reference\" label=\"Transaction ID\" size=\"sm\"\r\n class=\"tw-col-span-2\"></cide-ele-input>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Right: Summary & Action (Col 4) -->\r\n <div class=\"lg:tw-col-span-4 tw-h-full\">\r\n <div\r\n class=\"glass-card tw-rounded-xl tw-h-full tw-flex tw-flex-col tw-overflow-hidden tw-border tw-border-gray-200\">\r\n <div class=\"tw-p-4 tw-bg-blue-600 tw-text-white\">\r\n <h3 class=\"tw-text-lg tw-font-bold\">Payment Summary</h3>\r\n <p class=\"tw-text-blue-100 tw-text-xs\">Confirm your selection and totals</p>\r\n </div>\r\n\r\n <div class=\"tw-flex-1 tw-p-4 tw-overflow-y-auto tw-space-y-4\">\r\n <!-- Breakdown -->\r\n <div class=\"tw-space-y-2\">\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-500\">Fees Selected</span>\r\n <span class=\"tw-font-medium\">{{ selectedFeeItems().length }}</span>\r\n </div>\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-500\">Sub-total</span>\r\n <span class=\"tw-font-medium\">{{ formatCurrency(totalFeeAmount()) }}</span>\r\n </div>\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-500\">Late Fee</span>\r\n <span class=\"tw-text-blue-600 tw-font-medium\">+ {{ formatCurrency(totalLateFee()) }}</span>\r\n </div>\r\n <div class=\"tw-flex tw-justify-between tw-text-sm\">\r\n <span class=\"tw-text-gray-500\">Penalty</span>\r\n <span class=\"tw-text-blue-600 tw-font-medium\">+ {{ formatCurrency(totalPenalty()) }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-border-t tw-border-gray-100 tw-pt-4\">\r\n <div class=\"tw-flex tw-justify-between tw-items-center\">\r\n <span class=\"tw-text-base tw-font-bold tw-text-gray-800\">Total Payable</span>\r\n <span class=\"tw-text-xl tw-font-bold tw-text-blue-600\">{{ formatCurrency(totalPayable()) }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Remarks -->\r\n <div class=\"tw-mt-6\" [formGroup]=\"paymentForm\">\r\n <cide-ele-textarea formControlName=\"feepay_remarks\" label=\"Remarks / Notes\"\r\n placeholder=\"Add payment notes...\" [rows]=\"2\" size=\"sm\">\r\n </cide-ele-textarea>\r\n </div>\r\n </div>\r\n\r\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\">\r\n <button cideEleButton variant=\"primary\" class=\"tw-w-full tw-py-3\" [loading]=\"submitting()\"\r\n [disabled]=\"submitting() || paymentForm.invalid || selectedFeeItems().length === 0 || loading()\"\r\n (click)=\"onSubmit()\">\r\n Confirm & Record Payment\r\n </button>\r\n <button cideEleButton variant=\"ghost\" class=\"tw-w-full\" (click)=\"onCancel()\" [disabled]=\"submitting()\">\r\n Cancel\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</cide-lyt-shared-wrapper>\r\n\r\n<!-- Grid Templates -->\r\n<ng-template #selectTemplate let-row=\"row\">\r\n <div class=\"tw-flex tw-items-center tw-justify-center\" [formGroup]=\"paymentForm\">\r\n <ng-container formArrayName=\"fee_items\">\r\n @for (item of feeItemsArray.controls; track $index) {\r\n @if (item.get('assignment_id')?.value === row.assignment_id) {\r\n <div [formGroupName]=\"$index\">\r\n <input type=\"checkbox\" formControlName=\"is_selected\" (change)=\"toggleFeeItem($index, $event)\"\r\n class=\"tw-rounded tw-border-gray-300\">\r\n </div>\r\n }\r\n }\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #dateTemplate let-value=\"value\">\r\n <div class=\"tw-text-xs tw-text-gray-600\">{{ value | date:'dd MMM yyyy' }}</div>\r\n</ng-template>\r\n\r\n<ng-template #outstandingTemplate let-value=\"value\">\r\n <div class=\"tw-font-semibold tw-text-gray-900\">{{ formatCurrency(value) }}</div>\r\n</ng-template>\r\n\r\n<ng-template #amountPaidTemplate let-row=\"row\">\r\n <div class=\"tw-flex tw-justify-end tw-items-center tw-h-full\">\r\n <span class=\"tw-font-bold tw-text-blue-600\">\r\n {{ formatCurrency(row.outstanding_amount + row.late_fee + (row.penalty || 0)) }}\r\n </span>\r\n </div>\r\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 ConfirmationService\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 MFeePaymentApprovePayload\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 (getStatusBadgeClass().includes('yellow')) {\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"sm\" leftIcon=\"verified\"\n (btnClick)=\"approvePayment()\" title=\"Approve Payment\" [loading]=\"loading()\">\n Approve\n </button>\n }\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 {{ ($any(payment.feepay_payment_mode_id_sygms)?.sygms_title || payment.feepay_payment_mode_id_sygms) || '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-blue-600 dark:tw-text-blue-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\">{{ $any(payment.feepay_student_id_auth)?.user_username || $any(payment.feepay_student_id_auth)?.syutm_type_specific_id || $any(payment.feepay_student_id_auth)?._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\">{{ ($any(payment.feepay_payment_mode_id_sygms)?.sygms_title || payment.feepay_payment_mode_id_sygms) || '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-1\">\n <!-- Fee Items Breakdown -->\n <div class=\"tw-border-b tw-border-gray-100 dark:tw-border-gray-700 tw-mb-2\">\n <table class=\"tw-w-full tw-text-xs\">\n <thead>\n <tr class=\"tw-text-gray-500 dark:tw-text-gray-400 tw-text-left\">\n <th class=\"tw-py-1\">Fee Item</th>\n <th class=\"tw-py-1 tw-text-right\">Late Fee</th>\n <th class=\"tw-py-1 tw-text-right\">Amount</th>\n </tr>\n </thead>\n <tbody class=\"tw-divide-y tw-divide-gray-50 dark:tw-divide-gray-700/50\">\n @for (item of $any(payment).fee_items; track $any(item)._id) {\n <tr>\n <td class=\"tw-py-1.5 tw-text-gray-700 dark:tw-text-gray-300\">{{ $any(item).feepayit_item_name }}</td>\n <td class=\"tw-py-1.5 tw-text-right tw-text-red-500\">{{ $any(item).feepayit_late_fee ? formatCurrency($any(item).feepayit_late_fee) : '-' }}</td>\n <td class=\"tw-py-1.5 tw-text-right tw-font-medium tw-text-gray-900 dark:tw-text-gray-100\">{{ formatCurrency($any(item).feepayit_amount_paid || 0) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-1.5\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Subtotal Fees:</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-1.5\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Total Late Fees:</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-1.5\">\n <span class=\"tw-text-xs tw-text-gray-500 dark:tw-text-gray-400\">Discount Applied:</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-right tw-text-[10px] tw-text-gray-500 dark:tw-text-gray-400\">\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-mt-2 tw-border-t tw-border-gray-200 dark:tw-border-gray-700\">\n <span class=\"tw-text-sm tw-font-bold tw-text-gray-900 dark:tw-text-gray-100\">Total Paid:</span>\n <span class=\"tw-text-lg tw-font-bold tw-text-blue-600 dark:tw-text-blue-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 private readonly confirmationService = inject(ConfirmationService);\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 // First try to parse as object (legacy/complex)\n try {\n const parsed = generateObjectFromString(query) as { feepay_id?: string };\n if (parsed?.feepay_id) {\n this.loadFeePayment(parsed.feepay_id);\n return;\n }\n } catch (e) {\n // Ignore error, it might be a direct ID\n }\n\n // If parsing failed or no ID in object, treat query as the ID itself\n if (query && query.length > 0) {\n this.loadFeePayment(query);\n } else {\n this.error.set('Invalid payment ID');\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 // First try to parse as object\n try {\n const parsed = generateObjectFromString(query) as { feepay_id?: string };\n if (parsed?.feepay_id) {\n this.loadFeePayment(parsed.feepay_id);\n return;\n }\n } catch (e) {\n // Ignore error\n }\n\n // Treat as direct ID\n if (query && query.length > 0) {\n this.loadFeePayment(query);\n }\n }\n }\n\n getStatusText(): string {\n const statusObj = this.feePayment()?.feepay_status_id_sygms as any;\n const status = statusObj?.sygms_title || statusObj;\n if (!status || typeof status !== 'string') return 'N/A';\n return status.charAt(0) + status.slice(1).toLowerCase();\n }\n\n getStatusBadgeClass(): string {\n const statusObj = this.feePayment()?.feepay_status_id_sygms as any;\n const status = (statusObj?.sygms_code || statusObj || '').toLowerCase();\n\n if (status === 'feepay_status_success' || status.includes('success') || status.includes('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 === 'feepay_status_pending' || status.includes('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 === 'feepay_status_failed' || status === 'feepay_status_cancelled' || status.includes('failed') || status.includes('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 === 'feepay_status_refunded' || status.includes('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 approvePayment(): void {\n const payment = this.feePayment();\n if (!payment?._id) return;\n\n if (!this.rightsService.hasRight('EDIT')) {\n this.notificationService.error('You do not have permission to approve payments');\n return;\n }\n\n this.confirmationService.ask({\n title: 'Approve Payment',\n message: `Are you sure you want to approve payment ${payment.feepay_receipt_number}? This will update the associated fee assignments.`,\n confirmText: 'Approve',\n cancelText: 'Cancel',\n type: 'success'\n }).then((confirmed: boolean | string) => {\n if (confirmed) {\n this.loading.set(true);\n const payload: MFeePaymentApprovePayload = new MFeePaymentApprovePayload({\n feepay_id: payment._id\n });\n\n this.feePaymentService.approveFeePayment(payload)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (response) => {\n if (response?.success) {\n this.notificationService.success('Payment approved successfully.');\n this.loadFeePayment(payment._id as string);\n } else {\n this.notificationService.error(response?.message || 'Failed to approve payment.');\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('❌ Error approving payment:', error);\n this.notificationService.error('Failed to approve payment. Please try again.');\n this.loading.set(false);\n }\n });\n }\n });\n }\n\n getStudentName(): string {\n const payment = this.feePayment() as any;\n if (!payment) return '';\n\n // Check populated student\n const student = payment.feepay_student_id_auth;\n if (student && typeof student === 'object') {\n if (student.user_fullname) return student.user_fullname;\n if (student.admap_first_name) {\n return `${student.admap_first_name} ${student.admap_last_name || ''}`.trim();\n }\n }\n\n return payment.feepay_student_id_auth || '';\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 this.feePaymentService.generateReceipt(paymentId).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 this.feePaymentService.getReceiptHtml(paymentId).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=\"xs\" (click)=\"loadTemplates()\" leftIcon=\"folder_open\"\n [adaptive]=\"true\">\n Load Template\n </button>\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"xs\" (click)=\"saveTemplate()\" leftIcon=\"save\"\n [disabled]=\"saving() || templateForm.invalid\" [loading]=\"saving()\" [adaptive]=\"true\">\n Save Template\n </button>\n\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\"\n 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\n 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 formControlName=\"tag_search\" placeholder=\"Search tags...\" size=\"sm\" leadingIcon=\"search\">\n </cide-ele-input>\n </form>\n </div>\n\n <!-- Category Tabs -->\n <div\n 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 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\" (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 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)\" [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\n 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\n 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 label=\"Template Name\" formControlName=\"template_name\" placeholder=\"e.g., Standard Receipt\"\n size=\"sm\">\n </cide-ele-input>\n\n <cide-ele-input label=\"Template Code\" formControlName=\"template_code\" 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 label=\"Template Type\" 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 label=\"Template For\" 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 #htmlEditor 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\n 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 formControlName=\"preview_type\"\n [options]=\"[{value: 'STUDENT', label: 'Student'}, {value: 'OFFICE', label: 'Office'}]\" 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\"\n 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>","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_mode_id_sygms: 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_mode_id_sygms || '';\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, input, effect, Output, EventEmitter, computed, DestroyRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideSelectComponent,\r\n NotificationService\r\n} from 'cloud-ide-element';\r\nimport { AppStateHelperService } from 'cloud-ide-layout';\r\nimport { CideCoreUserMasterService } from 'cloud-ide-core';\r\nimport { AuthUserMstListPayload, cidePath, admissionRoutesUrl, hostManagerRoutesUrl, generateStringFromObject } from 'cloud-ide-lms-model';\r\n\r\nexport interface StudentContext {\r\n studentId: string;\r\n studentAuthId: string;\r\n admissionData: any;\r\n}\r\n\r\nexport interface StudentSelectionConfig {\r\n layout: 'horizontal' | 'vertical';\r\n showCard: boolean;\r\n cardFields: string[]; // ['class', 'section', 'program', 'term']\r\n}\r\n\r\n@Component({\r\n selector: 'cide-student-selection-wrapper',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n CideIconComponent,\r\n CideEleButtonComponent,\r\n CideSelectComponent\r\n ],\r\n templateUrl: './student-selection-wrapper.component.html',\r\n styleUrl: './student-selection-wrapper.component.scss'\r\n})\r\nexport class StudentSelectionWrapperComponent implements OnInit {\r\n private readonly appStateHelper = inject(AppStateHelperService);\r\n private readonly userMasterService = inject(CideCoreUserMasterService);\r\n private readonly notificationService = inject(NotificationService);\r\n private readonly http = inject(HttpClient);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n config = input<StudentSelectionConfig>({\r\n layout: 'horizontal',\r\n showCard: true,\r\n cardFields: ['class', 'section']\r\n });\r\n\r\n entityId = input<string | null>(null);\r\n academicYearId = input<string | null>(null);\r\n\r\n @Output() studentSelected = new EventEmitter<StudentContext>();\r\n\r\n readonly isStudent = signal<boolean>(false);\r\n readonly loading = signal<boolean>(false);\r\n readonly studentListOptions = signal<{ label: string; value: string }[]>([]);\r\n readonly selectedStudentId = signal<string | null>(null);\r\n readonly studentContext = signal<StudentContext | null>(null);\r\n readonly detailsExpanded = signal<boolean>(false);\r\n\r\n ngOnInit(): void {\r\n this.checkUserType();\r\n }\r\n\r\n constructor() {\r\n effect(() => {\r\n const currentEntityId = this.entityId() || this.appStateHelper.getActiveEntityId();\r\n const currentAcademicYearId = this.academicYearId() || this.appStateHelper.getActiveAcademicYearId();\r\n const isStudentUser = this.isStudent();\r\n\r\n // Determine the student ID to load\r\n let studentAuthIdToLoad: string | null = null;\r\n\r\n if (isStudentUser) {\r\n studentAuthIdToLoad = this.appStateHelper.getCurrentUser()?._id || null;\r\n } else {\r\n studentAuthIdToLoad = this.selectedStudentId();\r\n }\r\n\r\n if (studentAuthIdToLoad && currentEntityId) {\r\n console.log('🔄 Effect-driven load student context:', studentAuthIdToLoad);\r\n this.loadStudentContext(studentAuthIdToLoad, currentEntityId, currentAcademicYearId);\r\n } else if (!isStudentUser) {\r\n // Refresh search list if in admin search mode and no student is selected\r\n this.onStudentSearch('');\r\n this.studentContext.set(null);\r\n }\r\n });\r\n }\r\n\r\n private checkUserType(): void {\r\n const user = this.appStateHelper.getCurrentUser();\r\n // In our system, the user type mapping tells us if it's a student\r\n const userType = (user as any)?.core_user_type_mapping?.syutm_user_type || (user as any)?.user_type_mapping?.syutm_user_type;\r\n\r\n if (userType === 'STUDENT') {\r\n this.isStudent.set(true);\r\n // Redundant: loadStudentContext will be triggered by the effect when isStudent changes\r\n } else {\r\n this.isStudent.set(false);\r\n // Admin/Other users need to select a student\r\n // Redundant: onStudentSearch will be triggered by the effect when isStudent is false\r\n }\r\n }\r\n\r\n onStudentSearch(event: any): void {\r\n const searchQuery = typeof event === 'object' ? event?.query || '' : String(event || '');\r\n\r\n if (searchQuery.length < 2 && searchQuery !== '') {\r\n this.studentListOptions.set([]);\r\n return;\r\n }\r\n\r\n this.loading.set(true);\r\n const payload: AuthUserMstListPayload = {\r\n query: searchQuery,\r\n pageIndex: 1,\r\n pageSize: 50,\r\n pagination: true,\r\n syenm_entity_id_syen: this.entityId() || this.appStateHelper.getActiveEntityId(),\r\n syutm_user_type: 'STUDENT'\r\n };\r\n\r\n this.userMasterService.getUserList(payload)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data) {\r\n const options = (response.data as any[]).map((user: any) => {\r\n const name = user.user_fullname ||\r\n [user.user_firstname, user.user_middlename, user.user_lastname].filter(Boolean).join(' ') ||\r\n 'Unknown';\r\n const id = user.user_type_mapping?.syutm_type_specific_id;\r\n return {\r\n label: `${name}${id ? ' (' + id + ')' : ''}`,\r\n value: user._id || ''\r\n };\r\n });\r\n this.studentListOptions.set(options);\r\n } else {\r\n this.studentListOptions.set([]);\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error searching for students:', err);\r\n this.studentListOptions.set([]);\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n onStudentSelect(event: any): void {\r\n console.log('🎓 Student Selected Event:', event);\r\n const studentAuthId = typeof event === 'object' && event !== null ? event.value || event.id || event : event;\r\n console.log('🎓 Extracted Student Auth ID:', studentAuthId);\r\n\r\n if (!studentAuthId || typeof studentAuthId !== 'string') {\r\n console.warn('⚠️ Invalid student ID extracted', studentAuthId);\r\n return;\r\n }\r\n\r\n // Setting this will trigger the effect to load student context\r\n this.selectedStudentId.set(studentAuthId);\r\n }\r\n\r\n private loadStudentContext(studentAuthId: string, entityId: string, academicYearId?: string | null): void {\r\n console.log('🔄 Loading context for student:', studentAuthId);\r\n this.loading.set(true);\r\n\r\n // Fetch admission data to get clinical IDs and placement\r\n const queryParams: any = {\r\n admap_user_id_auth: studentAuthId,\r\n admap_entity_id_syen: entityId\r\n };\r\n\r\n if (academicYearId) {\r\n queryParams.admap_academic_year_id_acayr = academicYearId;\r\n }\r\n\r\n const query = generateStringFromObject(queryParams);\r\n const admissionUrl = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n admissionRoutesUrl.module,\r\n admissionRoutesUrl.admissionApplications,\r\n query\r\n ]);\r\n\r\n this.http.get<any>(admissionUrl)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (response) => {\r\n if (response?.success && response?.data) {\r\n const admissionData = Array.isArray(response.data) ? response.data[0] : response.data;\r\n const context: StudentContext = {\r\n studentId: admissionData?.admap_student_id || '',\r\n studentAuthId: studentAuthId,\r\n admissionData: admissionData\r\n };\r\n this.studentContext.set(context);\r\n this.studentSelected.emit(context);\r\n } else {\r\n this.notificationService.warning('Admission data not found for selected student.');\r\n this.studentContext.set(null);\r\n }\r\n this.loading.set(false);\r\n },\r\n error: (err) => {\r\n console.error('Error loading admission data:', err);\r\n this.notificationService.error('Failed to load student context.');\r\n this.studentContext.set(null);\r\n this.loading.set(false);\r\n }\r\n });\r\n }\r\n\r\n resetSelection(): void {\r\n this.selectedStudentId.set(null);\r\n this.studentContext.set(null);\r\n this.detailsExpanded.set(false);\r\n this.studentSelected.emit(undefined);\r\n }\r\n\r\n toggleDetails(): void {\r\n this.detailsExpanded.update(v => !v);\r\n }\r\n\r\n getStudentInitial(): string {\r\n const name = this.studentContext()?.admissionData?.admap_first_name ||\r\n this.studentContext()?.admissionData?.user_fullname || '?';\r\n return name[0].toUpperCase();\r\n }\r\n\r\n getStudentFullName(): string {\r\n const data = this.studentContext()?.admissionData;\r\n if (!data) return 'N/A';\r\n return `${data.admap_first_name || ''} ${data.admap_middle_name || ''} ${data.admap_last_name || ''}`.trim() || data.user_fullname || 'N/A';\r\n }\r\n}\r\n","<!-- Compact Student Selection Wrapper -->\r\n<div\r\n class=\"tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-mx-6 tw-mt-4 tw-mb-6 tw-overflow-hidden\">\r\n\r\n <!-- Top Bar: Search or Context Summary -->\r\n <div class=\"tw-p-3 tw-flex tw-items-center tw-justify-between tw-gap-4 tw-bg-white\">\r\n\r\n <!-- Search Mode: Visible when no student selected -->\r\n <div *ngIf=\"!studentContext() && !isStudent()\" class=\"tw-flex-1 animate-fade-in\">\r\n <div class=\"tw-flex tw-items-center tw-gap-3\">\r\n <div class=\"tw-bg-blue-50 tw-p-1.5 tw-rounded-lg tw-flex-shrink-0\">\r\n <cide-ele-icon class=\"tw-text-blue-600\" size=\"sm\">person_search</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-flex-1\">\r\n <cide-ele-select [options]=\"studentListOptions()\" [loading]=\"loading()\"\r\n placeholder=\"Search student by name or ID...\" [searchable]=\"true\" [clearInput]=\"true\"\r\n (searchChange)=\"onStudentSearch($event)\" (change)=\"onStudentSelect($event)\" leadingIcon=\"search\"\r\n size=\"sm\" class=\"tw-w-full\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Selected Mode: Compact View -->\r\n <div *ngIf=\"studentContext()\" class=\"tw-flex tw-flex-1 tw-items-center tw-gap-3 animate-fade-in\">\r\n <!-- Avatar -->\r\n <div\r\n class=\"tw-h-9 tw-w-9 tw-rounded-full tw-bg-gradient-to-br tw-from-blue-600 tw-to-blue-700 tw-flex tw-items-center tw-justify-center tw-text-white tw-font-bold tw-text-sm tw-shadow-sm tw-flex-shrink-0\">\r\n {{ getStudentInitial() }}\r\n </div>\r\n\r\n <!-- Info -->\r\n <div class=\"tw-flex-1 tw-min-w-0\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <h4 class=\"tw-font-bold tw-text-gray-900 tw-text-sm tw-truncate\">{{ getStudentFullName() }}</h4>\r\n <span *ngIf=\"!isStudent()\"\r\n class=\"tw-bg-yellow-100 tw-text-yellow-800 tw-text-[10px] tw-px-1.5 tw-py-0.5 tw-rounded tw-font-bold tw-uppercase tw-tracking-wider\">Admin\r\n View</span>\r\n </div>\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate tw-flex tw-items-center tw-gap-2\">\r\n <span class=\"tw-font-medium text-gray-700\">{{ studentContext()?.studentId }}</span>\r\n <span class=\"tw-text-gray-300\">|</span>\r\n <span>{{ studentContext()?.admissionData?.admap_class_program_name || 'Class N/A' }}</span>\r\n <span *ngIf=\"studentContext()?.admissionData?.admap_program_term_section_name\"> - {{\r\n studentContext()?.admissionData?.admap_program_term_section_name }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div *ngIf=\"studentContext()\" class=\"tw-flex tw-items-center tw-gap-2\">\r\n <button *ngIf=\"!isStudent()\" cideEleButton variant=\"ghost\" size=\"sm\" (click)=\"resetSelection()\"\r\n class=\"tw-text-gray-500 hover:tw-text-red-600 tw-px-2\">\r\n <span class=\"tw-text-xs tw-font-medium\">Change</span>\r\n </button>\r\n <button type=\"button\" (click)=\"toggleDetails()\"\r\n class=\"tw-text-gray-500 hover:tw-text-blue-600 tw-w-8 tw-h-8 tw-p-0 tw-flex tw-items-center tw-justify-center tw-rounded-full hover:tw-bg-blue-50 tw-transition-colors tw-duration-200\">\r\n <cide-ele-icon size=\"sm\" [class.tw-rotate-180]=\"detailsExpanded()\"\r\n class=\"tw-transition-transform tw-duration-200\">expand_more</cide-ele-icon>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Collapsible Details Section -->\r\n <div *ngIf=\"studentContext() && detailsExpanded()\"\r\n class=\"tw-border-t tw-border-gray-100 tw-bg-gray-50 tw-p-4 animate-fade-in-down\">\r\n <div class=\"tw-grid tw-grid-cols-2 md:tw-grid-cols-4 tw-gap-y-4 tw-gap-x-8\">\r\n <div *ngIf=\"config().cardFields.includes('class')\">\r\n <label\r\n class=\"tw-block tw-text-[10px] tw-font-bold tw-text-gray-400 tw-uppercase tw-tracking-wider\">Class/Program</label>\r\n <div class=\"tw-mt-0.5 tw-text-xs tw-font-semibold tw-text-gray-900\">\r\n {{ studentContext()?.admissionData?.admap_class_program_name || 'N/A' }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"config().cardFields.includes('section')\">\r\n <label\r\n class=\"tw-block tw-text-[10px] tw-font-bold tw-text-gray-400 tw-uppercase tw-tracking-wider\">Section</label>\r\n <div class=\"tw-mt-0.5 tw-text-xs tw-font-semibold tw-text-gray-900\">\r\n {{ studentContext()?.admissionData?.admap_program_term_section_name || 'N/A' }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"config().cardFields.includes('term')\">\r\n <label\r\n class=\"tw-block tw-text-[10px] tw-font-bold tw-text-gray-400 tw-uppercase tw-tracking-wider\">Current\r\n Term</label>\r\n <div class=\"tw-mt-0.5 tw-text-xs tw-font-semibold tw-text-gray-900\">\r\n {{ studentContext()?.admissionData?.admap_program_term_name || 'N/A' }}\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"config().cardFields.includes('academic_year')\">\r\n <label\r\n class=\"tw-block tw-text-[10px] tw-font-bold tw-text-gray-400 tw-uppercase tw-tracking-wider\">Academic\r\n Year</label>\r\n <div class=\"tw-mt-0.5 tw-text-xs tw-font-semibold tw-text-gray-900\">\r\n {{ studentContext()?.admissionData?.admap_academic_year_name || 'N/A' }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Content Area: Only shown when context is available -->\r\n<div *ngIf=\"studentContext()\" class=\"animate-fade-in\">\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<!-- Placeholder for when no student is selected (Simple banner) -->\r\n<div *ngIf=\"!studentContext() && !isStudent()\"\r\n class=\"tw-bg-blue-50 tw-border tw-border-blue-100 tw-rounded-lg tw-p-4 tw-flex tw-items-center tw-gap-3 tw-mb-6\">\r\n <cide-ele-icon class=\"tw-text-blue-400\" size=\"md\">info</cide-ele-icon>\r\n <p class=\"tw-text-sm tw-text-blue-800\">\r\n Please search and select a student above to view their fee records.\r\n </p>\r\n</div>","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, AppStateService } 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, feesRoutesUrl } from 'cloud-ide-lms-model';\nimport { StudentSelectionWrapperComponent, StudentContext } from '../../../../shared/components/student-selection-wrapper/student-selection-wrapper.component';\n\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 StudentSelectionWrapperComponent\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 private readonly appState = inject(AppStateService);\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 studentContext = signal<StudentContext | null>(null);\n\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 formatter: {\n type: 'date'\n }\n },\n {\n key: 'status',\n header: 'Status',\n type: 'custom',\n width: '140px',\n align: 'center',\n renderer: 'statusRenderer'\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'custom',\n width: '100px',\n align: 'center',\n renderer: 'actionsRenderer'\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 formatter: {\n type: 'date'\n }\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 actionsRenderer: this.actionsRendererTemplate(),\n paymentHistoryRenderer: this.paymentHistoryRendererTemplate()\n }));\n\n ngOnInit(): void {\n // Initialize rights for fee statement (view-only)\n this.rightsService.initializeRights('fee_statement');\n }\n\n onStudentSelected(context: StudentContext | undefined): void {\n if (!context) {\n this.studentContext.set(null);\n this.feeDetails.set([]);\n this.paymentHistory.set([]);\n return;\n }\n\n this.studentContext.set(context);\n\n // Update simple student info for internal use if needed\n const admissionData = context.admissionData;\n const studentName = `${admissionData.admap_first_name || ''} ${admissionData.admap_middle_name || ''} ${admissionData.admap_last_name || ''}`.trim();\n\n this.studentInfo.set({\n id: context.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 this.loadFeeDetails(context.studentAuthId);\n this.loadPaymentHistory(context.studentAuthId);\n }\n\n private loadFeeDetails(studentAuthId: string): void {\n this.loading.set(true);\n\n // Load fee assignments for this student\n const payload: any = {\n feeas_student_id_auth: studentAuthId,\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_paid_amount || 0;\n const outstandingAmount = assignment.feeas_outstanding_amount ?? (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\n private loadPaymentHistory(studentAuthId: string): void {\n // Load payment history for this student\n const payload: any = {\n feepay_student_id_auth: studentAuthId,\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.payment_mode_title || payment.feepay_payment_mode || 'N/A', // Updated to use payment_mode_title\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\n makePayment(): void {\n this.router.navigate(['/control-panel/online-payment']);\n }\n\n payFee(fee: FeeDetailData): void {\n if (!fee._id) return;\n\n // Check if current user is a student\n const isStudent = !!this.appState.studentModel();\n const studentAuthId = this.studentContext()?.studentAuthId;\n\n if (isStudent) {\n // Redirect to online payment with the selected fee ID\n this.router.navigate(['/control-panel/online-payment'], {\n queryParams: { feeIds: fee._id }\n });\n } else if (studentAuthId) {\n // Redirect to admin payment process with student and fee ID\n this.router.navigate(['/control-panel/payment-process'], {\n queryParams: {\n studentId: studentAuthId,\n feeIds: fee._id\n }\n });\n }\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 using HttpClient to handle auth headers\n const receiptUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n feesRoutesUrl.module, // Use proper module name\n 'receipt',\n payment._id,\n 'pdf'\n ]);\n\n this.loading.set(true);\n // Use responseType: 'text' to get HTML string\n this.http.get(receiptUrl, { responseType: 'text' }).subscribe({\n next: (html) => {\n const printWindow = window.open('', '_blank');\n if (printWindow) {\n printWindow.document.write(html);\n printWindow.document.close();\n // Wait for resources to load then print\n printWindow.onload = () => {\n setTimeout(() => {\n printWindow.print();\n this.notificationService.success(`Receipt opened for printing: ${payment.receipt_number}`);\n }, 500);\n };\n } else {\n this.notificationService.error('Please allow popups to print the receipt');\n }\n this.loading.set(false);\n },\n error: (err) => {\n console.error('Error downloading receipt:', err);\n this.notificationService.error('Failed to download receipt');\n this.loading.set(false);\n }\n });\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","<!-- 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=\"xs\" (click)=\"makePayment()\" leftIcon=\"payment\"\n [disabled]=\"feeSummary().outstanding === 0 || loading()\" [adaptive]=\"true\">\n Make Payment\n </button>\n\n </div>\n\n <cide-student-selection-wrapper (studentSelected)=\"onStudentSelected($event)\">\n <div class=\"tw-table tw-w-full tw-h-full\">\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\n 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) }}\n </div>\n </div>\n </div>\n\n <!-- Paid Amount Card -->\n <div\n 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) }}\n </div>\n </div>\n </div>\n\n <!-- Outstanding Card -->\n <div\n 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) }}\n </div>\n </div>\n </div>\n\n <!-- Discount Card -->\n <div\n 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) }}\n </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-0\">\n <cide-ele-data-grid [config]=\"feeDetailsGridConfig()\" [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-0\">\n <cide-ele-data-grid [config]=\"paymentHistoryGridConfig()\" [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-student-selection-wrapper>\n\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'\" [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'\" [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 @if (row.outstanding > 0) {\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"xs\" (click)=\"payFee(row)\" leftIcon=\"payment\">\n Pay\n </button>\n }\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>","import { Component, inject, signal, OnInit, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormsModule } from '@angular/forms';\nimport { Router, ActivatedRoute } from '@angular/router';\nimport {\n CideInputComponent,\n CideSelectComponent,\n CideEleButtonComponent,\n CideIconComponent,\n NotificationService,\n ConfirmationService\n} from 'cloud-ide-element';\nimport { AppStateHelperService, CideLytRequestService, CideLytSharedWrapperComponent } from 'cloud-ide-layout';\nimport { CideFeeFeeAssignmentService } from '../../../fee-assignment-management/services/fee-assignment.service';\nimport { HttpClient } from '@angular/common/http';\nimport { cidePath, coreRoutesUrl, generateStringFromObject, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\nimport { StudentSelectionWrapperComponent, StudentContext } from '../../../../shared/components/student-selection-wrapper/student-selection-wrapper.component';\n\n\n// Razorpay types (declare if not available)\ndeclare var Razorpay: any;\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 FormsModule,\n CideInputComponent,\n CideEleButtonComponent,\n CideIconComponent,\n StudentSelectionWrapperComponent,\n CideLytSharedWrapperComponent\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 route = inject(ActivatedRoute);\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 requestService = inject(CideLytRequestService);\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 readonly studentContext = signal<StudentContext | null>(null);\n readonly breadcrumbData = signal<{ id: string; label: string; icon?: string; url?: string }[]>([]);\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 convenienceFeePercent = signal<number>(0);\n readonly razorpayKeyId = signal<string>('');\n\n readonly convenienceFee = computed(() => {\n return Math.round(this.subtotal() * (this.convenienceFeePercent() / 100) * 100) / 100;\n });\n\n readonly totalPayable = computed(() => this.subtotal() + this.convenienceFee());\n\n readonly selectedPaymentMethod = signal<string>('');\n private studentId: string | null = null;\n private studentAuthId: string | null = null;\n private entityId: string | null = null;\n private academicYearId: string | null = null;\n\n ngOnInit(): void {\n this.updateBreadcrumbData();\n this.loadPaymentConfig();\n }\n\n private updateBreadcrumbData(): void {\n this.breadcrumbData.set([\n {\n id: 'online_payment',\n label: 'Online Fee Payment',\n icon: 'payment',\n url: undefined\n }\n ]);\n }\n\n private loadPaymentConfig(): void {\n const configUrl = cidePath.join([\n hostManagerRoutesUrl.cideSuiteHost,\n 'payments',\n 'config'\n ]);\n\n this.http.get<any>(configUrl).subscribe({\n next: (response) => {\n if (response?.success && response?.data) {\n const percent = response.data.convenience_fee_percent || 0;\n const keyId = response.data.razorpay_key_id || '';\n this.convenienceFeePercent.set(percent);\n this.razorpayKeyId.set(keyId);\n }\n },\n error: (err) => {\n console.error('Error loading payment config:', err);\n // Default to 0 if failed\n this.convenienceFeePercent.set(0);\n }\n });\n }\n\n onStudentSelected(context: StudentContext | undefined): void {\n if (!context) {\n this.studentContext.set(null);\n this.outstandingFees.set([]);\n this.selectedFees.set(new Set());\n return;\n }\n\n this.studentContext.set(context);\n this.studentId = context.studentId;\n this.studentAuthId = context.studentAuthId;\n this.entityId = context.admissionData?.admap_entity_id_syen || null;\n this.academicYearId = context.admissionData?.admap_academic_year_id_acayr || null;\n\n this.loadOutstandingFees(context.studentAuthId);\n }\n\n private loadOutstandingFees(studentAuthId: string): void {\n this.loading.set(true);\n\n // Get outstanding fees from fee assignments\n const payload: any = {\n feeas_student_id_auth: studentAuthId,\n feeas_payment_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 = response.data\n .filter((assignment: any) => {\n // Only include assignments with outstanding amount > 0\n // Priority: feeas_outstanding_amount > feeas_amount_remaining > (total - paid)\n const outstanding = assignment.feeas_outstanding_amount ??\n ((assignment.feeas_total_amount || 0) - (assignment.feeas_paid_amount || 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_outstanding_amount ??\n ((assignment.feeas_total_amount || 0) - (assignment.feeas_paid_amount || 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\n // Check for pre-selected fee IDs from query parameters\n const feeIdsParam = this.route.snapshot.queryParamMap.get('feeIds');\n if (feeIdsParam) {\n const feeIds = feeIdsParam.split(',');\n const newSelected = new Set(this.selectedFees());\n feeIds.forEach(id => {\n if (outstandingFees.some(f => f.id === id)) {\n newSelected.add(id);\n }\n });\n this.selectedFees.set(newSelected);\n }\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\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.selectedPaymentMethod.set(method);\n this.paymentForm.patchValue({ payment_method: method });\n // Validators removed - delegating details collection to Razorpay Gateway\n }\n\n canProceed(): boolean {\n return this.selectedCount() > 0;\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 | string) => {\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 feeas_student_id_auth: this.studentAuthId, // API expects feeas_student_id_auth\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: this.appStateHelper.getActiveEntityName() || '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: this.razorpayKeyId() || 'rzp_test_S7OvyoXtiCraK9',\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 feepay_student_id_auth: this.studentAuthId, // Updated to feepay_student_id_auth\n student_id: this.studentId, // Keep readable ID for notification\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 const query = generateStringFromObject({ feepay_id: verifyResponse.data.paymentId });\n this.router.navigate(['/control-panel/payment/view', query]);\n } else {\n // Navigate to statement\n this.router.navigate(['/control-panel/online-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 const activeTab = this.requestService.activeTabId();\n if (activeTab) {\n this.requestService.closeTab(activeTab);\n } else {\n this.router.navigate(['/control-panel/online-statement']);\n }\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","<cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"{ sypg_page_code: 'online_fee_payment' }\"\n [breadcrumb_data]=\"breadcrumbData()\">\n <cide-student-selection-wrapper (studentSelected)=\"onStudentSelected($event)\">\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 - REMOVED (Handled by breadcrumbs) -->\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\n 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\n 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)\" [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)\" (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 <div class=\"tw-pointer-events-none\">\n <cide-ele-input type=\"checkbox\" [ngModel]=\"isSelected(fee)\" class=\"tw-mt-1\"\n [id]=\"'checkbox-' + fee.id\">\n </cide-ele-input>\n </div>\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\n 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\n 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 ({{ convenienceFeePercent() }}%)</span>\n <span class=\"tw-font-medium tw-text-gray-900\">{{ formatCurrency(convenienceFee()) }}</span>\n </div>\n }\n <div\n 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 Action -->\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-p-4\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-2 tw-mb-4 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\n <div class=\"tw-flex tw-justify-end tw-items-center tw-gap-3 tw-mt-4\">\n <button cideEleButton type=\"button\" variant=\"secondary\" size=\"md\" (click)=\"cancel()\">\n Cancel\n </button>\n\n <button cideEleButton type=\"button\" variant=\"primary\" size=\"md\" (click)=\"proceedToPayment()\"\n [disabled]=\"!canProceed() || submitting()\" [loading]=\"submitting()\" leftIcon=\"payment\">\n Pay {{ formatCurrency(totalPayable()) }}\n </button>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </cide-student-selection-wrapper>","/*\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';\nexport * from './lib/shared/components/student-selection-wrapper/student-selection-wrapper.component';\nexport * from './lib/shared/components/fee-applicable-fees/fee-applicable-fees.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","CurrencyPipe"],"mappings":"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"}
|