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

30-07-2025 By Sai Srinivas

CRM Module
parent 56ca3566
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" id="close">
<path fill="none" d="M0 0h24v24H0V0z"></path>
<path d="M18.3 5.71c-.39-.39-1.02-.39-1.41 0L12 10.59 7.11 5.7c-.39-.39-1.02-.39-1.41 0-.39.39-.39 1.02 0 1.41L10.59 12 5.7 16.89c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0L12 13.41l4.89 4.89c.39.39 1.02.39 1.41 0 .39-.39.39-1.02 0-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z"></path>
</svg>
\ No newline at end of file
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="20" cy="20" r="20" fill="white"/>
<path d="M26.4376 15.7071C26.8281 15.3166 26.8281 14.6834 26.4376 14.2929C26.0471 13.9024 25.4139 13.9024 25.0234 14.2929L25.7305 15L26.4376 15.7071ZM13 26.7305C13 27.2828 13.4477 27.7305 14 27.7305L23 27.7305C23.5523 27.7305 24 27.2828 24 26.7305C24 26.1782 23.5523 25.7305 23 25.7305L15 25.7305L15 17.7305C15 17.1782 14.5523 16.7305 14 16.7305C13.4477 16.7305 13 17.1782 13 17.7305L13 26.7305ZM25.7305 15L25.0234 14.2929L13.2929 26.0234L14 26.7305L14.7071 27.4376L26.4376 15.7071L25.7305 15Z" fill="#4CAF50"/>
</svg>
......@@ -354,6 +354,7 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
set productRows(value) {
_productRows = value;
productsEmptyError = "";
notifyListeners();
}
......@@ -369,6 +370,7 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
String? TelephoneError = "";
String? mobileError = "";
String? addressError = "";
String? productsEmptyError = "";
String? designationError = "";
String? taxesError = "";
String? SpecialNoteError = "";
......@@ -764,6 +766,7 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
districtsError = "";
subLocError = "";
leadStatusError = "";
productsEmptyError = "";
notifyListeners();
}
......@@ -836,7 +839,13 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
if(mobileController.text.trim().isEmpty){
mobileError = "Please enter Mobile Number";
isValid = false;
}else{
if(mobileController.text.length<10){
mobileError = "Please enter 10 digits";
isValid = false;
}
}
// if(designationController.text.trim().isEmpty){
// designationError = "Please enter Designation";
// isValid = false;
......@@ -849,11 +858,11 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
bool validateStep2(){
bool isValid = true;
// if(alternateMobileController.text.trim().isEmpty){
// AlternatemobileError = "";
// isValid = false;
//
// }
if(alternateMobileController.text.trim().isNotEmpty && alternateMobileController.text.length<10){
AlternatemobileError = "Please enter 10 digits";
isValid = false;
}
// if(telephoneController.text.trim().isEmpty){
// isValid = false;
//
......@@ -902,6 +911,10 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
addressError = "Please Enter address";
isValid = false;
}
if(productRows.isEmpty || _productRows.isEmpty){
productsEmptyError = "Please Add min. one Product";
isValid = false;
}
notifyListeners();
return isValid;
}
......
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
......@@ -8,6 +9,7 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:generp/Models/crmModels/crmLeadDetailsGenerateQuotationViewResponse.dart';
import 'package:generp/Models/crmModels/crmSelectedProductDetailsResponse.dart';
import 'package:generp/screens/LoginScreen.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart';
import 'package:path_provider/path_provider.dart';
......@@ -25,6 +27,7 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
final GlobalKey webViewKey = GlobalKey();
var dl = DownloadManager();
bool _buttonsLoading = false;
ProductsData? _selectedProductsDeatilsData;
TextEditingController addEditProductPriceController = TextEditingController();
TextEditingController addEditQuantityController = TextEditingController();
......@@ -40,8 +43,16 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
List<Map<String, dynamic>> get productRows => _productRows;
bool get buttonsLoading => _buttonsLoading;
set buttonsLoading(bool value){
_buttonsLoading = value;
notifyListeners();
}
set productRows(value) {
_productRows = value;
productRowsError = "";
notifyListeners();
}
......@@ -50,6 +61,7 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
String? mailIdError = "";
String? mobileError = "";
String? subjectsError = "";
String? productRowsError = "";
String? taxesError = "";
String? SpecialNoteError = "";
String? forError = "";
......@@ -98,6 +110,7 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
set selectedTaxes(String? value){
_selectedTaxes = value;
taxesError = "";
notifyListeners();
}
......@@ -170,7 +183,7 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
if (index >= 0 && index < leadProductsList.length) {
leadProductsList[index] = updatedProduct;
_productRows[index] = {
"product_id": updatedProduct.productId!,
"product_id": updatedProduct.productId,
"price": updatedProduct.price,
"qty": updatedProduct.qty,
"net_price": updatedProduct.prodTotalPrice,
......@@ -190,11 +203,18 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
notifyListeners();
}
void preFillFormForEdit(LeadProducts product) {
checkDropdownReset();
selectedLeadProducts = product;
selectedAddEditLeadProductId = product.id;
selectedAddEditLeadProductName = product.productName;
void preFillFormForEdit(LeadProducts product,int index) {
final newprod = product;
selectedProducts = productsList.firstWhere(
(p) => p.id == newprod.productId,
orElse: () => Products(id: '', name: 'Unknown'),
);
// selectedLeadProducts = product;
selectedAddEditProductId = product.productId;
selectedAddEditProductName = product.productName;
addEditProductPriceController.text = product.price?.toString() ?? '';
addEditQuantityController.text = product.qty?.toString() ?? '';
addEditTotalAmountController.text =
......@@ -382,6 +402,11 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
quotation_type,
) async {
try {
if(!validateform()){
return;
}
_buttonsLoading = true;
notifyListeners();
final prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmLeadDetailsGenerateQuotationSubmitAPI(
prov.empId,
......@@ -399,6 +424,7 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
);
if (data != null) {
if (data.error == "0") {
_buttonsLoading = false;
_quotationFilePath = data.quoteFilepath!;
if (quotation_type == "genquotedown") {
String suggestedFilename = getUniqueFilename('quotation', 'pdf');
......@@ -419,9 +445,17 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
toast(context, data.message);
resetForm();
notifyListeners();
} else {}
} else {}
} else {
_buttonsLoading = false;
notifyListeners();
}
} else {
_buttonsLoading = false;
notifyListeners();
}
} catch (e, s) {
_buttonsLoading = false;
notifyListeners();
print("Error: $e, Stack: $s");
}
}
......@@ -621,6 +655,50 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
notifyListeners();
}
bool validateform(){
bool isValid = true;
if(mailIdController.text.trim().isEmpty){
mailIdError = "Please Enter Email ID";
isValid = false;
}
if(mobileController.text.trim().isEmpty){
mobileError = "Please Enter Mobile Number";
isValid = false;
}else{
if(mobileController.text.length<10){
mobileError = "Mobile Number should be 10 digits";
isValid = false;
}
}
if(subjectsController.text.isEmpty){
subjectsError = "Please Enter Subject";
isValid = false;
}
if(productRows.isEmpty||_productRows.isEmpty){
productRowsError = "Please Add Min. 1 Product";
isValid = false;
}
if(_selectedTaxes==null||_selectedTaxes==""){
taxesError = "Please select a value";
isValid = false;
}
if(SpecialNoteController.text.trim().isEmpty){
SpecialNoteError = "Please Enter a Note";
isValid = false;
}
if(forController.text.trim().isEmpty){
forError = "Please Enter FOR";
isValid = false;
}
if(paymentTermsController.text.trim().isEmpty){
paymentTermsError = "Please Enter Terms";
isValid = false;
}
_buttonsLoading = false;
notifyListeners();
return isValid;
}
void resetForm() {
checkDropdownReset();
_productRows.clear();
......@@ -669,6 +747,7 @@ class Crmgeneratequotationprovider extends ChangeNotifier {
mailIdError = "";
mobileError = "";
subjectsError = "";
productRowsError = "";
taxesError = "";
SpecialNoteError = "";
forError = "";
......
......@@ -9,8 +9,6 @@ import '../../services/api_calling.dart';
import '../HomeScreenNotifier.dart';
class crmProspectDetailsProvider extends ChangeNotifier {
List<Leads> _leadsList = [];
List<Contacts> _contactsList = [];
List<Orders> _ordersList = [];
......@@ -32,7 +30,8 @@ class crmProspectDetailsProvider extends ChangeNotifier {
TextEditingController editNameController = TextEditingController();
TextEditingController editDesignationController = TextEditingController();
TextEditingController editMobileNumberController = TextEditingController();
TextEditingController editAlternativeMobileController = TextEditingController();
TextEditingController editAlternativeMobileController =
TextEditingController();
TextEditingController editTelephoneController = TextEditingController();
TextEditingController editEmailController = TextEditingController();
TextEditingController dateController = TextEditingController();
......@@ -59,103 +58,131 @@ class crmProspectDetailsProvider extends ChangeNotifier {
List<String> _subHeadings = [];
DateTime? _date;
String? _formattedDate;
String? _formattedDateToSend;
String? get formattedDateToSend => _formattedDateToSend;
bool get showMoreDetails => _showMoreDetails;
get showTransferAccount => _transferAccount;
List<Leads> get leadList => _leadsList;
List<Contacts> get contactList => _contactsList;
List<Orders> get ordersList => _ordersList;
List<Payments> get paymentsList => _paymentsList;
AccountDetails get accountDetails => _accountDetails;
String? get nameError => _nameError;
String? get designationError => _designationError;
String? get mobileNumError => _mobileNumError;
String? get altMobError => _altMobError;
String? get teleError => _teleError;
String? get emailError => _emailError;
String? get noteError => _noteError;
String? get editNameError => _editNameError;
String? get editDesignationError => _editDesignationError;
String? get editMobileNumError => _editMobileNumError;
String? get editAltMobError => _editAltMobError;
String? get editTeleError => _editTeleError;
String? get editEmailError => _editEmailError;
String? get dateError => _dateError;
bool get isLoading => _isLoading;
List<String> get Headings => _headings;
List<String> get subHeadings => _subHeadings;
String? get formattedDate => _formattedDate;
set showMoreDetails(bool value){
set showMoreDetails(bool value) {
_showMoreDetails = value;
notifyListeners();
}
set nameError(String? value){
set nameError(String? value) {
_nameError = value;
notifyListeners();
}
set designationError(String? value){
set designationError(String? value) {
_designationError = value;
notifyListeners();
}
set mobileNumError(String? value){
set mobileNumError(String? value) {
_mobileNumError = value;
notifyListeners();
}
set altMobError(String? value){
set altMobError(String? value) {
_altMobError = value;
notifyListeners();
}
set teleError(String? value){
set teleError(String? value) {
_teleError = value;
notifyListeners();
}
set emailError(String? value){
set emailError(String? value) {
_emailError = value;
notifyListeners();
}
set noteError(String? value){
set noteError(String? value) {
_noteError = value;
notifyListeners();
}
set editNameError(String? value){
set editNameError(String? value) {
_editNameError = value;
notifyListeners();
}
set editDesignationError(String? value){
set editDesignationError(String? value) {
_editDesignationError = value;
notifyListeners();
}
set editMobileNumError(String? value){
set editMobileNumError(String? value) {
_editMobileNumError = value;
notifyListeners();
}
set editAltMobError(String? value){
set editAltMobError(String? value) {
_editAltMobError = value;
notifyListeners();
}
set editTeleError(String? value){
set editTeleError(String? value) {
_editTeleError = value;
notifyListeners();
}
set editEmailError(String? value){
set editEmailError(String? value) {
_editEmailError = value;
notifyListeners();
}
set isLoading(bool value){
set isLoading(bool value) {
_isLoading = value;
notifyListeners();
}
......@@ -167,14 +194,15 @@ class crmProspectDetailsProvider extends ChangeNotifier {
notifyListeners();
}
set dateError(value){
set dateError(value) {
_dateError = value;
notifyListeners();
}
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);
dateController.text = _formattedDate!;
_dateError = null;
notifyListeners();
......@@ -194,7 +222,7 @@ class crmProspectDetailsProvider extends ChangeNotifier {
if (data.error == "0") {
_leadsList = data.leads!;
_accountDetails = data.accountDetails!;
_contactsList =data.contacts!;
_contactsList = data.contacts!;
_ordersList = data.orders!;
_paymentsList = data.payments!;
_headings = [
......@@ -217,31 +245,31 @@ class crmProspectDetailsProvider extends ChangeNotifier {
];
_transferAccount = data.showTransfeLeadButton;
_subHeadings = [
data.accountDetails!.name??"-",
data.accountDetails!.name ?? "-",
data.accountDetails!.accManager??"-",
data.accountDetails!.owner??"-",
data.accountDetails!.accManager ?? "-",
data.accountDetails!.owner ?? "-",
data.accountDetails!.address??"-",
data.accountDetails!.state??"-",
data.accountDetails!.district??"-",
data.accountDetails!.subLocality??"-",
data.accountDetails!.pincode??"-",
data.accountDetails!.address ?? "-",
data.accountDetails!.state ?? "-",
data.accountDetails!.district ?? "-",
data.accountDetails!.subLocality ?? "-",
data.accountDetails!.pincode ?? "-",
data.accountDetails!.source??"-",
data.accountDetails!.reference??"-",
data.accountDetails!.team??"-",
data.accountDetails!.segment??"-",
data.accountDetails!.source ?? "-",
data.accountDetails!.reference ?? "-",
data.accountDetails!.team ?? "-",
data.accountDetails!.segment ?? "-",
"${data.accountDetails!.aage ?? "-"} days old",
];
_isLoading = false;
notifyListeners();
}else{
} else {
_isLoading = false;
notifyListeners();
}
}else{
} else {
_isLoading = false;
notifyListeners();
}
......@@ -251,12 +279,15 @@ class crmProspectDetailsProvider extends ChangeNotifier {
}
}
Future<void> crmCheckFields(context,value,type) async {
Future<void> crmCheckFields(context, value, type) async {
try {
var prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmCheckAccountFieldsApi(prov.empId, prov.session,value,type);
final data = await ApiCalling.crmCheckAccountFieldsApi(
prov.empId,
prov.session,
value,
type,
);
if (data != null) {
if (data.error == "0") {
......@@ -264,43 +295,55 @@ class crmProspectDetailsProvider extends ChangeNotifier {
mobileNumError = null;
altMobError = null;
notifyListeners();
}else if(data.error=="1"){
if(type=="name"){
} else if (data.error == "1") {
if (type == "name") {
nameError = data.message!;
}else if(type == 'mob1'){
} else if (type == 'mob1') {
mobileNumError = data.message!;
}else if(type == 'mob2'){
} else if (type == 'mob2') {
altMobError = data.message!;
}
notifyListeners();
}
}else{
} else {
notifyListeners();
}
} catch (e, s) {
notifyListeners();
}
}
Future<void> crmProspectDetailsAddContactAPIFunction(context, accID) async {
try {
var prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmProspectDetailsAddAccountAPI(prov.empId, prov.session, accID,
nameController.text, mobileNumberController.text, designationController.text, alternativeMobileController.text, telephoneController.text, emailController.text);
if (!AddContactValidation()) {
return;
}
_isLoading = true;
notifyListeners();
var prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmProspectDetailsAddAccountAPI(
prov.empId,
prov.session,
nameController.text,
accID,
mobileNumberController.text,
designationController.text,
alternativeMobileController.text,
telephoneController.text,
emailController.text,
);
if (data != null) {
if (data.error == "0") {
Navigator.pop(context,true);
Navigator.pop(context, true);
resetAll();
_isLoading = false;
notifyListeners();
}else{
} else {
_isLoading = false;
notifyListeners();
}
}else{
} else {
_isLoading = false;
notifyListeners();
}
......@@ -310,25 +353,43 @@ class crmProspectDetailsProvider extends ChangeNotifier {
}
}
Future<void> crmProspectDetailsEditContactAPIFunction(context,contactID,accID) async {
Future<void> crmProspectDetailsEditContactAPIFunction(
context,
contactID,
accID,
) async {
try {
var prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmProspectDetailsEditContactAPI(prov.empId, prov.session, contactID,
nameController.text,accID, mobileNumberController.text, designationController.text, alternativeMobileController.text, telephoneController.text, emailController.text);
if (!editContactValidation()) {
return;
}
_isLoading = true;
notifyListeners();
var prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmProspectDetailsEditContactAPI(
prov.empId,
prov.session,
contactID,
editNameController.text,
accID,
editMobileNumberController.text,
editAlternativeMobileController.text,
editTelephoneController.text,
editDesignationController.text,
editEmailController.text,
);
if (data != null) {
if (data.error == "0") {
_isLoading = false;
Navigator.pop(context,true);
Navigator.pop(context, true);
resetAll();
_isLoading = false;
notifyListeners();
}else{
} else {
_isLoading = false;
notifyListeners();
}
}else{
} else {
_isLoading = false;
notifyListeners();
}
......@@ -338,8 +399,6 @@ class crmProspectDetailsProvider extends ChangeNotifier {
}
}
void showDatePickerDialog(BuildContext context) {
showCupertinoModalPopup<void>(
context: context,
......@@ -365,7 +424,10 @@ class crmProspectDetailsProvider extends ChangeNotifier {
CupertinoButton(
child: Text(
'Cancel',
style: TextStyle(fontFamily: "JakartaMedium",color: AppColors.app_blue),
style: TextStyle(
fontFamily: "JakartaMedium",
color: AppColors.app_blue,
),
),
onPressed: () {
Navigator.pop(context);
......@@ -374,10 +436,13 @@ class crmProspectDetailsProvider extends ChangeNotifier {
CupertinoButton(
child: Text(
'Done',
style: TextStyle(fontFamily: "JakartaMedium",color: AppColors.app_blue),
style: TextStyle(
fontFamily: "JakartaMedium",
color: AppColors.app_blue,
),
),
onPressed: () {
setDate(_date ?? DateTime.now() );
setDate(_date ?? DateTime.now());
Navigator.pop(context);
},
),
......@@ -390,6 +455,7 @@ class crmProspectDetailsProvider extends ChangeNotifier {
child: CupertinoDatePicker(
dateOrder: DatePickerDateOrder.dmy,
initialDateTime: _date ?? DateTime.now(),
minimumDate: DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day),
mode: CupertinoDatePickerMode.date,
use24hFormat: true,
showDayOfWeek: true,
......@@ -405,61 +471,167 @@ class crmProspectDetailsProvider extends ChangeNotifier {
);
}
void onChangeName(value){
void onChangeName(value) {
_nameError = "";
notifyListeners();
}
void onChangeDesignation(value){
void onChangeDesignation(value) {
_designationError = "";
notifyListeners();
}
void onChangeMobile(value){
void onChangeMobile(value) {
_mobileNumError = "";
notifyListeners();
}
void onChangeAltMobile(value){
void onChangeAltMobile(value) {
_altMobError = "";
notifyListeners();
}
void onChangeTelephone(value){
void onChangeTelephone(value) {
_teleError = "";
notifyListeners();
}
void onChangeEmailId(value){
void onChangeEmailId(value) {
_emailError = "";
notifyListeners();
}
void onChangeEditName(value){
void onChangeEditName(value) {
_editNameError = "";
notifyListeners();
}
void onChangeEditDesignation(value){
void onChangeEditDesignation(value) {
_editDesignationError = "";
notifyListeners();
}
void onChangeEditMobile(value){
void onChangeEditMobile(value) {
_editMobileNumError = "";
notifyListeners();
}
void onChangeEditAltMobile(value){
void onChangeEditAltMobile(value) {
_editAltMobError = "";
notifyListeners();
}
void onChangeEditTelephone(value){
void onChangeEditTelephone(value) {
_editTeleError = "";
notifyListeners();
}
void onChangeEditEmailId(value){
void onChangeEditEmailId(value) {
_editEmailError = "";
notifyListeners();
}
void onChangeNote(value){
void onChangeNote(value) {
_noteError = "";
notifyListeners();
}
void resetAll(){
bool AddContactValidation() {
bool isValid = true;
_nameError = null;
_designationError = null;
_mobileNumError = null;
_altMobError = null;
_teleError = null;
_emailError = null;
_noteError = null;
if (nameController.text.trim().isEmpty) {
_nameError = "Please Enter Name";
isValid = false;
}
if (mobileNumberController.text.trim().isEmpty ||
mobileNumberController.text.length < 10) {
_mobileNumError = "Please Enter Mobile Number 10 Digits";
isValid = false;
}
if (alternativeMobileController.text.trim().isNotEmpty) {
if (alternativeMobileController.text.length < 10) {
_altMobError = "Please Enter Mobile Number 10 Digits";
isValid = false;
}
}
if (mobileNumberController.text.trim() ==
alternativeMobileController.text.trim()) {
_altMobError =
"Mobile Number and Alternate Mobile Number Should not be same";
isValid = false;
}
if (emailController.text.isNotEmpty) {
final RegExp emailRegex = RegExp(
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
);
isValid = emailRegex.hasMatch(emailController.text.trim());
if (!isValid) {
_emailError = "Please Enter Proper Email ID";
}
}
_isLoading = false;
notifyListeners();
return isValid;
}
bool editContactValidation() {
bool isValid = true;
_editNameError = null;
_editDesignationError = null;
_editMobileNumError = null;
_editAltMobError = null;
_editTeleError = null;
_editEmailError = null;
_noteError = null;
if (editNameController.text.trim().isEmpty) {
_editNameError = "Please Enter Name";
isValid = false;
}
if (editMobileNumberController.text.trim().isEmpty ||
editMobileNumberController.text.length < 10) {
_editMobileNumError = "Please Enter Mobile Number 10 Digits";
isValid = false;
}
if (editAlternativeMobileController.text.trim().isNotEmpty) {
if (editAlternativeMobileController.text.length < 10) {
_editAltMobError = "Please Enter Mobile Number 10 Digits";
isValid = false;
}
}
if (editMobileNumberController.text.trim() ==
editAlternativeMobileController.text.trim()) {
_editAltMobError =
"Mobile Number and Alternate Mobile Number Should not be same";
isValid = false;
}
if (editEmailController.text.isNotEmpty) {
final RegExp emailRegex = RegExp(
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
);
isValid = emailRegex.hasMatch(editEmailController.text.trim());
if (!isValid) {
_editEmailError = "Please Enter Proper Email ID";
}
}
_isLoading = false;
notifyListeners();
return isValid;
}
void resetAll() {
_formattedDateToSend = null;
_formattedDate = null;
_date = null;
_showMoreDetails = false;
nameController.clear();
designationController.clear();
......
......@@ -33,8 +33,22 @@ class followUpUpdateProvider extends ChangeNotifier {
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;
......@@ -60,31 +74,37 @@ class followUpUpdateProvider extends ChangeNotifier {
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();
}
......@@ -109,11 +129,13 @@ class followUpUpdateProvider extends ChangeNotifier {
_formattedDate = value;
nextAppointmentDateController.text = _formattedDate!;
_dateError = null;
nextAppDateError = null;
notifyListeners();
}
set dateError(value) {
_dateError = value;
nextAppDateError = value;
notifyListeners();
}
......@@ -145,6 +167,10 @@ class followUpUpdateProvider extends ChangeNotifier {
[mode]
) async {
try {
if(!valid()){
return;
}
_submitLoading = true;
notifyListeners();
final prov = Provider.of<HomescreenNotifier>(context, listen: false);
......@@ -162,7 +188,7 @@ class followUpUpdateProvider extends ChangeNotifier {
competitor,
reasonController.text,
leadStatus,
nextAppointmentDateController.text,
_formattedDateToSend,
appointmentType,
sms,
noteController.text,
......@@ -187,9 +213,78 @@ class followUpUpdateProvider extends ChangeNotifier {
}
}
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('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();
......@@ -272,11 +367,13 @@ class followUpUpdateProvider extends ChangeNotifier {
),
),
),
Expanded(
flex: 3,
child: CupertinoDatePicker(
dateOrder: DatePickerDateOrder.dmy,
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,
......@@ -292,14 +389,28 @@ class followUpUpdateProvider extends ChangeNotifier {
);
}
onFollowUpChanged(value) {}
onFollowUpChanged(value) {
onNoteChanged(value) {}
followupFeedbackError = null;
notifyListeners();
}
onNoteChanged(value) {
noteError = null;
notifyListeners();
}
onReasonChanged(value) {}
onReasonChanged(value) {
reasonError = null;
notifyListeners();
}
void resetForm(){
nextAppointmentDateController.clear();
_formattedDateToSend = null;
_formattedDate = null;
_date = null;
followUpFeedbackController.clear();
noteController.clear();
reasonController.clear();
......@@ -309,6 +420,16 @@ class followUpUpdateProvider extends ChangeNotifier {
_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();
}
}
......@@ -18,4 +18,13 @@ class AppColors {
static Color text_field_color = Color(0xFFF0F4F5);
static Color overlay_box_color = Color(0xFFE6F6FF);
static Color ERP_text_color = Color(0xFF2D357F);
static Color requested_text_color = Color(0xFF1487C9);
static Color rejected_text_color = Color(0xFFEF3739);
static Color approved_text_color = Color(0xFF4CB443);
static Color processed_text_color = Color(0xFFFFB600);
static Color requested_bg_color = Color(0xFFE6F6FF);
static Color rejected_bg_color = Color(0xFFFFF5F5);
static Color approved_bg_color = Color(0xFFE9FFE8);
static Color processed_bg_color = Color(0xFFEFFF8E5);
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -135,7 +135,7 @@ class _AddleadproductscreenState extends State<Addleadproductscreen> {
(ord) => DropdownMenuItem<Products>(
value: ord,
child: Text(
"(Product Name: ${ord.name})",
"${ord.name}",
style: const TextStyle(
fontSize: 14,
),
......
......@@ -7,6 +7,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import 'package:generp/Notifiers/crmProvider/addNewLeadsandProspectsProvider.dart';
import 'package:generp/Utils/app_colors.dart';
import 'package:generp/Utils/commonServices.dart';
import 'package:generp/Utils/commonWidgets.dart';
import 'package:generp/Utils/dropdownTheme.dart';
import 'package:provider/provider.dart';
......@@ -597,6 +598,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
borderRadius: BorderRadius.circular(16),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
InkResponse(
onTap: () async {
......@@ -833,6 +835,10 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
),
),
],
if(provider.productsEmptyError!.trim().isNotEmpty)...[
errorWidget(context, provider.productsEmptyError)
]
],
),
),
......@@ -1233,6 +1239,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
InkResponse(
onTap: () {
if (provider.validateStep3()) {
if(provider.productRows.isNotEmpty){
provider.crmAddNewLeadsAndProspectsAPIFunction(
context,
"",
......@@ -1248,6 +1255,10 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
provider.selectedLeadStatus,
provider.getJsonEncodedProducts(),
);
}else{
toast(context, "Add min. 1 product");
}
}
details.onStepContinue;
......
......@@ -252,7 +252,7 @@ class _AddProspectLeadsState extends State<AddProspectLeads> {
>(
value: ord,
child: Text(
"(Product Name: ${ord.name})",
"${ord.name}",
style: const TextStyle(
fontSize: 14,
),
......
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