Aller au contenu

Le format d'import

Pour quitter l’ancien logiciel du club, on importe des fichiers CSV ou XLSX : un fichier par type de données, une correspondance des colonnes, un aperçu, une application qu’on peut relancer sans doublon, et un rapport. Côté club, c’est la page Import (propriétaire) ; côté terminal, bo import. Le code est dans packages/domain/src/import/.

  1. Envoi d’un CSV (séparateur ; ou ,, UTF-8 ou Windows-1252) ou d’un XLSX (première feuille), jusqu’à 5 Mo et 5 000 lignes. Un fichier illisible est refusé avec la raison ; rien n’est conservé.
  2. Correspondance des colonnes du fichier avec les champs de Rebond. Les colonnes nommées comme dans le modèle (ou par un synonyme connu) sont reconnues d’elles-mêmes. La correspondance est enregistrée par club, nom du logiciel source et type : le fichier suivant du même logiciel se range tout seul.
  3. Aperçu : chaque ligne est vérifiée contre les données actuelles du club et reçoit un statut, à créer, à mettre à jour, ignorée (rien à faire, avec la raison) ou en erreur (avec la raison). Dans un même fichier, les doublons (même identifiant, e-mail ou téléphone) gardent la première ligne.
  4. Application : une seule transaction pour tout le fichier. Les lignes sont revérifiées, puis écrites par le code du module concerné. Une ligne que la base refuse à ce moment-là (créneau pris entre-temps, e-mail d’un compte d’un autre club) est marquée non importée ; le reste passe quand même.
  5. Rapport : ce qui n’est pas passé, et pourquoi, vient en premier. Il se télécharge en CSV (ligne, statut, raison, puis les colonnes du fichier).

Ordre conseillé : Terrains, Tarifs, Clients, Formules, Soldes, Réservations. Les trois derniers désignent les clients par leur identifiant d’import, leur e-mail ou leur téléphone.

Les clients importés deviennent des utilisateurs créés avant leur première connexion (e-mail non vérifié) : un lien ou un code reçu plus tard sur cet e-mail ou ce téléphone ouvre le même compte. Les téléphones sont enregistrés au format international (+33…), comme à la connexion par SMS : la base refuse toute autre forme, donc un même numéro est toujours une seule personne.

Chaque ligne importée est reliée à ce qu’elle a créé par son identifiant externe (la colonne Identifiant). À défaut : l’e-mail ou le téléphone pour un client, le nom pour un terrain, le libellé et le sport pour un tarif, le client, le type et le libellé pour une formule, le client pour un solde, le terrain et l’heure de début pour une réservation. Relancer le même fichier ne crée rien de nouveau :

Type Mêmes valeurs Valeurs changées
Clients ignorée niveau mis à jour ; le nom, l’e-mail et le téléphone appartiennent au compte de la personne et ne sont pas réécrits
Terrains ignorée nom, zone, site mis à jour (un autre sport est refusé)
Tarifs ignorée tarif mis à jour (supprimé à l’accueil depuis : recréé)
Formules, soldes ignorée refusée avec la raison : l’argent et les formules vendues ne sont jamais réécrits, corrigez à l’accueil (recharge, remboursement, fiche client)
Réservations ignorée refusée : déplacez-la sur le planning
  • Un client déjà au club (même e-mail ou téléphone, par exemple inscrit depuis l’application joueur) est relié, pas dupliqué.
  • Un solde n’est repris qu’une fois par client, quel que soit le système d’identifiants d’un fichier suivant.
  • Deux fichiers du même type appliqués en même temps passent l’un après l’autre (par club et par type) : le second voit les liens du premier.
  • Un e-mail ou un téléphone qui appartient au compte d’un autre club est invisible pour ce club (RLS) : la ligne échoue avec cette raison, et la personne rejoint le club en se connectant.
  • Soldes : une écriture de crédit de porte-monnaie par client, libellée Reprise de solde · <source>, dans la chaîne d’empreintes du journal. Elle est refusée si la caisse du jour est déjà clôturée. Pendant l’application d’un fichier de soldes, les encaissements à l’accueil attendent quelques secondes. Ce n’est pas un paiement : rien n’entre dans la caisse, le Z ni le FEC. Les soldes négatifs sont refusés (une dette relève de l’ardoise). Voir solde d’ouverture.
  • Formules : le droit est créé avec les séances restantes, à prix nul, sans nouvelle commande. Les carnets à 0 séance et les formules expirées sont ignorés.
  • Chaque fichier appliqué laisse une entrée d’historique import.applied (qui, source, fichier, comptes).

