Aller au contenu principal

Service Après-Vente

Le module SAV gère deux types de retours, distincts mais liés :

  1. Retour client — un client revient avec un appareil réparé qui pose à nouveau problème (sous garantie ou hors garantie)
  2. Retour fournisseur (RF-####) — vous renvoyez à votre fournisseur une pièce défectueuse pour remboursement / échange

1. Retour client sous garantie

Recherche garantie

Endpoint : GET /api/sav/warranty-check?serial=...&imei=...

Cherche tous les tickets (cross-tenant si super-admin) où l'IMEI ou le n° série a été réparé, et renvoie :

  • Liste des réparations (ticket + facture + date + technicien)
  • Garantie active ? (warrantyEndDate > now())
  • Lignes encore couvertes (chaque InvoiceLine.warrantyDays défini à la création peut être différent selon le type — main d'œuvre 90j, écran 6 mois, batterie 1 an, etc.)

Création du ticket SAV

Bouton "Créer ticket SAV" sur la fiche garantie → POST /api/sav/tickets qui :

  • Crée un nouveau Ticket lié au ticket d'origine (parentTicketId)
  • Pré-remplit l'appareil et le client
  • Marque isFreeFix: true si sous garantie (pas de facture, pas de POS flow)
  • Suggère les pièces du ticket d'origine pour ré-utilisation

Si ré-réparation gratuite

  • Aucune facture créée
  • Stock décrémenté normalement (la pièce est consommée)
  • Le ticket d'origine reste lié pour la traçabilité — utile en cas de litige client ou audit fiscal

2. Remboursement client

Endpoint : POST /api/sav/refund — alternative à PATCH /api/invoices/:id/status avec status: REFUNDED quand le remboursement n'est pas total.

Le remboursement génère :

  • 1 FiscalEntry REFUND par paiement à rembourser (avec cashSessionId préservé pour la ventilation par caisse)
  • Restauration du stock (pour les lignes PART/PRODUCT)
  • Re-crédit des points fidélité si paiement LOYALTY
  • Réintégration du buyback associé (si la vente comprenait un rachat)

Conformité NF525

La trace SALE originale n'est jamais effacée (chaîne SHA-256 append-only). Le journal montre la séquence : SALE +89 € → REFUND -89 €, net = 0 €, ce qui est exactement ce qu'attend l'administration fiscale en cas de contrôle.

3. Retour fournisseur (RF-####)

Lorsqu'une pièce est défectueuse à l'arrivée ou dans la période de garantie fournisseur, on déclenche un retour.

Création

Page /sav → onglet "Retours fournisseur" → bouton "Nouveau retour".

Champs :

  • Fournisseur (autocomplete depuis Supplier)
  • Pièce concernée (autocomplete depuis InventoryItem)
  • Quantité, lot, date d'achat (si trouvé dans un PO)
  • Motif (DOA / panne précoce / conformité / esthétique)
  • Mode de retour souhaité : avoir / remplacement / remboursement
  • Tracking (numéro de suivi du retour)

Workflow

DRAFT → SHIPPED (envoyé au fournisseur) → ACKNOWLEDGED (fournisseur a
reçu) → RESOLVED (avoir / remplacement / remboursement reçu) → CLOSED

Endpoints

  • GET /api/sav/supplier-returns — liste filtrable
  • PATCH /api/sav/supplier-returns/:id — modifier statut + tracking
  • DELETE /api/sav/supplier-returns/:id — supprimer (DRAFT only)

4. Recherche unifiée SAV

Endpoint : GET /api/sav/search?keyword=... qui parcourt :

  • Tickets (par client, IMEI, n° série, ticketCode)
  • Factures (par invoiceCode, customer email, mobile)
  • Appareils (par IMEI, n° série, deviceModel.name)

Utile quand le client se présente avec juste "j'ai un iPhone qui marche plus" sans n° de ticket.

5. Stats SAV

GET /api/sav/stats renvoie :

  • Taux de retour client (nb retours / nb tickets) — alerte si > 5 %
  • Taux de retour fournisseur par fournisseur (qualité)
  • Pièces les plus retournées (top 10)
  • Coût SAV moyen par appareil (pertes nettes après avoirs reçus)

À regarder mensuellement pour identifier :

  • Un fournisseur qui livre des pièces de mauvaise qualité (à blacklister)
  • Un type de réparation à risque (à valoriser via tarifs)
  • Un tech qui rate plus de réparations que la moyenne (à former)

6. Bonnes pratiques

  • Toujours rattacher le ticket SAV au ticket d'origine (parentTicketId) — sinon la traçabilité est perdue
  • Préserver la garantie : si un client revient avant warrantyEndDate, ne facturez pas même si la nouvelle panne est différente — le respect d'une garantie totale donne confiance et fidélise
  • Photo systématique de la pièce défectueuse côté retour fournisseur — utile en cas de litige (le fournisseur peut contester un DOA sans preuve)
  • Tracking obligatoire sur les retours > 50 € — vous éviterez les "perdu en transit" qui font perdre l'avoir
  • Remboursement plutôt qu'avoir quand le client le demande — un avoir non utilisé devient une dette comptable + un client mécontent

7. Routes API utiles

# Recherche garantie sur un IMEI
curl -sS -H "Authorization: Bearer $TOKEN" \
"https://app.fixvault.fr/api/sav/warranty-check?imei=356789012345678"

# Stats SAV des 30 derniers jours
curl -sS -H "Authorization: Bearer $TOKEN" \
"https://app.fixvault.fr/api/sav/stats?period=30d"

# Création retour fournisseur
curl -sS -X POST https://app.fixvault.fr/api/sav/supplier-returns \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"supplierId": "uuid-fournisseur",
"items": [{"inventoryItemId": "uuid-piece", "quantity": 2, "reason": "DOA"}],
"expectedResolution": "REFUND"
}'

Pour la liste complète : voir API & Intégrations § 26.