Dépannage de l'intégration
Ce guide vous aide à diagnostiquer et résoudre les problèmes courants d'intégration avec Eaternity Forecast.
Problèmes d'authentification
La clé d'interface de programmation ne fonctionne pas
Symptomes :
- Réponses 401 Non autorise
- Erreurs « Échec de l'authentification »
Causes courantes et solutions :
1. Format de clé d'interface de programmation incorrect
Problème : Espaces ou caractères supplémentaires dans la clé
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 clé bac à sable en production
Problème : Tentative d'utiliser une clé d'interface de programmation bac à 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. Clé d'interface de programmation expiree
Problème : La clé a été renouvelee ou à expire
Solution :
- Connectez-vous au tableau de bord Forecast
- Naviguez vers Paramètres → Clés d'interface de programmation
- Generez une nouvelle clé d'interface de programmation
- Mettez à jour votre intégration avec la nouvelle clé
4. En-tête d'autorisation manquant
Problème : Oubli d'inclure l'en-tête 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"
Problèmes de jeton OAuth
Symptomes :
- Erreurs de jeton expire
- Réponses jeton invalide
Solutions :
Implementer le rafraîchissement 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;
}
Problèmes de soumission de données
Échec de l'import de données historiques
Symptomes :
- Import bloque en statut « processing »
- Import échoue avec des erreurs de validation
- Certains enregistrements ignorés
Causes courantes et solutions :
1. Format de date incorrect
Problème : 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
Problème : Omission des champs de données 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 incohérents
Problème : 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 données incohérentes :
# 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 données en double
Problème : Soumettre la même 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. Données trop volumineuses
Problème : Dépassement des limites de taille de requête
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
- Données de ventes n'apparaissant pas dans le tableau de bord
- Prévisions non mises à jour
Solutions :
Vérifier la qualité des données
Point d'accès 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 quantité négative | Utilisez 0 pour les articles non vendus |
Item ID contains invalid characters | Caractères spéciaux dans l'ID | Utilisez uniquement alphanumériques, underscore, tiret |
Date in future | Date non encore survenue | Soumettez uniquement des données historiques |
Price exceeds maximum | Prix supérieur à 999,99 | Contactez le support si legitime |
Problèmes de récupération des prévisions
Prévisions non disponibles
Symptomes :
- 404 Non trouvé pour les requêtes de prévision
- Tableau de prévisions vide
- Message « No predictions generated »
Causes courantes et solutions :
1. Données d'entrainement insuffisantes
Problème : Le modèle n'a pas encore fini l'entrainement
Vérifier 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 terminé (généralement 1-2 semaines)
2. Pas de données de ventes récentes
Problème : Pas de données de ventes soumises récemment
Vérifier la dernière soumission de données :
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 données de ventes manquantes
3. Date future demandee au-delà de la plage
Problème : Demande de prévisions 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
Problème : Demande de prévisions pour un article du menu retire
Vérifier 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 requêtes de prévision
Problèmes de précision des prévisions
Symptomes :
- Prévisions constamment trop élevées ou trop basses
- Intervalles de confiance larges
- MAPE supérieur à 20 %
Étapes de diagnostic :
1. Vérifier la note de qualité des données
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 problèmes de qualité des données identifiés
2. Vérifier les changements récents
Problème : Changements de menu, changements opérationnels non reflétés
Vérifier 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 après les changements de menu importants
- Fournissez des modifications manuelles pendant la période de transition
- Soumettez des retours sur les raisons des écarts
3. Identifier les erreurs systematiques
Analyser les tendances d'écart :
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 modèle apprend avec le temps, ou fournissez des données de facteurs externes (météo, événements)
Problèmes de réseau et de connectivite
Erreurs de timeout
Symptomes :
- Timeout de requête après 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 opérations 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 limité de débit
Symptomes :
- 429 Trop de requêtes
- Message « Rate limit exceeded »
Solutions :
1. Respecter l'en-tête 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 requêtes
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 limité de débit
Pour les intégrations à fort volume :
- E-mail forecast-api@eaternity.org
- Fournissez le cas d'utilisation et le volume de requêtes attendu
- Limites de débit personnalisées disponibles
Problèmes d'intégration Necta
Le module Forecast n'apparaît pas
Symptomes :
- Pas d'onglet « Prévisions » 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. Vérifier 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. Vérifier les permissions utilisateur
Problème : Le role utilisateur n'a pas accès à Forecast
Solution :
- L'administrateur doit accorder les permissions Forecast
- Naviguez vers Paramètres Necta → Utilisateurs → [Votre utilisateur] → Permissions
- Activez l'accès au module « Forecast »
Données non synchronisees depuis Necta
Symptomes :
- Prévisions non mises à jour avec les dernières données de ventes Necta
- Import historique incomplet
Solutions :
1. Vérifier la saisie des données Necta
Vérifier dans Necta :
- Naviguez vers Ventes → Rapports quotidiens
- Vérifiez que les données de ventes sont saisies pour les dates récentes
- Assurez-vous que tous les articles du menu sont enregistres
2. Vérifier 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'intégration
Via le tableau de bord Necta :
- Naviguez vers Intégrations → Eaternity Forecast
- Cliquez sur « Deconnecter »
- Cliquez sur « Reconnecter »
- Accordez à nouveau les permissions
Problèmes de webhooks
Webhooks non livres
Symptomes :
- Pas de notifications webhook reçues
- Point d'accès webhook jamais appele
Solutions :
1. Vérifier 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" : Vérifiez les journaux d'erreurs
2. Vérifier l'accessibilite du point d'accès
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"}'
Problèmes courants :
- Pare-feu bloquant les IP Forecast
- Certificat HTTPS invalide
- Point d'accès retournant un code de statut non-2xx
Solution : Mettez en liste blanche les IP Forecast (contactez le support pour la liste)
3. Vérifier la validation de signature
Problème : Rejet des webhooks en raison d'échec de vérification 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 après l'événement)
- Temps de livraison incohérents
Causes :
- Votre point d'accès lent à répondre
- Congestion réseau
- Delais de reessai après echecs
Solutions :
1. Optimiser le temps de réponse du point d'accès
// 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"
}
]
}
Problèmes de performance
Réponses lentes de l'interface de programmation
Symptomes :
- Requêtes prenant plus de 5 secondes
- Temps de réponse incohérents
Étapes de diagnostic :
1. Identifier les points d'accès 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 paramètres de requête
Lent (demandé 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 spécifiques 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)
Problèmes de qualité des données
Note de qualité des données faible
Symptomes :
- Note de qualité des données inférieure à 80 %
- Avertissements dans le tableau de bord
- Prévisions avec faible confiance
Étapes d'amélioration :
1. Exécuter le rapport de qualité des données
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 problèmes spécifiques
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 problème | Contact | Délai de réponse |
|---|---|---|
| Critique (Production hors service) | forecast-api@eaternity.org + Telephone | 4 heures |
| Eleve (Intégration cassee) | forecast-api@eaternity.org | 24 heures |
| Moyen (Questions de précision) | 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'intégration (Necta, interface de programmation personnalisée, Manuel)
- Description du problème
- Étapes pour reproduire
- Messages d'erreur (le cas échéant)
- Capturés d'écran (si pertinent)
- Exemple de requête/réponse (pour les problèmes d'interface de programmation)
Ressources en libre-service
- Référence de l'interface de programmation — Documentation complete de l'interface de programmation
- Aperçu des intégrations — Toutes les options d'intégration
- Intégration Necta — Guide spécifique Necta
- Intégration de l'interface de programmation personnalisée — Guide de l'interface de programmation REST
- Guide de mise en oeuvre — Meilleures pratiques de flux de travail quotidien
Voir aussi
- Aperçu des intégrations — Toutes les options d'intégration
- Intégration Necta — Configuration spécifique Necta
- Intégration de l'interface de programmation personnalisée — Guide de l'interface de programmation REST
- Référence de l'interface de programmation — Documentation complete de l'interface de programmation