signup request inprogress

export_module_ui_ux_enhancement_signup
WaseemAbbasi22 3 weeks ago
parent b792471efe
commit 3258095a7e

@ -54,7 +54,7 @@ class URLs {
// SignUp APIs
static get signUpGetEmployeeFromERP => "$_baseUrl/SignUpRequest/GetEmployeeFromERP";
static get signUpSubmit => "$_baseUrl/SignUpRequest/Submit";
static get createSignUpRequest => "$_baseUrl/SignUpRequest/CreateSignUpRequest";
static get signUpGetAssetGroups => "$_baseUrl/AssetGroup/GetAssetGroupsAutoComplete";
static get signUpGetCompaniesByAssetGroup => "$_baseUrl/Company/GetCompaniesByAssetGroup";
static get signUpGetSiteList => "$_baseUrl/Customer/GetSiteList";

@ -1,41 +1,49 @@
class SignUpRequestModel {
final String? companyCode;
final String? groupCode;
final int? assetGroupId;
final int? companyId;
final String? employeeId;
final String? fullName;
final String? email;
final String? emailAddress;
final String? mobileNumber;
final String? extensionNumber;
final int? siteId;
final String? erpSite;
final int? departmentId;
final String? erpDepartment;
final String? role;
final bool isFromERP;
SignUpRequestModel({
this.companyCode,
this.groupCode,
this.assetGroupId,
this.companyId,
this.employeeId,
this.fullName,
this.email,
this.emailAddress,
this.mobileNumber,
this.extensionNumber,
this.siteId,
this.erpSite,
this.departmentId,
this.erpDepartment,
this.role,
required this.isFromERP,
});
Map<String, dynamic> toJson() {
return {
'companyCode': companyCode,
'groupCode': groupCode,
'employeeId': employeeId,
'fullName': fullName,
'email': email,
'mobileNumber': mobileNumber,
'extensionNumber': extensionNumber,
'siteId': siteId,
'departmentId': departmentId,
'role': role,
'assetGroupId': assetGroupId ?? 0,
'companyId': companyId ?? 0,
'employeeId': employeeId ?? '',
'fullName': fullName ?? '',
'emailAddress': emailAddress ?? '',
'mobileNumber': mobileNumber ?? '',
'extensionNumber': extensionNumber ?? '',
'siteId': siteId ?? 0,
'erpSite': erpSite ?? '',
'departmentId': departmentId ?? 0,
'erpDepartment': erpDepartment ?? '',
'role': role ?? '',
'isFromERP': isFromERP,
};
}
}

@ -1,4 +1,5 @@
import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart' as http;
import 'package:test_sa/controllers/api_routes/urls.dart';
@ -8,9 +9,11 @@ import 'package:test_sa/providers/loading_list_notifier.dart';
class SignupDepartmentProvider extends LoadingListNotifier<DepartmentModel> {
@override
Future getData({int? id}) async {
log('Fetching department list for asset group ID: $id');
if (loading) return -2;
if (id == null) {
log('Department fetch: ID is null, clearing items');
items = [];
notifyListeners();
return -1;
@ -31,16 +34,28 @@ class SignupDepartmentProvider extends LoadingListNotifier<DepartmentModel> {
);
stateCode = response.statusCode;
log('Department API response status: ${response.statusCode}');
if (response.statusCode >= 200 && response.statusCode < 300) {
final data = json.decode(response.body);
// The response is directly an array, not wrapped in a data object
if (data is List) {
log('Department API response data type: ${data.runtimeType}');
// Check if response is wrapped in a 'data' property or direct array
if (data is Map && data['data'] != null && data['data'] is List) {
items = (data['data'] as List).map((item) => DepartmentModel.fromJson(item)).toList();
log('Successfully parsed ${items.length} departments from data wrapper');
} else if (data is List) {
items = data.map((item) => DepartmentModel.fromJson(item)).toList();
log('Successfully parsed ${items.length} departments from direct array');
} else {
log('Department API response format unexpected: ${data.runtimeType}');
if (data is Map) {
log('Response keys: ${data.keys.toList()}');
}
items = [];
}
} else {
log('Department API request failed with status: ${response.statusCode}');
items = [];
}
@ -48,6 +63,7 @@ class SignupDepartmentProvider extends LoadingListNotifier<DepartmentModel> {
notifyListeners();
return response.statusCode;
} catch (error) {
log('Department API error: $error');
loading = false;
stateCode = -1;
items = [];

@ -83,7 +83,7 @@ class SignUpProvider extends ChangeNotifier {
try {
final response = await http.post(
Uri.parse(URLs.signUpSubmit),
Uri.parse(URLs.createSignUpRequest),
headers: _unauthenticatedHeaders,
body: json.encode(request.toJson()),
);

@ -1,4 +1,5 @@
import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart' as http;
import 'package:test_sa/controllers/api_routes/urls.dart';
@ -8,6 +9,7 @@ import 'package:test_sa/providers/loading_list_notifier.dart';
class SignupSiteProvider extends LoadingListNotifier<SiteModel> {
@override
Future getData({int? id}) async {
log('Fetching site list for asset group ID: $id');
if (loading) return -2;
if (id == null) {
@ -25,23 +27,29 @@ class SignupSiteProvider extends LoadingListNotifier<SiteModel> {
'X-Timezone-Offset': DateTime.now().timeZoneOffset.toString().split(".").first,
};
final response = await http.get(
final response = await http.post(
Uri.parse('${URLs.signUpGetSiteList}?assetGroupId=$id'),
headers: headers,
body: '',
);
stateCode = response.statusCode;
log('Site API response status: ${response.statusCode}');
if (response.statusCode >= 200 && response.statusCode < 300) {
final data = json.decode(response.body);
log('Site API response data type: ${data.runtimeType}');
if (data['data'] != null && data['data'] is List) {
items = (data['data'] as List)
.map((item) => SiteModel.fromJson(item))
.toList();
log('Successfully parsed ${items.length} sites');
} else {
log('Site API response does not contain data array');
items = [];
}
} else {
log('Site API request failed with status: ${response.statusCode}');
items = [];
}
@ -49,6 +57,7 @@ class SignupSiteProvider extends LoadingListNotifier<SiteModel> {
notifyListeners();
return response.statusCode;
} catch (error) {
log('Site API error: $error');
loading = false;
stateCode = -1;
items = [];
@ -57,4 +66,3 @@ class SignupSiteProvider extends LoadingListNotifier<SiteModel> {
}
}
}

@ -9,6 +9,7 @@ import 'package:test_sa/modules/signup/models/group_model.dart';
import 'package:test_sa/modules/signup/models/signup_request_model.dart';
import 'package:test_sa/modules/signup/models/site_model.dart';
import 'package:test_sa/modules/signup/models/department_model.dart';
import 'package:test_sa/modules/signup/models/employee_erp_model.dart';
import 'package:test_sa/modules/signup/providers/company_provider.dart';
import 'package:test_sa/modules/signup/providers/group_provider.dart';
import 'package:test_sa/modules/signup/providers/signup_provider.dart';
@ -52,6 +53,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
Company? _selectedCompany;
SiteModel? _selectedSite;
DepartmentModel? _selectedDepartment;
EmployeeERPModel? _employeeERPData; // Store the ERP employee data
bool _isHMGGroup = false;
bool _employeeFetched = false;
bool _isSubmitting = false;
@ -151,10 +153,14 @@ class _SignUpScreenState extends State<SignUpScreen> {
_employeeFetched = false;
_clearForm();
});
// Clear sites and departments when company changes
_signUpProvider.reset();
// Clear sites and departments when company changes
_signUpProvider.reset();
// Reset and fetch site and department data when company is selected
if (_selectedAssetGroup?.id != null) {
_siteProvider.reset();
_departmentProvider.reset();
_siteProvider.getData(id: _selectedAssetGroup!.id);
_departmentProvider.getData(id: _selectedAssetGroup!.id);
}
},
validator: (value) {
if (value == null) return "Company is required";
@ -186,8 +192,8 @@ class _SignUpScreenState extends State<SignUpScreen> {
];
} else {
return [
_buildReadOnlyEmployeeIdField(),
16.height,
// _buildReadOnlyEmployeeIdField(),
// 16.height,
_buildFullNameField(),
16.height,
_buildEmailField(),
@ -328,15 +334,12 @@ class _SignUpScreenState extends State<SignUpScreen> {
initialValue: _selectedSite,
showAsFullScreenDialog: false,
showAsBottomSheet: true,
requestById: _selectedAssetGroup?.id,
onSelect: (value) {
setState(() {
_selectedSite = value;
_selectedDepartment = null;
});
// Fetch departments when site is selected
if (_selectedAssetGroup?.id != null) {
_departmentProvider.getData(id: _selectedAssetGroup!.id);
}
// No need to fetch departments when site changes - they are independent
},
validator: (value) {
if (value == null) return "Site is required";
@ -352,6 +355,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
initialValue: _selectedDepartment,
showAsFullScreenDialog: false,
showAsBottomSheet: true,
requestById: _selectedAssetGroup?.id,
onSelect: (value) {
setState(() {
_selectedDepartment = value;
@ -392,6 +396,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
if (employee != null) {
setState(() {
_employeeFetched = true;
_employeeERPData = employee; // Store the ERP data for later use
_fullNameController.text = employee.employeeName ?? '';
_emailController.text = employee.employeeEmailAddress ?? '';
_mobileController.text = employee.employeeMobileNumber ?? '';
@ -399,6 +404,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
} else {
setState(() {
_employeeFetched = false;
_employeeERPData = null;
});
Fluttertoast.showToast(
msg: _signUpProvider.errorMessage ?? "Failed to fetch employee details",
@ -463,17 +469,22 @@ class _SignUpScreenState extends State<SignUpScreen> {
);
}
// Build request with conditional logic based on isHMGGroup
final request = SignUpRequestModel(
companyCode: _selectedCompany?.id?.toString(),
groupCode: _selectedAssetGroup?.id?.toString(),
assetGroupId: _selectedAssetGroup?.id,
companyId: _selectedCompany?.id,
employeeId: _isHMGGroup ? _employeeIdController.text : null,
fullName: _fullNameController.text,
email: _emailController.text,
emailAddress: _emailController.text,
mobileNumber: _mobileController.text,
extensionNumber: _extensionController.text.isEmpty ? null : _extensionController.text,
siteId: _selectedSite?.id,
departmentId: _selectedDepartment?.id,
// For HMG: use ERP site/department, For non-HMG: use selected IDs
siteId: _isHMGGroup ? null : _selectedSite?.id,
erpSite: _isHMGGroup ? _employeeERPData?.branchCode : null,
departmentId: _isHMGGroup ? null : _selectedDepartment?.id,
erpDepartment: _isHMGGroup ? _employeeERPData?.branchName : null,
role: _roleController.text,
isFromERP: _isHMGGroup,
);
final success = await _signUpProvider.submitSignUpRequest(request);

Loading…
Cancel
Save