56 lines
2.1 KiB
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;
|
|
}
|
|
}
|
|
}
|