feat: Refonte de la checklist de préparation avec gestion des manquants et des containers

Cette mise à jour refond entièrement l'interface et la logique de la checklist de préparation d'événement. Elle introduit la notion d'équipements "manquants", une gestion visuelle des containers et de leur contenu, et une logique plus fine pour le suivi des quantités et des statuts à chaque étape.

**Features et Améliorations :**

-   **Gestion des Équipements Manquants :**
    -   Le modèle `EventEquipment` a été enrichi pour tracer si un équipement est manquant à chaque étape (`isMissingAtPreparation`, `isMissingAtLoading`, etc.).
    -   Un équipement non validé lors de la confirmation d'une étape est désormais marqué comme "manquant" pour les étapes suivantes.
    -   Les équipements qui étaient manquants à l'étape précédente sont maintenant visuellement mis en évidence avec une bordure et une icône orange, et une confirmation est demandée pour les valider.

-   **Refonte de la Checklist (UI/UX) :**
    -   **Groupement par Container :** La checklist affiche désormais les containers comme des en-têtes de groupe. Les équipements qu'ils contiennent sont listés en dessous, avec une indentation visuelle.
    -   **Validation Groupée :** Il est possible de valider tous les équipements d'un container en un seul clic sur l'en-tête du container.
    -   **Nouveau Widget `ContainerChecklistItem` :** Créé pour afficher un container et ses équipements enfants dans la checklist.
    -   **Refonte de `EquipmentChecklistItem` :** Le widget a été entièrement revu pour un design plus clair, une meilleure gestion des états (validé, manquant), et un affichage compact pour les équipements enfants.

-   **Logique de Suivi Améliorée :**
    -   **Quantités par Étape :** Le modèle `EventEquipment` et l'interface de préparation permettent maintenant de suivre les quantités réelles à chaque étape (`quantityAtPreparation`, `quantityAtLoading`, etc.), au lieu d'une seule quantité de retour.
    -   **Marquage Automatique des "Perdus" :** À l'étape finale du retour, un équipement qui était présent au départ mais qui est maintenant manquant sera automatiquement marqué avec le statut "lost" dans la base de données.
    -   **Flux de Validation :** Le processus de confirmation distingue désormais la validation de tous les équipements et la confirmation de l'état actuel (y compris les manquants).

-   **Export ICS Enrichi :**
    -   L'export ICS inclut désormais les noms résolus des utilisateurs (main d'œuvre) pour plus de clarté, en plus des détails de l'événement.
    -   Le contenu généré mentionne la version de l'application.
This commit is contained in:
ElPoyo
2026-01-15 12:05:37 +01:00
parent b30ae0f10a
commit 60d0e1c6c4
10 changed files with 885 additions and 336 deletions

View File

@@ -173,12 +173,23 @@ ReturnStatus returnStatusFromString(String? status) {
class EventEquipment {
final String equipmentId; // ID de l'équipement
final int quantity; // Quantité (pour consommables)
final int quantity; // Quantité initiale assignée
final bool isPrepared; // Validé en préparation
final bool isLoaded; // Validé au chargement
final bool isUnloaded; // Validé au déchargement
final bool isReturned; // Validé au retour
final int? returnedQuantity; // Quantité retournée (pour consommables)
// Tracking des manquants à chaque étape
final bool isMissingAtPreparation; // Manquant à la préparation
final bool isMissingAtLoading; // Manquant au chargement
final bool isMissingAtUnloading; // Manquant au déchargement
final bool isMissingAtReturn; // Manquant au retour
// Quantités réelles à chaque étape (pour les quantifiables)
final int? quantityAtPreparation; // Quantité comptée en préparation
final int? quantityAtLoading; // Quantité comptée au chargement
final int? quantityAtUnloading; // Quantité comptée au déchargement
final int? quantityAtReturn; // Quantité retournée
EventEquipment({
required this.equipmentId,
@@ -187,7 +198,14 @@ class EventEquipment {
this.isLoaded = false,
this.isUnloaded = false,
this.isReturned = false,
this.returnedQuantity,
this.isMissingAtPreparation = false,
this.isMissingAtLoading = false,
this.isMissingAtUnloading = false,
this.isMissingAtReturn = false,
this.quantityAtPreparation,
this.quantityAtLoading,
this.quantityAtUnloading,
this.quantityAtReturn,
});
factory EventEquipment.fromMap(Map<String, dynamic> map) {
@@ -198,7 +216,14 @@ class EventEquipment {
isLoaded: map['isLoaded'] ?? false,
isUnloaded: map['isUnloaded'] ?? false,
isReturned: map['isReturned'] ?? false,
returnedQuantity: map['returnedQuantity'],
isMissingAtPreparation: map['isMissingAtPreparation'] ?? false,
isMissingAtLoading: map['isMissingAtLoading'] ?? false,
isMissingAtUnloading: map['isMissingAtUnloading'] ?? false,
isMissingAtReturn: map['isMissingAtReturn'] ?? false,
quantityAtPreparation: map['quantityAtPreparation'],
quantityAtLoading: map['quantityAtLoading'],
quantityAtUnloading: map['quantityAtUnloading'],
quantityAtReturn: map['quantityAtReturn'],
);
}
@@ -210,7 +235,14 @@ class EventEquipment {
'isLoaded': isLoaded,
'isUnloaded': isUnloaded,
'isReturned': isReturned,
'returnedQuantity': returnedQuantity,
'isMissingAtPreparation': isMissingAtPreparation,
'isMissingAtLoading': isMissingAtLoading,
'isMissingAtUnloading': isMissingAtUnloading,
'isMissingAtReturn': isMissingAtReturn,
'quantityAtPreparation': quantityAtPreparation,
'quantityAtLoading': quantityAtLoading,
'quantityAtUnloading': quantityAtUnloading,
'quantityAtReturn': quantityAtReturn,
};
}
@@ -221,7 +253,14 @@ class EventEquipment {
bool? isLoaded,
bool? isUnloaded,
bool? isReturned,
int? returnedQuantity,
bool? isMissingAtPreparation,
bool? isMissingAtLoading,
bool? isMissingAtUnloading,
bool? isMissingAtReturn,
int? quantityAtPreparation,
int? quantityAtLoading,
int? quantityAtUnloading,
int? quantityAtReturn,
}) {
return EventEquipment(
equipmentId: equipmentId ?? this.equipmentId,
@@ -230,7 +269,14 @@ class EventEquipment {
isLoaded: isLoaded ?? this.isLoaded,
isUnloaded: isUnloaded ?? this.isUnloaded,
isReturned: isReturned ?? this.isReturned,
returnedQuantity: returnedQuantity ?? this.returnedQuantity,
isMissingAtPreparation: isMissingAtPreparation ?? this.isMissingAtPreparation,
isMissingAtLoading: isMissingAtLoading ?? this.isMissingAtLoading,
isMissingAtUnloading: isMissingAtUnloading ?? this.isMissingAtUnloading,
isMissingAtReturn: isMissingAtReturn ?? this.isMissingAtReturn,
quantityAtPreparation: quantityAtPreparation ?? this.quantityAtPreparation,
quantityAtLoading: quantityAtLoading ?? this.quantityAtLoading,
quantityAtUnloading: quantityAtUnloading ?? this.quantityAtUnloading,
quantityAtReturn: quantityAtReturn ?? this.quantityAtReturn,
);
}
}