331 lines
14 KiB
Dart
331 lines
14 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:kmobile/api/services/yojna_service.dart';
|
|
import 'package:kmobile/di/injection.dart';
|
|
|
|
class PMJJBYScreen extends StatefulWidget {
|
|
final Map<String, dynamic>? initialData;
|
|
const PMJJBYScreen({super.key, this.initialData});
|
|
|
|
@override
|
|
State<PMJJBYScreen> createState() => _PMJJBYScreenState();
|
|
}
|
|
|
|
class _PMJJBYScreenState extends State<PMJJBYScreen> {
|
|
final _formKey = GlobalKey<FormState>();
|
|
|
|
// Controllers for all requested fields
|
|
late final _aadhaarController = TextEditingController(text: widget.initialData?['aadharno']?.toString());
|
|
late final _accountNoController = TextEditingController(text: widget.initialData?['accountno']?.toString());
|
|
late final _balanceController = TextEditingController(text: widget.initialData?['availablebalance']?.toString());
|
|
late final _countryController = TextEditingController(text: widget.initialData?['country']?.toString() ?? 'IN');
|
|
late final _dobController = TextEditingController(text: widget.initialData?['customerdob']?.toString());
|
|
late final _nameController = TextEditingController(text: widget.initialData?['customername']?.toString());
|
|
late final _customerNoController = TextEditingController(text: widget.initialData?['customerno']?.toString());
|
|
late final _acctOpeningDateController = TextEditingController(text: widget.initialData?['dateofacctopening']?.toString());
|
|
late final _emailController = TextEditingController(text: widget.initialData?['emailid']?.toString());
|
|
late final _financialYearController = TextEditingController(text: widget.initialData?['financialyear']?.toString());
|
|
late final _genderController = TextEditingController(text: widget.initialData?['gender']?.toString());
|
|
late final _ifscController = TextEditingController(text: widget.initialData?['ifsccode']?.toString());
|
|
late final _marriedController = TextEditingController(text: widget.initialData?['married']?.toString());
|
|
late final _mobileController = TextEditingController(text: widget.initialData?['mobileno']?.toString());
|
|
late final _panController = TextEditingController(text: widget.initialData?['pan']?.toString());
|
|
late final _pincodeController = TextEditingController(text: widget.initialData?['pincode']?.toString());
|
|
late final _policyNumberController = TextEditingController(text: widget.initialData?['policynumber']?.toString());
|
|
late final _premiumAmountController = TextEditingController(text: widget.initialData?['premiumamount']?.toString());
|
|
late final _stateController = TextEditingController(text: widget.initialData?['state']?.toString());
|
|
|
|
// Mapping options
|
|
final Map<String, String> _healthStatusOptions = {
|
|
'1': 'Excellent',
|
|
'2': 'Good',
|
|
'3': 'Bad',
|
|
};
|
|
|
|
final Map<String, String> _relationshipOptions = {
|
|
'01': 'Self',
|
|
'02': 'Wife',
|
|
'03': 'Father',
|
|
'04': 'Mother',
|
|
'05': 'Son',
|
|
'06': 'Daughter',
|
|
'07': 'Brother',
|
|
'08': 'Sister',
|
|
'09': 'Father-in-law',
|
|
'10': 'Mother-in-law',
|
|
'11': 'Grandson',
|
|
'12': 'Granddaughter',
|
|
'13': 'Grandfather',
|
|
'14': 'Grandmother',
|
|
'15': 'Brother-in-law',
|
|
'16': 'Sister-in-law',
|
|
'17': 'Husband',
|
|
'18': 'Guardian',
|
|
'99': 'Others',
|
|
};
|
|
|
|
final Map<String, String> _minorOptions = {
|
|
'Y': 'Yes',
|
|
'N': 'No',
|
|
};
|
|
|
|
final Map<String, String> _ruralOptions = {
|
|
'R': 'Rural',
|
|
'U': 'Urban',
|
|
'S': 'Semi-Urban',
|
|
'M': 'Metro',
|
|
};
|
|
|
|
final _healthStatusController = TextEditingController();
|
|
final _collectionChannelController = TextEditingController();
|
|
final _nomineeNameController = TextEditingController();
|
|
final _nomineeAddressController = TextEditingController();
|
|
final _nomineeRelationshipController = TextEditingController();
|
|
final _nomineeMinorController = TextEditingController();
|
|
final _ruralCategoryController = TextEditingController();
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
// Initialize dropdown controllers if data exists in initialData
|
|
if (widget.initialData != null) {
|
|
if (widget.initialData!.containsKey('ruralcategory')) {
|
|
_ruralCategoryController.text = widget.initialData!['ruralcategory'].toString();
|
|
}
|
|
if (widget.initialData!.containsKey('healthstatus')) {
|
|
_healthStatusController.text = widget.initialData!['healthstatus'].toString();
|
|
}
|
|
if (widget.initialData!.containsKey('nomineerelationship')) {
|
|
_nomineeRelationshipController.text = widget.initialData!['nomineerelationship'].toString();
|
|
}
|
|
if (widget.initialData!.containsKey('nomineeminor')) {
|
|
_nomineeMinorController.text = widget.initialData!['nomineeminor'].toString();
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_aadhaarController.dispose();
|
|
_accountNoController.dispose();
|
|
_balanceController.dispose();
|
|
_countryController.dispose();
|
|
_dobController.dispose();
|
|
_nameController.dispose();
|
|
_customerNoController.dispose();
|
|
_acctOpeningDateController.dispose();
|
|
_emailController.dispose();
|
|
_financialYearController.dispose();
|
|
_genderController.dispose();
|
|
_ifscController.dispose();
|
|
_marriedController.dispose();
|
|
_mobileController.dispose();
|
|
_panController.dispose();
|
|
_pincodeController.dispose();
|
|
_policyNumberController.dispose();
|
|
_premiumAmountController.dispose();
|
|
_stateController.dispose();
|
|
_healthStatusController.dispose();
|
|
_collectionChannelController.dispose();
|
|
_nomineeNameController.dispose();
|
|
_nomineeAddressController.dispose();
|
|
_nomineeRelationshipController.dispose();
|
|
_nomineeMinorController.dispose();
|
|
_ruralCategoryController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
bool _isFetched(String key) {
|
|
return widget.initialData != null &&
|
|
widget.initialData!.containsKey(key) &&
|
|
widget.initialData![key]?.toString().isNotEmpty == true;
|
|
}
|
|
|
|
Future<void> _handleRegister() async {
|
|
// Show loading spinner
|
|
showDialog(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
builder: (context) => const Center(child: CircularProgressIndicator()),
|
|
);
|
|
|
|
try {
|
|
final response = await getIt<YojnaService>().secondvalidationPMJJBY(
|
|
aadharno: _aadhaarController.text,
|
|
accountno: _accountNoController.text,
|
|
availablebalance: _balanceController.text,
|
|
country: _countryController.text,
|
|
customerdob: _dobController.text,
|
|
customername: _nameController.text,
|
|
customerno: _customerNoController.text,
|
|
dateofacctopening: _acctOpeningDateController.text,
|
|
emailid: _emailController.text,
|
|
financialyear: _financialYearController.text,
|
|
gender: _genderController.text,
|
|
ifsccode: _ifscController.text,
|
|
married: _marriedController.text,
|
|
mobileno: _mobileController.text,
|
|
pan: _panController.text,
|
|
pincode: _pincodeController.text,
|
|
policynumber: _policyNumberController.text,
|
|
premiumamount: _premiumAmountController.text,
|
|
state: _stateController.text,
|
|
healthstatus: _healthStatusController.text,
|
|
collectionchannel: _collectionChannelController.text,
|
|
nomineename: _nomineeNameController.text,
|
|
nomineeaddress: _nomineeAddressController.text,
|
|
nomineerelationship: _nomineeRelationshipController.text,
|
|
nomineeminor: _nomineeMinorController.text,
|
|
ruralcategory: _ruralCategoryController.text,
|
|
);
|
|
String x = response.toString();
|
|
if(x.contains('RECORD ALREADY EXISTS')){
|
|
x= "A record already exists for this request. Your submission has been registered previously.";
|
|
}
|
|
|
|
if (mounted) {
|
|
// Close loading spinner
|
|
Navigator.pop(context);
|
|
// Show response dialog
|
|
showDialog(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
builder: (context) => AlertDialog(
|
|
title: const Text('Response'),
|
|
content: SingleChildScrollView(child: Text(x)),
|
|
actions: [
|
|
TextButton(
|
|
onPressed: () {
|
|
Navigator.of(context).popUntil((route) => route.isFirst);
|
|
},
|
|
child: const Text('Close'),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
} catch (e) {
|
|
if (mounted) {
|
|
Navigator.pop(context); // Close loading spinner
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(content: Text('Error: ${e.toString()}')),
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text('PMJJBY Registration'),
|
|
),
|
|
body: SingleChildScrollView(
|
|
padding: const EdgeInsets.all(16.0),
|
|
child: Form(
|
|
key: _formKey,
|
|
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(_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')),
|
|
const Divider(height: 32),
|
|
const Text('Policy Details', style: 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'),
|
|
const Divider(height: 32),
|
|
const Text('Nominee Details', style: 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')),
|
|
const SizedBox(height: 24),
|
|
ElevatedButton(
|
|
onPressed: _handleRegister,
|
|
style: ElevatedButton.styleFrom(
|
|
backgroundColor: Theme.of(context).colorScheme.primary,
|
|
foregroundColor: Colors.white,
|
|
padding: const EdgeInsets.symmetric(vertical: 16),
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(8),
|
|
),
|
|
),
|
|
child: const Text(
|
|
'Register',
|
|
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
const SizedBox(height: 32),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildDropdownField(
|
|
TextEditingController controller, String label, Map<String, String> options,
|
|
{bool readOnly = false}) {
|
|
// Determine current value
|
|
String? currentValue = options.containsKey(controller.text) ? controller.text : null;
|
|
|
|
return Padding(
|
|
padding: const EdgeInsets.only(bottom: 16.0),
|
|
child: DropdownButtonFormField<String>(
|
|
value: currentValue,
|
|
onChanged: readOnly ? null : (newValue) {
|
|
setState(() {
|
|
controller.text = newValue ?? '';
|
|
});
|
|
},
|
|
decoration: InputDecoration(
|
|
labelText: label,
|
|
border: const OutlineInputBorder(),
|
|
contentPadding: const EdgeInsets.symmetric(vertical: 16, horizontal: 12),
|
|
),
|
|
items: options.entries.map((entry) {
|
|
return DropdownMenuItem<String>(
|
|
value: entry.key,
|
|
child: Text("${entry.key} - ${entry.value}"),
|
|
);
|
|
}).toList(),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildTextField(TextEditingController controller, String label, {TextInputType keyboardType = TextInputType.text, bool readOnly = false}) {
|
|
return Padding(
|
|
padding: const EdgeInsets.only(bottom: 16.0),
|
|
child: TextFormField(
|
|
controller: controller,
|
|
readOnly: readOnly,
|
|
decoration: InputDecoration(
|
|
labelText: label,
|
|
border: const OutlineInputBorder(),
|
|
contentPadding: const EdgeInsets.symmetric(vertical: 16, horizontal: 12),
|
|
),
|
|
keyboardType: keyboardType,
|
|
),
|
|
);
|
|
}
|
|
}
|