Localization of yojna schemes done

This commit is contained in:
2026-03-11 18:13:04 +05:30
parent eb81269083
commit 49cac5f469
9 changed files with 303 additions and 161 deletions

View File

@@ -46,9 +46,10 @@ class _APYScreenState extends State<APYScreen> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('APY registration'),
title: Text(l10n.apyRegistration),
centerTitle: false,
),
body: SingleChildScrollView(
@@ -61,7 +62,7 @@ class _APYScreenState extends State<APYScreen> {
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
"Atal Pension Yojana (APY) is a periodic contribution-based pension scheme for citizens of India.",
l10n.apyDescription,
style: Theme.of(context).textTheme.titleMedium,
),
),
@@ -77,7 +78,7 @@ class _APYScreenState extends State<APYScreen> {
DropdownButtonFormField<User>(
value: _selectedAccount,
decoration: InputDecoration(
labelText: AppLocalizations.of(context).accountNumber,
labelText: l10n.accountNumber,
border: const OutlineInputBorder(),
contentPadding: const EdgeInsets.symmetric(
vertical: 20, horizontal: 12),
@@ -95,8 +96,7 @@ class _APYScreenState extends State<APYScreen> {
},
validator: (value) {
if (value == null) {
return AppLocalizations.of(context)
.accountNumberRequired;
return l10n.accountNumberRequired;
}
return null;
},

View File

@@ -20,9 +20,10 @@ class GovSchemeScreen extends StatefulWidget {
class _GovSchemeScreenState extends State<GovSchemeScreen> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('Government Schemes'),
title: Text(l10n.governmentSchemes),
),
body: Stack(
children: [
@@ -34,8 +35,8 @@ class _GovSchemeScreenState extends State<GovSchemeScreen> {
Expanded(
child: GovSchemeTile(
logoText: "PMJJBY/PMSBY",
label: "Pradhan Mantri Yojana",
subtitle: "Enroll in Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY) and Pradhan Mantri Suraksha Bima Yojana (PMSBY) insurance schemes",
label: l10n.pradhanMantriYojana,
subtitle: l10n.enrollPMJJBYPMSBY,
onTap: () {
Navigator.push(
context,
@@ -52,8 +53,8 @@ class _GovSchemeScreenState extends State<GovSchemeScreen> {
Expanded(
child: GovSchemeTile(
logoText: "APY",
label: "Register for Atal Pension Yojana",
subtitle: "Secure your future with Atal Pension Yojana (APY) retirement scheme. Register in a few steps.",
label: l10n.registerForAtalPensionYojana,
subtitle: l10n.secureYourFutureAPY,
onTap: () {
Navigator.push(
context,

View File

@@ -26,9 +26,9 @@ class _PMMainScreenState extends State<PMMainScreen> {
List<User> _filteredUsers = [];
String? _selectedScheme;
final List<String> _schemes = [
'Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY)',
'Pradhan Mantri Suraksha Bima Yojana (PMSBY)',
List<String> _getSchemes(AppLocalizations l10n) => [
l10n.pmjjbyFull,
l10n.pmsbyFull,
];
@override
@@ -61,33 +61,34 @@ class _PMMainScreenState extends State<PMMainScreen> {
}
Future<void> _handleCreate() async {
final l10n = AppLocalizations.of(context);
if (_selectedAccount == null) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Please select account number')),
SnackBar(content: Text(l10n.pleaseSelectAccountNumber)),
);
return;
}
if (_selectedScheme == null) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Please select a scheme first')),
SnackBar(content: Text(l10n.pleaseSelectSchemeFirst)),
);
return;
}
final String schemeCode = _selectedScheme!.contains('PMJJBY') ? '02' : '01';
final String schemeCode = (_selectedScheme == l10n.pmjjbyFull) ? '02' : '01';
// Show loading
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
SnackBar(
content: Row(
children: [
CircularProgressIndicator(),
SizedBox(width: 16),
Text('Fetching details...'),
const CircularProgressIndicator(),
const SizedBox(width: 16),
Text(l10n.fetchingDetails),
],
),
duration: Duration(seconds: 2),
duration: const Duration(seconds: 2),
),
);
@@ -111,40 +112,41 @@ class _PMMainScreenState extends State<PMMainScreen> {
context,
MaterialPageRoute(
builder: (context) {
if (_selectedScheme!.contains('PMJJBY')) {
return PMJJBYScreen(initialData: data);
if (_selectedScheme == l10n.pmjjbyFull) {
return PMJJBYScreen(initialData: data!);
} else {
return PMSBYScreen(initialData: data);
return PMSBYScreen(initialData: data!);
}
},
),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Failed to fetch details or no data found.')),
SnackBar(content: Text(l10n.failedToFetchDetails)),
);
}
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error: ${e.toString()}')),
SnackBar(content: Text(l10n.genericError(e.toString()))),
);
}
}
}
void _handleEnquiry() {
final l10n = AppLocalizations.of(context);
if (_selectedAccount == null) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Please select account number')),
SnackBar(content: Text(l10n.pleaseSelectAccountNumber)),
);
return;
}
if (_selectedScheme == null) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Please select a scheme first')),
SnackBar(content: Text(l10n.pleaseSelectSchemeFirst)),
);
return;
}
@@ -153,7 +155,7 @@ class _PMMainScreenState extends State<PMMainScreen> {
context,
MaterialPageRoute(
builder: (context) {
if (_selectedScheme!.contains('PMJJBY')) {
if (_selectedScheme == l10n.pmjjbyFull) {
return PMJJBYEnquiryScreen(cifNumber: _selectedAccount!.cifNumber);
} else {
return PMSBYEnquiryScreen(cifNumber: _selectedAccount!.cifNumber);
@@ -165,9 +167,22 @@ class _PMMainScreenState extends State<PMMainScreen> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
final schemes = _getSchemes(l10n);
// Ensure _selectedScheme is valid if it was set in a different language
if (_selectedScheme != null && !schemes.contains(_selectedScheme)) {
// Try to find the corresponding scheme in the new language
// This is a bit tricky, but since we only have two:
// If it doesn't match, it might be from the other language.
// For simplicity, we can just reset it or try to guess.
// Better to use non-localized values for the state, but let's just reset for now if it doesn't match
_selectedScheme = null;
}
return Scaffold(
appBar: AppBar(
title: const Text('Pradhan Mantri Yojana'),
title: Text(l10n.pradhanMantriYojana),
centerTitle: false,
),
body: SingleChildScrollView(
@@ -180,7 +195,7 @@ class _PMMainScreenState extends State<PMMainScreen> {
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
"Create and Enquire about your Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY) and Pradhan Mantri Suraksha Bima Yojana(PMSBY) schemes.",
l10n.pmjjbyPmsbyDescription,
style: Theme.of(context).textTheme.titleMedium,
),
),
@@ -196,7 +211,7 @@ class _PMMainScreenState extends State<PMMainScreen> {
DropdownButtonFormField<User>(
value: _selectedAccount,
decoration: InputDecoration(
labelText: AppLocalizations.of(context).accountNumber,
labelText: l10n.accountNumber,
border: const OutlineInputBorder(),
contentPadding: const EdgeInsets.symmetric(
vertical: 20, horizontal: 12),
@@ -214,8 +229,7 @@ class _PMMainScreenState extends State<PMMainScreen> {
},
validator: (value) {
if (value == null) {
return AppLocalizations.of(context)
.accountNumberRequired;
return l10n.accountNumberRequired;
}
return null;
},
@@ -226,14 +240,14 @@ class _PMMainScreenState extends State<PMMainScreen> {
isExpanded: true,
isDense: false,
itemHeight: null,
decoration: const InputDecoration(
labelText: 'Select Scheme',
border: OutlineInputBorder(),
decoration: InputDecoration(
labelText: l10n.selectScheme,
border: const OutlineInputBorder(),
contentPadding:
EdgeInsets.symmetric(vertical: 12, horizontal: 12),
const EdgeInsets.symmetric(vertical: 12, horizontal: 12),
),
selectedItemBuilder: (BuildContext context) {
return _schemes.map((String scheme) {
return schemes.map((String scheme) {
return Container(
alignment: Alignment.centerLeft,
child: Text(
@@ -246,7 +260,7 @@ class _PMMainScreenState extends State<PMMainScreen> {
);
}).toList();
},
items: _schemes.map((String scheme) {
items: schemes.map((String scheme) {
return DropdownMenuItem<String>(
value: scheme,
child: Padding(
@@ -287,9 +301,9 @@ class _PMMainScreenState extends State<PMMainScreen> {
borderRadius: BorderRadius.circular(8),
),
),
child: const Text(
"Create",
style: TextStyle(fontWeight: FontWeight.bold),
child: Text(
l10n.create,
style: const TextStyle(fontWeight: FontWeight.bold),
),
),
),
@@ -309,7 +323,7 @@ class _PMMainScreenState extends State<PMMainScreen> {
),
),
child: Text(
AppLocalizations.of(context).enquiry,
l10n.enquiry,
style: const TextStyle(fontWeight: FontWeight.bold),
),
),

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:kmobile/api/services/yojna_service.dart';
import 'package:kmobile/di/injection.dart';
import 'package:kmobile/l10n/app_localizations.dart';
class PMJJBYEnquiryScreen extends StatefulWidget {
final String? cifNumber;
@@ -35,6 +36,7 @@ class _PMJJBYEnquiryScreenState extends State<PMJJBYEnquiryScreen> {
}
Future<void> _fetchEnquiryData() async {
final l10n = AppLocalizations.of(context);
if (_selectedFinancialYear == null || widget.cifNumber == null) return;
setState(() {
@@ -56,19 +58,19 @@ class _PMJJBYEnquiryScreenState extends State<PMJJBYEnquiryScreen> {
setState(() {
if (response is Map<String, dynamic>) {
if (response['status'] == 'FAILED') {
_errorMessage = response['message'] ?? 'No record found';
_errorMessage = response['message'] ?? l10n.noRecordFound;
} else {
_enquiryData = response;
}
} else if (response is List && response.isNotEmpty) {
_enquiryData = response[0] as Map<String, dynamic>;
} else {
_errorMessage = 'No data found for the selected year.';
_errorMessage = l10n.noDataFoundYear;
}
});
} catch (e) {
setState(() {
_errorMessage = 'Error: ${e.toString()}';
_errorMessage = l10n.genericError(e.toString());
});
} finally {
setState(() {
@@ -79,9 +81,10 @@ class _PMJJBYEnquiryScreenState extends State<PMJJBYEnquiryScreen> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('PMJJBY details'),
title: Text(l10n.pmjjbyDetails),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
@@ -100,9 +103,9 @@ class _PMJJBYEnquiryScreenState extends State<PMJJBYEnquiryScreen> {
ListTile(
contentPadding: EdgeInsets.zero,
leading: const Icon(Icons.person, color: Colors.blue),
title: const Text('CIF Number'),
title: Text(l10n.cifNumber),
subtitle: Text(
widget.cifNumber ?? 'N/A',
widget.cifNumber ?? l10n.notApplicable,
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
@@ -112,11 +115,11 @@ class _PMJJBYEnquiryScreenState extends State<PMJJBYEnquiryScreen> {
const SizedBox(height: 16),
DropdownButtonFormField<String>(
value: _selectedFinancialYear,
decoration: const InputDecoration(
labelText: 'Select Financial Year',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.calendar_today),
contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: InputDecoration(
labelText: l10n.selectFinancialYear,
border: const OutlineInputBorder(),
prefixIcon: const Icon(Icons.calendar_today),
contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
),
items: _financialYears.map((String year) {
return DropdownMenuItem<String>(
@@ -167,20 +170,20 @@ class _PMJJBYEnquiryScreenState extends State<PMJJBYEnquiryScreen> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Scheme Details',
l10n.schemeDetails,
style: Theme.of(context).textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.primary,
),
),
const Divider(),
_buildDetailRow('Customer Name', _enquiryData!['customername']),
_buildDetailRow('Policy Number', _enquiryData!['policynumber']),
_buildDetailRow('Account Number', _enquiryData!['accountno']),
_buildDetailRow('Premium Amount', _enquiryData!['preimiumamount']),
_buildDetailRow('Nominee Name', _enquiryData!['nomineename']),
_buildDetailRow('Transaction Date', _enquiryData!['transactiondate']),
_buildDetailRow('Journal No', _enquiryData!['journalno']),
_buildDetailRow(l10n.customerName, _enquiryData!['customername']),
_buildDetailRow(l10n.policyNumber, _enquiryData!['policynumber']),
_buildDetailRow(l10n.accountNumber, _enquiryData!['accountno']),
_buildDetailRow(l10n.premiumAmount, _enquiryData!['preimiumamount']),
_buildDetailRow(l10n.nomineeName, _enquiryData!['nomineename']),
_buildDetailRow(l10n.date, _enquiryData!['transactiondate']),
_buildDetailRow(l10n.journalNo, _enquiryData!['journalno']),
],
),
),
@@ -203,7 +206,7 @@ class _PMJJBYEnquiryScreenState extends State<PMJJBYEnquiryScreen> {
),
Flexible(
child: Text(
value?.toString() ?? 'N/A',
value?.toString() ?? AppLocalizations.of(context).notApplicable,
style: const TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.end,
),

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:kmobile/api/services/yojna_service.dart';
import 'package:kmobile/di/injection.dart';
import 'package:kmobile/l10n/app_localizations.dart';
class PMJJBYScreen extends StatefulWidget {
final Map<String, dynamic>? initialData;
@@ -141,6 +142,7 @@ class _PMJJBYScreenState extends State<PMJJBYScreen> {
}
Future<void> _handleRegister() async {
final l10n = AppLocalizations.of(context);
// Show loading spinner
showDialog(
context: context,
@@ -179,7 +181,7 @@ class _PMJJBYScreenState extends State<PMJJBYScreen> {
);
String x = response.toString();
if(x.contains('RECORD ALREADY EXISTS')){
x= "A record already exists for this request. Your submission has been registered previously.";
x= l10n.recordAlreadyExists;
}
if (mounted) {
@@ -190,14 +192,14 @@ class _PMJJBYScreenState extends State<PMJJBYScreen> {
context: context,
barrierDismissible: false,
builder: (context) => AlertDialog(
title: const Text('Response'),
title: Text(l10n.response),
content: SingleChildScrollView(child: Text(x)),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).popUntil((route) => route.isFirst);
},
child: const Text('Close'),
child: Text(l10n.close),
),
],
),
@@ -207,7 +209,7 @@ class _PMJJBYScreenState extends State<PMJJBYScreen> {
if (mounted) {
Navigator.pop(context); // Close loading spinner
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error: ${e.toString()}')),
SnackBar(content: Text(l10n.genericError(e.toString()))),
);
}
}
@@ -215,9 +217,10 @@ class _PMJJBYScreenState extends State<PMJJBYScreen> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('PMJJBY Registration'),
title: Text(l10n.pmjjbyRegistration),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
@@ -226,38 +229,38 @@ class _PMJJBYScreenState extends State<PMJJBYScreen> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_buildTextField(_nameController, 'Customer Name', readOnly: _isFetched('customername')),
_buildTextField(_customerNoController, 'Customer No', readOnly: _isFetched('customerno')),
_buildTextField(_accountNoController, 'Account No', keyboardType: TextInputType.number, readOnly: _isFetched('accountno')),
_buildTextField(_balanceController, 'Available Balance', keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')),
_buildTextField(_aadhaarController, 'Aadhaar No', keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')),
_buildTextField(_dobController, 'Customer DOB (DD/MM/YYYY)', readOnly: _isFetched('customerdob')),
_buildTextField(_genderController, 'Gender', readOnly: _isFetched('gender')),
_buildTextField(_marriedController, 'Married (Yes/No)', readOnly: _isFetched('married')),
_buildTextField(_mobileController, 'Mobile No', keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')),
_buildTextField(_nameController, l10n.customerName, readOnly: _isFetched('customername')),
_buildTextField(_customerNoController, l10n.customerNo, readOnly: _isFetched('customerno')),
_buildTextField(_accountNoController, l10n.accountNumber, keyboardType: TextInputType.number, readOnly: _isFetched('accountno')),
_buildTextField(_balanceController, l10n.availableBalance, keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')),
_buildTextField(_aadhaarController, l10n.aadhaarNo, keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')),
_buildTextField(_dobController, l10n.customerDobFormat, readOnly: _isFetched('customerdob')),
_buildTextField(_genderController, l10n.gender, readOnly: _isFetched('gender')),
_buildTextField(_marriedController, l10n.marriedYesNo, readOnly: _isFetched('married')),
_buildTextField(_mobileController, l10n.mobileNumber, keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')),
_buildTextField(_emailController, 'Email ID', keyboardType: TextInputType.emailAddress, readOnly: _isFetched('emailid')),
_buildTextField(_panController, 'PAN', readOnly: _isFetched('pan')),
_buildTextField(_ifscController, 'IFSC Code', readOnly: _isFetched('ifsccode')),
_buildTextField(_acctOpeningDateController, 'Date of Acct Opening', readOnly: _isFetched('dateofacctopening')),
_buildTextField(_pincodeController, 'Pincode', keyboardType: TextInputType.number, readOnly: _isFetched('pincode')),
_buildTextField(_stateController, 'State', readOnly: _isFetched('state')),
_buildTextField(_countryController, 'Country', readOnly: _isFetched('country')),
_buildDropdownField(_ruralCategoryController, 'Rural Category', _ruralOptions, readOnly: _isFetched('ruralcategory')),
_buildTextField(_panController, l10n.pan, readOnly: _isFetched('pan')),
_buildTextField(_ifscController, l10n.ifscCode, readOnly: _isFetched('ifsccode')),
_buildTextField(_acctOpeningDateController, l10n.dateOfAcctOpening, readOnly: _isFetched('dateofacctopening')),
_buildTextField(_pincodeController, l10n.pincode, keyboardType: TextInputType.number, readOnly: _isFetched('pincode')),
_buildTextField(_stateController, l10n.state, readOnly: _isFetched('state')),
_buildTextField(_countryController, l10n.country, readOnly: _isFetched('country')),
_buildDropdownField(_ruralCategoryController, l10n.ruralCategory, _ruralOptions, readOnly: _isFetched('ruralcategory')),
const Divider(height: 32),
const Text('Policy Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
Text(l10n.policyDetails, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 16),
_buildTextField(_policyNumberController, 'Policy Number', readOnly: _isFetched('policynumber')),
_buildTextField(_premiumAmountController, 'Premium Amount', keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')),
_buildTextField(_financialYearController, 'Financial Year', readOnly: _isFetched('financialyear')),
_buildDropdownField(_healthStatusController, 'Health Status', _healthStatusOptions),
_buildTextField(_collectionChannelController, 'Collection Channel'),
_buildTextField(_policyNumberController, l10n.policyNumber, readOnly: _isFetched('policynumber')),
_buildTextField(_premiumAmountController, l10n.premiumAmount, keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')),
_buildTextField(_financialYearController, l10n.financialYear, readOnly: _isFetched('financialyear')),
_buildDropdownField(_healthStatusController, l10n.healthStatus, _healthStatusOptions),
_buildTextField(_collectionChannelController, l10n.collectionChannel),
const Divider(height: 32),
const Text('Nominee Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
Text(l10n.nomineeDetails, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 16),
_buildTextField(_nomineeNameController, 'Nominee Name'),
_buildTextField(_nomineeAddressController, 'Nominee Address'),
_buildDropdownField(_nomineeRelationshipController, 'Nominee Relationship', _relationshipOptions, readOnly: _isFetched('nomineerelationship')),
_buildDropdownField(_nomineeMinorController, 'Nominee Minor', _minorOptions, readOnly: _isFetched('nomineeminor')),
_buildTextField(_nomineeNameController, l10n.nomineeName),
_buildTextField(_nomineeAddressController, l10n.nomineeAddress),
_buildDropdownField(_nomineeRelationshipController, l10n.nomineeRelationship, _relationshipOptions, readOnly: _isFetched('nomineerelationship')),
_buildDropdownField(_nomineeMinorController, l10n.nomineeMinor, _minorOptions, readOnly: _isFetched('nomineeminor')),
const SizedBox(height: 24),
ElevatedButton(
onPressed: _handleRegister,
@@ -269,9 +272,9 @@ class _PMJJBYScreenState extends State<PMJJBYScreen> {
borderRadius: BorderRadius.circular(8),
),
),
child: const Text(
'Register',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
child: Text(
l10n.register,
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
),
const SizedBox(height: 32),

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:kmobile/api/services/yojna_service.dart';
import 'package:kmobile/di/injection.dart';
import 'package:kmobile/l10n/app_localizations.dart';
class PMSBYEnquiryScreen extends StatefulWidget {
final String? cifNumber;
@@ -35,6 +36,7 @@ class _PMSBYEnquiryScreenState extends State<PMSBYEnquiryScreen> {
}
Future<void> _fetchEnquiryData() async {
final l10n = AppLocalizations.of(context);
if (_selectedFinancialYear == null || widget.cifNumber == null) return;
setState(() {
@@ -56,19 +58,19 @@ class _PMSBYEnquiryScreenState extends State<PMSBYEnquiryScreen> {
setState(() {
if (response is Map<String, dynamic>) {
if (response['status'] == 'FAILED') {
_errorMessage = response['message'] ?? 'No record found';
_errorMessage = response['message'] ?? l10n.noRecordFound;
} else {
_enquiryData = response;
}
} else if (response is List && response.isNotEmpty) {
_enquiryData = response[0] as Map<String, dynamic>;
} else {
_errorMessage = 'No data found for the selected year.';
_errorMessage = l10n.noDataFoundYear;
}
});
} catch (e) {
setState(() {
_errorMessage = 'Error: ${e.toString()}';
_errorMessage = l10n.genericError(e.toString());
});
} finally {
setState(() {
@@ -79,9 +81,10 @@ class _PMSBYEnquiryScreenState extends State<PMSBYEnquiryScreen> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('PMSBY details'),
title: Text(l10n.pmsbyDetails),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
@@ -100,9 +103,9 @@ class _PMSBYEnquiryScreenState extends State<PMSBYEnquiryScreen> {
ListTile(
contentPadding: EdgeInsets.zero,
leading: const Icon(Icons.person, color: Colors.blue),
title: const Text('CIF Number'),
title: Text(l10n.cifNumber),
subtitle: Text(
widget.cifNumber ?? 'N/A',
widget.cifNumber ?? l10n.notApplicable,
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
@@ -112,11 +115,11 @@ class _PMSBYEnquiryScreenState extends State<PMSBYEnquiryScreen> {
const SizedBox(height: 16),
DropdownButtonFormField<String>(
value: _selectedFinancialYear,
decoration: const InputDecoration(
labelText: 'Select Financial Year',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.calendar_today),
contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: InputDecoration(
labelText: l10n.selectFinancialYear,
border: const OutlineInputBorder(),
prefixIcon: const Icon(Icons.calendar_today),
contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
),
items: _financialYears.map((String year) {
return DropdownMenuItem<String>(
@@ -167,20 +170,20 @@ class _PMSBYEnquiryScreenState extends State<PMSBYEnquiryScreen> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Scheme Details',
l10n.schemeDetails,
style: Theme.of(context).textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.primary,
),
),
const Divider(),
_buildDetailRow('Customer Name', _enquiryData!['customername']),
_buildDetailRow('Policy Number', _enquiryData!['policynumber'] ?? _enquiryData!['policyno']),
_buildDetailRow('Account Number', _enquiryData!['accountno']),
_buildDetailRow('Premium Amount', _enquiryData!['preimiumamount'] ?? _enquiryData!['premiumamount']),
_buildDetailRow('Nominee Name', _enquiryData!['nomineename']),
_buildDetailRow('Transaction Date', _enquiryData!['transactiondate']),
_buildDetailRow('Journal No', _enquiryData!['journalno']),
_buildDetailRow(l10n.customerName, _enquiryData!['customername']),
_buildDetailRow(l10n.policyNumber, _enquiryData!['policynumber'] ?? _enquiryData!['policyno']),
_buildDetailRow(l10n.accountNumber, _enquiryData!['accountno']),
_buildDetailRow(l10n.premiumAmount, _enquiryData!['preimiumamount'] ?? _enquiryData!['premiumamount']),
_buildDetailRow(l10n.nomineeName, _enquiryData!['nomineename']),
_buildDetailRow(l10n.date, _enquiryData!['transactiondate']),
_buildDetailRow(l10n.journalNo, _enquiryData!['journalno']),
],
),
),
@@ -203,7 +206,7 @@ class _PMSBYEnquiryScreenState extends State<PMSBYEnquiryScreen> {
),
Flexible(
child: Text(
value?.toString() ?? 'N/A',
value?.toString() ?? AppLocalizations.of(context).notApplicable,
style: const TextStyle(fontWeight: FontWeight.bold),
textAlign: TextAlign.end,
),

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:kmobile/api/services/yojna_service.dart';
import 'package:kmobile/di/injection.dart';
import 'package:kmobile/l10n/app_localizations.dart';
class PMSBYScreen extends StatefulWidget {
final Map<String, dynamic>? initialData;
@@ -151,6 +152,7 @@ class _PMSBYScreenState extends State<PMSBYScreen> {
}
Future<void> _handleRegister() async {
final l10n = AppLocalizations.of(context);
// Show loading spinner
showDialog(
context: context,
@@ -191,7 +193,7 @@ class _PMSBYScreenState extends State<PMSBYScreen> {
);
String x = response.toString();
if(x.contains('RECORD ALREADY EXISTS')){
x= "A record already exists for this request. Your submission has been registered previously.";
x= l10n.recordAlreadyExists;
}
if (mounted) {
@@ -202,14 +204,14 @@ class _PMSBYScreenState extends State<PMSBYScreen> {
context: context,
barrierDismissible: false,
builder: (context) => AlertDialog(
title: const Text('Response'),
title: Text(l10n.response),
content: SingleChildScrollView(child: Text(x)),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).popUntil((route) => route.isFirst);
},
child: const Text('Close'),
child: Text(l10n.close),
),
],
),
@@ -219,7 +221,7 @@ class _PMSBYScreenState extends State<PMSBYScreen> {
if (mounted) {
Navigator.pop(context); // Close loading spinner
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error: ${e.toString()}')),
SnackBar(content: Text(l10n.genericError(e.toString()))),
);
}
}
@@ -227,9 +229,10 @@ class _PMSBYScreenState extends State<PMSBYScreen> {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('PMSBY Registration'),
title: Text(l10n.pmsbyRegistration),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
@@ -238,43 +241,43 @@ class _PMSBYScreenState extends State<PMSBYScreen> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_buildTextField(_nameController, 'Customer Name', readOnly: _isFetched('customername')),
_buildTextField(_customerNoController, 'Customer No', readOnly: _isFetched('customerno')),
_buildTextField(_accountNoController, 'Account No', keyboardType: TextInputType.number, readOnly: _isFetched('accountno')),
_buildTextField(_balanceController, 'Available Balance', keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')),
_buildTextField(_aadhaarController, 'Aadhaar No', keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')),
_buildTextField(_dobController, 'Customer DOB (DD/MM/YYYY)', readOnly: _isFetched('customerdob')),
_buildTextField(_genderController, 'Gender', readOnly: _isFetched('gender')),
_buildTextField(_marriedController, 'Married (Yes/No)', readOnly: _isFetched('married')),
_buildTextField(_mobileController, 'Mobile No', keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')),
_buildTextField(_nameController, l10n.customerName, readOnly: _isFetched('customername')),
_buildTextField(_customerNoController, l10n.customerNo, readOnly: _isFetched('customerno')),
_buildTextField(_accountNoController, l10n.accountNumber, keyboardType: TextInputType.number, readOnly: _isFetched('accountno')),
_buildTextField(_balanceController, l10n.availableBalance, keyboardType: TextInputType.number, readOnly: _isFetched('availablebalance')),
_buildTextField(_aadhaarController, l10n.aadhaarNo, keyboardType: TextInputType.number, readOnly: _isFetched('aadharno')),
_buildTextField(_dobController, l10n.customerDobFormat, readOnly: _isFetched('customerdob')),
_buildTextField(_genderController, l10n.gender, readOnly: _isFetched('gender')),
_buildTextField(_marriedController, l10n.marriedYesNo, readOnly: _isFetched('married')),
_buildTextField(_mobileController, l10n.mobileNumber, keyboardType: TextInputType.phone, readOnly: _isFetched('mobileno')),
_buildTextField(_emailController, 'Email ID', keyboardType: TextInputType.emailAddress, readOnly: _isFetched('emailid')),
_buildTextField(_address1Controller, 'Address 1', readOnly: _isFetched('address1')),
_buildTextField(_address2Controller, 'Address 2', readOnly: _isFetched('address2')),
_buildTextField(_cityController, 'City', readOnly: _isFetched('city')),
_buildTextField(_panController, 'PAN', readOnly: _isFetched('pan')),
_buildTextField(_ifscController, 'IFSC Code', readOnly: _isFetched('ifsccode')),
_buildTextField(_acctOpeningDateController, 'Date of Acct Opening', readOnly: _isFetched('dateofacctopening')),
_buildTextField(_pincodeController, 'Pincode', keyboardType: TextInputType.number, readOnly: _isFetched('pincode')),
_buildTextField(_stateController, 'State', readOnly: _isFetched('state')),
_buildTextField(_countryController, 'Country', readOnly: _isFetched('country')),
_buildDropdownField(_ruralCategoryController, 'Rural Category', _ruralOptions, readOnly: _isFetched('ruralcategory')),
_buildTextField(_address1Controller, l10n.address1, readOnly: _isFetched('address1')),
_buildTextField(_address2Controller, l10n.address2, readOnly: _isFetched('address2')),
_buildTextField(_cityController, l10n.city, readOnly: _isFetched('city')),
_buildTextField(_panController, l10n.pan, readOnly: _isFetched('pan')),
_buildTextField(_ifscController, l10n.ifscCode, readOnly: _isFetched('ifsccode')),
_buildTextField(_acctOpeningDateController, l10n.dateOfAcctOpening, readOnly: _isFetched('dateofacctopening')),
_buildTextField(_pincodeController, l10n.pincode, keyboardType: TextInputType.number, readOnly: _isFetched('pincode')),
_buildTextField(_stateController, l10n.state, readOnly: _isFetched('state')),
_buildTextField(_countryController, l10n.country, readOnly: _isFetched('country')),
_buildDropdownField(_ruralCategoryController, l10n.ruralCategory, _ruralOptions, readOnly: _isFetched('ruralcategory')),
const Divider(height: 32),
const Text('Policy Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
Text(l10n.policyDetails, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 16),
_buildTextField(_policyNumberController, 'Policy Number', readOnly: _isFetched('policyno')),
_buildTextField(_premiumAmountController, 'Premium Amount', keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')),
_buildTextField(_financialYearController, 'Financial Year', readOnly: _isFetched('financialyear')),
_buildTextField(_policyStatusController, 'Policy Status', readOnly: _isFetched('policystatus')),
_buildDropdownField(_healthStatusController, 'Health Status', _healthStatusOptions),
_buildTextField(_collectionChannelController, 'Collection Channel'),
_buildTextField(_policyNumberController, l10n.policyNumber, readOnly: _isFetched('policyno')),
_buildTextField(_premiumAmountController, l10n.premiumAmount, keyboardType: TextInputType.number, readOnly: _isFetched('premiumamount')),
_buildTextField(_financialYearController, l10n.financialYear, readOnly: _isFetched('financialyear')),
_buildTextField(_policyStatusController, l10n.policyStatus, readOnly: _isFetched('policystatus')),
_buildDropdownField(_healthStatusController, l10n.healthStatus, _healthStatusOptions),
_buildTextField(_collectionChannelController, l10n.collectionChannel),
const Divider(height: 32),
const Text('Nominee Details', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
Text(l10n.nomineeDetails, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
const SizedBox(height: 16),
_buildTextField(_nomineeNameController, 'Nominee Name'),
_buildTextField(_nomineeAddressController, 'Nominee Address'),
_buildDropdownField(_relationWithNomineeController, 'Relation with Nominee', _relationshipOptions, readOnly: _isFetched('relationwithnominee')),
_buildTextField(_nomineeRelationshipController, 'Nominee Relationship'),
_buildDropdownField(_nomineeMinorController, 'Nominee Minor', _minorOptions, readOnly: _isFetched('nomineeminor')),
_buildTextField(_nomineeNameController, l10n.nomineeName),
_buildTextField(_nomineeAddressController, l10n.nomineeAddress),
_buildDropdownField(_relationWithNomineeController, l10n.relationWithNominee, _relationshipOptions, readOnly: _isFetched('relationwithnominee')),
_buildTextField(_nomineeRelationshipController, l10n.nomineeRelationship),
_buildDropdownField(_nomineeMinorController, l10n.nomineeMinor, _minorOptions, readOnly: _isFetched('nomineeminor')),
const SizedBox(height: 24),
ElevatedButton(
onPressed: _handleRegister,
@@ -286,9 +289,9 @@ class _PMSBYScreenState extends State<PMSBYScreen> {
borderRadius: BorderRadius.circular(8),
),
),
child: const Text(
'Register',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
child: Text(
l10n.register,
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
),
const SizedBox(height: 32),

View File

@@ -592,5 +592,63 @@
"chequeStolen": "Cheque Stolen",
"chequeMissing": "Cheque Missing",
"chequeDamaged": "Cheque Damaged",
"close": "Close"
"close": "Close",
"governmentSchemes": "Government Schemes",
"pradhanMantriYojana": "Pradhan Mantri Yojana",
"atalPensionYojana": "Atal Pension Yojana",
"registerForAtalPensionYojana": "Register for Atal Pension Yojana",
"secureYourFutureAPY": "Secure your future with Atal Pension Yojana (APY) retirement scheme. Register in a few steps.",
"enrollPMJJBYPMSBY": "Enroll in Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY) and Pradhan Mantri Suraksha Bima Yojana (PMSBY) insurance schemes",
"apyRegistration": "APY registration",
"apyDescription": "Atal Pension Yojana (APY) is a periodic contribution-based pension scheme for citizens of India.",
"pmjjbyPmsbyDescription": "Create and Enquire about your Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY) and Pradhan Mantri Suraksha Bima Yojana(PMSBY) schemes.",
"selectScheme": "Select Scheme",
"pmjjbyFull": "Pradhan Mantri Jeevan Jyoti Bima Yojana (PMJJBY)",
"pmsbyFull": "Pradhan Mantri Suraksha Bima Yojana (PMSBY)",
"create": "Create",
"pleaseSelectAccountNumber": "Please select account number",
"pleaseSelectSchemeFirst": "Please select a scheme first",
"fetchingDetails": "Fetching details...",
"failedToFetchDetails": "Failed to fetch details or no data found.",
"pmjjbyDetails": "PMJJBY details",
"pmsbyDetails": "PMSBY details",
"cifNumber": "CIF Number",
"selectFinancialYear": "Select Financial Year",
"schemeDetails": "Scheme Details",
"customerName": "Customer Name",
"policyNumber": "Policy Number",
"premiumAmount": "Premium Amount",
"nomineeName": "Nominee Name",
"journalNo": "Journal No",
"noRecordFound": "No record found",
"noDataFoundYear": "No data found for the selected year.",
"pmjjbyRegistration": "PMJJBY Registration",
"pmsbyRegistration": "PMSBY Registration",
"customerNo": "Customer No",
"aadhaarNo": "Aadhaar No",
"customerDobFormat": "Customer DOB (DD/MM/YYYY)",
"gender": "Gender",
"marriedYesNo": "Married (Yes/No)",
"pan": "PAN",
"dateOfAcctOpening": "Date of Acct Opening",
"pincode": "Pincode",
"state": "State",
"country": "Country",
"ruralCategory": "Rural Category",
"policyDetails": "Policy Details",
"financialYear": "Financial Year",
"healthStatus": "Health Status",
"collectionChannel": "Collection Channel",
"nomineeDetails": "Nominee Details",
"nomineeAddress": "Nominee Address",
"nomineeRelationship": "Nominee Relationship",
"nomineeMinor": "Nominee Minor",
"response": "Response",
"recordAlreadyExists": "A record already exists for this request. Your submission has been registered previously.",
"address1": "Address 1",
"address2": "Address 2",
"city": "City",
"relationWithNominee": "Relation with Nominee",
"policyStatus": "Policy Status",
"emailId": "Email ID"
}

View File

@@ -593,5 +593,62 @@
"chequeStolen": "चेक चोरी हो गया",
"chequeMissing": "चेक गायब है",
"chequeDamaged": "चेक क्षतिग्रस्त है",
"close": "बंद करें"
"close": "बंद करें",
"governmentSchemes": "सरकारी योजनाएं",
"pradhanMantriYojana": "प्रधानमंत्री योजना",
"atalPensionYojana": "अटल पेंशन योजना",
"registerForAtalPensionYojana": "अटल पेंशन योजना के लिए पंजीकरण करें",
"secureYourFutureAPY": "अटल पेंशन योजना (APY) सेवानिवृत्ति योजना के साथ अपना भविष्य सुरक्षित करें। कुछ ही चरणों में पंजीकरण करें।",
"enrollPMJJBYPMSBY": "प्रधानमंत्री जीवन ज्योति बीमा योजना (PMJJBY) और प्रधानमंत्री सुरक्षा बीमा योजना (PMSBY) बीमा योजनाओं में नामांकन करें",
"apyRegistration": "APY पंजीकरण",
"apyDescription": "अटल पेंशन योजना (APY) भारत के नागरिकों के लिए एक आवधिक योगदान-आधारित पेंशन योजना है।",
"pmjjbyPmsbyDescription": "अपनी प्रधानमंत्री जीवन ज्योति बीमा योजना (PMJJBY) और प्रधानमंत्री सुरक्षा बीमा योजना (PMSBY) योजनाओं के बारे में बनाएं और पूछताछ करें।",
"selectScheme": "योजना चुनें",
"pmjjbyFull": "प्रधानमंत्री जीवन ज्योति बीमा योजना (PMJJBY)",
"pmsbyFull": "प्रधानमंत्री सुरक्षा बीमा योजना (PMSBY)",
"create": "बनाएं",
"pleaseSelectAccountNumber": "कृपया खाता संख्या चुनें",
"pleaseSelectSchemeFirst": "कृपया पहले एक योजना चुनें",
"fetchingDetails": "विवरण प्राप्त किया जा रहा है...",
"failedToFetchDetails": "विवरण प्राप्त करने में विफल या कोई डेटा नहीं मिला।",
"pmjjbyDetails": "PMJJBY विवरण",
"pmsbyDetails": "PMSBY विवरण",
"cifNumber": "CIF संख्या",
"selectFinancialYear": "वित्तीय वर्ष चुनें",
"schemeDetails": "योजना विवरण",
"customerName": "ग्राहक का नाम",
"policyNumber": "पॉलिसी संख्या",
"premiumAmount": "प्रीमियम राशि",
"nomineeName": "नामांकित व्यक्ति का नाम",
"journalNo": "जर्नल नंबर",
"noRecordFound": "कोई रिकॉर्ड नहीं मिला",
"noDataFoundYear": "चयनित वर्ष के लिए कोई डेटा नहीं मिला।",
"pmjjbyRegistration": "PMJJBY पंजीकरण",
"pmsbyRegistration": "PMSBY पंजीकरण",
"customerNo": "ग्राहक संख्या",
"aadhaarNo": "आधार संख्या",
"customerDobFormat": "ग्राहक की जन्म तिथि (DD/MM/YYYY)",
"gender": "लिंग",
"marriedYesNo": "विवाहित (हाँ/नहीं)",
"pan": "पैन",
"dateOfAcctOpening": "खाता खोलने की तिथि",
"pincode": "पिनकोड",
"state": "राज्य",
"country": "देश",
"ruralCategory": "ग्रामीण श्रेणी",
"policyDetails": "पॉलिसी विवरण",
"financialYear": "वित्तीय वर्ष",
"healthStatus": "स्वास्थ्य की स्थिति",
"collectionChannel": "संग्रह चैनल",
"nomineeDetails": "नामांकित व्यक्ति का विवरण",
"nomineeAddress": "नामांकित व्यक्ति का पता",
"nomineeRelationship": "नामांकित व्यक्ति से संबंध",
"nomineeMinor": "नामांकित व्यक्ति नाबालिग है",
"response": "प्रतिक्रिया",
"recordAlreadyExists": "इस अनुरोध के लिए एक रिकॉर्ड पहले से मौजूद है। आपका सबमिशन पहले पंजीकृत किया जा चुका है।",
"address1": "पता 1",
"address2": "पता 2",
"city": "शहर",
"relationWithNominee": "नामांकित व्यक्ति के साथ संबंध",
"policyStatus": "पॉलिसी की स्थिति"
}