diff --git a/.github/workflows/main_avinyawebapp-production.yml b/.github/workflows/main_avinyawebapp-production.yml index d417fcf1..a74c3f41 100644 --- a/.github/workflows/main_avinyawebapp-production.yml +++ b/.github/workflows/main_avinyawebapp-production.yml @@ -45,7 +45,7 @@ jobs: flutter config --enable-web - name: Upload Flutter build artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: flutter-build path: campus/frontend/build/web diff --git a/campus/bffs/enrollment/api/Dependencies.toml b/campus/bffs/enrollment/api/Dependencies.toml index f7085f26..9f6335b4 100644 --- a/campus/bffs/enrollment/api/Dependencies.toml +++ b/campus/bffs/enrollment/api/Dependencies.toml @@ -10,7 +10,7 @@ distribution-version = "2201.8.7" [[package]] org = "avinyafoundation" name = "enrollment_bff" -version = "1.1.0" +version = "2.1.0" dependencies = [ {org = "ballerina", name = "graphql"}, {org = "ballerina", name = "http"}, diff --git a/campus/frontend/lib/avinya/enrollment/lib/data/person.dart b/campus/frontend/lib/avinya/enrollment/lib/data/person.dart index 92c99073..738c6a06 100644 --- a/campus/frontend/lib/avinya/enrollment/lib/data/person.dart +++ b/campus/frontend/lib/avinya/enrollment/lib/data/person.dart @@ -519,6 +519,35 @@ Future> fetchAvinyaTypes() async { } } +Future> fetchClasses(int? id) async { + final uri = Uri.parse(AppConfig.campusProfileBffApiUrl + '/organization') + .replace(queryParameters: {'id': id.toString()}); + + final response = await http.get( + uri, + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + 'accept': 'application/json', + 'Authorization': 'Bearer ' + AppConfig.campusBffApiKey, + }, + ); + + if (response.statusCode == 200) { + // Parse the response body as JSON + final Map jsonResponse = json.decode(response.body); + + // Extract the child_organizations_for_dashboard field + final List classes = + (jsonResponse['child_organizations_for_dashboard'] as List) + .map((data) => MainOrganization.fromJson(data)) + .toList(); + + return classes; + } else { + throw Exception('Failed to load Classes'); + } +} + Future> fetchOrganizations() async { final response = await http.get( Uri.parse('${AppConfig.campusEnrollmentsBffApiUrl}/all_organizations'), diff --git a/campus/frontend/lib/avinya/enrollment/lib/widgets/person_data_excel_report.dart b/campus/frontend/lib/avinya/enrollment/lib/widgets/person_data_excel_report.dart index 48d2d494..3fcfe6be 100644 --- a/campus/frontend/lib/avinya/enrollment/lib/widgets/person_data_excel_report.dart +++ b/campus/frontend/lib/avinya/enrollment/lib/widgets/person_data_excel_report.dart @@ -42,12 +42,12 @@ class _PersonDataExcelReportState extends State { if (_fetchedPersonData.length > 0) { if (columnNamesWithoutDates.isEmpty) { columnNamesWithoutDates.addAll([ - "Date", - "Daily Count", - "Daily Attendance Percentage", - "Late Count", - "Late Attendance Percentage", - "Total Count" + "Preferred Name", + "NIC Number", + "Mobile Number", + "Digital ID", + "Date of Birth", + "Class" ]); } @@ -104,7 +104,7 @@ class _PersonDataExcelReportState extends State { sheet .cell(CellIndex.indexByColumnRow(columnIndex: 0, rowIndex: 0)) .value = - "Avinya Foundation Daily Attendance Summary Report From ${widget.formattedStartDate} to ${widget.formattedEndDate}"; + "Avinya Foundation Student Enrollment Records for ${widget.formattedEndDate}"; sheet .cell(CellIndex.indexByColumnRow(columnIndex: 0, rowIndex: 0)) .cellStyle = organizationHeaderStyle; @@ -112,6 +112,7 @@ class _PersonDataExcelReportState extends State { if (_fetchedPersonData.isNotEmpty) { for (var index = 0; index < _fetchedPersonData.length; index++) { var personData = _fetchedPersonData[index]; + var org = personData.organization?.avinya_type?.name; sheet .cell(CellIndex.indexByColumnRow( @@ -143,13 +144,13 @@ class _PersonDataExcelReportState extends State { sheet .cell(CellIndex.indexByColumnRow( columnIndex: 5, rowIndex: index + 2)) - .value = personData.organization_id?.toString() ?? ''; + .value = personData.organization?.description?.toString() ?? ''; } } excel.save( fileName: - "DailyAttendanceSummaryReport_${widget.formattedStartDate}_to_${widget.formattedEndDate}.xlsx"); + "Student Enrollment Records for ${widget.formattedEndDate}.xlsx"); } } diff --git a/campus/frontend/lib/avinya/enrollment/lib/widgets/student_update.dart b/campus/frontend/lib/avinya/enrollment/lib/widgets/student_update.dart index d757c34c..f722b4c7 100644 --- a/campus/frontend/lib/avinya/enrollment/lib/widgets/student_update.dart +++ b/campus/frontend/lib/avinya/enrollment/lib/widgets/student_update.dart @@ -15,6 +15,7 @@ class _StudentUpdateState extends State { List districts = []; List organizations = []; List avinyaTypes = []; + List classes = []; final GlobalKey _formKey = GlobalKey(); String? selectedSex; @@ -39,7 +40,9 @@ class _StudentUpdateState extends State { Future getUserPerson() async { Person user = await fetchPerson(widget.id); + classes = await fetchClasses(user.organization?.id); setState(() { + classes = classes; userPerson = user; selectedSex = userPerson.sex; selectedCityId = userPerson.mailing_address?.city?.id; diff --git a/campus/frontend/lib/avinya/enrollment/lib/widgets/students.dart b/campus/frontend/lib/avinya/enrollment/lib/widgets/students.dart index 227c557f..7ab8daee 100644 --- a/campus/frontend/lib/avinya/enrollment/lib/widgets/students.dart +++ b/campus/frontend/lib/avinya/enrollment/lib/widgets/students.dart @@ -58,6 +58,32 @@ class _StudentsState extends State { return await fetchOrganizationsByAvinyaType(86); } + Future> fetchAvinyaTypes(newValue) async { + if (newValue != null) { + if (DateTime.parse(newValue.organization_metadata[1].value.toString()) + .isBefore(DateTime.parse('2024-03-01'))) { + filteredAvinyaTypeIdValues = [ + AvinyaTypeId.Empower, + AvinyaTypeId.IT, + AvinyaTypeId.CS, + AvinyaTypeId.FutureEnrollees + ]; + } else { + filteredAvinyaTypeIdValues = [ + AvinyaTypeId.Empower, + AvinyaTypeId.FutureEnrollees + ]; + } + } else { + filteredAvinyaTypeIdValues = [ + AvinyaTypeId.Empower, + AvinyaTypeId.FutureEnrollees + ]; + } + + return filteredAvinyaTypeIdValues; + } + void updateExcelState() { PersonDataExcelReport( fetchedPersonData: _fetchedPersonData, @@ -265,46 +291,70 @@ class _StudentsState extends State { SizedBox( width: 10, ), - DropdownButton( - value: _selectedAvinyaTypeId, - items: filteredAvinyaTypeIdValues - .map( - (typeId) => DropdownMenuItem( - value: typeId, - child: Text( - typeId.name == 'FutureEnrollees' - ? 'FUTURE ENROLLEES' - : typeId.name.toUpperCase(), - ), + FutureBuilder>( + future: fetchAvinyaTypes(_selectedValue), + builder: (context, snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return Container( + margin: EdgeInsets.only(top: 10), + child: SpinKitCircle( + color: Colors.deepPurpleAccent, + size: 70, + ), + ); + } else if (snapshot.hasError) { + return const Center( + child: Text('Something went wrong...'), + ); + } else if (!snapshot.hasData) { + return const Center( + child: Text('No Avinya Type found'), + ); + } + + final avinyaTypeData = snapshot.data!; + return DropdownButton( + value: _selectedAvinyaTypeId, + items: avinyaTypeData.map((typeId) { + return DropdownMenuItem( + value: typeId, + child: Text( + typeId.name == 'FutureEnrollees' + ? 'FUTURE ENROLLEES' + : typeId.name.toUpperCase(), ), - ) - .toList(), - onChanged: (AvinyaTypeId? value) async { - if (value == null) { - return; - } - - if (_selectedValue == null || - _selectedValue!.organization_metadata.length == - 0) { - return; - } - - setState(() { - this._isFetching = true; - }); - - _fetchedPersonData = await fetchPersons( - _selectedValue!.id!, avinyaTypeId[value]!); - - setState(() { - _selectedAvinyaTypeId = value; - this._isFetching = false; - _data = MyData( - _fetchedPersonData, updateSelected, context); - filteredStudents = _fetchedPersonData; - }); - }), + ); + }).toList(), + onChanged: (AvinyaTypeId? value) async { + if (value == null) { + return; + } + + setState(() { + _selectedAvinyaTypeId = value; + _isFetching = true; + }); + + if (avinyaTypeId[value] == 103 || + _selectedValue == null) { + _fetchedPersonData = + await fetchPersons(-1, avinyaTypeId[value]!); + } else { + _fetchedPersonData = await fetchPersons( + _selectedValue!.id!, avinyaTypeId[value]!); + } + + setState(() { + _isFetching = false; + _data = MyData( + _fetchedPersonData, updateSelected, context); + filteredStudents = _fetchedPersonData; + }); + }, + ); + }, + ), SizedBox( width: 30, ),