second commit
This commit is contained in:
236
lib/Controller/Dashboard/Dashboardcontroller.dart
Normal file
236
lib/Controller/Dashboard/Dashboardcontroller.dart
Normal file
@@ -0,0 +1,236 @@
|
||||
import 'package:flutter/material.dart' hide Notification;
|
||||
import 'package:get/get.dart' hide Response;
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import '../../Data/Repository/Notification/Notificationrepository.dart';
|
||||
import '../../Data/Repository/Rider/get_rider_repo.dart';
|
||||
import '../../Data/Repository/Summary/ordersrepository.dart';
|
||||
import '../../Data/Repository/Tenants/Tenantsrepository.dart';
|
||||
import '../../Data/Repository/update_delivery/update_delivery.dart';
|
||||
import '../../Helper/Constants/Colorconstants.dart';
|
||||
import '../../Helper/Logger.dart';
|
||||
import '../../Helper/customDio.dart';
|
||||
import '../../Helper/toast.dart';
|
||||
import '../../Model/Request/Notification/Notification_request_rider.dart';
|
||||
import '../../Model/Request/Notification/Notificationrequest.dart';
|
||||
import '../../Model/Request/update_delivery/update_delivery.dart';
|
||||
import '../../Model/Response/Notification/Notificationresponse.dart';
|
||||
import '../../Model/Response/Riders/get_rider_model.dart';
|
||||
import '../../Model/Response/Summary/Getsummarysresponse.dart';
|
||||
import '../../Model/Response/Tenants/Tenantinforesponse.dart';
|
||||
import '../../Model/Response/update_delivery_response/update_delivery_response.dart';
|
||||
import '../../View/Home/Homeview.dart';
|
||||
|
||||
class DashboardController extends GetxController with SingleGetTickerProviderMixin{
|
||||
|
||||
String? userName;
|
||||
String? businessName;
|
||||
String? businessLocation;
|
||||
String? adminToken;
|
||||
String? currentTime;
|
||||
String? notificationDate;
|
||||
TenantDetails? tenantInfo;
|
||||
int tenantId = 0;
|
||||
int moduleId = 0;
|
||||
int locationId = 0;
|
||||
int tabIndex = 0;
|
||||
int? approved;
|
||||
|
||||
var orderId;
|
||||
var orderHeaderId;
|
||||
var userId;
|
||||
|
||||
DateTime? now;
|
||||
|
||||
late TabController tabController;
|
||||
|
||||
OrderSummaryRepository orderSummaryRepository = OrderSummaryRepository();
|
||||
TenantRepository tenantRepository = TenantRepository();
|
||||
|
||||
List <GetRiderDetails> riderDetails = [];
|
||||
RidersRepository ridersRepository = RidersRepository();
|
||||
|
||||
|
||||
final List<Tab> tabs = <Tab>[
|
||||
Tab(
|
||||
text: "Placed",
|
||||
icon: Icon(Icons.access_time_filled_outlined,color: ColorConstants.primaryColor,size: 25,),
|
||||
),
|
||||
Tab(
|
||||
text: "OnGoing",
|
||||
icon: Icon(Icons.rotate_right,color: ColorConstants.primaryColor,size: 25,),
|
||||
),
|
||||
Tab(
|
||||
text: "Cancelled",
|
||||
icon: Icon(Icons.cancel,color: ColorConstants.primaryColor,size: 25,),
|
||||
),
|
||||
Tab(
|
||||
text: "Completed",
|
||||
icon: Icon(Icons.check_circle,color: ColorConstants.primaryColor,size: 25,),
|
||||
),
|
||||
|
||||
|
||||
];
|
||||
|
||||
getDetails() async{
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
// userName = prefs.getString('userName')??'';
|
||||
businessName = prefs.getString('tenantName')??'';
|
||||
businessLocation = prefs.getString('locationName')??'';
|
||||
logger.i('Business Name prefs: ${businessName}');
|
||||
logger.i('Business Locations prefs: ${businessLocation}');
|
||||
update();
|
||||
}
|
||||
|
||||
getTenantInfo() async{
|
||||
TenantInfo? result = await tenantRepository.getTenantInfo();
|
||||
tenantInfo = result?.details;
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
prefs.setString('tenantName', tenantInfo?.tenantname ?? '');
|
||||
prefs.setString('locationName', tenantInfo?.applocation ?? '');
|
||||
prefs.setInt('tenantId', tenantInfo?.tenantid ?? 0);
|
||||
prefs.setInt('categoryId', tenantInfo?.categoryid ?? 0);
|
||||
prefs.setInt('locationId', result?.details?.locationid ?? 0);
|
||||
logger.i('Business Locations : ${businessLocation}');
|
||||
approved = result?.details?.approved;
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
getOrders()async{
|
||||
|
||||
}
|
||||
|
||||
|
||||
getRiders(appLocationId)async{
|
||||
GetRiderPoolsModel? result = await ridersRepository.getRiders(appLocationId);
|
||||
getRidersResult(result!);
|
||||
}
|
||||
|
||||
bool isSelectAll = false;
|
||||
List riderFcmToken = [];
|
||||
int? riderUserIdList;
|
||||
int? partnerId;
|
||||
int? shiftId;
|
||||
String? riderStatus;
|
||||
RxBool shimmer = true.obs;
|
||||
String? assignTime;
|
||||
bool isIdle = false;
|
||||
|
||||
|
||||
getRidersResult(GetRiderPoolsModel data){
|
||||
if (data.code == 200) {
|
||||
logger.i('RiderPool ${data.details}');
|
||||
if(data.details!.isNotEmpty) {
|
||||
for (int i = 0; i < data.details!.length; i++) {
|
||||
var index = riderDetails.indexWhere(
|
||||
(element) =>
|
||||
element.userid == data.details![i].userid);
|
||||
if (index == -1) {
|
||||
riderDetails.add(data.details![i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
logger.i('riderDetails $riderDetails');
|
||||
if (isSelectAll == true) {
|
||||
riderFcmToken.clear();
|
||||
riderUserIdList = 0;
|
||||
partnerId = 0;
|
||||
shiftId =0;
|
||||
riderStatus = '';
|
||||
|
||||
for (var riderDetail in riderDetails) {
|
||||
riderFcmToken.add(riderDetail.userfcmtoken);
|
||||
riderUserIdList = riderDetail.userid!;
|
||||
partnerId = riderDetail.partnerid!;
|
||||
shiftId = riderDetail.shiftid!;
|
||||
riderStatus = riderDetail.status;
|
||||
print('shiftId $shiftId');
|
||||
}
|
||||
} else {
|
||||
riderFcmToken.clear();
|
||||
riderUserIdList = 0;
|
||||
partnerId = 0;
|
||||
shiftId =0;
|
||||
riderStatus = '';
|
||||
}
|
||||
logger.i('riderFcmToken $riderFcmToken');
|
||||
logger.i('partnerIdinprint $partnerId');
|
||||
logger.i('shiftId $shiftId');
|
||||
logger.i('riderStatus $riderStatus');
|
||||
shimmer.value = false;
|
||||
update();
|
||||
}
|
||||
else {
|
||||
shimmer.value = false;
|
||||
update();
|
||||
Toast.showToast("${data.message}");
|
||||
}
|
||||
}
|
||||
|
||||
updateDelivery(DeliveriesDetails data)async{
|
||||
assignTime = DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now());
|
||||
|
||||
updateDeliveryResult(
|
||||
UpdateDeliveryRequest(
|
||||
deliveryid: data.deliveryid,
|
||||
userid: riderUserIdList,
|
||||
orderheaderid: data.orderheaderid,
|
||||
assigntime:assignTime ,
|
||||
orderstatus: 'pending',
|
||||
),
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
UpdateDeliveryRepository updateDeliveryRepository = UpdateDeliveryRepository();
|
||||
|
||||
updateDeliveryResult(UpdateDeliveryRequest data)async{
|
||||
UpdateDeliveryResponse? result = await updateDeliveryRepository.updateDelivery(data);
|
||||
if(result?.status == true){
|
||||
Get.to(()=>HomeView(selectedIndex: 1));
|
||||
// sendRiderNotification();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
sendRiderNotification() async {
|
||||
sendRiderNotificationResult(
|
||||
RiderNotificationRequest(
|
||||
notification: NotificationRider(
|
||||
title: "NearleXpress",
|
||||
image: "",
|
||||
body: "Order have been placed for delivery",
|
||||
sound: "ring",
|
||||
),
|
||||
token: riderFcmToken.join(','),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
final NotificationRepository notificationRepository = NotificationRepository();
|
||||
|
||||
//
|
||||
sendRiderNotificationResult(RiderNotificationRequest data)async{
|
||||
NotificationResponse? result = await notificationRepository.notifyRider(data);
|
||||
if(result?.status == true){
|
||||
Toast.showToast('Notified Rider Successfully');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
tabController = TabController(vsync: this, length: tabs.length);
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
getDetails(); // Runs after first frame is rendered
|
||||
});
|
||||
logger.i('controller Init state called : ');
|
||||
//getTenantInfo();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../../../Helper/Constants/Colorconstants.dart';
|
||||
|
||||
class DropCustomerTabController extends GetxController with SingleGetTickerProviderMixin{
|
||||
|
||||
|
||||
late TabController tabController;
|
||||
int tabIndex = 0;
|
||||
|
||||
final List<Tab> tabs = <Tab>[
|
||||
Tab(
|
||||
icon:Icon(
|
||||
Icons.person,
|
||||
color: ColorConstants.primaryColor,
|
||||
size: 25,
|
||||
),
|
||||
text: "From Customer",
|
||||
),
|
||||
// // Tab(text: "Yesterday",),
|
||||
Tab(
|
||||
text: "From Business",
|
||||
icon: Icon(
|
||||
Icons.business,
|
||||
color: ColorConstants.primaryColor,
|
||||
size: 25,
|
||||
),
|
||||
),
|
||||
|
||||
];
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
tabController = TabController(vsync: this, length: tabs.length);
|
||||
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,239 @@
|
||||
import 'package:country_currency_pickers/country.dart';
|
||||
import 'package:country_currency_pickers/utils/utils.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:geocoding/geocoding.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'dart:io';
|
||||
import '../../../../../../../Data/Repository/Createcustomer/Createcustomerrepository.dart';
|
||||
import '../../../../../../../Globalwidgets/Googleplaces/Googleplaces.dart';
|
||||
import '../../../../../../../Helper/Locationservice/Locationservice.dart';
|
||||
import '../../../../../../../Helper/location_service.dart';
|
||||
import '../../../../../../../Helper/toast.dart';
|
||||
import '../../../../../../../Model/Request/Createcustomer/Createcustomerrequest.dart';
|
||||
import '../../../../../../../Model/Response/Createcustomer/Createcustomerresponse.dart';
|
||||
import '../../../../../../../View/Createorder/Createorderview.dart';
|
||||
import '../../../../../../Createorder/Createordercontroller.dart';
|
||||
import '../../Tenantcustomercontroller.dart';
|
||||
|
||||
|
||||
class AddDropCustomerController extends GetxController{
|
||||
|
||||
String? latitude;
|
||||
String? longitude;
|
||||
|
||||
String? suburb;
|
||||
String? city;
|
||||
String? state;
|
||||
String? postCode;
|
||||
|
||||
int? tenantId;
|
||||
int? appLocationId;
|
||||
|
||||
|
||||
|
||||
bool progress = true;
|
||||
|
||||
TextEditingController customerFirstNameController = TextEditingController();
|
||||
TextEditingController customerLastNameController = TextEditingController();
|
||||
TextEditingController customerPhoneController = TextEditingController();
|
||||
TextEditingController addressController = TextEditingController();
|
||||
TextEditingController doorNoController = TextEditingController();
|
||||
TextEditingController landMarkController = TextEditingController();
|
||||
|
||||
|
||||
Position? resultPosition;
|
||||
|
||||
final searchText = ''.obs;
|
||||
final predictions = <Map<String, dynamic>>[].obs;
|
||||
final selectedPlace = {}.obs;
|
||||
|
||||
Country selectedDialogCountry = CountryPickerUtils.getCountryByIsoCode('IN');
|
||||
|
||||
final GooglePlacesService placesService = GooglePlacesService();
|
||||
|
||||
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
|
||||
|
||||
CreateCustomerRepository createCustomerRepository = CreateCustomerRepository();
|
||||
|
||||
TenantDropCustomerController tenantDropCustomerController = Get.put(TenantDropCustomerController());
|
||||
CreateOrderController createOrderController = Get.put(CreateOrderController());
|
||||
|
||||
|
||||
|
||||
LocationService locationService = LocationService();
|
||||
|
||||
|
||||
|
||||
getLocation() async {
|
||||
resultPosition = await locationService.getLocation();
|
||||
progress =false;
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
void onSearchTextChanged(String text) async {
|
||||
searchText.value = text;
|
||||
if (text.length > 2) {
|
||||
try {
|
||||
final places = await placesService.getPlacesPredictions(text);
|
||||
predictions.assignAll(places);
|
||||
update();
|
||||
} catch (e) {
|
||||
print('Error fetching predictions: $e');
|
||||
}
|
||||
} else {
|
||||
predictions.clear();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getPlaceDetails(String placeId,locationAddress) async {
|
||||
try {
|
||||
final details = await placesService.getPlaceDetails(placeId);
|
||||
selectedPlace.value = details;
|
||||
print('getPlaceDetailslatitude ${selectedPlace['geometry']['location']['lat']}');
|
||||
print('getPlaceDetailslongitude ${selectedPlace['geometry']['location']['lng']}');
|
||||
getAddressFromLatLng(selectedPlace['geometry']['location']['lat'],selectedPlace['geometry']['location']['lng'],locationAddress);
|
||||
} catch (e) {
|
||||
print('Error fetching place details: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getAddressFromLatLng(double latitudes, double longitudes,address) async {
|
||||
await placemarkFromCoordinates(latitudes, longitudes).then((List<Placemark> placemarks) {
|
||||
Placemark place = placemarks[0];
|
||||
latitude = double.parse(latitudes.toString()).toString();
|
||||
longitude = double.parse(longitudes.toString()).toString();
|
||||
city = '${place.locality}';
|
||||
state = '${place.administrativeArea}';
|
||||
suburb = place.subLocality!.isNotEmpty?place.subLocality:place.street;
|
||||
postCode = '${place.postalCode}';
|
||||
addressController.text = address;
|
||||
predictions.clear();
|
||||
update();
|
||||
print('latitude $latitude');
|
||||
print('longitude $longitude');
|
||||
print('eng $suburb');
|
||||
print('city $city');
|
||||
print('state $state');
|
||||
print('postalCode $postCode');
|
||||
print('subAdministrativeArea ${place.subAdministrativeArea}');
|
||||
print('subThoroughfare ${place.subThoroughfare}');
|
||||
print('currentLocationAddress ${addressController.text}');
|
||||
print('streetss ${place.street}');
|
||||
|
||||
}).catchError((e) {
|
||||
debugPrint(e);
|
||||
});
|
||||
}
|
||||
|
||||
describeValidation(){
|
||||
if(customerFirstNameController.text.isEmpty){
|
||||
btnController.reset();
|
||||
Toast.showToast("Please enter your first name");
|
||||
}
|
||||
// else if(customerLastNameController.text.isEmpty){
|
||||
// Toast.showToast("Please enter your last name");
|
||||
// }
|
||||
else if(customerPhoneController.text.isEmpty){
|
||||
btnController.reset();
|
||||
|
||||
Toast.showToast("Please enter your phone number");
|
||||
}else if(addressController.text.isEmpty){
|
||||
btnController.reset();
|
||||
|
||||
Toast.showToast("Please enter your address");
|
||||
}
|
||||
else if(latitude == null &&longitude == null){
|
||||
btnController.reset();
|
||||
Toast.showToast("Please enter correct address");
|
||||
}
|
||||
// else if(doorNoController.text.isEmpty){
|
||||
// Toast.showToast("Please enter your door number");
|
||||
// }
|
||||
// else if(landMarkController.text.isEmpty){
|
||||
// Toast.showToast("Please enter your landmark");
|
||||
// }
|
||||
else{
|
||||
btnController.success();
|
||||
createCustomer();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
createCustomer() async{
|
||||
var createdate = DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now());
|
||||
var updatedate = DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now());
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
tenantId = prefs.getInt('tenantId');
|
||||
appLocationId = prefs.getInt('appLocationId');
|
||||
|
||||
print('tenantIdcreateCustomer$tenantId');
|
||||
String contactNo = customerPhoneController.text;
|
||||
print("contact............$contactNo");
|
||||
create(
|
||||
CreateCustomers(
|
||||
customerid:0,
|
||||
configid:1,
|
||||
tenantid: tenantId,
|
||||
firstname:customerFirstNameController.text,
|
||||
applocationid:appLocationId,
|
||||
profileimage:"",
|
||||
dialcode:"+91",
|
||||
contactno:customerPhoneController.text,
|
||||
devicetype:Platform.operatingSystem,
|
||||
// deviceid:"${prefs.getString('deviceId')}",
|
||||
// customertoken:"$fcmEntryToken",
|
||||
address:addressController.text,
|
||||
suburb:suburb,
|
||||
city:city,
|
||||
state:state,
|
||||
postcode:postCode,
|
||||
landmark:landMarkController.text,
|
||||
doorno:doorNoController.text,
|
||||
latitude:latitude,
|
||||
longitude:longitude,
|
||||
primaryaddress: 1,
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
create(CreateCustomers data )async{
|
||||
CreateCustomerResponse? result = await createCustomerRepository.createCustomer(data);
|
||||
|
||||
if(result?.status == true){
|
||||
customerFirstNameController.clear();
|
||||
customerLastNameController.clear();
|
||||
customerPhoneController.clear();
|
||||
addressController.clear();
|
||||
doorNoController.clear();
|
||||
landMarkController.clear();
|
||||
tenantDropCustomerController.getCustomerByTenantId();
|
||||
btnController.reset();
|
||||
createOrderController.dropCustomerId = result?.details?.customerid;
|
||||
createOrderController.dropCustomerName = "${result?.details?.firstname}" + "${result?.details?.lastname}";
|
||||
createOrderController.dropCustomerContactNo = result?.details?.contactno;
|
||||
createOrderController.dropLocationId = result?.details?.deliverylocationid;
|
||||
createOrderController.dropTenantLocationId = result?.details?.tenantlocationid;
|
||||
createOrderController.toLatitude = result?.details?.latitude;
|
||||
createOrderController.toLongitude = result?.details?.longitude;
|
||||
createOrderController.toAddress =result?.details?.address;
|
||||
// Get.offAll(TenantDropCustomerView());
|
||||
Get.to(()=>CreateOrderView(isDashboard: false));
|
||||
}else{
|
||||
btnController.reset();
|
||||
Toast.showToast('${result?.message}');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
getLocation();
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:geocoding/geocoding.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
|
||||
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import '../../../../../../Data/Provider/Getcustomeraddress/Getcustomeraddressprovider.dart';
|
||||
import '../../../../../../Data/Repository/Createcustomer/Createcustomerrepository.dart';
|
||||
import '../../../../../../Globalwidgets/Googleplaces/Googleplaces.dart';
|
||||
import '../../../../../../Helper/Constants/Apiconstants.dart';
|
||||
import '../../../../../../Helper/location_service.dart';
|
||||
import '../../../../../../Helper/toast.dart';
|
||||
import '../../../../../../Model/Request/Authentication/Createuser/Createdeliveryaddress/Createdeliveryaddressrequest.dart';
|
||||
import '../../../../../../Model/Response/Createcustomer/Createdeliveryaddress/Createdeliveryaddressresponsel.dart';
|
||||
import '../../../../../../Model/Response/Getcustomeraddress/GetCustomerAddress.dart';
|
||||
import '../../../../../../View/Createorder/Droplocation/Tabs/Allcustomers/Tenantcustomers/Customeraddress/Customeraddressview.dart';
|
||||
|
||||
|
||||
|
||||
class DropCustomerAddressController extends GetxController{
|
||||
|
||||
String? latitude;
|
||||
String? longitude;
|
||||
String? address;
|
||||
|
||||
String? customerName;
|
||||
String? customerContactNo;
|
||||
|
||||
int locationId = 0;
|
||||
int roleId = 0;
|
||||
int? customerId;
|
||||
int? deliveryLocationId;
|
||||
|
||||
int selectedAddressIndex = -1;
|
||||
|
||||
List <CustomerAddressDetail> getCustomeraddress =[];
|
||||
|
||||
|
||||
bool loader = true;
|
||||
bool deliveryAddressList = false;
|
||||
|
||||
var customerAddressInfo;
|
||||
|
||||
|
||||
TextEditingController searchController = TextEditingController();
|
||||
TextEditingController addressController = TextEditingController();
|
||||
TextEditingController suburbController = TextEditingController();
|
||||
TextEditingController cityController = TextEditingController();
|
||||
TextEditingController stateController = TextEditingController();
|
||||
TextEditingController postCodeController = TextEditingController();
|
||||
TextEditingController landmarkController = TextEditingController();
|
||||
TextEditingController doornoController = TextEditingController();
|
||||
|
||||
final searchText = ''.obs;
|
||||
final predictions = <Map<String, dynamic>>[].obs;
|
||||
final selectedPlace = {}.obs;
|
||||
|
||||
final GooglePlacesService placesService = GooglePlacesService();
|
||||
|
||||
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
|
||||
final RoundedLoadingButtonController submitBtnController = RoundedLoadingButtonController();
|
||||
|
||||
CreateCustomerRepository createCustomerRepository = CreateCustomerRepository();
|
||||
|
||||
GetCustomersAddressProvider getCustomersAddressProvider = GetCustomersAddressProvider();
|
||||
|
||||
getDetails()async{
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
roleId = prefs.getInt('roleId')??0;
|
||||
print('roleIdingetDetails $roleId');
|
||||
update();
|
||||
}
|
||||
|
||||
getCustomerAddress()async{
|
||||
GetCustomerAddress? result = await getCustomersAddressProvider.getCustomerAddress('${ApiConstants.getCustomerAddress}?customerid=$customerId');
|
||||
getCustomeraddress = result?.details??[];
|
||||
loader = false;
|
||||
for (var i = 0; i < getCustomeraddress.length; i++) {
|
||||
if (getCustomeraddress[i].defaultaddress == '1') {
|
||||
deliveryLocationId = getCustomeraddress[i].locationid;
|
||||
print('getCustomerAddressforloop $deliveryLocationId');
|
||||
update();
|
||||
}
|
||||
}
|
||||
update();
|
||||
|
||||
print('getCustomerAddressincontroller${result?.toJson()}');
|
||||
|
||||
}
|
||||
|
||||
describeValidation(){
|
||||
if(addressController.text.isEmpty){
|
||||
submitBtnController.reset();
|
||||
Toast.showToast("Delivery address should not be empty");
|
||||
}
|
||||
else if(suburbController.text.isEmpty){
|
||||
submitBtnController.reset();
|
||||
Toast.showToast("Suburb should not be empty!");
|
||||
}
|
||||
else if(stateController.text.isEmpty){
|
||||
submitBtnController.reset();
|
||||
Toast.showToast("State should not be empty!");
|
||||
}else if(postCodeController.text.isEmpty){
|
||||
submitBtnController.reset();
|
||||
Toast.showToast("Pin code should not be empty!");
|
||||
}
|
||||
|
||||
else{
|
||||
submitBtnController.success();
|
||||
createDeliveryAddress();
|
||||
}
|
||||
}
|
||||
|
||||
createDeliveryAddress()async {
|
||||
create(
|
||||
CreateDeliveryAddress(
|
||||
customerid:customerAddressInfo.customerid,
|
||||
address: addressController.text,
|
||||
suburb: suburbController.text,
|
||||
city: cityController.text,
|
||||
state: stateController.text,
|
||||
postcode: postCodeController.text,
|
||||
// countycode:"91",
|
||||
latitude: '$latitude',
|
||||
longitude: '$longitude',
|
||||
primaryaddress: 0,
|
||||
));
|
||||
}
|
||||
|
||||
create(CreateDeliveryAddress data )async{
|
||||
CreateDeliveryAddressResponse? result = await createCustomerRepository.createDeliveryAddress(data);
|
||||
if(result?.status == true){
|
||||
deliveryAddressList = false;
|
||||
getCustomerAddress();
|
||||
submitBtnController.reset();
|
||||
Get.to(CustomerDropAddressView(data: customerAddressInfo,));
|
||||
update();
|
||||
}
|
||||
print('CreateDeliveryAddress create ${result!.toJson()}');
|
||||
}
|
||||
|
||||
void onSearchTextChanged(String text) async {
|
||||
searchText.value = text;
|
||||
if (text.length > 2) {
|
||||
try {
|
||||
final places = await placesService.getPlacesPredictions(text);
|
||||
predictions.assignAll(places);
|
||||
update();
|
||||
} catch (e) {
|
||||
print('Error fetching predictions: $e');
|
||||
}
|
||||
} else {
|
||||
predictions.clear();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getPlaceDetails(String placeId,locationAddress) async {
|
||||
try {
|
||||
final details = await placesService.getPlaceDetails(placeId);
|
||||
selectedPlace.value = details;
|
||||
print('getPlaceDetailslatitude ${selectedPlace['geometry']['location']['lat']}');
|
||||
print('getPlaceDetailslongitude ${selectedPlace['geometry']['location']['lng']}');
|
||||
getAddressFromLatLng(selectedPlace['geometry']['location']['lat'],selectedPlace['geometry']['location']['lng'],locationAddress);
|
||||
} catch (e) {
|
||||
print('Error fetching place details: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getAddressFromLatLng(double latitudes, double longitudes,locationAddress) async {
|
||||
await placemarkFromCoordinates(latitudes, longitudes).then((List<Placemark> placemarks) {
|
||||
Placemark place = placemarks[0];
|
||||
latitude = double.parse(latitudes.toString()).toString();
|
||||
longitude = double.parse(longitudes.toString()).toString();
|
||||
cityController.text = '${place.locality}';
|
||||
stateController.text = '${place.administrativeArea}';
|
||||
suburbController.text = (place.subLocality!.isNotEmpty?place.subLocality:place.street)!;
|
||||
postCodeController.text = '${place.postalCode}';
|
||||
addressController.text = locationAddress;
|
||||
predictions.clear();
|
||||
update();
|
||||
print('latitude $latitude');
|
||||
print('longitude $longitude');
|
||||
print('subAdministrativeArea ${place.subAdministrativeArea}');
|
||||
print('subThoroughfare ${place.subThoroughfare}');
|
||||
print('currentLocationAddress ${ addressController.text}');
|
||||
print('streetss ${place.street}');
|
||||
|
||||
}).catchError((e) {
|
||||
debugPrint(e);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../../../../Data/Repository/Customers/getCustomerbytenantidrepository.dart';
|
||||
import '../../../../../Helper/toast.dart';
|
||||
import '../../../../../Model/Response/Customers/GetCustomerById/Getdropcustomerbytenantid.dart';
|
||||
|
||||
|
||||
|
||||
|
||||
class TenantDropCustomerController extends GetxController{
|
||||
|
||||
final int limit = 10;
|
||||
int page = 1;
|
||||
var hasMore = true.obs;
|
||||
|
||||
bool progress = true;
|
||||
|
||||
RxBool shimmer = true.obs;
|
||||
|
||||
var getCustomerBytenantId = <GetDropCustomerByTenantIdDetails>[].obs;
|
||||
|
||||
TextEditingController searchController = TextEditingController();
|
||||
|
||||
|
||||
GetCustomersByTenantIdRepository getCustomersByTenantIdRepository = GetCustomersByTenantIdRepository();
|
||||
|
||||
getCustomerByTenantId()async{
|
||||
GetDropCustomerByTenantId? result = await getCustomersByTenantIdRepository.getDropCustomerByTenantId();
|
||||
getCustomerByTenantIdResult(result!);
|
||||
}
|
||||
|
||||
getDropTenantByTenantId()async{
|
||||
GetDropCustomerByTenantId? result = await getCustomersByTenantIdRepository.getDropTenantByTenantId();
|
||||
getCustomerByTenantIdResult(result!);
|
||||
}
|
||||
|
||||
|
||||
getCustomerByTenantIdResult(GetDropCustomerByTenantId data){
|
||||
getCustomerBytenantId.value = data.details??[];
|
||||
progress =false;
|
||||
update();
|
||||
}
|
||||
|
||||
Future getSearchCustomerData(keyword) async {
|
||||
GetDropCustomerByTenantId? result = await getCustomersByTenantIdRepository.getDropCustomerKeywordByTenantId(keyword);
|
||||
|
||||
if (result?.code == 200) {
|
||||
getCustomerBytenantId.clear();
|
||||
getCustomerBytenantId.addAll(result?.details??[]);
|
||||
shimmer.value = false;
|
||||
update();
|
||||
print('getSearchCustomerDatalength ${getCustomerBytenantId.length}');
|
||||
if(getCustomerBytenantId.isEmpty){
|
||||
Toast.showToast('No customer at this moment');
|
||||
}
|
||||
|
||||
} else {
|
||||
// Toast.showToast(result?.message??"");
|
||||
}
|
||||
}
|
||||
|
||||
Future refreshData() async {
|
||||
searchController.clear();
|
||||
page = 1;
|
||||
hasMore.value = true;
|
||||
getCustomerBytenantId.value = [];
|
||||
|
||||
|
||||
if(searchController.text.isEmpty){
|
||||
print("ifffffffffffffffffffffffffffffffffff");
|
||||
await getCustomerData();
|
||||
}
|
||||
}
|
||||
|
||||
Future getCustomerData() async {
|
||||
GetDropCustomerByTenantId? result = await getCustomersByTenantIdRepository.getDropCustomerByPageLimitTenantId(page,limit);
|
||||
|
||||
if (result?.code == 200) {
|
||||
if (result!.details!.length < limit) {
|
||||
hasMore.value = false;
|
||||
}
|
||||
// getCustomerBytenantId.clear();
|
||||
getCustomerBytenantId.addAll(result.details??[]);
|
||||
shimmer.value = false;
|
||||
page++;
|
||||
update();
|
||||
} else {
|
||||
// Toast.showToast(result?.message??"");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import '../../../../Helper/Constants/Colorconstants.dart';
|
||||
|
||||
class PickupCustomerTabController extends GetxController with SingleGetTickerProviderMixin{
|
||||
|
||||
|
||||
late TabController tabController;
|
||||
int tabIndex = 0;
|
||||
|
||||
final List<Tab> tabs = <Tab>[
|
||||
Tab(
|
||||
icon:Icon(
|
||||
Icons.person,
|
||||
color: ColorConstants.primaryColor,
|
||||
size: 25,
|
||||
),
|
||||
text: "From Customer",
|
||||
),
|
||||
// // Tab(text: "Yesterday",),
|
||||
Tab(
|
||||
text: "From Business",
|
||||
icon: Icon(
|
||||
Icons.business,
|
||||
color: ColorConstants.primaryColor,
|
||||
size: 25,
|
||||
),
|
||||
),
|
||||
|
||||
];
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
tabController = TabController(vsync: this, length: tabs.length);
|
||||
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,236 @@
|
||||
import 'package:country_currency_pickers/country.dart';
|
||||
import 'package:country_currency_pickers/utils/utils.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:geocoding/geocoding.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'dart:io';
|
||||
import '../../../../../../../Data/Repository/Createcustomer/Createcustomerrepository.dart';
|
||||
import '../../../../../../../Globalwidgets/Googleplaces/Googleplaces.dart';
|
||||
import '../../../../../../../Helper/Locationservice/Locationservice.dart';
|
||||
import '../../../../../../../Helper/location_service.dart';
|
||||
import '../../../../../../../Helper/toast.dart';
|
||||
import '../../../../../../../Model/Request/Createcustomer/Createcustomerrequest.dart';
|
||||
import '../../../../../../../Model/Response/Createcustomer/Createcustomerresponse.dart';
|
||||
import '../../../../../../../View/Createorder/Createorderview.dart';
|
||||
import '../../../../../../Createorder/Createordercontroller.dart';
|
||||
import '../../Tenantcustomercontroller.dart';
|
||||
|
||||
class AddPickupCustomerController extends GetxController{
|
||||
|
||||
String? latitude;
|
||||
String? longitude;
|
||||
|
||||
String? suburb;
|
||||
String? city;
|
||||
String? state;
|
||||
String? postCode;
|
||||
|
||||
int? tenantId;
|
||||
int? appLocationId;
|
||||
|
||||
|
||||
|
||||
bool progress = true;
|
||||
|
||||
TextEditingController customerFirstNameController = TextEditingController();
|
||||
TextEditingController customerLastNameController = TextEditingController();
|
||||
TextEditingController customerPhoneController = TextEditingController();
|
||||
TextEditingController addressController = TextEditingController();
|
||||
TextEditingController doorNoController = TextEditingController();
|
||||
TextEditingController landMarkController = TextEditingController();
|
||||
|
||||
|
||||
Position? resultPosition;
|
||||
|
||||
final searchText = ''.obs;
|
||||
final predictions = <Map<String, dynamic>>[].obs;
|
||||
final selectedPlace = {}.obs;
|
||||
|
||||
Country selectedDialogCountry = CountryPickerUtils.getCountryByIsoCode('IN');
|
||||
|
||||
final GooglePlacesService placesService = GooglePlacesService();
|
||||
|
||||
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
|
||||
|
||||
CreateCustomerRepository createCustomerRepository = CreateCustomerRepository();
|
||||
|
||||
TenantPickupCustomerController tenantPickupCustomerController = Get.put(TenantPickupCustomerController());
|
||||
CreateOrderController createOrderController = Get.put(CreateOrderController());
|
||||
|
||||
|
||||
|
||||
LocationService locationService = LocationService();
|
||||
|
||||
|
||||
|
||||
getLocation() async {
|
||||
resultPosition = await locationService.getLocation();
|
||||
progress =false;
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
void onSearchTextChanged(String text) async {
|
||||
searchText.value = text;
|
||||
if (text.length > 2) {
|
||||
try {
|
||||
final places = await placesService.getPlacesPredictions(text);
|
||||
predictions.assignAll(places);
|
||||
update();
|
||||
} catch (e) {
|
||||
print('Error fetching predictions: $e');
|
||||
}
|
||||
} else {
|
||||
predictions.clear();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getPlaceDetails(String placeId,locationAddress) async {
|
||||
try {
|
||||
final details = await placesService.getPlaceDetails(placeId);
|
||||
selectedPlace.value = details;
|
||||
print('getPlaceDetailslatitude ${selectedPlace['geometry']['location']['lat']}');
|
||||
print('getPlaceDetailslongitude ${selectedPlace['geometry']['location']['lng']}');
|
||||
getAddressFromLatLng(selectedPlace['geometry']['location']['lat'],selectedPlace['geometry']['location']['lng'],locationAddress);
|
||||
} catch (e) {
|
||||
print('Error fetching place details: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getAddressFromLatLng(double latitudes, double longitudes,address) async {
|
||||
await placemarkFromCoordinates(latitudes, longitudes).then((List<Placemark> placemarks) {
|
||||
Placemark place = placemarks[0];
|
||||
latitude = double.parse(latitudes.toString()).toString();
|
||||
longitude = double.parse(longitudes.toString()).toString();
|
||||
city = '${place.locality}';
|
||||
state = '${place.administrativeArea}';
|
||||
suburb = place.subLocality!.isNotEmpty?place.subLocality:place.street;
|
||||
postCode = '${place.postalCode}';
|
||||
addressController.text = address;
|
||||
predictions.clear();
|
||||
update();
|
||||
print('latitude $latitude');
|
||||
print('longitude $longitude');
|
||||
print('eng $suburb');
|
||||
print('city $city');
|
||||
print('state $state');
|
||||
print('postalCode $postCode');
|
||||
print('subAdministrativeArea ${place.subAdministrativeArea}');
|
||||
print('subThoroughfare ${place.subThoroughfare}');
|
||||
print('currentLocationAddress ${addressController.text}');
|
||||
print('streetss ${place.street}');
|
||||
|
||||
}).catchError((e) {
|
||||
debugPrint(e);
|
||||
});
|
||||
}
|
||||
|
||||
describeValidation(){
|
||||
if(customerFirstNameController.text.isEmpty){
|
||||
btnController.reset();
|
||||
Toast.showToast("Please enter your first name");
|
||||
}
|
||||
// else if(customerLastNameController.text.isEmpty){
|
||||
// Toast.showToast("Please enter your last name");
|
||||
// }
|
||||
else if(customerPhoneController.text.isEmpty){
|
||||
btnController.reset();
|
||||
|
||||
Toast.showToast("Please enter your phone number");
|
||||
}else if(addressController.text.isEmpty){
|
||||
btnController.reset();
|
||||
Toast.showToast("Please enter your address");
|
||||
}
|
||||
else if(latitude == null &&longitude == null){
|
||||
btnController.reset();
|
||||
Toast.showToast("Please enter correct address");
|
||||
}
|
||||
// else if(doorNoController.text.isEmpty){
|
||||
// Toast.showToast("Please enter your door number");
|
||||
// }
|
||||
// else if(landMarkController.text.isEmpty){
|
||||
// Toast.showToast("Please enter your landmark");
|
||||
// }
|
||||
else{
|
||||
btnController.success();
|
||||
createCustomer();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
createCustomer() async{
|
||||
var createdate = DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now());
|
||||
var updatedate = DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now());
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
tenantId = prefs.getInt('tenantId');
|
||||
appLocationId = prefs.getInt('appLocationId');
|
||||
print('tenantIdcreateCustomer$tenantId');
|
||||
String contactNo = customerPhoneController.text;
|
||||
print("contact............$contactNo");
|
||||
create(
|
||||
CreateCustomers(
|
||||
customerid:0,
|
||||
configid:1,
|
||||
tenantid: tenantId,
|
||||
firstname:customerFirstNameController.text,
|
||||
applocationid:appLocationId,
|
||||
profileimage:"",
|
||||
dialcode:"+91",
|
||||
contactno:customerPhoneController.text,
|
||||
devicetype:Platform.operatingSystem,
|
||||
// deviceid:"${prefs.getString('deviceId')}",
|
||||
// customertoken:"$fcmEntryToken",
|
||||
address:addressController.text,
|
||||
suburb:suburb,
|
||||
city:city,
|
||||
state:state,
|
||||
postcode:postCode,
|
||||
landmark:landMarkController.text,
|
||||
doorno:doorNoController.text,
|
||||
latitude:latitude,
|
||||
longitude:longitude,
|
||||
primaryaddress: 1,
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
create(CreateCustomers data )async{
|
||||
CreateCustomerResponse? result = await createCustomerRepository.createCustomer(data);
|
||||
|
||||
if(result?.status == true){
|
||||
customerFirstNameController.clear();
|
||||
customerLastNameController.clear();
|
||||
customerPhoneController.clear();
|
||||
addressController.clear();
|
||||
doorNoController.clear();
|
||||
landMarkController.clear();
|
||||
tenantPickupCustomerController.getCustomerByTenantId();
|
||||
btnController.reset();
|
||||
createOrderController.pickupCustomerId = result?.details?.customerid;
|
||||
createOrderController.pickUpCustomerName = "${result?.details?.firstname}" + "${result?.details?.lastname}";
|
||||
createOrderController.pickUpCustomerContactNo = result?.details?.contactno;
|
||||
createOrderController.pickupLocationId = result?.details?.deliverylocationid;
|
||||
createOrderController.pickupTenantLocationId = result?.details?.tenantlocationid;
|
||||
createOrderController.fromLatitude = result?.details?.latitude;
|
||||
createOrderController.fromLongitude = result?.details?.longitude;
|
||||
createOrderController.fromAddress =result?.details?.address;
|
||||
// Get.offAll(TenantPickUpCustomerView(navigate: true,));
|
||||
Get.to(()=>CreateOrderView(isDashboard: false));
|
||||
}else{
|
||||
btnController.reset();
|
||||
Toast.showToast('${result?.message}');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
getLocation();
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:geocoding/geocoding.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import '../../../../../../Data/Provider/Getcustomeraddress/Getcustomeraddressprovider.dart';
|
||||
import '../../../../../../Data/Repository/Createcustomer/Createcustomerrepository.dart';
|
||||
import '../../../../../../Globalwidgets/Googleplaces/Googleplaces.dart';
|
||||
import '../../../../../../Helper/Constants/Apiconstants.dart';
|
||||
import '../../../../../../Helper/location_service.dart';
|
||||
import '../../../../../../Helper/toast.dart';
|
||||
import '../../../../../../Model/Request/Authentication/Createuser/Createdeliveryaddress/Createdeliveryaddressrequest.dart';
|
||||
import '../../../../../../Model/Response/Createcustomer/Createdeliveryaddress/Createdeliveryaddressresponsel.dart';
|
||||
import '../../../../../../Model/Response/Getcustomeraddress/GetCustomerAddress.dart';
|
||||
import '../../../../../../View/Createorder/Pickuplocation/Tabs/Allcustomers/Tenantcustomers/Customeraddress/Customeraddressview.dart';
|
||||
|
||||
class PickupCustomerAddressController extends GetxController{
|
||||
|
||||
String? latitude;
|
||||
String? longitude;
|
||||
String? address;
|
||||
|
||||
String? customerName;
|
||||
String? customerContactNo;
|
||||
|
||||
int locationId = 0;
|
||||
int roleId = 0;
|
||||
int? customerId;
|
||||
int? deliveryLocationId;
|
||||
|
||||
int selectedAddressIndex = -1;
|
||||
|
||||
List <CustomerAddressDetail> getCustomeraddress =[];
|
||||
|
||||
|
||||
bool loader = true;
|
||||
bool deliveryAddressList = false;
|
||||
|
||||
var customerAddressInfo;
|
||||
|
||||
|
||||
TextEditingController searchController = TextEditingController();
|
||||
TextEditingController addressController = TextEditingController();
|
||||
TextEditingController suburbController = TextEditingController();
|
||||
TextEditingController cityController = TextEditingController();
|
||||
TextEditingController stateController = TextEditingController();
|
||||
TextEditingController postCodeController = TextEditingController();
|
||||
TextEditingController landmarkController = TextEditingController();
|
||||
TextEditingController doornoController = TextEditingController();
|
||||
|
||||
final searchText = ''.obs;
|
||||
final predictions = <Map<String, dynamic>>[].obs;
|
||||
final selectedPlace = {}.obs;
|
||||
|
||||
final GooglePlacesService placesService = GooglePlacesService();
|
||||
|
||||
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
|
||||
final RoundedLoadingButtonController submitBtnController = RoundedLoadingButtonController();
|
||||
|
||||
CreateCustomerRepository createCustomerRepository = CreateCustomerRepository();
|
||||
|
||||
GetCustomersAddressProvider getCustomersAddressProvider = GetCustomersAddressProvider();
|
||||
|
||||
getDetails()async{
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
roleId = prefs.getInt('roleId')??0;
|
||||
print('roleIdingetDetails $roleId');
|
||||
update();
|
||||
}
|
||||
|
||||
getCustomerAddress()async{
|
||||
GetCustomerAddress? result = await getCustomersAddressProvider.getCustomerAddress('${ApiConstants.getCustomerAddress}?customerid=$customerId');
|
||||
getCustomeraddress = result?.details??[];
|
||||
loader = false;
|
||||
for (var i = 0; i < getCustomeraddress.length; i++) {
|
||||
if (getCustomeraddress[i].defaultaddress == '1') {
|
||||
deliveryLocationId = getCustomeraddress[i].locationid;
|
||||
print('getCustomerAddressforloop $deliveryLocationId');
|
||||
update();
|
||||
}
|
||||
}
|
||||
update();
|
||||
|
||||
print('getCustomerAddressincontroller${result?.toJson()}');
|
||||
|
||||
}
|
||||
|
||||
describeValidation(){
|
||||
if(addressController.text.isEmpty){
|
||||
submitBtnController.reset();
|
||||
Toast.showToast("Delivery address should not be empty");
|
||||
}
|
||||
else if(suburbController.text.isEmpty){
|
||||
submitBtnController.reset();
|
||||
Toast.showToast("Suburb should not be empty!");
|
||||
}
|
||||
else if(stateController.text.isEmpty){
|
||||
submitBtnController.reset();
|
||||
Toast.showToast("State should not be empty!");
|
||||
}else if(postCodeController.text.isEmpty){
|
||||
submitBtnController.reset();
|
||||
Toast.showToast("Pin code should not be empty!");
|
||||
}
|
||||
|
||||
else{
|
||||
submitBtnController.success();
|
||||
createDeliveryAddress();
|
||||
}
|
||||
}
|
||||
|
||||
createDeliveryAddress()async {
|
||||
create(
|
||||
CreateDeliveryAddress(
|
||||
customerid:customerAddressInfo.customerid,
|
||||
address: addressController.text,
|
||||
suburb: suburbController.text,
|
||||
city: cityController.text,
|
||||
state: stateController.text,
|
||||
postcode: postCodeController.text,
|
||||
// countycode:"91",
|
||||
latitude: '$latitude',
|
||||
longitude: '$longitude',
|
||||
primaryaddress: 0,
|
||||
));
|
||||
}
|
||||
|
||||
create(CreateDeliveryAddress data )async{
|
||||
CreateDeliveryAddressResponse? result = await createCustomerRepository.createDeliveryAddress(data);
|
||||
if(result?.status == true){
|
||||
deliveryAddressList = false;
|
||||
getCustomerAddress();
|
||||
submitBtnController.reset();
|
||||
Get.to(CustomerPickupAddressView(data: customerAddressInfo,));
|
||||
update();
|
||||
}
|
||||
print('CreateDeliveryAddress create ${result!.toJson()}');
|
||||
}
|
||||
|
||||
void onSearchTextChanged(String text) async {
|
||||
searchText.value = text;
|
||||
if (text.length > 2) {
|
||||
try {
|
||||
final places = await placesService.getPlacesPredictions(text);
|
||||
predictions.assignAll(places);
|
||||
update();
|
||||
} catch (e) {
|
||||
print('Error fetching predictions: $e');
|
||||
}
|
||||
} else {
|
||||
predictions.clear();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getPlaceDetails(String placeId,locationAddress) async {
|
||||
try {
|
||||
final details = await placesService.getPlaceDetails(placeId);
|
||||
selectedPlace.value = details;
|
||||
print('getPlaceDetailslatitude ${selectedPlace['geometry']['location']['lat']}');
|
||||
print('getPlaceDetailslongitude ${selectedPlace['geometry']['location']['lng']}');
|
||||
getAddressFromLatLng(selectedPlace['geometry']['location']['lat'],selectedPlace['geometry']['location']['lng'],locationAddress);
|
||||
} catch (e) {
|
||||
print('Error fetching place details: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getAddressFromLatLng(double latitudes, double longitudes,locationAddress) async {
|
||||
await placemarkFromCoordinates(latitudes, longitudes).then((List<Placemark> placemarks) {
|
||||
Placemark place = placemarks[0];
|
||||
latitude = double.parse(latitudes.toString()).toString();
|
||||
longitude = double.parse(longitudes.toString()).toString();
|
||||
cityController.text = '${place.locality}';
|
||||
stateController.text = '${place.administrativeArea}';
|
||||
suburbController.text = (place.subLocality!.isNotEmpty?place.subLocality:place.street)!;
|
||||
postCodeController.text = '${place.postalCode}';
|
||||
addressController.text = locationAddress;
|
||||
predictions.clear();
|
||||
update();
|
||||
print('latitude $latitude');
|
||||
print('longitude $longitude');
|
||||
print('subAdministrativeArea ${place.subAdministrativeArea}');
|
||||
print('subThoroughfare ${place.subThoroughfare}');
|
||||
print('currentLocationAddress ${ addressController.text}');
|
||||
print('streetss ${place.street}');
|
||||
|
||||
}).catchError((e) {
|
||||
debugPrint(e);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:get/get.dart';
|
||||
import '../../../../../Data/Repository/Customers/getCustomerbytenantidrepository.dart';
|
||||
import '../../../../../Helper/toast.dart';
|
||||
import '../../../../../Model/Response/Customers/GetCustomerById/GetCustomerByTenantId.dart';
|
||||
|
||||
|
||||
class TenantPickupCustomerController extends GetxController{
|
||||
|
||||
final int limit = 10;
|
||||
int page = 1;
|
||||
var hasMore = true.obs;
|
||||
|
||||
bool progress = true;
|
||||
|
||||
RxBool shimmer = true.obs;
|
||||
|
||||
var getCustomerBytenantId = <GetCustomerByTenantIdDetails>[].obs;
|
||||
|
||||
|
||||
TextEditingController searchController = TextEditingController();
|
||||
|
||||
GetCustomersByTenantIdRepository getCustomersByTenantIdRepository = GetCustomersByTenantIdRepository();
|
||||
|
||||
getCustomerByTenantId()async{
|
||||
GetCustomerByTenantId? result = await getCustomersByTenantIdRepository.getCustomerByTenantId();
|
||||
getCustomerByTenantIdResult(result!);
|
||||
}
|
||||
|
||||
getTenantsByTenantId()async{
|
||||
GetCustomerByTenantId? result = await getCustomersByTenantIdRepository.getTenantsByTenantId();
|
||||
getCustomerByTenantIdResult(result!);
|
||||
}
|
||||
|
||||
|
||||
getCustomerByTenantIdResult(GetCustomerByTenantId data) {
|
||||
final seen = <dynamic>{};
|
||||
|
||||
/// Logic to remove duplicates
|
||||
getCustomerBytenantId.value = (data.details ?? []).where((customer) {
|
||||
if (seen.contains(customer.customerid)) {
|
||||
return false; // Duplicate
|
||||
} else {
|
||||
seen.add(customer.customerid);
|
||||
return true;
|
||||
}
|
||||
}).toList();
|
||||
|
||||
progress = false;
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
Future getSearchCustomerData(keyword) async {
|
||||
|
||||
GetCustomerByTenantId? result = await getCustomersByTenantIdRepository.getCustomerKeywordByTenantId(keyword);
|
||||
|
||||
if (result?.code == 200) {
|
||||
getCustomerBytenantId.clear();
|
||||
getCustomerBytenantId.addAll(result?.details??[]);
|
||||
shimmer.value = false;
|
||||
update();
|
||||
print('getSearchCustomerDatalength ${getCustomerBytenantId.length}');
|
||||
if(getCustomerBytenantId.isEmpty){
|
||||
Toast.showToast('No customer at this moment');
|
||||
}
|
||||
|
||||
} else {
|
||||
// Toast.showToast(result?.message??"");
|
||||
}
|
||||
}
|
||||
|
||||
Future refreshData() async {
|
||||
searchController.clear();
|
||||
page = 1;
|
||||
hasMore.value = true;
|
||||
getCustomerBytenantId.value = [];
|
||||
|
||||
|
||||
if(searchController.text.isEmpty){
|
||||
print("ifffffffffffffffffffffffffffffffffff");
|
||||
await getCustomerData();
|
||||
}
|
||||
}
|
||||
|
||||
Future getCustomerData() async {
|
||||
GetCustomerByTenantId? result = await getCustomersByTenantIdRepository.getCustomerByPageLimitTenantId(page,limit);
|
||||
|
||||
if (result?.code == 200) {
|
||||
if (result!.details!.length < limit) {
|
||||
hasMore.value = false;
|
||||
}
|
||||
// getCustomerBytenantId.clear();
|
||||
getCustomerBytenantId.addAll(result.details??[]);
|
||||
shimmer.value = false;
|
||||
page++;
|
||||
update();
|
||||
} else {
|
||||
// Toast.showToast(result?.message??"");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
26
lib/Controller/Dashboard/Tabs/Cancelledordercontroller.dart
Normal file
26
lib/Controller/Dashboard/Tabs/Cancelledordercontroller.dart
Normal file
@@ -0,0 +1,26 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../../Data/Repository/Orders/Orderrepository.dart';
|
||||
import '../../../Model/Response/Orders/Getorderresponse.dart';
|
||||
|
||||
class CancelledOrderController extends GetxController{
|
||||
|
||||
RxBool shimmer = true.obs;
|
||||
|
||||
List <OrderDetails> getCancelledOrderList = [];
|
||||
|
||||
OrdersRepository ordersRepository = OrdersRepository();
|
||||
|
||||
getCancelledOrder()async{
|
||||
GetOrders? result = await ordersRepository.getCancelledOrder();
|
||||
getCancelledOrderList = result?.details??[];
|
||||
shimmer.value = false;
|
||||
update();
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
26
lib/Controller/Dashboard/Tabs/Completedordercontroller.dart
Normal file
26
lib/Controller/Dashboard/Tabs/Completedordercontroller.dart
Normal file
@@ -0,0 +1,26 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../../Data/Repository/Orders/Orderrepository.dart';
|
||||
import '../../../Model/Response/Orders/Getorderresponse.dart';
|
||||
|
||||
class CompletedOrderController extends GetxController{
|
||||
|
||||
RxBool shimmer = true.obs;
|
||||
|
||||
List <OrderDetails> getCompletedOrderList = [];
|
||||
|
||||
OrdersRepository ordersRepository = OrdersRepository();
|
||||
|
||||
getCompletedOrder()async{
|
||||
GetOrders? result = await ordersRepository.getCompletedOrders();
|
||||
getCompletedOrderList = result?.details??[];
|
||||
shimmer.value = false;
|
||||
update();
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
27
lib/Controller/Dashboard/Tabs/Ongoingordercontroller.dart
Normal file
27
lib/Controller/Dashboard/Tabs/Ongoingordercontroller.dart
Normal file
@@ -0,0 +1,27 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import '../../../Data/Repository/Orders/Orderrepository.dart';
|
||||
import '../../../Model/Response/Orders/Getorderresponse.dart';
|
||||
|
||||
class OnGoingOrderController extends GetxController{
|
||||
|
||||
RxBool shimmer = true.obs;
|
||||
|
||||
List <OrderDetails> getCurrentOrderList = [];
|
||||
|
||||
OrdersRepository ordersRepository = OrdersRepository();
|
||||
|
||||
getCurrentOrder()async{
|
||||
GetOrders? result = await ordersRepository.getCurrentOrders();
|
||||
getCurrentOrderList = result?.details??[];
|
||||
shimmer.value = false;
|
||||
update();
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
getCurrentOrder();
|
||||
// TODO: implement onInit
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
256
lib/Controller/Dashboard/Tabs/Ordercontroller.dart
Normal file
256
lib/Controller/Dashboard/Tabs/Ordercontroller.dart
Normal file
@@ -0,0 +1,256 @@
|
||||
import 'dart:async'; // Add this import
|
||||
import 'package:get/get.dart' hide Response;
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:dio/dio.dart' as Response;
|
||||
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../../../Data/Repository/Admintoken/Getadmintokenrepository.dart';
|
||||
import '../../../Data/Repository/Notification/Notificationrepository.dart';
|
||||
import '../../../Data/Repository/Orders/Orderrepository.dart';
|
||||
import '../../../Data/Repository/Summary/ordersrepository.dart';
|
||||
import '../../../Helper/Constants/Apiconstants.dart';
|
||||
import '../../../Helper/Logger.dart';
|
||||
import '../../../Model/Request/Notification/Notification_request_rider.dart';
|
||||
import '../../../Model/Request/Notification/Notificationrequest.dart';
|
||||
import '../../../Model/Request/Orders/Cancelorderrequest.dart';
|
||||
import '../../../Model/Response/Admintoken/Admintokenresponse.dart';
|
||||
import '../../../Model/Response/Notification/Notificationresponse.dart';
|
||||
import '../../../Model/Response/Orders/Getorderresponse.dart';
|
||||
import '../../../Model/Response/Summary/Cancelorderresponse.dart';
|
||||
import '../../../View/Home/Homeview.dart';
|
||||
|
||||
class CurrentOrderController extends GetxController {
|
||||
String? currentTime;
|
||||
String? notificationDate;
|
||||
|
||||
// Separate lists for each tab
|
||||
RxList<OrderDetails> placedOrders = <OrderDetails>[].obs;
|
||||
RxList<OrderDetails> ongoingOrders = <OrderDetails>[].obs;
|
||||
RxList<OrderDetails> completedOrders = <OrderDetails>[].obs;
|
||||
RxList<OrderDetails> cancelledOrders = <OrderDetails>[].obs;
|
||||
|
||||
// Loading states
|
||||
RxBool loadingPlaced = false.obs;
|
||||
RxBool loadingOngoing = false.obs;
|
||||
RxBool loadingCompleted = false.obs;
|
||||
RxBool loadingCancelled = false.obs;
|
||||
|
||||
// Track first load per tab
|
||||
bool hasLoadedPlaced = false;
|
||||
bool hasLoadedOngoing = false;
|
||||
bool hasLoadedCompleted = false;
|
||||
bool hasLoadedCancelled = false;
|
||||
|
||||
DateTime? now;
|
||||
int? userId;
|
||||
var orderId;
|
||||
var orderHeaderId;
|
||||
|
||||
List<Applocationadmins> adminDetails = [];
|
||||
List<String> adminToken = [];
|
||||
|
||||
OrdersRepository ordersRepository = OrdersRepository();
|
||||
OrderSummaryRepository orderSummaryRepository = OrderSummaryRepository();
|
||||
NotificationRepository notificationRepository = NotificationRepository();
|
||||
GetAdminTokenRepository getAdminTokenRepository = GetAdminTokenRepository();
|
||||
|
||||
final RoundedLoadingButtonController cancelOrderButton = RoundedLoadingButtonController();
|
||||
final RoundedLoadingButtonController acceptOrderButton = RoundedLoadingButtonController();
|
||||
|
||||
// Timer for auto-refreshing 'created' tab
|
||||
Timer? _autoRefreshTimer;
|
||||
|
||||
getAdminToken() async {
|
||||
GetAdminToken? result = await getAdminTokenRepository.getAdminToken();
|
||||
if (result?.status == true) {
|
||||
adminDetails = result?.details?.applocationadmins ?? [];
|
||||
adminToken.clear();
|
||||
for (var adminDetail in adminDetails) {
|
||||
adminToken.add(adminDetail.userfcmtokem ?? '');
|
||||
}
|
||||
}
|
||||
logger.i('adminToken $adminToken');
|
||||
}
|
||||
|
||||
// Get orders list by status
|
||||
List<OrderDetails> getOrdersByStatus(String status) {
|
||||
switch (status) {
|
||||
case 'created':
|
||||
return placedOrders;
|
||||
case 'ongoing':
|
||||
return ongoingOrders;
|
||||
case 'delivered':
|
||||
return completedOrders;
|
||||
case 'cancelled':
|
||||
return cancelledOrders;
|
||||
default:
|
||||
return placedOrders;
|
||||
}
|
||||
}
|
||||
|
||||
// Get loading state by status
|
||||
RxBool getLoadingByStatus(String status) {
|
||||
switch (status) {
|
||||
case 'created':
|
||||
return loadingPlaced;
|
||||
case 'ongoing':
|
||||
return loadingOngoing;
|
||||
case 'delivered':
|
||||
return loadingCompleted;
|
||||
case 'cancelled':
|
||||
return loadingCancelled;
|
||||
default:
|
||||
return loadingPlaced;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if already loaded
|
||||
bool hasLoaded(String status) {
|
||||
switch (status) {
|
||||
case 'created': return hasLoadedPlaced;
|
||||
case 'ongoing': return hasLoadedOngoing;
|
||||
case 'delivered': return hasLoadedCompleted;
|
||||
case 'cancelled': return hasLoadedCancelled;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Mark as loaded
|
||||
void markAsLoaded(String status) {
|
||||
switch (status) {
|
||||
case 'created': hasLoadedPlaced = true; break;
|
||||
case 'ongoing': hasLoadedOngoing = true; break;
|
||||
case 'delivered': hasLoadedCompleted = true; break;
|
||||
case 'cancelled': hasLoadedCancelled = true; break;
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch orders for a specific status
|
||||
Future<void> getOrder(String status) async {
|
||||
final loadingObs = getLoadingByStatus(status);
|
||||
final ordersList = getOrdersByStatus(status);
|
||||
|
||||
// Show shimmer only on first load
|
||||
if (!hasLoaded(status)) {
|
||||
loadingObs.value = true;
|
||||
}
|
||||
|
||||
try {
|
||||
GetOrders? result = await ordersRepository.getOrders(status);
|
||||
ordersList.assignAll(result?.details ?? []);
|
||||
markAsLoaded(status);
|
||||
} catch (e) {
|
||||
logger.e("Error fetching $status orders: $e");
|
||||
} finally {
|
||||
loadingObs.value = false;
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Start auto-refresh for 'created' tab only
|
||||
void startAutoRefresh() {
|
||||
_autoRefreshTimer?.cancel(); // Cancel any existing
|
||||
_autoRefreshTimer = Timer.periodic(Duration(seconds: 3), (timer) {
|
||||
// Only refresh 'created' tab
|
||||
getOrder('created');
|
||||
});
|
||||
}
|
||||
|
||||
// Stop auto-refresh
|
||||
void stopAutoRefresh() {
|
||||
_autoRefreshTimer?.cancel();
|
||||
_autoRefreshTimer = null;
|
||||
}
|
||||
|
||||
/// Decline Order in created State
|
||||
declineOrder(orderheaderId, orderId, customerToken, riderToken) async {
|
||||
now = DateTime.now();
|
||||
currentTime = DateFormat("yyyy-MM-dd HH:mm:ss").format(
|
||||
DateFormat("yyyy-MM-dd HH:mm:ss", "en_US").parse(now.toString()));
|
||||
declineOrderResult(
|
||||
CancelOrderRequest(
|
||||
orderheaderid: orderheaderId,
|
||||
orderstatus: "cancelled",
|
||||
cancelled: currentTime,
|
||||
),
|
||||
orderId,
|
||||
customerToken,
|
||||
riderToken
|
||||
);
|
||||
}
|
||||
|
||||
declineOrderResult(CancelOrderRequest data, orderId, customerToken, RiderToken) async {
|
||||
CancelOrderResponse? result = await orderSummaryRepository.updateOrders(data);
|
||||
logger.i('Update Order Result ${result!.toString()}');
|
||||
cancelOrderButton.reset();
|
||||
Get.to(() => HomeView(selectedIndex: 0));
|
||||
cancelOrderNotification(orderId, customerToken, RiderToken);
|
||||
}
|
||||
|
||||
cancelOrderNotification(orderId, customerToken, riderToken) async {
|
||||
logger.i('CustomerToken : ${customerToken}');
|
||||
logger.i('RiderToken : ${riderToken}');
|
||||
|
||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
String tenantName = prefs.getString('tenantName') ?? '';
|
||||
now = DateTime.now();
|
||||
notificationDate = DateFormat("yyyy-MM-dd HH:mm:ss").format(
|
||||
DateFormat("yyyy-MM-dd HH:mm:ss", "en_US").parse(now.toString()));
|
||||
cancelCustomerOrderNotificationResult(
|
||||
RiderNotificationRequest(
|
||||
notification: NotificationRider(
|
||||
title: "Nearle Daily",
|
||||
image: "",
|
||||
body: "Your Order ${orderId} has been cancelled\nby ${tenantName} ",
|
||||
sound: "ring",
|
||||
),
|
||||
token: customerToken,
|
||||
)
|
||||
);
|
||||
|
||||
if (riderToken != '')
|
||||
cancelCustomerOrderNotificationResult(
|
||||
RiderNotificationRequest(
|
||||
notification: NotificationRider(
|
||||
title: "NearleXpress",
|
||||
image: "",
|
||||
body: "${orderId} order has been cancelled\nby ${tenantName} ",
|
||||
sound: "ring",
|
||||
),
|
||||
token: riderToken,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
cancelCustomerOrderNotificationResult(RiderNotificationRequest data) async {
|
||||
NotificationResponse? result = await notificationRepository.notifyRider(data);
|
||||
if (result?.status == true) {
|
||||
// Handle success if needed
|
||||
}
|
||||
}
|
||||
|
||||
cancelRiderOrderNotificationResult(RiderNotificationRequest data) async {
|
||||
NotificationResponse? result = await notificationRepository.notifyRider(data);
|
||||
if (result?.status == true) {
|
||||
// Handle success if needed
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
// Start auto-refresh when controller is initialized
|
||||
startAutoRefresh();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
// Stop timer when controller is disposed
|
||||
stopAutoRefresh();
|
||||
super.onClose();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user