second commit

This commit is contained in:
Anbarasu
2026-05-27 10:35:09 +05:30
parent c53794c04c
commit 1435ac47b0
501 changed files with 52818 additions and 0 deletions

View File

@@ -0,0 +1,391 @@
import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'package:country_currency_pickers/country.dart';
import 'package:country_currency_pickers/utils/utils.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:http/http.dart';
import 'package:http/http.dart' as dio1;
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart';
import 'package:otp_timer_button/otp_timer_button.dart';
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sms_autofill/sms_autofill.dart';
import '../../Data/Repository/Authentication/loginrepository.dart';
import '../../Helper/Constants/Colorconstants.dart';
import '../../Helper/Logger.dart';
import '../../Helper/toast.dart';
import '../../Model/Request/Authentication/Loginrequest.dart';
import '../../Model/Response/Authentication/Loginresponse.dart';
import '../../View/Authentication/Otpverification.dart';
import '../../View/Authentication/Usercreate/Usercreateview.dart';
class AuthController extends GetxController with CodeAutoFill{
String? formatter;
String? currencyCode;
String? fcmEntryToken;
String? resendOtp;
String? userFcmToken;
String? contactNo;
//Otp
String? smsOtp;
String verifyId = "";
int authmode = 0;
bool termsChecking =false;
//Otp
bool codeSent = false;
var loginStatus;
String? contactLength;
// FirebaseMessaging firebaseMessaging = FirebaseMessaging.instance;
FirebaseMessaging firebaseMessaging = FirebaseMessaging.instance;
Country selectedDialogCountry = CountryPickerUtils.getCountryByIsoCode('IN');
// final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
final RoundedLoadingButtonController loginController = RoundedLoadingButtonController();
//Otp
OtpTimerButtonController otpTimerController = OtpTimerButtonController();
TextEditingController loginPhoneNumberController = TextEditingController();
TextEditingController otpController = TextEditingController();
TextEditingController textEditingController = TextEditingController();
LoginRepository loginRepository = LoginRepository();
@override
void onInit() {
getId();
fcmToken();
listenForCode();
super.onInit();
}
@override
void onClose() {
cancel(); /// Stop listening for the OTP code
super.onClose();
}
@override
void codeUpdated() {
otpController.text = code ?? '';
logger.i("OTP Code Received: ${otpController.text}");
}
@override
void dispose() {
// TODO: implement dispose
SmsAutoFill().unregisterListener();
loginPhoneNumberController.dispose();
otpController.dispose();
super.dispose();
}
fcmToken() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var token = await firebaseMessaging.getToken();
logger.i("firebase token======$token");
fcmEntryToken = token;
prefs.setString('fcmToken', token!);
logger.i("tenanttokensetstring ${prefs.getString('fcmToken')}");
}
void currency() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
currencyCode = prefs.getString('Code_Currency')!;
final formats = NumberFormat();
formatter = formats.simpleCurrencySymbol("$currencyCode");
prefs.setString('Currency_Symbol', formatter!);
}
void loginTenant(context) async {
Timer(const Duration(seconds: 1), () {
// btnController.success();
profileValidation(context);
});
}
profileValidation(context)async{
if (loginPhoneNumberController.text.isEmpty) {
loginController.reset();
Toast.showToast("Please Enter Mobile Number");
} else if (!RegExp(
r'^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$')
.hasMatch(loginPhoneNumberController.text)) {
loginController.reset();
Toast.showToast("Please Enter a Valid Phone Number");
} else if(termsChecking==false){
loginController.reset();
Toast.showToast("Please Select Terms of Service");
}
else {
signIn(context);
}
}
String? uniqueDeviceId;
String? deviceId;
var iosDeviceInfo;
var androidDeviceInfo;
Future<String?> getId() async {
// var deviceInfo = DeviceInfoPlugin();
SharedPreferences prefs = await SharedPreferences.getInstance();
if (Platform.isIOS) { // import 'dart:io'
// iosDeviceInfo = await deviceInfo.iosInfo;
deviceId = iosDeviceInfo.toMap().toString();
uniqueDeviceId = iosDeviceInfo.id;
prefs.setString('deviceId',uniqueDeviceId!);
print('iosDeviceInfodeviceId$deviceId');
print('uniqueDeviceId${prefs.getString('deviceId')}');
return iosDeviceInfo.identifierForVendor; // Unique ID on iOS
} else {
// androidDeviceInfo = await deviceInfo.androidInfo;
deviceId = androidDeviceInfo.toMap().toString();
uniqueDeviceId = androidDeviceInfo.id;
prefs.setString('deviceId',uniqueDeviceId!);
print('androidDeviceInfodeviceId$deviceId');
print('uniqueDeviceId${prefs.getString('deviceId')}');
return androidDeviceInfo.androidId; // Unique ID on Android
}
print('${deviceId =androidDeviceInfo.androidId}');
}
//Authentication
signIn(context) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
// ✅ Ensure FCM token is ready before calling API
if (fcmEntryToken == null) {
await fcmToken();
}
// Prepare data
final contactNo = loginPhoneNumberController.text;
final configId = 1;
final deviceType = Platform.operatingSystem;
final fcmTokenValue = fcmEntryToken ?? '';
final deviceId1 = deviceId ?? '';
// ✅ Print all values before sending
print("========= LOGIN REQUEST DATA =========");
print("📱 Contact No : $contactNo");
print("⚙️ Config ID : $configId");
print("💻 Device Type : $deviceType");
print("🔑 FCM Token : $fcmTokenValue");
print("🆔 Device ID : $deviceId1");
print("======================================");
// Call login API
loginApi(
LoginRequest(
contactno: contactNo,
configid: configId,
devicetype: deviceType,
userfcmtoken: fcmTokenValue,
deviceid: deviceId1,
),
context,
);
}
loginApi(LoginRequest data,context) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
LoginResponse? result = await loginRepository.signIn(data);
if (result?.status == true) {
loginStatus = result?.status;
authmode = result?.details?.authmode??0;
userFcmToken = result?.details?.userfcmtoken;
contactNo = result?.details?.contactno;
logger.i('loginApilocationname ${result?.details?.locationname}');
prefs.setInt('userId', result?.details?.userid ?? 0);
prefs.setString('authName', result?.details?.authname ?? '');
prefs.setInt('configId', result?.details?.configid ?? 0);
prefs.setInt('authMode', result?.details?.authmode ?? 0);
prefs.setInt('roleId', result?.details?.roleid ?? 0);
prefs.setString('userFirstName', result?.details?.firstname ?? '');
prefs.setString('userLastName', result?.details?.lastname ?? '');
prefs.setString('userPassword', result?.details?.password ?? '');
prefs.setString('userEmail', result?.details?.email ?? '');
// prefs.setString('tenantContactNo', result?.details?.contactno ?? '');
prefs.setString('address', result?.details?.address ?? '');
prefs.setString('userSuburb', result?.details?.suburb ?? '');
prefs.setString('userCity', result?.details?.city ?? '');
prefs.setString('userState', result?.details?.state ?? '');
prefs.setString('userPostcode', result?.details?.postcode ?? '');
// prefs.setString('tenantFcmToken', result?.details?.userfcmtoken ?? '');
prefs.setInt('userPin', result?.details?.pin ?? 0);
prefs.setInt('partnerId', result?.details?.partnerid ?? 0);
prefs.setInt('tenantId', result?.details?.tenantid ?? 0);
prefs.setString('userName', result?.details?.fullname ?? '');
prefs.setString('tenantName', result?.details?.tenantname ?? '');
prefs.setString('tenantAddress', result?.details?.tenantaddress ?? '');
prefs.setString('tenantCity', result?.details?.tenantcity ?? '');
prefs.setString('tenantPostcode', result?.details?.tenantpostcode ?? '');
prefs.setString('tenantLatitude', result?.details?.tenantlat ?? '');
prefs.setString('tenantLongitude', result?.details?.tenantlong ?? '');
prefs.setInt('locationId', result?.details?.locationid ?? 0);
prefs.setString('locationName', result?.details?.locationname ?? '');
prefs.setString('appLocation', result?.details?.applocation ?? '');
prefs.setString('appLatitude', result?.details?.applatitude ?? '');
prefs.setString('appLongitude', result?.details?.applongitude ?? '');
prefs.setInt('appRadius', result?.details?.appradius ?? 0);
prefs.setInt('appLocationId', result?.details?.applocationid ?? 0);
prefs.setInt('moduleId', result?.details?.moduleid ?? 0);
logger.i('App location Id from login : ${prefs.getInt('appLocationId')}');
logger.i('location Id from login : ${prefs.getInt('locationId')}');
update();
}
if(authmode !=1) {
sendSmsOtp('${loginPhoneNumberController.text.trim()}',
authmode: result?.details?.authmode ?? 0);
}
else{
otpController.clear();
resendOtp = '123456';
if(authmode==1){
var snackBar = SnackBar(
backgroundColor: ColorConstants.primaryColor,
duration: const Duration(seconds: 5),
content: Text('Please enter your 6 digit verification code provided by Nearlexpress Business',style: TextStyle(color: ColorConstants.secondaryColor),)
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
Get.to(()=>OTPVerification(otp: '$resendOtp' ,authmode: authmode,logInStatus:loginStatus ,));
}
loginController.reset();
}
//Otp
sendSmsOtp(String mobile, {authmode=0}) async {
int otpInput = await otpGenerator();
smsOtp = otpInput.toString();
if(authmode==1)
{
onNavigateToProfileNumberVerification(otp: "123456",authmode: authmode);
}
else {
receiveSmsOtp(mobile,smsOtp.toString(), Get.context);
}
}
Future<void> receiveSmsOtp(String phoneNumber, String otp, context) async {
final appSignature = await SmsAutoFill().getAppSignature;
final message = "<#> Dear customer, use OTP $otp to sign in to Nearle App.\n$appSignature";
final encodedMessage = Uri.encodeComponent(message);
final url = Uri.parse(
'https://msg.lionsms.com/api/smsapi?'
'key=e57f5c9679af26077be1a7eadabb1b2a'
'&route=7'
'&sender=NEARLE'
'&number=$phoneNumber'
'&sms=$encodedMessage'
'&templateid=1107174712357438611',
);
logger.i('urlsendOtp $url');
logger.i('appSignaturereceiveSmsOtp $appSignature');
try {
final response = await http.get(url);
if (response.statusCode == 200) {
logger.i("SMS sent successfully");
receiveOtp(response, otp);
} else {
logger.i("Failed to send SMS: ${response.body}");
}
} catch (e) {
logger.i("Error sending SMS: $e");
}
}
receiveOtp(model,otp) async{
onNavigateToProfileNumberVerification(otp: otp);
}
onNavigateToProfileNumberVerification({String? otp,authmode=0}){
otpController.clear();
print('onNavigateToProfileNumberVerification $otp');
resendOtp = otp;
Get.to(()=>OTPVerification(otp: resendOtp??'' ,authmode: authmode,logInStatus: loginStatus,));
}
otpGenerator(){
var rng = Random();
var next = rng.nextDouble() * 1000000;
while (next < 100000) {
next *= 10;
}
print(next.toInt());
print("random${next.toInt()}");
return next.toInt();
}
Future<void> getHintPhoneNumber(context) async {
try {
final phoneNumber = await SmsAutoFill().hint;
if (phoneNumber != null) {
// Remove +91 from the phone number
String cleanedPhoneNumber = phoneNumber.startsWith('+91')
? phoneNumber.substring(3)
: phoneNumber;
loginPhoneNumberController.text = cleanedPhoneNumber;
contactLength = cleanedPhoneNumber;
// doSomething(context);
update();
logger.i("Phone number retrieved: ${loginPhoneNumberController.text}");
}
} catch (e) {
logger.i("Failed to retrieve phone number hint: $e");
}
}
}

View File

