Commit b35acfea authored by Sai Srinivas's avatar Sai Srinivas
Browse files

local fix

parents ebb11608 2a087139
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<uses-feature
android:name="android.hardware.camera"
......@@ -12,16 +14,18 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission tools:node="remove" android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission tools:node="remove" android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission tools:node="remove" android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission tools:node="remove" android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:name="${applicationName}"
......@@ -77,6 +81,12 @@
</intent-filter>
</activity>
<service
android:name="com.pravera.flutter_foreground_task.service.ForegroundService"
android:foregroundServiceType="location"
android:exported="false"/>
<meta-data
android:name="flutter_deeplinking_enabled"
android:value="true" />
......
<svg id="Layer_1" enable-background="new 0 0 64 64" height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><g><g id="ARC_17_"><g><path d="m31.996 31.008c-3.292 0-6.583-1.09-9.33-3.271-.433-.344-.504-.973-.161-1.406.345-.432.973-.502 1.405-.16 4.761 3.783 11.412 3.783 16.171 0 .432-.344 1.062-.271 1.405.16.344.434.271 1.063-.161 1.406-2.746 2.181-6.038 3.271-9.329 3.271z"/></g></g><g id="ARC_18_"><g><path d="m16.307 41.711c-.455 0-.866-.313-.973-.773-1.432-6.156 1.748-12.424 7.561-14.904.509-.217 1.096.02 1.313.527.217.508-.02 1.096-.527 1.313-4.919 2.098-7.61 7.402-6.398 12.611.125.537-.209 1.074-.748 1.199-.077.019-.153.027-.228.027z"/></g></g><g id="ARC_19_"><g><path d="m47.684 41.711c-.075 0-.151-.008-.228-.027-.538-.125-.873-.662-.747-1.199 1.212-5.209-1.479-10.514-6.398-12.611-.508-.217-.744-.805-.527-1.313.217-.51.809-.744 1.313-.527 5.813 2.48 8.994 8.748 7.561 14.904-.109.46-.52.773-.974.773z"/></g></g><g id="CIRCLE_14_"><g><path d="m32.013 26.967c-2.701 0-5.284-.963-7.273-2.709-3.782-3.32-4.823-8.957-2.475-13.398 1.881-3.561 5.723-5.861 9.788-5.861.888 0 1.772.107 2.629.324 4.817 1.209 8.314 5.695 8.314 10.668 0 3.559-1.735 6.916-4.642 8.979-1.844 1.305-4.038 1.997-6.341 1.997zm.039-19.969c-3.333 0-6.48 1.881-8.019 4.795-1.92 3.635-1.068 8.244 2.026 10.963 1.624 1.426 3.738 2.211 5.954 2.211 1.888 0 3.68-.563 5.184-1.629 2.379-1.689 3.799-4.436 3.799-7.348 0-4.068-2.86-7.74-6.801-8.729-.699-.175-1.419-.263-2.143-.263z"/></g></g><g id="ARC_20_"><g><path d="m24.573 43.184c-.034 0-.067-.002-.102-.006-2.83-.287-5.66-.791-8.412-1.498-.535-.139-.857-.684-.719-1.219.137-.535.684-.857 1.217-.719 2.655.684 5.386 1.17 8.115 1.445.55.057.95.547.895 1.096-.052.516-.487.901-.994.901z"/></g></g><g id="ARC_21_"><g><path d="m39.418 43.184c-.507 0-.941-.385-.994-.9-.056-.549.345-1.039.895-1.096 2.73-.275 5.46-.762 8.115-1.445.529-.137 1.08.184 1.218.719s-.185 1.08-.72 1.219c-2.752.707-5.582 1.211-8.412 1.498-.035.003-.069.005-.102.005z"/></g></g><g id="LINE_65_"><g><path d="m31.995 53.99c-.195 0-.392-.057-.565-.176-.455-.313-.571-.936-.258-1.391l7.423-10.807c.312-.455.938-.57 1.391-.258.455.313.57.936.258 1.391l-7.424 10.808c-.194.283-.507.433-.825.433z"/></g></g><g id="LINE_66_"><g><path d="m31.997 53.99c-.318 0-.631-.15-.825-.434l-7.424-10.806c-.313-.455-.197-1.078.258-1.391.457-.314 1.078-.197 1.391.258l7.424 10.807c.312.455.197 1.078-.258 1.391-.174.119-.372.175-.566.175z"/></g></g><g id="LWPOLYLINE_14_"><g><path d="m32.453 59.002c-.709 0-1.429-.012-2.159-.037-4.484-.15-8.824-.424-12.622-2.088-.71-.311-2.386-1.189-2.613-2.623-.083-.527-.001-1.32.866-2.09 2.129-1.893 5.448-2.318 8.114-2.66l.896-.117c.541-.07 1.052.309 1.126.855s-.308 1.053-.855 1.127l-.913.119c-2.394.307-5.372.688-7.039 2.17-.177.156-.223.264-.22.283.034.213.553.715 1.44 1.104 3.473 1.521 7.604 1.777 11.886 1.922 4.494.148 8.578-.178 12.126-.98 3.9-.879 4.438-1.734 4.508-1.898.011-.025.029-.07-.06-.217-.367-.598-1.497-.996-2.245-1.26-1.851-.652-3.845-.959-5.896-1.242-.548-.074-.93-.578-.854-1.125.074-.547.577-.938 1.126-.855 2.157.297 4.262.621 6.289 1.336 1.014.357 2.548.898 3.285 2.102.518.846.393 1.576.196 2.041-.554 1.311-2.415 2.283-5.856 3.059-3.175.717-6.699 1.074-10.526 1.074z"/></g></g></g></svg>
\ No newline at end of file
......@@ -9,7 +9,7 @@ class FollowupListResponse {
if (json['list'] != null) {
list = <Followuplist>[];
json['list'].forEach((v) {
list!.add(Followuplist.fromJson(v));
list!.add(new Followuplist.fromJson(v));
});
}
error = json['error'];
......@@ -17,12 +17,12 @@ class FollowupListResponse {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (list != null) {
data['list'] = list!.map((v) => v.toJson()).toList();
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.list != null) {
data['list'] = this.list!.map((v) => v.toJson()).toList();
}
data['error'] = error;
data['session_exists'] = sessionExists;
data['error'] = this.error;
data['session_exists'] = this.sessionExists;
return data;
}
}
......@@ -42,8 +42,8 @@ class Followuplist {
String? time;
String? ename;
Followuplist({
this.id,
Followuplist(
{this.id,
this.empId,
this.compId,
this.inTime,
......@@ -55,8 +55,7 @@ class Followuplist {
this.fsrExt,
this.runningHrs,
this.time,
this.ename,
});
this.ename});
Followuplist.fromJson(Map<String, dynamic> json) {
id = json['id'];
......@@ -75,20 +74,20 @@ class Followuplist {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['emp_id'] = empId;
data['comp_id'] = compId;
data['in_time'] = inTime;
data['out_time'] = outTime;
data['feedback'] = feedback;
data['type'] = type;
data['date'] = date;
data['fsr_no'] = fsrNo;
data['fsr_ext'] = fsrExt;
data['running_hrs'] = runningHrs;
data['time'] = time;
data['ename'] = ename;
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['emp_id'] = this.empId;
data['comp_id'] = this.compId;
data['in_time'] = this.inTime;
data['out_time'] = this.outTime;
data['feedback'] = this.feedback;
data['type'] = this.type;
data['date'] = this.date;
data['fsr_no'] = this.fsrNo;
data['fsr_ext'] = this.fsrExt;
data['running_hrs'] = this.runningHrs;
data['time'] = this.time;
data['ename'] = this.ename;
return data;
}
}
class ServiceComplaintBillListResponse {
List<ComplaintList>? complaintList;
int? error;
int? sessionExists;
ServiceComplaintBillListResponse(
{this.complaintList, this.error, this.sessionExists});
ServiceComplaintBillListResponse.fromJson(Map<String, dynamic> json) {
if (json['complaint_list'] != null) {
complaintList = <ComplaintList>[];
json['complaint_list'].forEach((v) {
complaintList!.add(new ComplaintList.fromJson(v));
});
}
error = json['error'];
sessionExists = json['session_exists'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.complaintList != null) {
data['complaint_list'] =
this.complaintList!.map((v) => v.toJson()).toList();
}
data['error'] = this.error;
data['session_exists'] = this.sessionExists;
return data;
}
}
class ComplaintList {
String? billId;
String? totalAmount;
String? rawAmount;
String? narration;
String? billDate;
String? dueDate;
String? billPaid;
ComplaintList(
{this.billId,
this.totalAmount,
this.rawAmount,
this.narration,
this.billDate,
this.dueDate,
this.billPaid});
ComplaintList.fromJson(Map<String, dynamic> json) {
billId = json['bill_id'];
totalAmount = json['total_amount'];
rawAmount = json['raw_amount'];
narration = json['narration'];
billDate = json['bill_date'];
dueDate = json['due_date'];
billPaid = json['bill_paid'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['bill_id'] = this.billId;
data['total_amount'] = this.totalAmount;
data['raw_amount'] = this.rawAmount;
data['narration'] = this.narration;
data['bill_date'] = this.billDate;
data['due_date'] = this.dueDate;
data['bill_paid'] = this.billPaid;
return data;
}
}
class EditCommonAccFormDetailsResponse {
List<AccountList>? accountList;
String? error;
String? message;
int? sessionExists;
EditCommonAccFormDetailsResponse(
{this.accountList, this.error, this.message, this.sessionExists});
EditCommonAccFormDetailsResponse.fromJson(Map<String, dynamic> json) {
if (json['account_list'] != null) {
accountList = <AccountList>[];
json['account_list'].forEach((v) {
accountList!.add(new AccountList.fromJson(v));
});
}
error = json['error'];
message = json['message'];
sessionExists = json['session_exists'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.accountList != null) {
data['account_list'] = this.accountList!.map((v) => v.toJson()).toList();
}
data['error'] = this.error;
data['message'] = this.message;
data['session_exists'] = this.sessionExists;
return data;
}
}
class AccountList {
String? id;
String? isPaymentAccount;
String? createdEmployeeId;
String? type;
String? refId;
String? name;
String? subLocality;
String? district;
String? state;
String? address;
String? datetime;
String? empId;
String? bankName;
String? bankBranchName;
String? bankIfscCode;
String? bankAccountHolderName;
String? bankAccountNumber;
String? bankUpiId;
String? bankUpiName;
String? gstNumber;
Null? cashfreeAccountId;
String? isGstNumberVerified;
String? isBankAccountVerified;
String? remarks;
String? isExists;
String? createdDatetime;
String? updatedDatetime;
String? mob1;
String? email;
String? contactName;
AccountList(
{this.id,
this.isPaymentAccount,
this.createdEmployeeId,
this.type,
this.refId,
this.name,
this.subLocality,
this.district,
this.state,
this.address,
this.datetime,
this.empId,
this.bankName,
this.bankBranchName,
this.bankIfscCode,
this.bankAccountHolderName,
this.bankAccountNumber,
this.bankUpiId,
this.bankUpiName,
this.gstNumber,
this.cashfreeAccountId,
this.isGstNumberVerified,
this.isBankAccountVerified,
this.remarks,
this.isExists,
this.createdDatetime,
this.updatedDatetime,
this.mob1,
this.email,
this.contactName});
AccountList.fromJson(Map<String, dynamic> json) {
id = json['id'];
isPaymentAccount = json['is_payment_account'];
createdEmployeeId = json['created_employee_id'];
type = json['type'];
refId = json['ref_id'];
name = json['name'];
subLocality = json['sub_locality'];
district = json['district'];
state = json['state'];
address = json['address'];
datetime = json['datetime'];
empId = json['emp_id'];
bankName = json['bank_name'];
bankBranchName = json['bank_branch_name'];
bankIfscCode = json['bank_ifsc_code'];
bankAccountHolderName = json['bank_account_holder_name'];
bankAccountNumber = json['bank_account_number'];
bankUpiId = json['bank_upi_id'];
bankUpiName = json['bank_upi_name'];
gstNumber = json['gst_number'];
cashfreeAccountId = json['cashfree_account_id'];
isGstNumberVerified = json['is_gst_number_verified'];
isBankAccountVerified = json['is_bank_account_verified'];
remarks = json['remarks'];
isExists = json['is_exists'];
createdDatetime = json['created_datetime'];
updatedDatetime = json['updated_datetime'];
mob1 = json['mob1'];
email = json['email'];
contactName = json['contact_name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['is_payment_account'] = this.isPaymentAccount;
data['created_employee_id'] = this.createdEmployeeId;
data['type'] = this.type;
data['ref_id'] = this.refId;
data['name'] = this.name;
data['sub_locality'] = this.subLocality;
data['district'] = this.district;
data['state'] = this.state;
data['address'] = this.address;
data['datetime'] = this.datetime;
data['emp_id'] = this.empId;
data['bank_name'] = this.bankName;
data['bank_branch_name'] = this.bankBranchName;
data['bank_ifsc_code'] = this.bankIfscCode;
data['bank_account_holder_name'] = this.bankAccountHolderName;
data['bank_account_number'] = this.bankAccountNumber;
data['bank_upi_id'] = this.bankUpiId;
data['bank_upi_name'] = this.bankUpiName;
data['gst_number'] = this.gstNumber;
data['cashfree_account_id'] = this.cashfreeAccountId;
data['is_gst_number_verified'] = this.isGstNumberVerified;
data['is_bank_account_verified'] = this.isBankAccountVerified;
data['remarks'] = this.remarks;
data['is_exists'] = this.isExists;
data['created_datetime'] = this.createdDatetime;
data['updated_datetime'] = this.updatedDatetime;
data['mob1'] = this.mob1;
data['email'] = this.email;
data['contact_name'] = this.contactName;
return data;
}
}
class ValidateBankAccountDetailsResponse {
String? nameAtBank;
String? bankName;
String? branch;
String? error;
String? message;
int? sessionExists;
ValidateBankAccountDetailsResponse(
{this.nameAtBank,
this.bankName,
this.branch,
this.error,
this.message,
this.sessionExists});
ValidateBankAccountDetailsResponse.fromJson(Map<String, dynamic> json) {
nameAtBank = json['name_at_bank'];
bankName = json['bank_name'];
branch = json['branch'];
error = json['error'];
message = json['message'];
sessionExists = json['session_exists'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name_at_bank'] = this.nameAtBank;
data['bank_name'] = this.bankName;
data['branch'] = this.branch;
data['error'] = this.error;
data['message'] = this.message;
data['session_exists'] = this.sessionExists;
return data;
}
}
class ValidateGstNumResponse {
String? legalNameOfBusiness;
String? address;
String? error;
String? message;
int? sessionExists;
ValidateGstNumResponse(
{this.legalNameOfBusiness,
this.address,
this.error,
this.message,
this.sessionExists});
ValidateGstNumResponse.fromJson(Map<String, dynamic> json) {
legalNameOfBusiness = json['legal_name_of_business'];
address = json['address'];
error = json['error'];
message = json['message'];
sessionExists = json['session_exists'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['legal_name_of_business'] = this.legalNameOfBusiness;
data['address'] = this.address;
data['error'] = this.error;
data['message'] = this.message;
data['session_exists'] = this.sessionExists;
return data;
}
}
class CommonResponse {
String? error;
String? message;
String? qrCode;
String? qrId;
int? sessionExists;
CommonResponse({this.error, this.message, this.sessionExists});
CommonResponse.fromJson(Map<String, dynamic> json) {
error = json['error'];
qrCode = json['qr_code'];
qrId = json['razorpay_order_id'];
message = json['message'];
sessionExists = json['session_exists'];
}
......@@ -15,6 +18,8 @@ class CommonResponse {
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['error'] = error;
data['qr_code'] = qrCode;
data['razorpay_order_id'] = qrId;
data['message'] = message;
data['session_exists'] = sessionExists;
return data;
......
......@@ -14,6 +14,7 @@ import 'package:provider/provider.dart';
import '../Utils/BackgroundLocationService.dart';
import '../Utils/SharedpreferencesService.dart';
import '../Utils/backgroundServiceNew.dart';
import '../Utils/background_service.dart';
import '../Utils/commonServices.dart';
import '../services/api_calling.dart';
......@@ -229,6 +230,8 @@ class CheckInOutProvider with ChangeNotifier {
if (data.error == 0) {
toast(context, "CheckedIn Successfully");
await BackgroundLocationService.startLocationService(context);
await BackgroundLocationServiceNew.init();
await BackgroundLocationServiceNew.start();
locationController.clear();
dispose();
Navigator.pop(context, true);
......@@ -266,6 +269,7 @@ class CheckInOutProvider with ChangeNotifier {
if (data.error == 0) {
toast(context, "Check-Out Successful");
await BackgroundLocationService.stopLocationService();
await BackgroundLocationServiceNew.stop();
locationController.clear();
dispose();
Navigator.pop(context, true);
......
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:generp/Utils/SharedpreferencesService.dart';
import 'package:generp/Utils/backgroundServiceNew.dart';
import 'package:generp/screens/LoginScreen.dart';
import 'package:generp/services/api_calling.dart';
import 'package:intl/intl.dart';
......@@ -77,6 +78,8 @@ class HomescreenNotifier extends ChangeNotifier {
var lastLocationTime = await SharedpreferencesService().getString(
"lastLocationTime",
);
notifyListeners();
print("lastLocationTime:$lastLocationTime");
......@@ -112,6 +115,7 @@ class HomescreenNotifier extends ChangeNotifier {
if (_att_status == 0) {
webSocketManager.close();
await BackgroundLocationService.stopLocationService();
BackgroundLocationServiceNew.stop();
_onlineStatus = "Offline";
......@@ -151,11 +155,14 @@ class HomescreenNotifier extends ChangeNotifier {
// print("Status knlknn offine");
}
await BackgroundLocationService.startLocationService(context);
await BackgroundLocationServiceNew.init();
await BackgroundLocationServiceNew.start();
// print("setstatus:$setstatus");
} else if (_att_status == 2) {
// print("att_status:$att_status");
webSocketManager.close();
await BackgroundLocationService.stopLocationService();
await BackgroundLocationServiceNew.stop();
_onlineStatus = "Offline";
......
......@@ -5,6 +5,7 @@ import 'package:generp/screens/LoginScreen.dart';
import 'package:generp/services/api_calling.dart';
import '../Utils/BackgroundLocationService.dart';
import '../Utils/backgroundServiceNew.dart';
class LogoutNotifier extends ChangeNotifier {
bool _logoutButtonClicked = false;
......@@ -33,6 +34,8 @@ class LogoutNotifier extends ChangeNotifier {
_isLoading = false;
_logoutButtonClicked = false;
await BackgroundLocationService.stopLocationService();
await BackgroundLocationServiceNew.stop();
SharedpreferencesService().clearPreferences();
Navigator.push(
context,
......
......@@ -208,6 +208,7 @@ class Paymentdetailsprovider extends ChangeNotifier {
_imageName = null;
_image_picked = 0;
resetErrors();
notifyListeners();
} else {}
} else {
......@@ -775,6 +776,22 @@ class Paymentdetailsprovider extends ChangeNotifier {
}
}
void resetErrors() {
nameError = null;
designationError = null;
mobError = null;
altMobError = null;
telError = null;
emailError = null;
selectContactError = null;
selectPaymentError = null;
selectAmountError = null;
ReferenceError = null;
imageError = null;
notifyListeners();
}
resetAddContect() {
Amountcontroller.clear();
Referencecontroller.clear();
......
......@@ -17,6 +17,7 @@ import '../Utils/commonServices.dart';
import '../screens/splash.dart';
class Pendingcomplaintsprovider extends ChangeNotifier {
TextEditingController fsrNumberController = TextEditingController();
TextEditingController runningHoursController = TextEditingController();
TextEditingController feedbackController = TextEditingController();
......
import 'dart:async';
import 'package:flutter/material.dart';
import '../Models/ordersModels/commonResponse.dart';
import '../Utils/custom_snackbar.dart';
import '../services/api_calling.dart';
class QrProvider extends ChangeNotifier {
CommonResponse? _qrResponse;
bool _isLoading = false;
String? _errorMessage;
int _secondsLeft = 120; // 2 minutes
CommonResponse? get qrResponse => _qrResponse;
bool get isLoading => _isLoading;
String? get errorMessage => _errorMessage;
int get secondsLeft => _secondsLeft;
Timer? _timer;
Future<void> fetchRazorpayQr({
required String sessionId,
required String empId,
required String amount,
required String refType,
required String refId,
}) async {
_isLoading = true;
_errorMessage = null;
notifyListeners();
try {
final response = await ApiCalling.fetchRazorpayUpiQrApi(
sessionId,
empId,
amount,
refType,
refId,
);
if (response != null && response.error == "0") {
_qrResponse = response;
_startTimer();
} else {
_errorMessage = response?.message ?? "Something went wrong";
}
} catch (e) {
_errorMessage = e.toString();
} finally {
_isLoading = false;
notifyListeners();
}
}
void _startTimer() {
_secondsLeft = 120;
_timer?.cancel();
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
if (_secondsLeft > 0) {
_secondsLeft--;
notifyListeners();
} else {
timer.cancel();
}
});
}
@override
void dispose() {
_timer?.cancel();
super.dispose();
}
bool _isPaymentUpdating = false;
bool get isPaymentUpdating => _isPaymentUpdating;
set isPaymentUpdating(bool value) {
_isPaymentUpdating = value;
notifyListeners();
}
/// Fetch Razorpay QR Payment Status
/// NOTE: This method no longer shows snackbars itself. It simply returns the response.
Future<CommonResponse?> fetchRazorpayUpiQrStatus({
required BuildContext context,
required String sessionId,
required String empId,
required String razorpayOrderId,
}) async {
try {
isPaymentUpdating = true;
final response = await ApiCalling.fetchRazorpayUpiQrStatusApi(
sessionId,
empId,
razorpayOrderId,
);
if (response != null) {
if (response.sessionExists == 1 && response.error == "0") {
debugPrint("Payment Status: ${response.message}");
} else {
// IMPORTANT: do not show UI here (no repeated warnings).
// The caller (screen) should decide when to show failure messages.
debugPrint("Payment still pending or failed: ${response.message}");
}
} else {
debugPrint("Null response from Razorpay QR Status API");
}
return response;
} catch (e) {
debugPrint("fetchRazorpayUpiQrStatus error: $e");
return null;
} finally {
isPaymentUpdating = false;
}
}
}
......@@ -4,6 +4,7 @@ import 'package:generp/services/api_calling.dart';
import 'package:provider/provider.dart';
import '../Models/FollowUpResponse.dart';
import '../Models/ServiceComplaintBillListResponse.dart';
import '../Models/ViewVisitDetailsResponseNew.dart';
import '../Utils/commonServices.dart';
......@@ -14,26 +15,79 @@ class Visitdetailsprovider extends ChangeNotifier {
GeneratorDetails _generatorDetails = GeneratorDetails();
ComplaintDetailsNew _complaintDetailsNew = ComplaintDetailsNew();
List<Followuplist> _followupList = [];
List<ComplaintList> _complaintList = [];
bool _isLoading = false;
CustomerDetails get customerDetails => _customerDetails;
GeneratorDetails get generatorDetails => _generatorDetails;
ComplaintDetailsNew get complaintDetailsNew => _complaintDetailsNew;
List<Followuplist> get followUpList => _followupList;
List<ComplaintList> get complaintList => _complaintList;
bool get isLoading => _isLoading;
bool get showMoreDetails => _showMoreDetails;
// ==== FIX FOR THE CRASH ====
bool _disposed = false;
@override
void dispose() {
_disposed = true;
super.dispose();
}
void safeNotifyListeners() {
if (!_disposed) notifyListeners();
}
// ===========================
set showMoreDetails(bool value) {
_showMoreDetails = value;
notifyListeners();
safeNotifyListeners();
}
Future<void> LoadVisitDetailsAPI(BuildContext context, ComplaintID) async {
ServiceComplaintBillListResponse? complaintBillListResponse;
String? error;
Future<void> serviceComplaintBillList(BuildContext context, String complaintId) async {
try {
var HomeProvider = Provider.of<HomescreenNotifier>(
context,
listen: false,
var homeProvider = Provider.of<HomescreenNotifier>(context, listen: false);
_isLoading = true;
safeNotifyListeners();
final data = await ApiCalling.serviceComplaintBillListAPI(
homeProvider.empId,
homeProvider.session,
complaintId,
);
if (data != null) {
if (data.error == 0) {
_complaintList = data.complaintList ?? [];
_isLoading = false;
safeNotifyListeners();
} else {
toast(context, "Something Went Wrong, Please try again!");
}
} else {
toast(context, "No response From the server, Please try Again!");
}
complaintBillListResponse = data;
error = null;
} catch (e) {
error = e.toString();
complaintBillListResponse = null;
} finally {
_isLoading = false;
safeNotifyListeners();
}
}
Future<void> LoadVisitDetailsAPI(BuildContext context, ComplaintID) async {
try {
var HomeProvider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.loadVisitDetailsAPI(
HomeProvider.empId,
HomeProvider.session,
......@@ -42,31 +96,26 @@ class Visitdetailsprovider extends ChangeNotifier {
if (data != null) {
if (data.error == 0) {
// complaintdetails = data.complaintDetails!;
_customerDetails = data.customerDetails!;
_generatorDetails = data.generatorDetails!;
_complaintDetailsNew = data.complaintDetailsNew!;
_isLoading = false;
notifyListeners();
safeNotifyListeners();
} else {
toast(context, "Something Went Wrong, Please try again!");
print("error");
}
} else {
toast(context, "No response From the server, Please try Again!");
print("error2");
}
} on Error catch (e) {
} catch (e) {
print(e.toString());
}
}
Future<void> LoadFollowupListAPI(BuildContext context, ComplaintID) async {
try {
var HomeProvider = Provider.of<HomescreenNotifier>(
context,
listen: false,
);
var HomeProvider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.loadFollowupListAPI(
HomeProvider.empId,
HomeProvider.session,
......@@ -75,20 +124,19 @@ class Visitdetailsprovider extends ChangeNotifier {
if (data != null) {
if (data.error == 0) {
// complaintdetails = data.complaintDetails!;
_followupList = data.list ?? [];
_isLoading = false;
notifyListeners();
safeNotifyListeners();
} else {
toast(context, "Something Went Wrong, Please try again!");
print("error");
}
} else {
toast(context, "No response From the server, Please try Again!");
print("error2");
}
} on Error catch (e) {
} catch (e) {
print(e.toString());
}
}
}
//
//
// import 'package:flutter/cupertino.dart';
// import 'package:generp/Models/ordersModels/commonResponse.dart';
// import 'package:generp/services/api_calling.dart';
//
// class EditCommonAccountProvider extends ChangeNotifier{
// bool isLoading = false;
// String? errorMessage;
// CommonResponse? updateResponse;
//
// Future<void> updateAccountForm() async{
//
// try{
// isLoading = true;
// errorMessage = null;
// notifyListeners();
//
// updateResponse = await ApiCalling.commonUpdateAccountDetailsAPI(
// empId,
// sessionId,
// type,
// name,
// mob1,
// mob2,
// tel,
// email,
// designation,
// address,
// state,
// district,
// subLocality,
// bankName,
// branchName,
// bankIfscCode,
// accHolderName,
// bankAccNumber,
// bankUpiId
// );
//
// if (updateResponse == null){
// errorMessage = "No Response from server";
// }
// }
//
//
// }
//
// }
\ No newline at end of file
......@@ -7,6 +7,8 @@ import '../../Models/commonModels/commonAccountdetailsResponse.dart';
class Accountdetailsprovider extends ChangeNotifier {
bool _showMoreDetails = false;
bool _isLoading = false;
bool get isLoading => _isLoading;
AccountDetails _accountDetails = AccountDetails();
BalanceDetails _balanceDetails = BalanceDetails();
......@@ -27,6 +29,8 @@ class Accountdetailsprovider extends ChangeNotifier {
}
Future<void> accountdetailsAPIFunction(context, accountID) async {
_isLoading = true;
notifyListeners();
try {
var prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.commonAccountDetailsAPI(
......@@ -56,6 +60,8 @@ class Accountdetailsprovider extends ChangeNotifier {
}
}
} catch (e) {}
_isLoading = false;
notifyListeners();
}
Map<String, List<LedgerList>> groupByDate(List<LedgerList> list) {
......
This diff is collapsed.
import 'dart:async';
import 'dart:io';
import 'dart:ui' as ui;
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Utils/SharedpreferencesService.dart';
import 'package:generp/screens/LoginScreen.dart';
import 'package:generp/services/api_calling.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:image_picker/image_picker.dart';
import 'package:geocoding/geocoding.dart' as geocoding;
import 'package:location/location.dart' as Location;
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import '../../Models/NearbyGeneratorsResponse.dart';
import '../../Utils/commonServices.dart';
class CrmNearByGeneratorsProvider extends ChangeNotifier {
final ImagePicker _picker = ImagePicker();
List<Nearbygenerators> _generatorslist = [];
final TextEditingController _locationController = TextEditingController();
final String _googleApikey = "AIzaSyBGzvgMMKwPBAANTwaoRsAnrCpiWCj8wVs";
GoogleMapController? _mapController;
CameraPosition? _cameraPosition;
final LatLng _startLocation = const LatLng(
17.439112226708446,
78.43292499146135,
);
String _latlongs = "";
List<Marker> _markers = [];
List<String> _addresses = [];
Location.LocationData? _currentLocation;
bool _isLocationEnabled = false;
bool _hasLocationPermission = false;
Timer? _timer;
File? _image;
bool _isLoading = true;
String _selectedItem = 'Active';
double _currentValue = 1.0;
Timer? _debounceTimer;
List<Nearbygenerators> get generatorsList => _generatorslist;
TextEditingController get LocationController => _locationController;
String get googleAPIKey => _googleApikey;
GoogleMapController? get mapController => _mapController;
CameraPosition? get cameraPosition => _cameraPosition;
LatLng get startLocation => _startLocation;
String get latlongs => _latlongs;
List<Marker> get markers => _markers;
List<String> get addresses => _addresses;
Location.LocationData? get currentLocation => _currentLocation;
bool get isLocationEnabled => _isLocationEnabled;
bool get hasLocationPermission => _hasLocationPermission;
bool get isLoading => _isLoading;
Timer? get timer => _timer;
File? get image => _image;
String get selectedItem => _selectedItem;
double get currentValue => _currentValue;
set currentValue(value) {
_currentValue = value;
notifyListeners();
}
set selectedItem(String value) {
_selectedItem = value;
notifyListeners();
}
set markers(List<Marker> value) {
_markers = value;
notifyListeners();
}
set mapController(value) {
_mapController = value;
notifyListeners();
}
void resetAll() {
_currentValue = 1.0;
_selectedItem = "";
_markers = [];
_addresses = [];
}
Future<void> getLocationPermission(context) async {
// Check if location services are enabled
_isLocationEnabled = await Geolocator.isLocationServiceEnabled();
// Check if the app has been granted location permission
LocationPermission permission = await Geolocator.checkPermission();
_hasLocationPermission =
permission == LocationPermission.always ||
permission == LocationPermission.whileInUse;
final Location.Location location = Location.Location();
bool serviceEnabled;
Location.PermissionStatus permissionGranted;
serviceEnabled = await location.serviceEnabled();
if (!serviceEnabled) {
serviceEnabled = await location.requestService();
if (!serviceEnabled) {
return;
}
}
_isLoading = false;
permissionGranted = (await location.hasPermission());
if (permissionGranted == PermissionStatus) {
permissionGranted = (await location.requestPermission());
if (permissionGranted != PermissionStatus) {
return;
}
}
final Location.LocationData locData = await location.getLocation();
_currentLocation = locData;
if (_currentLocation != null) {
_mapController?.animateCamera(
CameraUpdate.newLatLng(
LatLng(_currentLocation!.latitude!, _currentLocation!.longitude!),
),
);
final lat = _currentLocation!.latitude;
final lang = _currentLocation!.longitude!;
_latlongs = '$lat,$lang';
LoadNearbyGeneratorsAPI(context, _currentValue);
}
}
void onCameraMove(context, CameraPosition position) {
_timer?.cancel(); // Cancel any previous timer
_timer = Timer(Duration(seconds: 1), () {
getLocationPermission(context);
});
}
void debounce(VoidCallback callback, Duration duration) {
_debounceTimer?.cancel();
_debounceTimer = Timer(duration, callback);
}
Future<void> LoadNearbyGeneratorsAPI(BuildContext context, radius) async {
if (_latlongs.isEmpty || _currentValue <= 0) {
print(
"Invalid parameters: latlongs=$_latlongs, currentValue=$_currentValue",
);
return;
}
try {
var provider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.loadCrmNearbyGeneratorsAPI(
provider.empId,
provider.session,
_latlongs,
_currentValue,
_selectedItem,
);
if (data != null) {
if (data.sessionExists == 1) {
if (data.error == 0) {
_generatorslist = data.list!;
await updateMarkersFromApiResponse(context, data.list!);
_isLoading = false;
notifyListeners();
} else {}
} else {
// SharedpreferencesService().clearPreferences();
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => LoginScreen()),
// );
}
} else {
toast(context, "Something went wrong, Please try again.");
}
} on Exception catch (e) {
print("$e");
}
}
Future<void> updateMarkersFromApiResponse(
BuildContext context,
List<Nearbygenerators> generatorslist,
) async {
_markers = await createMarkersFromApiResponse(context, generatorslist);
_addresses.clear();
await Future.forEach(generatorslist, (store) async {
String address = await _getAddressFromLatLng(store.loc);
_addresses.add(address);
});
notifyListeners();
// for (int i = 0; i < _addresses.length; i++) {
// //print('List of Addresses:' "${addresses[i]}");
// // print('List of Addresses:' "${addresses[1]}" );
// }
}
Future<List<Marker>> createMarkersFromApiResponse(
BuildContext context,
List<Nearbygenerators> generatorslist,
) async {
List<Marker> markers = [];
// print("Hello Nutsby!");
ByteData data = await rootBundle.load("assets/images/dg_set.png");
Uint8List bytes = data.buffer.asUint8List();
await Future.forEach(generatorslist, (generator) async {
ui.Codec codec = await ui.instantiateImageCodec(
bytes,
targetWidth: 75,
targetHeight: 95,
);
ui.FrameInfo fi = await codec.getNextFrame();
Uint8List resizedBytes =
(await fi.image.toByteData(
format: ui.ImageByteFormat.png,
))!.buffer.asUint8List();
markers.add(
Marker(
markerId: MarkerId(generator.generatorId.toString()),
position: _parseLatLng(generator.loc),
icon: BitmapDescriptor.fromBytes(resizedBytes),
infoWindow: InfoWindow(
onTap: () {
print("INFO WINDOW TAP");
},
title: "Customer Name: ${generator.accName}",
snippet: "Product Name: ${generator.productName}",
),
zIndex: 100,
),
);
});
return markers;
}
LatLng _parseLatLng(String? location) {
if (location != null) {
List<String> parts = location.split(',');
if (parts.length == 2) {
double lat = double.tryParse(parts[0]) ?? 0.0;
double lng = double.tryParse(parts[1]) ?? 0.0;
return LatLng(lat, lng);
}
}
return const LatLng(0.0, 0.0);
}
Future<String> _getAddressFromLatLng(String? location) async {
if (location != null) {
List<String> parts = location.split(',');
if (parts.length == 2) {
double lat = double.tryParse(parts[0]) ?? 0.0;
double lng = double.tryParse(parts[1]) ?? 0.0;
List<geocoding.Placemark> placemarks = await geocoding
.placemarkFromCoordinates(lat, lng);
if (placemarks.isNotEmpty) {
final placemark = placemarks.first;
String address =
'${placemark.street ?? ''}, '
'${placemark.thoroughfare ?? ''} '
// '${placemark.subThoroughfare ?? ''}, '
// '${placemark.name ?? ''}, '
'${placemark.subLocality ?? ''}, '
'${placemark.locality ?? ''}, '
'${placemark.administrativeArea ?? ''}, '
'${placemark.subAdministrativeArea ?? ''} '
'${placemark.postalCode ?? ''}, '
'${placemark.country ?? ''}';
return address.trim();
}
}
}
return "Address not found";
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment