This commit is contained in:
Surendiran 2025-07-10 18:14:21 +05:30
commit eb3de92345
6 changed files with 288 additions and 187 deletions

BIN
assets/claimsData.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

View File

@ -34,6 +34,7 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
List<String> stepKeys = []; List<String> stepKeys = [];
late Map<String, dynamic> stepMap; late Map<String, dynamic> stepMap;
int _index = 4; int _index = 4;
bool isLoading = false;
@override @override
void initState() { void initState() {
@ -56,7 +57,7 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
Future<void> getClaimsHistoryDetails() async { Future<void> getClaimsHistoryDetails() async {
setState(() { setState(() {
// isLoading = true; isLoading = true;
}); });
try { try {
print('10'); print('10');
@ -68,7 +69,7 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
widget.ticket_id, widget.postToken); widget.ticket_id, widget.postToken);
if (response['status'] == 'success') { if (response['status'] == 'success') {
setState(() { setState(() {
// isLoading = false; isLoading = false;
}); });
setState(() { setState(() {
getClaimsHistoryList = [ getClaimsHistoryList = [
@ -84,7 +85,7 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
}); });
} else { } else {
setState(() { setState(() {
// isLoading = false; isLoading = false;
}); });
// ToastHelper.showWarningToast( // ToastHelper.showWarningToast(
@ -93,12 +94,12 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
} }
} catch (e) { } catch (e) {
setState(() { setState(() {
// isLoading = false; isLoading = false;
}); });
print('Exception occurred: $e'); print('Exception occurred: $e');
} finally { } finally {
setState(() { setState(() {
// _isLoading = false; isLoading = false;
}); });
} }
} }
@ -149,7 +150,7 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
border: Border.all(color: Color(0xFFBCBCBC)), border: Border.all(color: Color(0xFFBCBCBC)),
borderRadius: BorderRadius.circular(6), borderRadius: BorderRadius.circular(6),
), ),
child: Icon( child: const Icon(
Icons.close, Icons.close,
size: 25, size: 25,
color: Color(0xFFBCBCBC), color: Color(0xFFBCBCBC),
@ -165,7 +166,7 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
decoration: BoxDecoration( decoration: BoxDecoration(
color: Color(0xFFFFFFFF), // White background color: Color(0xFFFFFFFF), // White background
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
boxShadow: [ boxShadow: const [
BoxShadow( BoxShadow(
color: Color(0xFFEBEBEB), // Shadow color color: Color(0xFFEBEBEB), // Shadow color
blurRadius: 14, // How soft the shadow is blurRadius: 14, // How soft the shadow is
@ -290,25 +291,63 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
// ); // );
// }), // }),
// ) // )
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: List.generate(stepKeys.length, (index) {
String stepTitleKey = stepKeys[index];
Map<String, dynamic> stepData = stepMap[stepTitleKey];
print('stepTitleKey'); isLoading
print(stepTitleKey); ? Container(
print('stepData'); // color: Color(0x98FFFCE5), // Semi-transparent background
print(stepData); child: Center(
child: // Your GIF loader widget
Image.asset(
height: 60,
width: 60,
'assets/nhance-loader.gif'), // Adjust path to your GIF loader
),
)
: Container(
child: getClaimsHistoryList.isNotEmpty
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: List.generate(stepKeys.length, (index) {
String stepTitleKey = stepKeys[index];
Map<String, dynamic> stepData =
stepMap[stepTitleKey];
return _buildStep( print('stepTitleKey');
stepNumber: index + 1, print(stepTitleKey);
title: _getStepTitleFromApi(stepTitleKey, stepData), print('stepData');
content: _getStepContentFromApi(stepData), print(stepData);
isLast: index == stepKeys.length - 1,
); return _buildStep(
}), stepNumber: index + 1,
) title: _getStepTitleFromApi(
stepTitleKey, stepData),
content: _getStepContentFromApi(stepData),
isLast: index == stepKeys.length - 1,
);
}),
)
: Container(
height: MediaQuery.of(context).size.height * 0.4,
// color: Colors.red,
child: Center(
child: Column(
children: [
Image.asset(
'assets/claimsData.png', // Replace 'default_image.png' with your default image asset path
width: 200,
height: 200,
fit: BoxFit.cover,
),
Text(
'No Available Claims',
style: TextStyle(
fontWeight: FontWeight.w500,
fontSize: 15),
),
],
)),
),
)
], ],
), ),
), ),
@ -354,9 +393,9 @@ class _ClaimHistoryPopupState extends State<ClaimHistoryPopup> {
// Dotted line below circle (except for last step) // Dotted line below circle (except for last step)
if (!isLast) if (!isLast)
Container( Container(
height: 120, // increase to extend line height: 70, // increase to extend line
width: 2, width: 2,
// margin: EdgeInsets.only(top: 4, bottom: 4), margin: EdgeInsets.only(top: 4, bottom: 4),
child: CustomPaint( child: CustomPaint(
painter: DottedLinePainter(), painter: DottedLinePainter(),
), ),

View File

@ -169,14 +169,14 @@ class _hrDashboardState extends State<hrDashboard>
print('allowed_modules'); print('allowed_modules');
String? modulesString = prefs.getString('empAllowed_modules'); String? modulesString = prefs.getString('empAllowed_modules');
String? enrollmodulesString = // String? enrollmodulesString =
prefs.getString('enrollmentAllowed_modules'); // prefs.getString('enrollmentAllowed_modules');
if (modulesString != null || enrollmodulesString != null) { if (modulesString != null) {
empAllowed_modules = jsonDecode(modulesString!); empAllowed_modules = jsonDecode(modulesString);
enrollmentAllowed_modules = jsonDecode(enrollmodulesString!); // enrollmentAllowed_modules = jsonDecode(enrollmodulesString!);
print("empAllowed_modules - $empAllowed_modules"); // [2, 3, 4] print("empAllowed_modules - $empAllowed_modules"); // [2, 3, 4]
print( // print(
"enrollmentAllowed_modules - $enrollmentAllowed_modules"); // [2, 3, 4] // "enrollmentAllowed_modules - $enrollmentAllowed_modules"); // [2, 3, 4]
if (empAllowed_modules.contains(2)) { if (empAllowed_modules.contains(2)) {
print("visibleTabs.length2"); print("visibleTabs.length2");
@ -215,7 +215,7 @@ class _hrDashboardState extends State<hrDashboard>
if (empAllowed_modules.contains(4)) { if (empAllowed_modules.contains(4)) {
tabData.add({ tabData.add({
'icon': Icons.receipt_long, 'icon': Icons.receipt_long,
'label': 'Claims', 'label': 'Claims', // Label Name Integrated with code (dont change)
}); });
// tabViews.add(ClaimsPolicies( // tabViews.add(ClaimsPolicies(
// empClientId: empClientId, // empClientId: empClientId,
@ -246,9 +246,15 @@ class _hrDashboardState extends State<hrDashboard>
print('111'); print('111');
if (widget.selectedIndex == 3) { if (widget.selectedIndex == 3) {
print("Process1"); print("Process1");
_tabController.index = 3; print("ProcessTAb - $tabData");
final claimsIndex = tabData.indexWhere((tab) => tab['label'] == 'Claims');
print('Claims tab index: $claimsIndex');
_tabController.index = claimsIndex;
// _tabController.index = 3;
setState(() { setState(() {
selectedIndex = 3; selectedIndex = claimsIndex;
// selectedIndex = 3;
isHrcode = 1; isHrcode = 1;
empCodeFromHrPolcy = widget.empCodeFromHrPolicy; empCodeFromHrPolcy = widget.empCodeFromHrPolicy;
}); });
@ -610,9 +616,23 @@ class _hrDashboardState extends State<hrDashboard>
], ],
), ),
) )
: const Center( : Container(
child: Text("No Data Available"), height: MediaQuery.of(context).size.height * 0.6,
// color: Colors.white,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'assets/claimsData.png', // Replace 'default_image.png' with your default image asset path
width: 300,
height: 300,
fit: BoxFit.cover,
),
const Text("No Data Available"),
],
),
), ),
SizedBox(height: 16), SizedBox(height: 16),
// Expanded TabBarView // Expanded TabBarView
Expanded( Expanded(
@ -733,6 +753,7 @@ class CustomTab extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print("isSelected - $isSelected");
return Tab( return Tab(
child: Container( child: Container(
// margin: const EdgeInsets.symmetric(horizontal: 6), // margin: const EdgeInsets.symmetric(horizontal: 6),

View File

@ -61,6 +61,7 @@ class _HrPolicyDetailsState extends State<hrPolicyDetails>
with TickerProviderStateMixin { with TickerProviderStateMixin {
Uint8List? fileBytes; Uint8List? fileBytes;
String empCodeFromHrPolcy = ''; String empCodeFromHrPolcy = '';
bool hasAnyEcardLink = false;
late String _token; late String _token;
List<Map<String, dynamic>> getEmpDependenceByClintId = []; List<Map<String, dynamic>> getEmpDependenceByClintId = [];
List<Map<String, dynamic>> getCDPolicies = []; List<Map<String, dynamic>> getCDPolicies = [];
@ -79,6 +80,9 @@ class _HrPolicyDetailsState extends State<hrPolicyDetails>
dynamic clientPolicyId; dynamic clientPolicyId;
dynamic clientId; dynamic clientId;
dynamic empRefId; dynamic empRefId;
String? modulesString;
final storeModuleId = 4;
bool hasModule = false;
int inceptionType = 0; int inceptionType = 0;
TextEditingController searchController = TextEditingController(); TextEditingController searchController = TextEditingController();
late ApiService apiService; late ApiService apiService;
@ -99,6 +103,8 @@ class _HrPolicyDetailsState extends State<hrPolicyDetails>
apiService = ApiService(context); // Initialize ApiService here apiService = ApiService(context); // Initialize ApiService here
getCDPoliciesDetails(); getCDPoliciesDetails();
print("_PreEnrollmentState 1"); print("_PreEnrollmentState 1");
print('allowed_modules');
} }
Future<void> getCDPoliciesDetails() async { Future<void> getCDPoliciesDetails() async {
@ -109,6 +115,24 @@ class _HrPolicyDetailsState extends State<hrPolicyDetails>
try { try {
print('10'); print('10');
final SharedPreferences prefs = await SharedPreferences.getInstance();
modulesString = prefs.getString('empAllowed_modules');
// modulesString = "[2,3]";
print("empmodulesString - $modulesString");
if (modulesString != null && modulesString!.trim().isNotEmpty) {
final List<int>? moduleList = modulesString
?.replaceAll('[', '')
.replaceAll(']', '')
.split(',')
.map((e) => int.tryParse(e.trim()) ?? -1) // convert to int safely
.where((id) => id != -1) // filter out invalid
.toList();
hasModule = moduleList!.contains(storeModuleId);
}
final response = widget.TokenType == "post" final response = widget.TokenType == "post"
? await apiService.getEmployeeAndDependenceToApi(widget.ClientId, ? await apiService.getEmployeeAndDependenceToApi(widget.ClientId,
widget.ClientPoliyId, widget.clientBranchId, widget.Token) widget.ClientPoliyId, widget.clientBranchId, widget.Token)
@ -397,63 +421,65 @@ class _HrPolicyDetailsState extends State<hrPolicyDetails>
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
ElevatedButton( if (widget.TokenType != "post")
onPressed: () { ElevatedButton(
Navigator.push( onPressed: () {
context, Navigator.push(
MaterialPageRoute( context,
builder: (context) => excelVerify( MaterialPageRoute(
ClientId: builder: (context) => excelVerify(
widget.ClientId, // <-- from map ClientId:
ClientPoliyId: widget.ClientPoliyId, widget.ClientId, // <-- from map
clientBranchId: widget.clientBranchId, ClientPoliyId: widget.ClientPoliyId,
Token: widget.Token, clientBranchId:
TokenType: widget.TokenType, widget.clientBranchId,
cardType: widget.cardType, Token: widget.Token,
cardPolicyNo: widget.cardPolicyNo, TokenType: widget.TokenType,
cardInsurer_name: cardType: widget.cardType,
widget.cardInsurer_name, cardPolicyNo: widget.cardPolicyNo,
cardPolicy_name: cardInsurer_name:
widget.cardPolicy_name, widget.cardInsurer_name,
cardPolicy_ExpDate: cardPolicy_name:
widget.cardPolicy_ExpDate, widget.cardPolicy_name,
cardPolicy_ExpDate:
widget.cardPolicy_ExpDate,
// Token: widget.Token, // Token: widget.Token,
// ClientId: widget.ClientId, // ClientId: widget.ClientId,
// ClientPolicyId : widget.ClientPoliyId, // ClientPolicyId : widget.ClientPoliyId,
// PolicyName: widget.cardPolicy_name, // PolicyName: widget.cardPolicy_name,
// PolicyNo: widget.cardPolicyNo, // PolicyNo: widget.cardPolicyNo,
// ClientBranchId: widget.HrId, // ClientBranchId: widget.HrId,
// PolicyType: widget.cardType, // PolicyType: widget.cardType,
),
),
);
// 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,
// exportToCsv(filteredData); ),
}, child: Text(
style: ElevatedButton.styleFrom( 'Import',
backgroundColor: Color(0xFFE26728), style: GoogleFonts.poppins(
padding: fontSize: 12,
EdgeInsets.all(10), // Internal padding color: Color(0xFFFFFFFF),
shape: RoundedRectangleBorder( fontWeight: FontWeight.w500,
borderRadius: BorderRadius.circular( letterSpacing: 1),
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( SizedBox(
width: 10, width: 10,
), ),
@ -534,6 +560,18 @@ class _HrPolicyDetailsState extends State<hrPolicyDetails>
} }
Widget _buildCDDataTable(BuildContext context) { Widget _buildCDDataTable(BuildContext context) {
if (_paginatedData.isNotEmpty) {
hasAnyEcardLink = _paginatedData.any(
(item) => item['ecard_download_link'] != null,
);
if (widget.TokenType == "post" && hasModule) {
print("paginatTtt - $_paginatedData");
print("📥 Any e-card link present: $hasAnyEcardLink");
}
}
if (filteredData.isEmpty) { if (filteredData.isEmpty) {
return SizedBox( return SizedBox(
// height: 50, // height: 50,
@ -641,17 +679,18 @@ class _HrPolicyDetailsState extends State<hrPolicyDetails>
), ),
), ),
), ),
Expanded( if (widget.TokenType != "pre" && (hasAnyEcardLink || hasModule))
flex: 3, Expanded(
child: Text( flex: 3,
'Action', child: Text(
textAlign: TextAlign.center, 'Action',
style: GoogleFonts.poppins( textAlign: TextAlign.center,
color: Colors.black, style: GoogleFonts.poppins(
fontWeight: FontWeight.w600, color: Colors.black,
fontWeight: FontWeight.w600,
),
), ),
), ),
),
], ],
), ),
), ),
@ -794,72 +833,77 @@ class _HrPolicyDetailsState extends State<hrPolicyDetails>
), ),
), ),
), ),
Expanded( if (widget.TokenType != "pre" &&
flex: 3, (hasAnyEcardLink || hasModule))
child: Row( Expanded(
mainAxisAlignment: MainAxisAlignment.center, flex: 3,
children: [ child: Row(
if (item['ecard_download_link'] != null) mainAxisAlignment: MainAxisAlignment.center,
GestureDetector( children: [
onTap: () { if (item['ecard_download_link'] != null)
_launchURL(item['ecard_download_link']); GestureDetector(
}, onTap: () {
child: Container( _launchURL(item['ecard_download_link']);
height: 35, },
width: 35, child: Container(
decoration: BoxDecoration( height: 35,
color: Color(0xFFE6F5F6), width: 35,
borderRadius: BorderRadius.circular(8), decoration: BoxDecoration(
), color: Color(0xFFE6F5F6),
child: Padding( borderRadius: BorderRadius.circular(8),
padding: EdgeInsets.all(
6), // You can adjust this value
child: Image.asset(
'assets/credit_card.png',
fit: BoxFit.contain,
), ),
), child: Padding(
), padding: EdgeInsets.all(
), 6), // You can adjust this value
SizedBox( child: Image.asset(
width: 10, 'assets/credit_card.png',
), fit: BoxFit.contain,
GestureDetector(
onTap: () {
setState(() {
print("policytabdata - ${item['emp_code']!}");
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => hrDashboard(
selectedIndex: 3,
empCodeFromHrPolicy: item['emp_code']!,
isHrcode: 1,
), ),
), ),
);
});
},
child: Container(
height: 35,
width: 35,
decoration: BoxDecoration(
color: Color(0xFFE6F5F6),
borderRadius: BorderRadius.circular(8),
),
child: Padding(
padding: EdgeInsets.all(
6), // You can adjust this value
child: Image.asset(
'assets/claim.png',
fit: BoxFit.contain,
), ),
), ),
SizedBox(
width: 10,
), ),
), if (widget.TokenType == "post" && hasModule)
], GestureDetector(
onTap: () {
setState(() {
print(
"policytabdata - ${item['emp_code']!}");
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => hrDashboard(
selectedIndex: 3,
empCodeFromHrPolicy:
item['emp_code']!,
isHrcode: 1,
),
),
);
});
},
child: Container(
height: 35,
width: 35,
decoration: BoxDecoration(
color: Color(0xFFE6F5F6),
borderRadius: BorderRadius.circular(8),
),
child: Padding(
padding: EdgeInsets.all(
6), // You can adjust this value
child: Image.asset(
'assets/claim.png',
fit: BoxFit.contain,
),
),
),
),
],
),
), ),
),
], ],
), ),
); );

