Générez un bon de commande avec les totaux calculés
Transformez des données d’achat approuvées en un bon de commande structuré et cohérent sans recréer les règles de calcul dans chaque application.
Lancer gratuitement
Indiquez le numéro du bon, l’acheteur, le fournisseur et au moins une ligne comportant une description, une quantité et un coût unitaire. Le générateur valide les données obligatoires, calcule chaque montant et le total de la commande, puis renvoie un objet prévisible prêt pour le contrôle interne, le stockage, la mise en page, l’approbation formelle ou une autre étape du processus d’achat.
Préparez toutes les données du bon de commande
Commencez par un numéro de bon de commande déjà attribué par votre système d’achats. Le générateur conserve exactement cette valeur après suppression des espaces extérieurs ; il n’invente aucun identifiant, ne consulte aucune séquence et ne réserve aucun numéro. Identifiez ensuite l’acheteur et le fournisseur. Ces champs peuvent contenir une raison sociale courte ou un bloc plus complet avec adresse et informations d’immatriculation, selon les attentes du système chargé de présenter le document. Ajoutez au moins une ligne et fournissez pour chacune une description précise, une quantité numérique supérieure à zéro et un coût unitaire numérique positif ou nul. Les quantités fractionnaires conviennent aux biens ou services achetés au poids, à la longueur, au temps ou selon une autre unité divisible. Un coût nul est accepté pour un article réellement gratuit, mais une quantité nulle ou négative est refusée, car elle ne constitue pas une commande. Utilisez une seule devise et une même base tarifaire pour tous les coûts. La capacité ne déduit ni devise, ni unité de mesure, ni conditions de paiement, ni date de livraison, ni taxe, remise ou frais de transport ; traitez ces décisions métier avant ou après ce calcul.
Comprenez le calcul des totaux de la commande
Pour chaque ligne, le générateur multiplie la quantité par le coût unitaire et arrondit le montant obtenu à deux décimales. Il additionne ensuite ces montants arrondis et arrondit la somme afin de produire le sous-total du bon de commande. Puisque cette capacité n’accepte ni taxe, ni transport, ni remise, ni autre ajustement, le total renvoyé est égal au sous-total. Cette séquence explicite compte lorsque des quantités fractionnaires ou des coûts comportent plusieurs décimales : un autre système additionnant des valeurs intermédiaires non arrondies pourrait différer d’un centime. La réponse conserve la description normalisée, la quantité numérique d’origine, le coût unitaire arrondi et le montant calculé pour chaque article. Au niveau du document, elle renvoie le type, le numéro fourni, l’acheteur, le fournisseur, les lignes, le sous-total et le total. Tous les nombres doivent être finis ; les chaînes qui ressemblent à des nombres ne sont pas converties discrètement. Les coûts négatifs sont également refusés. Ces règles signalent rapidement les données erronées et fournissent aux modèles, écrans d’approbation, bases de données et intégrations un contrat de calcul stable.
Intégrez le document structuré à vos achats
Placez cette capacité après l’approbation de la demande et l’attribution du numéro, lorsque les données modifiables sont prêtes à devenir un enregistrement maîtrisé. Envoyez les noms normalisés des parties et les lignes, puis conservez l’objet renvoyé comme résultat de calcul pour les étapes suivantes. Un modèle peut le convertir en HTML ou PDF, un service d’approbation peut comparer son total aux seuils d’autorisation et une intégration peut transférer les lignes vers un ERP ou un portail fournisseur. Ces actions restent distinctes : le générateur ne transmet pas la commande, ne contacte pas le fournisseur, ne crée aucun fichier, ne réserve aucun budget et ne met pas les stocks à jour. Il n’utilise ni réseau, ni horloge, ni valeur aléatoire, ni stockage, ni état caché ; une requête identique produit donc toujours la même réponse. Cela simplifie les relances et les audits. Corrigez les erreurs de validation avant de présenter la commande à la signature, notamment les lignes absentes, les coordonnées vides, le numéro manquant ou les montants non numériques. Une requête API coûte $0.002, et le même calcul pur peut alimenter l’expérience dans le navigateur.
Cas d’usage
Créez des bons de commande approuvés
Transformez les lignes de demandes approuvées en un document structuré aux totaux cohérents.
Alimentez un formulaire d’achat
Calculez les montants pendant que le personnel prépare les données pour contrôle et présentation.
Uniformisez les intégrations d’achat
Fournissez aux applications internes et aux fournisseurs un contrat de calcul déterministe unique.
Questions fréquentes
Combien coûte une requête API ?
Chaque requête API coûte $0.002.
Que se passe-t-il en l’absence de lignes ?
La requête renvoie une erreur de saisie, car tout bon de commande doit contenir au moins une ligne.
Comment les montants sont-ils arrondis ?
Chaque quantité est multipliée par son coût unitaire et arrondie à deux décimales ; les montants des lignes sont ensuite additionnés et arrondis.
Le générateur attribue-t-il un numéro ?
Non. Vous devez fournir le numéro, que le résultat conserve dans le document structuré.
Le résultat inclut-il taxes, devise ou PDF ?
Non. Il renvoie des données structurées et les totaux calculés. Taxes, devise, mise en page et envoi sont des étapes distinctes.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/doc/purchase-order-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"po_number":"PO-2026-0142","buyer":"Contoso Retail","vendor":"Northwind Supplies","line_items":[{"description":"Ergonomic keyboard","quantity":12,"unit_cost":79.95},{"description":"USB-C dock","quantity":5,"unit_cost":149.5}]}'const res = await fetch("https://api.kit.forhosting.com/doc/purchase-order-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"po_number": "PO-2026-0142",
"buyer": "Contoso Retail",
"vendor": "Northwind Supplies",
"line_items": [
{
"description": "Ergonomic keyboard",
"quantity": 12,
"unit_cost": 79.95
},
{
"description": "USB-C dock",
"quantity": 5,
"unit_cost": 149.5
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/doc/purchase-order-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"po_number": "PO-2026-0142",
"buyer": "Contoso Retail",
"vendor": "Northwind Supplies",
"line_items": [
{
"description": "Ergonomic keyboard",
"quantity": 12,
"unit_cost": 79.95
},
{
"description": "USB-C dock",
"quantity": 5,
"unit_cost": 149.5
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/doc/purchase-order-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"po_number":"PO-2026-0142","buyer":"Contoso Retail","vendor":"Northwind Supplies","line_items":[{"description":"Ergonomic keyboard","quantity":12,"unit_cost":79.95},{"description":"USB-C dock","quantity":5,"unit_cost":149.5}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"po_number":"PO-2026-0142","buyer":"Contoso Retail","vendor":"Northwind Supplies","line_items":[{"description":"Ergonomic keyboard","quantity":12,"unit_cost":79.95},{"description":"USB-C dock","quantity":5,"unit_cost":149.5}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/doc/purchase-order-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"po_number": "PO-2026-0142",
"buyer": "Contoso Retail",
"vendor": "Northwind Supplies",
"line_items": [
{
"description": "Ergonomic keyboard",
"quantity": 12,
"unit_cost": 79.95
},
{
"description": "USB-C dock",
"quantity": 5,
"unit_cost": 149.5
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "doc.purchase_order_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_mb | 25 |
max_pages | 200 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |