Hello!
J’aurais besoin d’un petit coup de main pour vérifier que je ne suis pas en train de faire des âneries et que je suis bien dans la bonne direction. Je n’atteins actuellement pas le résultat voulu mais je n’en suis pas loin.
Donc pour une Entité (un lieu, en l’occurrence), je stocke en BDD ses horaires d’ouverture / fermeture par jour. J’ai donc des entités avec des centaines d’horaires disponibles. Quand je crée l’entité, je fais évidemment preuve du plus de discernement possible pour éviter de créer des doublons ou des conflits d’horaire. Je me suis sévèrement pris la tête pour réussir à faire ce système qui est maintenant proche de "pas mal" :). Mais la mise en BDD de ces horaires n’est pas le problème sur lequel je bute. Non mon problème c’est que des fois, il est possible de créer des conflits entre deux plages horaires : soit les horaires se chevauchent, soit les horaires sont rigoureusement identiques. Je crée donc un Détecteur à Problèmes (avec Vue : du JS, quoi) qui doit se charger de régler ces conflits. Pour l’instant j’en suis à la détection, la résolution viendra quand je pourrai me fier à la détection…
J’ai donc en BDD une table avec comme champs : "id" / "activity_id" (le lieu) / "day" / "opening_time" / "closing_time". Avec Symfony 5 et Api Platform, je peux faire remonter la liste d’horaires pour un lieu donné ordonné par jour ASC puis par opening_time ASC, ce qui me donne un Array d’Objets de type {'@id': blabla, 'day’: bloblo, 'openingTime’: blibli, etc.}.
Tel que je suis parti:
checkForConflicts() {
this.searching = true;
let hours = this.items;
//On crée un espace de stockage vide
var currentDay = '',
openingHour = '',
closingHour = '',
prevItem = {};
//On commence la boucle
for (let item of hours) {
//Si l'item est le premier ou si l'item commence une nouvelle journée
//Il ne peut pas y avoir de conflit
if (item.day !== currentDay) {
currentDay = item.day;
openingHour = item.openingTime;
closingHour = item.closingTime;
prevItem = item;
} else {
//Conflit si : item.openingTime < prevItem.closingTime ou l'inverse... ?!
// C'est là que j'ai besoin d'aide, pour créer les bons embranchements !
if (item.openingTime < closingHour || openingHour > item.closingTime) {
this.conflictsCount++;
//Si ils sont rigoureusement identiques, on propose une résolution auto : suppression de l'un des deux
//On les met dans doubles[]
if (item.openingTime === openingHour && item.closingTime === closingHour) {
this.exactMatch++;
this.doubles.push({prevItem, item});
}
else {
//Sinon on les met simplement dans Problems[]
this.problems.push({prevItem, item})
}
//Item devient le prevItem : ajouté pour détecter aussi les problèmes de triple exemplaires
currentDay = item.day;
openingHour = item.openingTime;
closingHour = item.closingTime;
prevItem = item;
}
}
}//Fin de la boucle For item of hours
this.searching = false;
if (this.conflictsCount == 0) {
this.message = 'Aucun conflit détecté !';
this.youShallContinue = true;
}
else {
this.message = this.conflictsCount + ' conflit(s) détecté(s)';
this.youShallContinue = false;
//ToDo : résoudre les conflits
console.log(this.problems);
console.log(this.doubles);
}
},//Fin de CheckForConflicts
Explications :
1- je crée un espace vide pour stocker le jour du premier objet du tableau "hours"
2- je commence par comparer la valeur de "day" de l’objet à celui en mémoire.
3- si ils sont différents, il n’y a pas de conflit possible, on stocke en mémoire l’objet qui vient d’être testé, currentDay devient donc "item.day", prevItem prend les valeurs de l’item inspecté.
4- boucle suivante
5- Si c’est la même valeur pour le jour, il peut y avoir un problème, il faut donc regarder de plus près
6- si l’item suivant a rigoureusement les mêmes horaires, on stocke prevItem et item dans Doubles[] pour en supprimer un des deux ultérieurement. Cette partie a l’air de fonctionner sur les entités tests.
7- si ça se chevauche, il faut les signaler et les soumettre à l’administrateur qui éditera la paire prevItem / item selon ce qui lui semble être le mieux (il pourra aussi en supprimer un ou les deux)
Donc c’est la partie 7 qui me pose problème (à partir de la ligne 21 du code). Je m’emmêle les pinceaux et n’arrive pas à créer les embranchements intelligents nécessaires au bon fonctionnement du code.
Quelqu’un voudrait-il bien prendre le temps de réfléchir avec moi à la meilleure solution ?
Merci.