Ceci est le premier billet de ce que j’espère pouvoir transformer en série. Je n’aurai pas de rythme de publication régulier, et peut-être que ce ne sera pas dans l’ordre chronologique, des fois que je me souviendrais de vieux trucs qui m’ont pris la tête.
Je ne pense pas devoir expliquer la première partie du titre, dois-je ? 🐼💫
Récemment, j’ai eu la mission d’implémenter une fonctionnalité basée sur un besoin simple. Evidemment, si la simplicité du besoin impliquait celle des contraintes, ça se saurait…
Je souhaitais donc vous faire part d’une expérience dans la réalisation d’une fonctionnalité qui, personne ne devrait être surpris, s’est révélée bien plus complexe qu’imaginé par bien des acteurs autour du projet.
Je travaille actuellement dans une entreprise qui gère des compétitions sportives, notamment certaines qui regroupent des associations "subordonnées". Ces événements impliquent des frais qui, jusqu’à récemment, étaient réglés en liquide à l’arrivée sur les lieux. Seulement, cela faisait de grosses sommes. Comme une partie des contraintes implique des paiements qui eux sont possibles en ligne, il était naturel de continuer en proposant de régler ces frais d’hébergement de manière électronique aussi. On a le barème, il y a une logique, donc c’est simple à mettre en place.
Normalement.
Les contraintes "discutées"
Chaque événement peut concerner plusieurs styles pour le sport, et aussi plusieurs classes d’âge. Afin d’éviter certains déséquilibres, le nombre d’entraîneurs, de médecins et de stratèges est lié au nombre de sportifs par style et par classe d’âge, et par association. Evidemment, il y a aussi des personnes qui ne viennent pas pour participer à la compétition, comme le président de l’association entre autres. De plus, comme il s’agit de sport, il faut aussi des arbitres ou des juges.
Toutes ces personnes doivent donc régler les frais d’hébergement. Si certaines personnes paient des tarifs bien définis, l’élément qui complique d’autant la chose ici, c’est qu’il y a d’une part ce que je vais appeler des quotas, qui sont déterminés notamment par le nombre de sportifs, et qui n’est pas la même chose que ce que je vais appeler des limites, qui sont fixées dans l’absolu. Ces quotas déterminent le tarif journalier qui sera appliqué à la personne : pour un certain nombre de sportifs dans un style, il y a un certain quota d’entraîneurs qui paieront le tarif normal, mais tant que la limite n’est pas atteinte, il peut y avoir d’autres entraîneurs qui, du coup, paieront un tarif plus élevé du fait d’être hors-quota.
Il est évident que les frais vont aussi dépendre de la durée du séjour. Mais là aussi, il y a une subtilité : l’organisateur n’est pas tenu de fournir un hébergement avant ou après l’événement. C’est proposé, mais du coup les personnes qui en profiteraient vont payer de toute manière le tarif plus élevé pour les quelques jours supplémentaires. Et là encore il y a un détail.
Dans certains cas (souvent lors d’événements qui regroupent le plus de monde), les associations se retrouvent en congrès pour discuter de diverses choses en relation avec le sport. Tout le monde n’y participe pas (maximum 3 membres par association), mais si ce congrès est en dehors des dates de l’événement, les personnes qui y participent ne vont pas payer le tarif le plus élevé pour la période du congrès. Prenons l’exemple du président qui se rend au congrès, lequel a lieu deux jours avant le début de la compétition : au lieu de payer deux jours au tarif fort et le reste au tarif normal, l’entier lui sera facturé au tarif normal.
Une récapitulation s’impose. Le tarif journalier dépend :
- du rôle de la personne
- du style sportif
- de la classe d’âge
- du nombre d’athlètes pour la paire style/classe d’âge
- de la date d’arrivée
- de la date de départ
- de la présence ou non au congrès
Et évidemment tout ça par association prenant part à l’événement.
Viennent ensuite les inscriptions proprement dites, où une personne est enregistrée comme participant à l’événement, en renseignant ses dates d’arrivée et de départ. Les associations ont la possibilité de créer des groupes, ce qui permet à l’organisateur de prévoir des transports depuis les aéroports, gares ferroviaires ou routières pour amener les participants à l’hôtel, avec crochet au bureau d’accréditation. Car oui, les personnes inscrites à l’événement on droit à un badge/carte/truc officiel qui permet le contrôle d’accès aux diverses zones. Les personnes n’ayant pas réglé leurs frais d’hébergement n’ont pas droit à leur accréditation.
Ça, c’est la base sur laquelle tout le monde était d’accord de travailler. Maintenant viennent les "à-côtés".
Ah, avant cela, un mot rapide sur l’environnement, parce que ça va être demandé : l’application utilise Symfony 2.8 et date de quatre ans en arrière. Certaines dépendances sont actuellement figées à une version particulière, ce qui ne facilite pas la mise à jour — tout au plus le projet arrive de la version 2.7 du framework —, mais une migration vers Symfony 4 est prévue.
Les contraintes découvertes
Je souhaite préciser que les frais d’hébergement ne sont pas directement à la charge des membres des associations, mais facturés à l’association elle-même. Du coup, il n’est pas vraiment possible de faire payer l’entier des frais d’hébergement d’une association en une seule fois. Votre carte de crédit ne vous permet probablement pas de dépasser un certain palier, or avec les frais d’hébergement, il est vite atteint (on dépasse bien souvent les 30 000 CHF).
D’autre part, du moment qu’on propose de régler ces frais en ligne, on ne peut pas vraiment forcer à le faire à un moment ou un autre. Ainsi, il doit être possible de payer petit à petit, au gré des inscriptions.
Autre élément perturbateur : les dates d’arrivée et de départ des personnes sont liées aux transports (i.-e. la date d’arrivée d’un vol détermine la date d’arrivée d’un participant arrivant avec ce vol — et pas l’inverse). Et pour ça, il n’y a pas de date limite pour les saisir ni même les modifier.
Historiquement, les associations ont toujours eu des dates butoir pour les inscriptions. Mais le milieu sportif est un milieu éminemment politique : il n’est donc pas rare que les inscriptions soient modifiés après la date limite, ne serait-ce que parce qu’une association souhaite ajouter encore une personne. Pour ne pas simplifier, il arrive encore qu’une personne soit inscrite le jour-même de son arrivée à l’événement.
Imaginons maintenant qu’un peu moins d’un mois avant le début de la compétition, le tour-opérateur d’une association trouve un moyen de transport moins cher, à une autre date. Il modifie donc le groupe correspondant, ce qui modifie les dates des membres du groupe.
Ou encore : le cas d’une association qui sait d’avance qui seront les entraîneurs envoyés à l’événement. Tout heureux de savoir déjà ça, quelqu’un de l’association va être chargé de les inscrire, et histoire de pouvoir mettre ça complètement derrière lui, va payer dès inscription les frais d’hébergement pour les entraîneurs.
Autre cas possible : une association se rend compte après délai qu’ils n’ont pas inscrit un sportif. Histoire d’être sympa, le comité d’organisation accepte la participation.
Vous voyez ce que ces trois points ont en commun ? Oui, ils influent sur la facture totale pour l’association. Pire : les deux derniers cas influent sur le tarif de certaines personnes.
En effet, les quelques entraîneurs ne peuvent pas être facturés au tarif normal, vu qu’aucun sportif n’a été enregistré. Au mieux, on sait qu’il y en aura au moins un, mais pour les autres ? Quant au sportif ajouté hors délai, cela peut impacter au moins une personne, mais au pire une par rôle qui est dépendant d’un style et d’une classe d’âge. La différence n’est pas totalement négligeable…
Je vous avais dit que le milieu sportif était éminemment politique ? Les règles énoncées sont les règles "par défaut", l’organisateur peut en modifier une partie s’il le souhaite et que c’est accepté…
Ce qui a été mis en place
Heureusement pour moi, la seule modification apportée aux règles pré-établies et qui m’ait concerné a été de faire en sorte que, pour le cas des personnes se rendant au congrès, l’entier du séjour soit au tarif normal. Incidemment, cela a quelque peu simplifié l’algorithme.
Au final, la solution a été de facturer en prenant les limites pour calculer les quotas. Ainsi, il n’y a pas lieu à des litiges pour des remboursements (ce qui faisait cauchemarder d’avance la comptabilité), mais en revanche on peut facturer des suppléments une fois que la compétition a commencé, seul moment où les saisies sont suffisamment stables.
Pour éviter que certaines inscriptions soient facturés à double, elles passent par trois statuts. A toute modification d’une inscription, ce statut est revérifié en fonction des paramètres listés précédemment, mais aussi en prenant compte des montants déjà réglés pour l’inscription. Si la personne reste un jour de plus, elle va être marquée comme étant à facturer vu qu’elle doit un jour supplémentaire. Si l’inscription avait été saisie pour le mauvais rôle, la personne doit payer la différence entre tarif normal et tarif plus élevé le cas échéant. Si un athlète est désinscrit et que le quota pour un rôle dépendant du sport et de la catégorie d’âge dans laquelle l’athlète était inscrit change, un des inscrits pour le rôle sera facturé pour le supplément.
A l’inverse, il a été décidé que rien ne serait remboursé, surtout après la date des inscriptions définitives. C’est le même principe que lorsque vous achetez un billet pour un concert : si vous vous cassez la jambe et ne pouvez pas vous y rendre, il ne vous sera pas remboursé. D’autre part, il faut bien se rendre compte que la réservation des hôtels implique des délais, avec des pénalités en cas de modification. Tout ceci implique qu’une personne qui passe du tarif plein pot au tarif normal, si elle avait déjà réglé ses frais, ne sera pas refacturée, mais rien ne lui sera remboursé non plus. Pareil pour une personne qui écourterait son séjour. Du coup, mieux vaut « passer le billet à quelqu’un d’autre », ce qui est de toute manière possible pour les sportifs malheureux qui se blesseraient lors des entraînements avant l’événement.
Le fruit de mon travail est en ligne et a été utilisé pour un gros événement mi-octobre où il est venu près de 2000 personnes pour lesquelles les frais d’hébergement ont été collectés par nos soins. Le montant total des factures est un nombre à sept chiffres, et a été complètement recouvré.
Pour diverses raisons, la comptabilité a repris toutes les factures une à une pour toutes les associations — la raison principale est de pouvoir regrouper les petites factures par-ci par-là en une seule. Verdict : la différence globale entre les factures recalculées et celles générées par mon algorithme est de moins de 2%.
Une part s’explique par le fait que le calcul par la comptabilité a été fait avec les règles "strictes", comme si les données étaient définitives, et une autre par le fait que la comptabilité a effectué quelques optimisations « commerçantes », notamment fait bénéficier du tarif normal aux personnes d’un certain rôle qui restaient le plus longtemps sur place, critère qui ne m’était pas venu à l’esprit. Mais qui implique une fois de plus que les dates de séjour ne doivent plus changer après génération de la facture…
Malgré l’investissement que ce développement a représenté, il est fort probable qu’il ne soit pas réutilisé, et encore moins en l’état. Pour le prochain événement du même genre, les organisateurs ont d’ailleurs d’ores et déjà refusé de l’utiliser.
Les contraintes sur l’établissement du prix d’une nuit sont trop importantes pour qu’il soit possible de continuer avec. Du coup la comptabilité propose que les quotas ne soient plus variables en fonction du nombre de sportifs. En contrepartie, les tarifs pourraient augmenter pour les modifications faites après la date limite d’inscription.
Une chose est certaine : il est plus simple d’édicter des règles que de devoir s’y tenir, de les faire appliquer ou de même les utiliser.