Theo Sille

Cas pratique - Customer Operations Lead

Accompagner une agence Ezus vers une extraction fiable de ses donnees comptables.

Une proposition de cadrage, de decision technique et d'outillage SQL, pensee pour conseiller une agence cliente sans sur-vendre une solution.

Ops API SQL Automation

Section 1

Integrations & API

La posture n'est pas de construire un outil pour Ezus, mais d'aider une agence de voyage utilisatrice de la plateforme a extraire ses propres donnees pour son comptable.

1.1

Qualifier le besoin avant de repondre

Avant de parler API, je clarifie ce que l'agence doit transmettre, a quelle frequence et avec quel niveau d'autonomie.

?

Comprendre le besoin reel

  • Factures clients, fournisseurs, ou les deux ?
  • JSON, CSV, PDFs, ou format impose par le comptable ?
  • Periode concernee et volume attendu ?

Comprendre la frequence

  • Extraction one-shot pour une cloture ponctuelle ?
  • Envoi mensuel, hebdomadaire ou temps reel ?
  • Besoin de controle manuel avant transmission ?

Evaluer le contexte

  • Outil comptable deja utilise par l'agence ?
  • Profil technique disponible en interne ?
  • Signal partage par d'autres agences Ezus ?
1.2

Arbre de decision

Deux axes suffisent pour choisir entre guidage, automation ponctuelle et signal produit.

Scenario retenu

One-shot, agence isolee

On guide l'agence sur un export manuel ou on construit un workflow n8n/Make ponctuel, avec un perimetre clair et une date de fin.

1.3

Modele de donnees Ezus

Le chemin d'acces aux factures passe par les projets, pas directement par le client.

Client id, name, details Projet client_reference Invoices amounts, lines, status Invoices Supplier amounts, supplier_ref
Contrainte importante

Il n'existe pas de GET /invoices?client_reference=xxx. Pour recuperer les factures d'un client, l'agence doit passer par les projets rattaches a ce client.

1.4

Workflow de recuperation

Un flux concret, explicable a l'agence et maintenable si le volume augmente.

  1. 01

    Authentification via POST /login et recuperation du Bearer token.

  2. 02

    Recuperation des projets filtres par periode avec GET /projects?created_at=....

  3. 03

    Pour chaque projet, recuperation des GET /invoices et GET /invoices-supplier.

  4. 04

    Enrichissement avec les donnees client via client_reference presente dans chaque projet.

  5. 05

    Gestion de la pagination avec next_token si le volume depasse la premiere page.

  6. 06

    Formatage et envoi en CSV, zip de PDFs ou email selon le besoin qualifie.

1.5

Limites a anticiper

Les points a cadrer franchement avant de laisser l'agence dependre du workflow.

Pagination 50 resultats par appel, boucle sur next_token necessaire.

Format des factures JSON structure par defaut; verifier les URLs de documents projet pour les PDFs.

Modele centre projet impossible d'interroger les factures directement par client.

Rate limiting limites daily et burst a respecter sur les gros volumes.

Maintenabilite definir qui surveille le workflow si l'API evolue.

Section 2

SQL

Je ne me positionne pas comme expert SQL. L'objectif est de montrer un raisonnement clair, une comprehension des jointures et la capacite a s'outiller proprement.

2.1

Schema de donnees

Six tables, avec deux colonnes polymorphiques a surveiller : item_type et item_id.

travelers

id, name, city, country, loyalty_tier

flights

id, origin, destination, airline, base_price, departure_at, arrival_at

hotels

id, name, city, country, stars, price_per_night

bookings

id, traveler_id, created_at, status

booking_items

id, booking_id, item_type, item_id, quantity, unit_price

reviews

id, traveler_id, item_type, item_id, rating, created_at

2.2

Requetes types

Des exemples progressifs : filtre, jointure, agregation, HAVING et table polymorphique.

Hotels a Barcelone avec 4 etoiles ou plus

  • Partir de hotels
  • Filtrer la ville et le niveau d'etoiles
SELECT *
FROM hotels
WHERE city = 'Barcelona'
AND stars >= 4

Voyageurs avec statut et date de reservation

  • Relier travelers et bookings
  • Utiliser la cle traveler_id
SELECT travelers.name, bookings.status, bookings.created_at
FROM travelers
JOIN bookings ON bookings.traveler_id = travelers.id

Nombre de reservations par voyageur

  • Compter les bookings
  • Grouper par voyageur et trier par activite
SELECT travelers.name, COUNT(bookings.id) AS nombre_reservations
FROM travelers
JOIN bookings ON bookings.traveler_id = travelers.id
GROUP BY travelers.name
ORDER BY nombre_reservations DESC

Voyageurs ayant fait plus de 3 reservations

  • Agreger par voyageur
  • Filtrer apres aggregation avec HAVING
SELECT travelers.name, COUNT(bookings.id) AS nombre_reservations
FROM travelers
JOIN bookings ON bookings.traveler_id = travelers.id
GROUP BY travelers.name
HAVING COUNT(bookings.id) > 3
ORDER BY nombre_reservations DESC

Note moyenne des hotels 5 etoiles

  • Filtrer reviews.item_type = 'hotel'
  • Joindre vers hotels puis moyenner les notes
SELECT hotels.name, AVG(reviews.rating) AS note_moyenne
FROM hotels
JOIN reviews ON reviews.item_id = hotels.id
WHERE reviews.item_type = 'hotel'
AND hotels.stars = 5
GROUP BY hotels.name
ORDER BY note_moyenne DESC
Bonus - Generateur SQL

Et si je pouvais simplement le dire ?

Module SQL vocal

Dicter une question en francais, ajuster la transcription, puis generer une requete SQL adaptee au schema ci-dessus.