You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

225 lines
8.4 KiB

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:qr_flutter/qr_flutter.dart';
import '../common/settings.dart';
import 'all_orders.dart';
class CollectMoney extends StatefulWidget {
var details;
CollectMoney({this.details});
@override
State<CollectMoney> createState() => _CollectMoneyState();
}
class _CollectMoneyState extends State<CollectMoney> {
String collectAmountInRupees = '';
@override
void initState() {
super.initState();
// Safe parsing of amount_due (avoid NaN)
String raw = widget.details.amount_due?.toString() ?? "";
double? parsed = double.tryParse(raw);
if (parsed == null || parsed.isNaN) {
collectAmountInRupees = "0";
} else {
collectAmountInRupees = parsed.toStringAsFixed(0);
}
}
String formatDeliveredDate() {
final now = DateTime.now();
// Month names
const months = [
"Jan","Feb","Mar","Apr","May","Jun",
"Jul","Aug","Sep","Oct","Nov","Dec"
];
String day = now.day.toString().padLeft(2, '0');
String month = months[now.month - 1];
String year = now.year.toString();
int hour12 = now.hour > 12 ? now.hour - 12 : (now.hour == 0 ? 12 : now.hour);
String hour = hour12.toString();
String minute = now.minute.toString().padLeft(2, '0');
String ampm = now.hour >= 12 ? "PM" : "AM";
return "$day-$month-$year $hour:$minute $ampm";
}
@override
Widget build(BuildContext context) {
// --------------------------------------------
// 🔥 UPI QR GENERATION
// --------------------------------------------
String upiId = widget.details.supplier_upi_id ?? "";
String supplierName =
Uri.encodeComponent(widget.details.supplier_name ?? "Supplier");
String qrData =
"upi://pay?pa=$upiId&pn=$supplierName&am=$collectAmountInRupees&cu=INR&mam=1";
// --------------------------------------------
return
WillPopScope(
onWillPop: () async {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (_) => AllOrders(navigationFrom:"")),
(route) => false,
);
return false;
},
child: Scaffold(
backgroundColor: Color(0XFFFFFFFF),
appBar: AppSettings.appBarWithNotificationIcon(
widget.details.building_name,
widget.details.type_of_water,
widget.details.capacity,
context,
),
body: SafeArea(
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(),
child: Padding(
padding: const EdgeInsets.fromLTRB(16, 8, 16, 24),
child: Align(
alignment: const Alignment(0, -0.25),
child: Container(
width: double.infinity,
constraints: const BoxConstraints(maxWidth: 520),
padding: const EdgeInsets.fromLTRB(16, 18, 16, 16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: const Color(0xFFEDEDED)),
boxShadow: const [
BoxShadow(
color: Colors.black12,
blurRadius: 10,
offset: Offset(0, 4)),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 4),
Text(
'Collect money',
style: fontTextStyle(
16, const Color(0xFF7E7F80), FontWeight.w500),
),
const SizedBox(height: 6),
// AMOUNT
Text(
'$collectAmountInRupees',
style: fontTextStyle(
24, const Color(0xFF343637), FontWeight.w600),
),
const SizedBox(height: 16),
// --------------------------------------------
// 🔥 QR Code Box
// --------------------------------------------
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: const Color(0xFFE0E0E0)),
),
padding: const EdgeInsets.all(12),
child: QrImageView(
data: qrData,
size: 200,
gapless: true,
backgroundColor: Colors.white,
),
),
const SizedBox(height: 18),
// CONTINUE BUTTON
SizedBox(
width: double.infinity,
height: 48,
child: ElevatedButton(
onPressed: () async {
AppSettings.preLoaderDialog(context);
bool isOnline =
await AppSettings.internetConnectivity();
if (!isOnline) {
Navigator.of(context, rootNavigator: true).pop();
AppSettings.longFailedToast(
"Please Check Internet");
return;
}
var payload = {
"amount_paid": widget.details.amount_paid,
"payment_mode": widget.details.payment_mode,
"orderStatus": "completed",
"deliveredDate": formatDeliveredDate(),
};
// 🔥 Call API
var response = await AppSettings.amountpaidByCustomer(
widget.details.bookingid, payload);
Navigator.of(context, rootNavigator: true)
.pop(); // CLOSE LOADER
if (response.isNotEmpty) {
// Decode JSON
var json = jsonDecode(response);
if (json["status_code"] == 200) {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (_) => AllOrders(navigationFrom:"")),
(route) => false,
);
return;
} else {}
AppSettings.longFailedToast(
json["msg"] ?? "Invalid OTP");
return;
}
// TODO: Navigate home
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.black,
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(24),
),
),
child: Text(
'Continue to Home',
style: fontTextStyle(14, Colors.white, FontWeight.w600),
),
),
),
],
),
),
),
),
),
),
));
}
}