import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:generp/Notifiers/HomeScreenNotifier.dart'; import 'package:generp/Utils/app_colors.dart'; import 'package:geolocator/geolocator.dart'; import 'package:geolocator/geolocator.dart' as geo_location; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../../screens/crm/LeadDetailsByMode.dart'; import '../../services/api_calling.dart'; import 'crmLeadDetailsProvider.dart'; class followUpUpdateProvider extends ChangeNotifier { bool _submitLoading = false; TextEditingController nextAppointmentDateController = TextEditingController(); TextEditingController followUpFeedbackController = TextEditingController(); TextEditingController noteController = TextEditingController(); TextEditingController reasonController = TextEditingController(); TimeOfDay _selectedTime = TimeOfDay.now(); String _formattedTime = ""; String? _selectedFollowupType; String? _selectedLeadStatus; String? _nextAppointmentStatus; String? _selectNextAppointmentType; String? _selectOrderStatus; String? _selectedCompetitor; LatLng? currentLocationLatLng; String? latlongs; DateTime? _date; String? _formattedDate; String? _formattedDateToSend; String? _dateError; String? followupError; String? followupFeedbackError; String? leadStatusError; String? appStatusError; String? nextAppDateError; String? nextAppType; String? noteError; String? orderStatusError; String? competitorError; String? reasonError; String? get formattedDateToSend => _formattedDateToSend; bool get submitLoading => _submitLoading; TimeOfDay get selectedTime => _selectedTime; String get formattedTime => _formattedTime; String? get selectedFollowupType => _selectedFollowupType; String? get selectedLeadStatus => _selectedLeadStatus; String? get nextAppointmentStatus => _nextAppointmentStatus; String? get selectNextAppointmentType => _selectNextAppointmentType; String? get selectOrderStatus => _selectOrderStatus; String? get selectedCompetitor => _selectedCompetitor; set submitLoading(bool value){ _submitLoading = value; notifyListeners(); } set selectedFollowupType(String? value) { _selectedFollowupType = value; followupError = null; notifyListeners(); } set selectedLeadStatus(String? value) { _selectedLeadStatus = value; leadStatusError = null; notifyListeners(); } set nextAppointmentStatus(String? value) { _nextAppointmentStatus = value; appStatusError = null; notifyListeners(); } set selectNextAppointmentType(String? value) { _selectNextAppointmentType = value; nextAppType = null; notifyListeners(); } set selectOrderStatus(String? value) { _selectOrderStatus = value; orderStatusError = null; notifyListeners(); } set selectedCompetitor(String? value) { _selectedCompetitor = value; competitorError = null; notifyListeners(); } bool _checked = false; var _smsSent = "0"; bool get checked => _checked; get smsSent => _smsSent; set smsSent(value) { _smsSent = value; notifyListeners(); } set checked(value) { _checked = value; notifyListeners(); } set formattedDate(String? value) { _formattedDate = value; nextAppointmentDateController.text = _formattedDate!; _dateError = null; nextAppDateError = null; notifyListeners(); } set dateError(value) { _dateError = value; nextAppDateError = value; notifyListeners(); } Future getCurrentLocation(context) async { try { Position position = await Geolocator.getCurrentPosition( desiredAccuracy: geo_location.LocationAccuracy.high, ); currentLocationLatLng = LatLng(position.latitude, position.longitude); print("Current Loc: ${currentLocationLatLng}"); latlongs = '${position.latitude},${position.longitude}'; print("latlongs : ${latlongs}"); notifyListeners(); } catch (e) { print("Error getting current location: $e"); } } Future crmAddFollowUpAPIFunction( BuildContext context, fromScreen, nextAppointmentStatus, orderStatus, leadID, followupType, competitor, leadStatus, appointmentType, sms, [mode] ) async { try { if(!valid()){ return; } _submitLoading = true; notifyListeners(); final prov = Provider.of(context, listen: false); final prov2 = Provider.of(context, listen: false); final data = await ApiCalling.crmLeadDetailsAddFollowUpAPI( prov.session, prov.empId, nextAppointmentStatus, orderStatus, leadID, followUpFeedbackController.text, followupType, _selectedTime.hour.toString() + ":" + _selectedTime.minute.toString(), latlongs, competitor, reasonController.text, leadStatus, _formattedDateToSend, appointmentType, sms, noteController.text, ); if (data != null && data.error == "0") { _submitLoading = false; resetForm(); if(fromScreen=="Pending Tasks"){ Navigator.pushAndRemoveUntil( context, MaterialPageRoute( builder: (context) => LeadDetailsByMode(mode: "executive", pageTitleName: "Lead Details", leadId: leadID??"-",), settings: RouteSettings( name: "LeadDetailsByMode" ) ), (Route route) { return route.settings.name == 'CrmdashboardScreen'; }, ); }else{ Navigator.pop(context); } if(mode.isNotEmpty){ prov2.crmLeadDetailsAPIFunction(context, leadID, mode); } notifyListeners(); } else { _submitLoading = false; notifyListeners(); } } catch (e, s) { _submitLoading = false; notifyListeners(); print("Error: $e, Stack: $s"); } } bool valid(){ followupError = null; followupFeedbackError = null; leadStatusError = null; appStatusError = null; nextAppDateError = null; nextAppType = null; noteError = null; orderStatusError = null; competitorError = null; reasonError = null; bool isValid = true; if(_selectedFollowupType==null||_selectedFollowupType==""){ followupError = "Please select Followup Type"; isValid = false; } if(followUpFeedbackController.text.trim().isEmpty){ followupFeedbackError = "Please enter Feedback"; isValid = false; } if(_selectedLeadStatus==null||_selectedLeadStatus==""){ leadStatusError = "Please Select Lead Status"; isValid = false; } if(_nextAppointmentStatus==null||_nextAppointmentStatus==""){ appStatusError = "Please select a value"; isValid = false; } if(nextAppointmentStatus=="Next Appointment"){ if(nextAppointmentDateController.text.trim().isEmpty){ nextAppDateError = "Please Enter Date"; isValid = false; } if(_selectNextAppointmentType==null||_selectNextAppointmentType==""){ nextAppType = "Please select Appointment Type"; isValid = false; } if(noteController.text.trim().isEmpty){ noteError = "Enter Note"; isValid = false; } }else if(nextAppointmentStatus=="Update Order Status"){ if(_selectOrderStatus==null||_selectOrderStatus==""){ orderStatusError = "Please Select Order Status"; isValid = false; } if(selectOrderStatus=="Order Lost"){ if(_selectedCompetitor==null||_selectedCompetitor==""){ competitorError = "Please Select Competitor"; isValid = false; } }else if(selectOrderStatus=="No Requirement"){ if(reasonController.text.trim().isEmpty){ reasonError = "Please Enter reason"; isValid = false; } } } _submitLoading = false; notifyListeners(); return isValid; } void setDate(DateTime newDate) { _date = newDate; // _formattedDate = DateFormat('yyyy-MM-dd').format(newDate); _formattedDate = DateFormat('d MMM yyyy').format(newDate); _formattedDateToSend = DateFormat('yyyy-MM-dd').format(newDate); nextAppointmentDateController.text = _formattedDate!; _dateError = null; notifyListeners(); } Future selectTime(BuildContext context) async { final TimeOfDay? picked = await showTimePicker( context: context, initialTime: _selectedTime, ); if (picked != null && picked != _selectedTime) _selectedTime = picked; _formattedTime = _selectedTime.hour.toString() + ":" + _selectedTime.minute.toString(); notifyListeners(); } String formatTime(int hour, int minute) { String period = (hour >= 12) ? 'pm' : 'am'; if (hour == 0) { hour = 12; } else if (hour > 12) { hour -= 12; } String formattedHour = (hour < 10) ? '0$hour' : '$hour'; String formattedMinute = (minute < 10) ? '0$minute' : '$minute'; print("formattedTime: $formattedHour:$formattedMinute $period"); return '$formattedHour:$formattedMinute $period'; } void showDatePickerDialog(BuildContext context) { showCupertinoModalPopup( context: context, builder: (BuildContext context) => Container( height: 250, padding: const EdgeInsets.only(top: 6.0), margin: EdgeInsets.only( bottom: MediaQuery.of(context).viewInsets.bottom, ), color: CupertinoColors.systemBackground.resolveFrom(context), child: SafeArea( top: false, child: Column( children: [ Expanded( flex: 2, child: SizedBox( height: 40, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ CupertinoButton( child: Text( 'Cancel', style: TextStyle( fontFamily: "JakartaMedium", color: AppColors.app_blue, ), ), onPressed: () { Navigator.pop(context); }, ), CupertinoButton( child: Text( 'Done', style: TextStyle( fontFamily: "JakartaMedium", color: AppColors.app_blue, ), ), onPressed: () { setDate(_date ?? DateTime.now() ); Navigator.pop(context); }, ), ], ), ), ), Expanded( flex: 4, child: CupertinoDatePicker( initialDateTime: _date ?? DateTime.now(), minimumDate: DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day), dateOrder: DatePickerDateOrder.dmy, mode: CupertinoDatePickerMode.date, use24hFormat: true, showDayOfWeek: true, onDateTimeChanged: (DateTime newDate) { setDate(newDate); }, ), ), ], ), ), ), ); } onFollowUpChanged(value) { followupFeedbackError = null; notifyListeners(); } onNoteChanged(value) { noteError = null; notifyListeners(); } onReasonChanged(value) { reasonError = null; notifyListeners(); } void resetForm(){ nextAppointmentDateController.clear(); _formattedDateToSend = null; _formattedDate = null; _date = null; followUpFeedbackController.clear(); noteController.clear(); reasonController.clear(); _selectedFollowupType = null; _selectedLeadStatus = null; _nextAppointmentStatus = null; _selectNextAppointmentType = null; _selectOrderStatus = null; _selectedCompetitor = null; followupError = null; followupFeedbackError = null; leadStatusError = null; appStatusError = null; nextAppDateError = null; nextAppType = null; noteError = null; orderStatusError = null; competitorError = null; reasonError = null; notifyListeners(); } }