La cliente souhaite améliorer la fonctionnalité actuelle de recherche des fournisseurs en y ajoutant une option permettant d’identifier plus facilement ceux qui sont proches du point de départ d’un devis.
Actuellement, la liste des fournisseurs s’affiche avec une recherche par texte uniquement, ce qui l’oblige à estimer manuellement lesquels sont les plus proches, en se basant sur sa propre connaissance.
Le besoin exprimé consiste donc à automatiser et optimiser cette recherche, en introduisant un filtre supplémentaire : par distance (calculée à partir de la position liée au devis sélectionné).
L’objectif principal est de faire gagner du temps à la cliente en facilitant la sélection des fournisseurs.
Pour calculer la distance à vol d’oiseau, j’ai créé une fonction dans le composant
SupplierGeolocCommand, que j’ai appelée getDistanceBetweenCoords.
Pour tester si le code fonctionnait correctement côté back, j’ai exécuté la commande suivante : bin/cake project_dahan/dahan.supplier_geoloc
Cette commande a été lancée directement dans le terminal de mon generator 8.4 sur Portainer.
Pour vérifier mon calcul de distance, j’ai créé 4 variables correspondant à des latitudes et longitudes d’adresses différentes pour les test.
La fonction utilise une formule mathématique appelée formule de Haversine, qui prend en compte le tour de la Terre. Elle convertit les coordonnées en radians, puis effectue des calculs à l’aide de fonctions trigonométriques (comme le sinus et le cosinus) pour déterminer la distance entre deux points. Ensuite, elle multiplie le résultat par le rayon moyen de la Terre (environ 6371 km), ce qui donne la distance en kilomètres.
Une fois le code fonctionnel, je l'ai copier/coller dans mon composant SupplierGeoloc à la suite de mes 2 fonctions Geoloc et GetCoordinatesFromAdress.
Au début de la tâche, je me suis appuyée sur le code existant utilisé pour la recherche par texte, que j’ai ensuite adapté à mon nouveau champ de recherche par distance. Ce code est actuellement mis en commentaire, car une version améliorée a été développée par la suite.
Côté front, j'ai simplement ajouter le champs à la suite de celui de la recherche dans le composant FolderOrderSupplierSelection
Avant amélioration, chaque champ de recherche comportait une balise <IconButton> contenant une balise <SearchIcon>, représentant une icône de loupe.
Pour le champ de recherche par distance, j’avais associé la fonction SearchDistanceEvent à l’icône lors du clic. Par la suite il sera retiré.
Une requête distincte avait également été créée pour la recherche par distance, car initialement, les recherches par texte et par distance étaient envoyées séparément.
Suite au retour de mon tuteur, j’ai dû optimiser mon code et le rendre moins lourd. Cela m’a permis de réaliser que les requêtes pour la recherche par texte et par distance étaient en réalité similaires. J’ai donc modifié la requête existante pour y intégrer la recherche par distance, au lieu d’en utiliser deux séparées. Cette optimisation a été mise en œuvre dans la partie suivante du code :

Puis j'ai aussi réunit la logique du côté controller en réunissant tout dans la fonction search-supplier dans le composant FolderOrderSupplierController :
Concernant le traitement de la réponse de la requête en front, nous avons également utilisé une logique de réponse regroupée :

À la suite de cela, il a fallu ajouter un dernier filtre pour les fournisseurs : le nombre de places disponibles.
En effet, selon la demande et le nombre de personnes à prévoir, il est important de connaître à l'avance quel fournisseur est le plus proche et dispose du nombre de places suffisant.
Pour intégrer ce filtre, j’ai dû modifier la logique des fonctions searchSupplier et searchInfosSupplier afin d’ajouter ce nouveau champ de recherche.
Requête modifiée avec l'ajout du nombre de place en plus dans la requête
Cette tâche m’a permis de renforcer mes compétences en gestion de requêtes, en manipulation de données dans une base ainsi qu’en intégration front-end / back-end.
Mais surtout dans l'organisation et la mise en place de toute cette logique de code qui n'était pas facile.