Seules les réservations à venir sont importées (les passées sont ignorées). Elles sont créées confirmées, sans pré-réservation, avec les mêmes règles qu’à l’accueil : horaires, fermetures. Une réservation qui ne tombe pas sur un créneau (début entre deux créneaux, ou durée que le sport ne propose pas) est reprise telle quelle, marquée « hors créneau » dans l’aperçu et comptée (counts.offGrid) dans le rapport. La base de données décide des chevauchements et un conflit est signalé, jamais forcé. Le prix vient des tarifs du jour et la part reste à régler ; l’organisateur est le propriétaire qui applique le fichier, le client est le participant.

Les en-têtes sont reconnus sans tenir compte de la casse, des accents ni de la ponctuation. Montants en euros (12,50, 1 234,50 €), dates JJ/MM/AAAA (ou AAAA-MM-JJ), heures 18:30 ou 18h30 dans le fuseau du club, téléphones 06 12 34 56 78 (enregistrés +33612345678).

Colonne Obligatoire Sens Exemple
Identifiant Identifiant du terrain dans l’ancien logiciel. Relancer un import avec le même identifiant met à jour au lieu de créer. T-8
Nom oui Nom du terrain, unique dans le club. Padel 4
Sport oui Sport du club, par son nom (Padel, Squash…). Padel
Site Site du club. Facultatif quand le club n’a qu’un site. Rochecorbon
Zone Regroupement affiché au planning (Intérieur, Extérieur…).
Colonne Obligatoire Sens Exemple
Identifiant Identifiant du tarif dans l’ancien logiciel. Relancer un import avec le même identifiant met à jour au lieu de créer. TAR-3
Libellé oui Nom du tarif. Padel heures creuses
Sport oui Sport du club, par son nom (Padel, Squash…). Padel
Terrain Nom du terrain tel qu’il existe dans Rebond (ou son identifiant d’import). Padel 1
Période Période déjà définie au club (« Heures creuses »). Sinon, les jours et heures ci-dessous créent la période. Heures creuses
Jours Jours concernés : « tous », « semaine », « week-end », « lun-ven » ou « lun,mer,ven ». Vide = tous. lun-ven
Début Heure de début de la plage (incluse). Vide = 00:00. 09:00
Fin Heure de fin de la plage (exclue). Vide = 24:00. 12:00
Durée Durée de réservation concernée, en minutes. Vide = toutes. 90
Client « adhérent », « non-adhérent » ou vide pour tous. non-adhérent
Prix oui Prix de la réservation en euros, TTC. 36,00
Priorité Le tarif de plus haute priorité l’emporte. Vide = 0. 0
Valable du Date de début de validité (JJ/MM/AAAA).
Valable au Date de fin de validité, incluse.

Au moins l’un des deux : Email ou Téléphone.

