Files
TravelMate/lib/services/trip_end_service.dart

56 lines
2.1 KiB
Dart

import 'package:shared_preferences/shared_preferences.dart';
import '../models/trip.dart';
import '../repositories/account_repository.dart';
import '../repositories/balance_repository.dart';
import '../repositories/expense_repository.dart';
import 'logger_service.dart';
/// Service qui détecte les voyages terminés et vérifie si les comptes sont réglés.
class TripEndService {
static const String _prefixKey = 'trip_end_prompted_';
final AccountRepository _accountRepository;
final BalanceRepository _balanceRepository;
TripEndService()
: _accountRepository = AccountRepository(),
_balanceRepository = BalanceRepository(
expenseRepository: ExpenseRepository(),
);
/// Retourne les voyages terminés pour lesquels l'utilisateur n'a pas encore été invité à supprimer.
Future<List<Trip>> getFinishedTripsNotYetPrompted(List<Trip> trips) async {
final now = DateTime.now();
final prefs = await SharedPreferences.getInstance();
return trips.where((trip) {
if (trip.id == null) return false;
final isFinished = trip.endDate.isBefore(now);
final alreadyPrompted = prefs.getBool('$_prefixKey${trip.id}') ?? false;
return isFinished && !alreadyPrompted;
}).toList();
}
/// Marque un voyage comme déjà invité (ne plus afficher le dialog).
Future<void> markTripAsPrompted(String tripId) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('$_prefixKey$tripId', true);
}
/// Vérifie si tous les comptes du voyage sont réglés.
///
/// Retourne `true` si aucune dépense n'est enregistrée ou si tous les soldes sont nuls.
Future<bool> areAccountsSettled(String tripId) async {
try {
final account = await _accountRepository.getAccountByTripId(tripId);
if (account == null) return true;
final balance = await _balanceRepository.calculateGroupBalance(account.id);
return balance.settlements.isEmpty;
} catch (e) {
LoggerService.error('TripEndService: Erreur vérification comptes: $e');
return true;
}
}
}