diff --git a/apps/mobile/packages/data_connect/lib/krow_data_connect.dart b/apps/mobile/packages/data_connect/lib/krow_data_connect.dart index e8d70f23..4123cf8b 100644 --- a/apps/mobile/packages/data_connect/lib/krow_data_connect.dart +++ b/apps/mobile/packages/data_connect/lib/krow_data_connect.dart @@ -21,4 +21,8 @@ export 'src/services/mixins/data_error_handler.dart'; // Export Staff Connector repositories and use cases export 'src/connectors/staff/domain/repositories/staff_connector_repository.dart'; export 'src/connectors/staff/domain/usecases/get_profile_completion_usecase.dart'; +export 'src/connectors/staff/domain/usecases/get_personal_info_completion_usecase.dart'; +export 'src/connectors/staff/domain/usecases/get_emergency_contacts_completion_usecase.dart'; +export 'src/connectors/staff/domain/usecases/get_experience_completion_usecase.dart'; +export 'src/connectors/staff/domain/usecases/get_tax_forms_completion_usecase.dart'; export 'src/connectors/staff/data/repositories/staff_connector_repository_impl.dart'; \ No newline at end of file diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/staff/data/repositories/staff_connector_repository_impl.dart b/apps/mobile/packages/data_connect/lib/src/connectors/staff/data/repositories/staff_connector_repository_impl.dart index caebd123..45c5fd3f 100644 --- a/apps/mobile/packages/data_connect/lib/src/connectors/staff/data/repositories/staff_connector_repository_impl.dart +++ b/apps/mobile/packages/data_connect/lib/src/connectors/staff/data/repositories/staff_connector_repository_impl.dart @@ -36,8 +36,84 @@ class StaffConnectorRepositoryImpl implements StaffConnectorRepository { }); } + @override + Future getPersonalInfoCompletion() async { + return _service.run(() async { + final String staffId = await _service.getStaffId(); + + final QueryResult response = + await _service.connector + .getStaffPersonalInfoCompletion(id: staffId) + .execute(); + + final GetStaffPersonalInfoCompletionStaff? staff = response.data.staff; + + return _isPersonalInfoComplete(staff); + }); + } + + @override + Future getEmergencyContactsCompletion() async { + return _service.run(() async { + final String staffId = await _service.getStaffId(); + + final QueryResult response = + await _service.connector + .getStaffEmergencyProfileCompletion(id: staffId) + .execute(); + + return response.data.emergencyContacts.isNotEmpty; + }); + } + + @override + Future getExperienceCompletion() async { + return _service.run(() async { + final String staffId = await _service.getStaffId(); + + final QueryResult response = + await _service.connector + .getStaffExperienceProfileCompletion(id: staffId) + .execute(); + + final GetStaffExperienceProfileCompletionStaff? staff = + response.data.staff; + + return _hasExperience(staff); + }); + } + + @override + Future getTaxFormsCompletion() async { + return _service.run(() async { + final String staffId = await _service.getStaffId(); + + final QueryResult response = + await _service.connector + .getStaffTaxFormsProfileCompletion(id: staffId) + .execute(); + + return response.data.taxForms.isNotEmpty; + }); + } + + /// Checks if personal info is complete. + bool _isPersonalInfoComplete(GetStaffPersonalInfoCompletionStaff? staff) { + if (staff == null) return false; + final String? fullName = staff.fullName; + final String? email = staff.email; + final String? phone = staff.phone; + return (fullName?.trim().isNotEmpty ?? false) && + (email?.trim().isNotEmpty ?? false) && + (phone?.trim().isNotEmpty ?? false); + } + /// Checks if staff has experience data (skills or industries). - bool _hasExperience(GetStaffProfileCompletionStaff? staff) { + bool _hasExperience(GetStaffExperienceProfileCompletionStaff? staff) { if (staff == null) return false; final dynamic skills = staff.skills; final dynamic industries = staff.industries; @@ -51,9 +127,14 @@ class StaffConnectorRepositoryImpl implements StaffConnectorRepository { List emergencyContacts, List taxForms, ) { - return staff != null && - emergencyContacts.isNotEmpty && + if (staff == null) return false; + final dynamic skills = staff.skills; + final dynamic industries = staff.industries; + final bool hasExperience = + (skills is List && skills.isNotEmpty) || + (industries is List && industries.isNotEmpty); + return emergencyContacts.isNotEmpty && taxForms.isNotEmpty && - _hasExperience(staff); + hasExperience; } } diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/repositories/staff_connector_repository.dart b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/repositories/staff_connector_repository.dart index 779e0042..b4dc384b 100644 --- a/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/repositories/staff_connector_repository.dart +++ b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/repositories/staff_connector_repository.dart @@ -10,4 +10,24 @@ abstract interface class StaffConnectorRepository { /// /// Throws an exception if the query fails. Future getProfileCompletion(); + + /// Fetches personal information completion status. + /// + /// Returns true if personal info (name, email, phone, locations) is complete. + Future getPersonalInfoCompletion(); + + /// Fetches emergency contacts completion status. + /// + /// Returns true if at least one emergency contact exists. + Future getEmergencyContactsCompletion(); + + /// Fetches experience completion status. + /// + /// Returns true if staff has industries or skills defined. + Future getExperienceCompletion(); + + /// Fetches tax forms completion status. + /// + /// Returns true if at least one tax form exists. + Future getTaxFormsCompletion(); } diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_emergency_contacts_completion_usecase.dart b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_emergency_contacts_completion_usecase.dart new file mode 100644 index 00000000..63c43dd4 --- /dev/null +++ b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_emergency_contacts_completion_usecase.dart @@ -0,0 +1,27 @@ +import 'package:krow_core/core.dart'; + +import '../repositories/staff_connector_repository.dart'; + +/// Use case for retrieving emergency contacts completion status. +/// +/// This use case encapsulates the business logic for determining whether +/// a staff member has at least one emergency contact registered. +/// It delegates to the repository for data access. +class GetEmergencyContactsCompletionUseCase extends NoInputUseCase { + /// Creates a [GetEmergencyContactsCompletionUseCase]. + /// + /// Requires a [StaffConnectorRepository] for data access. + GetEmergencyContactsCompletionUseCase({ + required StaffConnectorRepository repository, + }) : _repository = repository; + + final StaffConnectorRepository _repository; + + /// Executes the use case to get emergency contacts completion status. + /// + /// Returns true if emergency contacts are registered, false otherwise. + /// + /// Throws an exception if the operation fails. + @override + Future call() => _repository.getEmergencyContactsCompletion(); +} diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_experience_completion_usecase.dart b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_experience_completion_usecase.dart new file mode 100644 index 00000000..e744add4 --- /dev/null +++ b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_experience_completion_usecase.dart @@ -0,0 +1,27 @@ +import 'package:krow_core/core.dart'; + +import '../repositories/staff_connector_repository.dart'; + +/// Use case for retrieving experience completion status. +/// +/// This use case encapsulates the business logic for determining whether +/// a staff member has experience data (skills or industries) defined. +/// It delegates to the repository for data access. +class GetExperienceCompletionUseCase extends NoInputUseCase { + /// Creates a [GetExperienceCompletionUseCase]. + /// + /// Requires a [StaffConnectorRepository] for data access. + GetExperienceCompletionUseCase({ + required StaffConnectorRepository repository, + }) : _repository = repository; + + final StaffConnectorRepository _repository; + + /// Executes the use case to get experience completion status. + /// + /// Returns true if experience data is defined, false otherwise. + /// + /// Throws an exception if the operation fails. + @override + Future call() => _repository.getExperienceCompletion(); +} diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_personal_info_completion_usecase.dart b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_personal_info_completion_usecase.dart new file mode 100644 index 00000000..a4a3f46d --- /dev/null +++ b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_personal_info_completion_usecase.dart @@ -0,0 +1,27 @@ +import 'package:krow_core/core.dart'; + +import '../repositories/staff_connector_repository.dart'; + +/// Use case for retrieving personal information completion status. +/// +/// This use case encapsulates the business logic for determining whether +/// a staff member's personal information is complete (name, email, phone). +/// It delegates to the repository for data access. +class GetPersonalInfoCompletionUseCase extends NoInputUseCase { + /// Creates a [GetPersonalInfoCompletionUseCase]. + /// + /// Requires a [StaffConnectorRepository] for data access. + GetPersonalInfoCompletionUseCase({ + required StaffConnectorRepository repository, + }) : _repository = repository; + + final StaffConnectorRepository _repository; + + /// Executes the use case to get personal info completion status. + /// + /// Returns true if personal information is complete, false otherwise. + /// + /// Throws an exception if the operation fails. + @override + Future call() => _repository.getPersonalInfoCompletion(); +} diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_profile_completion_usecase.dart b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_profile_completion_usecase.dart index 5aa37816..f079eb23 100644 --- a/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_profile_completion_usecase.dart +++ b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_profile_completion_usecase.dart @@ -1,3 +1,5 @@ +import 'package:krow_core/core.dart'; + import '../repositories/staff_connector_repository.dart'; /// Use case for retrieving staff profile completion status. @@ -5,7 +7,7 @@ import '../repositories/staff_connector_repository.dart'; /// This use case encapsulates the business logic for determining whether /// a staff member's profile is complete. It delegates to the repository /// for data access. -class GetProfileCompletionUseCase { +class GetProfileCompletionUseCase extends NoInputUseCase { /// Creates a [GetProfileCompletionUseCase]. /// /// Requires a [StaffConnectorRepository] for data access. @@ -20,5 +22,6 @@ class GetProfileCompletionUseCase { /// Returns true if the profile is complete, false otherwise. /// /// Throws an exception if the operation fails. + @override Future call() => _repository.getProfileCompletion(); } diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_tax_forms_completion_usecase.dart b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_tax_forms_completion_usecase.dart new file mode 100644 index 00000000..9a8fda29 --- /dev/null +++ b/apps/mobile/packages/data_connect/lib/src/connectors/staff/domain/usecases/get_tax_forms_completion_usecase.dart @@ -0,0 +1,27 @@ +import 'package:krow_core/core.dart'; + +import '../repositories/staff_connector_repository.dart'; + +/// Use case for retrieving tax forms completion status. +/// +/// This use case encapsulates the business logic for determining whether +/// a staff member has at least one tax form submitted. +/// It delegates to the repository for data access. +class GetTaxFormsCompletionUseCase extends NoInputUseCase { + /// Creates a [GetTaxFormsCompletionUseCase]. + /// + /// Requires a [StaffConnectorRepository] for data access. + GetTaxFormsCompletionUseCase({ + required StaffConnectorRepository repository, + }) : _repository = repository; + + final StaffConnectorRepository _repository; + + /// Executes the use case to get tax forms completion status. + /// + /// Returns true if tax forms are submitted, false otherwise. + /// + /// Throws an exception if the operation fails. + @override + Future call() => _repository.getTaxFormsCompletion(); +} diff --git a/apps/mobile/packages/data_connect/pubspec.yaml b/apps/mobile/packages/data_connect/pubspec.yaml index 48d0039b..374204e5 100644 --- a/apps/mobile/packages/data_connect/pubspec.yaml +++ b/apps/mobile/packages/data_connect/pubspec.yaml @@ -13,8 +13,9 @@ dependencies: sdk: flutter krow_domain: path: ../domain + krow_core: + path: ../core flutter_modular: ^6.3.0 firebase_data_connect: ^0.2.2+2 firebase_core: ^4.4.0 firebase_auth: ^6.1.4 - krow_core: ^0.0.1