From 3308fec70b1d30cf470556b03357a618086dfdd8 Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Thu, 29 Jan 2026 11:09:10 -0500 Subject: [PATCH] feat: refactor payments repository and use cases to integrate payment summary and transaction entities --- .../payments_repository_impl.dart | 2 - .../payments_repository_impl.dart | 25 +++++----- .../src/domain/entities/payment_summary.dart | 23 +++++++++ .../domain/entities/payment_transaction.dart | 41 ++++++++++++++++ .../repositories/payments_repository.dart | 10 ++-- .../usecases/get_payment_history_usecase.dart | 9 ++-- .../usecases/get_payment_summary_usecase.dart | 11 ++--- .../blocs/payments/payments_bloc.dart | 49 +++---------------- .../blocs/payments/payments_state.dart | 12 ++--- .../src/presentation/pages/payments_page.dart | 20 ++++---- 10 files changed, 114 insertions(+), 88 deletions(-) create mode 100644 apps/mobile/packages/features/staff/payments/lib/src/domain/entities/payment_summary.dart create mode 100644 apps/mobile/packages/features/staff/payments/lib/src/domain/entities/payment_transaction.dart diff --git a/apps/mobile/packages/features/staff/payments/lib/src/data/repositories/payments_repository_impl.dart b/apps/mobile/packages/features/staff/payments/lib/src/data/repositories/payments_repository_impl.dart index 303fca7f..5ac53641 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/data/repositories/payments_repository_impl.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/data/repositories/payments_repository_impl.dart @@ -1,5 +1,3 @@ -// ignore: unused_import -// import 'package:data_connect/data_connect.dart'; import '../../domain/entities/payment_summary.dart'; import '../../domain/entities/payment_transaction.dart'; import '../../domain/repositories/payments_repository.dart'; diff --git a/apps/mobile/packages/features/staff/payments/lib/src/data/repositories_impl/payments_repository_impl.dart b/apps/mobile/packages/features/staff/payments/lib/src/data/repositories_impl/payments_repository_impl.dart index 5abcd80b..fbdf84ac 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/data/repositories_impl/payments_repository_impl.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/data/repositories_impl/payments_repository_impl.dart @@ -1,22 +1,21 @@ -import 'package:krow_data_connect/krow_data_connect.dart'; -import 'package:krow_domain/krow_domain.dart'; +import '../../domain/entities/payment_summary.dart'; +import '../../domain/entities/payment_transaction.dart'; import '../../domain/repositories/payments_repository.dart'; +import '../datasources/payments_remote_datasource.dart'; /// Implementation of [PaymentsRepository]. -/// -/// This class handles the retrieval of payment data by delegating to the -/// [FinancialRepositoryMock] from the data connect package. -/// -/// It resides in the data layer and depends on the domain layer for the repository interface. class PaymentsRepositoryImpl implements PaymentsRepository { - final FinancialRepositoryMock financialRepository; + final PaymentsRemoteDataSource remoteDataSource; - /// Creates a [PaymentsRepositoryImpl] with the given [financialRepository]. - PaymentsRepositoryImpl({required this.financialRepository}); + PaymentsRepositoryImpl({required this.remoteDataSource}); @override - Future> getPayments() async { - // TODO: Get actual logged in staff ID - return await financialRepository.getStaffPayments('staff_1'); + Future getPaymentSummary() async { + return await remoteDataSource.fetchPaymentSummary(); + } + + @override + Future> getPaymentHistory(String period) async { + return await remoteDataSource.fetchPaymentHistory(period); } } diff --git a/apps/mobile/packages/features/staff/payments/lib/src/domain/entities/payment_summary.dart b/apps/mobile/packages/features/staff/payments/lib/src/domain/entities/payment_summary.dart new file mode 100644 index 00000000..de815145 --- /dev/null +++ b/apps/mobile/packages/features/staff/payments/lib/src/domain/entities/payment_summary.dart @@ -0,0 +1,23 @@ +import 'package:equatable/equatable.dart'; + +class PaymentSummary extends Equatable { + final double weeklyEarnings; + final double monthlyEarnings; + final double pendingEarnings; + final double totalEarnings; + + const PaymentSummary({ + required this.weeklyEarnings, + required this.monthlyEarnings, + required this.pendingEarnings, + required this.totalEarnings, + }); + + @override + List get props => [ + weeklyEarnings, + monthlyEarnings, + pendingEarnings, + totalEarnings, + ]; +} diff --git a/apps/mobile/packages/features/staff/payments/lib/src/domain/entities/payment_transaction.dart b/apps/mobile/packages/features/staff/payments/lib/src/domain/entities/payment_transaction.dart new file mode 100644 index 00000000..dff3eec0 --- /dev/null +++ b/apps/mobile/packages/features/staff/payments/lib/src/domain/entities/payment_transaction.dart @@ -0,0 +1,41 @@ +import 'package:equatable/equatable.dart'; + +class PaymentTransaction extends Equatable { + final String id; + final String title; + final String location; + final String address; + final String workedTime; + final double amount; + final String status; + final int hours; + final double rate; + final DateTime date; + + const PaymentTransaction({ + required this.id, + required this.title, + required this.location, + required this.address, + required this.workedTime, + required this.amount, + required this.status, + required this.hours, + required this.rate, + required this.date, + }); + + @override + List get props => [ + id, + title, + location, + address, + workedTime, + amount, + status, + hours, + rate, + date, + ]; +} diff --git a/apps/mobile/packages/features/staff/payments/lib/src/domain/repositories/payments_repository.dart b/apps/mobile/packages/features/staff/payments/lib/src/domain/repositories/payments_repository.dart index 71546c9e..b142805d 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/domain/repositories/payments_repository.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/domain/repositories/payments_repository.dart @@ -1,10 +1,14 @@ -import 'package:krow_domain/krow_domain.dart'; +import '../entities/payment_summary.dart'; +import '../entities/payment_transaction.dart'; /// Repository interface for Payments feature. /// /// Defines the contract for data access related to staff payments. /// Implementations of this interface should reside in the data layer. abstract class PaymentsRepository { - /// Fetches the list of payments for the current staff member. - Future> getPayments(); + /// Fetches the payment summary (earnings). + Future getPaymentSummary(); + + /// Fetches the payment history for a specific period. + Future> getPaymentHistory(String period); } diff --git a/apps/mobile/packages/features/staff/payments/lib/src/domain/usecases/get_payment_history_usecase.dart b/apps/mobile/packages/features/staff/payments/lib/src/domain/usecases/get_payment_history_usecase.dart index d5a3a3a8..01ceac51 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/domain/usecases/get_payment_history_usecase.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/domain/usecases/get_payment_history_usecase.dart @@ -1,20 +1,19 @@ import 'package:krow_core/core.dart'; -import 'package:krow_domain/krow_domain.dart'; import '../arguments/get_payment_history_arguments.dart'; +import '../entities/payment_transaction.dart'; import '../repositories/payments_repository.dart'; /// Use case to retrieve payment history filtered by a period. /// /// This use case delegates the data retrieval to [PaymentsRepository]. -class GetPaymentHistoryUseCase extends UseCase> { +class GetPaymentHistoryUseCase extends UseCase> { final PaymentsRepository repository; /// Creates a [GetPaymentHistoryUseCase]. GetPaymentHistoryUseCase(this.repository); @override - Future> call(GetPaymentHistoryArguments arguments) async { - // TODO: Implement filtering by period - return await repository.getPayments(); + Future> call(GetPaymentHistoryArguments arguments) async { + return await repository.getPaymentHistory(arguments.period); } } diff --git a/apps/mobile/packages/features/staff/payments/lib/src/domain/usecases/get_payment_summary_usecase.dart b/apps/mobile/packages/features/staff/payments/lib/src/domain/usecases/get_payment_summary_usecase.dart index 27b74290..b810454b 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/domain/usecases/get_payment_summary_usecase.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/domain/usecases/get_payment_summary_usecase.dart @@ -1,19 +1,16 @@ import 'package:krow_core/core.dart'; -import 'package:krow_domain/krow_domain.dart'; +import '../entities/payment_summary.dart'; import '../repositories/payments_repository.dart'; /// Use case to retrieve payment summary information. -/// -/// It fetches the full list of payments, which ideally should be aggregated -/// by the presentation layer or a specific data source method. -class GetPaymentSummaryUseCase extends NoInputUseCase> { +class GetPaymentSummaryUseCase extends NoInputUseCase { final PaymentsRepository repository; /// Creates a [GetPaymentSummaryUseCase]. GetPaymentSummaryUseCase(this.repository); @override - Future> call() async { - return await repository.getPayments(); + Future call() async { + return await repository.getPaymentSummary(); } } diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_bloc.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_bloc.dart index 33887032..f2448175 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_bloc.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_bloc.dart @@ -1,9 +1,9 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:krow_domain/krow_domain.dart'; import '../../../domain/arguments/get_payment_history_arguments.dart'; -import '../../../domain/usecases/get_payment_summary_usecase.dart'; +import '../../../domain/entities/payment_summary.dart'; +import '../../../domain/entities/payment_transaction.dart'; import '../../../domain/usecases/get_payment_history_usecase.dart'; -import '../../models/payment_stats.dart'; +import '../../../domain/usecases/get_payment_summary_usecase.dart'; import 'payments_event.dart'; import 'payments_state.dart'; @@ -25,14 +25,13 @@ class PaymentsBloc extends Bloc { ) async { emit(PaymentsLoading()); try { - final List allPayments = await getPaymentSummary(); - final PaymentStats stats = _calculateStats(allPayments); + final PaymentSummary currentSummary = await getPaymentSummary(); - final List history = await getPaymentHistory( + final List history = await getPaymentHistory( const GetPaymentHistoryArguments('week'), ); emit(PaymentsLoaded( - summary: stats, + summary: currentSummary, history: history, activePeriod: 'week', )); @@ -48,7 +47,7 @@ class PaymentsBloc extends Bloc { final PaymentsState currentState = state; if (currentState is PaymentsLoaded) { try { - final List newHistory = await getPaymentHistory( + final List newHistory = await getPaymentHistory( GetPaymentHistoryArguments(event.period), ); emit(currentState.copyWith( @@ -60,38 +59,4 @@ class PaymentsBloc extends Bloc { } } } - - PaymentStats _calculateStats(List payments) { - double total = 0; - double pending = 0; - double weekly = 0; - double monthly = 0; - - final DateTime now = DateTime.now(); - - for (final StaffPayment p in payments) { - // Assuming all payments count towards total history - total += p.amount; - - if (p.status == PaymentStatus.pending) { - pending += p.amount; - } - - if (p.paidAt != null) { - if (now.difference(p.paidAt!).inDays < 7) { - weekly += p.amount; - } - if (now.month == p.paidAt!.month && now.year == p.paidAt!.year) { - monthly += p.amount; - } - } - } - - return PaymentStats( - totalEarnings: total, - pendingEarnings: pending, - weeklyEarnings: weekly, - monthlyEarnings: monthly, - ); - } } diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_state.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_state.dart index 14e3af61..f3742ca3 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_state.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/blocs/payments/payments_state.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:krow_domain/krow_domain.dart'; -import '../../models/payment_stats.dart'; +import '../../../domain/entities/payment_summary.dart'; +import '../../../domain/entities/payment_transaction.dart'; abstract class PaymentsState extends Equatable { const PaymentsState(); @@ -14,8 +14,8 @@ class PaymentsInitial extends PaymentsState {} class PaymentsLoading extends PaymentsState {} class PaymentsLoaded extends PaymentsState { - final PaymentStats summary; - final List history; + final PaymentSummary summary; + final List history; final String activePeriod; const PaymentsLoaded({ @@ -25,8 +25,8 @@ class PaymentsLoaded extends PaymentsState { }); PaymentsLoaded copyWith({ - PaymentStats? summary, - List? history, + PaymentSummary? summary, + List? history, String? activePeriod, }) { return PaymentsLoaded( diff --git a/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart b/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart index d82f3588..188f8285 100644 --- a/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart +++ b/apps/mobile/packages/features/staff/payments/lib/src/presentation/pages/payments_page.dart @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_modular/flutter_modular.dart'; import 'package:lucide_icons/lucide_icons.dart'; import 'package:intl/intl.dart'; -import 'package:krow_domain/krow_domain.dart'; +import '../../domain/entities/payment_transaction.dart'; import '../blocs/payments/payments_bloc.dart'; import '../blocs/payments/payments_event.dart'; import '../blocs/payments/payments_state.dart'; @@ -177,19 +177,19 @@ class _PaymentsPageState extends State { ), const SizedBox(height: 12), Column( - children: state.history.map((StaffPayment payment) { + children: state.history.map((PaymentTransaction payment) { return Padding( padding: const EdgeInsets.only(bottom: 8), child: PaymentHistoryItem( amount: payment.amount, - title: 'Assignment ${payment.assignmentId}', - location: 'Location', // TODO: Fetch from assignment - address: '', - date: payment.paidAt != null ? DateFormat('E, MMM d').format(payment.paidAt!) : 'Pending', - workedTime: '00:00 - 00:00', // TODO: Fetch from assignment - hours: 0, - rate: 0, - status: payment.status.toString().split('.').last, + title: payment.title, + location: payment.location, + address: payment.address, + date: DateFormat('E, MMM d').format(payment.date), + workedTime: payment.workedTime, + hours: payment.hours, + rate: payment.rate, + status: payment.status, ), ); }).toList(),