Développement complet d'une plateforme pour remplacer et internaliser un système de gestion de carte de fidélité qui était déjà en fonctionnement. En chiffre :
La plateforme propose trois espaces correspondant à différent niveau d'accès pour le suivis : point de vente, groupe de point de vente et administrateur. Ils permettent en outre de voir les fiches clients, fusionner des cartes d'un même client, vérifier le bon fonctionnement à l'aide de récapitulatif, accéder aux fichiers générés.
Pour le suivis des performances, génération de fichiers de statistique tous les mois ou tous les trimestres en ".xlsx" avec phpspreadsheet. Nombre de coupon émis, utilisé, passage des clients, retour des clients, nombre de carte créée par opérateur et bien d'autre... au total, pour un point de vente et à l'échelle du réseau.
Certain fichier de statistiques étant long à générer, mais devant être tous généré le même jour pour tout le monde, lancement de la génération des fichiers en parallèle sur la moitié des coeurs du serveur avec un script bash et la commande "nohup ... &"
Des graphiques représentant l'évolution de chiffres clefs sont déssinés et générés avec la libraire "gd" puis incorporé aux fichiers.
Pour répondre aux besoins de communications ponctuels envoyés à des clients respectant des critères donnés, développement d'une interface dynamique permettant de généré des requêtes SQL à partir d'une trentaine de critères à combiner entre eux (âge, code postal, achat...). Cette interface permet de sauvegarder une recherche, ajouter ou retirer le résultat des recherches entre elles, extraire la liste sous forme de fichier ou l'utiliser directement au sein de la plateforme.
Tous les clients possèdent une carte de fidélité physique ou virtuel avec un numéro unique. Le format EAN13 est utilisé pour représenter les codes des cartes clients et des coupons. La validité d'un code est vérifié en calculant la clé de contrôle. Le code barre est représenté par un fichier image généré avec la libraire "gd" et peut être lu par un scanner au comptoir.
Les clients qui possèdent une carte peuvent se connecter à leur espace personnel. Ils y retrouvent leur nombre de point, leur coordonnée qu'ils peuvent mettre à jour ainsi que la possibilité de généré un coupon parrainage. Le parrain et le filleul bénéficient d'avantages sous forme de coupon ou d'ajout de point en cas d'inscription.
Les clients peuvent recevoir entre autre des messages de bienvenue en cas de nouvelles inscriptions, des invitations au renouvellement et bien sûr leurs coupons avantages (réduction en euro) ou anniversaire (réduction d'un % sur le panier).
Ces messages transites par différent canaux de communication avec leur spécificité. Tous les messages sont placés dans une sorte de file d'attente et traiter par un script indépendant qui s'occupe de les envoyer par lot pour répartir la charge serveur dans le temps.
mail : utilisation de la librairie PHPMailer. Les retours en erreur sont reçus sur une boite mail dédié qui est régulièrement consulté par une tâche automatisée pour détecter les adresses erronées. Les modèles de mails sont générés en html pour nos besoins par un logiciel tiers, puis adapté et intégré ; des variables sont insérées pour permettre la personnalisation. Enfin, on envoie des tests sur différents client web et mail pour vérifier que l'affichage soit correcte.
courrier : dépôt d'un fichier ".csv" sur le serveur du prestataire. La temporalité n'est pas la même pour préparer l'envoie de manière à ce que les courriers arrivent à point nommé (10 jours en avance environ). Les retours en erreur sont saisis manuellement dans un fichier ".csv" qui est ensuite chargé dans un script pour vider les adresses.
sms : les sms sont envoyés par un prestataire externe qui met à disposition un web service à appeler avec un ordre sous forme XML. En retour, le prestataire appel un de nos web service mis en place spécifiquement pour recevoir les éventuels retours d'erreur et STOP SMS.
Des laboratoires proposent des avantages à leurs clients qui remplissent certains objectifs d'achat. Ces objectifs sont fixés par les laboratoires et peuvent être de différentes natures : un montant d'achat total, une quantité de produit ou l'atteinte d'une somme de point attribué par produit. La base de données du programme fidélité contient les achats de para-pharmacie des clients, il était donc possible de suivre les avancés des clients et de les prévenir au fur et à mesure pour chacun de ces programmes laboratoire.
Gestion des variantes pour récupérer l'avantage selon les laboratoires : directement en point de vente, contacter le laboratoire ou dans le cas où un accord avait été trouvé avec notre programme, nous envoyons directement un coupon de réduction.
Une cinquantaine de programme laboratoire sont suivis avec leurs règles spécifiques. Chaque programme peut être activé ou désactivé par point de vente. Envoie d'une communication au démarrage, à 70% et à l'atteinte de l'objectif.
Le choix des achats à proposer au client pour compléter sa carte offrait une problématique intéressante. En effet, un panier peut contenir plus de produit que nécessaire dans l'atteinte d'un objectif. Pour ne pas léser le client, développement d'un algorithme permettant de choisir la meilleur combinaison possible parmi les achats disponibles.
Que ce soit les tâches automatisées et donc le serveur qui travail sans relâche ou le développeur qui effectue des opérations de maintenance de manière transparente pour les utilisateurs, la plupart des opérations permettant le fonctionnement du programme de fidélité se déroule dans l'ombre.
La plateforme interagit avec une dizaine de logiciels de caisse différents. Bien que des standards ont été mis en place, certaine différence plus ou moins subtile persiste et il faut les prendre en compte dans nos solutions. Il s'agit par exemple de s'assurer de l'unicité des ordres ou d'écarter les ordres invalides.
La plateforme met à disposition des web services (en xml ou json) pour répondre aux interrogations des logiciels de caisse des points de vente en temps réel et elle doit pouvoir soutenir une charge de plusieurs dizaines d'appels par secondes lors des piques d'activités. Quelques exemples :
De manière quotidienne, les logiciels de caisse déposent deux fichiers xml chacun décrivant les opérations de la journée, un fichier client et un fichier vente. Il s'agit alors d'intégrer ces données, le fichier client contient les créations de nouvelle carte ou les mises à jour des coordonnées, le fichier vente contient la liste des paniers et des achats.
Le calcule des points se fait à la volé lors de l'intégration des achats et peut devenir complexe en fonction des journées doublement des points, de l'éligibilité d'un produit en fonction de sa classe ou d'une décision du point de vente. Il faut également prendre en compte les retours produits qui donnent lieu à un retrait de point, mais seulement sous certaines conditions spécifiques (vérifier dans l'historique, éviter les points négatifs...).
Enfin, la plateforme doit conserver un historique avec des données permettant d'expliquer chaque attribution ou retrait de point en cas de réclamation client.
Pour facilité la navigation des utilisateurs sur d'autres plateforme développées par ailleurs, mise en place d'un protocole pour se connecter automatiquement si l'utilisateur est déjà connecté sur l'autre application et vice versa.
Extension des web services lors d'une collaboration avec une société de coupon généraliste afin que leurs coupons puissent être transmis depuis notre plateforme. Adaptation pour que leur format de numéro de coupon puissent être considéré comme valide et donne lieu à des traitements spécifiques. Appel à leur web service pour récupérer et appliquer les réductions sur panier. À cette fin, développement d'un web service permettant de récupérer les paniers en temps réel.
Pour effectuer la maintenance de la base de données, alerter les administrateurs, générer des fichiers de statistiques, envoyer les communications... Une cinquantaine de tâches automatisés sont lancées de manière quotidienne, hebdomadaire ou mensuel.
Les échanges de fichiers entre la plateforme et les logiciels de caisse se font sur un dépôt sécurisé. Le protocole sftp (ssh2_sftp) est utilisé pour manipuler les fichiers sur le serveur distant.
Les retours de mail en cas de problème de transmission ou de réponse automatique sont analysés pour invalider une adresse si nécessaire. Le script se connecte à la boite mail, parcours les mails et les analyse. Une liste de schémas récurrents pour chaque fournisseur de boite mail a été établi pour détecter un message annonçant une adresse erroné afin de mettre à jour la fiche client concerné et déplacer le mail dans un dossier archives. Si le script n'est pas sûr de quoi faire du mail alors il le déplace dans un dossier à part pour analyse ultérieure.
Pour alerter les administrateurs en cas de problème, certains paramètres sont analysés et peuvent déclencher un envoi de mail. Par exemple : des cartes dont nous avons reçu des ventes sans avoir reçu la fiche client ou des fichiers qui n'ont pas été transmis depuis un certain temps.
Création d'un script d'analyse des logs serveur pour alerter si le nombre d'appels http au serveur dépasse des seuils définis.
Migrations, corrections, importations, mise en production... à l'aide de commande bash et de script Php et de préférence sans perturber la navigation des utilisateurs.
Intégration de données externe : Importation et mise à jour de la base produits depuis une base de données externe. Transformer les fichiers brutes pour qu'il soient utilisables dans notre architecture. Ajouter les produits qui n'existent pas et mettre à jour ceux qui ont été modifiés. Utilisations de la représentation intervallaire pour enregistrer les catégories de produits qui peuvent descendre jusqu'à 5 niveaux.
Serveur linux apache/nginx, Php et PostgreSQL, javascript (jQuery), git.
Surveillance de la santé du serveur en ligne de commande (ssh, top, free, dh) et analyse les logs. Proposer des paramétrages d'apache ou nginx pour utiliser la configuration matériel au mieux (nombre de coeur, mémoire disponible) et fixer la durée de vie des processus php pour éviter une consommation mémoire trop importante.