feat: Version 3.5.2 - Configuration Stripe et gestion des immeubles

- Configuration complète Stripe pour les 3 environnements (DEV/REC/PROD)
  * DEV: Clés TEST Pierre (mode test)
  * REC: Clés TEST Client (mode test)
  * PROD: Clés LIVE Client (mode live)
- Ajout de la gestion des bases de données immeubles/bâtiments
  * Configuration buildings_database pour DEV/REC/PROD
  * Service BuildingService pour enrichissement des adresses
- Optimisations pages et améliorations ergonomie
- Mises à jour des dépendances Composer
- Nettoyage des fichiers obsolètes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
pierre
2025-11-09 18:26:27 +01:00
parent 21657a3820
commit 2f5946a184
812 changed files with 142105 additions and 25992 deletions

View File

@@ -10,6 +10,7 @@ import 'package:geosector_app/presentation/widgets/members_board_passages.dart';
import 'package:geosector_app/core/constants/app_keys.dart';
import 'package:geosector_app/core/theme/app_theme.dart';
import 'package:geosector_app/presentation/widgets/app_scaffold.dart';
import 'package:geosector_app/presentation/widgets/btn_passages.dart';
/// Widget de contenu du tableau de bord unifié (sans scaffold)
class HomeContent extends StatefulWidget {
@@ -22,16 +23,13 @@ class HomeContent extends StatefulWidget {
class _HomeContentState extends State<HomeContent> {
// Détection du rôle
late final bool isAdmin;
late final int currentUserId;
@override
void initState() {
super.initState();
// Déterminer le rôle de l'utilisateur et le mode d'affichage
final currentUser = userRepository.getCurrentUser();
// Déterminer le mode d'affichage
isAdmin = CurrentUserService.instance.shouldShowAdminUI;
currentUserId = currentUser?.id ?? 0;
}
@override
@@ -41,14 +39,6 @@ class _HomeContentState extends State<HomeContent> {
final screenWidth = MediaQuery.of(context).size.width;
final isDesktop = screenWidth > 800;
// Récupérer l'opération en cours
final currentOperation = userRepository.getCurrentOperation();
// Titre dynamique avec l'ID et le nom de l'opération
final String title = currentOperation != null
? 'Opération #${currentOperation.id} ${currentOperation.name}'
: 'Opération';
// Retourner seulement le contenu (sans scaffold)
return SingleChildScrollView(
padding: EdgeInsets.symmetric(
@@ -58,14 +48,9 @@ class _HomeContentState extends State<HomeContent> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Titre
Text(
title,
style: Theme.of(context).textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: AppTheme.spacingM),
// Widget BtnPassages
const BtnPassages(),
const SizedBox(height: AppTheme.spacingL),
// LIGNE 1 : Graphiques de répartition (type de passage et mode de paiement)
isDesktop