Files
EM2_ERP/em2rp/lib/services/container_service.dart
T

258 lines
7.7 KiB
Dart

import 'package:em2rp/models/container_model.dart';
import 'package:em2rp/models/equipment_model.dart';
import 'package:em2rp/services/api_service.dart';
import 'package:em2rp/services/data_service.dart';
class ContainerService {
final ApiService _apiService = apiService;
final DataService _dataService = DataService(apiService);
// ============================================================================
// CRUD Operations - Utilise le backend sécurisé
// ============================================================================
/// Créer un nouveau container (via Cloud Function)
Future<void> createContainer(ContainerModel container) async {
try {
await _apiService.call('createContainer', container.toMap()..['id'] = container.id);
} catch (e) {
print('Error creating container: $e');
rethrow;
}
}
/// Mettre à jour un container (via Cloud Function)
Future<void> updateContainer(String id, Map<String, dynamic> data) async {
try {
await _apiService.call('updateContainer', {
'containerId': id,
'data': data,
});
} catch (e) {
print('Error updating container: $e');
rethrow;
}
}
/// Supprimer un container (via Cloud Function)
Future<void> deleteContainer(String id) async {
try {
await _apiService.call('deleteContainer', {'containerId': id});
// Note: La Cloud Function gère maintenant la mise à jour des équipements
} catch (e) {
print('Error deleting container: $e');
rethrow;
}
}
/// Récupérer un container par ID
Future<ContainerModel?> getContainerById(String id) async {
try {
final containersData = await _dataService.getContainersByIds([id]);
if (containersData.isEmpty) return null;
return ContainerModel.fromMap(containersData.first, id);
} catch (e) {
print('Error getting container: $e');
rethrow;
}
}
/// Récupérer tous les containers
Future<List<ContainerModel>> getContainers({
ContainerType? type,
EquipmentStatus? status,
String? searchQuery,
}) async {
try {
final containersData = await _dataService.getContainers();
var containerList = containersData
.map((data) => ContainerModel.fromMap(data, data['id'] as String))
.toList();
// Filtres côté client
if (type != null) {
containerList = containerList
.where((c) => c.type == type)
.toList();
}
if (status != null) {
containerList = containerList
.where((c) => c.status == status)
.toList();
}
if (searchQuery != null && searchQuery.isNotEmpty) {
final lowerSearch = searchQuery.toLowerCase();
containerList = containerList.where((container) {
return container.name.toLowerCase().contains(lowerSearch) ||
container.id.toLowerCase().contains(lowerSearch);
}).toList();
}
return containerList;
} catch (e) {
print('Error getting containers: $e');
rethrow;
}
}
/// Ajouter un équipement à un container
Future<Map<String, dynamic>> addEquipmentToContainer({
required String containerId,
required String equipmentId,
String? userId,
}) async {
try {
final response = await _apiService.call('addEquipmentToContainer', {
'containerId': containerId,
'equipmentId': equipmentId,
if (userId != null) 'userId': userId,
});
return {
'success': response['success'] ?? false,
'message': response['message'] ?? '',
'warnings': response['warnings'],
};
} catch (e) {
print('Error adding equipment to container: $e');
return {'success': false, 'message': 'Erreur: $e'};
}
}
/// Retirer un équipement d'un container
Future<void> removeEquipmentFromContainer({
required String containerId,
required String equipmentId,
String? userId,
}) async {
try {
await _apiService.call('removeEquipmentFromContainer', {
'containerId': containerId,
'equipmentId': equipmentId,
if (userId != null) 'userId': userId,
});
} catch (e) {
print('Error removing equipment from container: $e');
rethrow;
}
}
Future<Map<String, dynamic>> checkContainerAvailability({
required String containerId,
required DateTime startDate,
required DateTime endDate,
String? excludeEventId,
}) async {
try {
final result = await _dataService.checkContainerAvailability(
containerId: containerId,
startDate: startDate,
endDate: endDate,
excludeEventId: excludeEventId,
);
return {
'available': result['isAvailable'] ?? false,
'message': result['isAvailable'] == true
? 'Container et tout son contenu disponibles'
: 'Container non disponible ou en conflit',
'conflictType': result['conflictType'],
'containerConflicts': result['containerConflicts'],
'equipmentConflicts': result['equipmentConflicts'],
};
} catch (e) {
print('Error checking container availability: $e');
return {'available': false, 'message': 'Erreur: $e'};
}
}
/// Récupérer les équipements d'un container
Future<List<EquipmentModel>> getContainerEquipment(String containerId) async {
try {
final container = await getContainerById(containerId);
if (container == null) return [];
if (container.equipmentIds.isEmpty) return [];
final equipmentsData = await _dataService.getEquipmentsByIds(container.equipmentIds);
return equipmentsData
.map((data) {
final id = data['id'] as String;
return EquipmentModel.fromMap(data, id);
})
.toList();
} catch (e) {
print('Error getting container equipment: $e');
rethrow;
}
}
/// Trouver tous les containers contenant un équipement spécifique
Future<List<ContainerModel>> findContainersWithEquipment(String equipmentId) async {
try {
final containersData = await _dataService.getContainersByEquipment(equipmentId);
return containersData
.map((data) => ContainerModel.fromMap(data, data['id'] as String))
.toList();
} catch (e) {
print('Error finding containers with equipment: $e');
rethrow;
}
}
/// Ajouter une entrée d'historique
Future<void> _addHistoryEntry({
required String containerId,
required String action,
String? equipmentId,
String? previousValue,
String? newValue,
String? userId,
}) async {
try {
final container = await getContainerById(containerId);
if (container == null) return;
final entry = ContainerHistoryEntry(
timestamp: DateTime.now(),
action: action,
equipmentId: equipmentId,
previousValue: previousValue,
newValue: newValue,
userId: userId,
);
final updatedHistory = [...container.history, entry];
// Limiter l'historique aux 100 dernières entrées
final limitedHistory = updatedHistory.length > 100
? updatedHistory.sublist(updatedHistory.length - 100)
: updatedHistory;
await updateContainer(containerId, {
'history': limitedHistory.map((e) => e.toMap()).toList(),
});
} catch (e) {
print('Error adding history entry: $e');
// Ne pas throw pour éviter de bloquer l'opération principale
}
}
/// Vérifier si un ID de container existe déjà
Future<bool> checkContainerIdExists(String id) async {
try {
final container = await getContainerById(id);
return container != null;
} catch (e) {
print('Error checking container ID: $e');
return false;
}
}
}