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 55d3782b..378eb395 100644 --- a/apps/mobile/packages/data_connect/lib/krow_data_connect.dart +++ b/apps/mobile/packages/data_connect/lib/krow_data_connect.dart @@ -6,7 +6,6 @@ /// They will implement interfaces defined in feature packages once those are created. library; - export 'src/data_connect_module.dart'; export 'src/session/client_session_store.dart'; @@ -45,10 +44,6 @@ export 'src/connectors/hubs/data/repositories/hubs_connector_repository_impl.dar export 'src/connectors/billing/domain/repositories/billing_connector_repository.dart'; export 'src/connectors/billing/data/repositories/billing_connector_repository_impl.dart'; -// Export Home Connector -export 'src/connectors/home/domain/repositories/home_connector_repository.dart'; -export 'src/connectors/home/data/repositories/home_connector_repository_impl.dart'; - // Export Coverage Connector export 'src/connectors/coverage/domain/repositories/coverage_connector_repository.dart'; -export 'src/connectors/coverage/data/repositories/coverage_connector_repository_impl.dart'; \ No newline at end of file +export 'src/connectors/coverage/data/repositories/coverage_connector_repository_impl.dart'; diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/home/data/repositories/home_connector_repository_impl.dart b/apps/mobile/packages/data_connect/lib/src/connectors/home/data/repositories/home_connector_repository_impl.dart deleted file mode 100644 index 906e39e9..00000000 --- a/apps/mobile/packages/data_connect/lib/src/connectors/home/data/repositories/home_connector_repository_impl.dart +++ /dev/null @@ -1,113 +0,0 @@ -// ignore_for_file: always_specify_types, depend_on_referenced_packages, dead_code, dead_null_aware_expression, unused_local_variable, unused_import, sort_constructors_first, prefer_final_fields, prefer_const_constructors, deprecated_member_use, implicit_call_tearoffs -import 'package:firebase_data_connect/src/core/ref.dart'; -import 'package:krow_data_connect/krow_data_connect.dart' as dc; -import 'package:krow_domain/krow_domain.dart'; -import '../../domain/repositories/home_connector_repository.dart'; - -/// Implementation of [HomeConnectorRepository]. -class HomeConnectorRepositoryImpl implements HomeConnectorRepository { - HomeConnectorRepositoryImpl({ - dc.DataConnectService? service, - }) : _service = service ?? dc.DataConnectService.instance; - - final dc.DataConnectService _service; - - @override - Future getDashboardData({required String businessId}) async { - return _service.run(() async { - final DateTime now = DateTime.now(); - final int daysFromMonday = now.weekday - DateTime.monday; - final DateTime monday = DateTime(now.year, now.month, now.day).subtract(Duration(days: daysFromMonday)); - final DateTime weekRangeStart = monday; - final DateTime weekRangeEnd = monday.add(const Duration(days: 13, hours: 23, minutes: 59, seconds: 59)); - - final QueryResult completedResult = await _service.connector - .getCompletedShiftsByBusinessId( - businessId: businessId, - dateFrom: _service.toTimestamp(weekRangeStart), - dateTo: _service.toTimestamp(weekRangeEnd), - ) - .execute(); - - double weeklySpending = 0.0; - double next7DaysSpending = 0.0; - int weeklyShifts = 0; - int next7DaysScheduled = 0; - - for (final dc.GetCompletedShiftsByBusinessIdShifts shift in completedResult.data.shifts) { - final DateTime? shiftDate = _service.toDateTime(shift.date); - if (shiftDate == null) continue; - - final int offset = shiftDate.difference(weekRangeStart).inDays; - if (offset < 0 || offset > 13) continue; - - final double cost = shift.cost ?? 0.0; - if (offset <= 6) { - weeklySpending += cost; - weeklyShifts += 1; - } else { - next7DaysSpending += cost; - next7DaysScheduled += 1; - } - } - - final DateTime start = DateTime(now.year, now.month, now.day); - final DateTime end = start.add(const Duration(hours: 23, minutes: 59, seconds: 59)); - - final QueryResult result = await _service.connector - .listShiftRolesByBusinessAndDateRange( - businessId: businessId, - start: _service.toTimestamp(start), - end: _service.toTimestamp(end), - ) - .execute(); - - int totalNeeded = 0; - int totalFilled = 0; - for (final dc.ListShiftRolesByBusinessAndDateRangeShiftRoles shiftRole in result.data.shiftRoles) { - totalNeeded += shiftRole.count; - totalFilled += shiftRole.assigned ?? 0; - } - - return HomeDashboardData( - weeklySpending: weeklySpending, - next7DaysSpending: next7DaysSpending, - weeklyShifts: weeklyShifts, - next7DaysScheduled: next7DaysScheduled, - totalNeeded: totalNeeded, - totalFilled: totalFilled, - ); - }); - } - - @override - Future> getRecentReorders({required String businessId}) async { - return _service.run(() async { - final DateTime now = DateTime.now(); - final DateTime start = now.subtract(const Duration(days: 30)); - - final QueryResult result = await _service.connector - .listShiftRolesByBusinessDateRangeCompletedOrders( - businessId: businessId, - start: _service.toTimestamp(start), - end: _service.toTimestamp(now), - ) - .execute(); - - return result.data.shiftRoles.map((dc.ListShiftRolesByBusinessDateRangeCompletedOrdersShiftRoles shiftRole) { - final String location = shiftRole.shift.location ?? shiftRole.shift.locationAddress ?? ''; - final String type = shiftRole.shift.order.orderType.stringValue; - return ReorderItem( - orderId: shiftRole.shift.order.id, - title: '${shiftRole.role.name} - ${shiftRole.shift.title}', - location: location, - hourlyRate: shiftRole.role.costPerHour, - hours: shiftRole.hours ?? 0, - workers: shiftRole.count, - type: type, - ); - }).toList(); - }); - } -} - diff --git a/apps/mobile/packages/data_connect/lib/src/connectors/home/domain/repositories/home_connector_repository.dart b/apps/mobile/packages/data_connect/lib/src/connectors/home/domain/repositories/home_connector_repository.dart deleted file mode 100644 index 365c09b4..00000000 --- a/apps/mobile/packages/data_connect/lib/src/connectors/home/domain/repositories/home_connector_repository.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:krow_domain/krow_domain.dart'; - -/// Repository interface for home connector operations. -/// -/// This acts as a buffer layer between the domain repository and the Data Connect SDK. -abstract interface class HomeConnectorRepository { - /// Fetches dashboard data for a business. - Future getDashboardData({required String businessId}); - - /// Fetches recent reorder items for a business. - Future> getRecentReorders({required String businessId}); -} diff --git a/apps/mobile/packages/data_connect/lib/src/data_connect_module.dart b/apps/mobile/packages/data_connect/lib/src/data_connect_module.dart index 0f234576..53b9428f 100644 --- a/apps/mobile/packages/data_connect/lib/src/data_connect_module.dart +++ b/apps/mobile/packages/data_connect/lib/src/data_connect_module.dart @@ -7,8 +7,6 @@ import 'connectors/hubs/domain/repositories/hubs_connector_repository.dart'; import 'connectors/hubs/data/repositories/hubs_connector_repository_impl.dart'; import 'connectors/billing/domain/repositories/billing_connector_repository.dart'; import 'connectors/billing/data/repositories/billing_connector_repository_impl.dart'; -import 'connectors/home/domain/repositories/home_connector_repository.dart'; -import 'connectors/home/data/repositories/home_connector_repository_impl.dart'; import 'connectors/coverage/domain/repositories/coverage_connector_repository.dart'; import 'connectors/coverage/data/repositories/coverage_connector_repository_impl.dart'; import 'services/data_connect_service.dart'; @@ -32,9 +30,6 @@ class DataConnectModule extends Module { i.addLazySingleton( BillingConnectorRepositoryImpl.new, ); - i.addLazySingleton( - HomeConnectorRepositoryImpl.new, - ); i.addLazySingleton( CoverageConnectorRepositoryImpl.new, ); diff --git a/apps/mobile/packages/data_connect/lib/src/services/data_connect_service.dart b/apps/mobile/packages/data_connect/lib/src/services/data_connect_service.dart index 6865eefe..d72a48f0 100644 --- a/apps/mobile/packages/data_connect/lib/src/services/data_connect_service.dart +++ b/apps/mobile/packages/data_connect/lib/src/services/data_connect_service.dart @@ -13,8 +13,6 @@ import '../connectors/hubs/domain/repositories/hubs_connector_repository.dart'; import '../connectors/hubs/data/repositories/hubs_connector_repository_impl.dart'; import '../connectors/billing/domain/repositories/billing_connector_repository.dart'; import '../connectors/billing/data/repositories/billing_connector_repository_impl.dart'; -import '../connectors/home/domain/repositories/home_connector_repository.dart'; -import '../connectors/home/data/repositories/home_connector_repository_impl.dart'; import '../connectors/coverage/domain/repositories/coverage_connector_repository.dart'; import '../connectors/coverage/data/repositories/coverage_connector_repository_impl.dart'; import '../connectors/staff/domain/repositories/staff_connector_repository.dart'; @@ -39,7 +37,6 @@ class DataConnectService with DataErrorHandler, SessionHandlerMixin { ShiftsConnectorRepository? _shiftsRepository; HubsConnectorRepository? _hubsRepository; BillingConnectorRepository? _billingRepository; - HomeConnectorRepository? _homeRepository; CoverageConnectorRepository? _coverageRepository; StaffConnectorRepository? _staffRepository; @@ -63,14 +60,11 @@ class DataConnectService with DataErrorHandler, SessionHandlerMixin { return _billingRepository ??= BillingConnectorRepositoryImpl(service: this); } - /// Gets the home connector repository. - HomeConnectorRepository getHomeRepository() { - return _homeRepository ??= HomeConnectorRepositoryImpl(service: this); - } - /// Gets the coverage connector repository. CoverageConnectorRepository getCoverageRepository() { - return _coverageRepository ??= CoverageConnectorRepositoryImpl(service: this); + return _coverageRepository ??= CoverageConnectorRepositoryImpl( + service: this, + ); } /// Gets the staff connector repository. @@ -85,7 +79,7 @@ class DataConnectService with DataErrorHandler, SessionHandlerMixin { /// Helper to get the current staff ID from the session. Future getStaffId() async { String? staffId = dc.StaffSessionStore.instance.session?.ownerId; - + if (staffId == null || staffId.isEmpty) { // Attempt to recover session if user is signed in final user = auth.currentUser; @@ -128,7 +122,9 @@ class DataConnectService with DataErrorHandler, SessionHandlerMixin { // Load Staff Session if applicable if (role == 'STAFF' || role == 'BOTH') { - final response = await connector.getStaffByUserId(userId: userId).execute(); + final response = await connector + .getStaffByUserId(userId: userId) + .execute(); if (response.data.staffs.isNotEmpty) { final s = response.data.staffs.first; dc.StaffSessionStore.instance.setSession( @@ -151,7 +147,9 @@ class DataConnectService with DataErrorHandler, SessionHandlerMixin { // Load Client Session if applicable if (role == 'BUSINESS' || role == 'BOTH') { - final response = await connector.getBusinessesByUserId(userId: userId).execute(); + final response = await connector + .getBusinessesByUserId(userId: userId) + .execute(); if (response.data.businesses.isNotEmpty) { final b = response.data.businesses.first; dc.ClientSessionStore.instance.setSession( @@ -225,7 +223,6 @@ class DataConnectService with DataErrorHandler, SessionHandlerMixin { _shiftsRepository = null; _hubsRepository = null; _billingRepository = null; - _homeRepository = null; _coverageRepository = null; _staffRepository = null; diff --git a/apps/mobile/packages/features/client/home/lib/src/data/repositories_impl/home_repository_impl.dart b/apps/mobile/packages/features/client/home/lib/src/data/repositories_impl/home_repository_impl.dart index 24ff7b02..2b335d19 100644 --- a/apps/mobile/packages/features/client/home/lib/src/data/repositories_impl/home_repository_impl.dart +++ b/apps/mobile/packages/features/client/home/lib/src/data/repositories_impl/home_repository_impl.dart @@ -3,25 +3,98 @@ import 'package:krow_data_connect/krow_data_connect.dart' as dc; import 'package:krow_domain/krow_domain.dart'; import '../../domain/repositories/home_repository_interface.dart'; -/// Implementation of [HomeRepositoryInterface] that delegates to [dc.HomeConnectorRepository]. -/// -/// This implementation follows the "Buffer Layer" pattern by using a dedicated -/// connector repository from the data_connect package. +/// Implementation of [HomeRepositoryInterface] that directly interacts with the Data Connect SDK. class HomeRepositoryImpl implements HomeRepositoryInterface { - HomeRepositoryImpl({ - dc.HomeConnectorRepository? connectorRepository, - dc.DataConnectService? service, - }) : _connectorRepository = - connectorRepository ?? - dc.DataConnectService.instance.getHomeRepository(), - _service = service ?? dc.DataConnectService.instance; - final dc.HomeConnectorRepository _connectorRepository; + HomeRepositoryImpl({dc.DataConnectService? service}) + : _service = service ?? dc.DataConnectService.instance; + final dc.DataConnectService _service; @override Future getDashboardData() async { - final String businessId = await _service.getBusinessId(); - return _connectorRepository.getDashboardData(businessId: businessId); + return _service.run(() async { + final String businessId = await _service.getBusinessId(); + final DateTime now = DateTime.now(); + final int daysFromMonday = now.weekday - DateTime.monday; + final DateTime monday = DateTime( + now.year, + now.month, + now.day, + ).subtract(Duration(days: daysFromMonday)); + final DateTime weekRangeStart = monday; + final DateTime weekRangeEnd = monday.add( + const Duration(days: 13, hours: 23, minutes: 59, seconds: 59), + ); + + final QueryResult< + dc.GetCompletedShiftsByBusinessIdData, + dc.GetCompletedShiftsByBusinessIdVariables + > + completedResult = await _service.connector + .getCompletedShiftsByBusinessId( + businessId: businessId, + dateFrom: _service.toTimestamp(weekRangeStart), + dateTo: _service.toTimestamp(weekRangeEnd), + ) + .execute(); + + double weeklySpending = 0.0; + double next7DaysSpending = 0.0; + int weeklyShifts = 0; + int next7DaysScheduled = 0; + + for (final dc.GetCompletedShiftsByBusinessIdShifts shift + in completedResult.data.shifts) { + final DateTime? shiftDate = _service.toDateTime(shift.date); + if (shiftDate == null) continue; + + final int offset = shiftDate.difference(weekRangeStart).inDays; + if (offset < 0 || offset > 13) continue; + + final double cost = shift.cost ?? 0.0; + if (offset <= 6) { + weeklySpending += cost; + weeklyShifts += 1; + } else { + next7DaysSpending += cost; + next7DaysScheduled += 1; + } + } + + final DateTime start = DateTime(now.year, now.month, now.day); + final DateTime end = start.add( + const Duration(hours: 23, minutes: 59, seconds: 59), + ); + + final QueryResult< + dc.ListShiftRolesByBusinessAndDateRangeData, + dc.ListShiftRolesByBusinessAndDateRangeVariables + > + result = await _service.connector + .listShiftRolesByBusinessAndDateRange( + businessId: businessId, + start: _service.toTimestamp(start), + end: _service.toTimestamp(end), + ) + .execute(); + + int totalNeeded = 0; + int totalFilled = 0; + for (final dc.ListShiftRolesByBusinessAndDateRangeShiftRoles shiftRole + in result.data.shiftRoles) { + totalNeeded += shiftRole.count; + totalFilled += shiftRole.assigned ?? 0; + } + + return HomeDashboardData( + weeklySpending: weeklySpending, + next7DaysSpending: next7DaysSpending, + weeklyShifts: weeklyShifts, + next7DaysScheduled: next7DaysScheduled, + totalNeeded: totalNeeded, + totalFilled: totalFilled, + ); + }); } @override @@ -69,7 +142,39 @@ class HomeRepositoryImpl implements HomeRepositoryInterface { @override Future> getRecentReorders() async { - final String businessId = await _service.getBusinessId(); - return _connectorRepository.getRecentReorders(businessId: businessId); + return _service.run(() async { + final String businessId = await _service.getBusinessId(); + final DateTime now = DateTime.now(); + final DateTime start = now.subtract(const Duration(days: 30)); + + final QueryResult< + dc.ListShiftRolesByBusinessDateRangeCompletedOrdersData, + dc.ListShiftRolesByBusinessDateRangeCompletedOrdersVariables + > + result = await _service.connector + .listShiftRolesByBusinessDateRangeCompletedOrders( + businessId: businessId, + start: _service.toTimestamp(start), + end: _service.toTimestamp(now), + ) + .execute(); + + return result.data.shiftRoles.map(( + dc.ListShiftRolesByBusinessDateRangeCompletedOrdersShiftRoles shiftRole, + ) { + final String location = + shiftRole.shift.location ?? shiftRole.shift.locationAddress ?? ''; + final String type = shiftRole.shift.order.orderType.stringValue; + return ReorderItem( + orderId: shiftRole.shift.order.id, + title: '${shiftRole.role.name} - ${shiftRole.shift.title}', + location: location, + hourlyRate: shiftRole.role.costPerHour, + hours: shiftRole.hours ?? 0, + workers: shiftRole.count, + type: type, + ); + }).toList(); + }); } }