diff --git a/assets/claim.png b/assets/claim.png new file mode 100644 index 0000000..4caf897 Binary files /dev/null and b/assets/claim.png differ diff --git a/assets/ecard.png b/assets/ecard.png new file mode 100644 index 0000000..320ff8f Binary files /dev/null and b/assets/ecard.png differ diff --git a/lib/customAppBar/customAppBar.dart b/lib/customAppBar/customAppBar.dart index 5b57ef0..dab6831 100755 --- a/lib/customAppBar/customAppBar.dart +++ b/lib/customAppBar/customAppBar.dart @@ -46,14 +46,14 @@ class _CustomAppBarState extends State { final prefs = await SharedPreferences.getInstance(); final String? hrtoken = prefs.getString('hrtoken'); - if (hrtoken != null && hrtoken.isNotEmpty) { - prefs.setBool('showBackToHR', false); - prefs.remove('token'); - Navigator.pushNamed(context, 'hrDashboard'); - } else { - await prefs.clear(); - Navigator.pushNamed(context, 'phone'); - } + // if (hrtoken != null && hrtoken.isNotEmpty) { + // prefs.setBool('showBackToHR', false); + // prefs.remove('token'); + // Navigator.pushNamed(context, 'hrDashboard'); + // } else { + // await prefs.clear(); + // Navigator.pushNamed(context, 'phone'); + // } } Future logout(BuildContext context) async { diff --git a/lib/customAppBar/enrollmentAppBar.dart b/lib/customAppBar/enrollmentAppBar.dart index cf2fb87..b86df68 100755 --- a/lib/customAppBar/enrollmentAppBar.dart +++ b/lib/customAppBar/enrollmentAppBar.dart @@ -26,7 +26,8 @@ class _CustomAppBarState extends State { Future _checkTokens() async { final prefs = await SharedPreferences.getInstance(); - final String? hrtoken = prefs.getString('hrtoken'); + // final String? hrtoken = prefs.getString('hrtoken'); + final String? hrtoken = prefs.getString('enrollToken'); final String? token = prefs.getString('token'); // showBackToHR = prefs.getBool('showBackToHR')!; diff --git a/lib/excel_verification.dart b/lib/excel_verification.dart index 978a2ea..0e3ab4f 100755 --- a/lib/excel_verification.dart +++ b/lib/excel_verification.dart @@ -21,7 +21,8 @@ import 'package:spreadsheet_decoder/spreadsheet_decoder.dart'; import 'customAppBar/customFooter.dart'; class excelVerify extends StatefulWidget { - const excelVerify({Key? key}) : super(key: key); + final String Token; + const excelVerify({Key? key, required this.Token}) : super(key: key); @override State createState() => _excelVerifyState(); @@ -77,7 +78,8 @@ class _excelVerifyState extends State { Future _loadToken() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); - final token = prefs.getString('hrtoken'); + // final token = prefs.getString('hrtoken'); + final token = widget.Token; if (token != null && token.isNotEmpty) { setState(() { _token = token; diff --git a/lib/hrDashboard.dart b/lib/hrDashboard.dart index e48f140..1e86484 100755 --- a/lib/hrDashboard.dart +++ b/lib/hrDashboard.dart @@ -199,7 +199,7 @@ class _hrDashboardState extends State empClientId: empClientId, empClientBranchId: empClientBranchId, empHrId: empHrId, - empToken: _postToken, + postToken: _postToken, ), ); } diff --git a/lib/hrPolicyDetails.dart b/lib/hrPolicyDetails.dart index 8ce54c8..14d8b5e 100755 --- a/lib/hrPolicyDetails.dart +++ b/lib/hrPolicyDetails.dart @@ -1,3 +1,4 @@ +import 'package:csv/csv.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:nhancepolicy/customAppBar/enrollmentAppBar.dart'; @@ -18,11 +19,36 @@ import 'package:intl/intl.dart'; import 'package:excel/excel.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; - +import 'package:collection/collection.dart'; import 'customAppBar/customFooter.dart'; class hrPolicyDetails extends StatefulWidget { - const hrPolicyDetails({Key? key}) : super(key: key); + final String ClientId; + // final String ClientBranchId; + final String ClientPoliyId; + final String HrId; + final String Token; + final String TokenType; + final String cardType; + final String cardPolicyNo; + final String cardInsurer_name; + final String cardPolicy_name; + final String cardPolicy_ExpDate; + + const hrPolicyDetails( + {Key? key, + required this.ClientId, + // required this.ClientBranchId, + required this.ClientPoliyId, + required this.HrId, + required this.Token, + required this.TokenType, + required this.cardType, + required this.cardPolicyNo, + required this.cardInsurer_name, + required this.cardPolicy_name, + required this.cardPolicy_ExpDate}) + : super(key: key); @override State createState() => _HrPolicyDetailsState(); @@ -33,6 +59,7 @@ class _HrPolicyDetailsState extends State Uint8List? fileBytes; late String _token; List> getEmpDependenceByClintId = []; + List> getCDPolicies = []; bool isLoading = false; bool _isLoading = false; // dynamic clintID; @@ -41,6 +68,7 @@ class _HrPolicyDetailsState extends State List reversedDataPolicy = []; List> originalData = []; // Original data source List> filteredData = []; // Filtered data source + dynamic argumentsData; dynamic policyType; dynamic policyName; @@ -51,158 +79,52 @@ class _HrPolicyDetailsState extends State TextEditingController searchController = TextEditingController(); late ApiService apiService; + int _currentPage = 1; + int _rowsPerPage = 5; + + List get _paginatedData { + final startIndex = (_currentPage - 1) * _rowsPerPage; + final endIndex = + (_currentPage * _rowsPerPage).clamp(0, filteredData.length); + return filteredData.sublist(startIndex, endIndex); + } + @override void initState() { super.initState(); apiService = ApiService(context); // Initialize ApiService here - _tabController = TabController(length: 4, vsync: this); - _loadToken(); + getCDPoliciesDetails(); + print("_PreEnrollmentState 1"); } - @override - void dispose() { - _tabController.dispose(); - super.dispose(); - } - - Future _loadToken() async { - print('1'); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - final token = prefs.getString('hrtoken'); - if (token != null && token.isNotEmpty) { - print('2'); - setState(() { - _token = token; - }); - Map? decodedToken = Jwt.parseJwt(token); - empRefId = prefs.getString('empRefId'); - // clintID = decodedToken['client_id']; - getPolicyDetails(); - } else { - // Token is empty or null, handle accordingly (e.g., navigate to login screen) - // For now, let's navigate to the login screen - ToastHelper.showErrorToast(context, 'Session Out'); - Navigator.pushReplacementNamed(context, 'hrLogin'); - } - } - - Future _saveArgumentsDataToLocalStorage(argumentsData) async { - print('6'); - print('argumentsData'); - final prefs = await SharedPreferences.getInstance(); - await prefs.setString('hrSelectArgumentsData', jsonEncode(argumentsData)); - } - - Future getPolicyDetails() async { - print('3'); - try { - print('4'); - setState(() { - if (argumentsData != null && argumentsData is Map) { - print('5'); - _saveArgumentsDataToLocalStorage(argumentsData); - print('7'); - if (argumentsData['type'] == 'GPA') { - print('8'); - _isLoading = true; - clientPolicyId = argumentsData['client_policy_id']; - clientId = argumentsData['client_id']; - policyType = argumentsData['type']; - policyName = argumentsData['policy_name']; - String int_inception_type = argumentsData['inception_type']; - inceptionType = int.parse(int_inception_type); - getEmployeeAndDependence(clientId, clientPolicyId); - } else if (argumentsData['type'] == 'GMC') { - _isLoading = true; - clientPolicyId = argumentsData['client_policy_id']; - clientId = argumentsData['client_id']; - policyType = argumentsData['type']; - policyName = argumentsData['policy_name']; - String int_inception_type = argumentsData['inception_type']; - inceptionType = int.parse(int_inception_type); - getEmployeeAndDependence(clientId, clientPolicyId); - } else if (argumentsData['type'] == 'GMC - Parents') { - _isLoading = true; - clientPolicyId = argumentsData['client_policy_id']; - clientId = argumentsData['client_id']; - policyType = argumentsData['type']; - policyName = argumentsData['policy_name']; - String int_inception_type = argumentsData['inception_type']; - inceptionType = int.parse(int_inception_type); - getEmployeeAndDependence(clientId, clientPolicyId); - } else if (argumentsData['type'] == 'GMC - Topup') { - _isLoading = true; - clientPolicyId = argumentsData['client_policy_id']; - clientId = argumentsData['client_id']; - policyType = argumentsData['type']; - policyName = argumentsData['policy_name']; - String int_inception_type = argumentsData['inception_type']; - inceptionType = int.parse(int_inception_type); - getEmployeeAndDependence(clientId, clientPolicyId); - } else if (argumentsData['type'] == 'GMC - Topup(Parents)') { - _isLoading = true; - clientPolicyId = argumentsData['client_policy_id']; - clientId = argumentsData['client_id']; - policyType = argumentsData['type']; - policyName = argumentsData['policy_name']; - String int_inception_type = argumentsData['inception_type']; - inceptionType = int.parse(int_inception_type); - getEmployeeAndDependence(clientId, clientPolicyId); - } else if (argumentsData['type'] == 'EDLI') { - _isLoading = true; - clientPolicyId = argumentsData['client_policy_id']; - clientId = argumentsData['client_id']; - policyType = argumentsData['type']; - policyName = argumentsData['policy_name']; - String int_inception_type = argumentsData['inception_type']; - inceptionType = int.parse(int_inception_type); - getEmployeeAndDependence(clientId, clientPolicyId); - } else if (argumentsData['type'] == 'GTLI') { - _isLoading = true; - clientPolicyId = argumentsData['client_policy_id']; - clientId = argumentsData['client_id']; - policyType = argumentsData['type']; - policyName = argumentsData['policy_name']; - String int_inception_type = argumentsData['inception_type']; - inceptionType = int.parse(int_inception_type); - getEmployeeAndDependence(clientId, clientPolicyId); - } - } - }); - } catch (e) { - _isLoading = false; - print('Exception occurred: $e'); - } finally { - setState(() { - _isLoading = false; - }); - } - } - - Future getEmployeeAndDependence(clintID, getPolicyNo) async { + Future getCDPoliciesDetails() async { print('9'); setState(() { isLoading = true; }); try { print('10'); - final response = await apiService.getEmployeeAndDependenceToApi( - clintID!, getPolicyNo!, empRefId!); + + final response = widget.TokenType == "post" + ? await apiService.getEmployeeAndDependenceToApi( + widget.ClientId, widget.ClientPoliyId, widget.HrId, widget.Token) + : await apiService.getEmployeeAndDependenceToApiPre( + widget.ClientId, widget.ClientPoliyId, widget.HrId, widget.Token); + if (response['status'] == 'success') { setState(() { - isLoading = false; + // isLoading = false; }); setState(() { - getEmpDependenceByClintId = - List>.from(response['data']); - originalData = getEmpDependenceByClintId; + getCDPolicies = List>.from(response['data']); + originalData = getCDPolicies; filteredData = List.from(originalData); print('filteredData'); print(filteredData); }); } else { setState(() { - isLoading = false; + // isLoading = false; }); // ToastHelper.showWarningToast( @@ -211,54 +133,16 @@ class _HrPolicyDetailsState extends State } } catch (e) { setState(() { - isLoading = false; + // isLoading = false; }); print('Exception occurred: $e'); } finally { setState(() { - _isLoading = false; + // _isLoading = false; }); } } - void _uploadFile(type) async { - var argumentType; - if (type == 'GPA') { - // argumentDetails = importPolicyName + ' - ' + getPolicyNameDetails2; - argumentType = 'GPA'; - } else if (type == 'GMC') { - // argumentDetails = importPolicyName + ' - ' + getPolicyNameDetails1; - argumentType = 'GMC'; - } - // else if (importPolicyName == 'SI-TopUp') { - // // argumentDetails = importPolicyName + ' - ' + getPolicyNameDetails0; - // argumentDetails = 'SI-TopUp'; - // } else if (importPolicyName == 'Dependent-AddOn') { - // // argumentDetails = importPolicyName + ' - ' + getPolicyNameDetails0; - // argumentDetails = 'Dependent-AddOn'; - // } - - Navigator.pushNamed(context, 'excelVerify', arguments: argumentsData); - // return; - // if (kIsWeb) { - // final input = html.FileUploadInputElement(); - // input.accept = '.xlsx'; - // input.click(); - // input.onChange.listen((event) async { - // final file = input.files!.first; - // final reader = html.FileReader(); - // reader.readAsArrayBuffer(file); - // reader.onLoadEnd.listen((event) async { - // final Uint8List? fileBytes = reader.result as Uint8List?; - // if (fileBytes != null) { - // // Call function to process Excel data - // } - // }); - // }); - // } - } - - // Implement a method to handle the search functionality void search(String query) { print(query); // Check if the query is empty @@ -271,14 +155,15 @@ class _HrPolicyDetailsState extends State // Filter the original data based on the search query setState(() { filteredData = originalData.where((row) { + final empStatus = row['emp_is_active'] == 1 ? 'active' : 'inactive'; // Implement your filter logic here // For example, check if any field in the row contains the query // Adjust this logic based on your data structure - return row['emp_code'] + return row['name'] .toString() .toLowerCase() .contains(query.toLowerCase()) || - row['name'] + row['uhid'] .toString() .toLowerCase() .contains(query.toLowerCase()) || @@ -286,7 +171,7 @@ class _HrPolicyDetailsState extends State .toString() .toLowerCase() .contains(query.toLowerCase()) || - row['dob'] + row['formatted_dob'] .toString() .toLowerCase() .contains(query.toLowerCase()) || @@ -297,591 +182,671 @@ class _HrPolicyDetailsState extends State row['mobile'] .toString() .toLowerCase() - .contains(query.toLowerCase()); + .contains(query.toLowerCase()) || + row['email_corporate'] + .toString() + .toLowerCase() + .contains(query.toLowerCase()) || + empStatus.contains(query.toLowerCase()); }).toList(); }); } print(filteredData.length); } + // emp_is_active - Future downloadExcel() async { - // API endpoint to download the Excel file + void exportToCsv(List> data) { + List> rows = []; - // Send GET request to the API - var url = Uri.parse(Environment.apiUrl + - 'exportDataByClientPolicyId?client_id=$clientId&client_policy_id=$clientPolicyId&client_branch_id=$empRefId'); + // Header + rows.add([ + 'Name', + 'UHID', + 'Relationship', + 'Date Of Birth', + 'Gender', + 'Mobile', + 'Email', + 'Status' + ]); - var response = await http.get( - url, - headers: { - 'Authorization': 'Bearer $_token', - }, - ); - - // Check if the request was successful (status code 200) - // Check if the request was successful (status code 200) - // Check if the request was successful (status code 200) - if (response.statusCode == 200) { - // Create a blob from the response body - final blob = html.Blob([response.bodyBytes]); - - // Generate a download URL for the blob - final url = html.Url.createObjectUrlFromBlob(blob); - - // Create a link element to trigger the download - final anchor = html.AnchorElement(href: url) - ..setAttribute('download', '$policyName - ($policyType).xlsx') - ..click(); - - // Revoke the download URL to free up resources - html.Url.revokeObjectUrl(url); - } else { - // Handle error - print('Failed to download Excel file: ${response.statusCode}'); + // Data rows + for (var item in data) { + rows.add([ + item['name'] ?? '', + item['uhid'] ?? '', + item['relationship'] ?? '', + item['formatted_dob'] ?? '', + item['gender'] ?? '', + item['mobile'] ?? '', + item['email_corporate'] ?? '', + item['emp_is_active'] == "1" ? 'Active' : 'Inactive', + ]); } + + // Convert to CSV string + String csvData = const ListToCsvConverter().convert(rows); + + // For Web: Create download + final bytes = utf8.encode(csvData); + final blob = html.Blob([bytes]); + final url = html.Url.createObjectUrlFromBlob(blob); + final anchor = html.AnchorElement(href: url) + ..setAttribute("download", "CD_Policies.csv") + ..click(); + html.Url.revokeObjectUrl(url); + } + + String _capitalize(String? value) { + if (value == null || value.isEmpty) return ''; + return value[0].toUpperCase() + value.substring(1).toLowerCase(); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); } @override Widget build(BuildContext context) { - dynamic arguments = ModalRoute.of(context)!.settings.arguments; - print('arguments'); - print(arguments); - if (arguments != null && arguments is Map) { - argumentsData = arguments; - print('argumentsData $argumentsData'); - } - if (filteredData == []) { - return Scaffold( - appBar: CustomAppBar(), - body: Stack(children: [ - SingleChildScrollView( - child: Container( - color: Color(0xFFEFF3F6), - child: Column( - children: [ - Center( - child: Text('No Data Available'), - ) - ], - ), - ), - ), - if (isLoading) - Container( - color: Color(0x98FFFCE5), // Semi-transparent background - child: Center( - child: // Your GIF loader widget - Image.asset( - height: 60, - width: 60, - 'assets/nhance-loader.gif'), // Adjust path to your GIF loader - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Container( - width: double.infinity, // Make the footer full width - child: CustomFooter(), - ), - ), - ])); - } else { - return Scaffold( - appBar: CustomAppBar(), - body: Stack(children: [ + // TODO: implement build + return Scaffold( + appBar: CustomAppBar(), + body: Container( + color: Color(0xFFEFF3F6), + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40), + child: Column( + children: [ Container( - padding: const EdgeInsets.only( - top: 30, bottom: 70, left: 30, right: 30), - color: Color(0xFFEFF3F6), - height: MediaQuery.of(context).size.height, - child: Card( - elevation: 0, - color: Colors.white, - child: SingleChildScrollView( - child: Column( - children: [ - Center( - child: Padding( - padding: const EdgeInsets.all(20), - child: _isLoading - ? Center(child: CircularProgressIndicator()) - : originalData.isNotEmpty - ? SingleChildScrollView( - child: Column( - children: [ - Container( - padding: EdgeInsets.all( - 10), // Set your desired padding - color: Color( - 0xFFE26728), // Set your desired background color - child: Row( - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, // Align text to the center - child: Text( - '$policyName - ($policyType)', - textAlign: TextAlign - .center, // Align text to the center - style: - GoogleFonts.poppins( - fontSize: 16, - fontWeight: - FontWeight.w500, - color: Colors.white, - ), - ), - ), - ), - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerRight, // Align text to the center - child: MouseRegion( - cursor: SystemMouseCursors - .click, - child: GestureDetector( - onTap: () async { - final prefs = - await SharedPreferences - .getInstance(); - await prefs.remove( - 'hrSelectArgumentsData'); - Navigator.pushNamed( - context, - 'hrDashboard'); - }, - child: Icon( - Icons - .close, // Replace with your desired icon - color: Colors - .white, // Replace with your desired icon color - ), - ), - ), - ), - ), - ], - ), - ), - SizedBox(height: 20), - Row( - children: [ - Expanded( - flex: (policyType == 'GPA' || - policyType == 'GMC') - ? 8 - : 10, - child: Container( - alignment: - Alignment.centerLeft, - child: Container( - width: - 350, // Set your desired width here - height: - 40, // Set your desired height here - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Color.fromRGBO( - 255, - 255, - 255, - 0.5), // Shadow color with opacity - offset: Offset(5, - 5), // Shadow position (horizontal, vertical) - blurRadius: - 10, // Blur radius - spreadRadius: - 0, // Spread radius - ), - ], - borderRadius: - BorderRadius - .circular(5), - ), - child: TextField( - textAlignVertical: - TextAlignVertical - .center, // Center the text vertically - decoration: - InputDecoration( - hintText: 'Search', - suffixIcon: Icon( - Icons.search), - contentPadding: - EdgeInsets.all( - 10), // Adjust the horizontal padding - border: - OutlineInputBorder( - borderSide: BorderSide( - color: Color( - 0xFFf5f5f7)), // Set border color to gray - ), - ), - controller: - searchController, - onChanged: - search, // Call the search method on text change - ), - )), - ), - Expanded( - flex: 2, - child: Container( - alignment: - Alignment.centerRight, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .center, - children: [ - Expanded( - child: ElevatedButton( - onPressed: () => - {downloadExcel()}, - child: Text( - 'Export', - style: TextStyle( - color: Colors - .white), - ), - style: ElevatedButton - .styleFrom( - backgroundColor: - Color( - 0xFFE26728), - shape: - RoundedRectangleBorder( - borderRadius: - BorderRadius - .circular( - 5), - ), - ), - ), - ), - ], - ), - ), - ), - SizedBox( - width: (policyType == 'GPA' || - policyType == 'GMC') - ? 5 - : 0), - if ((policyType == 'GPA' || - policyType == 'GMC' || - policyType == 'EDLI' || - policyType == 'GTLI') && - inceptionType == 2) - Expanded( - flex: 2, - child: Container( - alignment: - Alignment.centerRight, - child: Row( - mainAxisAlignment: - MainAxisAlignment - .center, - children: [ - Expanded( - child: ElevatedButton( - onPressed: () => - _uploadFile( - policyType), - child: Text( - 'Import Data', - style: TextStyle( - color: Colors - .white), - ), - style: - ElevatedButton - .styleFrom( - backgroundColor: - Color( - 0xFFE26728), - shape: - RoundedRectangleBorder( - borderRadius: - BorderRadius - .circular( - 5), - ), - ), - ), - ), - ], - ), - ), - ), - ], - ), - SizedBox(height: 20), - Row( - children: [ - Expanded( - child: SingleChildScrollView( - child: _buildDataTableGPA( - context), - ), - ) - ], - ), - ], - )) - : Container( - height: - MediaQuery.of(context).size.height, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - Container( - padding: EdgeInsets.all( - 10), // Set your desired padding - color: Color( - 0xFFE26728), // Set your desired background color - child: Row( - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerLeft, // Align text to the center - child: Text( - (policyName != null && - policyType != - null) - ? '$policyName - ($policyType)' - : '', - textAlign: TextAlign - .center, // Align text to the center - style: - GoogleFonts.poppins( - fontSize: 16, - fontWeight: - FontWeight.w500, - color: Colors.white, - ), - ), - ), - ), - Expanded( - flex: 6, - child: Container( - alignment: Alignment - .centerRight, // Align text to the center - child: MouseRegion( - cursor: - SystemMouseCursors - .click, - child: GestureDetector( - onTap: () { - Navigator.pushNamed( - context, - 'hrDashboard'); - }, - child: Icon( - Icons - .close, // Replace with your desired icon - color: Colors - .white, // Replace with your desired icon color - ), - ), - ), - ), - ), - ], - ), - ), - SizedBox(height: 200), - if (inceptionType == 2) - Center( - child: ElevatedButton( - onPressed: () => - _uploadFile(policyType), - child: Text( - 'Import Data', - style: TextStyle( - color: Colors.white), - ), - style: - ElevatedButton.styleFrom( - backgroundColor: - Color(0xFFE26728), - shape: - RoundedRectangleBorder( - borderRadius: - BorderRadius.circular( - 5), - ), - ), - ), - ) - else - Center( - child: Text( - 'No Data Available', - style: GoogleFonts.poppins( - fontSize: 16, - letterSpacing: 0, - color: Colors.black, - fontWeight: FontWeight.w300, - ), - ), - ) - ], - ), - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // color: Colors.greenAccent.shade100, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + IconButton( + padding: EdgeInsets.zero, // Removes default padding + constraints: BoxConstraints(), + onPressed: () { + Navigator.pop(context); + }, + icon: Icon( + Icons.arrow_back_ios, + color: Colors.grey, + size: 17, + )), + // IconButton( + // padding: EdgeInsets.zero, // Removes default padding + // constraints: BoxConstraints(), + // onPressed: () {}, + // icon: Icon( + // Icons.arrow_back_ios, + // color: Colors.grey, + // // size: 12, + // )), + ], + ), + ), + Container( + // color: Colors.redAccent.shade100, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + "${widget.cardType} - ${widget.cardPolicyNo} " ?? '', + style: GoogleFonts.poppins( + color: Colors.black, + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + Text( + "${widget.cardInsurer_name} - ${widget.cardPolicy_name} (${widget.cardPolicy_ExpDate}) " ?? + '', + style: GoogleFonts.poppins( + color: Colors.grey, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ], + )), + SizedBox( + height: 20, + ), + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: + BorderRadius.circular(10), // 👈 set your desired radius + ), + // height: 400, + // margin: const EdgeInsets.only(left: 40.0, right: 40.0), + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Row( + children: [ + Expanded( + flex: 4, + child: Align( + alignment: Alignment.centerLeft, + child: Container( + width: 400, + height: 37, + decoration: BoxDecoration( + color: Color(0xFFF0F0F0), + borderRadius: BorderRadius.circular(8), + ), + child: TextField( + decoration: InputDecoration( + hintText: 'Search', + prefixIcon: Icon(Icons.search, size: 18), + contentPadding: EdgeInsets.symmetric( + horizontal: 12, vertical: 8), + border: InputBorder + .none, // No border since Container handles it + ), + controller: searchController, + onChanged: search, + style: TextStyle(fontSize: 14), + ), ), ), - ], - ), - )), - ), - if (isLoading) - Container( - color: Color(0x98FFFCE5), // Semi-transparent background - child: Center( - child: // Your GIF loader widget - Image.asset( - height: 60, - width: 60, - 'assets/nhance-loader.gif'), // Adjust path to your GIF loader - ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Container( - width: double.infinity, // Make the footer full width - child: CustomFooter(), + ), + SizedBox(width: 12), + Expanded( + flex: 2, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + excelVerify(Token: widget.Token), + ), + ); + // exportToCsv(filteredData); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Color(0xFFE26728), + padding: EdgeInsets.all(10), // Internal padding + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 10), // Border radius + side: BorderSide( + color: Colors + .transparent, // Optional border color + width: 1, // Border width + ), + ), + elevation: 0, + ), + child: Text( + 'Import', + style: GoogleFonts.poppins( + fontSize: 12, + color: Color(0xFFFFFFFF), + fontWeight: FontWeight.w500, + letterSpacing: 1), + ), + ), + SizedBox( + width: 10, + ), + ElevatedButton( + onPressed: () { + exportToCsv(filteredData); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Color(0xFFE26728), + padding: EdgeInsets.all(10), // Internal padding + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 10), // Border radius + side: BorderSide( + color: Colors + .transparent, // Optional border color + width: 1, // Border width + ), + ), + elevation: 0, + ), + child: Text( + 'Export', + style: GoogleFonts.poppins( + fontSize: 12, + color: Color(0xFFFFFFFF), + fontWeight: FontWeight.w500, + letterSpacing: 1), + ), + ), + ], + ), + ), + ], + ), + SizedBox(height: 20), + Row( + children: [ + Expanded( + child: Container( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: _buildCDDataTable(context), + ), + ), + ) + ], + ), + ], ), ), - ])); - } - } - - Widget _buildDataTableGPA(context) { - if (filteredData.isEmpty) { - SizedBox(height: 25); - return Text('No available data'); - } else { - return Card( - elevation: 0, - color: Colors.white, // Set elevation to 0 for no shadow - child: PaginatedDataTable( - rowsPerPage: filteredData.length, // Adjust rows per page as needed - columns: [ - DataColumn(label: Text('Employee ID')), - DataColumn(label: Text('TPA ID')), - DataColumn(label: Text('Name')), - DataColumn(label: Text('Relationship')), - DataColumn(label: Text('Date of Birth')), - DataColumn(label: Text('Gender')), - DataColumn(label: Text('Mobile No')), - // DataColumn(label: Text('Date of Joining')), - DataColumn(label: Text('Date Coverage')), - DataColumn(label: Text('Email')), - DataColumn(label: Text('SI')), - DataColumn(label: Text('Grade')), - DataColumn(label: Text('Basic Pay')), ], - source: _DependenceDataSource0(filteredData, context), ), - ); - } - } -} - -class _DependenceDataSource0 extends DataTableSource { - final List> _data; - final BuildContext context; - _DependenceDataSource0(this._data, this.context); - - @override - DataRow getRow(int index) { - final row = _data[index]; - Color rowColor = Colors.transparent; - TextStyle textStyle = TextStyle(color: Colors.black); - bool isClickable = false; - - if (row['relationship'] == 'Self') { - rowColor = Color(0xFFFFF1DD); // Setting background color for 'Self' rows - textStyle = TextStyle(color: Colors.black); - isClickable = true; // Making 'Self' rows clickable - } - // Format date of birth to "July 10, 1996" - String dob = row['dob'] != null ? formatDateString(row['dob']) : 'N/A'; - // String doj = row['doj'] != null ? formatDateString(row['doj']) : 'N/A'; - String dateCoverage = row['date_coverage'] != null - ? formatDateString(row['date_coverage']) - : 'N/A'; - - return DataRow( - color: MaterialStateColor.resolveWith( - (states) => rowColor), // Setting row background color - cells: [ - DataCell( - Text(row['emp_code'].toString(), style: textStyle), - onTap: isClickable - ? () => _navigateToAnotherPage(row) - : null, // Navigation only for 'Self' rows - ), - DataCell(Text(row['tpa_id'].toString(), style: textStyle)), - DataCell(Text(row['name'].toString(), style: textStyle)), - DataCell(Text(row['relationship'].toString(), style: textStyle)), - DataCell(Text(dob, style: textStyle)), - DataCell(Text(row['gender'] ?? 'N/A', style: textStyle)), - DataCell(Text(row['mobile'] ?? 'N/A', style: textStyle)), - // DataCell(Text(doj, style: textStyle)), - DataCell(Text(dateCoverage, style: textStyle)), - DataCell(Text(row['email_corporate'] ?? 'N/A', style: textStyle)), - DataCell(Text(row['basic_cover_si'] ?? 'N/A', style: textStyle)), - DataCell(Text(row['grade'] ?? 'N/A', style: textStyle)), - DataCell(Text(row['basic_pay'] ?? 'N/A', style: textStyle)), - ], + ), ); } - @override - bool get isRowCountApproximate => false; + Widget _buildCDDataTable(BuildContext context) { + if (filteredData.isEmpty) { + return SizedBox( + // height: 50, + child: Center( + child: Text( + 'No available data', + style: GoogleFonts.poppins( + color: Colors.grey, + fontWeight: FontWeight.w400, + ), + )), + ); + } - @override - int get rowCount => _data.length; + return Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header row + Container( + decoration: BoxDecoration( + color: Color(0xFFD7E9EB), + borderRadius: BorderRadius.circular(6), + ), + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + child: Row( + children: [ + Expanded( + flex: 3, + child: Text( + 'Name', + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + flex: 2, + child: Text( + 'UHID', + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + flex: 2, + child: Text( + 'Relationship', + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + flex: 2, + child: Text( + 'Date Of Birth', + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + flex: 2, + child: Text( + 'Gender', + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + flex: 2, + child: Text( + 'Mobile', + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + flex: 6, + child: Text( + 'Email', + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + flex: 2, + child: Text( + 'Status', + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + flex: 3, + child: Text( + 'Action', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + color: Colors.black, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ), - @override - int get selectedRowCount => 0; + const SizedBox(height: 6), - void _navigateToAnotherPage(row) async { - print(row['mobile']); - final SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setBool('showBackToHR', true); - prefs.setString('employee_id', row['employee_id']); - // Navigation logic here - Navigator.pushNamed(context, 'empDetails', - arguments: {'mobile': row['mobile']}); - } + // Table body rows + // ...filteredData.mapIndexed((index, item) { - String formatDateString(String dateString) { - // Parse the date string to DateTime object - DateTime dateTime = DateTime.parse(dateString); - // Format the DateTime object to "dd-mm-yyyy" - String formattedDate = DateFormat('dd-MM-yyyy').format(dateTime); - return formattedDate; + // Expanded( + // child: + + SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: _paginatedData.mapIndexed((index, item) { + return Container( + // margin: const EdgeInsets.only(bottom: 8), + padding: + const EdgeInsets.symmetric(vertical: 5, horizontal: 16), + decoration: BoxDecoration( + color: Colors.white, + // color: index % 2 == 0 ? Color(0xFFE6FAFB) : Colors.white, + borderRadius: BorderRadius.circular(6), + ), + child: Row( + children: [ + Expanded( + flex: 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + item['name'] ?? '-', + style: GoogleFonts.poppins( + color: Color(0xFF000000), + fontWeight: FontWeight.w400, + fontSize: 12), + ), + Text( + item['emp_code'] ?? '-', + style: GoogleFonts.poppins( + color: Color(0xFF585757), + fontWeight: FontWeight.w300, + fontSize: 10), + ), + ], + ), + ), + Expanded( + flex: 2, + child: Text( + item['uhid'] ?? '-', + style: GoogleFonts.poppins( + color: Color(0xFF000000), + fontWeight: FontWeight.w400, + fontSize: 12), + ), + ), + Expanded( + flex: 2, + child: Text( + "${item['relationship'] ?? ''}", + style: GoogleFonts.poppins( + color: Color(0xFF000000), + fontWeight: FontWeight.w400, + fontSize: 12), + ), + ), + Expanded( + flex: 2, + child: Text( + "${item['formatted_dob'] ?? ''}", + style: GoogleFonts.poppins( + color: Color(0xFF000000), + fontWeight: FontWeight.w400, + fontSize: 12), + ), + ), + Expanded( + flex: 2, + child: Text( + "${item['gender'] ?? ''}", + style: GoogleFonts.poppins( + color: Color(0xFF000000), + fontWeight: FontWeight.w400, + fontSize: 12), + ), + ), + Expanded( + flex: 2, + child: Text( + "${item['mobile'] ?? ''}", + style: GoogleFonts.poppins( + color: Color(0xFF000000), + fontWeight: FontWeight.w400, + fontSize: 12), + ), + ), + Expanded( + flex: 6, + child: Text( + "${item['email_corporate'] ?? ''}", + style: GoogleFonts.poppins( + color: Color(0xFF000000), + fontWeight: FontWeight.w400, + fontSize: 12), + ), + ), + Expanded( + flex: 2, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 4, vertical: 4), + decoration: BoxDecoration( + color: Color(0xFF7BD9B6), + // color: (item['emp_is_active'] == "1") + // ? Color(0xFF7BD9B6) + // : Color(0xFFFFA6A6), + borderRadius: BorderRadius.circular(6), + ), + child: Align( + alignment: Alignment.center, + child: Text( + _capitalize(item['status']), + style: GoogleFonts.poppins( + color: Color(0xFF000000), + fontWeight: FontWeight.w500, + fontSize: 12, + ), + ), + ), + ), + ), + Expanded( + flex: 3, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () {}, + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + color: Color(0xFFE6F5F6), + borderRadius: BorderRadius.circular(12)), + child: Icon(Icons.credit_card, + color: Color(0xFF3D3D3D)), + // child: Image.asset( + // 'assets/ecard.jpg', + // height: 20, + // fit: BoxFit.cover, + // ), + ), + ), + SizedBox( + width: 10, + ), + GestureDetector( + onTap: () {}, + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + color: Color(0xFFE6F5F6), + borderRadius: BorderRadius.circular(12)), + child: Icon( + Icons.policy, + color: Color(0xFF3D3D3D), + ), + // child: Image.asset( + // 'assets/claims.jpg', + // height: 20, + // fit: BoxFit.cover, + // ), + ), + ), + ], + ), + ), + ], + ), + ); + }).toList(), + ), + ), + // ), + + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + DropdownButton( + value: _rowsPerPage, + items: [5, 10, 15, 20, 50].map((int value) { + return DropdownMenuItem( + value: value, + child: Text( + ' $value ', + style: GoogleFonts.poppins(fontSize: 15), + ), + ); + }).toList(), + onChanged: (newValue) { + setState(() { + _rowsPerPage = newValue!; + _currentPage = + 1; // Reset to first page when rows per page changes + }); + }, + ), + IconButton( + onPressed: _currentPage > 1 + ? () { + setState(() { + _currentPage--; + }); + } + : null, + icon: Icon(Icons.chevron_left), + ), + for (int i = 1; + i <= (filteredData.length / _rowsPerPage).ceil(); + i++) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: _currentPage == i + ? Color(0xFF00A6A6) + : Colors.grey[300], + foregroundColor: + _currentPage == i ? Colors.white : Colors.black, + minimumSize: Size(36, 36), + padding: EdgeInsets.zero, + ), + onPressed: () { + setState(() { + _currentPage = i; + }); + }, + child: Text(i.toString()), + ), + ), + IconButton( + onPressed: _currentPage < + (filteredData.length / _rowsPerPage).ceil() + ? () { + setState(() { + _currentPage++; + }); + } + : null, + icon: Icon(Icons.chevron_right), + ), + ], + ), + ), + ], + ), + ], + ), + ); } } - -// Sample Data class representing each element in the array -class Data { - final dynamic value; - final int row; - final int column; - final String sheet; - - Data(this.value, this.row, this.column, this.sheet); -} diff --git a/lib/hrPolicyDetials b/lib/hrPolicyDetials new file mode 100644 index 0000000..c22637f --- /dev/null +++ b/lib/hrPolicyDetials @@ -0,0 +1,887 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:nhancepolicy/customAppBar/enrollmentAppBar.dart'; +import 'package:nhancepolicy/excel_verification.dart'; +import 'package:nhancepolicy/models/environment.dart'; +import 'package:nhancepolicy/service/api_service.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:jwt_decode/jwt_decode.dart'; +import 'dart:convert'; +import 'dart:async'; +import 'package:http/http.dart' as http; +import 'package:nhancepolicy/customAppBar/toastHelper.dart'; +import 'package:universal_html/html.dart' as html; +import 'dart:typed_data'; +import 'dart:io'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:intl/intl.dart'; +import 'package:excel/excel.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:path/path.dart' as path; + +import 'customAppBar/customFooter.dart'; + +class hrPolicyDetails extends StatefulWidget { + const hrPolicyDetails({Key? key}) : super(key: key); + + @override + State createState() => _HrPolicyDetailsState(); +} + +class _HrPolicyDetailsState extends State + with TickerProviderStateMixin { + Uint8List? fileBytes; + late String _token; + List> getEmpDependenceByClintId = []; + bool isLoading = false; + bool _isLoading = false; + // dynamic clintID; + late TabController _tabController; + // List dataPolicy = []; + List reversedDataPolicy = []; + List> originalData = []; // Original data source + List> filteredData = []; // Filtered data source + dynamic argumentsData; + dynamic policyType; + dynamic policyName; + dynamic clientPolicyId; + dynamic clientId; + dynamic empRefId; + int inceptionType = 0; + TextEditingController searchController = TextEditingController(); + late ApiService apiService; + + @override + void initState() { + super.initState(); + apiService = ApiService(context); // Initialize ApiService here + _tabController = TabController(length: 4, vsync: this); + _loadToken(); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + Future _loadToken() async { + print('1'); + final SharedPreferences prefs = await SharedPreferences.getInstance(); + final token = prefs.getString('hrtoken'); + if (token != null && token.isNotEmpty) { + print('2'); + setState(() { + _token = token; + }); + Map? decodedToken = Jwt.parseJwt(token); + empRefId = prefs.getString('empRefId'); + // clintID = decodedToken['client_id']; + getPolicyDetails(); + } else { + // Token is empty or null, handle accordingly (e.g., navigate to login screen) + // For now, let's navigate to the login screen + ToastHelper.showErrorToast(context, 'Session Out'); + Navigator.pushReplacementNamed(context, 'hrLogin'); + } + } + + Future _saveArgumentsDataToLocalStorage(argumentsData) async { + print('6'); + print('argumentsData'); + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('hrSelectArgumentsData', jsonEncode(argumentsData)); + } + + Future getPolicyDetails() async { + print('3'); + try { + print('4'); + setState(() { + if (argumentsData != null && argumentsData is Map) { + print('5'); + _saveArgumentsDataToLocalStorage(argumentsData); + print('7'); + if (argumentsData['type'] == 'GPA') { + print('8'); + _isLoading = true; + clientPolicyId = argumentsData['client_policy_id']; + clientId = argumentsData['client_id']; + policyType = argumentsData['type']; + policyName = argumentsData['policy_name']; + String int_inception_type = argumentsData['inception_type']; + inceptionType = int.parse(int_inception_type); + getEmployeeAndDependence(clientId, clientPolicyId); + } else if (argumentsData['type'] == 'GMC') { + _isLoading = true; + clientPolicyId = argumentsData['client_policy_id']; + clientId = argumentsData['client_id']; + policyType = argumentsData['type']; + policyName = argumentsData['policy_name']; + String int_inception_type = argumentsData['inception_type']; + inceptionType = int.parse(int_inception_type); + getEmployeeAndDependence(clientId, clientPolicyId); + } else if (argumentsData['type'] == 'GMC - Parents') { + _isLoading = true; + clientPolicyId = argumentsData['client_policy_id']; + clientId = argumentsData['client_id']; + policyType = argumentsData['type']; + policyName = argumentsData['policy_name']; + String int_inception_type = argumentsData['inception_type']; + inceptionType = int.parse(int_inception_type); + getEmployeeAndDependence(clientId, clientPolicyId); + } else if (argumentsData['type'] == 'GMC - Topup') { + _isLoading = true; + clientPolicyId = argumentsData['client_policy_id']; + clientId = argumentsData['client_id']; + policyType = argumentsData['type']; + policyName = argumentsData['policy_name']; + String int_inception_type = argumentsData['inception_type']; + inceptionType = int.parse(int_inception_type); + getEmployeeAndDependence(clientId, clientPolicyId); + } else if (argumentsData['type'] == 'GMC - Topup(Parents)') { + _isLoading = true; + clientPolicyId = argumentsData['client_policy_id']; + clientId = argumentsData['client_id']; + policyType = argumentsData['type']; + policyName = argumentsData['policy_name']; + String int_inception_type = argumentsData['inception_type']; + inceptionType = int.parse(int_inception_type); + getEmployeeAndDependence(clientId, clientPolicyId); + } else if (argumentsData['type'] == 'EDLI') { + _isLoading = true; + clientPolicyId = argumentsData['client_policy_id']; + clientId = argumentsData['client_id']; + policyType = argumentsData['type']; + policyName = argumentsData['policy_name']; + String int_inception_type = argumentsData['inception_type']; + inceptionType = int.parse(int_inception_type); + getEmployeeAndDependence(clientId, clientPolicyId); + } else if (argumentsData['type'] == 'GTLI') { + _isLoading = true; + clientPolicyId = argumentsData['client_policy_id']; + clientId = argumentsData['client_id']; + policyType = argumentsData['type']; + policyName = argumentsData['policy_name']; + String int_inception_type = argumentsData['inception_type']; + inceptionType = int.parse(int_inception_type); + getEmployeeAndDependence(clientId, clientPolicyId); + } + } + }); + } catch (e) { + _isLoading = false; + print('Exception occurred: $e'); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + Future getEmployeeAndDependence(clintID, getPolicyNo) async { + print('9'); + setState(() { + isLoading = true; + }); + try { + print('10'); + final response = await apiService.getEmployeeAndDependenceToApi( + clintID!, getPolicyNo!, empRefId!); + if (response['status'] == 'success') { + setState(() { + isLoading = false; + }); + setState(() { + getEmpDependenceByClintId = + List>.from(response['data']); + originalData = getEmpDependenceByClintId; + filteredData = List.from(originalData); + print('filteredData'); + print(filteredData); + }); + } else { + setState(() { + isLoading = false; + }); + + // ToastHelper.showWarningToast( + // context, 'Request failed with status: ${response.statusCode}'); + print('Request failed with status: ${response['code']}'); + } + } catch (e) { + setState(() { + isLoading = false; + }); + print('Exception occurred: $e'); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + void _uploadFile(type) async { + var argumentType; + if (type == 'GPA') { + // argumentDetails = importPolicyName + ' - ' + getPolicyNameDetails2; + argumentType = 'GPA'; + } else if (type == 'GMC') { + // argumentDetails = importPolicyName + ' - ' + getPolicyNameDetails1; + argumentType = 'GMC'; + } + // else if (importPolicyName == 'SI-TopUp') { + // // argumentDetails = importPolicyName + ' - ' + getPolicyNameDetails0; + // argumentDetails = 'SI-TopUp'; + // } else if (importPolicyName == 'Dependent-AddOn') { + // // argumentDetails = importPolicyName + ' - ' + getPolicyNameDetails0; + // argumentDetails = 'Dependent-AddOn'; + // } + + Navigator.pushNamed(context, 'excelVerify', arguments: argumentsData); + // return; + // if (kIsWeb) { + // final input = html.FileUploadInputElement(); + // input.accept = '.xlsx'; + // input.click(); + // input.onChange.listen((event) async { + // final file = input.files!.first; + // final reader = html.FileReader(); + // reader.readAsArrayBuffer(file); + // reader.onLoadEnd.listen((event) async { + // final Uint8List? fileBytes = reader.result as Uint8List?; + // if (fileBytes != null) { + // // Call function to process Excel data + // } + // }); + // }); + // } + } + + // Implement a method to handle the search functionality + void search(String query) { + print(query); + // Check if the query is empty + if (query.isEmpty) { + // If search query is empty, show all data + setState(() { + filteredData = List.from(originalData); + }); + } else { + // Filter the original data based on the search query + setState(() { + filteredData = originalData.where((row) { + // Implement your filter logic here + // For example, check if any field in the row contains the query + // Adjust this logic based on your data structure + return row['emp_code'] + .toString() + .toLowerCase() + .contains(query.toLowerCase()) || + row['name'] + .toString() + .toLowerCase() + .contains(query.toLowerCase()) || + row['relationship'] + .toString() + .toLowerCase() + .contains(query.toLowerCase()) || + row['dob'] + .toString() + .toLowerCase() + .contains(query.toLowerCase()) || + row['gender'] + .toString() + .toLowerCase() + .contains(query.toLowerCase()) || + row['mobile'] + .toString() + .toLowerCase() + .contains(query.toLowerCase()); + }).toList(); + }); + } + print(filteredData.length); + } + + Future downloadExcel() async { + // API endpoint to download the Excel file + + // Send GET request to the API + var url = Uri.parse(Environment.apiUrl + + 'exportDataByClientPolicyId?client_id=$clientId&client_policy_id=$clientPolicyId&client_branch_id=$empRefId'); + + var response = await http.get( + url, + headers: { + 'Authorization': 'Bearer $_token', + }, + ); + + // Check if the request was successful (status code 200) + // Check if the request was successful (status code 200) + // Check if the request was successful (status code 200) + if (response.statusCode == 200) { + // Create a blob from the response body + final blob = html.Blob([response.bodyBytes]); + + // Generate a download URL for the blob + final url = html.Url.createObjectUrlFromBlob(blob); + + // Create a link element to trigger the download + final anchor = html.AnchorElement(href: url) + ..setAttribute('download', '$policyName - ($policyType).xlsx') + ..click(); + + // Revoke the download URL to free up resources + html.Url.revokeObjectUrl(url); + } else { + // Handle error + print('Failed to download Excel file: ${response.statusCode}'); + } + } + + @override + Widget build(BuildContext context) { + dynamic arguments = ModalRoute.of(context)!.settings.arguments; + print('arguments'); + print(arguments); + if (arguments != null && arguments is Map) { + argumentsData = arguments; + print('argumentsData $argumentsData'); + } + if (filteredData == []) { + return Scaffold( + appBar: CustomAppBar(), + body: Stack(children: [ + SingleChildScrollView( + child: Container( + color: Color(0xFFEFF3F6), + child: Column( + children: [ + Center( + child: Text('No Data Available'), + ) + ], + ), + ), + ), + if (isLoading) + Container( + color: Color(0x98FFFCE5), // Semi-transparent background + child: Center( + child: // Your GIF loader widget + Image.asset( + height: 60, + width: 60, + 'assets/nhance-loader.gif'), // Adjust path to your GIF loader + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Container( + width: double.infinity, // Make the footer full width + child: CustomFooter(), + ), + ), + ])); + } else { + return Scaffold( + appBar: CustomAppBar(), + body: Stack(children: [ + Container( + padding: const EdgeInsets.only( + top: 30, bottom: 70, left: 30, right: 30), + color: Color(0xFFEFF3F6), + height: MediaQuery.of(context).size.height, + child: Card( + elevation: 0, + color: Colors.white, + child: SingleChildScrollView( + child: Column( + children: [ + Center( + child: Padding( + padding: const EdgeInsets.all(20), + child: _isLoading + ? Center(child: CircularProgressIndicator()) + : originalData.isNotEmpty + ? SingleChildScrollView( + child: Column( + children: [ + Container( + padding: EdgeInsets.all( + 10), // Set your desired padding + color: Color( + 0xFFE26728), // Set your desired background color + child: Row( + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, // Align text to the center + child: Text( + '$policyName - ($policyType)', + textAlign: TextAlign + .center, // Align text to the center + style: + GoogleFonts.poppins( + fontSize: 16, + fontWeight: + FontWeight.w500, + color: Colors.white, + ), + ), + ), + ), + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerRight, // Align text to the center + child: MouseRegion( + cursor: SystemMouseCursors + .click, + child: GestureDetector( + onTap: () async { + final prefs = + await SharedPreferences + .getInstance(); + await prefs.remove( + 'hrSelectArgumentsData'); + Navigator.pushNamed( + context, + 'hrDashboard'); + }, + child: Icon( + Icons + .close, // Replace with your desired icon + color: Colors + .white, // Replace with your desired icon color + ), + ), + ), + ), + ), + ], + ), + ), + SizedBox(height: 20), + Row( + children: [ + Expanded( + flex: (policyType == 'GPA' || + policyType == 'GMC') + ? 8 + : 10, + child: Container( + alignment: + Alignment.centerLeft, + child: Container( + width: + 350, // Set your desired width here + height: + 40, // Set your desired height here + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Color.fromRGBO( + 255, + 255, + 255, + 0.5), // Shadow color with opacity + offset: Offset(5, + 5), // Shadow position (horizontal, vertical) + blurRadius: + 10, // Blur radius + spreadRadius: + 0, // Spread radius + ), + ], + borderRadius: + BorderRadius + .circular(5), + ), + child: TextField( + textAlignVertical: + TextAlignVertical + .center, // Center the text vertically + decoration: + InputDecoration( + hintText: 'Search', + suffixIcon: Icon( + Icons.search), + contentPadding: + EdgeInsets.all( + 10), // Adjust the horizontal padding + border: + OutlineInputBorder( + borderSide: BorderSide( + color: Color( + 0xFFf5f5f7)), // Set border color to gray + ), + ), + controller: + searchController, + onChanged: + search, // Call the search method on text change + ), + )), + ), + Expanded( + flex: 2, + child: Container( + alignment: + Alignment.centerRight, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + Expanded( + child: ElevatedButton( + onPressed: () => + {downloadExcel()}, + child: Text( + 'Export', + style: TextStyle( + color: Colors + .white), + ), + style: ElevatedButton + .styleFrom( + backgroundColor: + Color( + 0xFFE26728), + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius + .circular( + 5), + ), + ), + ), + ), + ], + ), + ), + ), + SizedBox( + width: (policyType == 'GPA' || + policyType == 'GMC') + ? 5 + : 0), + if ((policyType == 'GPA' || + policyType == 'GMC' || + policyType == 'EDLI' || + policyType == 'GTLI') && + inceptionType == 2) + Expanded( + flex: 2, + child: Container( + alignment: + Alignment.centerRight, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + Expanded( + child: ElevatedButton( + onPressed: () => + _uploadFile( + policyType), + child: Text( + 'Import Data', + style: TextStyle( + color: Colors + .white), + ), + style: + ElevatedButton + .styleFrom( + backgroundColor: + Color( + 0xFFE26728), + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius + .circular( + 5), + ), + ), + ), + ), + ], + ), + ), + ), + ], + ), + SizedBox(height: 20), + Row( + children: [ + Expanded( + child: SingleChildScrollView( + child: _buildDataTableGPA( + context), + ), + ) + ], + ), + ], + )) + : Container( + height: + MediaQuery.of(context).size.height, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.all( + 10), // Set your desired padding + color: Color( + 0xFFE26728), // Set your desired background color + child: Row( + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerLeft, // Align text to the center + child: Text( + (policyName != null && + policyType != + null) + ? '$policyName - ($policyType)' + : '', + textAlign: TextAlign + .center, // Align text to the center + style: + GoogleFonts.poppins( + fontSize: 16, + fontWeight: + FontWeight.w500, + color: Colors.white, + ), + ), + ), + ), + Expanded( + flex: 6, + child: Container( + alignment: Alignment + .centerRight, // Align text to the center + child: MouseRegion( + cursor: + SystemMouseCursors + .click, + child: GestureDetector( + onTap: () { + Navigator.pushNamed( + context, + 'hrDashboard'); + }, + child: Icon( + Icons + .close, // Replace with your desired icon + color: Colors + .white, // Replace with your desired icon color + ), + ), + ), + ), + ), + ], + ), + ), + SizedBox(height: 200), + if (inceptionType == 2) + Center( + child: ElevatedButton( + onPressed: () => + _uploadFile(policyType), + child: Text( + 'Import Data', + style: TextStyle( + color: Colors.white), + ), + style: + ElevatedButton.styleFrom( + backgroundColor: + Color(0xFFE26728), + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 5), + ), + ), + ), + ) + else + Center( + child: Text( + 'No Data Available', + style: GoogleFonts.poppins( + fontSize: 16, + letterSpacing: 0, + color: Colors.black, + fontWeight: FontWeight.w300, + ), + ), + ) + ], + ), + ), + ), + ), + ], + ), + )), + ), + if (isLoading) + Container( + color: Color(0x98FFFCE5), // Semi-transparent background + child: Center( + child: // Your GIF loader widget + Image.asset( + height: 60, + width: 60, + 'assets/nhance-loader.gif'), // Adjust path to your GIF loader + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Container( + width: double.infinity, // Make the footer full width + child: CustomFooter(), + ), + ), + ])); + } + } + + Widget _buildDataTableGPA(context) { + if (filteredData.isEmpty) { + SizedBox(height: 25); + return Text('No available data'); + } else { + return Card( + elevation: 0, + color: Colors.white, // Set elevation to 0 for no shadow + child: PaginatedDataTable( + rowsPerPage: filteredData.length, // Adjust rows per page as needed + columns: [ + DataColumn(label: Text('Employee ID')), + DataColumn(label: Text('TPA ID')), + DataColumn(label: Text('Name')), + DataColumn(label: Text('Relationship')), + DataColumn(label: Text('Date of Birth')), + DataColumn(label: Text('Gender')), + DataColumn(label: Text('Mobile No')), + // DataColumn(label: Text('Date of Joining')), + DataColumn(label: Text('Date Coverage')), + DataColumn(label: Text('Email')), + DataColumn(label: Text('SI')), + DataColumn(label: Text('Grade')), + DataColumn(label: Text('Basic Pay')), + ], + source: _DependenceDataSource0(filteredData, context), + ), + ); + } + } +} + +class _DependenceDataSource0 extends DataTableSource { + final List> _data; + final BuildContext context; + _DependenceDataSource0(this._data, this.context); + + @override + DataRow getRow(int index) { + final row = _data[index]; + Color rowColor = Colors.transparent; + TextStyle textStyle = TextStyle(color: Colors.black); + bool isClickable = false; + + if (row['relationship'] == 'Self') { + rowColor = Color(0xFFFFF1DD); // Setting background color for 'Self' rows + textStyle = TextStyle(color: Colors.black); + isClickable = true; // Making 'Self' rows clickable + } + // Format date of birth to "July 10, 1996" + String dob = row['dob'] != null ? formatDateString(row['dob']) : 'N/A'; + // String doj = row['doj'] != null ? formatDateString(row['doj']) : 'N/A'; + String dateCoverage = row['date_coverage'] != null + ? formatDateString(row['date_coverage']) + : 'N/A'; + + return DataRow( + color: MaterialStateColor.resolveWith( + (states) => rowColor), // Setting row background color + cells: [ + DataCell( + Text(row['emp_code'].toString(), style: textStyle), + onTap: isClickable + ? () => _navigateToAnotherPage(row) + : null, // Navigation only for 'Self' rows + ), + DataCell(Text(row['tpa_id'].toString(), style: textStyle)), + DataCell(Text(row['name'].toString(), style: textStyle)), + DataCell(Text(row['relationship'].toString(), style: textStyle)), + DataCell(Text(dob, style: textStyle)), + DataCell(Text(row['gender'] ?? 'N/A', style: textStyle)), + DataCell(Text(row['mobile'] ?? 'N/A', style: textStyle)), + // DataCell(Text(doj, style: textStyle)), + DataCell(Text(dateCoverage, style: textStyle)), + DataCell(Text(row['email_corporate'] ?? 'N/A', style: textStyle)), + DataCell(Text(row['basic_cover_si'] ?? 'N/A', style: textStyle)), + DataCell(Text(row['grade'] ?? 'N/A', style: textStyle)), + DataCell(Text(row['basic_pay'] ?? 'N/A', style: textStyle)), + ], + ); + } + + @override + bool get isRowCountApproximate => false; + + @override + int get rowCount => _data.length; + + @override + int get selectedRowCount => 0; + + void _navigateToAnotherPage(row) async { + print(row['mobile']); + final SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setBool('showBackToHR', true); + prefs.setString('employee_id', row['employee_id']); + // Navigation logic here + Navigator.pushNamed(context, 'empDetails', + arguments: {'mobile': row['mobile']}); + } + + String formatDateString(String dateString) { + // Parse the date string to DateTime object + DateTime dateTime = DateTime.parse(dateString); + // Format the DateTime object to "dd-mm-yyyy" + String formattedDate = DateFormat('dd-MM-yyyy').format(dateTime); + return formattedDate; + } +} + +// Sample Data class representing each element in the array +class Data { + final dynamic value; + final int row; + final int column; + final String sheet; + + Data(this.value, this.row, this.column, this.sheet); +} diff --git a/lib/main.dart b/lib/main.dart index 4a25a4e..ad1f555 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -35,8 +35,8 @@ Future main() async { routes: { 'phone': (context) => MyPhone(), 'mailVerify': (context) => MyEmailVerify( - email: '', - ), + email: '', + ), 'verify': (context) => MyVerify( verificationId: '', mobileNumber: '', @@ -52,12 +52,25 @@ Future main() async { onResendCode: (String, int) {}, ), 'hrHome': (context) => MyHrHome(), - 'excelVerify': (context) => excelVerify(), + 'excelVerify': (context) => excelVerify( + Token: '', + ), 'empDetails': (context) => empDetails(), 'addOnsDetails': (context) => addOnsDetails(), 'empReviewDetails': (context) => empReviewDetails(), 'hrDashboard': (context) => hrDashboard(), - 'hrPolicyDetails': (context) => hrPolicyDetails(), + 'hrPolicyDetails': (context) => hrPolicyDetails( + ClientId: '', + ClientPoliyId: '', + HrId: '', + Token: '', + TokenType: '', + cardType: '', + cardPolicyNo: '', + cardInsurer_name: '', + cardPolicy_name: '', + cardPolicy_ExpDate: '', + ), 'oldPolicy': (context) => oldPolicy(), }, )); diff --git a/lib/service/api_service.dart b/lib/service/api_service.dart index ab125eb..ae11a4f 100755 --- a/lib/service/api_service.dart +++ b/lib/service/api_service.dart @@ -438,7 +438,7 @@ class ApiService { // final url = Uri.parse( // '${Environment.apiUrl}getPolicyLevelEmployeeSummaryData?client_id=$clintID&client_branch_id=$empRefId&hr_id=470'); final url = Uri.parse( - '${Environment.apiUrl}getPolicyLevelEmployeeSummaryData?client_id=$clintID&client_branch_id=$empRefId&policy_status=$emp_status&hr_id=$hr_id'); + '${Environment.apiUrlPost}getPolicyLevelEmployeeSummaryData?client_id=$clintID&client_branch_id=$empRefId&policy_status=$emp_status&hr_id=$hr_id'); final headers = { 'Authorization': 'Bearer $token' ?? '', @@ -461,15 +461,30 @@ class ApiService { } Future> getEmployeeAndDependenceToApi( - String clintID, String getPolicyNo, String empRefId) async { + String clintID, String getPolicyNo, String empRefId, String token) async { print(_hrtoken); - if (_hrtoken == null) { + if (token == null) { + await _initializeToken(); + } + final url = Uri.parse( + '${Environment.apiUrlPost}getEmployeeAndDependenceByClientId?client_id=$clintID&client_policy_id=$getPolicyNo&client_branch_id=$empRefId'); + final headers = { + 'Authorization': 'Bearer $token' ?? '', + }; + final response = await _makeGetRequest(url, headers); + return response; + } + + Future> getEmployeeAndDependenceToApiPre( + String clintID, String getPolicyNo, String empRefId, String token) async { + print(_hrtoken); + if (token == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}getEmployeeAndDependenceByClientId?client_id=$clintID&client_policy_id=$getPolicyNo&client_branch_id=$empRefId'); final headers = { - 'Authorization': 'Bearer $_hrtoken' ?? '', + 'Authorization': 'Bearer $token' ?? '', }; final response = await _makeGetRequest(url, headers); return response; diff --git a/lib/service/hrDashboardTabs/activePolicies.dart b/lib/service/hrDashboardTabs/activePolicies.dart index 8240516..1336d84 100644 --- a/lib/service/hrDashboardTabs/activePolicies.dart +++ b/lib/service/hrDashboardTabs/activePolicies.dart @@ -5,19 +5,20 @@ import 'package:flutter/services.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; +import '../../hrPolicyDetails.dart'; import '../api_service.dart'; class ActivePolicies extends StatefulWidget { final String empClientId; final String empClientBranchId; final String empHrId; - final String empToken; + final String postToken; const ActivePolicies( {Key? key, required this.empClientId, required this.empClientBranchId, - required this.empToken, + required this.postToken, required this.empHrId}); @override @@ -26,130 +27,63 @@ class ActivePolicies extends StatefulWidget { class _ActivePolicieState extends State { late ApiService apiService; - // dynamic getCardArrays = []; + dynamic getCardArrays = []; int selectedIndex = 1; + int stausVal = 1; - List> getCardArrays = [ - { - "client_policy_id": 392, - "client_id": 58, - "policy_type_id": 2, - "is_addon": 1, - "OpenForEnrollment": 1, - "inception_type": 2, - "policy_no": "GMC-MA8596745566998855885", - "insurer_id": 1, - "type": "GMC", - "policy_name": "Group Medical Coverage", - "insurer_name": "Life Insurance Corporation of India (LIC)", - "insurer_short_name": "LIC", - "totalMembersCount": 7, - "membersCountOfEnrolled": 0, - "membersCountOfDraft": 7 - }, - { - "client_policy_id": 396, - "client_id": 58, - "policy_type_id": 4, - "is_addon": 2, - "OpenForEnrollment": 1, - "inception_type": 2, - "policy_no": "GMC-MA8596745566998855885", - "insurer_id": 1, - "type": "GMC - Topup", - "policy_name": "Group Medical Coverage Topup", - "insurer_name": "Life Insurance Corporation of India (LIC)", - "insurer_short_name": "LIC", - "totalMembersCount": 7, - "membersCountOfEnrolled": 0, - "membersCountOfDraft": 7 - }, - { - "client_policy_id": 392, - "client_id": 58, - "policy_type_id": 2, - "is_addon": 1, - "OpenForEnrollment": 1, - "inception_type": 2, - "policy_no": "GMC-MA8596745566998855885", - "insurer_id": 1, - "type": "GMC", - "policy_name": "Group Medical Coverage", - "insurer_name": "Life Insurance Corporation of India (LIC)", - "insurer_short_name": "LIC", - "totalMembersCount": 7, - "membersCountOfEnrolled": 0, - "membersCountOfDraft": 7 - }, - { - "client_policy_id": 396, - "client_id": 58, - "policy_type_id": 4, - "is_addon": 2, - "OpenForEnrollment": 1, - "inception_type": 2, - "policy_no": "GMC-MA8596745566998855885", - "insurer_id": 1, - "type": "GMC - Topup", - "policy_name": "Group Medical Coverage Topup", - "insurer_name": "Life Insurance Corporation of India (LIC)", - "insurer_short_name": "LIC", - "totalMembersCount": 7, - "membersCountOfEnrolled": 0, - "membersCountOfDraft": 7 - }, - { - "client_policy_id": 396, - "client_id": 58, - "policy_type_id": 4, - "is_addon": 2, - "OpenForEnrollment": 1, - "inception_type": 2, - "policy_no": "GMC-MA8596745566998855885", - "insurer_id": 1, - "type": "GMC - Topup", - "policy_name": "Group Medical Coverage Topup", - "insurer_name": "Life Insurance Corporation of India (LIC)", - "insurer_short_name": "LIC", - "totalMembersCount": 7, - "membersCountOfEnrolled": 0, - "membersCountOfDraft": 7 - }, - { - "client_policy_id": 392, - "client_id": 58, - "policy_type_id": 2, - "is_addon": 1, - "OpenForEnrollment": 1, - "inception_type": 2, - "policy_no": "GMC-MA8596745566998855885", - "insurer_id": 1, - "type": "GMC", - "policy_name": "Group Medical Coverage", - "insurer_name": "Life Insurance Corporation of India (LIC)", - "insurer_short_name": "LIC", - "totalMembersCount": 7, - "membersCountOfEnrolled": 0, - "membersCountOfDraft": 7 - }, - { - "client_policy_id": 396, - "client_id": 58, - "policy_type_id": 4, - "is_addon": 2, - "OpenForEnrollment": 1, - "inception_type": 2, - "policy_no": "GMC-MA8596745566998855885", - "insurer_id": 1, - "type": "GMC - Topup", - "policy_name": "Group Medical Coverage Topup", - "insurer_name": "Life Insurance Corporation of India (LIC)", - "insurer_short_name": "LIC", - "totalMembersCount": 7, - "membersCountOfEnrolled": 0, - "membersCountOfDraft": 7 - }, - ]; + // List> getCardArrays = [ + // { + // "client_policy_id": 392, + // "client_id": 58, + // "policy_type_id": 2, + // "is_addon": 1, + // "OpenForEnrollment": 1, + // "inception_type": 2, + // "policy_no": "GMC-MA8596745566998855885", + // "insurer_id": 1, + // "type": "GMC", + // "policy_name": "Group Medical Coverage", + // "insurer_name": "Life Insurance Corporation of India (LIC)", + // "insurer_short_name": "LIC", + // "totalMembersCount": 7, + // "membersCountOfEnrolled": 0, + // "membersCountOfDraft": 7 + // }, + // { + // "client_policy_id": 392, + // "client_id": 58, + // "policy_type_id": 2, + // "is_addon": 1, + // "OpenForEnrollment": 1, + // "inception_type": 2, + // "policy_no": "GMC-MA8596745566998855885", + // "insurer_id": 1, + // "type": "GMC", + // "policy_name": "Group Medical Coverage", + // "insurer_name": "Life Insurance Corporation of India (LIC)", + // "insurer_short_name": "LIC", + // "totalMembersCount": 7, + // "membersCountOfEnrolled": 0, + // "membersCountOfDraft": 7 + // }, + // { + // "client_policy_id": 396, + // "client_id": 58, + // "policy_type_id": 4, + // "is_addon": 2, + // "OpenForEnrollment": 1, + // "inception_type": 2, + // "policy_no": "GMC-MA8596745566998855885", + // "insurer_id": 1, + // "type": "GMC - Topup", + // "policy_name": "Group Medical Coverage Topup", + // "insurer_name": "Life Insurance Corporation of India (LIC)", + // "insurer_short_name": "LIC", + // "totalMembersCount": 7, + // "membersCountOfEnrolled": 0, + // "membersCountOfDraft": 7 + // }, + // ]; @override void initState() { @@ -162,7 +96,7 @@ class _ActivePolicieState extends State { Future _loadData() async { await getCashDepositDetails(widget.empClientBranchId, widget.empClientId, - widget.empHrId, widget.empToken); + widget.empHrId, widget.postToken); } Future getCashDepositDetails( @@ -184,7 +118,7 @@ class _ActivePolicieState extends State { } final response = await apiService.getActiveCashDepositDetailsToApi( - clintID!, clintBranchId!, hr_id, token, selectedIndex); + clintID!, clintBranchId!, hr_id, token, stausVal); // final response = await apiService.getCashDepositDetailsToApi( // clintID!, clintBranchId!, hr_id, token); @@ -196,7 +130,10 @@ class _ActivePolicieState extends State { print(response['data']); print("_PreEnrollmentState 3"); - getCardArrays = List>.from(response['data']); + setState(() { + getCardArrays = List>.from(response['data']); + }); + print('getCardArrays'); print(getCardArrays); }); @@ -205,6 +142,9 @@ class _ActivePolicieState extends State { print("getCardArrays9 - $getCardArrays"); } else { print('API request failed with status'); + setState(() { + getCardArrays = []; + }); } } catch (e) { print('Exception occurred: $e'); @@ -272,7 +212,7 @@ class _ActivePolicieState extends State { ], ), SizedBox( - height: 20, + height: 15, ), Column( mainAxisAlignment: MainAxisAlignment.center, @@ -285,20 +225,30 @@ class _ActivePolicieState extends State { height: MediaQuery.of(context).size.height * 0.4, // height: 400, - child: GridView.builder( - itemCount: getCardArrays.length, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 4, - crossAxisSpacing: 20, - mainAxisSpacing: 20, - // childAspectRatio: 2, - childAspectRatio: aspectRatio, - // childAspectRatio: 2.1, - ), - itemBuilder: (context, index) { - return buildPolicyCard(getCardArrays[index]); - }, - ), + child: getCardArrays.isEmpty + ? Center( + child: Text( + 'No data found', + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade600, + ), + ), + ) + : GridView.builder( + itemCount: getCardArrays.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + crossAxisSpacing: 20, + mainAxisSpacing: 20, + // childAspectRatio: 2, + childAspectRatio: aspectRatio, + // childAspectRatio: 2.1, + ), + itemBuilder: (context, index) { + return buildPolicyCard(getCardArrays[index]); + }, + ), ), ], ), @@ -308,6 +258,7 @@ class _ActivePolicieState extends State { } Widget buildPolicyCard(Map policy) { + print("buildPolicyCard - $policy"); final mediaQuery = MediaQuery.of(context); final devicePixelRatio = mediaQuery.devicePixelRatio; final logicalWidth = 230 / devicePixelRatio; @@ -318,7 +269,24 @@ class _ActivePolicieState extends State { return GestureDetector( onTap: () { setState(() { - print("policy"); + print("policytab - $policy"); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => hrPolicyDetails( + ClientId: policy['client_id'].toString(), // <-- from map + ClientPoliyId: policy['client_policy_id'].toString(), + HrId: widget.empClientBranchId, + Token: widget.postToken, + TokenType: 'post', + cardType: policy['type'].toString(), + cardPolicyNo: policy['policy_no'].toString(), + cardInsurer_name: policy['insurer_short_name'].toString(), + cardPolicy_name: policy['policy_name'].toString(), + cardPolicy_ExpDate: policy['policy_expiry_date'].toString(), + ), + ), + ); }); }, @@ -360,18 +328,18 @@ class _ActivePolicieState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${policy['policy_no']} " ?? '', + "${policy['type']} - ${policy['policy_no']} " ?? '', style: const TextStyle( fontFamily: "Inter", fontWeight: FontWeight.w600, - fontSize: 14, + fontSize: 12, ), ), Text( "${policy['insurer_short_name']} - ${policy['policy_name']} " ?? '', style: const TextStyle( - fontSize: 12, + fontSize: 11, color: Colors.grey, ), ), @@ -388,15 +356,16 @@ class _ActivePolicieState extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ _buildCountBox( - policy['membersCountOfDraft'].toString(), + policy['membersCountOfActive'].toString(), "Active", Color(0xFF7BD9B6), ), + // Spacer(), _buildCountBox( - policy['membersCountOfEnrolled'].toString(), + policy['membersCountOfInactive'].toString(), "Inactive", - Color(0xFFFF2020), + Color(0xFFFFA6A6), ), // Spacer(), // _buildCountBox( @@ -447,6 +416,12 @@ class _ActivePolicieState extends State { onTap: () { setState(() { selectedIndex = index + 1; + if (selectedIndex == 2) { + stausVal = 0; + } else { + stausVal = 1; + } + _loadData(); }); }, child: Container( @@ -470,8 +445,9 @@ class _ActivePolicieState extends State { ), child: Text(title, style: GoogleFonts.poppins( + fontSize: 11, color: isSelected ? Colors.white : Colors.black, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w500, ))), ); } diff --git a/lib/service/hrDashboardTabs/cd.dart b/lib/service/hrDashboardTabs/cd.dart index 47b208a..1080eb4 100644 --- a/lib/service/hrDashboardTabs/cd.dart +++ b/lib/service/hrDashboardTabs/cd.dart @@ -21,15 +21,14 @@ class CdPolicies extends StatefulWidget { {Key? key, required this.empClientId, required this.empClientBranchId, - required this.empHrId, required this.postToken - }); + required this.empHrId, + required this.postToken}); @override State createState() => _CdPolicieState(); } class _CdPolicieState extends State { - Uint8List? fileBytes; List> getCDPolicies = []; bool isLoading = false; @@ -39,7 +38,17 @@ class _CdPolicieState extends State { // List dataPolicy = []; List reversedDataPolicy = []; List> originalData = []; // Original data source - List> filteredData = []; // Filtered data source + // List> filteredData = []; // Filtered data source + List> filteredData = [ + { + "client_id": "58", + "insurer_id": "2", + "cd_ac_pk": "94", + "insurer_name": "ICICI Prudential Life Insurance Co. Ltd", + "cd_master_account_no": "CD-IOCL-887744559966", + "balance": "10000000.00" + } + ]; // Filtered data source dynamic argumentsData; dynamic policyType; dynamic policyName; @@ -69,7 +78,8 @@ class _CdPolicieState extends State { }); try { print('10'); - final response = await apiService.getCDPoliciesToApi(widget.empClientId,widget.empHrId,widget.postToken); + final response = await apiService.getCDPoliciesToApi( + widget.empClientId, widget.empHrId, widget.postToken); if (response['status'] == 'success') { setState(() { // isLoading = false; @@ -192,8 +202,10 @@ class _CdPolicieState extends State { decoration: InputDecoration( hintText: 'Search', prefixIcon: Icon(Icons.search, size: 18), - contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8), - border: InputBorder.none, // No border since Container handles it + contentPadding: + EdgeInsets.symmetric(horizontal: 12, vertical: 8), + border: InputBorder + .none, // No border since Container handles it ), controller: searchController, onChanged: search, @@ -219,9 +231,11 @@ class _CdPolicieState extends State { backgroundColor: Color(0xFFE26728), padding: EdgeInsets.all(10), // Internal padding shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), // Border radius + borderRadius: + BorderRadius.circular(10), // Border radius side: BorderSide( - color: Colors.transparent, // Optional border color + color: + Colors.transparent, // Optional border color width: 1, // Border width ), ), @@ -229,11 +243,14 @@ class _CdPolicieState extends State { ), child: Text( 'Export', - style: TextStyle(fontSize: 16,color: Color(0xFFFFFFFF),fontWeight: FontWeight.w700,letterSpacing: 1), + style: TextStyle( + fontSize: 16, + color: Color(0xFFFFFFFF), + fontWeight: FontWeight.w700, + letterSpacing: 1), ), ), ), - ], ), ), @@ -278,21 +295,24 @@ class _CdPolicieState extends State { flex: 4, child: Text( 'Insurer Name', - style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), ), ), Expanded( flex: 3, child: Text( 'CD Account number', - style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), ), ), Expanded( flex: 2, child: Text( 'Current Balance', - style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), ), ), Expanded( @@ -300,7 +320,8 @@ class _CdPolicieState extends State { child: Text( 'Action', textAlign: TextAlign.center, - style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), ), ), ], @@ -313,7 +334,7 @@ class _CdPolicieState extends State { ...filteredData.mapIndexed((index, item) { return Container( margin: const EdgeInsets.only(bottom: 8), - padding: const EdgeInsets.symmetric(vertical: 5 , horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 16), decoration: BoxDecoration( color: index % 2 == 0 ? Color(0xFFE6FAFB) : Colors.white, borderRadius: BorderRadius.circular(6), @@ -323,28 +344,22 @@ class _CdPolicieState extends State { Expanded( flex: 4, child: Text( - item['insurer_name'] ?? '-', - style: TextStyle( - color: Color(0xFF000000) - ), + item['insurer_name'] ?? '-', + style: TextStyle(color: Color(0xFF000000)), ), ), Expanded( flex: 3, child: Text( - item['cd_master_account_no'] ?? '-', - style: TextStyle( - color: Color(0xFF000000) - ), + item['cd_master_account_no'] ?? '-', + style: TextStyle(color: Color(0xFF000000)), ), ), Expanded( flex: 2, child: Text( - "₹${item['balance'] ?? '0'}", - style: TextStyle( - color: Color(0xFF000000) - ), + "₹${item['balance'] ?? '0'}", + style: TextStyle(color: Color(0xFF000000)), ), ), Expanded( @@ -365,9 +380,6 @@ class _CdPolicieState extends State { ], ); } - - - } class _DependenceDataSource0 extends DataTableSource { @@ -414,7 +426,6 @@ class _DependenceDataSource0 extends DataTableSource { int get selectedRowCount => 0; } - // Sample Data class representing each element in the array class Data { final dynamic value; @@ -423,4 +434,4 @@ class Data { final String sheet; Data(this.value, this.row, this.column, this.sheet); -} \ No newline at end of file +} diff --git a/lib/service/hrDashboardTabs/preEnrollment.dart b/lib/service/hrDashboardTabs/preEnrollment.dart index 5549baf..136052b 100644 --- a/lib/service/hrDashboardTabs/preEnrollment.dart +++ b/lib/service/hrDashboardTabs/preEnrollment.dart @@ -5,6 +5,7 @@ import 'package:flutter/services.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; +import '../../hrPolicyDetails.dart'; import '../api_service.dart'; class PreEnrollment extends StatefulWidget { @@ -166,20 +167,30 @@ class _PreEnrollmentState extends State { height: MediaQuery.of(context).size.height * 0.45, // height: 400, - child: GridView.builder( - itemCount: getCardArrays.length, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 4, - crossAxisSpacing: 20, - mainAxisSpacing: 20, - // childAspectRatio: 2, - childAspectRatio: aspectRatio, - // childAspectRatio: 2.1, - ), - itemBuilder: (context, index) { - return buildPolicyCard(getCardArrays[index]); - }, - ), + child: getCardArrays.isEmpty + ? Center( + child: Text( + 'No data found', + style: TextStyle( + fontSize: 16, + color: Colors.grey.shade600, + ), + ), + ) + : GridView.builder( + itemCount: getCardArrays.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + crossAxisSpacing: 20, + mainAxisSpacing: 20, + // childAspectRatio: 2, + childAspectRatio: aspectRatio, + // childAspectRatio: 2.1, + ), + itemBuilder: (context, index) { + return buildPolicyCard(getCardArrays[index]); + }, + ), ), ], ), @@ -197,7 +208,24 @@ class _PreEnrollmentState extends State { return GestureDetector( onTap: () { setState(() { - print("policy"); + print("policytab - $policy"); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => hrPolicyDetails( + ClientId: policy['client_id'].toString(), // <-- from map + ClientPoliyId: policy['client_policy_id'].toString(), + HrId: widget.enrollmentClientBranchId, + Token: widget.enrollToken, + TokenType: "pre", + cardType: policy['type'].toString(), + cardPolicyNo: policy['policy_no'].toString(), + cardInsurer_name: policy['insurer_short_name'].toString(), + cardPolicy_name: policy['policy_name'].toString(), + cardPolicy_ExpDate: policy['policy_expiry_date'].toString(), + ), + ), + ); }); }, @@ -239,18 +267,18 @@ class _PreEnrollmentState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "${policy['policy_no']} " ?? '', + "${policy['type']} - ${policy['policy_no']} " ?? '', style: const TextStyle( fontFamily: "Inter", fontWeight: FontWeight.w600, - fontSize: 14, + fontSize: 12, ), ), Text( "${policy['insurer_short_name']} - ${policy['policy_name']} " ?? '', style: const TextStyle( - fontSize: 12, + fontSize: 11, color: Colors.grey, ), ), diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 2ce5852..ff40429 100755 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,7 @@ import FlutterMacOS import Foundation +import file_picker import firebase_auth import firebase_core import google_sign_in_ios @@ -14,6 +15,7 @@ import smart_auth import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) diff --git a/pubspec.yaml b/pubspec.yaml index a470bf0..4eac9ff 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -94,6 +94,7 @@ flutter: - .env.production - .env.uat - .env.test + # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see