Files
finger_print_app/lib/presentation/bloc/finance_bloc.dart

100 lines
3.0 KiB
Dart

import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../domain/usecases/get_attendance_records_usecase.dart';
import '../../../domain/usecases/get_extra_hours_usecase.dart';
import '../../../domain/usecases/get_rewards_usecase.dart';
import '../../../domain/usecases/get_punishments_usecase.dart';
import '../../../domain/models/finance_record.dart';
import '../../../domain/models/finance_category.dart';
import '../../../core/error/exceptions.dart';
// Events
abstract class FinanceEvent {}
class LoadFinanceDataEvent extends FinanceEvent {
final String employeeId;
final FinanceCategory category;
LoadFinanceDataEvent({required this.employeeId, required this.category});
}
// States
abstract class FinanceState {}
class FinanceInitial extends FinanceState {}
class FinanceLoading extends FinanceState {}
class FinanceLoaded extends FinanceState {
final List<FinanceRecord> records;
final FinanceCategory category;
FinanceLoaded({required this.records, required this.category});
}
class FinanceError extends FinanceState {
final String message;
FinanceError({required this.message});
}
// Bloc
class FinanceBloc extends Bloc<FinanceEvent, FinanceState> {
final GetAttendanceRecordsUseCase getAttendanceRecordsUseCase;
final GetExtraHoursUseCase getExtraHoursUseCase;
final GetRewardsUseCase getRewardsUseCase;
final GetPunishmentsUseCase getPunishmentsUseCase;
FinanceBloc({
required this.getAttendanceRecordsUseCase,
required this.getExtraHoursUseCase,
required this.getRewardsUseCase,
required this.getPunishmentsUseCase,
}) : super(FinanceInitial()) {
on<LoadFinanceDataEvent>(_onLoadFinanceData);
}
Future<void> _onLoadFinanceData(
LoadFinanceDataEvent event,
Emitter<FinanceState> emit,
) async {
if (event.employeeId.isEmpty) {
emit(FinanceError(message: 'Employee ID is missing or invalid'));
return;
}
emit(FinanceLoading());
try {
List<FinanceRecord> records;
switch (event.category) {
case FinanceCategory.attendance:
records = await getAttendanceRecordsUseCase.execute(
employeeId: event.employeeId,
);
break;
case FinanceCategory.overtime:
records = await getExtraHoursUseCase.execute(
employeeId: event.employeeId,
);
break;
case FinanceCategory.bonus:
records = await getRewardsUseCase.execute(
employeeId: event.employeeId,
);
break;
case FinanceCategory.penalty:
records = await getPunishmentsUseCase.execute(
employeeId: event.employeeId,
);
break;
}
emit(FinanceLoaded(records: records, category: event.category));
} on ServerException catch (e) {
emit(FinanceError(message: e.message));
} on NetworkException catch (e) {
emit(FinanceError(message: e.message));
} catch (e) {
emit(FinanceError(message: 'Unexpected error occurred: ${e.toString()}'));
}
}
}