@@ -0,0 +1,599 @@
import 'dart:async';
import 'dart:convert';
import 'dart:math';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:geolocator/geolocator.dart' as LocationAccuracy;
import 'package:flutter/cupertino.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:minio/io.dart';
import 'package:minio/minio.dart';
import 'package:path/path.dart' as path;
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'dart:io';
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../Data/Provider/Appcategory/Appcategoryprovider.dart';
import '../../Data/Repository/Appcategory/Appcategoryrepository.dart';
import '../../Data/Repository/Applocation/Applocationrepository.dart';
import '../../Data/Repository/Authentication/Createtenantuser/Createtenantuserrepository.dart';
import '../../Data/Repository/TenantPartner/Tenantpartnerrepository.dart';
import '../../Helper/Logger.dart';
import '../../Helper/location_service.dart';
import '../../Helper/toast.dart';
import '../../Model/Request/Authentication/Createuser/Createuserresponse.dart';
import '../../Model/Response/Appcategory/app_category_response.dart';
import '../../Model/Response/Applocations/Applocationresponse.dart';
import '../../Model/Response/Authentication/Createtenantuser/Createtenantuserresponse.dart';
import '../../Model/Response/Partners/Getpartnerinforequest.dart';
import '../../View/Success/Successview.dart';
class CreateUserController extends GetxController {
String appLocationName = '';
String appCategoryName = '';
String partnerName = '';
String? latitude;
String? longitude;
String? catName;
int? moduleIdByCategory = 0;
String? subCatName;
String? fcmEntryToken;
String? todayDate;
String? validityDate;
String? url; // This will hold the uploaded image URL
int selectedIndex = 0;
int? catId;
int? subCatId;
String? deviceId;
int appLocationId = 0;
int partnerSelectedIndex = -1;
int? partnerId;
List<AppLocationDetails> locations = [];
List<PartnerInfoDetails> getPartners = [];
List<AppCategoryDetails> appCategory = [];
Position? resultPosition;
List<SubCategory> subCategories = [];
Future<void> getFcmToken() async {
try {
await FirebaseMessaging.instance.requestPermission();
fcmEntryToken = await FirebaseMessaging.instance.getToken();
print('FCM Token: $fcmEntryToken');
FirebaseMessaging.instance.onTokenRefresh.listen((newToken) {
fcmEntryToken = newToken;
print('FCM Token Refreshed: $fcmEntryToken');
});
} catch (e) {
print('Error getting FCM token: $e');
}
}
Future<void> getSubCategories() async {
final provider = SubCategoryProvider();
final List<SubCategory> fetched = await provider.fetchSubCategories();
subCategories.assignAll(fetched);
update();
}
final String apiUrl = "https://fiesta.nearle.app/live/api/v1/mob/utils/getsubcategories";
Future<GetSubCategoriesResponse?> fetchSubCategories() async {
try {
final response = await http.get(Uri.parse(apiUrl));
if (response.statusCode == 200) {
final jsonData = json.decode(response.body);
return GetSubCategoriesResponse.fromJson(jsonData);
} else {
print("Failed to load subcategories: ${response.statusCode}");
}
} catch (e) {
print("Error fetching subcategories: $e");
}
return null;
}
bool shimmer = true;
bool categoryShimmer = true;
bool isEnterAddress = false;
String selectedCategoryName = '';
var currentLat;
var currentLong;
TextEditingController firstnameController = TextEditingController();
TextEditingController lastnameController = TextEditingController();
TextEditingController companyNameController = TextEditingController();
TextEditingController emailController = TextEditingController();
TextEditingController gstinNumberController = TextEditingController();
TextEditingController contactNoController = TextEditingController();
TextEditingController addressController = TextEditingController();
TextEditingController stateController = TextEditingController();
TextEditingController cityController = TextEditingController();
TextEditingController suburbController = TextEditingController();
TextEditingController postcodeController = TextEditingController();
final searchText = ''.obs;
final predictions = <Map<String, dynamic>>[].obs;
final selectedPlace = {}.obs;
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
AppLocationRepository appLocationRepository = AppLocationRepository();
GetPartnersRepository getPartnersRepository = GetPartnersRepository();
AppCategoryRepository appCategoryRepository = AppCategoryRepository();
CreateTenantUserRepository createTenantUserRepository = CreateTenantUserRepository();
final GooglePlacesService placesService = GooglePlacesService();
getAppLocations() async {
GetAppLocations? result = await appLocationRepository.getAppLocations();
if (result?.code == 200) {
locations = result?.details ?? [];
shimmer = false;
update();
} else {
Toast.showToast("${result?.message}");
}
}
getCurrentLocation() async {
resultPosition = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.LocationAccuracy.high);
currentLat = resultPosition?.latitude.toString();
currentLong = resultPosition?.longitude.toString();
print('currentLatinlocation $currentLat');
print('currentLonglocation $currentLong');
getAddressFromLatLongs(double.parse(currentLat), double.parse(currentLong));
}
getAppCategory() async {
categoryShimmer = true;
update();
try {
final provider = SubCategoryProvider();
final List<SubCategory> subCats = await provider.fetchSubCategories();
final Map<int, AppCategoryDetails> uniqueCats = {};
for (var sub in subCats) {
if (sub.categoryid != null && sub.catgeoryname != null) {
uniqueCats[sub.categoryid!] = AppCategoryDetails(
categoryid: sub.categoryid,
categoryname: sub.catgeoryname,
moduleid: sub.moduleid,
);
}
}
appCategory = uniqueCats.values.toList();
logger.i('Loaded ${appCategory.length} categories');
if (appCategory.isNotEmpty) {
catId = appCategory[0].categoryid;
catName = appCategory[0].categoryname;
moduleIdByCategory = appCategory[0].moduleid;
}
} catch (e) {
logger.e('Error loading categories: $e');
Toast.showToast("Failed to load categories");
}
categoryShimmer = false;
update();
}
Future<void> getAddressFromLatLongs(double latitudes, double longitudes) async {
await placemarkFromCoordinates(latitudes, longitudes).then((List<Placemark> placemarks) {
Placemark place = placemarks[0];
cityController.text = place.locality ?? '';
stateController.text = place.administrativeArea ?? '';
suburbController.text = '${place.subLocality ?? place.street}';
postcodeController.text = place.postalCode ?? '';
latitude = latitudes.toString();
longitude = longitudes.toString();
addressController.text =
'${place.street}, ${place.subLocality}, ${place.locality}, ${place.administrativeArea} ${place.subAdministrativeArea}, ${place.country}, ${place.postalCode}.';
update();
}).catchError((e) {
debugPrint(e);
});
}
getPartnersInfo(locationId) async {
GetPartnersInfo? result = await getPartnersRepository.getPartners(locationId);
getPartners = result?.details ?? [];
partnerId = getPartners.isNotEmpty ? getPartners[0].partnerid : null;
print('getPartnerslengthss${getPartners.length}');
print('getpartnerId$partnerId');
}
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();
}
}
getPlaceDetails(String placeId, locationAddress) async {
try {
final details = await placesService.getPlaceDetails(placeId);
selectedPlace.value = details;
getAddressFromLatLng(
selectedPlace['geometry']['location']['lat'],
selectedPlace['geometry']['location']['lng'],
locationAddress,
);
} catch (e) {
print('Error fetching place details: $e');
}
}
getAddressFromLatLng(double latitudes, double longitudes, locationAddress) async {
await placemarkFromCoordinates(latitudes, longitudes).then((List<Placemark> placemarks) {
Placemark place = placemarks[0];
cityController.text = place.locality ?? '';
stateController.text = place.administrativeArea ?? '';
suburbController.text = (place.subLocality?.isNotEmpty == true) ? place.subLocality! : place.street!;
postcodeController.text = place.postalCode ?? '';
addressController.text = locationAddress;
latitude = latitudes.toString();
longitude = longitudes.toString();
predictions.clear();
update();
}).catchError((e) {
debugPrint(e);
});
}
void doSomething() async {
Timer(const Duration(seconds: 1), () {
profileValidation();
});
}
profileValidation() async {
if (firstnameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter Firstname");
return;
}
if (companyNameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter Companyname");
return;
}
if (emailController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter Email");
return;
}
if (addressController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter Address");
return;
}
if (suburbController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter Suburb");
return;
}
if (cityController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter City");
return;
}
if (stateController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter State");
return;
}
if (postcodeController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter Postcode");
return;
}
// Handle image upload if selected
if (profileImage != null) {
btnController.start();
final uploadedUrl = await uploadImageAndSave(File(profileImage!.path));
if (uploadedUrl == null) {
btnController.reset();
Toast.showToast("Image upload failed. Please try again.");
return;
}
url = uploadedUrl;
} else {
url = null; // Optional: send empty or placeholder
}
// Now safe to create tenant
createTenantUser();
}
createTenantUser() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
DateTime now = DateTime.now();
todayDate = DateFormat("yyyy-MM-dd").format(now);
validityDate = DateTime(now.year + 1, now.month, now.day).toString();
deviceId = prefs.getString('deviceId');
final request = CreateTenantUser(
tenantimage: url, // Now correctly set
configid: 1,
allocationid: 2,
roleid: 1,
tenantname: companyNameController.text,
tenanttype: "D",
registrationno: gstinNumberController.text,
devicetype: Platform.isAndroid ? "android" : "ios",
deviceid: deviceId ?? '',
tenanttoken: fcmEntryToken ?? '',
companyname: companyNameController.text,
firstname: firstnameController.text,
primaryemail: emailController.text,
primarycontact: contactNoController.text,
categoryid: catId,
subcategoryid: subCatId,
moduleid: 2,
address: addressController.text,
suburb: suburbController.text,
state: stateController.text,
city: cityController.text,
postcode: postcodeController.text,
latitude: latitude,
longitude: longitude,
applocationid: 1,
approved: 0,
tenantlocations: Tenantlocations(
locationid: 0,
applocationid: appLocationId,
tenantid: 0,
moduleid: 2,
locationname: companyNameController.text,
email: emailController.text,
contactno: contactNoController.text,
address: addressController.text,
suburb: suburbController.text,
state: stateController.text,
city: cityController.text,
postcode: postcodeController.text,
latitude: latitude,
longitude: longitude,
partnerid: partnerId,
opentime: "09:00",
closetime: "21:00",
deliverytype: 0,
deliverymins: 60,
cancelsecs: 20,
),
tenantsubscriptions: Tenantsubscriptions(
subscriptionid: 0,
tenantid: 0,
transactiondate: todayDate,
moduleid: 2,
applocationid: appLocationId,
categoryid: catId,
subcategoryid: subCatId,
validitydate: validityDate?.split(' ')[0] ?? '',
subscriptionprice: 300.00,
quantity: 1,
taxamount: 0.00,
taxpercent: 18,
totalamount: 300.00,
paymentstatus: 1,
),
);
createTenantUserResult(request);
}
createTenantUserResult(CreateTenantUser data) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
CreateTenantUserResponse? result = await createTenantUserRepository.createTenantUser(data);
if (result?.status == true) {
await Future.wait([
prefs.setInt('userId', result?.details?.userid ?? 0),
prefs.setInt('configId', result?.details?.configid ?? 0),
prefs.setString('userEmail', result?.details?.authname ?? ''),
prefs.setInt('authMode', result?.details?.authmode ?? 0),
prefs.setInt('roleId', result?.details?.roleid ?? 0),
prefs.setString('userFirstname', result?.details?.firstname ?? ''),
prefs.setString('userLastname', result?.details?.lastname ?? ''),
prefs.setString('userName', result?.details?.fullname ?? ''),
prefs.setString('password', result?.details?.password ?? ''),
prefs.setString('userEmail', result?.details?.email ?? ''),
prefs.setString('tenantContactNo', result?.details?.contactno ?? ''),
prefs.setString('userAddress', result?.details?.address ?? ''),
prefs.setString('userSuburb', result?.details?.suburb ?? ''),
prefs.setString('userCity', result?.details?.city ?? ''),
prefs.setString('userState', result?.details?.state ?? ''),
prefs.setString('userPostcode', result?.details?.postcode ?? ''),
prefs.setString('userFcmToken', result?.details?.userfcmtoken ?? ''),
prefs.setInt('userPin', result?.details?.pin ?? 0),
prefs.setInt('partnerId', result?.details?.partnerid ?? 0),
prefs.setInt('locationId', result?.details?.locationid ?? 0),
prefs.setInt('tenantId', result?.details?.tenantid ?? 0),
prefs.setString('tenantName', result?.details?.tenantname ?? ''),
prefs.setString('tenantAddress', result?.details?.address ?? ''),
prefs.setString('tenantSuburb', result?.details?.suburb ?? ''),
prefs.setString('tenantCity', result?.details?.city ?? ''),
prefs.setString('tenantState', result?.details?.state ?? ''),
prefs.setString('tenantPostcode', result?.details?.postcode ?? ''),
prefs.setInt('moduleId', result?.details?.moduleid ?? 0),
prefs.setString('locationName', result?.details?.locationname ?? ''),
prefs.setInt('categoryId', result?.details?.categoryid ?? 0),
prefs.setInt('subcategoryId', result?.details?.subcategoryid ?? 0),
prefs.setInt('appLocationId', result?.details?.applocationid ?? 0),
]);
logger.i('TenantId From Create Tenant Response: ${prefs.getInt('tenantId')}');
// Clear fields
firstnameController.clear();
companyNameController.clear();
emailController.clear();
addressController.clear();
suburbController.clear();
cityController.clear();
stateController.clear();
postcodeController.clear();
profileImage = null;
url = null;
btnController.reset();
update();
await Future.delayed(Duration(milliseconds: 100));
Get.to(() => AccountCreatedScreen());
} else {
btnController.reset();
Toast.showToast("${result?.message}");
}
}
Future<Position> getLocation() async {
LocationPermission permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
return Future.error('Location permissions are denied');
}
}
if (permission == LocationPermission.deniedForever) {
await Geolocator.openLocationSettings();
return Future.error('Location permissions are permanently denied');
}
Position position = await Geolocator.getCurrentPosition();
await getAddressFromLatLongs(position.latitude, position.longitude);
logger.i(position);
return position;
}
XFile? profileImage;
final _picker = ImagePicker();
RxString uploadedFileUrl = ''.obs;
// Only pick image — upload later
Future getProfileImage() async {
final XFile? selectedImage = await _picker.pickImage(source: ImageSource.gallery);
if (selectedImage != null) {
profileImage = selectedImage;
update();
} else {
Toast.showToast('Image Not Selected');
}
}
// Upload image and return public URL
Future<String?> uploadImageAndSave(File selectedImage) async {
try {
var rng = Random();
const String region = "sgp1";
const String accessKey = "DO00NQER7N2FRYZAB2HR";
const String secretKey = "nMDewX25IBEu1FM5dakK+v28/WbW3TzBAwq913+dxP0";
const String bucketName = "nearle";
const String folderName = "deals";
String fileName = 'profile-${rng.nextInt(1000)}-1234.jpg';
String endpointUrl = "https://$bucketName.$region.digitaloceanspaces.com/$folderName/$fileName";
final minio = Minio(
endPoint: '$region.digitaloceanspaces.com', // ✅ FIXED HERE
accessKey: accessKey,
secretKey: secretKey,
region: region,
useSSL: true,
);
await minio.fPutObject(
bucketName,
'$folderName/$fileName',
selectedImage.path,
metadata: {
'Content-Type': 'image/jpeg',
'x-amz-acl': 'public-read',
},
);
print("File uploaded successfully: $endpointUrl");
return endpointUrl;
} catch (e) {
Get.snackbar("Error", "Image upload failed: $e");
print("Upload error: $e");
return null;
}
}
@override
void onInit() {
getFcmToken();
getLocation();
getSubCategories();
getAppCategory();
super.onInit();
}
@override
void dispose() {
firstnameController.dispose();
lastnameController.dispose();
companyNameController.dispose();
emailController.dispose();
gstinNumberController.dispose();
contactNoController.dispose();
addressController.dispose();
stateController.dispose();
cityController.dispose();
suburbController.dispose();
postcodeController.dispose();
super.dispose();
}
}
class SubCategoryService {
final String apiUrl = "https://fiesta.nearle.app/live/api/v1/mob/utils/getsubcategories";
Future<GetSubCategoriesResponse?> fetchSubCategories() async {
try {
final response = await http.get(Uri.parse(apiUrl));
if (response.statusCode == 200) {
final jsonData = json.decode(response.body);
print(response.body);
return GetSubCategoriesResponse.fromJson(jsonData);
} else {
print("Failed to load subcategories: ${response.statusCode}");
}
} catch (e) {
print("Error fetching subcategories: $e");
}
return null;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,218 @@
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:geocoding/geocoding.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../../Globalwidgets/Googleplaces/Googleplaces.dart';
import '../../../../Helper/location_service.dart';
class DropGoogleMapsController extends GetxController{
String? toAddress;
String? toLatitude;
String? toLongitude;
String? country;
String? dialCode;
String? countryCode;
String? googleApiKey;
String? initialCountry;
bool? isSuburbTrue = false;
bool? isCity = false;
List autoCompleteResult = [];
List<LatLng> latlng = [];
var address;
static LatLng? center;
static double? currentLatitude;
static double? currentLongitude;
Set<Marker>markers = {};
Set<Polyline>polyline={};
//Autocomplete
final pickupSearchText = ''.obs;
final dropSearchText = ''.obs;
final pickupPredictions = <Map<String, dynamic>>[].obs;
final pickupSelectedPlace = {}.obs;
final dropPredictions = <Map<String, dynamic>>[].obs;
final dropSelectedPlace = {}.obs;
final GooglePlacesService placesService = GooglePlacesService();
CameraPosition? kGooglePlex;
Completer<GoogleMapController> controllers = Completer();
late GoogleMapController mapController;
// LocationService locationService = LocationService();
TextEditingController searchController = TextEditingController();
TextEditingController dropAddressController = TextEditingController();
TextEditingController dropStateController = TextEditingController();
TextEditingController dropCityController = TextEditingController();
TextEditingController dropSuburbController = TextEditingController();
TextEditingController dropPostcodeController = TextEditingController();
Future<void> goToThePosition(cameraPosition) async {
final GoogleMapController controller = await controllers.future;
controller.animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
}
onSearchDropTextChanged(String text) async {
dropSearchText.value = text;
if (text.length > 2) {
try {
final places = await placesService.getPlacesPredictions(text);
// final places = await autocompletePlaces(text);
dropPredictions.assignAll(places);
update();
} catch (e) {
print('Error fetching predictions: $e');
}
} else {
dropPredictions.clear();
update();
}
}
getDropPlaceDetails(String placeId,locationAddress) async {
try {
final details = await placesService.getPlaceDetails(placeId);
dropSelectedPlace.value = details;
print('getDropPlaceDetailslatitude ${dropSelectedPlace['geometry']['location']['lat']}');
print('getDropPlaceDetailslongitude ${dropSelectedPlace['geometry']['location']['lng']}');
getDropAddressFromLatLng(dropSelectedPlace['geometry']['location']['lat'],dropSelectedPlace['geometry']['location']['lng'],locationAddress);
} catch (e) {
print('Error fetching place details: $e');
}
}
getDropAddressFromLatLng(double latitudes, double longitudes,locationAddress) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
await placemarkFromCoordinates(latitudes, longitudes).then((List<Placemark> placemarks) {
Placemark place = placemarks[0];
dropCityController.text = '${place.locality}' ?? '';
dropStateController.text = '${place.administrativeArea}' ?? '';
dropSuburbController.text = '${place.subLocality!.isNotEmpty?place.subLocality:place.street}';
dropPostcodeController.text ='${place.postalCode}' ?? '';
dropAddressController.text = locationAddress ?? '';
toAddress = dropAddressController.text;
toLatitude = double.parse(latitudes.toString()).toString();
toLongitude = double.parse(longitudes.toString()).toString();
kGooglePlex = CameraPosition(
target: LatLng(double.parse(toLatitude.toString()), double.parse(toLongitude.toString())),
zoom: 14.4746,
);
goToThePosition(kGooglePlex);
dropPredictions.clear();
update();
print('latitude $toLatitude');
print('longitude $toLongitude');
}).catchError((e) {
debugPrint(e);
});
}
getCountry() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
dialCode = prefs.getString('dialCode') ?? '';
print(dialCode);
googleApiKey = prefs.getString('googleApi');
initialCountry = prefs.getString('location_Country');
markers.add(Marker(
markerId: MarkerId('Mylocation'),
infoWindow: InfoWindow(title: 'My Location'),
draggable: true,
onDragEnd: (latLong) async {
print('latLongDrag$latLong');
center = latLong;
getAddressFromLatLong(
double.parse(latLong.latitude.toString()), double.parse(latLong.longitude.toString()));
print("addressonDragEnd$address");
update();
},
onDrag: (latLong) {
center = latLong;
},
icon: BitmapDescriptor.defaultMarker,
position: center!,
));
getAddressFromLatLong(
double.parse(currentLatitude.toString()), double.parse(currentLongitude.toString()));
// number = PhoneNumber(isoCode: initialCountry);
update();
print('$googleApiKey google');
// print(number);
}
Future<void> getAddressFromLatLong(double latitudes, double longitudes) async {
print('getCurrentLocationAddressssssss');
await placemarkFromCoordinates(
latitudes, longitudes)
.then((List<Placemark> placemarks) {
Placemark place = placemarks[0];
dropCityController.text = place.locality ?? '';
dropStateController.text = place.administrativeArea ?? '';
dropSuburbController.text = '${place.subLocality??place.street}' ;
dropPostcodeController.text = place.postalCode ?? '';
toLatitude = double.parse(latitudes.toString()).toString();
toLongitude = double.parse(longitudes.toString()).toString();
print('latitudegetAddresstoLatitude$toLatitude');
print('longitudegetAddresstoLongitude$toLongitude');
dropAddressController.text = '${place.street}, ${place.subLocality},${place.locality},${place.administrativeArea} ${place.subAdministrativeArea},${place.country},${place.postalCode}.';
print('dropAddressControllergetAddresstoLongitude ${dropAddressController.text}');
update();
}).catchError((e) {
debugPrint(e);
});
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,215 @@
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:geocoding/geocoding.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../../Globalwidgets/Googleplaces/Googleplaces.dart';
import '../../../../Helper/location_service.dart';
class PickupGoogleMapsController extends GetxController{
String? fromAddress;
String? fromLatitude;
String? fromLongitude;
String? country;
String? dialCode;
String? countryCode;
String? googleApiKey;
String? initialCountry;
bool? isSuburbTrue = false;
bool? isCity = false;
List autoCompleteResult = [];
List<LatLng> latlng = [];
var address;
static LatLng? center;
static double? currentLatitude;
static double? currentLongitude;
Set<Marker>markers = {};
Set<Polyline>polyline={};
//Autocomplete
final pickupSearchText = ''.obs;
final pickupPredictions = <Map<String, dynamic>>[].obs;
final pickupSelectedPlace = {}.obs;
final GooglePlacesService placesService = GooglePlacesService();
CameraPosition? kGooglePlex;
Completer<GoogleMapController> controllers = Completer();
late GoogleMapController mapController;
// LocationService locationService = LocationService();
TextEditingController searchController = TextEditingController();
TextEditingController pickupAddressController = TextEditingController();
TextEditingController pickupStateController = TextEditingController();
TextEditingController pickupCityController = TextEditingController();
TextEditingController pickupSuburbController = TextEditingController();
TextEditingController pickupPostcodeController = TextEditingController();
Future<void> goToThePosition(cameraPosition) async {
final GoogleMapController controller = await controllers.future;
controller.animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
}
onSearchPickupTextChanged(String text) async {
pickupSearchText.value = text;
if (text.length > 2) {
try {
final places = await placesService.getPlacesPredictions(text);
// final places = await autocompletePlaces(text);
pickupPredictions.assignAll(places);
update();
} catch (e) {
print('Error fetching predictions: $e');
}
} else {
pickupPredictions.clear();
update();
}
}
getPickupPlaceDetails(String placeId,locationAddress) async {
try {
final details = await placesService.getPlaceDetails(placeId);
pickupSelectedPlace.value = details;
print('getDropPlaceDetailslatitude ${pickupSelectedPlace['geometry']['location']['lat']}');
print('getDropPlaceDetailslongitude ${pickupSelectedPlace['geometry']['location']['lng']}');
getPickupAddressFromLatLng(pickupSelectedPlace['geometry']['location']['lat'],pickupSelectedPlace['geometry']['location']['lng'],locationAddress);
} catch (e) {
print('Error fetching place details: $e');
}
}
getPickupAddressFromLatLng(double latitudes, double longitudes,locationAddress) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
await placemarkFromCoordinates(latitudes, longitudes).then((List<Placemark> placemarks) {
Placemark place = placemarks[0];
pickupCityController.text = '${place.locality}' ?? '';
pickupStateController.text = '${place.administrativeArea}' ?? '';
pickupSuburbController.text = '${place.subLocality!.isNotEmpty?place.subLocality:place.street}';
pickupPostcodeController.text ='${place.postalCode}' ?? '';
pickupAddressController.text = locationAddress ?? '';
fromAddress = pickupAddressController.text;
fromLatitude = double.parse(latitudes.toString()).toString();
fromLongitude = double.parse(longitudes.toString()).toString();
kGooglePlex = CameraPosition(
target: LatLng(double.parse(fromLatitude.toString()), double.parse(fromLongitude.toString())),
zoom: 14.4746,
);
goToThePosition(kGooglePlex);
pickupPredictions.clear();
update();
print('latitude $fromLatitude');
print('longitude $fromLongitude');
}).catchError((e) {
debugPrint(e);
});
}
getCountry() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
dialCode = prefs.getString('dialCode') ?? '';
print(dialCode);
googleApiKey = prefs.getString('googleApi');
initialCountry = prefs.getString('location_Country');
markers.add(Marker(
markerId: MarkerId('Mylocation'),
infoWindow: InfoWindow(title: 'My Location'),
draggable: true,
onDragEnd: (latLong) async {
print('latLongDrag$latLong');
center = latLong;
getAddressFromLatLong(
double.parse(latLong.latitude.toString()), double.parse(latLong.longitude.toString()));
print("addressonDragEnd$address");
update();
},
onDrag: (latLong) {
center = latLong;
},
icon: BitmapDescriptor.defaultMarker,
position: center!,
));
getAddressFromLatLong(
double.parse(currentLatitude.toString()), double.parse(currentLongitude.toString()));
// number = PhoneNumber(isoCode: initialCountry);
update();
print('$googleApiKey google');
// print(number);
}
Future<void> getAddressFromLatLong(double latitudes, double longitudes) async {
print('getCurrentLocationAddressssssss');
await placemarkFromCoordinates(
latitudes, longitudes)
.then((List<Placemark> placemarks) {
Placemark place = placemarks[0];
pickupCityController.text = place.locality ?? '';
pickupStateController.text = place.administrativeArea ?? '';
pickupSuburbController.text = '${place.subLocality??place.street}' ;
pickupPostcodeController.text = place.postalCode ?? '';
fromLatitude = double.parse(latitudes.toString()).toString();
fromLongitude = double.parse(longitudes.toString()).toString();
print('latitudegetAddressfromLatitude $fromLatitude');
print('longitudegetAddressfromLongitude $fromLongitude');
pickupAddressController.text = '${place.street}, ${place.subLocality},${place.locality},${place.administrativeArea} ${place.subAdministrativeArea},${place.country},${place.postalCode}.';
print('dropAddressControllergetAddresstoLongitude ${pickupAddressController.text}');
update();
}).catchError((e) {
debugPrint(e);
});
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,43 @@
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import '../../Data/Repository/Customers/getCustomerbytenantidrepository.dart';
import '../../Model/Response/Customers/GetCustomerById/GetCustomerByTenantId.dart';
class CustomerController extends GetxController{
RxBool progress = true.obs;
List <GetCustomerByTenantIdDetails> getCustomerBytenantId =[];
GetCustomersByTenantIdRepository getCustomersByNumberTenantIdRepository = GetCustomersByTenantIdRepository();
TextEditingController searchController = TextEditingController();
getCustomerByTenantId()async {
GetCustomerByTenantId? result = await getCustomersByNumberTenantIdRepository.getCustomerByTenantId();
getCustomerByTenantIdResult(result!);
}
RxBool hasLoadedCustomerOnce = false.obs;
getCustomerByTenantIdResult(GetCustomerByTenantId data) {
if (!hasLoadedCustomerOnce.value) {
progress.value = true;
update();
}
getCustomerBytenantId = data.details ?? [];
progress.value = false;
hasLoadedCustomerOnce.value = true;
update();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View 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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View 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();
}
}

View File

@@ -0,0 +1,132 @@
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:http/http.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../Helper/Constants/Colorconstants.dart';
class DirectionMapController extends GetxController{
String? googleApiKey;
late GoogleMapController mapController;
// double _originLatitude = 6.5212402, _originLongitude = 3.3679965;
// double _destLatitude = 6.849660, _destLongitude = 3.648190;
double? originLatitude;
double? originLongitude;
double? destLatitude;
double? destLongitude;
static LatLng? center;
Map<MarkerId, Marker> markers = {};
Map<PolylineId, Polyline> polylines = {};
List<LatLng> polylineCoordinates = [];
PolylinePoints polylinePoints = PolylinePoints();
void onMapCreated(GoogleMapController controller) async {
mapController = controller;
}
addMarker(LatLng position, String id, BitmapDescriptor descriptor) {
print('originLatitudeaddMarkercontroller $originLatitude');
print('originLongitudeaddMarkercontroller $originLongitude');
print('destLatitudeaddMarkercontroller $destLatitude');
print('destLongitudeaddMarkercontroller $destLongitude');
MarkerId markerId = MarkerId(id);
Marker marker =
Marker(markerId: markerId, icon: descriptor, position: position);
markers[markerId] = marker;
}
addPolyLine() {
PolylineId id = PolylineId("poly");
Polyline polyline = Polyline(
polylineId: id,
color: ColorConstants.primaryColor,
points: polylineCoordinates,
jointType: JointType.mitered,
geodesic: true,
visible: true,
width: 10
);
polylines[id] = polyline;
update();
}
void setCameraPosition(List<LatLng> coordinates) {
LatLngBounds bounds = boundsFromLatLngList(coordinates);
CameraUpdate cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50); // Adjust padding as needed
mapController.animateCamera(cameraUpdate);
}
LatLngBounds boundsFromLatLngList(List<LatLng> list) {
double? x0, x1, y0, y1;
for (LatLng latLng in list) {
if (x0 == null || latLng.latitude < x0) x0 = latLng.latitude;
if (x1 == null || latLng.latitude > x1) x1 = latLng.latitude;
if (y0 == null || latLng.longitude < y0) y0 = latLng.longitude;
if (y1 == null || latLng.longitude > y1) y1 = latLng.longitude;
}
return LatLngBounds(northeast: LatLng(x1!, y1!), southwest: LatLng(x0!, y0!));
}
getPolyline() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
print('originLatitudegetPolylinecontroller $originLatitude');
print('originLongitudegetPolylinecontroller $originLongitude');
print('destLatitudegetPolylinecontroller $destLatitude');
print('destLongitudegetPolylinecontroller $destLongitude');
googleApiKey = prefs.getString('googleApiKey')??'AIzaSyBhkGfnq27sN0wV5y_S-M2KojpFTk_by-Q';
PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
request: PolylineRequest(
origin: PointLatLng(originLatitude ?? 0.0, originLongitude ?? 0.0),
destination: PointLatLng(destLatitude ?? 0.0, destLongitude ?? 0.0),
mode: TravelMode.driving,
// Optional:
// wayPoints: [PolylineWayPoint(location: "Some location string")]
),
googleApiKey: googleApiKey ?? 'YOUR_API_KEY',
);
if (result.points.isNotEmpty) {
// dropChangeZoom(13);
polylineCoordinates.clear();
result.points.forEach((PointLatLng point) {
polylineCoordinates.add(LatLng(point.latitude, point.longitude));
setCameraPosition(polylineCoordinates);
});
}
addPolyLine();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,116 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:pretty_qr_code/pretty_qr_code.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../Helper/Constants/Colorconstants.dart';
import '../../Helper/Logger.dart';
class HomeController extends GetxController{
int selectedIndex = 0;
int tenantId = 0;
int locationId = 0;
void onItemTapped(int index) {
selectedIndex = index;
update();
}
void getTenantId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = (await prefs.getInt('tenantId')) ?? 0;
locationId = (await prefs.getInt('locationId')) ?? 0;
logger.i('TenantId = ${tenantId}');
update();
}
void showQRBottomSheet() {
final Map<String, dynamic> qrMap = {
'tenantid': tenantId, // 👈 lowercase key
'locationid': locationId, // 👈 lowercase key
};
final String qrData = jsonEncode(qrMap);
logger.i("QR JSON Data: $qrData");
final qrCode = QrCode.fromData(
data: qrData,
errorCorrectLevel: QrErrorCorrectLevel.M,
);
Get.bottomSheet(
SafeArea(
child: Container(
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: const BorderRadius.vertical(top: Radius.circular(24)),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.1),
blurRadius: 10,
offset: const Offset(0, -2),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Text(
"Scan QR Code",
style: TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
const SizedBox(height: 24),
Center(
child: Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(color: Colors.grey.shade200, width: 1),
),
child: SizedBox(
width: 220,
height: 220,
child: PrettyQrView(
qrImage: QrImage(qrCode),
decoration: const PrettyQrDecoration(
shape: PrettyQrSmoothSymbol(
roundFactor: 0.0,
color: Colors.black,
),
quietZone: PrettyQrModulesQuietZone(2),
background: Colors.white,
),
),
),
),
),
],
),
),
),
isScrollControlled: true,
backgroundColor: Colors.transparent,
);
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
getTenantId();
}
}

