Fix : écran d'ajout de materiel, correction des conflits pour les cables et consommables

This commit is contained in:
ElPoyo
2026-01-13 18:50:46 +01:00
parent 272b4bc9c9
commit 4545bdba81
2 changed files with 403 additions and 138 deletions

View File

@@ -2021,10 +2021,23 @@ exports.getConflictingEquipmentIds = onRequest(httpOptions, withCors(async (req,
logger.info(`Found ${eventsSnapshot.docs.length} events to check`);
// Récupérer tous les équipements pour savoir lesquels sont quantifiables
const equipmentsSnapshot = await db.collection('equipments').get();
const equipmentsInfo = {};
equipmentsSnapshot.docs.forEach(doc => {
const data = doc.data();
equipmentsInfo[doc.id] = {
category: data.category,
totalQuantity: data.totalQuantity || 0,
hasQuantity: data.category === 'CABLE' || data.category === 'CONSUMABLE'
};
});
// Maps pour stocker les conflits
const conflictingEquipmentIds = new Set();
const conflictingContainerIds = new Set();
const conflictDetails = {}; // { equipmentId/containerId: [{ eventId, eventName, startDate, endDate }] }
const conflictDetails = {}; // { equipmentId/containerId: [{ eventId, eventName, startDate, endDate, quantity }] }
const equipmentQuantities = {}; // { equipmentId: { totalQuantity, reservedQuantity, availableQuantity, reservations: [...] } }
for (const eventDoc of eventsSnapshot.docs) {
// Exclure l'événement en cours d'édition
@@ -2078,12 +2091,46 @@ exports.getConflictingEquipmentIds = onRequest(httpOptions, withCors(async (req,
// Ajouter les équipements directement assignés
for (const eq of assignedEquipment) {
const equipmentId = eq.equipmentId;
conflictingEquipmentIds.add(equipmentId);
const quantity = eq.quantity || 1;
const equipInfo = equipmentsInfo[equipmentId];
// Pour les équipements quantifiables, on ne les marque pas forcément comme "en conflit"
// On calcule juste les quantités réservées
if (equipInfo && equipInfo.hasQuantity) {
// Initialiser les infos de quantité si nécessaire
if (!equipmentQuantities[equipmentId]) {
equipmentQuantities[equipmentId] = {
totalQuantity: equipInfo.totalQuantity,
reservedQuantity: 0,
availableQuantity: equipInfo.totalQuantity,
reservations: []
};
}
// Ajouter la réservation
equipmentQuantities[equipmentId].reservedQuantity += quantity;
equipmentQuantities[equipmentId].availableQuantity = equipInfo.totalQuantity - equipmentQuantities[equipmentId].reservedQuantity;
equipmentQuantities[equipmentId].reservations.push({
...conflictInfo,
quantity: quantity
});
// Ne marquer comme "en conflit" que si la quantité totale est épuisée
if (equipmentQuantities[equipmentId].availableQuantity <= 0) {
conflictingEquipmentIds.add(equipmentId);
}
} else {
// Pour les équipements non quantifiables, comportement classique
conflictingEquipmentIds.add(equipmentId);
}
if (!conflictDetails[equipmentId]) {
conflictDetails[equipmentId] = [];
}
conflictDetails[equipmentId].push(conflictInfo);
conflictDetails[equipmentId].push({
...conflictInfo,
quantity: quantity
});
}
// Ajouter les conteneurs assignés
@@ -2125,6 +2172,7 @@ exports.getConflictingEquipmentIds = onRequest(httpOptions, withCors(async (req,
conflictingEquipmentIds: Array.from(conflictingEquipmentIds),
conflictingContainerIds: Array.from(conflictingContainerIds),
conflictDetails: conflictDetails,
equipmentQuantities: equipmentQuantities, // NOUVEAU : Informations sur les quantités
});
} catch (error) {
logger.error("Error getting conflicting equipment IDs:", error);