khalil.kouroghli
TUN ENContact

[01] 2024

TPP, Tourcom Payment Platform

Cartes virtuelles et contrôle des dépenses pour un réseau d’agences de voyages

01Agency userNuxt, espace par rôle02TPP APIExpress, Keycloak RS25603Adyencartes, soldes, KYC04Webhooks7 événements, journalisés05Accountingimport CSV, Excel01Agency userNuxt, espace par rôle02TPP APIExpress, Keycloak RS25603Adyencartes, soldes, KYC04Webhooks7 événements, journalisés05Accountingimport CSV, Excel
Sélectionnez un bloc pour aller à la décision correspondante.

Le problème

Les agences membres de Tourcom paient compagnies aériennes et fournisseurs pour le compte des voyageurs, et Tourfinance, le hub central du réseau, garantit clients et fournisseurs en cas d’insolvabilité d’une agence. Le réseau avait besoin d’un seul outil pour embarquer les agences, les alimenter, leur émettre des cartes avec des règles, et rapprocher chaque transaction, du siège jusqu’à chaque point de vente.

Mon rôle

Développeur full-stack chez Everbloo depuis 2024, dans une équipe d’une vingtaine de contributeurs. Depuis novembre 2024, environ 640 commits sur le frontend Nuxt et 220 sur l’API Express, en lien avec Adyen et Visa sur le programme de cartes de la plateforme.

Décisions

D.01

Une hiérarchie, six espaces par rôle

Tourcom, sous-réseaux, agences, points de vente et entreprises ont chacun leur espace dans l’application. Le jeton Keycloak porte le type d’entité, et un garde de route global envoie chaque utilisateur vers son espace à la connexion : 104 pages, une seule base de code, et personne n’atterrit sur un écran qui n’est pas le sien.

D.02

Des cartes virtuelles avec leurs règles

Les cartes sont émises comme instruments de paiement virtuels sur la Balance Platform d’Adyen. Des règles de transaction et des modèles de règles limitent où une carte peut payer selon la catégorie de commerçant, le numéro complet n’est révélé que par un flux chiffré à clé publique et chaque révélation est journalisée, et une tâche quotidienne suspend les cartes expirées.

D.03

Le KYC via l’onboarding hébergé d’Adyen

Les agences font leur KYC sur des liens d’onboarding générés via l’API Legal Entity Management d’Adyen : les pièces d’identité ne transitent jamais par TPP. La plateforme suit la chronologie KYC de chaque agence, affiche les erreurs renvoyées par Adyen et peut relancer la demande.

D.04

Les événements Adyen pilotent l’état

Sept endpoints de webhooks gardent TPP synchronisé avec Adyen : titulaires de compte, cartes, virements, soldes, limites de crédit et relevés. Quand Adyen publie un rapport comptable, TPP télécharge le CSV, l’importe et en tire frais et interchange par agence, exportables en Excel.

D.05

Des permissions en bitmask

Dix-sept drapeaux de permission se combinent par rôle et par entité, du super admin Tourcom au comptable ou à l’agent d’agence. Les partenaires passent par une API publique séparée, avec identifiants client OAuth2, clés d’API et défi par code à usage unique.

D.06

Des générateurs pour des modules tous identiques

Une CLI basée sur ts-morph et Babel génère chaque module de la même façon : modèle, migration, contrôleur, service, schéma Joi, types et documentation Swagger. À vingt dans la base de code, la structure reste la même partout.

Ce qu’il fait aujourd’hui

  • Les agences sont embarquées, alimentées, équipées de cartes virtuelles et rapprochées dans une seule plateforme, du siège Tourcom jusqu’à chaque point de vente.
  • L’API compte environ 38 000 lignes de TypeScript, 34 modèles et 104 migrations ; l’application Nuxt, 104 pages et 83 composants.
  • Les deux côtés fonctionnent en français et en anglais, avec i18next sur l’API et vue-i18n dans l’application.
esc