1d3ee69c6d
App Flutter de programme de fidélité : login staff, clients (nom/prénom), scan QR, factures (€→points), récompenses, réglages. Backend Supabase (schéma SQL + RLS anti-triche dans supabase/). Icône incluse. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
1.8 KiB
Dart
57 lines
1.8 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
|
|
import '../config.dart';
|
|
import '../supabase_config.dart';
|
|
|
|
/// Réglages globaux du magasin (ligne unique `reglages` id=1 sur Supabase).
|
|
/// Étend [ChangeNotifier] pour que les écrans se rafraîchissent au changement.
|
|
class Reglages extends ChangeNotifier {
|
|
Reglages._();
|
|
static final Reglages instance = Reglages._();
|
|
|
|
double _eurosParPoint = Config.eurosParPointParDefaut;
|
|
String _nomMagasin = '';
|
|
|
|
/// Nombre d'euros à dépenser pour gagner 1 point.
|
|
double get eurosParPoint => _eurosParPoint;
|
|
|
|
/// Nom du magasin, affiché sur la carte / le QR du client.
|
|
String get nomMagasin => _nomMagasin;
|
|
|
|
Future<void> charger() async {
|
|
try {
|
|
final row = await supabase
|
|
.from('reglages')
|
|
.select('euros_par_point, nom_magasin')
|
|
.eq('id', 1)
|
|
.maybeSingle();
|
|
if (row != null) {
|
|
_eurosParPoint = (row['euros_par_point'] as num?)?.toDouble() ??
|
|
Config.eurosParPointParDefaut;
|
|
_nomMagasin = (row['nom_magasin'] as String?) ?? '';
|
|
notifyListeners();
|
|
}
|
|
} catch (_) {
|
|
// Réglages par défaut si non connecté / hors-ligne.
|
|
}
|
|
}
|
|
|
|
/// Points gagnés pour un montant donné, selon le ratio courant.
|
|
double pointsPour(double euros) =>
|
|
_eurosParPoint > 0 ? euros / _eurosParPoint : 0;
|
|
|
|
Future<void> definirEurosParPoint(double valeur) async {
|
|
if (valeur <= 0) return;
|
|
await supabase.from('reglages').update({'euros_par_point': valeur}).eq('id', 1);
|
|
_eurosParPoint = valeur;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> definirNomMagasin(String valeur) async {
|
|
final v = valeur.trim();
|
|
await supabase.from('reglages').update({'nom_magasin': v}).eq('id', 1);
|
|
_nomMagasin = v;
|
|
notifyListeners();
|
|
}
|
|
}
|