View File

@ -349,14 +349,18 @@ class _ActivePolicieState extends State<ActivePolicies> {
fontSize: 12, fontSize: 12,
), ),
), ),
Text( policy['insurer_name'] != ''
"${policy['insurer_short_name']} - ${policy['policy_name']} " ?? ? Text(
'', // "${policy['insurer_short_name']} - ${policy['policy_name']} " ??
style: const TextStyle( // '',
fontSize: 11,
color: Colors.grey, policy['insurer_name'] ?? "",
), style: const TextStyle(
), fontSize: 11,
color: Colors.grey,
),
)
: SizedBox.shrink(),
], ],
), ),
], ],

View File

@ -92,10 +92,10 @@ class _PreEnrollmentState extends State<PreEnrollment> {
print("hr_id -$hr_id"); print("hr_id -$hr_id");
print("token -$token"); print("token -$token");
isLoading = true; // isLoading = true;
// setState(() { setState(() {
// _isLoading = true; isLoading = true;
// }); });
try { try {
if (clintBranchId == null || clintID == null) { if (clintBranchId == null || clintID == null) {
return; return;
@ -159,7 +159,7 @@ class _PreEnrollmentState extends State<PreEnrollment> {
), ),
// //
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
isLoading isLoading
? Container( ? Container(
@ -203,12 +203,12 @@ class _PreEnrollmentState extends State<PreEnrollment> {
: GridView.builder( : GridView.builder(
itemCount: getCardArrays.length, itemCount: getCardArrays.length,
gridDelegate: gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount( const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4, crossAxisCount: 4,
crossAxisSpacing: 20, crossAxisSpacing: 20,
mainAxisSpacing: 20, mainAxisSpacing: 20,
// childAspectRatio: 2, childAspectRatio: 2.6,
childAspectRatio: aspectRatio, // childAspectRatio: aspectRatio,
// childAspectRatio: 2.1, // childAspectRatio: 2.1,
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
@ -225,7 +225,7 @@ class _PreEnrollmentState extends State<PreEnrollment> {
final mediaQuery = MediaQuery.of(context); final mediaQuery = MediaQuery.of(context);
final devicePixelRatio = mediaQuery.devicePixelRatio; final devicePixelRatio = mediaQuery.devicePixelRatio;
final logicalWidth = 230 / devicePixelRatio; final logicalWidth = 230 / devicePixelRatio;
final logicalHeight = 115 / devicePixelRatio; final logicalHeight = 189 / devicePixelRatio;
print("logicalWidth - $logicalWidth"); print("logicalWidth - $logicalWidth");
print("logicalHeight - $logicalHeight"); print("logicalHeight - $logicalHeight");
@ -280,10 +280,10 @@ class _PreEnrollmentState extends State<PreEnrollment> {
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Container( Container(
height: MediaQuery.of(context).size.height * 0.07, height: MediaQuery.of(context).size.height * 0.03,
// color: Colors.green.shade100, // color: Colors.green.shade100,
child: Row( child: Row(
children: [ children: [
@ -298,22 +298,15 @@ class _PreEnrollmentState extends State<PreEnrollment> {
fontSize: 12, fontSize: 12,
), ),
), ),
Text(
// "${policy['insurer_short_name']} - ${policy['policy_name']} " ??
// '',
policy['insurer_name'] ?? "",
style: const TextStyle(
fontSize: 11,
color: Colors.grey,
),
),
], ],
), ),
], ],
), ),
), ),
// Spacer(), // Spacer(),
SizedBox(
height: 5,
),
Container( Container(
// color: Colors.pink.shade50, // color: Colors.pink.shade50,
height: MediaQuery.of(context).size.height * 0.09, height: MediaQuery.of(context).size.height * 0.09,