Customer Invoice API
Gérez les factures clients à travers différents systèmes ERP avec une API REST unifiée.
Créez et lisez les factures pour Acomba, QuickBooks Online, Avantage et autres systèmes ERP.
/Entity/CustomerInvoice/Entity/CustomerInvoiceAperçu
L’entité CustomerInvoice représente une facture client dans votre système ERP.
Cette API permet d’effectuer des opérations de lecture (GET) et de création (POST) sur les factures
de manière standardisée, peu importe le système ERP sous-jacent.
L’API utilise des endpoints REST standards avec les méthodes HTTP appropriées :
GET /Entity/CustomerInvoice– Récupérer une liste de facturesGET /Entity/CustomerInvoice/{id}– Récupérer une facture spécifiquePOST /Entity/CustomerInvoice– Créer une nouvelle facture
Les champs disponibles et requis varient selon le système ERP. Les factures incluent généralement un en-tête avec les informations client et vendeur, ainsi que des lignes de détail pour chaque produit/service.
Matrice de Support
Opérations supportées pour l’entité CustomerInvoice par système ERP :
| Système ERP | GET | POST | PUT |
|---|---|---|---|
| Acomba | ✓ Oui | ✓ Oui | ✗ Non |
| QuickBooks Online | ✓ Oui | ✓ Oui | ✗ Non |
| Avantage | ✓ Oui | ✗ Non | ✗ Non |
| Sage 50 | ✗ Non | ✗ Non | ✗ Non |
| Servex | ✗ Non | ✗ Non | ✗ Non |
| Servicentre | ✗ Non | ✗ Non | ✗ Non |
La modification (PUT/UPDATE) des factures n’est supportée par aucun système ERP pour préserver l’intégrité comptable et respecter les règles d’audit. Une fois créée, une facture ne peut généralement pas être modifiée – il faut plutôt créer une note de crédit ou une facture d’ajustement.
GET CustomerInvoice
Récupère une liste de factures avec support de filtrage, pagination et sélection de champs.
/Entity/CustomerInvoiceParamètres de requêtes
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| $filter | string | Optionnel | Expression de filtrage de style OData |
| $select | string | Optionnel | Champs à retourner (séparés par des virgules) |
| $expand | string | Optionnel | Champs à épandre |
| $orderby | string | Optionnel | Permet de trier les résultats |
| $top | integer | Optionnel | Nombre maximum de résultats |
| $skip | integer | Optionnel | Nombre de résultats à ignorer (pagination) |
Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l’API d’ERP Connector
GET /Entity/CustomerInvoice?$filter=DateFacture ge '2024-01-01'&$select=NoFacture,DateFacture,TotalFacture,InfoClientFacturerA Host: https://v4.api.onlineerp.solution.quebec/api Content-Type: application/json
[
{
"NoFacture": "F-2024-001",
"DateFacture": "2024-01-15T00:00:00",
"TotalFacture": 1456.75,
"SousTotalFacture": 1250.00,
"InfoClientFacturerA": {
"NoClient": "C001",
"NomClient": "Acme Corporation",
"EmailPrincipal_Adresse": "contact@acme.com"
},
"LigneFacture": [
{
"NoLigneFacture": 1,
"strNoProduit": "PROD-001",
"DescriptionLigne": "Service de consultation",
"QteFacture": 10,
"PrixFinal": 125.00,
"Montant_SousTotalLigne": 1250.00
}
]
},
{
"NoFacture": "F-2024-002",
"DateFacture": "2024-01-16T00:00:00",
"TotalFacture": 567.90,
"SousTotalFacture": 500.00,
"InfoClientFacturerA": {
"NoClient": "C002",
"NomClient": "Tech Industries",
"EmailPrincipal_Adresse": "info@tech-ind.com"
},
"LigneFacture": [
{
"NoLigneFacture": 1,
"strNoProduit": "PROD-002",
"DescriptionLigne": "Maintenance serveur",
"QteFacture": 5,
"PrixFinal": 100.00,
"Montant_SousTotalLigne": 500.00
}
]
}
]
POST CustomerInvoice (Création)
Crée une nouvelle facture dans le système ERP. La facture doit inclure au moins une ligne de détail.
/Entity/CustomerInvoiceUtilisez le header If-None-Match: * pour garantir que la création échouera si l’entité existe déjà.
Champs requis par ERP
| Champ | Type | Acomba | QuickBooks | Description |
|---|---|---|---|---|
| NoFacture | string | ✓ Required | Optional | Numéro de la facture (obligatoire pour Acomba) |
| DateFacture | datetime | ✓ Required | ✓ Required | Date de la facture |
| InfoClientFacturerA | object | ✓ Required | ✓ Required | Informations du client à facturer |
| LigneFacture | array | ✓ Required | ✓ Required | Liste des lignes de détail de la facture |
Structure d’une ligne de détail
| Champ | Type | Requis | Description |
|---|---|---|---|
| strNoProduit | string | ✓ Required | Numéro du produit à facturer |
| QteFacture | decimal | ✓ Required | Quantité facturée |
| PrixFinal | decimal | ✓ Required | Prix unitaire final |
| DescriptionLigne | string | Optional | Description personnalisée de la ligne |
POST /Entity/CustomerInvoice
Host: https://v4.api.onlineerp.solution.quebec/api
Content-Type: application/json
If-None-Match: *
{
"Facture": {
"TypeDoc": "FACTURES", // Type doc est important! : 'FACTURES','COMMANDES','SOUMISSIONS','ACHATS'"Référence": "From OERP",
"Description": "From OERP",
"DateFacture": "2024-04-24", // La date de la commande// Les informations sur le client attaché à la commande"InfoClientFacturerA": {
"NoClient": "0Comptoir"
},
/***************************************************/// Array des LIGNES de la commande à créer. Comme toutes les autres transactions, il y a plusieurs types de lignes possibles"LigneFacture": [
{ // La version ici est ultra simple : NoProduit et Qté. La description et toute autre info sera ramassée dans Acomba
"QteFacture": 4,
"strNoProduit": "CAThermo"
},
{ // Une simple ligne de commentaire
"DescriptionLigne": "Il est aussi possible de simplement pousser une ligne de texte"
},
{ // Une ligne d'espace vide
"DescriptionLigne": ""
},
{ // Ici, on va facturer un GROUPE DE PRODUIT directement, sans utiliser un code de produit
"QteFacture": 1,
"QteCommande": 1,
"strNoGroupeProduit": "115",
"DescriptionLigne": "Il est aussi possible de ne facturer que sur le Groupe de produit",
"PrixFinal": 26.09
},
{ // La ligne ici montre un exemple où l'on assigne aussi le champ QteFacture. Cela permet de marquer que la ligne a été "Expédié" au client. Aucun mouvement d'inventaire n'est généré avec cela"QteCommande": 3,
"QteFacture": 3, // donc reste 0 BO
"strNoProduit": "SCIE-10"
}
]
/***************************************************/
},
"ListeModePaiements": null,
// ReturnFullTransaction : peut être omis. Demande au Connecteur de nous retourner 100% du payload de la transaction créée. Inutile si vous n'avez besoin que du # de facture!"ReturnFullTransaction": true
}
{
"OrigRemoteTaskID": 129014,
"ResultType": "Success",
"ErrorType": "None",
"ResultMessage": "Tâche terminée avec succès",
"ResultPayload": {
"Message": "OK - Facture créée sous le numéro : 10044",
"NoFacture": "10044",
"ResultatPaiement": "OK - Aucun paiement appliqué",
"RecCardPos": "115",
"SousTotal": 1039.06,
"Total": 1195.17,
"FullTransaction": {
"NoFacture": "10044",
"NoUniqueSystemeSource": "115",
"TypeDoc": 1,
"Référence": "From OERP",
"Description": "From OERP",
"DateFacture": "2024-04-24T00:00:00",
"SousTotalFacture": 1039.06,
"TotalFacture": 1195.17,
"MontantNonPaye": 1195.17,
"ListeDesTaxes": [
{
"Taxe_Numero": "T.P.S. 100%",
"Taxe_Description": "Taxe sur les produits et services",
"MontantTaxe": 72.73,
"Taxe_NumeroLegalGouv": "RT100393939933"
},
{
"Taxe_Numero": "T.V.Q. 100%",
"Taxe_Description": "Taxe de Vente Québec",
"MontantTaxe": 83.38,
"Taxe_NumeroLegalGouv": "TQ1000292929922"
}
],
"InfoClientFacturerA": {
"NoClient": "0Comptoir",
"NomClient": "Ventes au comptoir",
"NoUniqueSystemeSource": "1",
"Adresse": "",
"Ville": "",
"CodePostal": "",
"Pays": "CA"
},
"LigneFacture": [
{
"NoLigneFacture": 1,
"strNoProduit": "CAThermo",
"strNoGroupeProduit": "115",
"DescriptionLigne": "Armoire en Thermo-plastique",
"QteFacture": 4,
"QteCommande": 4,
"PrixFinal": 122,
"PrixCoutant": 35,
"Montant_SousTotalLigne": 488,
"Montant_TotalLigne": 561.322
},
{
"NoLigneFacture": 2,
"strNoProduit": "",
"DescriptionLigne": "Il est aussi possible de simplement pousser une ligne de texte",
"QteFacture": 0,
"Montant_SousTotalLigne": 0
},
{
"NoLigneFacture": 3,
"strNoProduit": "",
"DescriptionLigne": "",
"QteFacture": 0,
"Montant_SousTotalLigne": 0
},
{
"NoLigneFacture": 4,
"strNoProduit": "",
"strNoGroupeProduit": "115",
"DescriptionLigne": "Il est aussi possible de ne facturer que sur le Groupe de produit",
"QteFacture": 1,
"QteCommande": 0,
"PrixFinal": 26.09,
"Montant_SousTotalLigne": 26.09,
"Montant_TotalLigne": 30.0100225
},
{
"NoLigneFacture": 5,
"strNoProduit": "SCIE-10",
"strNoGroupeProduit": "126",
"DescriptionLigne": "Scie à onglets 10\" avec guide de coupe à laser",
"QteFacture": 3,
"QteCommande": 3,
"PrixFinal": 174.99,
"PrixCoutant": 89.99,
"Montant_SousTotalLigne": 524.97,
"Montant_TotalLigne": 603.8467425
}
],
"NbLignes": 5
}
},
"IsTaskCompleted": true
}
Pour Acomba, le NoFacture est obligatoire. Pour QuickBooks, il est généré automatiquement. Les taxes sont calculées automatiquement selon le groupe de taxes (NoGroupeTaxe) configuré dans le système.
Modèle de Données Complet
En-tête de Facture (FicheTransactions)
| Champ | Type | Description |
|---|---|---|
| NoFacture | string | Numéro de la facture |
| NoUniqueSystemeSource | string | Identifiant unique du système source ERP |
| TypeDoc | enum | Type de document (FACTURES, COMMANDES, SOUMISSIONS) |
| DateFacture | datetime | Date de la facture |
| Référence | string | Numéro de référence ou de bon de commande |
| Description | string | Description générale de la facture |
| TotalFacture | decimal? | Montant total incluant les taxes |
| SousTotalFacture | decimal? | Sous-total avant taxes |
| MontantNonPaye | decimal | Solde restant à payer |
| FraisDeTransport | decimal | Frais de livraison ou de transport |
| InfoClientFacturerA | FicheClient | Informations du client à facturer |
| InfoClientLivrerA | FicheClient | Informations du client pour la livraison |
| NoVendeur | string | Numéro du vendeur assigné |
| NoTerritoire | string | Numéro du territoire de vente |
| TermeDePaiement | TermeDePaiement | Conditions de paiement (Net 30, Net 60, etc.) |
| NoProjet | string | Numéro de projet associé |
| LigneFacture | List<LigneTransactions> | Liste des lignes de détail de la facture |
| ListeDesTaxes | List<InfoTaxe> | Détail des taxes calculées |
| ListeReglement | List<ARPayment> | Liste des paiements reçus |
| NoCommandeRéférence | string | Numéro de commande de référence |
| NoSoumissionRéférence | string | Numéro de soumission de référence |
| EstActif | bool | Indique si la facture est active |
| EstInversee | bool | Indique si la facture a été inversée (annulée) |
Lignes de Détail (LigneTransactions)
| Champ | Type | Description |
|---|---|---|
| NoLigneFacture | int | Numéro de séquence de la ligne |
| strNoProduit | string | Numéro du produit |
| DescriptionLigne | string | Description de la ligne (peut être vide pour ligne de commentaire) |
| QteFacture | decimal | Quantité facturée (expédiée) |
| QteCommande | decimal | Quantité commandée |
| PrixOrig | decimal | Prix unitaire original avant rabais |
| PrixFinal | decimal | Prix unitaire final après rabais |
| PrixCoutant | decimal | Prix coûtant du produit |
| MontantRabais_pct | decimal | Pourcentage de rabais appliqué |
| Montant_SousTotalLigne | decimal | Sous-total de la ligne avant taxes |
| Montant_TotalLigne | decimal | Montant total de la ligne incluant les taxes |
| NoGroupeTaxe | string | Numéro du groupe de taxes à appliquer |
| NoCompteGL | string | Numéro de compte du Grand Livre |
| NoProjet | string | Numéro de projet associé à la ligne |
| UniteMesure | string | Unité de mesure (unité, kg, m², etc.) |
| TypeLigne | enum | Type de ligne (produit, commentaire, sous-total, etc.) |
| FicheProduit | FicheProduits | Objet complet du produit associé |
| ListeDesTaxes | List<InfoTaxe> | Détail des taxes calculées pour cette ligne |
Les objets FicheTransactions et LigneTransactions supportent également un dictionnaire ExtendedProperties pour des propriétés personnalisées ou spécifiques à un ERP.