Depannage de l'integration
Ce guide vous aide a diagnostiquer et resoudre les problemes courants d'integration avec Eaternity Forecast.
Problemes d'authentification
La cle d'interface de programmation ne fonctionne pas
Symptomes :
- Reponses 401 Non autorise
- Erreurs « Echec de l'authentification »
Causes courantes et solutions :
1. Format de cle d'interface de programmation incorrect
Probleme : Espaces ou caracteres supplementaires dans la cle
Solution :
# Faux (espace final)
API_KEY="sk_live_abc123 "
# Correct (pas d'espaces supplementaires)
API_KEY="sk_live_abc123"
# Tester l'authentification
curl -X GET "https://api.eaternity.org/v1/forecast/ping" \
-H "Authorization: Bearer $API_KEY"
2. Utilisation d'une cle bac a sable en production
Probleme : Tentative d'utiliser une cle d'interface de programmation bac a sable avec l'URL de production
Solution :
# Cle bac a sable (commence par sk_sandbox_)
sk_sandbox_abc123 → Utiliser avec https://sandbox-api.eaternity.org
# Cle de production (commence par sk_live_)
sk_live_abc123 → Utiliser avec https://api.eaternity.org
3. Cle d'interface de programmation expiree
Probleme : La cle a ete renouvelee ou a expire
Solution :
- Connectez-vous au tableau de bord Forecast
- Naviguez vers Parametres → Cles d'interface de programmation
- Generez une nouvelle cle d'interface de programmation
- Mettez a jour votre integration avec la nouvelle cle
4. En-tete d'autorisation manquant
Probleme : Oubli d'inclure l'en-tete d'authentification
Solution :
# Faux (pas d'authentification)
curl -X GET "https://api.eaternity.org/v1/forecast/predictions?date=2024-01-20"
# Correct (avec authentification)
curl -X GET "https://api.eaternity.org/v1/forecast/predictions?date=2024-01-20" \
-H "Authorization: Bearer votre_cle_api"
Problemes de jeton OAuth
Symptomes :
- Erreurs de jeton expire
- Reponses jeton invalide
Solutions :
Implementer le rafraichissement de jeton
async function getValidToken() {
// Verifier si le jeton existe et est encore valide
if (accessToken && tokenExpiresAt > Date.now()) {
return accessToken;
}
// Rafraichir le jeton
const response = await fetch('https://api.eaternity.org/oauth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
grant_type: 'refresh_token',
refresh_token: refreshToken,
client_id: clientId,
client_secret: clientSecret
})
});
const data = await response.json();
accessToken = data.access_token;
tokenExpiresAt = Date.now() + (data.expires_in * 1000);
return accessToken;
}
Problemes de soumission de donnees
Echec de l'import de donnees historiques
Symptomes :
- Import bloque en statut « processing »
- Import echoue avec des erreurs de validation
- Certains enregistrements ignores
Causes courantes et solutions :
1. Format de date incorrect
Probleme : Utilisation d'un mauvais format de date
Formats incorrects :
{
"date": "20-01-2024", // Mauvais ordre
"date": "2024/01/20", // Barres obliques au lieu de tirets
"date": "2024-1-20", // Pas de zero initial
"date": "Jan 20, 2024" // Format texte
}
Format correct :
{
"date": "2024-01-20" // AAAA-MM-JJ
}
2. Champs obligatoires manquants
Probleme : Omission des champs de donnees obligatoires
Solution :
{
"kitchen_id": "votre_id_cuisine", // Obligatoire
"date": "2024-01-20", // Obligatoire
"items": [ // Obligatoire
{
"item_id": "pasta_carbonara", // Obligatoire
"quantity_sold": 52, // Obligatoire
"name": "Pasta Carbonara", // Recommande
"price": 14.50, // Recommande
"category": "Main Course" // Recommande
}
]
}
3. IDs d'articles incoherents
Probleme : Les IDs d'articles changent entre les soumissions
Incorrect :
// Jour 1
{"item_id": "pasta_carbonara", "quantity_sold": 52}
// Jour 2
{"item_id": "Pasta_Carbonara", "quantity_sold": 48} // Casse differente
// Jour 3
{"item_id": "pasta-carbonara", "quantity_sold": 55} // Format different
Correct :
// Tous les jours utilisent le meme ID
{"item_id": "pasta_carbonara", "quantity_sold": 52}
{"item_id": "pasta_carbonara", "quantity_sold": 48}
{"item_id": "pasta_carbonara", "quantity_sold": 55}
Corriger les donnees incoherentes :
# Demander une mise a jour du mappage d'ID d'article
POST /v1/forecast/items/map
{
"kitchen_id": "votre_id_cuisine",
"mappings": [
{
"variants": ["pasta_carbonara", "Pasta_Carbonara", "pasta-carbonara"],
"canonical_id": "pasta_carbonara"
}
]
}
4. Soumissions de donnees en double
Probleme : Soumettre la meme date plusieurs fois
Solution :
# Premiere soumission (Jour 1)
POST /v1/forecast/sales
{"date": "2024-01-20", "items": [...]}
# Correction necessaire plus tard
# Utilisez PATCH au lieu de POST
PATCH /v1/forecast/sales/2024-01-20
{"items": [{"item_id": "pasta_carbonara", "quantity_sold": 54}]}
5. Donnees trop volumineuses
Probleme : Depassement des limites de taille de requete
Solution :
# Incorrect : Toutes les donnees en une requete
bulk_import(sales_data_90_days) # Peut depasser la limite
# Correct : Diviser en lots
def chunk_data(data, chunk_size=30):
for i in range(0, len(data), chunk_size):
yield data[i:i + chunk_size]
for chunk in chunk_data(sales_data, chunk_size=30):
bulk_import(chunk)
time.sleep(1) # Eviter les limites de debit
Echecs de soumission des ventes quotidiennes
Symptomes :
- Erreurs de validation 422
- Donnees de ventes n'apparaissant pas dans le tableau de bord
- Previsions non mises a jour
Solutions :
Verifier la qualite des donnees
Point d'acces de validation :
POST /v1/forecast/sales/validate
{
"kitchen_id": "votre_id_cuisine",
"date": "2024-01-20",
"items": [...]
}
# La reponse montre les problemes de validation
{
"valid": false,
"errors": [
{
"field": "items[2].quantity_sold",
"value": -5,
"issue": "Quantity cannot be negative"
}
]
}
Erreurs de validation courantes
| Erreur | Cause | Solution |
|---|---|---|
Quantity cannot be negative | Valeur de quantite negative | Utilisez 0 pour les articles non vendus |
Item ID contains invalid characters | Caracteres speciaux dans l'ID | Utilisez uniquement alphanumeriques, underscore, tiret |
Date in future | Date non encore survenue | Soumettez uniquement des donnees historiques |
Price exceeds maximum | Prix superieur a 999,99 | Contactez le support si legitime |
Problemes de recuperation des previsions
Previsions non disponibles
Symptomes :
- 404 Non trouve pour les requetes de prevision
- Tableau de previsions vide
- Message « No predictions generated »
Causes courantes et solutions :
1. Donnees d'entrainement insuffisantes
Probleme : Le modele n'a pas encore fini l'entrainement
Verifier le statut de l'entrainement :
GET /v1/forecast/training/status
# Reponse
{
"status": "training",
"progress": 45,
"expected_completion": "2024-01-25T10:00:00Z"
}
Solution : Attendez que l'entrainement soit termine (generalement 1-2 semaines)
2. Pas de donnees de ventes recentes
Probleme : Pas de donnees de ventes soumises recemment
Verifier la derniere soumission de donnees :
GET /v1/forecast/sales/last
# Reponse
{
"last_submission": "2024-01-15",
"days_ago": 5,
"warning": "No data submitted in 5 days. Prediction accuracy may decline."
}
Solution : Soumettez les donnees de ventes manquantes
3. Date future demandee au-dela de la plage
Probleme : Demande de previsions trop loin dans le futur
Incorrect :
# Aujourd'hui est le 2024-01-20
GET /v1/forecast/predictions?date=2024-02-15 # 26 jours a l'avance
Correct :
# Maximum 14 jours a l'avance
GET /v1/forecast/predictions?date=2024-02-03 # 14 jours a l'avance
4. Article retire
Probleme : Demande de previsions pour un article du menu retire
Verifier le statut de l'article :
GET /v1/forecast/items/pasta_carbonara
# Reponse
{
"item_id": "pasta_carbonara",
"status": "discontinued",
"last_sold": "2024-01-10",
"reason": "Zero sales for 10 consecutive days"
}
Solution : Reactiver l'article ou le retirer des requetes de prevision
Problemes de precision des previsions
Symptomes :
- Previsions constamment trop elevees ou trop basses
- Intervalles de confiance larges
- MAPE superieur a 20 %
Etapes de diagnostic :
1. Verifier la note de qualite des donnees
GET /v1/forecast/analytics/data-quality
# Reponse
{
"overall_score": 65, // En dessous de 80 %
"issues": [
{
"type": "missing_dates",
"severity": "high",
"details": "Missing sales data for 12 days in last 30 days"
},
{
"type": "inconsistent_naming",
"severity": "medium",
"details": "15 items with name variations"
}
],
"recommendations": [
"Submit missing sales data for: 2024-01-05, 2024-01-08, ..."
]
}
Solution : Traitez les problemes de qualite des donnees identifies
2. Verifier les changements recents
Probleme : Changements de menu, changements operationnels non refletes
Verifier le journal des changements :
GET /v1/forecast/changelog
# Reponse
{
"recent_changes": [
{
"date": "2024-01-15",
"type": "menu_change",
"details": "5 new items added, 3 items removed"
}
]
}
Solution :
- Attendez 2-3 semaines apres les changements de menu importants
- Fournissez des modifications manuelles pendant la periode de transition
- Soumettez des retours sur les raisons des ecarts
3. Identifier les erreurs systematiques
Analyser les tendances d'ecart :
GET /v1/forecast/analytics/variance-analysis?days=30
# La reponse montre les tendances
{
"patterns": [
{
"pattern": "consistently_over_predicting",
"items_affected": ["salad_items"],
"magnitude": "+15%",
"possible_cause": "Seasonal decline not yet learned"
}
]
}
Solution : Le modele apprend avec le temps, ou fournissez des donnees de facteurs externes (meteo, evenements)
Problemes de reseau et de connectivite
Erreurs de timeout
Symptomes :
- Timeout de requete apres 30 secondes
- Erreurs 504 Gateway Timeout
Solutions :
1. Augmenter le timeout client
import requests
# Incorrect : Timeout par defaut trop court
response = requests.get(url)
# Correct : Specifier le timeout
response = requests.get(url, timeout=60) # 60 secondes
2. Utiliser l'asynchrone pour les operations en masse
// Incorrect : Requetes sequentielles (lent)
for (const date of dates) {
await submitSales(date);
}
// Correct : Requetes paralleles (rapide)
await Promise.all(dates.map(date => submitSales(date)));
Erreurs de limite de debit
Symptomes :
- 429 Trop de requetes
- Message « Rate limit exceeded »
Solutions :
1. Respecter l'en-tete Retry-After
import time
import requests
def make_request(url):
response = requests.get(url)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
print(f"Rate limited. Waiting {retry_after} seconds...")
time.sleep(retry_after)
return make_request(url) # Reessayer
return response
2. Implementer une file d'attente de requetes
from time import sleep
from collections import deque
class RateLimitedClient:
def __init__(self, requests_per_minute=100):
self.requests_per_minute = requests_per_minute
self.request_times = deque()
def make_request(self, url):
now = time.time()
# Supprimer les requetes de plus d'une minute
while self.request_times and self.request_times[0] < now - 60:
self.request_times.popleft()
# Verifier si a la limite
if len(self.request_times) >= self.requests_per_minute:
sleep_time = 60 - (now - self.request_times[0])
sleep(sleep_time)
# Faire la requete
response = requests.get(url)
self.request_times.append(time.time())
return response
3. Demander une augmentation de limite de debit
Pour les integrations a fort volume :
- E-mail forecast-api@eaternity.org
- Fournissez le cas d'utilisation et le volume de requetes attendu
- Limites de debit personnalisees disponibles
Problemes d'integration Necta
Le module Forecast n'apparait pas
Symptomes :
- Pas d'onglet « Previsions » dans le module Planification Necta
- Activation confirmee mais interface inchangee
Solutions :
1. Vider le cache du navigateur
1. Fermez completement Necta
2. Videz le cache du navigateur :
- Chrome : Parametres → Confidentialite → Effacer les donnees de navigation
- Firefox : Options → Vie privee → Effacer les donnees
3. Redemarrez le navigateur
4. Reconnectez-vous a Necta
2. Verifier le statut d'activation
Contactez le support Necta :
Objet : Statut d'activation du module Forecast
ID de compte : [Votre ID de compte Necta]
Probleme : Module Forecast non visible apres activation
Date d'activation : [Date a laquelle on vous a dit qu'il etait active]
3. Verifier les permissions utilisateur
Probleme : Le role utilisateur n'a pas acces a Forecast
Solution :
- L'administrateur doit accorder les permissions Forecast
- Naviguez vers Parametres Necta → Utilisateurs → [Votre utilisateur] → Permissions
- Activez l'acces au module « Forecast »
Donnees non synchronisees depuis Necta
Symptomes :
- Previsions non mises a jour avec les dernieres donnees de ventes Necta
- Import historique incomplet
Solutions :
1. Verifier la saisie des donnees Necta
Verifier dans Necta :
- Naviguez vers Ventes → Rapports quotidiens
- Verifiez que les donnees de ventes sont saisies pour les dates recentes
- Assurez-vous que tous les articles du menu sont enregistres
2. Verifier le statut de synchronisation
Contactez le support Eaternity :
Objet : Probleme de synchronisation des donnees Necta
ID cuisine : [Votre ID cuisine]
ID compte Necta : [Votre ID compte Necta]
Derniere synchronisation reussie : [Verifier dans le tableau de bord Forecast]
Dates manquantes : [Lister les dates sans synchronisation]
3. Reconnecter l'integration
Via le tableau de bord Necta :
- Naviguez vers Integrations → Eaternity Forecast
- Cliquez sur « Deconnecter »
- Cliquez sur « Reconnecter »
- Accordez a nouveau les permissions
Problemes de webhooks
Webhooks non livres
Symptomes :
- Pas de notifications webhook recues
- Point d'acces webhook jamais appele
Solutions :
1. Verifier la configuration webhook
GET /v1/forecast/webhooks
# Verifier la configuration
{
"webhooks": [
{
"webhook_id": "wh_123",
"url": "https://votre-systeme.com/webhooks/forecast",
"events": ["predictions.generated"],
"status": "active",
"last_delivery": "2024-01-20T03:16:00Z"
}
]
}
Si status: "failed" : Verifiez les journaux d'erreurs
2. Verifier l'accessibilite du point d'acces
Tester depuis un service externe :
# Utilisez webhook.site ou similaire pour tester
curl -X POST "https://votre-systeme.com/webhooks/forecast" \
-H "Content-Type: application/json" \
-d '{"test": "webhook"}'
Problemes courants :
- Pare-feu bloquant les IP Forecast
- Certificat HTTPS invalide
- Point d'acces retournant un code de statut non-2xx
Solution : Mettez en liste blanche les IP Forecast (contactez le support pour la liste)
3. Verifier la validation de signature
Probleme : Rejet des webhooks en raison d'echec de verification de signature
Deboguer la validation de signature :
import hmac
import hashlib
def verify_webhook(payload, signature, secret):
# Calculer la signature attendue
expected = hmac.new(
secret.encode('utf-8'),
payload.encode('utf-8'),
hashlib.sha256
).hexdigest()
# Sortie de debogage
print(f"Received signature: {signature}")
print(f"Expected signature: {expected}")
print(f"Match: {hmac.compare_digest(signature, expected)}")
return hmac.compare_digest(signature, expected)
Delais de livraison des webhooks
Symptomes :
- Webhooks arrivent en retard (plus de 5 minutes apres l'evenement)
- Temps de livraison incoherents
Causes :
- Votre point d'acces lent a repondre
- Congestion reseau
- Delais de reessai apres echecs
Solutions :
1. Optimiser le temps de reponse du point d'acces
// Incorrect : Traitement lent bloque la reponse
app.post('/webhooks/forecast', async (req, res) => {
await processWebhook(req.body); // Operation lente
res.status(200).send('OK');
});
// Correct : Accuser reception immediatement, traiter de maniere asynchrone
app.post('/webhooks/forecast', async (req, res) => {
res.status(200).send('OK'); // Repondre immediatement
// Traiter de maniere asynchrone
processWebhookAsync(req.body).catch(err => {
console.error('Webhook processing error:', err);
});
});
2. Surveiller la livraison des webhooks
GET /v1/forecast/webhooks/wh_123/deliveries?limit=50
# Verifier les livraisons recentes
{
"deliveries": [
{
"delivery_id": "del_abc123",
"event": "predictions.generated",
"timestamp": "2024-01-20T03:15:42Z",
"response_code": 200,
"response_time_ms": 350,
"status": "success"
}
]
}
Problemes de performance
Reponses lentes de l'interface de programmation
Symptomes :
- Requetes prenant plus de 5 secondes
- Temps de reponse incoherents
Etapes de diagnostic :
1. Identifier les points d'acces lents
# Ajouter un chronometre aux requetes
time curl -X GET "https://api.eaternity.org/v1/forecast/predictions?date=2024-01-20" \
-H "Authorization: Bearer votre_cle_api"
2. Optimiser les parametres de requete
Lent (demande tous les articles) :
GET /v1/forecast/predictions?date=2024-01-20&end_date=2024-01-27
# Retourne 65 articles × 7 jours = 455 previsions
Rapide (articles specifiques uniquement) :
GET /v1/forecast/predictions?date=2024-01-20&items=pasta_carbonara,grilled_salmon
# Retourne 2 articles × 1 jour = 2 previsions
3. Utiliser le cache
import time
from functools import lru_cache
@lru_cache(maxsize=100)
def get_predictions_cached(date):
return get_predictions(date)
# Le cache expire apres 1 heure
def get_predictions_with_expiry(date):
cache_key = f"{date}_{int(time.time() // 3600)}"
return get_predictions_cached(cache_key)
Problemes de qualite des donnees
Note de qualite des donnees faible
Symptomes :
- Note de qualite des donnees inferieure a 80 %
- Avertissements dans le tableau de bord
- Previsions avec faible confiance
Etapes d'amelioration :
1. Executer le rapport de qualite des donnees
GET /v1/forecast/analytics/data-quality
# Rapport detaille
{
"overall_score": 72,
"components": {
"completeness": 85, # Certaines dates manquantes
"consistency": 65, # Problemes de denomination
"accuracy": 80, # Quelques valeurs aberrantes
"timeliness": 70 # Soumissions en retard
},
"issues": [...]
}
2. Corriger les problemes specifiques
Dates manquantes :
# Soumettre les donnees manquantes
POST /v1/forecast/sales
{
"date": "2024-01-15",
"items": [...]
}
Denomination incoherente :
# Standardiser les noms d'articles
POST /v1/forecast/items/standardize
{
"standardizations": [
{
"variants": ["pasta carbonara", "Pasta Carbonara", "PASTA_CARBONARA"],
"standard": "pasta_carbonara"
}
]
}
Valeurs aberrantes :
# Signaler et expliquer les valeurs aberrantes
POST /v1/forecast/sales/2024-01-15/annotate
{
"item_id": "grilled_salmon",
"note": "Holiday event, 2x normal volume expected",
"type": "special_event"
}
Obtenir de l'aide
Canaux de support
| Type de probleme | Contact | Delai de reponse |
|---|---|---|
| Critique (Production hors service) | forecast-api@eaternity.org + Telephone | 4 heures |
| Eleve (Integration cassee) | forecast-api@eaternity.org | 24 heures |
| Moyen (Questions de precision) | forecast@eaternity.org | 48 heures |
| Faible (Questions generales) | Documentation ou e-mail | 1 semaine |
Informations a inclure
Dans toutes les demandes de support :
- ID cuisine
- Type d'integration (Necta, interface de programmation personnalisee, Manuel)
- Description du probleme
- Etapes pour reproduire
- Messages d'erreur (le cas echeant)
- Captures d'ecran (si pertinent)
- Exemple de requete/reponse (pour les problemes d'interface de programmation)
Ressources en libre-service
- Reference de l'interface de programmation — Documentation complete de l'interface de programmation
- Apercu des integrations — Toutes les options d'integration
- Integration Necta — Guide specifique Necta
- Integration de l'interface de programmation personnalisee — Guide de l'interface de programmation REST
- Guide de mise en oeuvre — Meilleures pratiques de flux de travail quotidien
Voir aussi
- Apercu des integrations — Toutes les options d'integration
- Integration Necta — Configuration specifique Necta
- Integration de l'interface de programmation personnalisee — Guide de l'interface de programmation REST
- Reference de l'interface de programmation — Documentation complete de l'interface de programmation