View File

@@ -0,0 +1,74 @@
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../Globalwidgets/textwidget.dart';
import '../../Helper/Constants/Colorconstants.dart';
class ConnectivityController extends GetxController {
final isOffline = false.obs;
final Connectivity _connectivity = Connectivity();
late StreamSubscription<List<ConnectivityResult>> _subscription;
bool _wasOffline = false;
@override
void onInit() {
super.onInit();
_checkInitialConnection();
_subscription = _connectivity.onConnectivityChanged.listen(_updateStatus);
}
Future<void> _checkInitialConnection() async {
final result = await _connectivity.checkConnectivity();
_updateStatus([result.first]);
}
void _updateStatus(List<ConnectivityResult> results) {
final isCurrentlyOffline = !results.any((r) => r == ConnectivityResult.mobile || r == ConnectivityResult.wifi);
if (isCurrentlyOffline != isOffline.value) {
isOffline.value = isCurrentlyOffline;
final context = Get.context!;
if (isCurrentlyOffline) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: TextWidget(
color: ColorConstants.secondaryColor,
text: "You are currently offline",
),
backgroundColor: Theme.of(context).colorScheme.error,
duration: Duration(days: 1), // Until dismissed or back online
behavior: SnackBarBehavior.floating,
),
);
} else {
if (_wasOffline) {
ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: TextWidget(
text: "You are connected to the internet",
color: ColorConstants.secondaryColor,
),
backgroundColor: Colors.green,
behavior: SnackBarBehavior.floating,
duration: const Duration(seconds: 3),
),
);
}
}
_wasOffline = isCurrentlyOffline;
}
}
@override
void onClose() {
_subscription.cancel();
super.onClose();
}
}

View File

@@ -0,0 +1,78 @@
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:intro_slider/intro_slider.dart';
import '../../Helper/Constants/AssetConstants.dart';
import '../../Helper/Constants/Colorconstants.dart';
import '../../View/Authentication/Logiview.dart';
class IntroScreenController extends GetxController{
List<ContentConfig> listContentConfig = [];
void onDonePress() {
Get.to(()=> LoginView());
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
listContentConfig.add(
ContentConfig(
title: "Get Online",
styleTitle: TextStyle(color: ColorConstants.blackColor,fontSize: 30,fontWeight: FontWeight.bold),
maxLineTitle: 2,
marginDescription: EdgeInsets.only(top: 0,left: 20,right: 20),
description: "Bring your store online and connect with nearby customers.",
styleDescription: TextStyle(color: ColorConstants.blackColor,fontSize: 18,fontWeight: FontWeight.normal),
pathImage: AssetConstants.onBoarding1,
heightImage:Get.height*0.40 ,
widthImage: Get.width*0.40 ,
backgroundColor: ColorConstants.secondaryColor,
),
);
listContentConfig.add(
ContentConfig(
title: "Get Noticed",
maxLineTitle: 2,
marginDescription: EdgeInsets.only(top: 0,left: 20,right: 20),
styleTitle: TextStyle(
color: ColorConstants.blackColor,
fontSize: 30,
fontWeight: FontWeight.bold,
),
description: "Showcase your products to people around you through the Nearle app.",
styleDescription: TextStyle(color: ColorConstants.blackColor,fontSize: 18,fontWeight: FontWeight.normal),
pathImage: AssetConstants.onBoarding2,
heightImage:Get.height*0.40 ,
widthImage: Get.width*0.40 ,
backgroundColor: ColorConstants.secondaryColor,
widgetDescription: Padding(
padding: const EdgeInsets.only(top: 20),
child: Text(
'Showcase your products to people around you through the Nearle app.',
style: TextStyle(color: ColorConstants.blackColor,fontSize: 18,fontWeight: FontWeight.normal),
textAlign: TextAlign.center,
),
),
),
);
listContentConfig.add(
ContentConfig(
title: "Get Simplified",
maxLineTitle: 2,
marginDescription: EdgeInsets.only(top: 0,left: 20,right: 20),
styleTitle: TextStyle(color: ColorConstants.blackColor,fontSize: 30,fontWeight: FontWeight.bold),
description: "Delight the community with a personalized online experience. Grow your sales with smart platform.",
styleDescription: TextStyle(color: ColorConstants.blackColor,fontSize: 18,fontWeight: FontWeight.normal),
pathImage: AssetConstants.onBoarding3,
heightImage:Get.height*0.40 ,
widthImage: Get.width*0.40 ,
backgroundColor: ColorConstants.secondaryColor,
),
);
}
}

View File

