feat(unionflow): ajout Spec-Kit, constitution, mission mutuelles
- Config Spec-Kit pour Spec-Driven Development - CONSTITUTION.md + .specify/memory/constitution.md - Commandes Cursor /speckit.*, règles projet - Mission: associations + mutuelles d'épargne et de financement - .gitignore: versionner config spec-kit unionflow Made-with: Cursor
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
library reports_bloc;
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import '../../data/repositories/reports_repository.dart';
|
||||
|
||||
part 'reports_event.dart';
|
||||
part 'reports_state.dart';
|
||||
|
||||
class ReportsBloc extends Bloc<ReportsEvent, ReportsState> {
|
||||
final ReportsRepository _repository;
|
||||
|
||||
ReportsBloc(this._repository) : super(const ReportsInitial()) {
|
||||
on<LoadDashboardReports>(_onLoadDashboard);
|
||||
}
|
||||
|
||||
Future<void> _onLoadDashboard(
|
||||
LoadDashboardReports event,
|
||||
Emitter<ReportsState> emit,
|
||||
) async {
|
||||
try {
|
||||
emit(const ReportsLoading());
|
||||
final anneeActuelle = DateTime.now().year;
|
||||
|
||||
// Appels parallèles pour les performances
|
||||
final results = await Future.wait([
|
||||
_repository.getPerformanceGlobale(),
|
||||
_repository.getStatistiquesMembres(),
|
||||
_repository.getStatistiquesCotisations(anneeActuelle),
|
||||
_repository.getStatistiquesEvenements(),
|
||||
]);
|
||||
|
||||
emit(ReportsDashboardLoaded(
|
||||
performance: results[0],
|
||||
statsMembres: results[1],
|
||||
statsCotisations: results[2],
|
||||
statsEvenements: results[3],
|
||||
));
|
||||
} catch (e) {
|
||||
emit(ReportsError('Erreur lors du chargement des rapports : $e'));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
part of 'reports_bloc.dart';
|
||||
|
||||
abstract class ReportsEvent extends Equatable {
|
||||
const ReportsEvent();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class LoadDashboardReports extends ReportsEvent {
|
||||
const LoadDashboardReports();
|
||||
}
|
||||
|
||||
class LoadMembresStats extends ReportsEvent {
|
||||
const LoadMembresStats();
|
||||
}
|
||||
|
||||
class LoadCotisationsStats extends ReportsEvent {
|
||||
final int annee;
|
||||
const LoadCotisationsStats({required this.annee});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [annee];
|
||||
}
|
||||
|
||||
class LoadEvenementsStats extends ReportsEvent {
|
||||
const LoadEvenementsStats();
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
part of 'reports_bloc.dart';
|
||||
|
||||
abstract class ReportsState extends Equatable {
|
||||
const ReportsState();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class ReportsInitial extends ReportsState {
|
||||
const ReportsInitial();
|
||||
}
|
||||
|
||||
class ReportsLoading extends ReportsState {
|
||||
const ReportsLoading();
|
||||
}
|
||||
|
||||
class ReportsDashboardLoaded extends ReportsState {
|
||||
final Map<String, dynamic> performance;
|
||||
final Map<String, dynamic> statsMembres;
|
||||
final Map<String, dynamic> statsCotisations;
|
||||
final Map<String, dynamic> statsEvenements;
|
||||
|
||||
const ReportsDashboardLoaded({
|
||||
required this.performance,
|
||||
required this.statsMembres,
|
||||
required this.statsCotisations,
|
||||
required this.statsEvenements,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [performance, statsMembres, statsCotisations, statsEvenements];
|
||||
}
|
||||
|
||||
class ReportsError extends ReportsState {
|
||||
final String message;
|
||||
const ReportsError(this.message);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [message];
|
||||
}
|
||||
Reference in New Issue
Block a user