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.
deliveryboy/lib/delivrybookingdata.dart

780 lines
32 KiB

import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:google_maps_flutter_android/google_maps_flutter_android.dart';
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:watermanagement/model/getdeliveryboy_model.dart';
import 'package:watermanagement/settings.dart';
import 'order_tracking_page.dart';
class DelivryBookingData extends StatefulWidget {
const DelivryBookingData({Key? key}) : super(key: key);
@override
State<DelivryBookingData> createState() => _DelivryBookingDataState();
}
class _DelivryBookingDataState extends State<DelivryBookingData> with TickerProviderStateMixin {
bool isSupplierDataLoading=false;
bool isSereverIssue = false;
bool isSereverIssueConnected = false;
bool isSereverIssuePending = false;
String dropdownTypeOfPayment = 'Cash';
String dueAmount = '';
var typeOfPaymentItems = [
'Cash',
'Online',
];
TextEditingController amountPaidController = TextEditingController();
List<GetDeliveryboyDetailsModel> bookingDataList = [];
List<GetDeliveryboyDetailsModel> completedOrdersList = [];
List<GetDeliveryboyDetailsModel> activeOrdersList = [];
bool isLoading=false;
late TabController _controller;
final List<Tab> topTabs = <Tab>[
Tab(
child: Text('Active Orders',style: TextStyle(fontSize: 15),)
),
Tab(
child: Text('Completed Orders',style: TextStyle(fontSize: 15),)
),
];
Future<void> getBokkingsData() async {
isLoading = true;
try {
var response = await AppSettings.getdeliveryboybookings();
setState(() {
bookingDataList =
((jsonDecode(response)['data']) as List).map((dynamic model) {
return GetDeliveryboyDetailsModel.fromJson(model);
}).toList();
activeOrdersList=bookingDataList.where((product) => product.orderStatus.toString().toLowerCase()!='delivered').toList();
completedOrdersList=bookingDataList.where((product) => product.orderStatus.toString().toLowerCase()=='delivered').toList();
isLoading = false;
});
} catch (e) {
setState(() {
isLoading = false;
isSereverIssueConnected = true;
});
}
}
@override
void initState() {
// TODO: implement initState
_controller = TabController(vsync: this, length:2);
getBokkingsData();
super.initState();
}
showFinishOrderDialog(var obj) async {
return showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return AlertDialog(
title: Text('Finish Order'),
content: SingleChildScrollView(
child: ListBody(
children: [
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Text(obj.bookingid),
),
SizedBox(
height: 10,
),
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Text(obj.price),
),
SizedBox(
height: 10,
),
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: DropdownButtonFormField<String>(
// Initial Value
value: dropdownTypeOfPayment,
isExpanded: true,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.water,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Choose Type of Payment',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
hint: Text('Select Type of payment'),
// Down Arrow Icon
icon: const Icon(Icons.keyboard_arrow_down),
items: typeOfPaymentItems
.map<DropdownMenuItem<String>>(
(value) => new DropdownMenuItem<String>(
value: value,
child: new Text(value),
))
.toList(),
onChanged: (String? newValue) {
setState(() {
dropdownTypeOfPayment = newValue!;
});
},
),
),
SizedBox(
height: 10,
),
Container(
padding: const EdgeInsets.all(10),
child: TextFormField(
cursorColor: greyColor,
controller: amountPaidController,
textCapitalization: TextCapitalization.sentences,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.currency_rupee,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Amount Paid ',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
onChanged: (string) {
string = '${AppSettings.formNum(
string.replaceAll(',', ''),
)}';
amountPaidController.value = TextEditingValue(
text: string,
selection: TextSelection.collapsed(
offset: string.length,
),
);
setState(() {
if(amountPaidController.text.length>0){
dueAmount=(int.parse(obj.price)-int.parse(amountPaidController.text.replaceAll(',', ''))).toString();
}
else{
dueAmount=obj.price.toString();
}
});
},
),
),
Visibility(
visible: amountPaidController.text!='',
child: Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Text("Due:$dueAmount"),
),)
]
)),
actions: <Widget>[
TextButton(
child: Text('No', style: textButtonStyle()),
onPressed: () {
Navigator.of(context).pop();
amountPaidController.clear();
},
),
TextButton(
child: Text('Finish Order', style: textButtonStyle()),
onPressed: () async {
if(amountPaidController.text!=''){
String x='';
x =amountPaidController.text. replaceAll(',', '');
if(int.parse(x)<=int.parse(obj.price)){
var payload = new Map<String, dynamic>();
payload["amount_paid"] = amountPaidController.text.toString();
payload["payment_mode"] = dropdownTypeOfPayment.toString().toLowerCase();
payload["orderStatus"] = 'delivered';
bool updateStatus = await AppSettings.deliveryboyFinishOrder(obj.bookingid,payload);
if(updateStatus){
AppSettings.longSuccessToast('Status updated');
Navigator.of(context).pop();
amountPaidController.clear();
getBokkingsData();
}
else{
AppSettings.longFailedToast('failed to update the status');
Navigator.of(context).pop();
amountPaidController.clear();
}
}
else{
AppSettings.longFailedToast('Please enter valid amount paid');
}
}
else{
AppSettings.longFailedToast('Please provide amount paid');
}
},
),
],
);
});
});
}
Widget activeOrders(){
if (activeOrdersList.length != 0) {
return ListView.builder(
padding: EdgeInsets.all(8),
itemCount: activeOrdersList.length,
itemBuilder: (BuildContext context, int index) {
return Card(
child: Padding(
padding: EdgeInsets.all(8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
// width: MediaQuery.of(context).size.width * .75,
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text('TankerName :',
style: labelTextStyle()),
SizedBox(
width: 5.0,
),
Text(
activeOrdersList[index]
.tankerName
.toUpperCase(),
style: valuesTextStyle()),
],
),
Row(
children: [
Text('Bookingid :',
style: labelTextStyle()),
SizedBox(
width: 5.0,
),
Text(
activeOrdersList [index]
.bookingid
.toString(),
style: valuesTextStyle()),
],
),
Row(
children: [
Text('SupplierId :',
style: labelTextStyle()),
SizedBox(
width: 5.0,
),
Text(activeOrdersList[index].supplierId,
style: valuesTextStyle()),
],
),
Row(
children: [
Text('DateOfOrder :',
style: labelTextStyle()),
SizedBox(
width: 5.0,
),
Text(activeOrdersList[index].dateOfOrder,
style: valuesTextStyle()),
],
),
Row(
children: [
Text('Typeofwater :',
style: labelTextStyle()),
SizedBox(
width: 5.0,
),
Text(activeOrdersList[index].typeofwater,
style: valuesTextStyle()),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Column(
children: [
IconButton(
iconSize: 30,
icon: const Icon(
Icons.phone,
color: primaryColor,
),
onPressed: () async {
final Uri _phoneUri = Uri(
scheme: "tel",
path: activeOrdersList[index]
.delivery_agent_mobile);
try {
await launch(
_phoneUri.toString());
} catch (error) {
throw ("Cannot dial");
}
},
),
Text(
'Call now',
style: iconBelowTextStyle(),
),
],
),
SizedBox(
width: 30,
),
Column(
children: [
IconButton(
iconSize: 30,
icon: const Icon(
Icons.start,
color: primaryColor,
),
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(
builder: (__) => new OrderTrackingPage(lat:activeOrdersList[index].lat,lng:activeOrdersList[index].lng)));
/* Navigator.push(
context,
MaterialPageRoute(builder: (context) => OrderTrackingPage()),
);*/
},
),
Text(
'Start Trip',
style: iconBelowTextStyle(),
),
],
),
SizedBox(
width: 30,
),
Column(
children: [
IconButton(
iconSize: 30,
icon: Icon(
Icons.download,
color:activeOrdersList[index].tankerRunningStatus=='1'?Colors.red: Colors.green,
),
onPressed: () async{
if(activeOrdersList[index].tankerRunningStatus!='0'){
var payload = new Map<String, dynamic>();
payload["action"] = 'stop';
payload["percentage"] = '';
var capacity = await AppSettings.startAndStop(activeOrdersList[index].bookingid,payload);
print(capacity);
//var modelTanksViewList = jsonDecode(capacity)['data'];
setState(() {
activeOrdersList[index].tankerRunningStatus='0';
activeOrdersList[index].stopTime=jsonDecode(capacity)['stop time'];
});
}
else{
var payload = new Map<String, dynamic>();
payload["action"] = 'start';
payload["percentage"] = '';
var capacity = await AppSettings.startAndStop(activeOrdersList[index].bookingid,payload);
print(capacity);
//var modelTanksViewList = jsonDecode(capacity)['data'];
setState(() {
activeOrdersList[index].tankerRunningStatus='1';
activeOrdersList[index].startTime=jsonDecode(capacity)['start time'];
});
}
},
),
Text(
'Download Water',
style: iconBelowTextStyle(),
),
],
),
SizedBox(width: 10,),
],
),
SizedBox(height: 5,),
Row(children: [
Column(
children: [
Visibility(
visible:activeOrdersList[index].startTime!=''&&activeOrdersList[index].startTime!='null',
child:Row(
children: [
Text('Start Time:',style: labelTextStyle(),),
SizedBox(width: 5,),
Text(activeOrdersList[index].startTime,style: valuesTextStyle(),)
],
)),
SizedBox(height: 5,),
Visibility(
visible:activeOrdersList[index].stopTime!=''&&activeOrdersList[index].stopTime!='null',
child:Row(
children: [
Text('Stop Time:',style: labelTextStyle(),),
SizedBox(width: 5,),
Text(activeOrdersList[index].stopTime,style: valuesTextStyle(),)
],
))
],
),
SizedBox(width: 10,),
Visibility(
visible:activeOrdersList[index].stopTime!=''&&activeOrdersList[index].stopTime!='null',
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: primaryColor, // background
onPrimary: Colors.white, // foreground
),
onPressed: () {
showFinishOrderDialog(activeOrdersList[index]);
},
child: const Text('Finish')),)
],)
],
),
),
],
),
),
);
});
}
else {
return Center(
child: Padding(
padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
child: isSereverIssueConnected
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: AssetImage('images/serverissue.png'),
// height: MediaQuery.of(context).size.height * .10,
),
SizedBox(
height: 20,
),
Text(
'There is an issue at server please try after some time',style:serverIssueTextStyle() ,),
],
)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: AssetImage('images/no_data.png'),
// height: MediaQuery.of(context).size.height * .10,
),
SizedBox(
height: 20,
),
Text(
'No Connected Tankers',style:serverIssueTextStyle() ,),
],
),
));
}
}
modelBottomSheet(var obj){
showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return SizedBox(
height: MediaQuery.of(context).size.height * .300,
child: Padding(
padding: EdgeInsets.all(10),
child: Row(
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Tanker Name :', style: labelTextStyle()),
Text('Capacity Of Tanker :', style: labelTextStyle()),
Text('Booking Id :', style: labelTextStyle()),
Text('Date Of Order :', style: labelTextStyle()),
Text('Type Of Water :', style: labelTextStyle()),
Text('Start Time :', style: labelTextStyle()),
Text('Stop Time :', style: labelTextStyle()),
Text('Initial Water Level :', style: labelTextStyle()),
Text('Final Water Level :', style: labelTextStyle()),
Text('Delivered Water :', style: labelTextStyle()),
Text('Actual Price :', style: labelTextStyle()),
Text('Amount Paid :', style: labelTextStyle()),
Text('Amount Due :', style: labelTextStyle()),
Text('Payment Mode :', style: labelTextStyle()),
],
),
Expanded(
child:Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(obj.tankerName,
style: valuesTextStyle()),
Text(obj.capacity+' Ltrs',
style: valuesTextStyle()),
Text(obj.bookingid,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.dateOfOrder,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.typeofwater,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.startTime,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.stopTime,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.initialWaterLevel+' Ltrs',
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.finalWaterLevel+' Ltrs',
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.deliverdWater+' Ltrs',
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.price,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.amountPaid,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.amountDue,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(obj.paymentMode,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
],
),
),
],
),
)
);
},
);
}
Widget completedOrders(){
if (completedOrdersList.length != 0) {
return ListView.builder(
padding: EdgeInsets.all(8),
itemCount: completedOrdersList.length,
itemBuilder: (BuildContext context, int index) {
return Card(
child: Padding(
padding: EdgeInsets.all(8),
child: Container(
child:Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Tanker Name :', style: labelTextStyle()),
Text('Booking Id :', style: labelTextStyle()),
Text('Date Of Order :', style: labelTextStyle()),
],
),
Expanded(
child:Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(completedOrdersList[index].tankerName,
style: valuesTextStyle()),
Text(completedOrdersList[index].bookingid,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
Text(completedOrdersList[index].dateOfOrder,
style:TextStyle(fontSize: 12,fontWeight: FontWeight.bold,overflow: TextOverflow.ellipsis,)),
],
),
),
Expanded(
child: TextButton(
onPressed: () {
modelBottomSheet(completedOrdersList[index]);
},
child: const Text(
'More Details',
style: TextStyle(
color: primaryColor,
fontSize: 15,
decoration: TextDecoration.underline,
),
),
),
)
],
)
)
),
);
});
}
else {
return Center(
child: Padding(
padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
child: isSereverIssueConnected
? Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: AssetImage('images/serverissue.png'),
// height: MediaQuery.of(context).size.height * .10,
),
SizedBox(
height: 20,
),
Text(
'There is an issue at server please try after some time',style:serverIssueTextStyle() ,),
],
)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image(
image: AssetImage('images/no_data.png'),
// height: MediaQuery.of(context).size.height * .10,
),
SizedBox(
height: 20,
),
Text(
'No Connected Tankers',style:serverIssueTextStyle() ,),
],
),
));
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Booking Data'),
backgroundColor: primaryColor,
bottom: TabBar(
controller: _controller,
tabs: topTabs,
indicatorColor: Colors.blue,
unselectedLabelColor: Colors.white60,
indicatorWeight: 2,
),),
/* body: */
body: TabBarView(controller: _controller, children: [
Container(
//color: Colors.lightBlueAccent,
child: isLoading?Center(
child: CircularProgressIndicator(
color: primaryColor,
strokeWidth: 5.0,
),
):activeOrders(),
),
Container(
//color: Colors.lightBlueAccent,
child: isLoading?Center(
child: CircularProgressIndicator(
color: primaryColor,
strokeWidth: 5.0,
),
):completedOrders(),
),
]),
);
}
}