@@ -0,0 +1,42 @@
import 'dart:async';
import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart';
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
import '../../Helper/Locationservice/Locationservice.dart';
import '../../View/Authentication/Logiview.dart';
class LocationPermissionController extends GetxController{
LocationService locationService = LocationService();
Position? resultPosition;
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
getLatLong() async {
resultPosition = await locationService.getLocation();
// print('resultPosition$resultPosition');
if (resultPosition != null) {
btnController.reset();
Get.to(()=>LoginView());
}
}
void doSomething() async {
Timer(const Duration(seconds: 1), () async {
btnController.success();
getLatLong();
});
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,137 @@
import 'dart:async';
import 'package:awesome_dialog/awesome_dialog.dart';
import 'package:flutter/cupertino.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/Repository/Users/user_repository.dart';
import '../../../Helper/toast.dart';
import '../../../Model/Request/User/Updateuser/Updateuserrequest.dart';
import '../../../Model/Response/User/Updateuser/Updateuserresponse.dart';
import '../../../Model/Response/User/Usermodelresponse.dart';
import '../../../View/Authentication/Logiview.dart';
import '../../Authentication/Authcontroller.dart';
class EditProfileController extends GetxController{
TextEditingController firstNameController = TextEditingController();
TextEditingController lastNameController = TextEditingController();
TextEditingController emailController = TextEditingController();
TextEditingController contactNoController = TextEditingController();
UserDetails? userInfo;
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
UserRepository userRepository = UserRepository();
AuthController authController = Get.put(AuthController());
// Future<String?> takePhoto() async {
// final ImagePicker imagePicker = ImagePicker();
// final XFile? photo = await imagePicker.pickImage(
// source: ImageSource.camera,
// imageQuality: 50,
// );
// if (photo == null) {
// return null;
// }
// final imageBytes = await photo.readAsBytes();
// String base64Image = base64Encode(imageBytes); // Convert image to base64
// print("Base64 Image: $base64Image");
// return base64Image;
//
// }
getDetails()async{
firstNameController.text = userInfo?.firstname??'';
lastNameController.text = userInfo?.lastname??'';
emailController.text = userInfo?.authname??'';
contactNoController.text = userInfo?.contactno??'';
// update();
}
void doSomething() async {
Timer(const Duration(seconds: 1), () {
btnController.success();
profileValidation();
});
}
profileValidation ()async{
if (firstNameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter Firstname");
}
else if (lastNameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter Lastname");
} else if(emailController.text.isEmpty){
btnController.reset();
Toast.showToast("Please Enter Email");
}
else {
btnController.reset();
userUpdate();
}
}
userUpdate()async{
userUpdateResult(
UserUpdateRequest(
userid:userInfo?.userid??0,
authname:emailController.text,
configid: userInfo?.configid??0,
contactno:contactNoController.text,
firstname:firstNameController.text,
lastname : lastNameController.text,
email:emailController.text
)
);
}
userUpdateResult(UserUpdateRequest data)async{
UserUpdateResponse? result = await userRepository.updateUser(data);
if(result?.status == true){
AwesomeDialog(
context: Get.context!,
dialogType: DialogType.warning,
// animType: AnimType.BOTTOMSLIDE,
descTextStyle: const TextStyle(fontSize: 16,),
desc: 'Update successful, Kindly login to the app for the changes to take effect',
dismissOnTouchOutside: false,
btnOkText: 'Logout',
// btnCancelOnPress: () {
// Get.to(OrderDetails(data: data));
// },
btnOkOnPress: () async{
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove('token');
prefs.remove('fcmToken');
print('remove....fcmToken');
prefs.clear();
prefs.remove('userMobile');
authController.loginPhoneNumberController.clear();
// authController.passwordController.clear();
Get.offAll(()=>LoginView());
},
).show();
// Get.to(()=>HomePage(selectedIndex: 3,));
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,470 @@
import 'package:country_currency_pickers/country.dart';
import 'package:country_currency_pickers/utils/utils.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart' hide Response;
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../../Data/Repository/Applocation/Applocationrepository.dart';
import '../../../../Data/Repository/Location/Addlocation/Addlocationrepository.dart';
import '../../../../Data/Repository/Location/Updatelocation/Updatelocationrepository.dart';
import '../../../../Globalwidgets/Googleplaces/Googleplaces.dart';
import '../../../../Helper/Constants/Apiconstants.dart';
import '../../../../Helper/Constants/Colorconstants.dart';
import '../../../../Helper/Locationservice/Locationservice.dart';
import '../../../../Helper/location_service.dart';
import '../../../../Helper/toast.dart';
import '../../../../Model/Request/Location/Addlocation/Addlocationrequest.dart';
import '../../../../Model/Request/Location/Updatelocation/Updatelocationrequest.dart';
import '../../../../Model/Response/Applocations/Applocationresponse.dart';
import '../../../../Model/Response/Location/Addlocation/Addlocationresponse.dart';
import '../../../../Model/Response/Location/Updatelocation/Updatelocationresponse.dart';
import '../../../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
import '../../../../View/More/Locations/Locationview.dart';
class AddLocationController extends GetxController{
String? dialCode;
String? googleApiKey;
String? initialCountry;
String? addressField;
String? latitude;
String? longitude;
String? city;
String? state;
String? suburb;
String appLocationName = '';
String? min1Label;
String? min2Label;
String? min3Label;
String describeAddLocationUrl = '${ApiConstants.describeUrl}/9/en_us';
int deliveryMin = 30;
int cancellationSec = 20;
int appLocationId = 0;
int? moduleId;
int? locationId;
bool sec1 = true;
bool sec2 = false;
bool sec3 = false;
bool min1 = true;
bool min2 = false;
bool min3 = false;
bool editMode = false;
bool shimmer = true;
bool isEnterAddress = false;
bool progress = false;
List<AppLocationDetails> locations = [];
Position? resultPosition;
Country selectedDialogCountry = CountryPickerUtils.getCountryByIsoCode('IN');
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
TenantLocationDetails? locationInfo;
var describeValue;
final searchText = ''.obs;
final predictions = <Map<String, dynamic>>[].obs;
final selectedPlace = {}.obs;
final GooglePlacesService placesService = GooglePlacesService();
LocationService locationService = LocationService();
AppLocationRepository appLocationRepository = AppLocationRepository();
final GlobalKey<State> _keyLoader = new GlobalKey<State>();
TextEditingController nameController = TextEditingController();
TextEditingController emailController = TextEditingController();
TextEditingController addressController = TextEditingController();
TextEditingController phoneNoController = TextEditingController();
TextEditingController postalCodeController = TextEditingController();
TextEditingController stateController = new TextEditingController();
TextEditingController cityController = new TextEditingController();
TextEditingController suburbController = new TextEditingController();
UpdateLocationRepository updateLocationRepository = UpdateLocationRepository();
AddLocationRepository addLocationRepository = AddLocationRepository();
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();
}
}
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');
}
}
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();
city = '${place.locality}';
cityController.text = '${place.locality}';
stateController.text = '${place.administrativeArea}';
state = '${place.administrativeArea}';
suburbController.text = "${place.subLocality!.isNotEmpty?place.subLocality:place.street}" ;
suburb = place.subLocality!.isNotEmpty?place.subLocality:place.street;
postalCodeController.text = '${place.postalCode}';
addressController.text = locationAddress??'${place.street}, ${place.subLocality},${place.locality},${place.administrativeArea} ${place.subAdministrativeArea},${place.country},${place.postalCode}.';
isEnterAddress = true;
// address = locationAddress??'${place.street}, ${place.subLocality},${place.locality},${place.administrativeArea} ${place.subAdministrativeArea},${place.country},${place.postalCode}.';
predictions.clear();
update();
print('latitude $latitude');
print('longitude $longitude');
print('currentLocationSuburb $suburb');
print('city $city');
print('state $state');
print('postalCode ${postalCodeController.text}');
}).catchError((e) {
debugPrint(e);
});
}
getAppLocations() async{
GetAppLocations? result = await appLocationRepository.getAppLocations();
if(result?.code == 200){
locations = result?.details??[];
shimmer = false;
setValues();
update();
}
else{
Toast.showToast("${result?.message}");
}
}
setValues() {
print('setValueseditMode $editMode');
// print('addlocationnamesssssss${locationInfo['locationName']}');
if (editMode) {
locationInfo = locationInfo;
// print(locationInfo);
locationId = locationInfo?.locationid;
nameController.text = locationInfo?.locationname??'';
emailController.text = locationInfo?.locationemail??'';
addressController.text = locationInfo?.locationaddress??'';
postalCodeController.text = locationInfo?.locationpostcode??'';
suburb = locationInfo?.locationsuburb??'';
suburbController.text = locationInfo?.locationsuburb??'';
cityController.text = locationInfo?.locationcity??'';
city = locationInfo?.locationcity??'';
// print('${locationInfo['openingtime'].toString()}open time');
state = locationInfo?.locationstate??'';
stateController.text = locationInfo?.locationstate??'';
latitude = locationInfo?.locationlatitude??'';
longitude = locationInfo?.locationlong??'';
// countryCode = locationInfo['countrycode'];
phoneNoController.text = locationInfo?.locationcontact??'';
// delivery = locationInfo['delivery'];
// deliveryCharges = locationInfo['deliverycharges'] ?? [];
cancellationSec = locationInfo?.cancelsecs??0;
deliveryMin = locationInfo?.deliverymins??0;
// deliveryType = locationInfo['deliverytype'];
if (deliveryMin == 30) {
min1 = true;
min2 = false;
min3 = false;
} else if (deliveryMin == 60) {
min1 = false;
min2 = true;
min3 = false;
} else if (deliveryMin == 120) {
min1 = false;
min2 = false;
min3 = true;
}
if (cancellationSec == 20) {
sec1 = true;
sec2 = false;
sec3 = false;
} else if (cancellationSec == 30) {
sec1 = false;
sec2 = true;
sec3 = false;
} else if (cancellationSec == 40) {
sec1 = false;
sec2 = false;
sec3 = true;
}
appLocationId = locationInfo?.applocationid??0;
for (var loc in locations) {
if (loc.applocationid == appLocationId) {
appLocationName = loc.city??'';
return;
}
}
update();
}
}
describeValidation() {
if (nameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please enter location name");
} else if (emailController.text.isEmpty) {
btnController.reset();
// Toast.showToast("Please enter email");
Toast.showToast("Please enter email");
} else if (RegExp(
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
.hasMatch(emailController.text) ==
false) {
btnController.reset();
// Toast.showToast("Enter valid email");
Toast.showToast("Enter valid email");
} else if (phoneNoController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please enter contact no");
}
else if (phoneNoController.text.length !=10) {
btnController.reset();
Toast.showToast("Incorrect contact no");
}
// else if (appLocationId == 0) {
// Toast.showToast("Please select your location");
// progress = true;
// update();
//
// }
else if (addressController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please enter your location");
} else if (suburbController.text.isEmpty) {
btnController.reset();
isEnterAddress = true;
update();
Toast.showToast("Please enter suburb");
} else if (cityController.text.isEmpty) {
btnController.reset();
isEnterAddress = true;
update();
Toast.showToast("Please enter city");
}
// else if (city.toString().toLowerCase() !=
// appLocationName.toString().toLowerCase()) {
//
// setState(() {
// isEnterAddress = true;
// });
// Toast.showToast(
// "Entered address and selected location varies please enter correct location");
// }
else if (stateController.text.isEmpty) {
isEnterAddress = true;
update();
Toast.showToast("Please enter state");
} else if (postalCodeController.text.isEmpty) {
Toast.showToast("Please enter postcode");
}
// else if (deliveryMin == 0) {
// Toast.showToast("Please select delivery mins ");
// }
else {
if (editMode == false) {
progress = true;
update();
addLocation();
}
else {
updateLocation();
}
}
}
Future<void> showLoader(BuildContext context, GlobalKey key) async {
return showDialog<void>(
context: context,
barrierDismissible: false, // user must tap button!
builder: (BuildContext context) {
return SimpleDialog(
backgroundColor: Colors.white,
key: key,
// title: Text('Warning'),
children: [
Center(
child: Column(children: [
CircularProgressIndicator(color: ColorConstants.primaryColor),
SizedBox(
height: 10,
),
Text(
"Please wait....",
style: TextStyle(color: ColorConstants.primaryColor),
)
]),
)
]);
},
);
}
addLocation()async{
SharedPreferences prefs = await SharedPreferences.getInstance();
var tenantId = prefs.getInt('tenantId');
var moduleId = prefs.getInt('moduleId');
var appLocationId = prefs.getInt('appLocationId');
var partnerId = prefs.getInt('partnerId');
addLocationResult(
AddLocation(
locationid:0,
tenantid:tenantId,
moduleid:moduleId,
applocationid:appLocationId,
locationname:"${nameController.text}",
email:"${emailController.text}",
contactno:"${phoneNoController.text}",
address:"${addressController.text}",
suburb:"${suburbController.text}",
state:"${stateController.text}",
city:"${cityController.text}",
postcode:"${postalCodeController.text}",
latitude:"$latitude",
longitude:"$longitude",
partnerid:partnerId,
opentime:"9:00",
closetime:"21:00",
deliverytype:0,
deliverymins:60,
cancelsecs:20
)
);
}
addLocationResult(AddLocation data)async{
AddLocationResponse? result = await addLocationRepository.addLocation(data);
if(result?.status == true){
locationId = 0;
nameController.clear();
emailController.clear();
addressController.clear();
postalCodeController.clear();
suburb = '';
suburbController.clear();
cityController.clear();
city = '';
state = '';
stateController.clear();
latitude = '';
longitude = '';
phoneNoController.clear();
isEnterAddress = false;
Get.to(()=>LocationView());
}
else{
Toast.showToast('Something went wrong');
}
}
updateLocation()async{
updateLocationResult(
UpdateLocation(
locationid:locationInfo?.locationid??0,
tenantid:locationInfo?.tenantid??0,
moduleid:locationInfo?.moduleid??0,
applocationid:locationInfo?.applocationid??0,
locationname:"${nameController.text}",
email:"${emailController.text}",
contactno:"${phoneNoController.text}",
address:"${addressController.text}",
suburb:"${suburbController.text}",
state:"${stateController.text}",
city:"${cityController.text}",
postcode:"${postalCodeController.text}",
latitude:"$latitude",
longitude:"$longitude",
partnerid:locationInfo?.partnerid??0,
opentime:"9:00",
closetime:"21:00",
deliverytype:0,
deliverymins:60,
cancelsecs:20
)
);
}
updateLocationResult(UpdateLocation data)async{
UpdateLocationResponse? result = await updateLocationRepository.updateLocation(data);
if(result?.status == true){
Get.to(()=>LocationView());
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,45 @@
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Data/Repository/Location/GetLocation/getlocationrepository.dart';
import '../../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
class LocationController extends GetxController{
int? tenantId;
int? moduleId;
List<TenantLocationDetails>locations = [];
bool shimmer = true;
GetLocationsRepository getLocationsRepository= GetLocationsRepository();
getLocation()async{
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId')??0;
moduleId = prefs.getInt('moduleId')??0;
GetLocationByTenantId? result = await getLocationsRepository.getLocationById();
getLocationByIdResult(result!);
}
getLocationByIdResult(GetLocationByTenantId data) async {
print('location result');
if (data.code == 200) {
SharedPreferences prefs = await SharedPreferences.getInstance();
locations = data.details!;
shimmer = false;
update();
print('usernamesss ${prefs.getString('userName')??''}');
print('gettenantIdinset${prefs.getInt('tenantId')!}');
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,13 @@
import 'package:get/get.dart';
class StaffDetailsController extends GetxController{
bool shimmer = true;
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,206 @@
import 'package:awesome_snackbar_content/awesome_snackbar_content.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart' hide Response;
import 'package:shared_preferences/shared_preferences.dart';
import 'package:package_info_plus/package_info_plus.dart';
import '../../Data/Repository/Users/user_repository.dart';
import '../../Helper/Constants/Apiconstants.dart';
import '../../Helper/Logger.dart';
import '../../Model/Response/User/Usermodelresponse.dart';
import '../../View/Authentication/Logiview.dart';
import '../../View/More/Editprofile/Editprofileview.dart';
import '../../View/More/Faqview/faqtabs.dart';
import '../../View/More/Locations/Locationview.dart';
import '../../View/More/Notification/Notificationview.dart';
import '../../View/More/Staffs/Staffview.dart';
import '../Authentication/Authcontroller.dart';
class MoreController extends GetxController{
String? userName;
String? userContact;
String? version;
String? token;
String? dialCode;
String? imageUrl;
String? header;
String? locationLabel;
String? profileLabel;
String? FAQLabel;
String? logoutLabel;
String? actionsLabel;
String? subscriptionLabel;
String? paymentsLabel;
String? communityLabel;
String? preferencesLabel;
String? userLabel;
String? settingsLabel;
String? notificationsLabel;
int? versionValue;
int? roleId;
int? tenantId;
int? userId;
UserDetails? userInfo;
var describeValue;
String? currentVersion;
AuthController authController = Get.put(AuthController());
UserRepository userRepository = UserRepository();
String describeCompanyUrl = '${ApiConstants.describeUrl}/51/en_us';
toUser() {
if(roleId ==1) {
Get.to(() => StaffsView());
}
else{
var snackBar = SnackBar(
elevation: 0,
behavior: SnackBarBehavior.floating,
backgroundColor: Colors.transparent,
content: AwesomeSnackbarContent(
title: 'Support',
message: 'Could not view staffs at this moment. Kindly contact app admin.',
contentType: ContentType.warning,
color: Colors.red.withAlpha(200),
),
);
ScaffoldMessenger.of(Get.context!).showSnackBar(snackBar);
}
}
toFaq() {
Get.to(()=>FaqTabs());
}
toSettings() {
}
toLocation() {
Get.to(()=>LocationView());
}
toPayment() {}
toEditProfile() {
Get.to(()=>EditProfile(data:userInfo,));
}
toNotification() {
Get.to(()=>NotificationView());
}
Future<void> confirmLogout(BuildContext context) async {
final shouldLogout = await showDialog<bool>(
context: context,
builder: (BuildContext context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
title: const Text(
'Confirm Logout',
style: TextStyle(fontWeight: FontWeight.bold),
),
content: const Text('Are you sure you want to log out?'),
actions: [
TextButton(
onPressed: () => Navigator.pop(context, false),
child: const Text('Cancel'),
),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Colors.redAccent,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
onPressed: () => Navigator.pop(context, true),
child: const Text('Logout'),
),
],
);
},
);
if (shouldLogout == true) {
await toLogin();
}
}
Future<void> toLogin() async {
print('Logging out user...');
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.clear(); // Clears all stored keys and values
authController.loginPhoneNumberController.clear();
authController.termsChecking = false;
print('Redirecting to login view...');
Get.offAll(() => LoginView());
}
getToken() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
token = prefs.getString('tenantFcmToken');
roleId = prefs.getInt('roleId');
versionValue = prefs.getInt('versionValue');
userName = prefs.getString('userName');
userContact = '+91${prefs.getString('tenantContactNo')}';
tenantId = prefs.getInt('tenantId');
userId = prefs.getInt('userId');
update();
get(token??'');
}
get(String token) async{
UserModelResponse? result = await userRepository.getUser(token);
if(result?.status == true){
getResults(result);
print('resultprofilecontroller${result?.details?.toJson()}');
}
}
getResults(UserModelResponse? data) {
// var data = json.encode(userData);
userInfo = data?.details;
print('userInfofullname ${userInfo?.fullname}');
userContact = '+91${data?.details!.contactno}';
userName = "${data?.details!.fullname.toString()}";
// imageUrl = "${data.details!.profileimage.toString()}";
roleId =data?.details!.roleid;
update();
if (roleId == 2) {
// getWeekdayDetails();
}
}
Future<void> getAppVersion() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String version = packageInfo.version;
currentVersion = version;
prefs.setString('CurrentVersion', currentVersion!);
logger.i('Current version from main: $currentVersion');
}
@override
void onInit() {
// TODO: implement onInit
getAppVersion();
super.onInit();
}
}

View File

@@ -0,0 +1,77 @@
import 'dart:convert';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
class NotificationController extends GetxController {
RxBool isLoading = false.obs;
RxList<NotificationModel> notifications = <NotificationModel>[].obs;
Future<void> fetchNotifications() async {
isLoading.value = true;
SharedPreferences prefs = await SharedPreferences.getInstance();
// SAFE READ → Handles int or string
dynamic t = prefs.get("tenantId");
dynamic l = prefs.get("locationId");
String tenantId = t?.toString() ?? "";
String locationId = l?.toString() ?? "";
final url =
"https://jupiter.nearle.app/live/api/v1/utils/gettenantnotifications/?tenantid=$tenantId&locationid=$locationId";
try {
var response = await http.get(Uri.parse(url));
print(url);
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
if (data["status"] == true) {
notifications.value = (data["details"] as List)
.map((e) => NotificationModel.fromJson(e))
.toList();
}
}
} catch (e) {
print("Notification API Error: $e");
}
isLoading.value = false;
}
@override
void onInit() {
fetchNotifications(); // auto load on page open
super.onInit();
}
}
class NotificationModel {
final int notificationid;
final String title;
final String message;
final String notificationdate;
NotificationModel({
required this.notificationid,
required this.title,
required this.message,
required this.notificationdate,
});
factory NotificationModel.fromJson(Map<String, dynamic> json) {
return NotificationModel(
notificationid: json["notificationid"],
title: json["title"] ?? "",
message: json["message"] ?? "",
notificationdate: json["notificationdate"] ?? "",
);
}
}

View File

@@ -0,0 +1,144 @@
import 'package:flutter/cupertino.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/Repository/Staffs/Addstaff/Addstaffrepository.dart';
import '../../../../Data/Repository/Tenantlocation/Getlocationrepository.dart';
import '../../../../Helper/toast.dart';
import '../../../../Model/Request/Staffs/Addstaffs/Addstaffsrequest.dart';
import '../../../../Model/Response/Staffs/Addstaffs/Addstaffresponse.dart';
import '../../../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
import '../../../../View/More/Staffs/Staffview.dart';
class AddStaffController extends GetxController{
String? locationName;
String? locationAddress;
String? locationSuburb;
String? locationCity;
String? locationState;
String? locationPostcode;
int?tenantId;
int?appLocationId;
int?partnerId;
RxInt locationId = 0.obs;
RxBool isLocation = false.obs;
RxBool progress = false.obs;
List<TenantLocationDetails>? tenantLocation;
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
TextEditingController nameController = TextEditingController();
TextEditingController lastNameController = TextEditingController();
TextEditingController phoneNoController = TextEditingController();
TextEditingController emailController = TextEditingController();
GetLocationsRepository getLocationsRepository= GetLocationsRepository();
AddStaffRepository addStaffRepository = AddStaffRepository();
getLocation()async {
GetLocationByTenantId? result = await getLocationsRepository.getTenantLocationById();
tenantLocation = result?.details??[];
update();
print('resultgetLocation${result?.toJson()}');
}
describeValidation({bool isUpdate = false}) {
if (nameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter first name");
// AwesomeHelper.createAwesome(title: "title", message: "message");
} else if (lastNameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter last name");
} else if (phoneNoController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter contact no");
} else if (emailController.text.isEmpty) {
btnController.reset();
// Toast.showToast("Please enter email");
Toast.showToast("Please Enter email");
} else if (RegExp(
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
.hasMatch(emailController.text) ==
false) {
btnController.reset();
// Toast.showToast("Enter valid email");
Toast.showToast("Please enter vaid email address");
} else if (locationId.value ==0) {
btnController.reset();
Toast.showToast("Please select location");
} else {
progress.value = true;
addStaff();
}
}
addStaff()async{
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
appLocationId = prefs.getInt('appLocationId');
partnerId = prefs.getInt('partnerId');
addStaffsResult(
CreateStaffRequest(
userid:0,
authname:"${emailController.text}",
configid: 1,
contactno:"${phoneNoController.text}",
firstname:"${nameController.text}",
lastrname:"${lastNameController.text}",
email:"${emailController.text}",
address:"$locationAddress",
suburb:"$locationSuburb",
city:"$locationCity",
state:"$locationState",
postcode:"$locationPostcode",
roleid:2,
applocationid:appLocationId,
partnerid:partnerId,
tenantid:tenantId,
locationid:locationId.value
)
);
}
addStaffsResult(CreateStaffRequest data)async{
CreateStaffResponse? result = await addStaffRepository.addStaff(data);
if(result?.status == true){
Get.to(()=>StaffsView());
nameController.clear();
lastNameController.clear();
phoneNoController.clear();
emailController.clear();
locationId.value = 0;
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,29 @@
import 'package:get/get.dart';
import '../../../Data/Repository/Staffs/Getstaffsrepository.dart';
import '../../../Model/Response/Staffs/Getstaffsresponse.dart';
class StaffsController extends GetxController{
bool shimmer = true;
List<StaffDetails>getStaff = [];
GetStaffsRepository getStaffsRepository = GetStaffsRepository();
getStaffs()async{
GetStaffsResponse? result = await getStaffsRepository.getStaffs();
if(result?.status == true){
getStaff = result?.details??[];
shimmer = false;
update();
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,145 @@
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
import '../../../../Data/Repository/Staffs/Updatestaff/Updatestaffrepository.dart';
import '../../../../Data/Repository/Tenantlocation/Getlocationrepository.dart';
import '../../../../Helper/toast.dart';
import '../../../../Model/Request/Staffs/UpdateStaff/Updatestaffrequest.dart';
import '../../../../Model/Response/Staffs/Getstaffsresponse.dart';
import '../../../../Model/Response/Staffs/Updatestaff/Updatestaffresponse.dart';
import '../../../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
import '../../../../View/More/Staffs/Staffview.dart';
class UpdateStaffController extends GetxController{
String? locationName;
String? locationAddress;
String? locationSuburb;
String? locationCity;
String? locationState;
String? locationPostcode;
int?tenantId;
int?appLocationId;
int?partnerId;
int?userId;
int?roleId;
RxInt locationId = 0.obs;
RxBool isLocation = false.obs;
RxBool progress = false.obs;
StaffDetails? staffData;
List<TenantLocationDetails>? tenantLocation;
TextEditingController nameController = TextEditingController();
TextEditingController lastNameController = TextEditingController();
TextEditingController phoneNoController = TextEditingController();
TextEditingController emailController = TextEditingController();
GetLocationsRepository getLocationsRepository= GetLocationsRepository();
UpdateStaffRepository updateStaffRepository = UpdateStaffRepository();
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
setValues(){
nameController.text = staffData?.firstname??'';
lastNameController.text = staffData?.lastname??'';
phoneNoController.text = staffData?.contactno??'';
emailController.text = staffData?.email??'';
locationId.value = staffData?.locationid??0;
tenantId = staffData?.tenantid??0;
appLocationId = staffData?.applocationid??0;
partnerId = staffData?.partnerid??0;
userId = staffData?.userid??0;
roleId = staffData?.roleid??0;
update();
}
getLocation()async {
GetLocationByTenantId? result = await getLocationsRepository.getTenantLocationById();
tenantLocation = result?.details??[];
update();
print('resultgetLocation${result?.toJson()}');
}
describeValidation({bool isUpdate = false}) {
if (nameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter first name");
// AwesomeHelper.createAwesome(title: "title", message: "message");
} else if (lastNameController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter last name");
} else if (phoneNoController.text.isEmpty) {
btnController.reset();
Toast.showToast("Please Enter contact no");
} else if (emailController.text.isEmpty) {
btnController.reset();
// Toast.showToast("Please enter email");
Toast.showToast("Please Enter email");
} else if (RegExp(
r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+")
.hasMatch(emailController.text) ==
false) {
btnController.reset();
// Toast.showToast("Enter valid email");
Toast.showToast("Please enter vaid email address");
} else if (locationId.value ==0) {
btnController.reset();
Toast.showToast("Please select location}");
} else {
progress.value = true;
updateStaff();
}
}
updateStaff()async {
updateStaffResult(
UpdateStaffRequest(
userid:userId,
authname:"${emailController.text}",
configid: 1,
contactno:"${phoneNoController.text}",
firstname:"${nameController.text}",
lastrname:"${lastNameController.text}",
email:"${emailController.text}",
address:"$locationAddress",
suburb:"$locationSuburb",
city:"$locationCity",
state:"$locationState",
postcode:"$locationPostcode",
roleid:roleId,
applocationid:appLocationId,
partnerid:partnerId,
tenantid:tenantId,
locationid:locationId.value
)
);
}
updateStaffResult(UpdateStaffRequest data)async{
UpdateStaffResponse? result = await updateStaffRepository.updateStaff(data);
if(result?.status == true){
Get.to(()=>StaffsView());
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,26 @@
import 'package:get/get.dart';
import 'package:webview_flutter/webview_flutter.dart';
class WebViewAppController extends GetxController {
late final WebViewController webViewController;
final isLoading = true.obs;
void initializeWebViewController(String url) {
webViewController = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..loadRequest(Uri.parse(url));
webViewController.setNavigationDelegate(
NavigationDelegate(
onPageStarted: (_) => setLoading(true),
onPageFinished: (_) => setLoading(false),
),
);
}
void setLoading(bool value) {
isLoading.value = value;
}
}

View File

@@ -0,0 +1,179 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../Data/Repository/Summary/ordersrepository.dart';
import '../../Helper/Logger.dart';
import '../../Model/Response/Summary/Getsummarysresponse.dart';
import '../../Model/Response/Summary/Ordersummaryresponse.dart';
class OrderController extends GetxController {
String? currentTime;
String? notificationDate;
RxBool shimmer = true.obs;
bool filter2 = false;
RxBool searchMode = false.obs;
bool showOrder = false;
List<DeliveriesDetails> orderAllList = [];
List<DeliveriesDetails> searchOrderList = [];
var orderId;
var orderHeaderId;
var userId;
OrderSummaryRepository orderSummaryRepository = OrderSummaryRepository();
TextEditingController searchController = TextEditingController();
late OrderSummaryDetails orderSummaryDetails;
RxInt currentTabIndex = 0.obs;
RxBool isOrdersLoading = false.obs;
bool hasLoadedOrdersOnce = false;
Future<void> getOrders(String period) async {
if (!hasLoadedOrdersOnce) {
isOrdersLoading.value = true; // Show loader only on first call
}
try {
GetDeliveries? result;
switch (period) {
case 'today':
result = await orderSummaryRepository.getOrdersToday();
break;
case 'week':
result = await orderSummaryRepository.getOrdersWeek();
break;
case 'month':
result = await orderSummaryRepository.getOrdersMonth();
break;
default:
isOrdersLoading.value = false;
return;
}
if (result != null) {
await processOrderResult(result);
logger.i('Result Json : ${result.toJson()}');
}
} catch (e) {
print("Error fetching orders: $e");
} finally {
isOrdersLoading.value = false;
hasLoadedOrdersOnce = true; // Set the flag after first successful call
}
}
Future<void> search(String keyword) async {
if (keyword.isEmpty) {
searchMode.value = false;
searchOrderList.clear();
update();
return;
}
searchMode.value = true;
isOrdersLoading.value = true;
try {
GetDeliveries? result;
switch (currentTabIndex.value) {
case 0:
result = await orderSummaryRepository.getOrdersToday(keyword: keyword);
break;
case 1:
result = await orderSummaryRepository.getOrdersWeek(keyword: keyword);
break;
case 2:
result = await orderSummaryRepository.getOrdersMonth(keyword: keyword);
break;
default:
isOrdersLoading.value = false;
return;
}
if (result != null) {
searchOrderList.clear();
searchOrderList.addAll(result.details ?? []);
logger.i('Search Result Json: ${result.toJson()}');
}
} catch (e) {
print("Error searching orders: $e");
} finally {
isOrdersLoading.value = false;
update();
}
}
getSummary() async {
final result = await orderSummaryRepository.getOrderSummary();
if(result?.status == true) {
orderSummaryDetails = result?.details ?? OrderSummaryDetails();
}
update();
}
Future<void> processOrderResult(GetDeliveries orderData) async {
logger.i('orderresultss');
orderAllList.clear();
if (orderData.details != null) {
print('dataDetailsif${orderData.details}');
searchOrderList.clear();
searchOrderList.addAll(orderData.details!);
orderAllList.addAll(orderData.details!);
print('orderalllistlengthincontroller ${orderAllList.length}');
}
for (var currentOrdersValue in orderAllList) {
if (currentOrdersValue.orderstatus != 'created') {
showOrder = true;
print('showNoOrderssif $showOrder');
break;
} else {
showOrder = false;
print('showNoOrder $showOrder');
}
}
shimmer.value = false;
update();
}
// void search(String searchData) {
// print("datasearchData$searchData");
// print("lenght${orderAllList.length}");
// orderAllList.clear();
// if (filter2) {
// List<DeliveriesDetails> search = searchCompare
// .where((value) =>
// value.pickupcontactno!
// .toLowerCase()
// .contains(searchController.text.toLowerCase()))
// .toList();
// orderAllList = search;
// } else {
// List<DeliveriesDetails> search = searchCompare
// .where((value) =>
// value.pickupcontactno!
// .toLowerCase()
// .contains(searchController.text.toLowerCase()))
// .toList();
// orderAllList = search;
// }
// searchMode = true;
// update();
// }
@override
void onInit() {
super.onInit();
orderSummaryDetails = OrderSummaryDetails();
}
}

View File

@@ -0,0 +1,101 @@
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import '../../../Data/Repository/Summary/ordersrepository.dart';
import '../../../Model/Response/Summary/Getsummarysresponse.dart';
class MonthOrderController extends GetxController{
String? currentTime;
String? notificationDate;
RxBool shimmer = true.obs;
bool filter2 = false;
bool searchMode = false;
bool showOrder = false;
List<DeliveriesDetails> orderAllList = [];
List<DeliveriesDetails> searchCompare = [];
var orderId;
var orderHeaderId;
var userId;
OrderSummaryRepository orderSummaryRepository = OrderSummaryRepository();
TextEditingController searchController = TextEditingController();
getOrders() async{
GetDeliveries? result = await orderSummaryRepository.getOrdersMonth();
monthOrderResult(result!);
print('printresultjson${result.toJson()}');
}
monthOrderResult(GetDeliveries orderData) async{
print('todayorderresultss');
orderAllList.clear();
if (orderData.details!= null) {
print('dataDetailsif${orderData.details}');
searchCompare.clear();
searchCompare.addAll(orderData.details!);
orderAllList.addAll(orderData.details!);
print('orderalllistlengthincontroller${orderAllList.length}');
}
for (var currentOrdersValue in orderAllList) {
if ((currentOrdersValue.orderstatus != 'created')) {
showOrder = true;
print('showNoOrderssif$showOrder');
break;
} else {
showOrder = false;
print('showNoOrder$showOrder');
}
}
shimmer.value = false;
update();
}
search(String searchData) {
print("datasearchData$searchData");
print("lenght${orderAllList.length}");
orderAllList.clear();
searchCompare.addAll(orderAllList);
if (filter2 == true) {
List<DeliveriesDetails> search = searchCompare
.where((value) =>
value.pickupcontactno!
.toLowerCase()
.contains(searchController.text.toLowerCase()) ==
true)
.toList();
update();
searchMode = true;
orderAllList = search;
} else {
List<DeliveriesDetails>search = searchCompare
.where((value) =>
value.pickupcontactno!
.toLowerCase()
.contains(searchController.text.toLowerCase()) ==
true)
.toList();
update();
searchMode = true;
orderAllList = search;
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,28 @@
import 'package:get/get.dart';
import '../../../Data/Repository/Summary/ordersrepository.dart';
import '../../../Model/Response/Summary/Ordersummaryresponse.dart';
class OrderSummaryController extends GetxController{
RxBool shimmer = true.obs;
OrderSummaryDetails getOrderSummary = OrderSummaryDetails();
OrderSummaryRepository orderSummaryRepository = OrderSummaryRepository();
getOrdersSummary()async{
OrderSummary? result = await orderSummaryRepository.getOrderSummary();
getOrderSummary = result!.details!;
shimmer.value = false;
update();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,104 @@
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:get/get.dart' hide Response;
import '../../../Data/Repository/Summary/ordersrepository.dart';
import '../../../Model/Response/Summary/Getsummarysresponse.dart';
class TodayOrderController extends GetxController {
String? currentTime;
String? notificationDate;
RxBool shimmer = true.obs;
bool filter2 = false;
bool searchMode = false;
bool showOrder = false;
List<DeliveriesDetails> orderAllList = [];
List<DeliveriesDetails> searchCompare = [];
var orderId;
var orderHeaderId;
var userId;
OrderSummaryRepository orderSummaryRepository = OrderSummaryRepository();
TextEditingController searchController = TextEditingController();
Timer? _timer; // To hold the periodic timer
@override
void onInit() {
super.onInit();
getOrders(); // Initial call
startAutoRefresh(); // Start periodic refresh
}
void startAutoRefresh() {
_timer = Timer.periodic(const Duration(seconds: 3), (timer) {
getOrders(); // Refresh every 3 seconds
});
}
getOrders() async {
try {
GetDeliveries? result = await orderSummaryRepository.getOrdersToday();
if (result != null) {
todayOrderResult(result);
print('printresultjson${result.toJson()}');
}
} catch (e) {
print("Error fetching orders: $e");
// Optionally handle error (e.g., show snackbar)
}
}
todayOrderResult(GetDeliveries orderData) async {
print('todayorderresultss');
orderAllList.clear();
if (orderData.details != null) {
print('dataDetailsif${orderData.details}');
searchCompare.clear();
searchCompare.addAll(orderData.details!);
orderAllList.addAll(orderData.details!);
print('orderalllistlengthincontroller ${orderAllList.length}');
}
showOrder = orderAllList.any((order) => order.orderstatus != 'created');
print('showOrder: $showOrder');
shimmer.value = false;
update();
}
search(String searchData) {
print("datasearchData$searchData");
print("lenght${orderAllList.length}");
// Restore from searchCompare before filtering
orderAllList = List.from(searchCompare);
if (searchData.isEmpty) {
searchMode = false;
update();
return;
}
List<DeliveriesDetails> searchResults = searchCompare
.where((value) =>
value.pickupcontactno!
.toLowerCase()
.contains(searchData.toLowerCase()))
.toList();
orderAllList = searchResults;
searchMode = true;
update();
}
@override
void onClose() {
_timer?.cancel(); // Cancel timer to prevent memory leaks
searchController.dispose();
super.onClose();
}
}

View File

@@ -0,0 +1,101 @@
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import '../../../Data/Repository/Summary/ordersrepository.dart';
import '../../../Model/Response/Summary/Getsummarysresponse.dart';
class WeekOrderController extends GetxController{
String? currentTime;
String? notificationDate;
RxBool shimmer = true.obs;
bool filter2 = false;
bool searchMode = false;
bool showOrder = false;
List<DeliveriesDetails> orderAllList = [];
List<DeliveriesDetails> searchCompare = [];
var orderId;
var orderHeaderId;
var userId;
OrderSummaryRepository orderSummaryRepository = OrderSummaryRepository();
TextEditingController searchController = TextEditingController();
getOrders()async{
GetDeliveries? result = await orderSummaryRepository.getOrdersWeek();
weekOrderResult(result!);
print('printresultjson${result.toJson()}');
}
weekOrderResult(GetDeliveries orderData) async{
print('todayorderresultss');
orderAllList.clear();
if (orderData.details!= null) {
print('dataDetailsif${orderData.details}');
searchCompare.clear();
searchCompare.addAll(orderData.details!);
orderAllList.addAll(orderData.details!);
print('orderalllistlengthincontroller${orderAllList.length}');
}
for (var currentOrdersValue in orderAllList) {
if ((currentOrdersValue.orderstatus != 'created')) {
showOrder = true;
print('showNoOrderssif$showOrder');
break;
} else {
showOrder = false;
print('showNoOrder$showOrder');
}
}
shimmer.value = false;
update();
}
search(String searchData) {
print("datasearchData$searchData");
print("lenght${orderAllList.length}");
orderAllList.clear();
searchCompare.addAll(orderAllList);
if (filter2 == true) {
List<DeliveriesDetails> search = searchCompare
.where((value) =>
value.pickupcontactno!
.toLowerCase()
.contains(searchController.text.toLowerCase()) ==
true)
.toList();
update();
searchMode = true;
orderAllList = search;
} else {
List<DeliveriesDetails>search = searchCompare
.where((value) =>
value.pickupcontactno!
.toLowerCase()
.contains(searchController.text.toLowerCase()) ==
true)
.toList();
update();
searchMode = true;
orderAllList = search;
}
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,220 @@
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
import '../../Data/Repository/Notification/Notificationrepository.dart';
import '../../Data/Repository/Rider/get_rider_repo.dart';
import '../../Data/Repository/update_delivery/create_delivery.dart';
import '../../Data/Repository/update_delivery/update_delivery.dart';
import '../../Helper/Logger.dart';
import '../../Helper/toast.dart';
import '../../Model/Request/Notification/Notification_request_rider.dart';
import '../../Model/Request/Notification/Notificationrequest.dart';
import '../../Model/Request/create_delivery_request/create_delivery_request.dart';
import '../../Model/Request/update_delivery/update_delivery.dart';
import '../../Model/Response/Notification/Notificationresponse.dart';
import '../../Model/Response/Orders/Getorderresponse.dart';
import '../../Model/Response/Riders/get_rider_model.dart';
import '../../Model/Response/Summary/Getsummarysresponse.dart';
import '../../Model/Response/create_delivery_response/create_delivery_request.dart';
import '../../Model/Response/update_delivery_response/update_delivery_response.dart';
import '../../View/Home/Homeview.dart';
class RiderAssignController extends GetxController {
List <GetRiderDetails> riderDetails = [];
final RidersRepository ridersRepository = RidersRepository();
getRiders(appLocationId) async {
GetRiderPoolsModel? result = await ridersRepository.getRiders(1);
getRidersResult(result!);
}
bool isSelectAll = false;
List riderFcmToken = [];
int? riderUserIdList;
int? partnerId;
int? shiftId;
String? riderStatus;
RxBool shimmer = true.obs;
String? assignTime;
bool isIdle = false;
RoundedLoadingButtonController btnNotifyRiderController = RoundedLoadingButtonController();
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(OrderDetails 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) {
logger.i('UpdateDeliveyStatus ');
Get.to(() => HomeView(selectedIndex: 1));
sendRiderNotification();
}
}
final createDeliveryRepository createDeliveryRepo = createDeliveryRepository();
Future<void> createDelivery(List<OrderDetails> orders) async {
String assignTime = DateFormat("yyyy-MM-dd HH:mm:ss").format(DateTime.now());
List<CreateDelivery> deliveries = orders.map((data) {
DateTime parsedDate = DateTime.parse(data.deliverydate.toString());
String formattedDeliveryDate = DateFormat('yyyy-MM-dd HH:mm:ss').format(parsedDate);
return CreateDelivery(
assigntime: assignTime,
applocationid: data.applocationid,
tenantid: data.tenantid,
customerid: data.customerid,
categoryid: data.categoryid,
configid: data.configid,
deliveryaddress: data.deliveryaddress,
deliverycharges: data.deliverycharge?.toDouble(),
deliverycontactno: data.deliverycontactno,
deliverycustomer: data.deliverycustomer,
deliverycustomerid: data.customerid,
deliverydate: formattedDeliveryDate,
deliveryid: data.deliveryid,
deliverylocation: "",
deliverylocationid: data.deliverylocationid,
droplat: data.deliverylat,
droplon: data.deliverylong,
itemcount: data.itemcount,
kms: "0.0",
locationid: data.locationid,
moduleid: data.moduleid,
orderamount: 0,
orderheaderid: data.orderheaderid,
orderid: data.orderid,
ordernotes: data.ordernotes,
orderstatus: "pending",
partnerid: data.partnerid,
paymenttype: 42,
pickupaddress: data.pickupaddress,
pickupcontactno: data.pickupcontactno,
pickupcustomer: data.pickupcustomer,
pickuplat: data.pickuplat,
pickuplocation: "",
pickuplocationid: data.pickuplocationid,
pickuplon: data.pickuplong,
subcategoryid: data.subcategoryid,
userid: riderUserIdList,
);
}).toList();
await createDeliveryResult(deliveries);
}
Future<void> createDeliveryResult(List<CreateDelivery> deliveries) async {
for (CreateDelivery data in deliveries) {
CreateDeliveryResponse? result = await createDeliveryRepo.createDelivery(deliveries);
if (result?.status == true) {
logger.i('UpdateDeliveryStatus for delivery ID: ${data.deliveryid}');
}
}
btnNotifyRiderController.reset();
/// Navigate to HomeView and send notification after processing all deliveries
Get.to(() => HomeView(selectedIndex: 0));
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');
}
}
}

View File

@@ -0,0 +1,24 @@
import 'package:confetti/confetti.dart';
import 'package:get/get.dart';
class SuccessScreenController extends GetxController{
late ConfettiController confettiController;
@override
void onInit() {
// TODO: implement onInit
super.onInit();
confettiController = ConfettiController(duration: const Duration(seconds: 60));
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
confettiController.dispose();
}
}

View File

@@ -0,0 +1,40 @@
import 'package:get/get.dart';
import 'package:rounded_loading_button_plus/rounded_loading_button.dart';
import '../../Data/Repository/Tenantlocation/Getlocationrepository.dart';
import '../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
class TenantLocationController extends GetxController{
String? latitude;
String? longitude;
String? address;
int selectedAddressIndex = -1;
int locationId = 0;
List<TenantLocationDetails>getLocations = [];
final RoundedLoadingButtonController btnController = RoundedLoadingButtonController();
GetLocationsRepository getLocationsRepository= GetLocationsRepository();
getTenantLocation()async {
GetLocationByTenantId? result = await getLocationsRepository.getTenantLocationById();
if (result?.code == 200) {
getLocations = result?.details??[];
update();
}
print('resultgetLocation ${result?.toJson()}');
}
@override
void onInit() {
getTenantLocation();
// TODO: implement onInit
super.onInit();
}
}

View File

@@ -0,0 +1,30 @@
import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
class MapController extends GetxController {
RxDouble zoom = 13.0.obs;
GoogleMapController? googleMapController;
void setController(GoogleMapController controller) {
googleMapController = controller;
}
void zoomIn() {
zoom.value++;
if (googleMapController != null) {
googleMapController!.animateCamera(
CameraUpdate.zoomTo(zoom.value),
);
}
}
void zoomOut() {
zoom.value--;
if (googleMapController != null) {
googleMapController!.animateCamera(
CameraUpdate.zoomTo(zoom.value),
);
}
}
}

View File

@@ -0,0 +1,164 @@
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import '../../Data/Repository/products_repo/get_products.dart';
import '../../Helper/Logger.dart';
import '../../Model/Request/products/update_product.dart';
import '../../Model/Response/Orders/Getorderresponse.dart';
import '../../Model/Response/products/product_info.dart';
import '../../Model/Response/products/product_response.dart';
import '../../Model/Response/products/product_update_response.dart';
class ProductController extends GetxController {
final ProductsRepository productsRepository = ProductsRepository();
/// Main list used by UI
RxList<ProductData> product = <ProductData>[].obs;
/// Backup full list for search restore
RxList<ProductData> masterProductList = <ProductData>[].obs;
RxBool isProductLoading = true.obs;
RxSet<int> loadingIndices = <int>{}.obs;
RxBool isSearchModeEnable = false.obs;
var productDetail = <ProductDetails>[].obs;
TextEditingController productSearchController = TextEditingController();
@override
void onClose() {
productSearchController.dispose();
super.onClose();
}
// ---------------------------------------------------------
// Toggle Availability
// ---------------------------------------------------------
Future<void> toggleAvailability(int index) async {
loadingIndices.add(index);
update();
final oldProduct = product[index];
final newStatus = oldProduct.status == 'Active' ? 'outofstock' : 'Active';
// Optimistic local update
product[index] = oldProduct.copyWith(status: newStatus);
update();
try {
await updateProduct(oldProduct.productlocationid ?? 0, newStatus);
} catch (e) {
// API failed → revert UI
product[index] = oldProduct;
update();
Get.snackbar('Error', 'Failed to update status');
} finally {
loadingIndices.remove(index);
update();
}
}
bool hasLoadedOnce = false;
// ---------------------------------------------------------
// Fetch Products (API)
// ---------------------------------------------------------
Future<void> getProducts({String? keyword}) async {
if (keyword == null || keyword.isEmpty) {
isSearchModeEnable.value = false;
} else {
isSearchModeEnable.value = true;
}
if (!isSearchModeEnable.value && !hasLoadedOnce) {
isProductLoading.value = true;
update();
}
try {
final result = await productsRepository.getProducts(
subCategoryId: 0,
keyword: keyword,
);
// Store full list
masterProductList.assignAll(result?.details ?? []);
// Show full list
product.assignAll(masterProductList);
logger.i('Products Loaded : ${product.length}');
} catch (e) {
logger.e('Error loading products: $e');
Get.snackbar('Error', 'Failed to load products');
} finally {
isProductLoading.value = false;
hasLoadedOnce = true;
update();
}
}
// ---------------------------------------------------------
// Local Search Filter
// ---------------------------------------------------------
void applySearch(String keyword) {
if (keyword.isEmpty) {
product.assignAll(masterProductList);
update();
return;
}
final filtered = masterProductList.where((p) {
return (p.productname ?? "")
.toLowerCase()
.contains(keyword.toLowerCase());
}).toList();
product.assignAll(filtered);
update();
}
// ---------------------------------------------------------
// Update Product (API)
// ---------------------------------------------------------
Future<void> updateProductStatus(ProductUpdateRequest data) async {
try {
final result = await productsRepository.productUpdate(data);
logger.i('Product Update: ${result?.message}');
if (result?.status != true) {
Get.snackbar('Failed', result?.message ?? 'Update failed');
}
} catch (e) {
logger.e('Update Exception: $e');
Get.snackbar('Error', 'Network error');
rethrow;
}
}
Future<void> updateProduct(int productlocationid, String status) async {
await updateProductStatus(
ProductUpdateRequest(
productid: productlocationid,
productstatus: status,
),
);
}
// ---------------------------------------------------------
// Order → Product Details
// ---------------------------------------------------------
Future<void> getProductDetails(int orderHeaderId) async {
productDetail.clear();
try {
final result = await productsRepository.getProductDetail(orderHeaderId);
productDetail.assignAll(result?.details ?? []);
logger.i('Order ProductDetails loaded: ${productDetail.length}');
} catch (e) {
logger.e('Failed loading details: $e');
Get.snackbar('Error', 'Could not load items');
}
}
}

View File

@@ -0,0 +1,33 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Response/Admintoken/Admintokenresponse.dart';
class GetAdminTokenProvider{
Future<GetAdminToken?> getAdminToken(String urldata,) async {
GetAdminToken? getAdminToken;
try {
final url = Uri.parse('$urldata');
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
});
print('GetAdminToken!!!!!!!!${response.body}');
print('GetAdminTokenproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getAdminToken = GetAdminToken.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print('printinerrorcatch${e.toString()}');
print("error");
}
return getAdminToken;
}
}

View File

@@ -0,0 +1,69 @@
import 'dart:convert';
import 'package:http/http.dart';
import 'package:http/http.dart' as http;
import 'package:logger/logger.dart';
import '../../../Helper/Logger.dart';
import '../../../Model/Response/Appcategory/Appcategoryresponse.dart';
import '../../../Model/Response/Appcategory/app_category_response.dart';
class AppCategoryProvider{
Future<GetAppCategories?> getAppCategory(String url) async {
try {
final response = await http.get(
Uri.parse(url),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
);
logger.i('Category API URL: $url');
logger.i('Status Code: ${response.statusCode}');
logger.i('Response Body: ${response.body}');
if (response.statusCode == 200) {
final Map<String, dynamic> json = jsonDecode(response.body);
return GetAppCategories.fromJson(json);
} else {
logger.e('Failed to load categories: ${response.statusCode}');
return null;
}
} catch (e) {
logger.e('Error in getAppCategory: $e');
return null;
}
}
}
class SubCategoryProvider {
final logger = Logger();
Future<List<SubCategory>> fetchSubCategories() async {
const url = 'https://fiesta.nearle.app/live/api/v1/mob/utils/getsubcategories';
try {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
if (data['status'] == true && data['details'] != null) {
final List list = data['details'];
return list.map((e) => SubCategory.fromJson(e)).toList();
} else {
logger.w('No subcategories found or invalid response');
return [];
}
} else {
logger.e('Failed with status: ${response.statusCode}');
return [];
}
} catch (e) {
logger.e('Error fetching subcategories: $e');
return [];
}
}
}

View File

@@ -0,0 +1,29 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Response/Applocations/Applocationresponse.dart';
class AppLocationProvider{
Future<GetAppLocations?> getAppLocations(String urldata,) async {
GetAppLocations? getAppLocations;
try {
final url = Uri.parse(urldata);
final response = await get(url,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
});
print('getAppLocationsproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getAppLocations = GetAppLocations.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getAppLocations;
}
}

View File

@@ -0,0 +1,46 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../../Model/Request/Authentication/Createuser/Createuserresponse.dart';
import '../../../../Model/Response/Authentication/Createtenantuser/Createtenantuserresponse.dart';
class CreateTenantUserProviders{
Future<CreateTenantUserResponse?> createTenantUser(CreateTenantUser data,String urldata,) async {
CreateTenantUserResponse? createTenantUserResponse;
try {
final url = Uri.parse('$urldata');
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('CreateTenantUserresponsebody ${response.body}');
print('CreateTenantUserdata ${data.toJson()}');
print('CreateTenantUserdatatenantlocations ${data.tenantlocations!.toJson()}');
print('CreateTenantUserdatatenantsubscriptions ${data.tenantsubscriptions!.toJson()}');
print('CreateTenantUserurlsssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
createTenantUserResponse = CreateTenantUserResponse.fromJson(parsedJson);
print('createOrderinprovider${createTenantUserResponse}');
} catch (e) {
print(e.toString());
print("error");
}
return createTenantUserResponse;
}
}

View File

@@ -0,0 +1,43 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Request/Authentication/Loginrequest.dart';
import '../../../Model/Response/Authentication/Loginresponse.dart';
class LoginProvider{
Future<LoginResponse?> signIn(String urldata, LoginRequest data) async {
LoginResponse? loginResponse;
try {
final url = Uri.parse(urldata);
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
}
);
print('urldatasssssssssssssss $urldata');
print('LoginRequestdata ${data.toJson()}');
print("signIncontactnosss${data.contactno}");
print("signIndevicetype${data.devicetype}");
print("signInconfigid${data.configid}");
print("deviceidsssssssss${data.deviceid}");
print("customertokensssss${data.userfcmtoken}");
print("responseeeeeedata ${response.body}");
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
loginResponse = LoginResponse.fromJson(parsedJson);
print('provider result$loginResponse');
} catch (e) {
print(e.toString());
print("errr");
}
return loginResponse;
}
}

View File

@@ -0,0 +1,44 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Helper/Logger.dart';
import '../../../Model/Request/Createorder/Createorderrequest.dart';
import '../../../Model/Response/Createorder/CreateOrderResponsemodel.dart';
class CreateOrderProviders{
Future<CreateOrderResponse?> createOrder(CreateOrder data,String urldata,) async {
CreateOrderResponse? createOrder;
try {
final url = Uri.parse(urldata);
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('CreateOrderresponsebody ${response.body}');
print('CreateOrderdatatoJson ${data.toJson()}');
print('pickuplocationid ${data.pickup?.customerid}');
print('droplocationid ${data.drop?.customerid}');
logger.i(json.encode(data.toJson()));
// print('headerssssssssss ${response.headers}');
print('CreateOrderurlsssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
createOrder = CreateOrderResponse.fromJson(parsedJson);
print('createOrderinprovider${createOrder}');
} catch (e) {
print(e.toString());
print("error");
}
return createOrder;
}
}

View File

@@ -0,0 +1,69 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Request/Authentication/Createuser/Createdeliveryaddress/Createdeliveryaddressrequest.dart';
import '../../../Model/Request/Createcustomer/Createcustomerrequest.dart';
import '../../../Model/Response/Createcustomer/Createcustomerresponse.dart';
import '../../../Model/Response/Createcustomer/Createdeliveryaddress/Createdeliveryaddressresponsel.dart';
class CreateCustomerProvider{
Future<CreateCustomerResponse?> createCustomer(CreateCustomers data,String urldata,) async {
CreateCustomerResponse? createCustomers;
try {
final url = Uri.parse('$urldata');
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('createCustomercontactno${data.firstname}');
print('createCustomercontactno${data.contactno}');
print('createCustomerapplocationid${data.applocationid}');
print('createCustomercontactno${data}');
print('responsebodyincreatecustomer${response.body}');
print('urldatacreatecustomer ${url}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
createCustomers = CreateCustomerResponse.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return createCustomers;
}
Future<CreateDeliveryAddressResponse?> createDeliveryAddress(CreateDeliveryAddress data,String urldata,) async {
CreateDeliveryAddressResponse? createDeliveryAddress;
try {
final url = Uri.parse('$urldata');
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('customeridinproviderdada${data.customerid}');
print('responsebodyincreateDeliveryAddress ${response.body}');
print('urldatacreateDeliveryAddress ${url}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
createDeliveryAddress = CreateDeliveryAddressResponse.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return createDeliveryAddress;
}
}

View File

@@ -0,0 +1,142 @@
import 'dart:convert';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:http/http.dart';
import '../../../Helper/Logger.dart';
import '../../../Model/Response/Customers/GetCustomerById/GetCustomerByTenantId.dart';
import '../../../Model/Response/Customers/GetCustomerById/Getdropcustomerbytenantid.dart';
class GetCustomersByTenantIdProvider {
static const cacheKey = 'customerCache';
final cacheManager = DefaultCacheManager();
Future<GetCustomerByTenantId?> getCustomerByTenantId(String urlData) async {
GetCustomerByTenantId? getCustomerByTenantId;
logger.i('GetCustomerURL : ${urlData}');
try {
/// 1. Attempt to load from cache first
final fileInfo = await cacheManager.getFileFromCache(cacheKey);
String? cachedData;
if (fileInfo != null && fileInfo.file.existsSync()) {
cachedData = await fileInfo.file.readAsString();
final parsedJson = json.decode(cachedData);
getCustomerByTenantId = GetCustomerByTenantId.fromJson(parsedJson);
logger.i("......Customer data Loaded from cache......");
}
/// 2.Always make a request to check for updates
final response = await get(Uri.parse(urlData), headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
});
if (response.statusCode == 200) {
final freshData = response.body;
/// Compare with cached data (optional optimization: hash/ETag/updatedAt)
if (cachedData == null || freshData != cachedData) {
logger.i("......Updating cache with fresh API data.......");
/// Update the cache with fresh data
await cacheManager.putFile(
cacheKey,
response.bodyBytes,
fileExtension: 'json',
key: cacheKey,
);
final parsedJson = json.decode(freshData);
getCustomerByTenantId = GetCustomerByTenantId.fromJson(parsedJson);
} else {
logger.i(".........Customer API data is same as cache, no update required..........");
}
} else {
logger.w("Customer API responded with status code: ${response.statusCode}");
}
} catch (e) {
logger.e("Error fetching customer deals: $e");
}
return getCustomerByTenantId;
}
Future<GetCustomerByTenantId?> getTenantsByTenantId(String urldata,) async {
GetCustomerByTenantId? getCustomerByTenantId;
try {
final url = Uri.parse('$urldata');
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('getCustomerByTenantId!!!!!!!!${response.body}');
print('getCustomerByTenantIdproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getCustomerByTenantId = GetCustomerByTenantId.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getCustomerByTenantId;
}
Future<GetDropCustomerByTenantId?> getDropCustomerByTenantId(String urldata,) async {
GetDropCustomerByTenantId? getDropCustomerByTenantId;
try {
final url = Uri.parse('$urldata');
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('getDropCustomerByTenantIdresponse!!!!!!!!${response.body}');
print('getDropCustomerByTenantIdproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getDropCustomerByTenantId = GetDropCustomerByTenantId.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getDropCustomerByTenantId;
}
Future<GetDropCustomerByTenantId?> getDropTenantByTenantId(String urldata,) async {
GetDropCustomerByTenantId? getDropCustomerByTenantId;
try {
final url = Uri.parse('$urldata');
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('getDropCustomerByTenantIdresponse!!!!!!!!${response.body}');
print('getDropCustomerByTenantIdproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getDropCustomerByTenantId = GetDropCustomerByTenantId.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getDropCustomerByTenantId;
}
}

View File

@@ -0,0 +1,32 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Response/Getcustomeraddress/GetCustomerAddress.dart';
class GetCustomersAddressProvider{
Future<GetCustomerAddress?> getCustomerAddress(String urldata,) async {
GetCustomerAddress? getCustomerAddress;
try {
final url = Uri.parse('$urldata');
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('getCustomerAddress!!!!!!!!${response.body}');
print('getCustomerAddressproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getCustomerAddress = GetCustomerAddress.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getCustomerAddress;
}
}

View File

@@ -0,0 +1,32 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Response/Getcustomerbynumber/Getcustomerbynumberresponse.dart';
class GetCustomersByNumberProvider{
Future<GetCustomerByNumber?> getCustomerByNumber(String urldata,) async {
GetCustomerByNumber? getCustomerByNumber;
try {
final url = Uri.parse('$urldata');
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('getCustomerByNumber!!!!!!!!${response.body}');
print('getCustomerByNumberproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getCustomerByNumber = GetCustomerByNumber.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getCustomerByNumber;
}
}

View File

@@ -0,0 +1,46 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../../Model/Request/Location/Addlocation/Addlocationrequest.dart';
import '../../../../Model/Response/Location/Addlocation/Addlocationresponse.dart';
class AddLocationProvider{
Future<AddLocationResponse?> addLocation(AddLocation data,String urldata,) async {
AddLocationResponse? addLocationResponse;
try {
final url = Uri.parse(urldata);
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('addLocationResponseresponsebody ${response.body}');
print('addLocationResponsedatatoJson ${data.toJson()}');
print('addLocationResponseresponseorderdate ${data.tenantid}');
print('addLocationResponseresponsetenantid ${data.locationid}');
print('addLocationResponseresponsemoduleid ${data.moduleid}');
print('addLocationResponseresponsepartnerid ${data.partnerid}');
// print('headerssssssssss ${response.headers}');
print('addLocationResponseurlsssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
addLocationResponse = AddLocationResponse.fromJson(parsedJson);
print('createOrderinprovider $addLocationResponse');
} catch (e) {
print(e.toString());
print("error");
}
return addLocationResponse;
}
}

View File

@@ -0,0 +1,37 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../../../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
class GetLocationsProvider{
Future<GetLocationByTenantId?> getLocationById(String urldata) async {
GetLocationByTenantId? getLocationById;
try {
final url = Uri.parse('$urldata',);
final response = await http.get(url,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
},
);
print('GetLocation!!!!!!!!${response.body}');
print('GetLocationproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getLocationById = GetLocationByTenantId.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getLocationById;
}
}

View File

@@ -0,0 +1,48 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../../Model/Request/Location/Updatelocation/Updatelocationrequest.dart';
import '../../../../Model/Response/Location/Updatelocation/Updatelocationresponse.dart';
class UpdateLocationProvider{
Future<UpdateLocationResponse?> updateLocation(UpdateLocation data,String urldata,) async {
UpdateLocationResponse? updateLocationResponse;
try {
final url = Uri.parse(urldata);
final response = await put(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('updateLocationResponseresponsebody ${response.body}');
print('updateLocationResponsedatatoJson ${data.toJson()}');
print('updateLocationResponseresponseorderdate ${data.tenantid}');
print('updateLocationResponseresponsetenantid ${data.locationid}');
print('updateLocationResponseresponsemoduleid ${data.moduleid}');
print('updateLocationResponseresponsepartnerid ${data.partnerid}');
// print('headerssssssssss ${response.headers}');
print('CreateOrderurlsssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
updateLocationResponse = UpdateLocationResponse.fromJson(parsedJson);
print('createOrderinprovider $updateLocationResponse');
} catch (e) {
print(e.toString());
print("error");
}
return updateLocationResponse;
}
}

View File

@@ -0,0 +1,85 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Helper/Logger.dart';
import '../../../Model/Request/Notification/Notification_request_rider.dart';
import '../../../Model/Request/Notification/Notificationrequest.dart';
import '../../../Model/Response/Authentication/Sms/Smsresponse.dart';
import '../../../Model/Response/Notification/Notificationresponse.dart';
class NotificationProvider{
Future<NotificationResponse?> createNotification(NotificationRequest data,String urldata,) async {
NotificationResponse? notificationResponse;
try {
final url = Uri.parse(urldata);
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
logger.i(json.encode(data.toJson()));
print('notificationResponsebody ${response.body}');
print('notificationdatatoJson ${data.toJson()}');
print('CreateNotificationurlsssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
notificationResponse = NotificationResponse.fromJson(parsedJson);
print('createOrderinprovider ${notificationResponse.toJson()}');
} catch (e) {
print(e.toString());
print("error");
}
return notificationResponse;
}
Future<NotificationResponse?> NotifyRider(RiderNotificationRequest data,String urldata,) async {
NotificationResponse? notificationResponse;
try {
final url = Uri.parse(urldata);
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
logger.i(json.encode(data.toJson()));
print('notificationResponsebody ${response.body}');
print('notificationdatatoJson ${data.toJson()}');
print('CreateNotificationurlsssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
notificationResponse = NotificationResponse.fromJson(parsedJson);
print('createOrderinprovider ${notificationResponse.toJson()}');
} catch (e) {
print(e.toString());
print("error");
}
return notificationResponse;
}
}

View File

@@ -0,0 +1,32 @@
import 'dart:convert';
import 'package:NearleDailyBusiness/Helper/Logger.dart';
import 'package:http/http.dart' as http;
import '../../../Model/Response/Orders/Getorderresponse.dart';
class OrdersProvider {
Future<GetOrders?> getOrders(String url) async {
try {
print('🌐 GetOrderUrl : $url');
final response = await http.get(Uri.parse(url));
print('📦 Response Status: ${response.statusCode}');
print('📦 Response Body: ${response.body}');
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
logger.i("GetOrders Response: ${jsonEncode(data)}");
return GetOrders.fromJson(data);
} else {
print('❌ Failed to load orders: ${response.reasonPhrase}');
return null;
}
} catch (e) {
print('🚨 Exception in getOrders: $e');
return null;
}
}
}

View File

@@ -0,0 +1,136 @@
import 'dart:convert';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:http/http.dart';
import 'package:http/http.dart' as http;
import '../../../Helper/Logger.dart';
import '../../../Model/Request/products/update_product.dart';
import '../../../Model/Response/products/product_info.dart';
import '../../../Model/Response/products/product_response.dart';
import '../../../Model/Response/products/product_update_response.dart';
class GetProductsProvider {
static const cacheKey = 'productCache';
final cacheManager = DefaultCacheManager();
Future<GetProducts?> getProducts(String urlData) async {
GetProducts? getProducts;
logger.i('Get all products url data : $urlData');
try {
// 1. Cache first
final fileInfo = await cacheManager.getFileFromCache(cacheKey);
String? cachedData;
if (fileInfo != null && fileInfo.file.existsSync()) {
cachedData = await fileInfo.file.readAsString();
getProducts = GetProducts.fromJson(json.decode(cachedData));
logger.i("Loaded data from cache");
}
// 2. Always hit the network
final response = await http.get(
Uri.parse(urlData),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
);
if (response.statusCode == 200) {
final freshData = response.body;
print(response);
if (cachedData == null || freshData != cachedData) {
logger.i("Updating cache with fresh data");
await cacheManager.putFile(
cacheKey,
response.bodyBytes,
fileExtension: 'json',
key: cacheKey,
);
getProducts = GetProducts.fromJson(json.decode(freshData));
} else {
logger.i("Cache and API data identical no update");
}
} else {
logger.w("API status: ${response.statusCode}");
}
} catch (e) {
logger.e("Error fetching products: $e");
}
return getProducts;
}
Future<ProductUpdateResponse?> updateProducts(
ProductUpdateRequest data, String urldata) async {
ProductUpdateResponse? productUpdateResponse;
try {
final url = Uri.parse(urldata);
final jsonBody = json.encode(data.toJson());
// 🔥 THIS IS WHAT YOU WANT TO SEE 🔥
print('🚀 SENDING PUT REQUEST');
print('URL: $url');
print('HEADERS: ${{
'Content-Type': 'application/json',
'Accept': 'application/json',
}}');
print('BODY → ${jsonBody}'); // ← Exact JSON being sent
print('PRETTY BODY → ${const JsonEncoder.withIndent(' ').convert(data.toJson())}');
final response = await put(
url,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: jsonBody,
);
print('✅ RESPONSE: ${response.statusCode}');
print('Response Body: ${response.body}');
final parsedJson = json.decode(response.body);
productUpdateResponse = ProductUpdateResponse.fromJson(parsedJson);
print('Parsed → $productUpdateResponse');
} catch (e) {
print('❌ ERROR: $e');
}
return productUpdateResponse;
}
Future<ProductDetailResponse?> getProductDetail(String urldata,) async {
logger.i('UrlData for product Details : ${urldata}');
ProductDetailResponse? getProductDetailResponse;
try {
final url = Uri.parse(urldata);
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
});
logger.i('Product Response ${response.body}');
logger.i('Get product Details Response${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getProductDetailResponse = ProductDetailResponse.fromJson(parsedJson);
} catch (e) {
logger.i(e.toString());
logger.i('error in productDetails${e.toString()}');
logger.i("error");
}
return getProductDetailResponse;
}
}

View File

@@ -0,0 +1,34 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Helper/Logger.dart';
import '../../../Model/Response/Riders/get_rider_model.dart';
class RidersProvider {
Future<GetRiderPoolsModel?> getRiders(String urldata,) async {
GetRiderPoolsModel? getRiderPoolsModel;
logger.i('GetRiderURlData : ${urldata}');
try {
final url = Uri.parse('$urldata');
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('getRiderPoolsModelresponsebody!!!!!!!!${response.body}');
print('getRiderPoolsModelurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getRiderPoolsModel = GetRiderPoolsModel.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getRiderPoolsModel;
}
}

View File

@@ -0,0 +1,49 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../../Helper/Logger.dart';
import '../../../../Model/Request/Staffs/Addstaffs/Addstaffsrequest.dart';
import '../../../../Model/Response/Staffs/Addstaffs/Addstaffresponse.dart';
class AddStaffProvider{
Future<CreateStaffResponse?> addStaff(CreateStaffRequest data,String urldata,) async {
CreateStaffResponse? createStaffResponse;
try {
final url = Uri.parse(urldata);
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('createStaffResponseresponsebody ${response.body}');
print('createStaffResponsedatatoJson ${data.toJson()}');
print('createStaffResponseresponseorderdate ${data.tenantid}');
print('createStaffResponseresponsetenantid ${data.locationid}');
print('createStaffResponseresponseconfigid ${data.configid}');
print('createStaffResponseresponsepartnerid ${data.partnerid}');
logger.i(json.encode(data.toJson()));
// print('headerssssssssss ${response.headers}');
print('CreateOrderurlsssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
createStaffResponse = CreateStaffResponse.fromJson(parsedJson);
print('createOrderinprovider${createStaffResponse}');
} catch (e) {
print(e.toString());
print("error");
}
return createStaffResponse;
}
}

View File

@@ -0,0 +1,34 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Response/Staffs/Getstaffsresponse.dart';
class GetStaffsProvider{
Future<GetStaffsResponse?> getStaffs(String urldata,) async {
GetStaffsResponse? getStaffsResponse;
try {
final url = Uri.parse('$urldata');
final response = await get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('getStaffsResponse!!!!!!!!${response.body}');
print('getStaffsproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getStaffsResponse = GetStaffsResponse.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getStaffsResponse;
}
}

View File

@@ -0,0 +1,48 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../../Model/Request/Staffs/UpdateStaff/Updatestaffrequest.dart';
import '../../../../Model/Response/Staffs/Updatestaff/Updatestaffresponse.dart';
class UpdateStaffProvider{
Future<UpdateStaffResponse?> updateStaff(UpdateStaffRequest data,String urldata,) async {
UpdateStaffResponse? updateStaffResponse;
try {
final url = Uri.parse(urldata);
final response = await put(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('updateStaffResponseresponsebody ${response.body}');
print('updateStaffResponsedatatoJson ${data.toJson()}');
print('updateStaffResponseresponseorderdate ${data.tenantid}');
print('updateStaffResponseresponsetenantid ${data.locationid}');
print('updateStaffResponseresponsepartnerid ${data.partnerid}');
// print('headerssssssssss ${response.headers}');
print('updateStaffssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
updateStaffResponse = UpdateStaffResponse.fromJson(parsedJson);
print('updateStaffinprovider $updateStaffResponse');
} catch (e) {
print(e.toString());
print("error");
}
return updateStaffResponse;
}
}

View File

@@ -0,0 +1,94 @@
import 'dart:convert';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:http/http.dart' as http;
import 'package:http/http.dart';
import '../../../Helper/Logger.dart';
import '../../../Model/Request/Orders/Cancelorderrequest.dart';
import '../../../Model/Response/Summary/Cancelorderresponse.dart';
import '../../../Model/Response/Summary/Getsummarysresponse.dart';
import '../../../Model/Response/Summary/Ordersummaryresponse.dart';
class OrderSummaryProvider {
// Fetch deliveries/orders from API
Future<GetDeliveries?> getDelivery(String url) async {
try {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
print(url);
print(response);
final data = json.decode(response.body);
return GetDeliveries.fromJson(data);
} else {
logger.e('Failed to load orders. Status code: ${response.statusCode}');
return null;
}
} catch (e) {
logger.e('Error in getDelivery: $e');
return null;
}
}
Future<OrderSummary?> getOrderSummary(String url) async {
try {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
print(url);
print(response.body);
final data = json.decode(response.body);
return OrderSummary.fromJson(data);
} else {
logger.e('Failed to load order summary. Status code: ${response.statusCode}');
return null;
}
} catch (e) {
logger.e('Error in getOrderSummary: $e');
return null;
}
}
Future<CancelOrderResponse?> updateOrders(CancelOrderRequest data,String urldata,) async {
CancelOrderResponse? updateOrder;
try {
final url = Uri.parse('$urldata');
final response = await put(url,
body: json.encode({
"orderheaderid": data.orderheaderid,
"orderstatus": "${data.orderstatus}",
"cancelled": "${data.cancelled}"
}),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('updateOrderresponsebody ${response.body}');
print('updateOrderurlsssssssssss ${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
updateOrder = CancelOrderResponse.fromJson(parsedJson);
print('updateOrderinprovider${updateOrder}');
} catch (e) {
print(e.toString());
print("error");
}
return updateOrder;
}
}

View File

@@ -0,0 +1,33 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Response/Partners/Getpartnerinforequest.dart';
class GetPartnersProvider{
Future<GetPartnersInfo?> getPartners(String urldata) async {
GetPartnersInfo? getLocationById;
try {
final url = Uri.parse('$urldata',);
final response = await get(url,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
},
);
print('getPartners!!!!!!!!${response.body}');
print('getPartnersproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getLocationById = GetPartnersInfo.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getLocationById;
}
}

View File

@@ -0,0 +1,63 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
import '../../../Model/Response/Tenantlocation/Locationbyid/Locationidresponse.dart';
class GetLocationsProvider{
Future<GetLocationByTenantId?> getTenantLocationById(String urldata) async {
GetLocationByTenantId? getLocationById;
try {
final url = Uri.parse('$urldata',);
final response = await http.get(url,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
},
);
print('GetLocation!!!!!!!!${response.body}');
print('GetLocationproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getLocationById = GetLocationByTenantId.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getLocationById;
}
Future<GetLocationByLocaionId?> getLocationById(String urldata) async {
GetLocationByLocaionId? getLocationsById;
try {
final url = Uri.parse('$urldata',);
final response = await http.get(url,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
},
);
print('getLocationById!!!!!!!!${response.body}');
print('getLocationByIdproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getLocationsById = GetLocationByLocaionId.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getLocationsById;
}
}

View File

@@ -0,0 +1,31 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../../../Model/Response/Appcategory/Appcategoryresponse.dart';
class GetTenantCategoriesProvider{
// Future<AppCategory?> getTenantCategory(String urldata,) async {
// AppCategory? getCategories;
// try {
//
// final url = Uri.parse('$urldata');
//
// final response = await http.get(url, headers: {
// 'Content-Type': 'application/json',
// 'Accept': 'application/json',
// // 'Authorization': '$token',
// });
// print('getCategories!!!!!!!!${response.body}');
// print('getCategoriesproviderurldata!!!!!!!!${urldata.toString()}');
// Map<String, dynamic> parsedJson = json.decode(response.body.toString());
//
// // getCategories = AppCategory.fromJson(parsedJson);
//
// } catch (e) {
// print(e.toString());
// print("error");
// }
// return getCategories;
// }
}

View File

@@ -0,0 +1,33 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Model/Response/Tenantpricing/Tenantpricingresponse.dart';
class TenantPricingProvider {
Future<GetTenantPricing?> getTenantPricing(String urldata) async {
GetTenantPricing? getTenantPricing;
try {
final url = Uri.parse('$urldata',);
final response = await get(url,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
},
);
print('getTenantPricingresponse!!!!!!!!${response.body}');
print('getTenantPricingproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
getTenantPricing = GetTenantPricing.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return getTenantPricing;
}
}

View File

@@ -0,0 +1,70 @@
import 'dart:convert';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:http/http.dart';
import '../../../Helper/Logger.dart';
import '../../../Model/Response/Tenants/Tenantinforesponse.dart';
class TenantsProvider {
static const cacheKey = 'TenantCache';
final cacheManager = DefaultCacheManager();
Future<TenantInfo?> getTenantInfo(String urlData) async {
TenantInfo? tenantInfo;
logger.i('TenantInfo URL data: ${urlData}');
logger.i('TenantInfo URL data: $urlData'); // 👈 Add this here
try {
/// 1. Attempt to load from cache first
final fileInfo = await cacheManager.getFileFromCache(cacheKey);
String? cachedData;
if (fileInfo != null && fileInfo.file.existsSync()) {
cachedData = await fileInfo.file.readAsString();
final parsedJson = json.decode(cachedData);
tenantInfo = TenantInfo.fromJson(parsedJson);
logger.i("......Loaded data from cache......");
}
/// 2.Always make a request to check for updates
final response = await get(Uri.parse(urlData), headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
});
if (response.statusCode == 200) {
final freshData = response.body;
/// Compare with cached data (optional optimization: hash/ETag/updatedAt)
if (cachedData == null || freshData != cachedData) {
logger.i("......Updating TenantDetails cache with fresh API data.......");
/// Update the cache with fresh data
await cacheManager.putFile(
cacheKey,
response.bodyBytes,
fileExtension: 'json',
key: cacheKey,
);
final parsedJson = json.decode(freshData);
tenantInfo = TenantInfo.fromJson(parsedJson);
} else {
logger.i(".........Tenant Details API data is same as cache, no update required..........");
}
} else {
logger.w("Tenant Details API responded with status code: ${response.statusCode}");
}
} catch (e) {
logger.e("Error fetching customer deals: $e");
}
return tenantInfo;
}
}

View File

@@ -0,0 +1,68 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:http/http.dart';
import '../../../Model/Request/User/Updateuser/Updateuserrequest.dart';
import '../../../Model/Response/User/Updateuser/Updateuserresponse.dart';
import '../../../Model/Response/User/Usermodelresponse.dart';
class UserProvider {
Future<UserModelResponse?> getUser(String urldata, String token) async {
UserModelResponse? userProfile;
// LoginProvider();
try {
final url = Uri.parse('$urldata');
final response = await http.get(url, headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'token':'$token',
// 'Authorization': '$token',
});
print('userproviderresponsebody!!!!!!!!${response.body}');
print('userproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
userProfile = UserModelResponse.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return userProfile;
}
Future<UserUpdateResponse?> updateUser(UserUpdateRequest data,String urldata) async {
UserUpdateResponse? userUpdateResponse;
// LoginProvider();
try {
final url = Uri.parse(urldata);
final response = await put(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
print('userUpdateproviderresponsebody!!!!!!!!${response.body}');
print('userUpdateproviderurldata!!!!!!!!${urldata.toString()}');
Map<String, dynamic> parsedJson = json.decode(response.body.toString());
userUpdateResponse = UserUpdateResponse.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return userUpdateResponse;
}
}

View File

@@ -0,0 +1,43 @@
import 'dart:convert';
import 'package:http/http.dart';
import 'package:http/http.dart' as http;
import '../../../Helper/Logger.dart';
import '../../../Model/Request/create_delivery_request/create_delivery_request.dart';
import '../../../Model/Response/create_delivery_response/create_delivery_request.dart';
class CreateDeliveryProvider {
Future<CreateDeliveryResponse?> createDelivery(List<CreateDelivery> data,String urldata,) async {
CreateDeliveryResponse? createDeliveryResponse;
logger.i('Url data for crate delivery : $urldata');
logger.i('Json Encode : ${json.encode(data)}');
try {
final url = Uri.parse(urldata);
final response = await post(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
logger.i('create Delivery : ${response.body}');
Map<String, dynamic> parsedJson = json.decode(response.body);
createDeliveryResponse = CreateDeliveryResponse.fromJson(parsedJson);
} catch (e) {
logger.i(e.toString());
logger.i("error");
}
return createDeliveryResponse;
}
}

View File

@@ -0,0 +1,37 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../../Helper/Logger.dart';
import '../../../Model/Request/update_delivery/update_delivery.dart';
import '../../../Model/Response/update_delivery_response/update_delivery_response.dart';
class UpdateDeliveryProvider {
Future<UpdateDeliveryResponse?> updateDelivery (UpdateDeliveryRequest data,String urldata,) async {
UpdateDeliveryResponse? updateDeliveryResponse;
try {
final url = Uri.parse(urldata);
final response = await put(url,
body: json.encode(data),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': '$token',
});
logger.i('Update Delivery Response : ${response.body}');
Map<String, dynamic> parsedJson = json.decode(response.body);
updateDeliveryResponse = UpdateDeliveryResponse.fromJson(parsedJson);
} catch (e) {
print(e.toString());
print("error");
}
return updateDeliveryResponse;
}
}

View File

@@ -0,0 +1,21 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Admintoken/Admintokenresponse.dart';
import '../../Provider/Admintoken/Getadmintokenprovider.dart';
class GetAdminTokenRepository{
GetAdminTokenProvider getAdminTokenProvider = GetAdminTokenProvider();
int? appLocationId;
Future<GetAdminToken?> getAdminToken() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
appLocationId = prefs.getInt('appLocationId');
var result = await getAdminTokenProvider.getAdminToken('${ApiConstants.adminToken}/?applocationid=$appLocationId');
return result;
}
}

View File

@@ -0,0 +1,17 @@
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Appcategory/app_category_response.dart';
import '../../Provider/Appcategory/Appcategoryprovider.dart';
class AppCategoryRepository{
AppCategoryProvider appCategoryProvider = AppCategoryProvider();
Future<GetAppCategories?> getAppCategory() async {
return await appCategoryProvider.getAppCategory('https://fiesta.nearle.app/live/api/v1/mob/utils/getsubcategories');
}
}

View File

@@ -0,0 +1,15 @@
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Applocations/Applocationresponse.dart';
import '../../Provider/Applocation/Applocationprovider.dart';
class AppLocationRepository{
AppLocationProvider appLocationProvider = AppLocationProvider();
Future<GetAppLocations?> getAppLocations() async {
return await appLocationProvider.getAppLocations(ApiConstants.appLocations);
}
}

View File

@@ -0,0 +1,16 @@
import '../../../../Helper/Constants/Apiconstants.dart';
import '../../../../Model/Request/Authentication/Createuser/Createuserresponse.dart';
import '../../../../Model/Response/Authentication/Createtenantuser/Createtenantuserresponse.dart';
import '../../../Provider/Authentication/Createtenantuser/Createtenantuserprovider.dart';
class CreateTenantUserRepository{
int? userId;
CreateTenantUserProviders createTenantUserProviders =CreateTenantUserProviders();
Future<CreateTenantUserResponse?> createTenantUser(CreateTenantUser data) async {
var result = await createTenantUserProviders.createTenantUser(data,'${ApiConstants.createTenantUser}');
return result;
}
}

View File

@@ -0,0 +1,15 @@
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Request/Authentication/Loginrequest.dart';
import '../../../Model/Response/Authentication/Loginresponse.dart';
import '../../Provider/Authentication/loginprovider.dart';
class LoginRepository{
LoginProvider loginProvider = LoginProvider();
Future<LoginResponse?> signIn(LoginRequest data) async {
return await loginProvider.signIn('https://fiesta.nearle.app/live/api/v1/mob/users/tenant/login',data);
}
}

View File

@@ -0,0 +1,13 @@
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Request/Createorder/Createorderrequest.dart';
import '../../../Model/Response/Createorder/CreateOrderResponsemodel.dart';
import '../../Provider/CreatOrder/CreateOrderProvider.dart';
class CreateOrderRepository{
CreateOrderProviders createOrderProviders =CreateOrderProviders();
Future<CreateOrderResponse?>createOrder(CreateOrder data) async {
var result = await createOrderProviders.createOrder(data,ApiConstants.createOrder);
return result;
}
}

View File

@@ -0,0 +1,21 @@
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Request/Authentication/Createuser/Createdeliveryaddress/Createdeliveryaddressrequest.dart';
import '../../../Model/Request/Createcustomer/Createcustomerrequest.dart';
import '../../../Model/Response/Createcustomer/Createcustomerresponse.dart';
import '../../../Model/Response/Createcustomer/Createdeliveryaddress/Createdeliveryaddressresponsel.dart';
import '../../Provider/Createcustomer/Createcustomerprovider.dart';
class CreateCustomerRepository{
CreateCustomerProvider createCustomerProvider = CreateCustomerProvider();
Future<CreateCustomerResponse?> createCustomer(CreateCustomers data) async {
var result = await createCustomerProvider.createCustomer(data,'${ApiConstants.createCustomer}');
return result;
}
Future<CreateDeliveryAddressResponse?> createDeliveryAddress(CreateDeliveryAddress data) async {
var result = await createCustomerProvider.createDeliveryAddress(data,'${ApiConstants.createDeliveryAddress}');
return result;
}
}

View File

@@ -0,0 +1,75 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Customers/GetCustomerById/GetCustomerByTenantId.dart';
import '../../../Model/Response/Customers/GetCustomerById/Getdropcustomerbytenantid.dart';
import '../../Provider/Customers/getCustomerbytenantidprovider.dart';
class GetCustomersByTenantIdRepository{
GetCustomersByTenantIdProvider getCustomersByTenantIdProvider = GetCustomersByTenantIdProvider();
int? tenantId;
Future<GetCustomerByTenantId?> getCustomerByTenantId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var result = await getCustomersByTenantIdProvider.getCustomerByTenantId('${ApiConstants.getCustomerByTenantId}/?tenantid=$tenantId&pageno=1&pagesize=20');
return result;
}
Future<GetCustomerByTenantId?> getCustomerKeywordByTenantId(keyword) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var result = await getCustomersByTenantIdProvider.getCustomerByTenantId('${ApiConstants.getCustomerSearchByTenantId}/?tenantid=$tenantId&keyword=$keyword');
return result;
}
Future<GetCustomerByTenantId?> getTenantsByTenantId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var result = await getCustomersByTenantIdProvider.getTenantsByTenantId('${ApiConstants.getCustomerByTenantId}/?tenantid=$tenantId&locationid=1');
return result;
}
Future<GetCustomerByTenantId?> getCustomerByPageLimitTenantId(page,limit) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var result = await getCustomersByTenantIdProvider.getTenantsByTenantId('${ApiConstants.getCustomerByTenantId}/?tenantid=$tenantId&pageno=$page&pagesize=$limit');
return result;
}
Future<GetDropCustomerByTenantId?> getDropCustomerByTenantId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var result = await getCustomersByTenantIdProvider.getDropCustomerByTenantId('${ApiConstants.getCustomerByTenantId}/?tenantid=$tenantId');
return result;
}
Future<GetDropCustomerByTenantId?> getDropCustomerKeywordByTenantId(keyword) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var result = await getCustomersByTenantIdProvider.getDropCustomerByTenantId('${ApiConstants.getCustomerSearchByTenantId}/?tenantid=$tenantId&keyword=$keyword');
return result;
}
Future<GetDropCustomerByTenantId?> getDropCustomerByPageLimitTenantId(page,limit) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var result = await getCustomersByTenantIdProvider.getDropCustomerByTenantId('${ApiConstants.getCustomerByTenantId}/?tenantid=$tenantId&pageno=$page&pagesize=$limit');
return result;
}
Future<GetDropCustomerByTenantId?> getDropTenantByTenantId() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var result = await getCustomersByTenantIdProvider.getDropTenantByTenantId('${ApiConstants.getCustomerByTenantId}/?tenantid=$tenantId&locationid=1');
return result;
}
}

View File

@@ -0,0 +1,15 @@
import '../../../../Helper/Constants/Apiconstants.dart';
import '../../../../Model/Request/Location/Addlocation/Addlocationrequest.dart';
import '../../../../Model/Response/Location/Addlocation/Addlocationresponse.dart';
import '../../../Provider/Location/Addlocation/Addlocationprovider.dart';
class AddLocationRepository{
AddLocationProvider addLocationProvider = AddLocationProvider();
Future<AddLocationResponse?>addLocation(AddLocation data) async {
var result = await addLocationProvider.addLocation(data,'${ApiConstants.createLocation}');
return result;
}
}

View File

@@ -0,0 +1,22 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../../Helper/Constants/Apiconstants.dart';
import '../../../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
import '../../../Provider/Location/GetLocation/getlocationprovider.dart';
class GetLocationsRepository{
GetLocationsProvider getLocationsProvider = GetLocationsProvider();
int tenantId = 0;
int locationId = 0;
Future<GetLocationByTenantId?> getLocationById() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId')!;
locationId = prefs.getInt('locationId')!;
var result = await getLocationsProvider.getLocationById('${ApiConstants.getLocationById}?tenantid=$tenantId',);
return result;
}
}

View File

@@ -0,0 +1,15 @@
import '../../../../Helper/Constants/Apiconstants.dart';
import '../../../../Model/Request/Location/Updatelocation/Updatelocationrequest.dart';
import '../../../../Model/Response/Location/Updatelocation/Updatelocationresponse.dart';
import '../../../Provider/Location/Updatelocation/Updatelocationprovider.dart';
class UpdateLocationRepository{
UpdateLocationProvider updateLocationProvider =UpdateLocationProvider();
Future<UpdateLocationResponse?>updateLocation(UpdateLocation data) async {
var result = await updateLocationProvider.updateLocation(data,ApiConstants.updateLocation);
return result;
}
}

View File

@@ -0,0 +1,21 @@
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Authentication/Sms/Smsresponse.dart';
import '../../../Model/Response/Notification/Notificationresponse.dart';
import '../../Provider/Notification/Notificationprovider.dart';
class NotificationRepository{
NotificationProvider notificationProvider = NotificationProvider();
Future<NotificationResponse?> createNotification( data) async {
var result = await notificationProvider.createNotification(data,ApiConstants.notifyUrl);
return result;
}
Future<NotificationResponse?> notifyRider( data) async {
var result = await notificationProvider.NotifyRider(data,ApiConstants.notifyRider);
return result;
}
}

View File

@@ -0,0 +1,61 @@
import 'package:intl/intl.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Orders/Getorderresponse.dart';
import '../../Provider/Orders/Ordersprovider.dart';
class OrdersRepository {
int? tenantId;
int? locationid;
OrdersProvider ordersProvider = OrdersProvider();
Future<GetOrders?> getOrders(String status) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
locationid = prefs.getInt('locationId');
var fromDate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var toDate = DateFormat("yyyy-MM-dd").format(DateTime.now());
print('ddd $status');
// var fromDateTm = DateFormat("yyyy-MM-dd").format(DateTime.now());
// var toDateTm = DateFormat("yyyy-MM-dd").format(DateTime.now().add(Duration(days: 1)));
var result = await ordersProvider.getOrders(
'${ApiConstants.getOrders}/?tenantid=$tenantId&status=$status&fromdate=$fromDate&todate=$toDate&locationid=$locationid');
return result;
}
Future<GetOrders?> getCurrentOrders() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var fromDate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var toDate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var result = await ordersProvider.getOrders('${ApiConstants.getOrders}/?tenantid=$tenantId&status=ongoing&fromdate=$fromDate&todate=$toDate&locationid=$locationid');
return result;
}
Future<GetOrders?> getCompletedOrders() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var fromDate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var toDate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var result = await ordersProvider.getOrders('${ApiConstants.getOrders}/?tenantid=$tenantId&status=delivered&fromdate=$fromDate&todate=$toDate&locationid=$locationid');
return result;
}
Future<GetOrders?> getCancelledOrder() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
var fromDate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var toDate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var result = await ordersProvider.getOrders('${ApiConstants.getOrders}/?tenantid=$tenantId&status=cancelled&fromdate=$fromDate&todate=$toDate&locationid=$locationid');
return result;
}
}

View File

@@ -0,0 +1,23 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Riders/get_rider_model.dart';
import '../../Provider/Riders/get_rider_provider.dart';
class RidersRepository{
RidersProvider ridersProvider = RidersProvider();
int? tenantId = 0;
int? locationId = 0;
Future<GetRiderPoolsModel?> getRiders(appLocationId) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
locationId = prefs.getInt('locationId');
var result = await ridersProvider.getRiders('${ApiConstants.getRiders}?tenantid=${tenantId}&location=$locationId');
return result;
}
}

View File

@@ -0,0 +1,17 @@
import '../../../../Helper/Constants/Apiconstants.dart';
import '../../../../Model/Request/Staffs/Addstaffs/Addstaffsrequest.dart';
import '../../../../Model/Response/Staffs/Addstaffs/Addstaffresponse.dart';
import '../../../Provider/Staffs/Addstaffs/Addstaffprovider.dart';
class AddStaffRepository{
AddStaffProvider addStaffProvider =AddStaffProvider();
Future<CreateStaffResponse?>addStaff(CreateStaffRequest data) async {
var result = await addStaffProvider.addStaff(data,ApiConstants.createStaff);
return result;
}
}

View File

@@ -0,0 +1,20 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Staffs/Getstaffsresponse.dart';
import '../../Provider/Staffs/Staffsprovider.dart';
class GetStaffsRepository{
int? tenantId;
GetStaffsProvider getStaffsProvider = GetStaffsProvider();
Future<GetStaffsResponse?> getStaffs() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId')!;
var result = await getStaffsProvider.getStaffs('${ApiConstants.getStaffs}/?tenantid=$tenantId',);
return result;
}
}

View File

@@ -0,0 +1,14 @@
import '../../../../Helper/Constants/Apiconstants.dart';
import '../../../../Model/Request/Staffs/UpdateStaff/Updatestaffrequest.dart';
import '../../../../Model/Response/Staffs/Updatestaff/Updatestaffresponse.dart';
import '../../../Provider/Staffs/Updatestaff/Updatestaffprovider.dart';
class UpdateStaffRepository{
UpdateStaffProvider updateStaffProvider = UpdateStaffProvider();
Future<UpdateStaffResponse?> updateStaff(UpdateStaffRequest data) async {
var result = await updateStaffProvider.updateStaff(data,ApiConstants.updateStaff,);
return result;
}
}

View File

@@ -0,0 +1,92 @@
import 'package:intl/intl.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Request/Orders/Cancelorderrequest.dart';
import '../../../Model/Response/Summary/Cancelorderresponse.dart';
import '../../../Model/Response/Summary/Getsummarysresponse.dart';
import '../../../Model/Response/Summary/Ordersummaryresponse.dart';
import '../../Provider/Summary/ordersprovider.dart';
class OrderSummaryRepository{
OrderSummaryProvider orderSummaryProvider = OrderSummaryProvider();
DateTime? now;
int moduleId = 0;
int tenantId = 0;
int locationId = 0;
int roleId = 0;
int orderheaderId =0;
DateTime getDate(DateTime d) => DateTime(d.year, d.month, d.day);
Future<GetDeliveries?> getOrdersToday({String? keyword}) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var keywordParam = keyword ?? '';
roleId = prefs.getInt('roleId')??0;
tenantId = prefs.getInt('tenantId')??0;
locationId = prefs.getInt('locationId')??0;
var fromdate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var todate = DateFormat("yyyy-MM-dd").format(DateTime.now());
var result = await orderSummaryProvider.getDelivery('${ApiConstants.getDeliveries}/?tenantid=$tenantId&fromdate=$fromdate&todate=$todate''&status=delivered&pageno=1&pagesize=30&keyword=$keywordParam&locationid=$locationId',);
return result;
}
Future<GetDeliveries?> getOrdersWeek({String? keyword}) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
roleId = prefs.getInt('roleid')??0;
tenantId = prefs.getInt('tenantId')??0;
locationId = prefs.getInt('locationId')??0;
final date = DateTime.now();
var keywordParam = keyword ?? '';
DateTime start = getDate(date.subtract(Duration(days: date.weekday - 1,)));
DateTime week = getDate(
date.add(Duration(days: DateTime.daysPerWeek - date.weekday)));
var fromdate = DateFormat("yyyy-MM-dd")
.format(DateFormat("yyyy-MM-dd", "en_US").parse(start.toString()));
var todate= DateFormat("yyyy-MM-dd")
.format(DateFormat("yyyy-MM-dd", "en_US").parse(week.toString()));
var result = await orderSummaryProvider.getDelivery('${ApiConstants.getDeliveries}/?tenantid=$tenantId&fromdate=$fromdate'
'&todate=$todate&status=delivered&pageno=1&pagesize=30&keyword=$keywordParam&locationid=$locationId');
return result;
}
Future<GetDeliveries?> getOrdersMonth({String? keyword}) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
roleId = prefs.getInt('roleid')??0;
tenantId = prefs.getInt('tenantId')??0;
locationId = prefs.getInt('locationId')??0;
now = DateTime.now();
var keywordParam = keyword ?? '';
DateTime lastDayOfMonth = new DateTime(now!.year, now!.month + 1, 0);
DateTime firstDayOfMonth = new DateTime(now!.year, now!.month, 1);
var fromdate = DateFormat("yyyy-MM-dd").format(
DateFormat("yyyy-MM-dd", "en_US").parse(firstDayOfMonth.toString()));
var todate = DateFormat("yyyy-MM-dd").format(
DateFormat("yyyy-MM-dd", "en_US").parse(lastDayOfMonth.toString()));
var result = await orderSummaryProvider.getDelivery('${ApiConstants.getDeliveries}/?tenantid=$tenantId&fromdate='
'$fromdate&todate=$todate&status=delivered&pageno=1&pagesize=30&keyword=$keywordParam&locationid=$locationId');
return result;
}
Future<OrderSummary?> getOrderSummary() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId')!;
locationId = prefs.getInt('locationId')??0;
var result = await orderSummaryProvider.getOrderSummary('${ApiConstants.getOrderSummary}/?tenantid=$tenantId&locationid=$locationId');
return result;
}
Future<CancelOrderResponse?>updateOrders(CancelOrderRequest data) async {
var result = await orderSummaryProvider.updateOrders(data,'${ApiConstants.updateOrderStatus}');
return result;
}
}

View File

@@ -0,0 +1,19 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Partners/Getpartnerinforequest.dart';
import '../../Provider/TenantPartner/Tenantpartnerprovider.dart';
class GetPartnersRepository{
GetPartnersProvider getPartnersProvider = GetPartnersProvider();
int tenantId = 0;
Future<GetPartnersInfo?> getPartners(locationId) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
locationId = prefs.getInt('locationId')??0;
var result = await getPartnersProvider.getPartners("${ApiConstants.getPartnerInfo}?applocationid=$locationId",);
return result;
}
}

View File

@@ -0,0 +1,29 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Tenantlocation/Getlocationbyidresponse.dart';
import '../../../Model/Response/Tenantlocation/Locationbyid/Locationidresponse.dart';
import '../../Provider/Tenantlocation/Getlocationprovider.dart';
class GetLocationsRepository{
GetLocationsProvider getLocationsProvider = GetLocationsProvider();
int? tenantId;
int? locationId;
Future<GetLocationByTenantId?> getTenantLocationById() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId')??0;
locationId = prefs.getInt('locationId')??0;
var result = await getLocationsProvider.getTenantLocationById('${ApiConstants.getTenantLocationById}?tenantid=$tenantId&locationid=$locationId');
return result;
}
Future<GetLocationByLocaionId?> getLocationById() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId')??0;
locationId = prefs.getInt('locationId')??0;
var result = await getLocationsProvider.getLocationById('${ApiConstants.getLocationsById}?tenantid=$tenantId&locationid=$locationId',);
return result;
}
}

View File

@@ -0,0 +1,16 @@
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Appcategory/Appcategoryresponse.dart';
import '../../Provider/Tenantmodulecategory/Categoryprovider.dart';
class GetTenantCategoriesRepository{
GetTenantCategoriesProvider getTenantCategoriesProvider = GetTenantCategoriesProvider();
// Future<AppCategory?> getTenantCategory() async {
//
// return await getTenantCategoriesProvider.getTenantCategory('${ApiConstants.appCategory}/?moduleid=6');
//
// }
}

View File

@@ -0,0 +1,17 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Tenantpricing/Tenantpricingresponse.dart';
import '../../Provider/Tenantpricing/Tenantchargesprovider.dart';
class TenantPricingRepository {
TenantPricingProvider tenantChargesProvider =TenantPricingProvider();
int tenantId = 0;
Future<GetTenantPricing?> getTenantPricing() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId')??0;
var result = await tenantChargesProvider.getTenantPricing('${ApiConstants.getTenantPricing}/?tenantid=$tenantId',);
return result;
}
}

View File

@@ -0,0 +1,27 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Response/Tenants/Tenantinforesponse.dart';
import '../../Provider/Tenants/Tenantsprovider.dart';
class TenantRepository{
int? tenantId;
int? locationId;
TenantsProvider tenantsProvider = TenantsProvider();
Future<TenantInfo?> getTenantInfo() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId') ?? 0;
locationId = prefs.getInt('locationId')??0;
print(tenantId);
var result = await tenantsProvider.getTenantInfo('${ApiConstants.getTenantInfo}/?tenantid=$tenantId&locationid=$locationId');
// var result = await tenantsProvider.getTenantInfo('${ApiConstants.tenantInfo}/?tenantid=$tenantId');
return result;
}
}

View File

@@ -0,0 +1,31 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Request/User/Updateuser/Updateuserrequest.dart';
import '../../../Model/Response/User/Updateuser/Updateuserresponse.dart';
import '../../../Model/Response/User/Usermodelresponse.dart';
import '../../Provider/Users/user_provider.dart';
class UserRepository {
UserProvider userProvider = UserProvider();
int? userId;
int? locationId;
Future<UserModelResponse?> getUser(token) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
userId = prefs.getInt('userId');
locationId = prefs.getInt('locationId')??0;
return await userProvider.getUser('${ApiConstants.user}/getusers?userid=$userId&locationid=$locationId',token);
}
Future<UserUpdateResponse?> updateUser(UserUpdateRequest data) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
userId = prefs.getInt('userId');
return await userProvider.updateUser(data,ApiConstants.userUpdate,);
}
}

View File

@@ -0,0 +1,46 @@
import 'package:shared_preferences/shared_preferences.dart';
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Request/products/update_product.dart';
import '../../../Model/Response/products/product_info.dart';
import '../../../Model/Response/products/product_response.dart';
import '../../../Model/Response/products/product_update_response.dart';
import '../../Provider/Products_provider/get_products.dart';
class ProductsRepository {
int? tenantId;
int? locationId;
int? categoryId;
GetProductsProvider getProductsProvider = GetProductsProvider();
Future<GetProducts?> getProducts({int? subCategoryId, String? keyword}) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
tenantId = prefs.getInt('tenantId');
locationId = prefs.getInt('locationId');
categoryId = prefs.getInt('categoryId');
var result = await getProductsProvider.getProducts('https://fiesta.nearle.app/live/api/v1/mob/products/getlocationproducts?tenantid=${tenantId}&page=1&pagesize=40&locationid=$locationId');
return result;
}
Future<ProductUpdateResponse?> productUpdate(ProductUpdateRequest data) async {
var result = await getProductsProvider.updateProducts(data, 'https://fiesta.nearle.app/live/api/v1/mob/products/updateproductlocation');
return result;
}
String productDetail = "https://fiesta.nearle.app/live/api/v1/mob/orders/getorderdetails";
Future<ProductDetailResponse?> getProductDetail(int orderheaderid) async {
var result = await getProductsProvider.getProductDetail('$productDetail?orderheaderid=$orderheaderid');
return result;
}
}

View File

@@ -0,0 +1,18 @@
import '../../../Helper/Constants/Apiconstants.dart';
import '../../../Model/Request/create_delivery_request/create_delivery_request.dart';
import '../../../Model/Response/create_delivery_response/create_delivery_request.dart';
import '../../Provider/deliveries/create_delivery.dart';
class createDeliveryRepository {
CreateDeliveryProvider createDeliveryProvider = CreateDeliveryProvider();
Future<CreateDeliveryResponse?> createDelivery(List<CreateDelivery> data) async {
var result = await createDeliveryProvider.createDelivery(data, ApiConstants.createDelivery);
return result;
}
}

Some files were not shown because too many files have changed in this diff Show More