"android/git@183.82.99.133:saisrinivas/gen_rentals.git" did not exist on "2d51564f44ed9d5b237336c53a10ce8e7556041d"
Commit b35acfea authored by Sai Srinivas's avatar Sai Srinivas
Browse files

local fix

parents ebb11608 2a087139
......@@ -757,14 +757,17 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
notifyListeners();
}
onChangeCompanyName(value) {
companynameError = "";
// onChangeCompanyName(value) {
// companynameError = "";
// notifyListeners();
// }
onChangeContactPersonName(value) {
nameError = "";
notifyListeners();
}
onChangeAlternatemobile(value) {
AlternatemobileError = "";
notifyListeners();
......@@ -775,22 +778,22 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
notifyListeners();
}
Future<void> onChangeContactPersonName(BuildContext context, String value) async {
nameError = "";
Future<void> onChangeCompanyName(BuildContext context, String value) async {
companynameError = "";
if (value.isEmpty) {
nameError = "Name cannot be empty";
companynameError = "Company Name cannot be empty";
} else if (value.length < 3) {
nameError = "Name must be at least 3 characters";
companynameError = "Company Name must be at least 3 characters";
} else {
final exists = await checkAccountFieldExistence(
context,
type: "name",
type: "company",
typeValue: value,
);
if (!exists) {
nameError = "Name already exists";
companynameError = "Company Name already exists";
} else {
nameError = null;
companynameError = null;
}
}
notifyListeners();
......@@ -997,7 +1000,7 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
isValid = false;
}
if(nameError == "Name already exists"){
if(companynameError == "Company Name already exists"){
isValid = false;
}
......
......@@ -34,16 +34,26 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
List<Teams> get teamsList => _teamsList;
List<Segments> get segmentsList => _segmentsList;
Teams? get selectedTeams => _selectedTeams;
Segments? get selectedSegments => _selectedSegments;
// IMPORTANT: Return null if the selected object is not present in the current list.
// This prevents DropdownButton2 from receiving a value that is not part of items.
Teams? get selectedTeams {
if (_selectedTeams == null) return null;
if (!_teamsList.contains(_selectedTeams)) return null;
return _selectedTeams;
}
Segments? get selectedSegments {
if (_selectedSegments == null) return null;
if (!_segmentsList.contains(_selectedSegments)) return null;
return _selectedSegments;
}
AccountDetails get accountsDetails => _accountDetails;
String? get selectedTeamId => _selectedTeamId;
String? get selectedTeamValue => _selectedTeamValue;
String? get selectedSegmentId => _selectedSegmentId;
String? get selectedSegmentValue => _selectedSegmentValue;
set isLoading(bool value) {
......@@ -68,15 +78,25 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
set selectedTeams(Teams? value) {
_selectedTeams = value;
_selectedTeamId = value!.id!;
if (value != null) {
_selectedTeamId = value.id;
_selectedTeamValue = value.name;
} else {
_selectedTeamId = null;
_selectedTeamValue = null;
}
notifyListeners();
}
set selectedSegments(Segments? value) {
_selectedSegments = value;
_selectedSegmentId = value!.id!;
if (value != null) {
_selectedSegmentId = value.id;
_selectedSegmentValue = value.name;
} else {
_selectedSegmentId = null;
_selectedSegmentValue = null;
}
notifyListeners();
}
......@@ -117,8 +137,21 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
notifyListeners();
if (data != null) {
if (data.error == "0") {
_teamsList = data.teams!;
_accountDetails = data.accountDetails!;
_teamsList = data.teams ?? [];
_accountDetails = data.accountDetails ?? AccountDetails();
// If current selected team/segment are not in the new lists, clear them
if (_selectedTeams != null && !_teamsList.contains(_selectedTeams)) {
_selectedTeams = null;
_selectedTeamId = null;
_selectedTeamValue = null;
}
if (_selectedSegments != null && !_segmentsList.contains(_selectedSegments)) {
_selectedSegments = null;
_selectedSegmentId = null;
_selectedSegmentValue = null;
}
_isLoading = false;
notifyListeners();
} else {
......@@ -149,13 +182,29 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
);
if (data != null) {
if (data.error == "0") {
_segmentsList = data.segments!;
_segmentsList = data.segments ?? [];
// clear selectedSegments if it's not part of new list
if (_selectedSegments != null && !_segmentsList.contains(_selectedSegments)) {
_selectedSegments = null;
_selectedSegmentId = null;
_selectedSegmentValue = null;
}
notifyListeners();
}
}
} catch (e) {}
}
// Fixed: check string emptiness properly (IDs are strings in your model)
bool get isFormValid {
final nameOk = editCompanyNameController.text.trim().isNotEmpty;
final teamOk = _selectedTeamId != null && _selectedTeamId!.isNotEmpty;
final segmentOk = _selectedSegmentId != null && _selectedSegmentId!.isNotEmpty;
return nameOk && teamOk && segmentOk;
}
Future<void> crmLeadDetailsEditAccountSubmitAPIFunction(
context,
accountId,
......@@ -166,6 +215,10 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
if (!validateForm(context)) {
return;
}
_isLoading = true;
notifyListeners();
var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmLeadDetailsEditAccountSubmitAPI(
HomeProv.empId,
......@@ -175,8 +228,7 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
teamId,
editCompanyNameController.text,
);
_isLoading = true;
notifyListeners();
if (data != null) {
if (data.error == "0") {
Navigator.pop(context, true);
......@@ -200,19 +252,24 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
bool validateForm(BuildContext context) {
// Reset all errors
_companyNameError = null;
_selectedTeamError = null;
_selectedSegmentError = null;
bool isValid = true;
if (_selectedTeams == null || _selectedTeamId!.isEmpty) {
_selectedTeamError = "Please select an account";
// Team checks
if (_selectedTeams == null || _selectedTeamId == null || _selectedTeamId!.isEmpty) {
_selectedTeamError = "Please select a team";
isValid = false;
}
if (_selectedSegments == null || _selectedSegmentId!.isEmpty) {
_selectedSegmentError = "Please select an account";
// Segment checks
if (_selectedSegments == null || _selectedSegmentId == null || _selectedSegmentId!.isEmpty) {
_selectedSegmentError = "Please select a segment";
isValid = false;
}
// Company name check
if (editCompanyNameController.text.trim().isEmpty) {
_companyNameError = "Please enter Company name";
isValid = false;
......@@ -223,7 +280,12 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
}
onChangedCompanyName(value) {
_companyNameError = "";
// Clear the company name error when user types
if (value != null && value.toString().trim().isNotEmpty) {
_companyNameError = null;
} else {
_companyNameError = "Name is required";
}
notifyListeners();
}
......@@ -236,11 +298,13 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
_selectedSegmentId = null;
_selectedTeamValue = null;
_selectedSegmentValue = null;
_selectedTeamError = null;
_selectedSegmentError = null;
_companyNameError = null;
}
void checkDropDownValues() {
if (!_segmentsList.contains(_selectedSegments) &&
_selectedSegments != null) {
if (!_segmentsList.contains(_selectedSegments) && _selectedSegments != null) {
_selectedTeamId = null;
_selectedTeamValue = null;
}
......
......@@ -302,27 +302,45 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
} catch (e) {}
}
preValues() {
preValues() {// safeNormalizeAmount()
print("here 212ssass1");
requestedAmount.text = _requestDetails.requestedAmount ?? "-";
requestedAmount.text = safeNormalizeAmount(_requestDetails.requestedAmount);
proposedPaymentAccount.text = _requestDetails.proposedAccount ?? "-";
approvedAmountReadonly.text = _requestDetails.formattedAmount ?? "-";
approvedAmount.text = _requestDetails.amount ?? "-";
accountName.text = _requestDetails.accountName ?? "-";
branch.text = _requestDetails.branch ?? "-";
requestingPurpose.text = _requestDetails.requestingPurpose ?? "-";
description.text = _requestDetails.description ?? "-";
amount.text = _requestDetails.amount ?? "-";
paymentMode.text = _requestDetails.requestMode ?? "-";
bankUpiID.text = _requestDetails.bankUpiId ?? "-";
bankName.text = _requestDetails.bankName ?? "-";
bankBranchName.text = _requestDetails.bankBranchname ?? "-";
bankAccountNumber.text = _requestDetails.bankAccountNumber ?? "-";
bankIfscCode.text = _requestDetails.bankIfscCode ?? "-";
bankHolderName.text = _requestDetails.bankAccountHolderName ?? "-";
approvedAmountReadonly.text = safeNormalizeAmount(_requestDetails.amount);
approvedAmount.text = safeNormalizeAmount(_requestDetails.amount);
accountName.text = _requestDetails.accountName ?? "";
branch.text = _requestDetails.branch ?? "";
requestingPurpose.text = _requestDetails.requestingPurpose ?? "";
description.text = _requestDetails.description ?? "";
amount.text = safeNormalizeAmount(_requestDetails.amount);
paymentMode.text = _requestDetails.requestMode ?? "";
bankUpiID.text = _requestDetails.bankUpiId ?? "";
bankName.text = _requestDetails.bankName ?? "";
bankBranchName.text = _requestDetails.bankBranchname ?? "";
bankAccountNumber.text = _requestDetails.bankAccountNumber ?? "";
bankIfscCode.text = _requestDetails.bankIfscCode ?? "";
bankHolderName.text = _requestDetails.bankAccountHolderName ?? "";
notifyListeners();
}
String safeNormalizeAmount(String? input) {
if (input == null || input.trim().isEmpty) return "0";
// Remove currency symbols, commas and spaces - keep digits and dots
String cleaned = input.replaceAll(RegExp(r'[^0-9.]'), '');
// Handle multiple decimal points: keep only first dot
int firstDot = cleaned.indexOf('.');
if (firstDot != -1) {
String before = cleaned.substring(0, firstDot + 1);
String after = cleaned.substring(firstDot + 1).replaceAll('.', '');
cleaned = before + after;
}
return cleaned.isEmpty ? "0" : cleaned;
}
Future<void> approveRejectPaymentRequestAPIFunction(
context,
paymentRequestId,
......@@ -363,31 +381,31 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
paymentRequestId,
approveRemarks,
) async {
print("🎯 === REJECT PROVIDER METHOD STARTED ===");
print(" === REJECT PROVIDER METHOD STARTED ===");
// Set loading to true at the start
_isLoading = true;
notifyListeners();
print("🔄 Loading set to TRUE in reject method");
print(" Loading set to TRUE in reject method");
bool success = false;
try {
print("🔍 Starting validation for rejection...");
print(" Starting validation for rejection...");
if (approveRemarks.toString().trim().isEmpty) {
print(" Remarks validation failed");
remarksError = "Please Enter Remarks";
_isLoading = false;
notifyListeners();
return false;
}
// if (approveRemarks.toString().trim().isEmpty) {
// print(" Remarks validation failed");
// remarksError = "Please Enter Remarks";
// _isLoading = false;
// notifyListeners();
// return false;
// }
print(" Validation passed");
print(" Validation passed");
var provider = Provider.of<HomescreenNotifier>(context, listen: false);
print("🌐 Calling reject API...");
print(" Calling reject API...");
final data = await ApiCalling.RejectPaymentRequestSubmitAPI(
provider.empId,
provider.session,
......@@ -395,36 +413,36 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
paymentRequestId,
approveRemarks,
);
print("🌐 Reject API call completed");
print(" Reject API call completed");
if (data != null) {
print("📡 Reject API Response: error=${data.error}, message=${data.message}");
print(" Reject API Response: error=${data.error}, message=${data.message}");
if (data.error == "0") {
print(" Reject API SUCCESS");
print(" Reject API SUCCESS");
success = true;
if (context.mounted) {
print("🎯 Context mounted - performing UI operations");
print(" Context mounted - performing UI operations");
paymentRequesitionDetails(context, paymentRequestId);
resetAll();
toast(context, data.message);
Navigator.pop(context, true); // Pass true to indicate success
}
} else {
print(" Reject API returned error: ${data.message}");
print(" Reject API returned error: ${data.message}");
if (context.mounted) {
toast(context, data.message ?? "Rejection failed");
}
}
} else {
print(" NULL response from reject API");
print(" NULL response from reject API");
if (context.mounted) {
toast(context, "No response from server");
}
}
} catch (e) {
print("💥 EXCEPTION in reject provider method: $e");
print(" EXCEPTION in reject provider method: $e");
if (context.mounted) {
toast(context, "Error: ${e.toString()}");
}
......@@ -433,10 +451,10 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
_isLoading = false;
notifyListeners();
print("🔄 Loading set to FALSE in reject method finally block");
print(" Loading set to FALSE in reject method finally block");
}
print("🎯 === REJECT PROVIDER METHOD COMPLETED ===");
print(" === REJECT PROVIDER METHOD COMPLETED ===");
return success;
}
......@@ -457,27 +475,27 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
String approve_remarks,
String proposed_payment_account_id,
) async {
print("🎯 === PROVIDER METHOD STARTED ===");
print(" === PROVIDER METHOD STARTED ===");
// Set loading to true at the start
_isLoading = true;
notifyListeners();
try {
print("🔍 Starting validation...");
print(" Starting validation...");
if (!validateApproval(approved_amount, approve_remarks, proposed_payment_account_id)) {
print(" VALIDATION FAILED - Stopping execution");
print(" VALIDATION FAILED - Stopping execution");
_isLoading = false;
notifyListeners();
return;
}
print(" Validation passed");
print(" Validation passed");
print("👤 Getting home provider...");
print(" Getting home provider...");
var homeProvider = Provider.of<HomescreenNotifier>(context, listen: false);
print("👤 Emp ID: ${homeProvider.empId}, Session: ${homeProvider.session}");
print(" Emp ID: ${homeProvider.empId}, Session: ${homeProvider.session}");
print("🌐 Calling API...");
print(" Calling API...");
final data = await ApiCalling.ApprovePaymentRequestSubmitAPI(
homeProvider.empId,
homeProvider.session,
......@@ -487,43 +505,43 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
approve_remarks,
proposed_payment_account_id,
);
print("🌐 API call completed");
print(" API call completed");
if (data != null) {
print("📡 API Response: error=${data.error}, message=${data.message}");
print(" API Response: error=${data.error}, message=${data.message}");
if (data.error == "0") {
print(" API SUCCESS - Processing...");
print(" API SUCCESS - Processing...");
// Check if context is still valid before UI operations
if (context.mounted) {
print("🎯 Context mounted - performing UI operations");
print(" Context mounted - performing UI operations");
paymentRequesitionDetails(context, payment_request_id);
resetAll();
toast(context, data.message);
Navigator.pop(context, true);
print(" UI operations completed");
print(" UI operations completed");
} else {
print("️ Context not mounted - skipping UI operations");
print("️ Context not mounted - skipping UI operations");
}
notifyListeners();
print(" Notify listeners called");
print(" Notify listeners called");
} else {
print(" API returned error: ${data.message}");
print(" API returned error: ${data.message}");
if (context.mounted) {
toast(context, data.message ?? "Submission failed");
}
}
} else {
print(" NULL response from API");
print(" NULL response from API");
if (context.mounted) {
toast(context, "No response from server");
}
}
} catch (e, s) {
print("💥 EXCEPTION in provider method: $e");
print("📋 Stack trace: $s");
print(" EXCEPTION in provider method: $e");
print(" Stack trace: $s");
// Show error to user
if (context.mounted) {
toast(context, "Error: ${e.toString()}");
......@@ -532,10 +550,10 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
// Set loading to false when everything is done (success or error)
_isLoading = false;
notifyListeners();
print("🔄 Loading state set to false");
print(" Loading state set to false");
}
print("🎯 === PROVIDER METHOD COMPLETED ===");
print(" === PROVIDER METHOD COMPLETED ===");
}
......@@ -640,11 +658,11 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
}
bool validateApproval(
String approvedAmount, // Add type for clarity
String approveRemarks, // Add type for clarity
String proposedPaymentAccountId, // Add type for clarity
String approvedAmount, //
String approveRemarks, //
String proposedPaymentAccountId, //
) {
print("🔍 === VALIDATION STARTED ===");
print(" === VALIDATION STARTED ===");
print(" Approved Amount: '$approvedAmount'");
print(" Requested Amount: '${requestedAmount.text}'");
print(" Remarks: '$approveRemarks'");
......@@ -664,11 +682,11 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
}
// Fix 2: Use the String parameter directly (no .text)
if (approveRemarks.trim().isEmpty) {
remarksError = "Please Enter Remarks";
isValid = false;
print("❌ Remarks are empty");
}
// if (approveRemarks.trim().isEmpty) {
// remarksError = "Please Enter Remarks";
// isValid = false;
// print("❌ Remarks are empty");
// }
// Fix 3: Parse the String parameters, not .text
if (approvedAmount.trim().isNotEmpty && requestedAmount.text.trim().isNotEmpty) {
......@@ -677,35 +695,35 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
double approved = numberFormat.parse(approvedAmount.trim()).toDouble();
double requested = numberFormat.parse(requestedAmount.text.trim()).toDouble();
print("💰 Amount Comparison: Approved: $approved, Requested: $requested");
print(" Amount Comparison: Approved: $approved, Requested: $requested");
if (approved > requested) {
ApprovedAmountError = "Approved Amount should not be greater than requested amount";
isValid = false;
print(" Approved amount exceeds requested amount");
print(" Approved amount exceeds requested amount");
}
} catch (e) {
print("💥 Error parsing amounts: $e");
print(" Error parsing amounts: $e");
ApprovedAmountError = "Invalid amount format";
isValid = false;
}
}
// Fix 4: Use the parameter OR check both for consistency
if (proposedPaymentAccountId.isEmpty && _selectedID.isEmpty) {
selectpaymentAccountError = "Please select an account";
isValid = false;
print(" No payment account selected");
} else if (proposedPaymentAccountId.isNotEmpty && _selectedID.isEmpty) {
// If parameter has value but _selectedID doesn't, sync them
_selectedID = proposedPaymentAccountId;
print("🔄 Synced selected ID from parameter: $_selectedID");
}
// if (proposedPaymentAccountId.isEmpty && _selectedID.isEmpty) {
// selectpaymentAccountError = "Please select an account";
// isValid = false;
// // print(" No payment account selected");
// } else if (proposedPaymentAccountId.isNotEmpty && _selectedID.isEmpty) {
// // If parameter has value but _selectedID doesn't, sync them
// _selectedID = proposedPaymentAccountId;
// // print(" Synced selected ID from parameter: $_selectedID");
// }
_submitClicked = false;
notifyListeners();
print("🔍 === VALIDATION RESULT: $isValid ===");
// print(" === VALIDATION RESULT: $isValid ===");
return isValid;
}
......@@ -779,6 +797,12 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
notifyListeners();
}
resetRequired() {
remarksError = null;
selectpaymentAccountError = null;
notifyListeners();
}
onChangeApprov(value) {
final numberFormat = NumberFormat.decimalPattern();
if (numberFormat.parse(approvedAmount.text) >
......
......@@ -184,6 +184,12 @@ class Loginnotifier extends ChangeNotifier {
SharedpreferencesService().saveString("UserName", data.name!);
SharedpreferencesService().saveString("UserEmail", data.emailId!);
SharedpreferencesService().saveString("Session_id", data.sessionId!);
SharedpreferencesService().saveString("user", data.userId!);
SharedpreferencesService().saveString("session", data.sessionId!);
print("USER ID : ${data.userId}");
print("SESSISON ID: ${data.sessionId}");
var roles = data.permissions!.toString();
SharedpreferencesService().saveString("roles", roles);
......
This diff is collapsed.
......@@ -10,6 +10,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_ringtone_player/flutter_ringtone_player.dart';
import 'package:generp/Models/hrmModels/leaveApplicationLIstResponse.dart';
import 'package:generp/Notifiers/QrProvider.dart';
import 'package:generp/Utils/app_colors.dart';
import 'package:generp/screens/AttendanceScreen.dart';
import 'package:generp/screens/HomeScreen.dart';
......@@ -426,7 +427,9 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => AdvanceListProvider()),
ChangeNotifierProvider(create: (_) => CasualLeaveHistoryProvider()),
ChangeNotifierProvider(create: (_) => ContactProvider()),
ChangeNotifierProvider(create: (_) => QrProvider()),
ChangeNotifierProvider(create: (_) => CrmNearByGeneratorsProvider()),
ChangeNotifierProvider(create: (_) => EditCommonAccountProvider()),
],
child: Builder(
builder: (BuildContext context) {
......
......@@ -117,7 +117,17 @@ class _AccountslistState extends State<Accountslist> {
return (connection == "Online")
? Platform.isAndroid
? WillPopScope(
onWillPop: () => onBackPressed(context),
onWillPop: () async {
onBackPressed(context);
_refreshList(context);
final provider = Provider.of<Accountslistprovider>(context, listen: false);
provider.resetValues();
provider.commonAccountListAPIFunction(context);
// Return true or false depending on whether you want to allow the pop
return true; // allow the back navigation
// return false; // prevent back navigation
},
child: SafeArea(
top: false,
bottom: true,
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -103,7 +103,7 @@ class _TransactiondetailsState extends State<Transactiondetails> {
),
),
),
SizedBox(width: 10),
SizedBox(width: 8),
Expanded(
flex: 3,
child: Container(
......@@ -117,15 +117,15 @@ class _TransactiondetailsState extends State<Transactiondetails> {
),
child: Center(
child: Text(
"₹ ${details.amount ?? "-"}",
" ${details.amount ?? "-"}",
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontFamily: "JakartaRegular",
fontSize: 14,
fontSize: 12.8,
color:
widget.type == "Credited"
widget.type == "Credit"
? Color(0xFFEF3739)
: Color(0xFF0D9C00),
),
......@@ -359,6 +359,7 @@ class _TransactiondetailsState extends State<Transactiondetails> {
details
.attachmentDirFilePath ??
"",
downloadEnable: false,
),
),
);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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