diff --git a/lib/api/services/cheque_service.dart b/lib/api/services/cheque_service.dart index 1505723..272b86b 100644 --- a/lib/api/services/cheque_service.dart +++ b/lib/api/services/cheque_service.dart @@ -130,4 +130,36 @@ class ChequeService { ); return response.toString(); } + + Future revokeStop({ + required String accountno, + required String removeFromChequeNo, + required String instrType, + String? removeToChequeNo, + String? removeIssueDate, + String? removeExpiryDate, + String? removeAmount, + String? removeComment, + required String tpin, + }) async { + final response = await _dio.post( + '/api/cheque/revoke_stop', + options: Options( + validateStatus: (int? status) => true, + receiveDataWhenStatusError: true, + ), + data: { + 'accountNumber': accountno, + 'removeFromChequeNo': removeFromChequeNo, + 'instrumentType': instrType, + 'removeToChequeNo': removeToChequeNo, + 'removeIssueDate': removeIssueDate, + 'removeExpiryDate': removeExpiryDate, + 'removeAmount': removeAmount, + 'removeComment': removeComment, + 'tpin': tpin, + }, + ); + return response.toString(); + } } diff --git a/lib/features/cheque/screens/cheque_management_screen.dart b/lib/features/cheque/screens/cheque_management_screen.dart index 5636f81..06cf465 100644 --- a/lib/features/cheque/screens/cheque_management_screen.dart +++ b/lib/features/cheque/screens/cheque_management_screen.dart @@ -76,24 +76,24 @@ class _ChequeManagementScreen extends State { }, ), ), - // Expanded( - // child: ChequeManagementCardTile( - // icon: Symbols.block_sharp, - // label: "Revoke Stop", - // subtitle: "Revoke your stopped cheques so as to reuse it", - // onTap: () { - // Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => RevokeStopSingleChequeScreen( - // users: users, - // selectedIndex: selectedAccountIndex, - // ), - // ), - // ); - // }, - // ), - // ), + Expanded( + child: ChequeManagementCardTile( + icon: Symbols.block_sharp, + label: "Revoke Stop", + subtitle: "Revoke your stopped cheques so as to reuse it", + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RevokeStopSingleChequeScreen( + users: users, + selectedIndex: selectedAccountIndex, + ), + ), + ); + }, + ), + ), ], ), ), diff --git a/lib/features/cheque/screens/revoke _stop_multiple_screen.dart b/lib/features/cheque/screens/revoke _stop_multiple_screen.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/features/cheque/screens/revoke_stop_screen.dart b/lib/features/cheque/screens/revoke_stop_screen.dart index 6f0000b..62f9052 100644 --- a/lib/features/cheque/screens/revoke_stop_screen.dart +++ b/lib/features/cheque/screens/revoke_stop_screen.dart @@ -1,332 +1,351 @@ -// import 'dart:convert'; -// import 'package:dio/dio.dart'; -// import 'package:kmobile/data/models/user.dart'; -// import 'package:kmobile/di/injection.dart'; -// import 'package:flutter/material.dart'; -// import 'package:kmobile/api/services/cheque_service.dart'; -// import 'package:kmobile/features/fund_transfer/screens/transaction_pin_screen.dart'; -// import 'package:kmobile/l10n/app_localizations.dart'; +import 'package:kmobile/data/models/user.dart'; +import 'package:kmobile/di/injection.dart'; +import 'package:flutter/material.dart'; +import 'package:kmobile/api/services/cheque_service.dart'; +import 'package:kmobile/features/cheque/screens/stop_multiple_cheques_screen.dart'; +import 'package:kmobile/features/cheque/screens/stop_single_cheque_screen.dart'; +import 'package:kmobile/l10n/app_localizations.dart'; -// class RevokeStopSingleChequeScreen extends StatefulWidget { -// final User selectedAccount; -// final String date; -// final String instrType; -// final String fromCheque; -// final String toCheque; +class RevokeStopSingleChequeScreen extends StatefulWidget { + final List users; + final int selectedIndex; -// const RevokeStopSingleChequeScreen( -// {super.key, -// required this.selectedAccount, -// required this.date, -// required this.instrType, -// required this.fromCheque, -// required this.toCheque}); + const RevokeStopSingleChequeScreen( + { + super.key, + required this.users, + required this.selectedIndex, + }); -// @override -// State createState() => _RevokeStopSingleChequeScreenState(); -// } + @override + State createState() => _RevokeStopSingleChequeScreenState(); +} -// class _RevokeStopSingleChequeScreenState extends State { -// final _formKey = GlobalKey(); -// final _stopFromChequeNoController = TextEditingController(); -// final _stopIssueDateController = TextEditingController(); -// final _stopExpiryDateController = TextEditingController(); -// final _stopAmountController = TextEditingController(); -// final _chequeService = getIt(); +class _RevokeStopSingleChequeScreenState extends State { + User? _selectedAccount; + var service = getIt(); + bool _isLoading = true; + Cheque? _stCheque; + List _filteredUsers = []; -// String? _selectedComment; -// final _otherCommentController = TextEditingController(); -// bool _showOtherCommentField = false; -// final List _commentOptions = [ -// 'Cheque Lost', -// 'Cheque Stolen', -// 'Cheque Missing', -// 'Cheque Damaged', -// 'Other' -// ]; + @override + void initState() { + super.initState(); + _filteredUsers = widget.users + .where((user) => ['SA', 'SB', 'CA', 'CC'].contains(user.accountType)) + .toList(); -// String _formatDate(String dateString) { -// if (dateString.length != 8) { -// return dateString; // Return as is if not in expected ddmmyyyy format -// } -// try { -// final day = dateString.substring(0, 2); -// final month = dateString.substring(2, 4); -// final year = dateString.substring(4, 8); -// return '$day/$month/$year'; -// } catch (e) { -// return dateString; // Return original string on error -// } -// } + if (widget.users.isNotEmpty && widget.selectedIndex < widget.users.length) { + if (_filteredUsers.isNotEmpty) { + if (_filteredUsers.contains(widget.users[widget.selectedIndex])) { + _selectedAccount = widget.users[widget.selectedIndex]; + } else { + _selectedAccount = _filteredUsers.first; + } + } else { + _selectedAccount = widget.users[widget.selectedIndex]; + } + } else { + if (_filteredUsers.isNotEmpty) { + _selectedAccount = _filteredUsers.first; + } + } -// Future _selectDate(TextEditingController controller) async { -// final DateTime? picked = await showDatePicker( -// context: context, -// initialDate: DateTime.now(), -// firstDate: DateTime.now(), -// lastDate: DateTime(2101), -// ); -// if (picked != null) { -// setState(() { -// controller.text = -// '${picked.day.toString().padLeft(2, '0')}/${picked.month.toString().padLeft(2, '0')}/${picked.year}'; -// }); -// } -// } + _loadCheques(); + } -// Future _showResponseDialog(String title, String message) async { -// return showDialog( -// context: context, -// barrierDismissible: false, // user must tap button! -// builder: (BuildContext context) { -// return AlertDialog( -// title: Text(title), -// content: SingleChildScrollView( -// child: ListBody( -// children: [ -// Text(message), -// ], -// ), -// ), -// actions: [ -// TextButton( -// child: Text(AppLocalizations.of(context).closeButton), -// onPressed: () { -// Navigator.of(context).pop(); -// }, -// ), -// ], -// ); -// }, -// ); -// } + Future _loadCheques() async { + if (_selectedAccount == null) { + setState(() { + _isLoading = false; + _stCheque = null; + }); + return; + } + setState(() { + _isLoading = true; + }); -// @override -// Widget build(BuildContext context) { -// return Scaffold( -// appBar: AppBar( -// title: const Text("Revoke Stop")), -// ); -// body: Padding( -// padding: const EdgeInsets.all(16.0), -// child: Form( -// key: _formKey, -// child: ListView( -// children: [ -// Card( -// elevation: 0, -// margin: const EdgeInsets.symmetric(vertical: 8.0), -// child: ListTile( -// leading: Image.asset( -// 'assets/images/logo.png', -// width: 40, -// height: 40, -// ), -// title: Text(widget.selectedAccount.accountNo!), -// subtitle: -// Text(AppLocalizations.of(context).accountNumberLabel), -// ), -// ), -// const SizedBox(height: 24), -// TextFormField( -// controller: _stopFromChequeNoController, -// decoration: InputDecoration( -// labelText: AppLocalizations.of(context).chequeNumberLabel, -// border: OutlineInputBorder(), -// errorMaxLines: 2, -// ), -// keyboardType: TextInputType.number, -// validator: (value) { -// if (value == null || value.isEmpty) { -// return AppLocalizations.of(context) -// .pleaseEnterChequeNumberError; -// } -// final chequeNumber = int.tryParse(value); -// final fromCheque = int.tryParse(widget.fromCheque); -// final toCheque = int.tryParse(widget.toCheque); -// if (chequeNumber == null || -// fromCheque == null || -// toCheque == null) { -// return AppLocalizations.of(context) -// .invalidChequeNumberFormatError; -// } -// if (chequeNumber < fromCheque || chequeNumber > toCheque) { -// return AppLocalizations.of(context).chequeNumberRangeError( -// widget.fromCheque, widget.toCheque); -// } -// return null; -// }, -// ), -// const SizedBox(height: 16), -// TextFormField( -// initialValue: widget.instrType, -// readOnly: true, -// decoration: InputDecoration( -// labelText: AppLocalizations.of(context).instrumentTypeLabel, -// border: const OutlineInputBorder(), -// ), -// ), -// const SizedBox(height: 16), -// TextFormField( -// controller: _stopIssueDateController, -// readOnly: true, -// onTap: () => _selectDate(_stopIssueDateController), -// decoration: InputDecoration( -// labelText: AppLocalizations.of(context).stopIssueDateLabel, -// border: const OutlineInputBorder(), -// suffixIcon: IconButton( -// icon: const Icon(Icons.calendar_today), -// onPressed: () => _selectDate(_stopIssueDateController), -// ), -// ), -// keyboardType: TextInputType.datetime, -// ), -// const SizedBox(height: 16), -// TextFormField( -// controller: _stopExpiryDateController, -// readOnly: true, -// onTap: () => _selectDate(_stopExpiryDateController), -// decoration: InputDecoration( -// labelText: AppLocalizations.of(context).stopExpiryDateLabel, -// border: const OutlineInputBorder(), -// suffixIcon: IconButton( -// icon: const Icon(Icons.calendar_today), -// onPressed: () => _selectDate(_stopExpiryDateController), -// ), -// ), -// keyboardType: TextInputType.datetime, -// ), -// const SizedBox(height: 16), -// TextFormField( -// controller: _stopAmountController, -// decoration: InputDecoration( -// labelText: AppLocalizations.of(context).stopAmountHint, -// border: const OutlineInputBorder(), -// ), -// keyboardType: TextInputType.number, -// ), -// const SizedBox(height: 16), -// DropdownButtonFormField( -// value: _selectedComment, -// items: _commentOptions.map((String value) { -// return DropdownMenuItem( -// value: value, -// child: Text(value), -// ); -// }).toList(), -// onChanged: (newValue) { -// setState(() { -// _selectedComment = newValue; -// _showOtherCommentField = newValue == 'Other'; -// }); -// }, -// decoration: InputDecoration( -// labelText: AppLocalizations.of(context).stopCommentHint, -// border: const OutlineInputBorder(), -// ), -// ), -// if (_showOtherCommentField) -// Padding( -// padding: const EdgeInsets.only(top: 16.0), -// child: TextFormField( -// controller: _otherCommentController, -// decoration: const InputDecoration( -// labelText: "Other Reasons :", -// border: OutlineInputBorder(), -// ), -// validator: (value) { -// return null; -// }, -// ), -// ), -// const SizedBox(height: 16), -// TextFormField( -// initialValue: _formatDate(widget.date), -// readOnly: true, -// decoration: InputDecoration( -// labelText: -// AppLocalizations.of(context).chequebookIssueDateHint, -// border: const OutlineInputBorder(), -// ), -// ), -// const SizedBox(height: 32), -// ElevatedButton( -// onPressed: () { -// if (_formKey.currentState!.validate()) { -// Navigator.push( -// context, -// MaterialPageRoute( -// builder: (context) => TransactionPinScreen( -// onPinCompleted: (ctx, pin) async { -// Navigator.pop(context); -// try { -// final response = await _chequeService.stopCheque( -// accountno: widget.selectedAccount.accountNo!, -// stopFromChequeNo: -// _stopFromChequeNoController.text, -// instrType: widget.instrType, -// stopToChequeNo: -// _stopFromChequeNoController.text, -// stopIssueDate: _stopIssueDateController.text, -// stopExpiryDate: _stopExpiryDateController.text, -// stopAmount: _stopAmountController.text, -// stopComment: _selectedComment == 'Other' -// ? _otherCommentController.text -// : _selectedComment ?? '', -// chequeIssueDate: widget.date, -// tpin: pin, -// ); -// if (!mounted) return; -// final decodedResponse = jsonDecode(response); -// String responseString = response.toString(); // used as the case only for incorrect TPIN -// final status = decodedResponse['status']; -// final message = decodedResponse['message']; -// final code = decodedResponse['code']; -// if (status == 'SUCCESS') { -// _showResponseDialog('Success', message); -// } if (status == 'ERROR') { -// String errMessage = "error"; -// if(code == '0429') { -// errMessage = 'The selected Cheque is already stopped'; -// } else if(code == '0748') { -// errMessage = 'The selected Cheque is already presented'; -// } -// _showResponseDialog('Error', errMessage); -// } -// if(responseString.contains('INCORRECT_TPIN')){ -// _showResponseDialog('Invalid TPIN', -// 'The TPIN you entered is incorrect. Please try again.'); -// } -// } on DioException catch (e) { -// try { -// final errorBodyString = -// e.toString().split('Exception: ')[1]; -// final errorBody = jsonDecode(errorBodyString); -// if (errorBody.containsKey('error') && -// errorBody['error'] == 'INCORRECT_TPIN') { -// _showResponseDialog('Invalid TPIN', -// 'The TPIN you entered is incorrect. Please try again.'); -// } else { -// _showResponseDialog( -// 'Error', 'Internal Server Error'); -// } -// } catch (_) { -// _showResponseDialog( -// 'Error', 'Internal Server Error'); -// } -// } -// }, -// ), -// ), -// ); -// } -// }, -// child: Text("Revoke Stop"), -// ), -// ], -// ), -// ), -// ) -// ); -// } -// } + String instrType; + switch (_selectedAccount!.accountType) { + case 'SA': + case 'SB': + instrType = '10'; + break; + case 'CA': + instrType = '11'; + break; + case 'CC': + instrType = '13'; + break; + default: + instrType = '10'; + } + + try { + final data = await service.ChequeEnquiry( + accountNumber: _selectedAccount!.accountNo!, instrType: instrType); + final stCheques = data.where((cheque) => cheque.type == 'ST').toList(); + setState(() { + _stCheque = stCheques.isNotEmpty ? stCheques.first : null; + _isLoading = false; + }); + } catch (e) { + setState(() { + _isLoading = false; + _stCheque = null; + }); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Failed to fetch cheque status: ${e.toString()}'), + ), + ); + } + } + + String _getAccountTypeDisplayName(String accountType) { + switch (accountType.toLowerCase()) { + case 'sa': + return AppLocalizations.of(context).savingsAccount; + case 'sb': + return AppLocalizations.of(context).savingsAccount; + case 'ca': + return "Current Account"; + case 'cc': + return "Cash Credit Account"; + default: + return accountType; + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(AppLocalizations.of(context).stopChequeTitle), + centerTitle: false, + ), + body: Stack( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Card( + elevation: 4, + margin: const EdgeInsets.symmetric(vertical: 8.0), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppLocalizations.of(context).accountNumber, + style: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + ), + const SizedBox(width: 16), + if (_selectedAccount != null) + Expanded( + child: DropdownButton( + value: _selectedAccount, + onChanged: (User? newUser) { + if (newUser != null) { + setState(() { + _selectedAccount = newUser; + _loadCheques(); + }); + } + }, + items: _filteredUsers.map((user) { + return DropdownMenuItem( + value: user, + child: Text(user.accountNo.toString()), + ); + }).toList(), + ), + ) + else + Text(AppLocalizations.of(context).noAccountsFound), + ], + ), + ), + ), + const SizedBox(height: 20), + Row( + children: [ + Expanded( + child: Card( + color: Theme.of(context).colorScheme.primaryContainer, + elevation: 4, + child: InkWell( + onTap: () { + if (_selectedAccount != null && _stCheque != null) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => StopSingleChequeScreen( + selectedAccount: _selectedAccount!, + date: _stCheque!.Date!, + instrType: _stCheque!.InstrType!, + fromCheque: _stCheque!.fromCheque!, + toCheque: _stCheque!.toCheque!, + ), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context) + .noChequebookToStop), + ), + ); + } + }, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Center( + child: Text( + AppLocalizations.of(context) + .stopSingleChequeTitle, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Theme.of(context) + .colorScheme + .onPrimaryContainer, + ), + ), + ), + ), + ), + ), + ), + const SizedBox(width: 10), + Expanded( + child: Card( + color: Theme.of(context).colorScheme.primaryContainer, + elevation: 4, + child: InkWell( + onTap: () { + if (_selectedAccount != null) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + StopMultipleChequesScreen( + selectedAccount: _selectedAccount!, + date: _stCheque!.Date!, + instrType: _stCheque!.InstrType!, + fromCheque: _stCheque!.fromCheque!, + toCheque: _stCheque!.toCheque!, + ), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context) + .pleaseSelectAccountFirst), + ), + ); + } + }, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Center( + child: Text( + AppLocalizations.of(context) + .stopMultipleChequesButton, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Theme.of(context) + .colorScheme + .onSecondaryContainer, + ), + ), + ), + ), + ), + ), + ), + ], + ), + const SizedBox(height: 20), + Expanded( + child: _isLoading + ? const Center(child: CircularProgressIndicator()) + : _stCheque == null + ? Center( + child: Text(AppLocalizations.of(context) + .noChequeIssuedStatus)) + : _buildCiTile(context, _stCheque!), + ), + ], + ), + ), + IgnorePointer( + child: Center( + child: Opacity( + opacity: 0.07, // Reduced opacity + child: ClipOval( + child: Image.asset( + 'assets/images/logo.png', + width: 200, // Adjust size as needed + height: 200, // Adjust size as needed + ), + ), + ), + ), + ), + ], + ), + ); + } + + Widget _buildCiTile(BuildContext context, Cheque cheque) { + return Card( + margin: const EdgeInsets.symmetric( + vertical: 8.0, + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(AppLocalizations.of(context).chequebookDetailsTitle, + style: Theme.of(context).textTheme.titleLarge), + const SizedBox(height: 8), + _buildInfoRow('Account Number:', _selectedAccount!.accountNo!), + _buildInfoRow('Customer Name:', _selectedAccount!.name!), + _buildInfoRow('CIF Number:', _selectedAccount!.cifNumber!), + _buildInfoRow('Account Type:', + _getAccountTypeDisplayName(_selectedAccount!.accountType!)), + _buildInfoRow('Branch Code:', cheque.branchCode), + _buildInfoRow('Starting Cheque Number:', cheque.fromCheque), + _buildInfoRow('Ending Cheque Number:', cheque.toCheque), + _buildInfoRow('Issue Date:', cheque.Date), + _buildInfoRow('Number of Cheques:', cheque.Chequescount), + _buildInfoRow('Instrument Type:', cheque.InstrType), + ], + ), + ), + ); + } + + Widget _buildInfoRow(String label, String? value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(label, style: const TextStyle(fontWeight: FontWeight.bold)), + Text(value ?? ''), + ], + ), + ); + } +} diff --git a/lib/features/cheque/screens/revoke_stop_single_screen.dart b/lib/features/cheque/screens/revoke_stop_single_screen.dart new file mode 100644 index 0000000..5f082e8 --- /dev/null +++ b/lib/features/cheque/screens/revoke_stop_single_screen.dart @@ -0,0 +1,331 @@ +// import 'dart:convert'; +// import 'package:dio/dio.dart'; +// import 'package:kmobile/data/models/user.dart'; +// import 'package:kmobile/di/injection.dart'; +// import 'package:flutter/material.dart'; +// import 'package:kmobile/api/services/cheque_service.dart'; +// import 'package:kmobile/features/fund_transfer/screens/transaction_pin_screen.dart'; +// import 'package:kmobile/l10n/app_localizations.dart'; + +// class RevokeStopSingleChequeScreen extends StatefulWidget { +// final User selectedAccount; +// final String date; +// final String instrType; +// final String fromCheque; +// final String toCheque; + +// const RevokeStopSingleChequeScreen( +// {super.key, +// required this.selectedAccount, +// required this.date, +// required this.instrType, +// required this.fromCheque, +// required this.toCheque}); + +// @override +// State createState() => _RevokeStopSingleChequeScreenState(); +// } + +// class _RevokeStopSingleChequeScreenState extends State { +// final _formKey = GlobalKey(); +// final _stopFromChequeNoController = TextEditingController(); +// final _stopIssueDateController = TextEditingController(); +// final _stopExpiryDateController = TextEditingController(); +// final _stopAmountController = TextEditingController(); +// final _chequeService = getIt(); + +// String? _selectedComment; +// final _otherCommentController = TextEditingController(); +// bool _showOtherCommentField = false; +// final List _commentOptions = [ +// 'Cheque Lost', +// 'Cheque Stolen', +// 'Cheque Missing', +// 'Cheque Damaged', +// 'Other' +// ]; + +// String _formatDate(String dateString) { +// if (dateString.length != 8) { +// return dateString; // Return as is if not in expected ddmmyyyy format +// } +// try { +// final day = dateString.substring(0, 2); +// final month = dateString.substring(2, 4); +// final year = dateString.substring(4, 8); +// return '$day/$month/$year'; +// } catch (e) { +// return dateString; // Return original string on error +// } +// } + +// Future _selectDate(TextEditingController controller) async { +// final DateTime? picked = await showDatePicker( +// context: context, +// initialDate: DateTime.now(), +// firstDate: DateTime.now(), +// lastDate: DateTime(2101), +// ); +// if (picked != null) { +// setState(() { +// controller.text = +// '${picked.day.toString().padLeft(2, '0')}/${picked.month.toString().padLeft(2, '0')}/${picked.year}'; +// }); +// } +// } + +// Future _showResponseDialog(String title, String message) async { +// return showDialog( +// context: context, +// barrierDismissible: false, // user must tap button! +// builder: (BuildContext context) { +// return AlertDialog( +// title: Text(title), +// content: SingleChildScrollView( +// child: ListBody( +// children: [ +// Text(message), +// ], +// ), +// ), +// actions: [ +// TextButton( +// child: Text(AppLocalizations.of(context).closeButton), +// onPressed: () { +// Navigator.of(context).pop(); +// }, +// ), +// ], +// ); +// }, +// ); +// } + +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// appBar: AppBar( +// title: const Text("Revoke Stop")), +// ); +// body: Padding( +// padding: const EdgeInsets.all(16.0), +// child: Form( +// key: _formKey, +// child: ListView( +// children: [ +// Card( +// elevation: 0, +// margin: const EdgeInsets.symmetric(vertical: 8.0), +// child: ListTile( +// leading: Image.asset( +// 'assets/images/logo.png', +// width: 40, +// height: 40, +// ), +// title: Text(widget.selectedAccount.accountNo!), +// subtitle: +// Text(AppLocalizations.of(context).accountNumberLabel), +// ), +// ), +// const SizedBox(height: 24), +// TextFormField( +// controller: _stopFromChequeNoController, +// decoration: InputDecoration( +// labelText: AppLocalizations.of(context).chequeNumberLabel, +// border: OutlineInputBorder(), +// errorMaxLines: 2, +// ), +// keyboardType: TextInputType.number, +// validator: (value) { +// if (value == null || value.isEmpty) { +// return AppLocalizations.of(context) +// .pleaseEnterChequeNumberError; +// } +// final chequeNumber = int.tryParse(value); +// final fromCheque = int.tryParse(widget.fromCheque); +// final toCheque = int.tryParse(widget.toCheque); +// if (chequeNumber == null || +// fromCheque == null || +// toCheque == null) { +// return AppLocalizations.of(context) +// .invalidChequeNumberFormatError; +// } +// if (chequeNumber < fromCheque || chequeNumber > toCheque) { +// return AppLocalizations.of(context).chequeNumberRangeError( +// widget.fromCheque, widget.toCheque); +// } +// return null; +// }, +// ), +// const SizedBox(height: 16), +// TextFormField( +// initialValue: widget.instrType, +// readOnly: true, +// decoration: InputDecoration( +// labelText: AppLocalizations.of(context).instrumentTypeLabel, +// border: const OutlineInputBorder(), +// ), +// ), +// const SizedBox(height: 16), +// TextFormField( +// controller: _stopIssueDateController, +// readOnly: true, +// onTap: () => _selectDate(_stopIssueDateController), +// decoration: InputDecoration( +// labelText: AppLocalizations.of(context).stopIssueDateLabel, +// border: const OutlineInputBorder(), +// suffixIcon: IconButton( +// icon: const Icon(Icons.calendar_today), +// onPressed: () => _selectDate(_stopIssueDateController), +// ), +// ), +// keyboardType: TextInputType.datetime, +// ), +// const SizedBox(height: 16), +// TextFormField( +// controller: _stopExpiryDateController, +// readOnly: true, +// onTap: () => _selectDate(_stopExpiryDateController), +// decoration: InputDecoration( +// labelText: AppLocalizations.of(context).stopExpiryDateLabel, +// border: const OutlineInputBorder(), +// suffixIcon: IconButton( +// icon: const Icon(Icons.calendar_today), +// onPressed: () => _selectDate(_stopExpiryDateController), +// ), +// ), +// keyboardType: TextInputType.datetime, +// ), +// const SizedBox(height: 16), +// TextFormField( +// controller: _stopAmountController, +// decoration: InputDecoration( +// labelText: AppLocalizations.of(context).stopAmountHint, +// border: const OutlineInputBorder(), +// ), +// keyboardType: TextInputType.number, +// ), +// const SizedBox(height: 16), +// DropdownButtonFormField( +// value: _selectedComment, +// items: _commentOptions.map((String value) { +// return DropdownMenuItem( +// value: value, +// child: Text(value), +// ); +// }).toList(), +// onChanged: (newValue) { +// setState(() { +// _selectedComment = newValue; +// _showOtherCommentField = newValue == 'Other'; +// }); +// }, +// decoration: InputDecoration( +// labelText: AppLocalizations.of(context).stopCommentHint, +// border: const OutlineInputBorder(), +// ), +// ), +// if (_showOtherCommentField) +// Padding( +// padding: const EdgeInsets.only(top: 16.0), +// child: TextFormField( +// controller: _otherCommentController, +// decoration: const InputDecoration( +// labelText: "Other Reasons :", +// border: OutlineInputBorder(), +// ), +// validator: (value) { +// return null; +// }, +// ), +// ), +// const SizedBox(height: 16), +// TextFormField( +// initialValue: _formatDate(widget.date), +// readOnly: true, +// decoration: InputDecoration( +// labelText: +// AppLocalizations.of(context).chequebookIssueDateHint, +// border: const OutlineInputBorder(), +// ), +// ), +// const SizedBox(height: 32), +// ElevatedButton( +// onPressed: () { +// if (_formKey.currentState!.validate()) { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (context) => TransactionPinScreen( +// onPinCompleted: (ctx, pin) async { +// Navigator.pop(context); +// try { +// final response = await _chequeService.revokeStop( +// accountno: widget.selectedAccount.accountNo!, +// stopFromChequeNo: +// _stopFromChequeNoController.text, +// instrType: widget.instrType, +// stopToChequeNo: +// _stopFromChequeNoController.text, +// stopIssueDate: _stopIssueDateController.text, +// stopExpiryDate: _stopExpiryDateController.text, +// stopAmount: _stopAmountController.text, +// stopComment: _selectedComment == 'Other' +// ? _otherCommentController.text +// : _selectedComment ?? '', +// chequeIssueDate: widget.date, +// tpin: pin, +// ); +// if (!mounted) return; +// final decodedResponse = jsonDecode(response); +// String responseString = response.toString(); // used as the case only for incorrect TPIN +// final status = decodedResponse['status']; +// final message = decodedResponse['message']; +// final code = decodedResponse['code']; +// if (status == 'SUCCESS') { +// _showResponseDialog('Success', message); +// } if (status == 'ERROR') { +// String errMessage = "error"; +// if(code == '0429') { +// errMessage = 'The selected Cheque is already stopped'; +// } else if(code == '0748') { +// errMessage = 'The selected Cheque is already presented'; +// } +// _showResponseDialog('Error', errMessage); +// } +// if(responseString.contains('INCORRECT_TPIN')){ +// _showResponseDialog('Invalid TPIN', +// 'The TPIN you entered is incorrect. Please try again.'); +// } +// } on DioException catch (e) { +// try { +// final errorBodyString = +// e.toString().split('Exception: ')[1]; +// final errorBody = jsonDecode(errorBodyString); +// if (errorBody.containsKey('error') && +// errorBody['error'] == 'INCORRECT_TPIN') { +// _showResponseDialog('Invalid TPIN', +// 'The TPIN you entered is incorrect. Please try again.'); +// } else { +// _showResponseDialog( +// 'Error', 'Internal Server Error'); +// } +// } catch (_) { +// _showResponseDialog( +// 'Error', 'Internal Server Error'); +// } +// } +// }, +// ), +// ), +// ); +// } +// }, +// child: Text("Revoke Stop"), +// ), +// ], +// ), +// ), +// ); +// } +// }