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.
521 lines
9.7 KiB
521 lines
9.7 KiB
import 'dart:convert';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:supplier_new/common/settings.dart';
|
|
import '../resources/drivers_model.dart';
|
|
import '../resources/tankers_model.dart';
|
|
import '../resources/source_loctaions_model.dart';
|
|
|
|
class AssignTankerScreen extends StatefulWidget {
|
|
|
|
final order;
|
|
final List<DriversModel> driversList;
|
|
final List<TankersModel> tankersList;
|
|
final List<SourceLocationsModel> sourceLocationsList;
|
|
|
|
AssignTankerScreen({
|
|
this.order,
|
|
required this.driversList,
|
|
required this.tankersList,
|
|
required this.sourceLocationsList,
|
|
});
|
|
|
|
@override
|
|
State<AssignTankerScreen> createState() =>
|
|
_AssignTankerScreenState();
|
|
}
|
|
|
|
class _AssignTankerScreenState
|
|
extends State<AssignTankerScreen> {
|
|
|
|
int? selectedTankerIndex;
|
|
int? selectedDriverIndex;
|
|
int? selectedSourceIndex;
|
|
|
|
int _capToLiters(dynamic cap){
|
|
|
|
if(cap==null)return -1;
|
|
|
|
if(cap is num){
|
|
return cap.round();
|
|
}
|
|
|
|
final s=cap
|
|
.toString()
|
|
.toLowerCase()
|
|
.replaceAll(',','')
|
|
.trim();
|
|
|
|
final match=
|
|
RegExp(r'(\d+(\.\d+)?)')
|
|
.firstMatch(s);
|
|
|
|
if(match==null)return -1;
|
|
|
|
final n=
|
|
double.tryParse(match.group(1)!)??-1;
|
|
|
|
if(n<0)return -1;
|
|
|
|
if(s.contains('kl')){
|
|
return (n*1000).round();
|
|
}
|
|
|
|
return n.round();
|
|
|
|
}
|
|
|
|
DateTime parseOrderDateTime(){
|
|
|
|
DateTime d=
|
|
DateFormat("dd-MMM-yyyy")
|
|
.parse(widget.order.date);
|
|
|
|
DateTime t=
|
|
DateFormat("hh:mm a")
|
|
.parse(widget.order.time);
|
|
|
|
return DateTime(
|
|
d.year,
|
|
d.month,
|
|
d.day,
|
|
t.hour,
|
|
t.minute
|
|
);
|
|
|
|
}
|
|
|
|
bool isTankerBlocked(
|
|
TankersModel tanker){
|
|
|
|
if(tanker.blocked_dates==null ||
|
|
tanker.blocked_dates.isEmpty){
|
|
return false;
|
|
}
|
|
|
|
DateTime orderDT=
|
|
parseOrderDateTime();
|
|
|
|
for(var slot
|
|
in tanker.blocked_dates){
|
|
|
|
if(slot['date']!=
|
|
widget.order.date){
|
|
continue;
|
|
}
|
|
|
|
String timeRange=
|
|
slot['time'];
|
|
|
|
List parts=
|
|
timeRange.split("to");
|
|
|
|
if(parts.length!=2){
|
|
continue;
|
|
}
|
|
|
|
DateTime start=
|
|
DateFormat("hh:mm a")
|
|
.parse(parts[0].trim());
|
|
|
|
DateTime end=
|
|
DateFormat("hh:mm a")
|
|
.parse(parts[1].trim());
|
|
|
|
DateTime startDT=
|
|
DateTime(
|
|
orderDT.year,
|
|
orderDT.month,
|
|
orderDT.day,
|
|
start.hour,
|
|
start.minute
|
|
);
|
|
|
|
DateTime endDT=
|
|
DateTime(
|
|
orderDT.year,
|
|
orderDT.month,
|
|
orderDT.day,
|
|
end.hour,
|
|
end.minute
|
|
);
|
|
|
|
if(orderDT.isAfter(startDT)
|
|
&&
|
|
orderDT.isBefore(endDT)){
|
|
return true;
|
|
}
|
|
|
|
if(orderDT==startDT ||
|
|
orderDT==endDT){
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
String? getDriverBlockedTime(
|
|
DriversModel driver){
|
|
|
|
if(driver.blocked_dates==null ||
|
|
driver.blocked_dates.isEmpty){
|
|
return null;
|
|
}
|
|
|
|
DateTime orderDT=
|
|
parseOrderDateTime();
|
|
|
|
for(var slot
|
|
in driver.blocked_dates){
|
|
|
|
if(slot['date']!=
|
|
widget.order.date){
|
|
continue;
|
|
}
|
|
|
|
String timeRange=
|
|
slot['time'];
|
|
|
|
List parts=
|
|
timeRange.split("to");
|
|
|
|
if(parts.length!=2){
|
|
continue;
|
|
}
|
|
|
|
DateTime start=
|
|
DateFormat("hh:mm a")
|
|
.parse(parts[0].trim());
|
|
|
|
DateTime end=
|
|
DateFormat("hh:mm a")
|
|
.parse(parts[1].trim());
|
|
|
|
DateTime startDT=
|
|
DateTime(
|
|
orderDT.year,
|
|
orderDT.month,
|
|
orderDT.day,
|
|
start.hour,
|
|
start.minute
|
|
);
|
|
|
|
DateTime endDT=
|
|
DateTime(
|
|
orderDT.year,
|
|
orderDT.month,
|
|
orderDT.day,
|
|
end.hour,
|
|
end.minute
|
|
);
|
|
|
|
if(orderDT.isAfter(startDT)
|
|
&&
|
|
orderDT.isBefore(endDT)){
|
|
return timeRange;
|
|
}
|
|
|
|
if(orderDT==startDT ||
|
|
orderDT==endDT){
|
|
return timeRange;
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context){
|
|
|
|
return Scaffold(
|
|
|
|
backgroundColor: Colors.white,
|
|
|
|
appBar: AppBar(
|
|
|
|
title:
|
|
Text("Assign Tanker"),
|
|
|
|
),
|
|
|
|
body:
|
|
|
|
Column(
|
|
|
|
children:[
|
|
|
|
Expanded(
|
|
|
|
child:
|
|
|
|
SingleChildScrollView(
|
|
|
|
padding:
|
|
EdgeInsets.all(16),
|
|
|
|
child:
|
|
|
|
Column(
|
|
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
|
|
children:[
|
|
|
|
/// ORDER CARD
|
|
|
|
Container(
|
|
|
|
padding:
|
|
EdgeInsets.all(12),
|
|
|
|
decoration:
|
|
BoxDecoration(
|
|
|
|
borderRadius:
|
|
BorderRadius.circular(12),
|
|
|
|
border:
|
|
Border.all(
|
|
color:
|
|
Color(0XFFC9C2F0)
|
|
),
|
|
|
|
),
|
|
|
|
child:
|
|
|
|
Row(
|
|
|
|
children:[
|
|
|
|
Column(
|
|
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
|
|
children:[
|
|
|
|
Text(
|
|
widget.order.building_name
|
|
),
|
|
|
|
Text(
|
|
widget.order.displayAddress
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
Spacer(),
|
|
|
|
Text(
|
|
"${widget.order.distanceInKm} Km"
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
SizedBox(height:20),
|
|
|
|
/// TANKERS
|
|
|
|
Text("SELECT TANKER"),
|
|
|
|
SizedBox(height:10),
|
|
|
|
...widget.tankersList
|
|
.where((t)=>
|
|
|
|
_capToLiters(t.capacity)==
|
|
_capToLiters(widget.order.capacity)
|
|
|
|
).toList()
|
|
.asMap()
|
|
.entries
|
|
.map((entry){
|
|
|
|
int idx=
|
|
entry.key;
|
|
|
|
var d=
|
|
entry.value;
|
|
|
|
bool blocked=
|
|
isTankerBlocked(d);
|
|
|
|
return GestureDetector(
|
|
|
|
onTap:blocked?null:(){
|
|
|
|
setState(() {
|
|
|
|
selectedTankerIndex=
|
|
idx;
|
|
|
|
selectedDriverIndex=
|
|
null;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
child:
|
|
|
|
Card(
|
|
|
|
child:
|
|
|
|
Padding(
|
|
|
|
padding:
|
|
EdgeInsets.all(12),
|
|
|
|
child:
|
|
|
|
Text(
|
|
d.tanker_name
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}).toList(),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
/// ASSIGN BUTTON
|
|
|
|
Padding(
|
|
|
|
padding:
|
|
EdgeInsets.all(16),
|
|
|
|
child:
|
|
|
|
SizedBox(
|
|
|
|
width:double.infinity,
|
|
|
|
child:
|
|
|
|
ElevatedButton(
|
|
|
|
style:
|
|
ElevatedButton.styleFrom(
|
|
|
|
backgroundColor:
|
|
Color(0XFF8270DB)
|
|
|
|
),
|
|
|
|
onPressed:()async{
|
|
|
|
if(selectedTankerIndex==null){
|
|
|
|
AppSettings
|
|
.longFailedToast(
|
|
"Select tanker"
|
|
);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
final selectedTanker=
|
|
widget.tankersList[
|
|
selectedTankerIndex!
|
|
];
|
|
|
|
final selectedDriver=
|
|
selectedDriverIndex!=null
|
|
?
|
|
widget.driversList[
|
|
selectedDriverIndex!
|
|
]
|
|
:
|
|
null;
|
|
|
|
final selectedSource=
|
|
selectedSourceIndex!=null
|
|
?
|
|
widget.sourceLocationsList[
|
|
selectedSourceIndex!
|
|
]
|
|
:
|
|
null;
|
|
|
|
var payload={};
|
|
|
|
payload["tankerName"]=
|
|
selectedTanker.tanker_name;
|
|
|
|
payload["delivery_agent"]=
|
|
selectedDriver?.driver_name;
|
|
|
|
payload["delivery_agent_mobile"]=
|
|
selectedDriver?.phone_number;
|
|
|
|
payload["water_source_location"]=
|
|
selectedSource?.source_name;
|
|
|
|
bool status=
|
|
await AppSettings
|
|
.assignTanker(
|
|
payload,
|
|
widget.order.dbId
|
|
);
|
|
|
|
if(status){
|
|
|
|
AppSettings
|
|
.longSuccessToast(
|
|
"Assigned"
|
|
);
|
|
|
|
Navigator.pop(
|
|
context,
|
|
true
|
|
);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
child:
|
|
|
|
Text("Assign"),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} |