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:
dahoud
2026-02-27 14:41:07 +00:00
parent 144b68f8e7
commit b1957c1c81
631 changed files with 104070 additions and 0 deletions

View File

@@ -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'));
}
}
}

View File

@@ -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();
}

View File

@@ -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];
}