feat: Add TripEndService to manage finished trips and prompt for deletion
This commit is contained in:
55
lib/services/trip_end_service.dart
Normal file
55
lib/services/trip_end_service.dart
Normal file
@@ -0,0 +1,55 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user