From 3258095a7e6ef451103adb099c5de79599a3a908 Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 <50428976+WaseemAbbasi22@users.noreply.github.com> Date: Sun, 7 Jun 2026 17:38:23 +0300 Subject: [PATCH] signup request inprogress --- lib/controllers/api_routes/urls.dart | 2 +- .../signup/models/signup_request_model.dart | 42 ++++++++++-------- .../providers/signup_department_provider.dart | 20 ++++++++- .../signup/providers/signup_provider.dart | 2 +- .../providers/signup_site_provider.dart | 12 +++++- lib/modules/signup/screens/signup_screen.dart | 43 ++++++++++++------- 6 files changed, 82 insertions(+), 39 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 3414aaf4..ae56cc78 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -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"; diff --git a/lib/modules/signup/models/signup_request_model.dart b/lib/modules/signup/models/signup_request_model.dart index b6713129..c4012cbd 100644 --- a/lib/modules/signup/models/signup_request_model.dart +++ b/lib/modules/signup/models/signup_request_model.dart @@ -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 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, }; } } - diff --git a/lib/modules/signup/providers/signup_department_provider.dart b/lib/modules/signup/providers/signup_department_provider.dart index 610d6679..cc35912b 100644 --- a/lib/modules/signup/providers/signup_department_provider.dart +++ b/lib/modules/signup/providers/signup_department_provider.dart @@ -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 { @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 { ); 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 { notifyListeners(); return response.statusCode; } catch (error) { + log('Department API error: $error'); loading = false; stateCode = -1; items = []; diff --git a/lib/modules/signup/providers/signup_provider.dart b/lib/modules/signup/providers/signup_provider.dart index c6711ed3..74cc9fdd 100644 --- a/lib/modules/signup/providers/signup_provider.dart +++ b/lib/modules/signup/providers/signup_provider.dart @@ -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()), ); diff --git a/lib/modules/signup/providers/signup_site_provider.dart b/lib/modules/signup/providers/signup_site_provider.dart index 10705490..0910166a 100644 --- a/lib/modules/signup/providers/signup_site_provider.dart +++ b/lib/modules/signup/providers/signup_site_provider.dart @@ -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 { @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 { '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 { notifyListeners(); return response.statusCode; } catch (error) { + log('Site API error: $error'); loading = false; stateCode = -1; items = []; @@ -57,4 +66,3 @@ class SignupSiteProvider extends LoadingListNotifier { } } } - diff --git a/lib/modules/signup/screens/signup_screen.dart b/lib/modules/signup/screens/signup_screen.dart index fd0e4c6c..70327f18 100644 --- a/lib/modules/signup/screens/signup_screen.dart +++ b/lib/modules/signup/screens/signup_screen.dart @@ -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 { 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 { _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 { ]; } else { return [ - _buildReadOnlyEmployeeIdField(), - 16.height, + // _buildReadOnlyEmployeeIdField(), + // 16.height, _buildFullNameField(), 16.height, _buildEmailField(), @@ -328,15 +334,12 @@ class _SignUpScreenState extends State { 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 { initialValue: _selectedDepartment, showAsFullScreenDialog: false, showAsBottomSheet: true, + requestById: _selectedAssetGroup?.id, onSelect: (value) { setState(() { _selectedDepartment = value; @@ -392,6 +396,7 @@ class _SignUpScreenState extends State { 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 { } else { setState(() { _employeeFetched = false; + _employeeERPData = null; }); Fluttertoast.showToast( msg: _signUpProvider.errorMessage ?? "Failed to fetch employee details", @@ -463,17 +469,22 @@ class _SignUpScreenState extends State { ); } + // 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);