feat: Mise à jour à la version 1.1.20 et amélioration de la recherche d'équipements
- Mise à jour de la version de l'application à `1.1.20` dans `app_version.dart`, `version.json` et `CHANGELOG.md`.
- Optimisation de la fonction Cloud `getEquipmentsPaginated` pour supporter la recherche par ID exact (document ID ou ID legacy) et améliorer la recherche textuelle avec filtrage par lots.
- Amélioration de la gestion des alertes dans `processEquipmentValidation.js` :
- Ajout d'un statut `NOT_TAKEN` pour éviter les fausses alertes d'équipements perdus s'ils n'ont jamais été emportés.
- Refonte complète du parsing des dates Firestore pour une meilleure robustesse dans les alertes.
- Correction de la validation des quantités (vérification du type `number`).
- Ajout de méthodes statiques dans `EventPreparationService` (`shouldMarkEquipmentAsLost`, `isEquipmentNotTakenToEvent`) pour centraliser la logique de détermination du statut des équipements au retour.
- Mise à jour de `EventPreparationPage` pour intégrer le nouveau statut `NOT_TAKEN` et utiliser la logique centralisée du service de préparation.
- Mise à jour des fichiers de cache Firebase Hosting.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/// Configuration de la version de l'application
|
||||
class AppVersion {
|
||||
static const String version = '1.1.19';
|
||||
static const String version = '1.1.20';
|
||||
|
||||
/// Retourne la version complète de l'application
|
||||
static String get fullVersion => 'v$version';
|
||||
|
||||
@@ -4,6 +4,44 @@ import 'package:em2rp/services/api_service.dart';
|
||||
class EventPreparationService {
|
||||
final ApiService _apiService = apiService;
|
||||
|
||||
/// Retourne true si l'équipement était absent du flux événementiel.
|
||||
///
|
||||
/// Cas typique: matériel jamais emporté au départ, donc absent au retour,
|
||||
/// mais qui ne doit jamais être classé en [LOST].
|
||||
static bool isEquipmentNotTakenToEvent({
|
||||
required bool isMissingAtReturn,
|
||||
required bool isLoaded,
|
||||
required bool isMissingAtLoading,
|
||||
int? quantityAtLoading,
|
||||
}) {
|
||||
if (!isMissingAtReturn) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final loadedQuantity = quantityAtLoading ?? 0;
|
||||
return !isLoaded || isMissingAtLoading || loadedQuantity <= 0;
|
||||
}
|
||||
|
||||
/// Retourne true uniquement si l'équipement doit être classé perdu.
|
||||
static bool shouldMarkEquipmentAsLost({
|
||||
required bool isReturnValidationStep,
|
||||
required bool isMissingAtReturn,
|
||||
required bool isLoaded,
|
||||
required bool isMissingAtLoading,
|
||||
int? quantityAtLoading,
|
||||
}) {
|
||||
if (!isReturnValidationStep || !isMissingAtReturn) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return !isEquipmentNotTakenToEvent(
|
||||
isMissingAtReturn: isMissingAtReturn,
|
||||
isLoaded: isLoaded,
|
||||
isMissingAtLoading: isMissingAtLoading,
|
||||
quantityAtLoading: quantityAtLoading,
|
||||
);
|
||||
}
|
||||
|
||||
// === PRÉPARATION ===
|
||||
|
||||
/// Valider un équipement individuel en préparation
|
||||
|
||||
@@ -13,6 +13,7 @@ import 'package:em2rp/services/qr_code_processing_service.dart';
|
||||
import 'package:em2rp/services/audio_feedback_service.dart';
|
||||
import 'package:em2rp/services/smart_text_to_speech_service.dart';
|
||||
import 'package:em2rp/services/equipment_service.dart';
|
||||
import 'package:em2rp/services/event_preparation_service.dart';
|
||||
import 'package:em2rp/views/widgets/equipment/equipment_checklist_item.dart' show EquipmentChecklistItem, ChecklistStep;
|
||||
import 'package:em2rp/views/widgets/equipment/container_checklist_item.dart';
|
||||
import 'package:em2rp/views/widgets/common/qr_code_scanner_dialog.dart';
|
||||
@@ -1097,6 +1098,10 @@ class _EventPreparationPageState extends State<EventPreparationPage> with Single
|
||||
|
||||
/// Détermine le statut d'un équipement selon l'étape actuelle
|
||||
String _determineEquipmentStatus(EventEquipment eq) {
|
||||
if (_isNotTakenToEventAtReturn(eq)) {
|
||||
return 'NOT_TAKEN';
|
||||
}
|
||||
|
||||
// Vérifier d'abord si l'équipement est perdu (LOST)
|
||||
if (_shouldMarkAsLost(eq)) {
|
||||
return 'LOST';
|
||||
@@ -1118,14 +1123,31 @@ class _EventPreparationPageState extends State<EventPreparationPage> with Single
|
||||
|
||||
/// Vérifie si un équipement doit être marqué comme LOST
|
||||
bool _shouldMarkAsLost(EventEquipment eq) {
|
||||
// Seulement aux étapes de retour
|
||||
if (_currentStep != PreparationStep.return_ &&
|
||||
!(_currentStep == PreparationStep.unloadingReturn && _loadSimultaneously)) {
|
||||
return EventPreparationService.shouldMarkEquipmentAsLost(
|
||||
isReturnValidationStep: _isReturnValidationStep,
|
||||
isMissingAtReturn: eq.isMissingAtReturn,
|
||||
isLoaded: eq.isLoaded,
|
||||
isMissingAtLoading: eq.isMissingAtLoading,
|
||||
quantityAtLoading: eq.quantityAtLoading,
|
||||
);
|
||||
}
|
||||
|
||||
bool _isNotTakenToEventAtReturn(EventEquipment eq) {
|
||||
if (!_isReturnValidationStep) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Si manquant maintenant mais PAS manquant à la préparation = LOST
|
||||
return eq.isMissingAtReturn && !eq.isMissingAtPreparation;
|
||||
return EventPreparationService.isEquipmentNotTakenToEvent(
|
||||
isMissingAtReturn: eq.isMissingAtReturn,
|
||||
isLoaded: eq.isLoaded,
|
||||
isMissingAtLoading: eq.isMissingAtLoading,
|
||||
quantityAtLoading: eq.quantityAtLoading,
|
||||
);
|
||||
}
|
||||
|
||||
bool get _isReturnValidationStep {
|
||||
return _currentStep == PreparationStep.return_ ||
|
||||
(_currentStep == PreparationStep.unloadingReturn && _loadSimultaneously);
|
||||
}
|
||||
|
||||
/// Vérifie si un équipement est manquant à l'étape actuelle
|
||||
|
||||
Reference in New Issue
Block a user