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 // SignUp APIs
static get signUpGetEmployeeFromERP => "$_baseUrl/SignUpRequest/GetEmployeeFromERP"; 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 signUpGetAssetGroups => "$_baseUrl/AssetGroup/GetAssetGroupsAutoComplete";
static get signUpGetCompaniesByAssetGroup => "$_baseUrl/Company/GetCompaniesByAssetGroup"; static get signUpGetCompaniesByAssetGroup => "$_baseUrl/Company/GetCompaniesByAssetGroup";
static get signUpGetSiteList => "$_baseUrl/Customer/GetSiteList"; static get signUpGetSiteList => "$_baseUrl/Customer/GetSiteList";

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

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

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

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:test_sa/controllers/api_routes/urls.dart'; 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> { class SignupSiteProvider extends LoadingListNotifier<SiteModel> {
@override @override
Future getData({int? id}) async { Future getData({int? id}) async {
log('Fetching site list for asset group ID: $id');
if (loading) return -2; if (loading) return -2;
if (id == null) { if (id == null) {
@ -25,23 +27,29 @@ class SignupSiteProvider extends LoadingListNotifier<SiteModel> {
'X-Timezone-Offset': DateTime.now().timeZoneOffset.toString().split(".").first, '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'), Uri.parse('${URLs.signUpGetSiteList}?assetGroupId=$id'),
headers: headers, headers: headers,
body: '',
); );
stateCode = response.statusCode; stateCode = response.statusCode;
log('Site API response status: ${response.statusCode}');
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
final data = json.decode(response.body); final data = json.decode(response.body);
log('Site API response data type: ${data.runtimeType}');
if (data['data'] != null && data['data'] is List) { if (data['data'] != null && data['data'] is List) {
items = (data['data'] as List) items = (data['data'] as List)
.map((item) => SiteModel.fromJson(item)) .map((item) => SiteModel.fromJson(item))
.toList(); .toList();
log('Successfully parsed ${items.length} sites');
} else { } else {
log('Site API response does not contain data array');
items = []; items = [];
} }
} else { } else {
log('Site API request failed with status: ${response.statusCode}');
items = []; items = [];
} }
@ -49,6 +57,7 @@ class SignupSiteProvider extends LoadingListNotifier<SiteModel> {
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch (error) { } catch (error) {
log('Site API error: $error');
loading = false; loading = false;
stateCode = -1; stateCode = -1;
items = []; 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/signup_request_model.dart';
import 'package:test_sa/modules/signup/models/site_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/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/company_provider.dart';
import 'package:test_sa/modules/signup/providers/group_provider.dart'; import 'package:test_sa/modules/signup/providers/group_provider.dart';
import 'package:test_sa/modules/signup/providers/signup_provider.dart'; import 'package:test_sa/modules/signup/providers/signup_provider.dart';
@ -52,6 +53,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
Company? _selectedCompany; Company? _selectedCompany;
SiteModel? _selectedSite; SiteModel? _selectedSite;
DepartmentModel? _selectedDepartment; DepartmentModel? _selectedDepartment;
EmployeeERPModel? _employeeERPData; // Store the ERP employee data
bool _isHMGGroup = false; bool _isHMGGroup = false;
bool _employeeFetched = false; bool _employeeFetched = false;
bool _isSubmitting = false; bool _isSubmitting = false;
@ -151,10 +153,14 @@ class _SignUpScreenState extends State<SignUpScreen> {
_employeeFetched = false; _employeeFetched = false;
_clearForm(); _clearForm();
}); });
// Clear sites and departments when company changes
_signUpProvider.reset(); // Reset and fetch site and department data when company is selected
// Clear sites and departments when company changes if (_selectedAssetGroup?.id != null) {
_signUpProvider.reset(); _siteProvider.reset();
_departmentProvider.reset();
_siteProvider.getData(id: _selectedAssetGroup!.id);
_departmentProvider.getData(id: _selectedAssetGroup!.id);
}
}, },
validator: (value) { validator: (value) {
if (value == null) return "Company is required"; if (value == null) return "Company is required";
@ -186,8 +192,8 @@ class _SignUpScreenState extends State<SignUpScreen> {
]; ];
} else { } else {
return [ return [
_buildReadOnlyEmployeeIdField(), // _buildReadOnlyEmployeeIdField(),
16.height, // 16.height,
_buildFullNameField(), _buildFullNameField(),
16.height, 16.height,
_buildEmailField(), _buildEmailField(),
@ -328,15 +334,12 @@ class _SignUpScreenState extends State<SignUpScreen> {
initialValue: _selectedSite, initialValue: _selectedSite,
showAsFullScreenDialog: false, showAsFullScreenDialog: false,
showAsBottomSheet: true, showAsBottomSheet: true,
requestById: _selectedAssetGroup?.id,
onSelect: (value) { onSelect: (value) {
setState(() { setState(() {
_selectedSite = value; _selectedSite = value;
_selectedDepartment = null;
}); });
// Fetch departments when site is selected // No need to fetch departments when site changes - they are independent
if (_selectedAssetGroup?.id != null) {
_departmentProvider.getData(id: _selectedAssetGroup!.id);
}
}, },
validator: (value) { validator: (value) {
if (value == null) return "Site is required"; if (value == null) return "Site is required";
@ -352,6 +355,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
initialValue: _selectedDepartment, initialValue: _selectedDepartment,
showAsFullScreenDialog: false, showAsFullScreenDialog: false,
showAsBottomSheet: true, showAsBottomSheet: true,
requestById: _selectedAssetGroup?.id,
onSelect: (value) { onSelect: (value) {
setState(() { setState(() {
_selectedDepartment = value; _selectedDepartment = value;
@ -392,6 +396,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
if (employee != null) { if (employee != null) {
setState(() { setState(() {
_employeeFetched = true; _employeeFetched = true;
_employeeERPData = employee; // Store the ERP data for later use
_fullNameController.text = employee.employeeName ?? ''; _fullNameController.text = employee.employeeName ?? '';
_emailController.text = employee.employeeEmailAddress ?? ''; _emailController.text = employee.employeeEmailAddress ?? '';
_mobileController.text = employee.employeeMobileNumber ?? ''; _mobileController.text = employee.employeeMobileNumber ?? '';
@ -399,6 +404,7 @@ class _SignUpScreenState extends State<SignUpScreen> {
} else { } else {
setState(() { setState(() {
_employeeFetched = false; _employeeFetched = false;
_employeeERPData = null;
}); });
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _signUpProvider.errorMessage ?? "Failed to fetch employee details", 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( final request = SignUpRequestModel(
companyCode: _selectedCompany?.id?.toString(), assetGroupId: _selectedAssetGroup?.id,
groupCode: _selectedAssetGroup?.id?.toString(), companyId: _selectedCompany?.id,
employeeId: _isHMGGroup ? _employeeIdController.text : null, employeeId: _isHMGGroup ? _employeeIdController.text : null,
fullName: _fullNameController.text, fullName: _fullNameController.text,
email: _emailController.text, emailAddress: _emailController.text,
mobileNumber: _mobileController.text, mobileNumber: _mobileController.text,
extensionNumber: _extensionController.text.isEmpty ? null : _extensionController.text, extensionNumber: _extensionController.text.isEmpty ? null : _extensionController.text,
siteId: _selectedSite?.id, // For HMG: use ERP site/department, For non-HMG: use selected IDs
departmentId: _selectedDepartment?.id, siteId: _isHMGGroup ? null : _selectedSite?.id,
erpSite: _isHMGGroup ? _employeeERPData?.branchCode : null,
departmentId: _isHMGGroup ? null : _selectedDepartment?.id,
erpDepartment: _isHMGGroup ? _employeeERPData?.branchName : null,
role: _roleController.text, role: _roleController.text,
isFromERP: _isHMGGroup,
); );
final success = await _signUpProvider.submitSignUpRequest(request); final success = await _signUpProvider.submitSignUpRequest(request);

Loading…
Cancel
Save