Colonne Obligatoire Sens Exemple
Identifiant Identifiant du client dans l’ancien logiciel. Relancer un import avec le même identifiant met à jour au lieu de créer. C-1042
Nom oui Nom de famille. Martin
Prénom Prénom. Léa
Email Adresse email. Email ou téléphone obligatoire : c’est ce qui évite les doublons. lea.martin@exemple.fr
Téléphone Numéro de mobile, au format 06 12 34 56 78 ou +33 6 12 34 56 78. 06 12 34 56 78
Niveau Niveau de jeu, de 1 à 7 (décimales acceptées). 4,5
Colonne Obligatoire Sens Exemple
Identifiant Identifiant de la formule dans l’ancien logiciel. Relancer un import avec le même identifiant ne crée rien de plus ; des valeurs changées sont refusées, à corriger au desk. F-77
Client oui Identifiant du client (colonne Identifiant du fichier clients), son email ou son téléphone. C-1042
Type oui « carnet » (séances), « adhésion » (annuelle), « mensuel », ou le nom d’une formule du catalogue (« Annuel squash ») dont les conditions s’appliquent. carnet
Libellé Nom de la formule, affiché dans la fiche client. Vide quand le type est une formule du catalogue : son nom. Carnet 10 séances
Sport Sport du club, par son nom (Padel, Squash…). Padel
Séances restantes Carnets : séances encore jouables aujourd’hui. Obligatoire pour un carnet. 6
Séances achetées Carnets : nombre de séances à l’achat. Vide = séances restantes. 10
Début Date de début de validité. Vide = aujourd’hui. 01/09/2026
Fin Date de fin, incluse. Obligatoire pour une adhésion ; vide = sans fin pour un carnet. 31/08/2027
Colonne Obligatoire Sens Exemple
Identifiant Identifiant du solde dans l’ancien logiciel. Relancer un import avec le même identifiant ne crée rien de plus ; des valeurs changées sont refusées, à corriger au desk. S-1042
Client oui Identifiant du client (colonne Identifiant du fichier clients), son email ou son téléphone. C-1042
Solde oui Argent que le club détient pour le client, en euros. Repris tel quel dans le portefeuille. 25,50

Au moins l’un des deux : Durée ou Fin.

Colonne Obligatoire Sens Exemple
Identifiant Identifiant de la réservation dans l’ancien logiciel. Relancer un import avec le même identifiant ne crée rien de plus ; des valeurs changées sont refusées, à corriger au desk. R-5531
Terrain oui Nom du terrain tel qu’il existe dans Rebond (ou son identifiant d’import). Padel 1
Date oui Jour de la réservation (JJ/MM/AAAA). 14/11/2026
Heure oui Heure de début, heure du club. 18:30
Durée Durée en minutes. Durée ou heure de fin obligatoire. 90
Fin Heure de fin (à la place de la durée).
Client oui Identifiant du client (colonne Identifiant du fichier clients), son email ou son téléphone. C-1042
Type « partie », « partie ouverte » ou « cours ». Vide = partie. partie
Titre Texte affiché sur le planning.

Des exemples de fichiers sont dans e2e/fixtures/import/.

bo import fait le même parcours que la page Import (envoi, correspondance, aperçu, application), à travers l’API de ce worktree, comme propriétaire du club, avec une session de développement (DEV_IDENTITY). Il sert à répéter une reprise en local ou sur une copie restaurée des données du club ; sur un club déployé, le propriétaire utilise la page Import.

Fenêtre de terminal
pnpm bo import memberships --template # le modèle CSV ; les clés des champs avec --json
pnpm bo import memberships chemin/clients.xlsx # envoi + correspondance + aperçu (comptes, lignes en erreur)
pnpm bo import memberships chemin/clients.xlsx --apply # écrit ; rapport à côté du fichier (<nom>.rapport.csv)
  • Types : resources, tariffs, memberships, entitlements, wallets, bookings.
  • --source <logiciel> : le logiciel d’origine ; la correspondance est enregistrée par source.
  • --map "lastName=Nom client,email=Mail" remplace la correspondance proposée (clés des champs : --template --json). Un en-tête qui contient une virgule ne peut pas être donné ainsi.
  • --club bo et --as <email du propriétaire> choisissent le club et le propriétaire.