{
  "openapi": "3.1.0",
  "info": {
    "title": "API ERPConnector",
    "version": "1.0.0+2026-09-04",
    "summary": "API REST unifiée d'accès aux données de votre ERP (Acomba, Avantage, Sage 50, Sage 300, QuickBooks, ProShop, Autotask).",
    "description": "Une seule API, quel que soit l'ERP derrière : c'est votre **code licence** qui détermine\nle connecteur utilisé. Toutes les entités s'appellent de la même façon :\n`{VERBE} https://gateway.erpconnector.ca/api/Entity/{Entité}`.\n\n**Authentification** — Basic Auth : votre *Code Licence* comme nom d'utilisateur, votre\n*Clé API secrète* comme mot de passe. Ajoutez l'en-tête `CompanyCode` si votre licence\ndonne accès à plusieurs compagnies (sans lui, la compagnie `0` est utilisée).\n\n**Disponibilité par ERP** — les champs et les opérations ne sont pas tous supportés par tous\nles ERP. Chaque opération et chaque champ indique ici les ERP concernés, d'après la matrice\nde support officielle.\n\nProvenance de la matrice : Acomba 4.6.8 (2026-09-04) · Autotask 1.0.0 (2026-07-29) · Avantage 3.5.0 (2026-09-04) · ProShop 1.0.0 (2026-07-29) · QuickBooksOnline 1.0.5.0904 (2026-09-04) · Sage300 1.0.0 (2026-09-04) · Sage50 1.5.0 (2026-09-04).",
    "contact": {
      "name": "Solution Infomedia",
      "url": "https://erpconnector.ca"
    }
  },
  "servers": [
    {
      "url": "https://gateway.erpconnector.ca/api",
      "description": "Passerelle de production ERPConnector"
    }
  ],
  "security": [
    {
      "licenceBasicAuth": []
    }
  ],
  "tags": [
    {
      "name": "1 - Informations générales",
      "description": "Identité et configuration de la compagnie.\n\nEntités : `CompanyInfo`, `CustomEntity`."
    },
    {
      "name": "1.1 - Company Info",
      "description": "Entité `CompanyInfo` — voir le schéma du même nom."
    },
    {
      "name": "1.2 - Custom Entity",
      "description": "Entité `CustomEntity` — voir le schéma du même nom."
    },
    {
      "name": "2 - Comptabilité (GL)",
      "description": "Grand livre, écritures, projets comptables et taxes.\n\nEntités : `GLAccount`, `GLJournalEntry`, `GLJournalEntryLine`, `GLProject`, `GLProjectBalance`, `FinancialTransaction`, `Tax`, `TaxGroup`."
    },
    {
      "name": "2.1 - GL Account",
      "description": "Entité `GLAccount` — voir le schéma du même nom."
    },
    {
      "name": "2.2 - GL Journal Entry",
      "description": "Entité `GLJournalEntry` — voir le schéma du même nom."
    },
    {
      "name": "2.3 - GL Journal Entry Line",
      "description": "Entité `GLJournalEntryLine` — voir le schéma du même nom."
    },
    {
      "name": "2.4 - GL Project",
      "description": "Entité `GLProject` — voir le schéma du même nom."
    },
    {
      "name": "2.5 - GL Project Balance",
      "description": "Entité `GLProjectBalance` — voir le schéma du même nom."
    },
    {
      "name": "2.6 - Financial Transaction",
      "description": "Entité `FinancialTransaction` — voir le schéma du même nom."
    },
    {
      "name": "2.7 - Tax",
      "description": "Entité `Tax` — voir le schéma du même nom."
    },
    {
      "name": "2.8 - Tax Group",
      "description": "Entité `TaxGroup` — voir le schéma du même nom."
    },
    {
      "name": "3 - Comptes clients",
      "description": "Le cycle de vente : clients, soumissions, commandes, factures et encaissements.\n\nEntités : `Customer`, `CustomerAddress`, `CustomerBid`, `CustomerBidLine`, `CustomerOrder`, `CustomerOrderLine`, `CustomerInvoice`, `CustomerInvoiceLine`, `CustomerARInvoice`, `CustomerARInvoiceLine`, `CustomerInvoicePayment`, `CustomerServiceContract`, `CustomerPaymentTerm`.\n\nVoir aussi : `Tax` (Comptabilité (GL)), `TaxGroup` (Comptabilité (GL)), `Product` (Inventaire)."
    },
    {
      "name": "3.1 - Customer",
      "description": "Entité `Customer` — voir le schéma du même nom."
    },
    {
      "name": "3.2 - Customer Address",
      "description": "Entité `CustomerAddress` — voir le schéma du même nom."
    },
    {
      "name": "3.3 - Customer Bid",
      "description": "Entité `CustomerBid` — voir le schéma du même nom."
    },
    {
      "name": "3.4 - Customer Bid Line",
      "description": "Entité `CustomerBidLine` — voir le schéma du même nom."
    },
    {
      "name": "3.5 - Customer Order",
      "description": "Entité `CustomerOrder` — voir le schéma du même nom."
    },
    {
      "name": "3.6 - Customer Order Line",
      "description": "Entité `CustomerOrderLine` — voir le schéma du même nom."
    },
    {
      "name": "3.7 - Customer Invoice",
      "description": "Entité `CustomerInvoice` — voir le schéma du même nom."
    },
    {
      "name": "3.8 - Customer Invoice Line",
      "description": "Entité `CustomerInvoiceLine` — voir le schéma du même nom."
    },
    {
      "name": "3.9 - Customer AR Invoice",
      "description": "Entité `CustomerARInvoice` — voir le schéma du même nom."
    },
    {
      "name": "3.10 - Customer AR Invoice Line",
      "description": "Entité `CustomerARInvoiceLine` — voir le schéma du même nom."
    },
    {
      "name": "3.11 - Customer Invoice Payment",
      "description": "Entité `CustomerInvoicePayment` — voir le schéma du même nom."
    },
    {
      "name": "3.12 - Customer Service Contract",
      "description": "Entité `CustomerServiceContract` — voir le schéma du même nom."
    },
    {
      "name": "3.13 - Customer Payment Term",
      "description": "Entité `CustomerPaymentTerm` — voir le schéma du même nom."
    },
    {
      "name": "4 - Comptes fournisseurs",
      "description": "Le cycle d'achat : fournisseurs, commandes, réceptions, factures et paiements.\n\nEntités : `Supplier`, `SupplierProduct`, `SupplierOrder`, `SupplierOrderReceipt`, `SupplierInvoice`, `SupplierInvoicePayment`, `AccountPayableSettings`, `SupplierPaymentTerm`.\n\nVoir aussi : `Tax` (Comptabilité (GL)), `TaxGroup` (Comptabilité (GL))."
    },
    {
      "name": "4.1 - Supplier",
      "description": "Entité `Supplier` — voir le schéma du même nom."
    },
    {
      "name": "4.2 - Supplier Product",
      "description": "Entité `SupplierProduct` — voir le schéma du même nom."
    },
    {
      "name": "4.3 - Supplier Order",
      "description": "Entité `SupplierOrder` — voir le schéma du même nom."
    },
    {
      "name": "4.4 - Supplier Order Receipt",
      "description": "Entité `SupplierOrderReceipt` — voir le schéma du même nom."
    },
    {
      "name": "4.5 - Supplier Invoice",
      "description": "Entité `SupplierInvoice` — voir le schéma du même nom."
    },
    {
      "name": "4.6 - Supplier Invoice Payment",
      "description": "Entité `SupplierInvoicePayment` — voir le schéma du même nom."
    },
    {
      "name": "4.7 - Account Payable Settings",
      "description": "Entité `AccountPayableSettings` — voir le schéma du même nom."
    },
    {
      "name": "4.8 - Supplier Payment Term",
      "description": "Entité `SupplierPaymentTerm` — voir le schéma du même nom."
    },
    {
      "name": "5 - Inventaire",
      "description": "Produits, groupes et mouvements d'inventaire.\n\nEntités : `Product`, `ProductGroup`, `ProductTrail`.\n\nVoir aussi : `SupplierProduct` (Comptes fournisseurs)."
    },
    {
      "name": "5.1 - Product",
      "description": "Entité `Product` — voir le schéma du même nom."
    },
    {
      "name": "5.2 - Product Group",
      "description": "Entité `ProductGroup` — voir le schéma du même nom."
    },
    {
      "name": "5.3 - Product Trail",
      "description": "Entité `ProductTrail` — voir le schéma du même nom."
    },
    {
      "name": "6 - Ressources humaines",
      "description": "Employés, paie et feuilles de temps.\n\nEntités : `Employee`, `Payroll`, `Timesheet`."
    },
    {
      "name": "6.1 - Employee",
      "description": "Entité `Employee` — voir le schéma du même nom."
    },
    {
      "name": "6.2 - Payroll",
      "description": "Entité `Payroll` — voir le schéma du même nom."
    },
    {
      "name": "6.3 - Timesheet",
      "description": "Entité `Timesheet` — voir le schéma du même nom."
    },
    {
      "name": "8 - Divers",
      "description": "Entités transversales ou propres à un métier (projets, équipements, bons de travail).\n\nEntités : `Activity`, `Project`."
    },
    {
      "name": "8.1 - Activity",
      "description": "Entité `Activity` — voir le schéma du même nom."
    },
    {
      "name": "8.2 - Project",
      "description": "Entité `Project` — voir le schéma du même nom."
    }
  ],
  "paths": {
    "/Entity/CompanyInfo": {
      "get": {
        "tags": [
          "1 - Informations générales",
          "1.1 - Company Info"
        ],
        "x-apidog-folder": "1 - Informations générales/1.1 - Company Info",
        "operationId": "listCompanyInfo",
        "summary": "CompanyInfo — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba, Avantage, Sage50.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/CompanyInfo\n```\n\n**Limitations connues**\n\n- Acomba : Fiche unique (singleton). GetCard(1) sur l'index 1. Pas de QuerySettings : Top/Skip/filtres ignores par le dispatch.\n- Avantage : Extraction ODBC (ExtractionInfoCompany) depuis IDENTIF.DBF (dossier racine Avantage)\n- Avantage : Aucun filtre\n- Avantage : Mapping de champs minimal (pas de classe de mapping dédiée)\n- Sage50 : Lecture SQL table tCompany (1 seule ligne)\n- Sage50 : Aucun QuerySettings : ni filtre, ni tri, ni pagination\n- Sage50 : Méthode GetCompanyInfo() sans paramètre",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CompanyInfo.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FicheEntreprise"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CompanyInfo/{id}": {
      "get": {
        "tags": [
          "1 - Informations générales",
          "1.1 - Company Info"
        ],
        "x-apidog-folder": "1 - Informations générales/1.1 - Company Info",
        "operationId": "getCompanyInfo",
        "summary": "CompanyInfo — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CompanyInfo demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheEntreprise"
                },
                "examples": {
                  "get-response-acomba": {
                    "summary": "get response acomba",
                    "value": {
                      "NomEntreprise": "Ma Compagnie Inc.",
                      "Addresse": "123 rue Principale",
                      "Ville": "Montréal",
                      "Province": "QC",
                      "Pays": "Canada",
                      "CodePostal": "H2X 1Y4",
                      "NoTelephone": "514-555-1234",
                      "NoTelephone2": "514-555-5678",
                      "PersonneContact": "Jean Tremblay",
                      "EmailPrincipal": "info@macompagnie.com",
                      "SiteWebMain": "www.macompagnie.com",
                      "GL_PeriodeComptableCourante": 6,
                      "GL_NbPeriodeComptable": 12,
                      "GL_NomColonneBudgetGL1": "Budget 2024",
                      "GL_NomColonneBudgetGL2": "Budget 2025",
                      "GL_NomColonneBudgetGL3": "Prévisions",
                      "ARDefaultPaymentMode": "1",
                      "Fiche_DerniereModification": null
                    }
                  },
                  "get-response-avantage": {
                    "summary": "get response avantage",
                    "value": {
                      "NomEntreprise": "Code:01,Nom:Construction ABC",
                      "Addresse": "456 Boulevard Industriel, Suite 200",
                      "Ville": "Laval",
                      "Province": "QC",
                      "Pays": "CAN",
                      "CodePostal": "H7S 1Z3",
                      "NoTelephone": null,
                      "NoTelephone2": null,
                      "PersonneContact": null,
                      "EmailPrincipal": null,
                      "SiteWebMain": null,
                      "GL_PeriodeComptableCourante": 8,
                      "GL_NbPeriodeComptable": 12,
                      "GL_NomColonneBudgetGL1": "Budget1",
                      "GL_NomColonneBudgetGL2": "Budget2",
                      "GL_NomColonneBudgetGL3": "Budget3",
                      "ARDefaultPaymentMode": null,
                      "Fiche_DerniereModification": "1900-01-01T00:00:00"
                    }
                  },
                  "get-response-sage": {
                    "summary": "get response sage",
                    "value": {
                      "NomEntreprise": "Entreprise Demo Sage",
                      "Addresse": "789 Rue Commerce, Bureau 100",
                      "Ville": "Québec",
                      "Province": "QC",
                      "Pays": "Canada",
                      "CodePostal": "G1K 2M8",
                      "NoTelephone": "418-555-9876",
                      "NoTelephone2": "418-555-9877",
                      "PersonneContact": null,
                      "EmailPrincipal": "contact@entreprisedemo.ca",
                      "SiteWebMain": "www.entreprisedemo.ca",
                      "GL_PeriodeComptableCourante": -1,
                      "GL_NbPeriodeComptable": 0,
                      "GL_NomColonneBudgetGL1": null,
                      "GL_NomColonneBudgetGL2": null,
                      "GL_NomColonneBudgetGL3": null,
                      "ARDefaultPaymentMode": null,
                      "Fiche_DerniereModification": null
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CompanyInfo (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomEntity": {
      "get": {
        "tags": [
          "1 - Informations générales",
          "1.2 - Custom Entity"
        ],
        "x-apidog-folder": "1 - Informations générales/1.2 - Custom Entity",
        "operationId": "listCustomEntity",
        "summary": "CustomEntity — lister",
        "description": "**Lecture disponible pour** : Acomba (partial), Avantage.\n\n**Limitations connues**\n\n- Acomba : EXTRACT n'extrait aucune donnee d'entite : seule l'action personnalisee CustomTaskAction=TEST_ERP_CONNECTION est geree.\n- Acomba : TEST_ERP_CONNECTION ouvre/lit/ferme la compagnie Acomba et retourne une chaine de statut (AcombaTester.Tester_Connexion_Lecture_Deconnexion).\n- Acomba : Toute autre CustomTaskAction leve NotImplementedException (action personnalisee non supportee).\n- Avantage : Pseudo-entité pour les actions personnalisées (CustomTaskAction)\n- Avantage : Seule action supportée : TEST_ERP_CONNECTION",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomEntity.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/_generique_"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomEntity/{id}": {
      "get": {
        "tags": [
          "1 - Informations générales",
          "1.2 - Custom Entity"
        ],
        "x-apidog-folder": "1 - Informations générales/1.2 - Custom Entity",
        "operationId": "getCustomEntity",
        "summary": "CustomEntity — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomEntity demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/_generique_"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomEntity (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/GLAccount": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.1 - GL Account"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.1 - GL Account",
        "operationId": "listGLAccount",
        "summary": "GLAccount — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n- **Performance** : L'expansion des soldes (AnneeCourante, Budget01, etc.) peut impacter les performances. Utilisez-la uniquement lorsque nécessaire.\n\n**Lecture disponible pour** : Acomba, Avantage, Sage50.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/GLAccount?$expand=AnneeCourante,Budget01&$filter=ValeurAuCompte ne 0&$select=NoCompteGL,NomCompteGL,TypeDeCompte,ACtifPassif\nGET /Entity/GLAccount?$expand=AnneeCourante&$filter=NoCompteGL in ('1000','1100','2000')\nGET /Entity/GLAccount?$select=NoCompteGL,NomCompteGL,TypeDeCompte\n```\n\n**Limitations connues**\n\n- Acomba : Recherche par cle : GetFromPrimaryKey par NoCompteGL (Equals) ou liste (InList). Sinon scan total de l'index 1 (NumCards) avec lecture par buffer de 100.\n- Acomba : NoCompteGL doit etre un entier (int.TryParse) sinon ApplicationException.\n- Acomba : Fiches supprimees (ChStatus != 0) ignorees. Cle introuvable (erreur 10) -> ignoree silencieusement, pas d'exception.\n- Acomba : Soldes/budgets a 0 exclus par defaut sauf filtre ValeurAuCompte NotEquals 0 (IncludeEmptyBalance).\n- Avantage : Extraction ODBC (ExtractComptesGL)\n- Avantage : Classe de mapping dédiée (GLAccountFieldMapping) : n°/description + montants par période\n- Avantage : Montants éclatés sur 14 colonnes par jeu (L1PERn/L2PERn/L3PERn), regroupés en listes GLPeriodValue\n- Sage50 : Lecture SQL (tAccount + tActRang + tActDpt + tActDRel)\n- Sage50 : AUCUN filtre supporté (liste de filtres permis vide)\n- Sage50 : Retourne tous les comptes × combinaisons de département",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            },
            "example": "NoCompteGL,NomCompteGL,TypeDeCompte,ACtifPassif"
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `in`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "ValeurAuCompte ne 0"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `AnneeCourante` (Acomba/Sage50), `Budget01` (Acomba), `Budget02` (Acomba), `Budget03` (Acomba), `LignesAllocation` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "AnneeCourante",
                  "Budget01",
                  "Budget02",
                  "Budget03",
                  "LignesAllocation"
                ]
              }
            },
            "style": "form",
            "explode": false,
            "example": [
              "AnneeCourante",
              "Budget01"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de GLAccount.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ComptesGL"
                  }
                },
                "examples": {
                  "get-response-expand": {
                    "summary": "get response expand",
                    "value": [
                      {
                        "NoCompteGL": "1000",
                        "NomCompteGL": "Encaisse - Banque principale",
                        "NoUniqueSystemeSource": "1",
                        "TypeDeCompte": "Banque",
                        "AnneeCourante": [
                          {
                            "NoPeriode": 1,
                            "ValeurAuCompte": 45230.75
                          },
                          {
                            "NoPeriode": 2,
                            "ValeurAuCompte": 52180.50
                          },
                          {
                            "NoPeriode": 3,
                            "ValeurAuCompte": 48920.25
                          },
                          {
                            "NoPeriode": 4,
                            "ValeurAuCompte": 55100.00
                          }
                        ]
                      },
                      {
                        "NoCompteGL": "4000",
                        "NomCompteGL": "Ventes de produits",
                        "NoUniqueSystemeSource": "10",
                        "TypeDeCompte": "Revenu",
                        "AnneeCourante": [
                          {
                            "NoPeriode": 1,
                            "ValeurAuCompte": 125000.00
                          },
                          {
                            "NoPeriode": 2,
                            "ValeurAuCompte": 138500.50
                          },
                          {
                            "NoPeriode": 3,
                            "ValeurAuCompte": 142300.75
                          },
                          {
                            "NoPeriode": 4,
                            "ValeurAuCompte": 155200.25
                          }
                        ]
                      }
                    ]
                  },
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoCompteGL": "1000",
                        "NomCompteGL": "Encaisse - Banque principale",
                        "NoUniqueSystemeSource": "1",
                        "TypeDeCompte": "Banque"
                      },
                      {
                        "NoCompteGL": "1100",
                        "NomCompteGL": "Comptes clients",
                        "NoUniqueSystemeSource": "2",
                        "TypeDeCompte": "Actif"
                      },
                      {
                        "NoCompteGL": "2000",
                        "NomCompteGL": "Comptes fournisseurs",
                        "NoUniqueSystemeSource": "3",
                        "TypeDeCompte": "Passif"
                      },
                      {
                        "NoCompteGL": "4000",
                        "NomCompteGL": "Ventes de produits",
                        "NoUniqueSystemeSource": "10",
                        "TypeDeCompte": "Revenu"
                      },
                      {
                        "NoCompteGL": "5000",
                        "NomCompteGL": "Coût des marchandises vendues",
                        "NoUniqueSystemeSource": "15",
                        "TypeDeCompte": "Dépense"
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/GLAccount/{id}": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.1 - GL Account"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.1 - GL Account",
        "operationId": "getGLAccount",
        "summary": "GLAccount — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            },
            "example": "NoCompteGL,NomCompteGL,TypeDeCompte,ACtifPassif"
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la GLAccount demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComptesGL"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la GLAccount (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/GLJournalEntry": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.2 - GL Journal Entry"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.2 - GL Journal Entry",
        "operationId": "listGLJournalEntry",
        "summary": "GLJournalEntry — lister",
        "description": "- **Systèmes supportés pour GET** : Seuls Avantage et Sage 50 supportent la lecture des écritures comptables GL.\n- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba (partial), Avantage, Sage50.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/GLJournalEntry?$filter=DateEcriture ge '2024-01-01'&$top=50\n```\n\n**Limitations connues**\n\n- Acomba : Vieux chemin ParamExtract (SI_ParamExtraction -> Extract_EcritureComptable), pas de ReadByQuerySettings dédié.\n- Acomba : Seul mode supporté : Extract_By_Date sur DateEcriture (range). Sans filtre de date -> Extract_All_Same_Type (rien n'est ramassé).\n- Acomba : Pas de filtre exact-match : ÉcritureComptable_Entete n'a aucune propriété marquée BusinessKey, donc la branche clé/NoDoc ne s'applique pas.\n- Acomba : Pas de filtre Fiche_DerniereModification pour le GL (le code ne teste que FicheClient.Fiche_DerniereModification).\n- Acomba : Lecture JournalX (entête, index 5) puis PostGLX (lignes, index 1). Écritures rejetées si flags JF_Deleted/JF_Void/JF_AuditTrail ou JoStatus != 0.\n- Avantage : Extraction ODBC (ExtractionEcritureGL)\n- Avantage : Filtres : SUPNO, SUPDATE\n- Sage50 : Lecture SQL (tJourEnt INNER JOIN tJEntAct), clé lId",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "DateEcriture ge '2024-01-01'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            },
            "example": 50
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `LignesÉcriture` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "LignesÉcriture"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de GLJournalEntry.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EcritureComptable_Entete"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoEcritureComptable": "EC-2024-001",
                        "NoUniqueSystemeSource": "1001",
                        "DateEcriture": "2024-01-15T00:00:00",
                        "DescriptionÉcriture": "Écriture de régularisation - Janvier",
                        "PériodeGLÉcriture": 1,
                        "NoLot_Ecriture": 12,
                        "Montant_Ecriture": 1500.00,
                        "NoDocumentSource": "FAC-2024-001",
                        "LignesÉcriture": [
                          {
                            "ComptesGL": {
                              "NoCompteGL": "1100",
                              "DescriptionCompte": "Comptes clients"
                            },
                            "Direction_DebitCredit": "Debit",
                            "Montant_Écriture": 1500.00,
                            "DescriptionLignes": "Débit - Comptes clients"
                          },
                          {
                            "ComptesGL": {
                              "NoCompteGL": "4100",
                              "DescriptionCompte": "Ventes"
                            },
                            "Direction_DebitCredit": "Credit",
                            "Montant_Écriture": 1500.00,
                            "DescriptionLignes": "Crédit - Ventes"
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.2 - GL Journal Entry"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.2 - GL Journal Entry",
        "operationId": "createGLJournalEntry",
        "summary": "GLJournalEntry — créer",
        "description": "- **Systèmes supportés pour POST** : Seuls Acomba et Sage 50 supportent la création d'écritures comptables GL.\n- **Important** : L'écriture comptable doit être balancée : le total des débits doit être égal au total des crédits. Si l'écriture n'est pas balancée, une erreur sera retournée.\n\n**Création disponible pour** : Acomba, Avantage, Sage50.\n\n**Champs requis, selon l'ERP**\n\n- `DateEcriture` — Acomba : **requis**, Avantage : optionnel, Sage50 : **requis**\n- `LignesÉcriture` — Acomba : **requis**, Avantage : **requis**, Sage50 : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Avantage : AvantageSDK_JournalEntry.CreateJournalEntry (SDK, commande W01)\n- Avantage : Requis : DateEcriture + >= 1 ligne (max 20), débits=crédits\n- Avantage : Aucune garantie de commit BD au-delà du statut retourné\n- Sage50 : Requis : >= 2 lignes équilibrées (somme débits = somme crédits) + DateEcriture + NoDocumentSource\n- Sage50 : Écriture via SDK GeneralJournal.Post() + relecture du lId inséré",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EcritureComptable_Entete"
              },
              "examples": {
                "post-request-acomba": {
                  "summary": "post request acomba",
                  "value": {
                    "DateEcriture": "2025-07-01",
                    "DescriptionÉcriture": "Payer cartes de crédit",
                    "PériodeGLÉcriture": 5,
                    "LignesÉcriture": [
                      {
                        "Montant_Écriture": -3,
                        "DescriptionLignes": "compte payable",
                        "Projet_No": "",
                        "ComptesGL": {
                          "NoCompteGL": "21000",
                          "TypeDeCompte": "Passif"
                        }
                      },
                      {
                        "Montant_Écriture": 3,
                        "DescriptionLignes": "Compte à recevoir",
                        "ComptesGL": {
                          "NoCompteGL": "12000",
                          "TypeDeCompte": "Actif"
                        }
                      }
                    ]
                  }
                },
                "post-request-sage50": {
                  "summary": "post request sage50",
                  "value": {
                    "DateEcriture": "2025-07-01",
                    "DescriptionÉcriture": "Payer cartes de crédit",
                    "NoDocumentSource": "Test",
                    "LignesÉcriture": [
                      {
                        "Montant_Écriture": 3,
                        "DescriptionLignes": "compte payable",
                        "ComptesGL": {
                          "NoCompteGL": "21050"
                        }
                      },
                      {
                        "Montant_Écriture": 1.5,
                        "DescriptionLignes": "Compte actif1",
                        "ComptesGL": {
                          "NoCompteGL": "10800"
                        }
                      },
                      {
                        "Montant_Écriture": 1.5,
                        "DescriptionLignes": "Compte actif2",
                        "ComptesGL": {
                          "NoCompteGL": "10830"
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EcritureComptable_Entete"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "NoEcritureComptable": "35529",
                      "NoUniqueSystemeSource": "3664",
                      "DateEcriture": "2025-07-01T00:00:00",
                      "DescriptionÉcriture": "Payer cartes de crédit",
                      "PériodeGLÉcriture": 5,
                      "NoLot_Ecriture": 0,
                      "Montant_Ecriture": 0.0,
                      "LignesÉcriture": [
                        {
                          "ComptesGL": {
                            "NoCompteGL": "21000",
                            "NomCompteGL": null,
                            "NoUniqueSystemeSource": null,
                            "TypeDeCompte": 2,
                            "ACtifPassif": 0,
                            "Fiche_DerniereModification": null,
                            "AnneeCourante": [],
                            "AnneePrécédente": [],
                            "Budget01": [],
                            "Budget02": [],
                            "Budget03": []
                          },
                          "NoUniqueSystemeSource": null,
                          "Direction_DebitCredit": 0,
                          "TypeÉcriture": 0,
                          "Montant_Écriture": -3.0,
                          "DescriptionLignes": "compte payable",
                          "Projet_No": "",
                          "Projet_NoUniqueSystemesource": null,
                          "Fiche_DerniereModification": null
                        },
                        {
                          "ComptesGL": {
                            "NoCompteGL": "12000",
                            "NomCompteGL": null,
                            "NoUniqueSystemeSource": null,
                            "TypeDeCompte": 1,
                            "ACtifPassif": 0,
                            "Fiche_DerniereModification": null,
                            "AnneeCourante": [],
                            "AnneePrécédente": [],
                            "Budget01": [],
                            "Budget02": [],
                            "Budget03": []
                          },
                          "NoUniqueSystemeSource": null,
                          "Direction_DebitCredit": 0,
                          "TypeÉcriture": 0,
                          "Montant_Écriture": 3.0,
                          "DescriptionLignes": "Compte à recevoir",
                          "Projet_No": null,
                          "Projet_NoUniqueSystemesource": null,
                          "Fiche_DerniereModification": null
                        }
                      ],
                      "Fiche_DerniereModification": null,
                      "TypeEcriture": 0,
                      "NoDocumentSource": null,
                      "PartiePrenanteNo": null,
                      "PartiePrenanteNoUniqueSystemSource": null,
                      "ExtendedProperties": null
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/GLJournalEntry/{id}": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.2 - GL Journal Entry"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.2 - GL Journal Entry",
        "operationId": "getGLJournalEntry",
        "summary": "GLJournalEntry — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la GLJournalEntry demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EcritureComptable_Entete"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la GLJournalEntry (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/GLJournalEntryLine": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.3 - GL Journal Entry Line"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.3 - GL Journal Entry Line",
        "operationId": "listGLJournalEntryLine",
        "summary": "GLJournalEntryLine — lister",
        "description": "**Lecture disponible pour** : Acomba (partial).\n\n**Limitations connues**\n\n- Acomba : Lecture seule. Lignes plates (1 entrée = 1 affectation comptable GL d'une écriture JournalX).\n- Acomba : Dispatch : EntityType.GLJournalEntryLine -> SI_ExtractContentType.EcritureComptable -> AcombaSDK_ComptesGLSolinfo.Extract_EcritureComptable. Retourne en réalité des en-têtes ÉcritureComptable_Entete (JournalX) avec leurs lignes imbriquées (LignesÉcriture). Aucun aplatissement dédié ligne n'est fait dans l'extracteur GL.\n- Acomba : Seul mode d'extraction : par plage de date sur le champ d'EN-TÊTE DateEcriture (ParamExtract Extract_By_Date, index 5 JournalX = Key_JoDate...). Les lignes (PostGLX) sont relues par CardPos du journal parent (index 1) ; aucun filtre ne porte sur un champ de ligne.\n- Acomba : Filtre uniquement déclaré dans ExtractManager : DateEcriture (lt/lte/gt/gte). Pas de descripteur ListAllowedFilter pour cette entité.\n- Acomba : L'extracteur écarte les journaux marqués JF_Deleted / JF_Void / JF_AuditTrail et JoStatus!=0 (canAddGLEntry).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de GLJournalEntryLine.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EcritureComptable_Detail"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/GLJournalEntryLine/{id}": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.3 - GL Journal Entry Line"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.3 - GL Journal Entry Line",
        "operationId": "getGLJournalEntryLine",
        "summary": "GLJournalEntryLine — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la GLJournalEntryLine demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EcritureComptable_Detail"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la GLJournalEntryLine (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/GLProject": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.4 - GL Project"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.4 - GL Project",
        "operationId": "listGLProject",
        "summary": "GLProject — lister",
        "description": "- **Filtres spécifiques Acomba** : TypeProjet : Utilisez TypeProjet eq 'Projet' pour n'obtenir que les projets réguliers, ou TypeProjet ne 'Projet' pour obtenir uniquement les segments (Segment1, Segment2, Segment3).ValeurAuCompte : Utilisez ValeurAuCompte ne '0' pour exclure les périodes budgétaires à 0.\n\n**Lecture disponible pour** : Acomba.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/GLProject?$expand=Budget01,Budget02,Budget03\nGET /Entity/GLProject?$expand=Budget01&$filter=ValeurAuCompte ne '0'\nGET /Entity/GLProject?$filter=TypeProjet eq 'Projet'\nGET /Entity/GLProject?$filter=TypeProjet ne 'Projet'\nGET /Entity/GLProject\n```",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `gt`, `gte`, `lt`, `lte`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "ValeurAuCompte ne '0'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de GLProject.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GLProject"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "12345",
                        "NoProjet": "PROJ-001",
                        "NomProjet": "Construction Édifice Principal",
                        "TypeProjet": "Projet",
                        "NoUniqueSystemeSourceSegment1": "456",
                        "NoUniqueSystemeSourceSegment2": "789",
                        "NoUniqueSystemeSourceSegment3": "012",
                        "Fiche_DerniereModification": "2024-01-15T10:30:00",
                        "Budget01": [
                          {
                            "NoPeriode": 0,
                            "ValeurAuCompte": 50000.00
                          },
                          {
                            "NoPeriode": 1,
                            "ValeurAuCompte": 48500.25
                          },
                          {
                            "NoPeriode": 2,
                            "ValeurAuCompte": 52000.00
                          }
                        ],
                        "Budget02": null,
                        "Budget03": null
                      },
                      {
                        "NoUniqueSystemeSource": "23456",
                        "NoProjet": "PHASE-A",
                        "NomProjet": "Phase A - Fondations",
                        "TypeProjet": "Segment1",
                        "NoUniqueSystemeSourceSegment1": "0",
                        "NoUniqueSystemeSourceSegment2": "0",
                        "NoUniqueSystemeSourceSegment3": "0",
                        "Fiche_DerniereModification": "2024-01-16T14:20:00",
                        "Budget01": [
                          {
                            "NoPeriode": 0,
                            "ValeurAuCompte": 15000.00
                          }
                        ],
                        "Budget02": null,
                        "Budget03": null
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.4 - GL Project"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.4 - GL Project",
        "operationId": "createGLProject",
        "summary": "GLProject — créer",
        "description": "- **Important** : Le NoProjet est obligatoire et doit être unique dans Acomba (max 15 caractères). Les segments doivent être créés avant de pouvoir les associer à un projet via les champs NoUniqueSystemeSourceSegment1, NoUniqueSystemeSourceSegment2 et NoUniqueSystemeSourceSegment3.\n\n**Création disponible pour** : Acomba.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GLProject"
              },
              "examples": {
                "post-request-projet": {
                  "summary": "post request projet",
                  "value": {
                    "NoProjet": "PROJ-2024-001",
                    "NomProjet": "Construction Édifice Principal",
                    "TypeProjet": "Projet",
                    "NoUniqueSystemeSourceSegment1": "123",
                    "NoUniqueSystemeSourceSegment2": "456",
                    "NoUniqueSystemeSourceSegment3": "789"
                  }
                },
                "post-request-segment": {
                  "summary": "post request segment",
                  "value": {
                    "NoProjet": "PHASE-A",
                    "NomProjet": "Phase A - Fondations",
                    "TypeProjet": "Segment1"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GLProject"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "Success": true,
                      "ErpInternalId": "115",
                      "BusinessKey": "PROJ-2024-001",
                      "ErrorMessage": null
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/GLProject/{id}": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.4 - GL Project"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.4 - GL Project",
        "operationId": "getGLProject",
        "summary": "GLProject — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la GLProject demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GLProject"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la GLProject (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/GLProjectBalance": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.5 - GL Project Balance"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.5 - GL Project Balance",
        "operationId": "listGLProjectBalance",
        "summary": "GLProjectBalance — lister",
        "description": "- **Lecture seule** : Les soldes sont calculés par le système comptable ; l'API les restitue, elle ne les écrit pas.\n\n**Lecture disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Full table scan sur l'index 1 (FirstKey/NextKey). Pagination Skip/Top seulement.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de GLProjectBalance.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GLProjectBalance"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/GLProjectBalance/{id}": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.5 - GL Project Balance"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.5 - GL Project Balance",
        "operationId": "getGLProjectBalance",
        "summary": "GLProjectBalance — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la GLProjectBalance demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GLProjectBalance"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la GLProjectBalance (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/FinancialTransaction": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.6 - Financial Transaction"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.6 - Financial Transaction",
        "operationId": "listFinancialTransaction",
        "summary": "FinancialTransaction — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : QuickBooksOnline.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/FinancialTransaction?$filter=DateFacture ge '2024-01-01'&$select=NoUniqueSystemeSource,DateFacture,TotalFacture,LigneFacture\n```",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            },
            "example": "NoUniqueSystemeSource,DateFacture,TotalFacture,LigneFacture"
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `gt`, `gte`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "DateFacture ge '2024-01-01'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `InfoClientFacturerA` (QuickBooksOnline), `LigneFacture` (QuickBooksOnline), `TermeDePaiement` (QuickBooksOnline).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "InfoClientFacturerA",
                  "LigneFacture",
                  "TermeDePaiement"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de FinancialTransaction.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FinancialTransaction"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "145",
                        "NoFacture": "DEP-2024-001",
                        "DateFacture": "2024-01-15T00:00:00",
                        "Fiche_DerniereModification": "2024-01-15T14:32:00",
                        "NoteGlobaleExterne01": "Dépôt mensuel janvier",
                        "Devise": "CAD",
                        "TermeDePaiement": {
                          "NomTermeDePaiement": "Virement",
                          "NoTermeDePaiement_NoUniqueSystemeSource": "5"
                        },
                        "InfoClientFacturerA": {
                          "NoClient": "42",
                          "NoUniqueSystemeSource": "42",
                          "NomClient": "Acme Corporation"
                        },
                        "LigneFacture": [
                          {
                            "DescriptionLigne": "Paiement facture F-2024-001",
                            "PrixFinal": 1500.00,
                            "NoCompteGL": "Comptes clients",
                            "NoCompteGL_NoUniqueSystemeSource": "85"
                          },
                          {
                            "DescriptionLigne": "Paiement facture F-2024-002",
                            "PrixFinal": 750.50,
                            "NoCompteGL": "Comptes clients",
                            "NoCompteGL_NoUniqueSystemeSource": "85"
                          }
                        ]
                      },
                      {
                        "NoUniqueSystemeSource": "146",
                        "NoFacture": "DEP-2024-002",
                        "DateFacture": "2024-01-20T00:00:00",
                        "Fiche_DerniereModification": "2024-01-20T10:15:00",
                        "NoteGlobaleExterne01": "Dépôt divers",
                        "InfoClientFacturerA": {
                          "NoClient": "58",
                          "NoUniqueSystemeSource": "58",
                          "NomClient": "Tech Industries"
                        },
                        "LigneFacture": [
                          {
                            "DescriptionLigne": "Paiement consultation",
                            "PrixFinal": 2500.00,
                            "NoCompteGL": "Revenus de services",
                            "NoCompteGL_NoUniqueSystemeSource": "120"
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.6 - Financial Transaction"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.6 - Financial Transaction",
        "operationId": "createFinancialTransaction",
        "summary": "FinancialTransaction — créer",
        "description": "- **Headers recommandés** : Utilisez le header If-None-Match: * pour garantir que la création échouera si l'entité existe déjà.\n- **Important** : Le champ CompteRecevable_No doit correspondre exactement au nom du compte bancaire dans QuickBooks (et non son ID). Les comptes GL des lignes sont également recherchés par leur nom.\n\n**Création disponible pour** : QuickBooksOnline.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FinancialTransaction"
              },
              "examples": {
                "post-request-qbo": {
                  "summary": "post request qbo",
                  "value": {
                    "DateFacture": "2024-04-05",
                    "TypeDoc": "FACTURESFOURNISSEURS",
                    "CompteRecevable_No": "Chequing",
                    "TermeDePaiement": {
                      "NomTermeDePaiement": "Credit Card",
                      "TypeTerme": "creditcard"
                    },
                    "NoFacture": "TestSupplierInvoice01",
                    "NoteGlobaleExterne01": "Test QuickBooks",
                    "InfoClientFacturerA": {
                      "NoClient": "ROZA le Rénovateur"
                    },
                    "LigneFacture": [
                      {
                        "DescriptionLigne": "Test Bank Deposit",
                        "NoCompteGL": "Ventes logiciels",
                        "PrixFinal": 10.00
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FinancialTransaction"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "NoUniqueSystemeSource": "150",
                      "NoFacture": "TestSupplierInvoice01",
                      "DateFacture": "2024-04-05T00:00:00",
                      "Fiche_DerniereModification": "2024-04-05T15:30:00",
                      "NoteGlobaleExterne01": "Test QuickBooks",
                      "InfoClientFacturerA": {
                        "NoClient": "ROZA le Rénovateur",
                        "NoUniqueSystemeSource": "42",
                        "NomClient": "ROZA le Rénovateur"
                      },
                      "LigneFacture": [
                        {
                          "DescriptionLigne": "Test Bank Deposit",
                          "PrixFinal": 10.00,
                          "NoCompteGL": "Ventes logiciels",
                          "NoCompteGL_NoUniqueSystemeSource": "120"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/FinancialTransaction/{id}": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.6 - Financial Transaction"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.6 - Financial Transaction",
        "operationId": "getFinancialTransaction",
        "summary": "FinancialTransaction — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            },
            "example": "NoUniqueSystemeSource,DateFacture,TotalFacture,LigneFacture"
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la FinancialTransaction demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FinancialTransaction"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la FinancialTransaction (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Tax": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.7 - Tax"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.7 - Tax",
        "operationId": "listTax",
        "summary": "Tax — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n- **Filtrage QuickBooks Online** : Pour QuickBooks Online, seuls les champs NoUniqueSystemeSource et NomTaxe sont supportés pour le filtrage.\n\n**Lecture disponible pour** : Acomba, QuickBooksOnline.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/Tax\n```\n\n**Limitations connues**\n\n- Acomba : RetrievesTaxes() n'accepte aucun QuerySettings : extraction de TOUTES les taxes, sans filtre serveur, sans Top, sans expand.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Tax.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/InfoTaxe"
                  }
                },
                "examples": {
                  "get-response-acomba": {
                    "summary": "get response acomba",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "1",
                        "Fiche_DerniereModification": "2024-01-10T14:30:00",
                        "Taxe_Numero": "T.P.S. 100%",
                        "Taxe_Description": "Taxe sur les produits et services",
                        "MontantTaxe": 0,
                        "Taxe_NumeroLegalGouv": "RT100393939933",
                        "NoCompteGL_PayedTax": "2310",
                        "NoCompteGL_PerceivedTax": "2300",
                        "ListeTaux": [
                          {
                            "TaxRateId": 0,
                            "EffectiveTaxRate": 5.0
                          }
                        ]
                      },
                      {
                        "NoUniqueSystemeSource": "2",
                        "Fiche_DerniereModification": "2024-01-10T14:30:00",
                        "Taxe_Numero": "T.V.Q. 100%",
                        "Taxe_Description": "Taxe de Vente Québec",
                        "MontantTaxe": 0,
                        "Taxe_NumeroLegalGouv": "TQ1000292929922",
                        "NoCompteGL_PayedTax": "2315",
                        "NoCompteGL_PerceivedTax": "2305",
                        "ListeTaux": [
                          {
                            "TaxRateId": 0,
                            "EffectiveTaxRate": 9.975
                          }
                        ]
                      }
                    ]
                  },
                  "get-response-qbo": {
                    "summary": "get response qbo",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "2",
                        "NoTaxe": null,
                        "NomTaxe": "TAX",
                        "Fiche_DerniereModification": null
                      },
                      {
                        "NoUniqueSystemeSource": "3",
                        "NoTaxe": null,
                        "NomTaxe": "NON",
                        "Fiche_DerniereModification": null
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Tax/{id}": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.7 - Tax"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.7 - Tax",
        "operationId": "getTax",
        "summary": "Tax — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Tax demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InfoTaxe"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Tax (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/TaxGroup": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.8 - Tax Group"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.8 - Tax Group",
        "operationId": "listTaxGroup",
        "summary": "TaxGroup — lister",
        "description": "- **Lecture seule** : Les groupes de taxes se configurent dans le système comptable ; l'API permet de les consulter pour valider une intégration, pas de les créer.\n\n**Lecture disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Aucun filtrage : RetrieveTaxGroups() ne prend pas de QuerySettings, itère tous les groupes via FirstKey/NextKey(index 1).\n- Acomba : Le détail (groupeTaxeDetails) est toujours rempli ; max 5 taxes par groupe, les entrées vides (TGTaxNumber[i] vide) sont ignorées.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de TaxGroup.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GroupeTaxeEntete"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/TaxGroup/{id}": {
      "get": {
        "tags": [
          "2 - Comptabilité (GL)",
          "2.8 - Tax Group"
        ],
        "x-apidog-folder": "2 - Comptabilité (GL)/2.8 - Tax Group",
        "operationId": "getTaxGroup",
        "summary": "TaxGroup — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la TaxGroup demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GroupeTaxeEntete"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la TaxGroup (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Customer": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.1 - Customer"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.1 - Customer",
        "operationId": "listCustomer",
        "summary": "Customer — lister",
        "description": "- **Note importante** : Pour plus de détails, veuillez consulter cet article : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba, Autotask, Avantage, ProShop, QuickBooksOnline, Sage300.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/Customer?$filter=Fiche_DerniereModification ge '2026-04-04'\nGET /Entity/Customer?$select=NoClient,NomClient,Fiche_DerniereModification,NoUniqueSystemeSource&$filter=NomClient eq 'Ventes au comptoir3'\nGET /Entity/Customer\nGET /Entity/Customer?$select=NoClient,NomClient\n```\n\n**Limitations connues**\n\n- Acomba : Top max 10000\n- Autotask : Lecture depuis AutoTask (Companies, CompanyType=1)\n- Autotask : Aussi via le pont ERPConnectorTask (TaskType.EXTRACT)\n- Autotask : Pagination AutoTask 500/page ; skip > 10000 refusé\n- Avantage : Extraction SDK/TCP (ExtractClients)\n- Avantage : Filtres TCP sur champs mappés scalaires ; contains réservé au texte, pas de in\n- Avantage : Téléphones = sous-entités FicheTelephonique : le mapping existe (extraction OK) mais le champ n'est PAS filtrable — un filtre ciblant un téléphone est explicitement rejeté (NotSupportedException), car la lecture route chaque numéro par un switch sur le type (TypeTelephone)\n- ProShop : Lecture depuis ProShop 'contacts' (type=Client)\n- ProShop : Distinction Client/Vendor faite en C# APRÈS fetch (filtre GraphQL sur .type fait planter le résolveur ProShop)\n- ProShop : Formats : PROSHOP, SOLINFO|FULLTRANSACTION (pas INVOICEAR)\n- Sage300 : Top (page size) plafonné à 50 (MaxPageSize)\n- Sage300 : Endpoint OData /AR/ARCustomers",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            },
            "example": "NoClient,NomClient,Fiche_DerniereModification,NoUniqueSystemeSource"
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`, `startswith`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "Fiche_DerniereModification ge '2026-04-04'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Customer.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FicheClient"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NomClient": "Ventes au comptoir",
                        "NoClient": "0Comptoir",
                        "FicheNomComplet": "0Comptoir - Ventes au comptoir",
                        "FicheChampsRecherche": "0Comptoir Ventes au comptoir  Comptoir",
                        "NoUniqueSystemeSource": "1",
                        "ClientFacturation_NoUniqueSystemeSource": "0",
                        "CleTri1": "Comptoir",
                        "Pays": "CA",
                        "DateOuvertureDossier": "2004-01-01T00:00:00",
                        "NoVendeur": "9999",
                        "NoVendeur_NoUniqueSystemSource": "1",
                        "Territoire": "9999",
                        "Territoire_NoUniqueSystemeSource": "1",
                        "NoModeExpeditionDefaut": "0",
                        "NoModeExpeditionDefaut_NoUniqueSystemeSource": "0",
                        "LangueClient": "12",
                        "EmailPrincipal_EstEtatDeCompte": false,
                        "EmailPrincipal_EstEmailFacturation": false,
                        "EmailPrincipal_EstPublicite": false,
                        "Email2_EstEtatDeCompte": false,
                        "Email2_EstEmailFacturation": false,
                        "Email2_EstPublicite": false,
                        "Email3_EstEtatDeCompte": false,
                        "Email3_EstEmailFacturation": false,
                        "Email3_EstPublicite": false,
                        "Bool_ClientComptoir": true,
                        "EstActif": true,
                        "Fiche_DerniereModification": "2024-05-14T06:50:24",
                        "MargeCredit_MontantMarge": 0,
                        "MargeCredit_TypeMarge": 0,
                        "CompteRecevable_No": "0",
                        "NoGroupeTaxe": "TPS & TVQ",
                        "NoGroupeTaxe_NoUniqueSystemeSource": "2",
                        "PPA_Actif": false,
                        "Projet_NoUniqueSystemeSource": "0",
                        "ExtendedProperties": {},
                        "InfoAgeDesComptes": {
                          "NbJoursCycle": 0,
                          "NBCycle": 5,
                          "DateReference": "2099-01-01T00:00:00",
                          "DateCalcul": "1900-01-01T00:00:00",
                          "MontantDu_Cycle1_Courant": 0,
                          "MontantDu_Cycle2": 0,
                          "MontantDu_Cycle3": 0,
                          "MontantDu_Cycle4": 0,
                          "MontantDu_Cycle5": 0,
                          "MontantDu_Cycle6": 0,
                          "MontantDu_Cycle7": 0,
                          "MontantDu_Cycle8": 0,
                          "MontantDu_Cycle9": 0,
                          "MontantDu_Cycle10": 0,
                          "MontantDu_Cycle11": 0,
                          "MontantDu_Cycle12": 0,
                          "MontantDu_Total": 0,
                          "ListeFactureNonReglee": []
                        },
                        "NiveauPrixClient": 0,
                        "TermeDePaiement_No": "0",
                        "TermeDePaiement_NoUniqueSystemeSource": "0",
                        "ListeTelephonique": [
                          {
                            "TypeTel": 1
                          },
                          {
                            "TypeTel": 2
                          },
                          {
                            "TypeTel": 3
                          },
                          {
                            "TypeTel": 4
                          }
                        ],
                        "Telephone_Principal": {
                          "TypeTel": 1
                        },
                        "Telephone_Telecopieur": {
                          "TypeTel": 2
                        },
                        "Telephone_3": {
                          "TypeTel": 3
                        },
                        "Telephone_4": {
                          "TypeTel": 4
                        },
                        "ListeTaxeException": []
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "3 - Comptes clients",
          "3.1 - Customer"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.1 - Customer",
        "operationId": "createCustomer",
        "summary": "Customer — créer",
        "description": "- **Headers recommandés** : Utilisez le header If-None-Match: * pour garantir que la création échouera si l'entité existe déjà.\n- **Important** : Pour Acomba, le NoClient est obligatoire et doit être unique. Pour QuickBooks Online, le système génère automatiquement un ID si non fourni.\n- **QuickBooks — clé d'identification** : Dans QuickBooks, c'est le `NomClient` qui sert de clé unique (champ « Nom du client à afficher », DOIT être unique) ; le `NoClient` est un entier généré par QuickBooks que l'usager ne peut pas définir. Voir l'exemple `post-request-quickbooks`.\n\n**Création disponible pour** : Acomba, Autotask (partial), QuickBooksOnline, Sage300.\n\n**Champs requis, selon l'ERP**\n\n- `NoClient` — Acomba : **requis**, Autotask : optionnel, QuickBooksOnline : optionnel, Sage300 : optionnel\n- `NomClient` — Acomba : **requis**, Autotask : optionnel, QuickBooksOnline : **requis**, Sage300 : optionnel\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Autotask : Écriture via SYNC ERP→AutoTask (upsert : lookup par CompanyNumber ou UDF ERPInternalId, puis POST/PATCH)\n- Autotask : En mode UseAccountIdForCustomerNumbering, création impossible sans correspondance existante\n- Sage300 : Requis : NoClient, NoGroupeTaxe, CompteRecevable_No, NoGroupeClient (sinon ArgumentException)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FicheClient"
              },
              "examples": {
                "post-request-quickbooks": {
                  "summary": "post request quickbooks",
                  "value": {
                    "NomClient": "Ventes au comptoir4",
                    "CleTri1": "Comptoir1234",
                    "Adresse": "123 rue de l'aventure",
                    "Ville": "Bonaventure",
                    "CodePostal": "G0C1E0",
                    "Province": "QC",
                    "Pays": "Canada",
                    "EmailPrincipal_Adresse": "client2@solutioninfomedia.com",
                    "Telephone_Principal": {
                      "TypeTel": "Principal",
                      "Numero": "418-534-5555"
                    },
                    "Telephone_Telecopieur": {
                      "Numero": "418-777-1234"
                    },
                    "Telephone_3": {
                      "Numero": "418-534-1234"
                    },
                    "Telephone_4": {
                      "Numero": "111-222-3333 ext 12345"
                    },
                    "SiteWeb": "https://Solutioninfomedia.com/",
                    "CommentairesClients": "Ce client est un client démo, créé ou modifié via OnlineERP"
                  }
                },
                "post-request": {
                  "summary": "post request",
                  "value": {
                    "NomClient": "Ventes au comptoir",
                    "NoClient": "0Comptoir3",
                    "FicheNomComplet": "0Comptoir - Ventes au comptoir",
                    "FicheChampsRecherche": "0Comptoir Ventes au comptoir  Comptoir",
                    "ClientFacturation_NoUniqueSystemeSource": "0",
                    "CleTri1": "Comptoir",
                    "DateOuvertureDossier": "2004-01-01T00:00:00",
                    "NoVendeur": "9999",
                    "NoVendeur_NoUniqueSystemSource": "1",
                    "Territoire": "9999",
                    "Territoire_NoUniqueSystemeSource": "1",
                    "NoModeExpeditionDefaut": "0",
                    "NoModeExpeditionDefaut_NoUniqueSystemeSource": "0",
                    "LangueClient": "12",
                    "EmailPrincipal_EstEtatDeCompte": false,
                    "EmailPrincipal_EstEmailFacturation": false,
                    "EmailPrincipal_EstPublicite": false,
                    "Email2_EstEtatDeCompte": false,
                    "Email2_EstEmailFacturation": false,
                    "Email2_EstPublicite": false,
                    "Email3_EstEtatDeCompte": false,
                    "Email3_EstEmailFacturation": false,
                    "Email3_EstPublicite": false,
                    "Bool_ClientComptoir": true,
                    "EstActif": true,
                    "Fiche_DerniereModification": "2006-03-23T11:52:04",
                    "MargeCredit_MontantMarge": 0.0,
                    "MargeCredit_TypeMarge": 0,
                    "CompteRecevable_No": "0",
                    "NoGroupeTaxe": "TPS & TVQ",
                    "NoGroupeTaxe_NoUniqueSystemeSource": "2",
                    "PPA_Actif": false,
                    "Projet_NoUniqueSystemeSource": "0",
                    "NiveauPrixClient": 0,
                    "TermeDePaiement_No": "0",
                    "TermeDePaiement_NoUniqueSystemeSource": "0"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheClient"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "NoClient": "0Comptoir3",
                      "NomClient": "Ventes au comptoir",
                      "FicheNomComplet": "0Comptoir3 - Ventes au comptoir",
                      "FicheChampsRecherche": "0Comptoir3 Ventes au comptoir  Comptoir",
                      "NoUniqueSystemeSource": "29",
                      "ClientFacturation_NoUniqueSystemeSource": "0",
                      "CleTri1": "Comptoir",
                      "DateOuvertureDossier": "2004-01-01T00:00:00",
                      "NoVendeur": "9999",
                      "NoVendeur_NoUniqueSystemSource": "1",
                      "Territoire": "9999",
                      "Territoire_NoUniqueSystemeSource": "1",
                      "NoModeExpeditionDefaut": "0",
                      "NoModeExpeditionDefaut_NoUniqueSystemeSource": "0",
                      "LangueClient": "12",
                      "EmailPrincipal_EstEtatDeCompte": false,
                      "EmailPrincipal_EstEmailFacturation": false,
                      "EmailPrincipal_EstPublicite": false,
                      "Email2_EstEtatDeCompte": false,
                      "Email2_EstEmailFacturation": false,
                      "Email2_EstPublicite": false,
                      "Email3_EstEtatDeCompte": false,
                      "Email3_EstEmailFacturation": false,
                      "Email3_EstPublicite": false,
                      "Bool_ClientComptoir": true,
                      "EstActif": true,
                      "Fiche_DerniereModification": "2006-03-23T11:52:04",
                      "MargeCredit_MontantMarge": 0,
                      "MargeCredit_TypeMarge": 0,
                      "CompteRecevable_No": "0",
                      "NoGroupeTaxe": "TPS & TVQ",
                      "NoGroupeTaxe_NoUniqueSystemeSource": "2",
                      "PPA_Actif": false,
                      "Projet_NoUniqueSystemeSource": "0",
                      "DateRefference1": "1899-12-30T00:00:00",
                      "DateRefference2": "1899-12-30T00:00:00",
                      "ExtendedProperties": {},
                      "InfoAgeDesComptes": {
                        "NbJoursCycle": 0,
                        "NBCycle": 5,
                        "DateReference": "2099-01-01T00:00:00",
                        "DateCalcul": "1900-01-01T00:00:00",
                        "MontantDu_Cycle1_Courant": 0,
                        "MontantDu_Cycle2": 0,
                        "MontantDu_Cycle3": 0,
                        "MontantDu_Cycle4": 0,
                        "MontantDu_Cycle5": 0,
                        "MontantDu_Cycle6": 0,
                        "MontantDu_Cycle7": 0,
                        "MontantDu_Cycle8": 0,
                        "MontantDu_Cycle9": 0,
                        "MontantDu_Cycle10": 0,
                        "MontantDu_Cycle11": 0,
                        "MontantDu_Cycle12": 0,
                        "MontantDu_Total": 0,
                        "ListeFactureNonReglee": []
                      },
                      "NiveauPrixClient": 0,
                      "TermeDePaiement_No": "0",
                      "TermeDePaiement_NoUniqueSystemeSource": "0",
                      "ListeTelephonique": [],
                      "Telephone_Principal": {
                        "TypeTel": 0
                      },
                      "Telephone_Telecopieur": {
                        "TypeTel": 0
                      },
                      "Telephone_3": {
                        "TypeTel": 0
                      },
                      "Telephone_4": {
                        "TypeTel": 0
                      },
                      "ListeTaxeException": [],
                      "CommentairesClients": ""
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Customer/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.1 - Customer"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.1 - Customer",
        "operationId": "getCustomer",
        "summary": "Customer — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            },
            "example": "NoClient,NomClient,Fiche_DerniereModification,NoUniqueSystemeSource"
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Customer demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheClient"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "3 - Comptes clients",
          "3.1 - Customer"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.1 - Customer",
        "operationId": "updateCustomer",
        "summary": "Customer — mettre à jour",
        "description": "- **Headers recommandés** : Utilisez le header If-Match: * pour garantir que la mise à jour échouera si l'entité n'existe pas.\n- **QuickBooks — cohérence URI/body** : Sur une modification QuickBooks, le `NoClient` fourni dans le body doit correspondre à l'identifiant `{id}` de l'URI.\n- **Mise à jour partielle** : Vous n'avez pas besoin d'envoyer tous les champs. Seuls les champs fournis seront modifiés, les autres conserveront leurs valeurs existantes.\n\n**Modification disponible pour** : Acomba, Autotask (partial), QuickBooksOnline, Sage300 (experimental).\n\n**Champs requis, selon l'ERP**\n\n- `NoClient` — Acomba : **requis**, Autotask : optionnel, QuickBooksOnline : optionnel, Sage300 : optionnel\n- `NomClient` — Acomba : **requis**, Autotask : optionnel, QuickBooksOnline : **requis**, Sage300 : optionnel\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Autotask : Idem CREATE : upsert par SYNC (PATCH si trouvé)\n- Sage300 : NON EFFECTIF : UpdateCustomer est un stub (TODO PATCH) qui convertit puis retourne Success SANS appeler l'API. Aucune donnée n'est écrite.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la mise à jour échoue si l'entité n'existe pas.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FicheClient"
              },
              "examples": {
                "put-request": {
                  "summary": "put request",
                  "value": {
                    "NomClient": "Ventes au comptoir new2",
                    "NoClient": "0Comptoir2",
                    "FicheNomComplet": "0Comptoir - Ventes au comptoir",
                    "FicheChampsRecherche": "0Comptoir Ventes au comptoir  Comptoir",
                    "ClientFacturation_NoUniqueSystemeSource": "0",
                    "CleTri1": "Comptoir",
                    "DateOuvertureDossier": "2004-01-01T00:00:00",
                    "NoVendeur": "9999",
                    "NoVendeur_NoUniqueSystemSource": "1",
                    "Territoire": "9999",
                    "Territoire_NoUniqueSystemeSource": "1",
                    "NoModeExpeditionDefaut": "0",
                    "NoModeExpeditionDefaut_NoUniqueSystemeSource": "0",
                    "LangueClient": "12",
                    "EmailPrincipal_EstEtatDeCompte": false,
                    "EmailPrincipal_EstEmailFacturation": false,
                    "EmailPrincipal_EstPublicite": false,
                    "Email2_EstEtatDeCompte": false,
                    "Email2_EstEmailFacturation": false,
                    "Email2_EstPublicite": false,
                    "Email3_EstEtatDeCompte": false,
                    "Email3_EstEmailFacturation": false,
                    "Email3_EstPublicite": false,
                    "Bool_ClientComptoir": true,
                    "EstActif": true,
                    "Fiche_DerniereModification": "2006-03-23T11:52:04",
                    "MargeCredit_MontantMarge": 0.0,
                    "MargeCredit_TypeMarge": 0,
                    "CompteRecevable_No": "0",
                    "NoGroupeTaxe": "TPS & TVQ",
                    "NoGroupeTaxe_NoUniqueSystemeSource": "2",
                    "PPA_Actif": false,
                    "Projet_NoUniqueSystemeSource": "0",
                    "NiveauPrixClient": 0,
                    "TermeDePaiement_No": "0",
                    "TermeDePaiement_NoUniqueSystemeSource": "0"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheClient"
                },
                "examples": {
                  "put-response": {
                    "summary": "put response",
                    "value": {
                      "NoClient": "0Comptoir2",
                      "NomClient": "Ventes au comptoir new2",
                      "FicheNomComplet": "0Comptoir2 - Ventes au comptoir new2",
                      "FicheChampsRecherche": "0Comptoir2 Ventes au comptoir new2  Comptoir",
                      "NoUniqueSystemeSource": "28",
                      "ClientFacturation_NoUniqueSystemeSource": "0",
                      "CleTri1": "Comptoir",
                      "DateOuvertureDossier": "2004-01-01T00:00:00",
                      "NoVendeur": "9999",
                      "NoVendeur_NoUniqueSystemSource": "1",
                      "Territoire": "9999",
                      "Territoire_NoUniqueSystemeSource": "1",
                      "NoModeExpeditionDefaut": "0",
                      "NoModeExpeditionDefaut_NoUniqueSystemeSource": "0",
                      "LangueClient": "12",
                      "EmailPrincipal_EstEtatDeCompte": false,
                      "EmailPrincipal_EstEmailFacturation": false,
                      "EmailPrincipal_EstPublicite": false,
                      "Email2_EstEtatDeCompte": false,
                      "Email2_EstEmailFacturation": false,
                      "Email2_EstPublicite": false,
                      "Email3_EstEtatDeCompte": false,
                      "Email3_EstEmailFacturation": false,
                      "Email3_EstPublicite": false,
                      "Bool_ClientComptoir": true,
                      "EstActif": true,
                      "Fiche_DerniereModification": "2006-03-23T11:52:04",
                      "MargeCredit_MontantMarge": 0,
                      "MargeCredit_TypeMarge": 0,
                      "CompteRecevable_No": "0",
                      "NoGroupeTaxe": "TPS & TVQ",
                      "NoGroupeTaxe_NoUniqueSystemeSource": "2",
                      "PPA_Actif": false,
                      "Projet_NoUniqueSystemeSource": "0",
                      "DateRefference1": "1899-12-30T00:00:00",
                      "DateRefference2": "1899-12-30T00:00:00",
                      "ExtendedProperties": {},
                      "InfoAgeDesComptes": {
                        "NbJoursCycle": 0,
                        "NBCycle": 5,
                        "DateReference": "2099-01-01T00:00:00",
                        "DateCalcul": "1900-01-01T00:00:00",
                        "MontantDu_Cycle1_Courant": 0,
                        "MontantDu_Cycle2": 0,
                        "MontantDu_Cycle3": 0,
                        "MontantDu_Cycle4": 0,
                        "MontantDu_Cycle5": 0,
                        "MontantDu_Cycle6": 0,
                        "MontantDu_Cycle7": 0,
                        "MontantDu_Cycle8": 0,
                        "MontantDu_Cycle9": 0,
                        "MontantDu_Cycle10": 0,
                        "MontantDu_Cycle11": 0,
                        "MontantDu_Cycle12": 0,
                        "MontantDu_Total": 0,
                        "ListeFactureNonReglee": []
                      },
                      "NiveauPrixClient": 0,
                      "TermeDePaiement_No": "0",
                      "TermeDePaiement_NoUniqueSystemeSource": "0",
                      "ListeTelephonique": [],
                      "Telephone_Principal": {
                        "TypeTel": 0
                      },
                      "Telephone_Telecopieur": {
                        "TypeTel": 0
                      },
                      "Telephone_3": {
                        "TypeTel": 0
                      },
                      "Telephone_4": {
                        "TypeTel": 0
                      },
                      "ListeTaxeException": [],
                      "CommentairesClients": ""
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Customer (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerAddress": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.2 - Customer Address"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.2 - Customer Address",
        "operationId": "listCustomerAddress",
        "summary": "CustomerAddress — lister",
        "description": "**Lecture disponible pour** : Sage300.\n\n**Limitations connues**\n\n- Sage300 : Top (page size) plafonné à 50 (DefaultPageSize)\n- Sage300 : Endpoint OData /AR/ARShipToLocations",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerAddress.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerAddress"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "3 - Comptes clients",
          "3.2 - Customer Address"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.2 - Customer Address",
        "operationId": "createCustomerAddress",
        "summary": "CustomerAddress — créer",
        "description": "**Création disponible pour** : Sage300.\n\n**Limitations connues**\n\n- Sage300 : Requis : CustomerId, Code (sinon ArgumentException)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAddress"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerAddress"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerAddress/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.2 - Customer Address"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.2 - Customer Address",
        "operationId": "getCustomerAddress",
        "summary": "CustomerAddress — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerAddress demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerAddress"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "3 - Comptes clients",
          "3.2 - Customer Address"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.2 - Customer Address",
        "operationId": "updateCustomerAddress",
        "summary": "CustomerAddress — mettre à jour",
        "description": "**Modification disponible pour** : Sage300.\n\n**Limitations connues**\n\n- Sage300 : PATCH sur clé composite (CustomerNumber + ShipToLocationKey). Requis : CustomerId, Code",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAddress"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerAddress"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerAddress (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerBid": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.3 - Customer Bid"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.3 - Customer Bid",
        "operationId": "listCustomerBid",
        "summary": "CustomerBid — lister",
        "description": "- **Les lignes viennent avec l'entête** : Les produits et quantités soumissionnées sont imbriqués dans la collection `LigneFacture[]` de la soumission extraite. Il n'est pas nécessaire d'interroger l'entité CustomerBidLine séparément.\n\n**Lecture disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Pagination Skip/Top via index Acomba (NextKeys, buffer 100).\n- Acomba : Filtre par index : un seul filtre principal, sauf la paire NoFacture + CompteRecevable_No.\n- Acomba : Filtre par date (DateFacture/Fiche_DerniereModification) requiert une version d'Acomba supportant l'index TimeModified (Invoicing036).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `ListeReglement` (Acomba), `ProductGroup_PurchaseGlAccount` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ListeReglement",
                  "ProductGroup_PurchaseGlAccount"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerBid.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerBid"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "3 - Comptes clients",
          "3.3 - Customer Bid"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.3 - Customer Bid",
        "operationId": "createCustomerBid",
        "summary": "CustomerBid — créer",
        "description": "- **La quantité va dans QteCommande** : Sur une soumission, c'est `QteCommande` qui porte la quantité soumissionnée. `QteFacture` est forcé à 0 à la création — rien n'est expédié tant que la soumission n'est pas devenue une commande.\n\n**Création disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Numerotation des lignes : 990 lignes au total maximum pour les produits (991 a 998 sont reserves par Acomba aux taxes/frais de transport). Le total compte les lignes inscrites PLUS les lignes vides laissees par les trous de numerotation. Depuis v4.6.7, le SDK valide apres conversion et refuse avec un message explicite ; un document plus volumineux doit etre scinde.\n- Acomba : Pas de panachage (refuse depuis v4.6.7) : soit TOUTES les lignes de produits portent un NoLigneFacture, soit AUCUNE. Motif : pour une ligne laissee a 0, le SDK assigne la POSITION de la ligne dans la liste, pas le prochain numero libre - melanger les deux styles fait collisionner les numeros.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBid"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBid"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerBid/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.3 - Customer Bid"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.3 - Customer Bid",
        "operationId": "getCustomerBid",
        "summary": "CustomerBid — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerBid demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBid"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "3 - Comptes clients",
          "3.3 - Customer Bid"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.3 - Customer Bid",
        "operationId": "updateCustomerBid",
        "summary": "CustomerBid — mettre à jour",
        "description": "**Modification disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Meme validation des numeros de lignes qu'au CREATE (990 lignes au total, numeros uniques, v4.6.7).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerBid"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBid"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerBid (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerBidLine": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.4 - Customer Bid Line"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.4 - Customer Bid Line",
        "operationId": "listCustomerBidLine",
        "summary": "CustomerBidLine — lister",
        "description": "- **Un seul filtre disponible** : Sur ce chemin, seule une plage de dates sur `DateFacture` est prise en compte. Les filtres par numéro de soumission ou par identifiant, eux, fonctionnent sur CustomerBid.\n\n**Lecture disponible pour** : Acomba (partial).\n\n**Limitations connues**\n\n- Acomba : Pas de routage dédié : tombe dans le default de ExecuteExtractFromERPTask, donc passe par le vieux ParamExtract (ExecuteExtract_ConvertERPTask_To_ParamExtract).\n- Acomba : Seul filtre réellement appliqué pour cette entité : plage de dates sur FicheTransactions.DateFacture (ExtractManager.cs:363,366).\n- Acomba : Entité-ligne : les lignes sont extraites comme sous-collection des transactions (soumissions), pas comme entité indépendante avec son propre ExtractByQuerySettings.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `gt`, `gte`, `lt`, `lte`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerBidLine.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerBidLine"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerBidLine/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.4 - Customer Bid Line"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.4 - Customer Bid Line",
        "operationId": "getCustomerBidLine",
        "summary": "CustomerBidLine — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerBidLine demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerBidLine"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerBidLine (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerOrder": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.5 - Customer Order"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.5 - Customer Order",
        "operationId": "listCustomerOrder",
        "summary": "CustomerOrder — lister",
        "description": "- **Les lignes viennent avec l'entête** : Les produits, quantités et montants de la commande sont imbriqués dans la collection `LigneFacture[]` de la commande extraite. Il n'est pas nécessaire d'interroger l'entité CustomerOrderLine séparément.\n\n**Lecture disponible pour** : Acomba, Avantage, Sage300.\n\n**Limitations connues**\n\n- Acomba : Un seul filtre par index Acomba a la fois (NoFacture, NoUniqueSystemeSource, DateFacture, Fiche_DerniereModification), sauf la paire NoFacture + CompteRecevable_No.\n- Acomba : Pagination Skip/Top supportee. La recherche par Fiche_DerniereModification exige une version recente d'Acomba (index 17, Key_InTimeModified).\n- Avantage : Extraction SDK/TCP (ExtractCustomerOrders)\n- Avantage : En-tête + lignes de détail (lues séparément)\n- Avantage : Mapping des champs non détaillé dans cette fiche\n- Sage300 : Top (page size) plafonné à 50 (MaxPageSize)\n- Sage300 : Endpoint OData /OE/OEOrders\n- Sage300 : TypeDoc forcé à Commandes",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `ListeReglement` (Acomba), `ProductGroup_PurchaseGlAccount` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ListeReglement",
                  "ProductGroup_PurchaseGlAccount"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerOrder.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerOrder"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "3 - Comptes clients",
          "3.5 - Customer Order"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.5 - Customer Order",
        "operationId": "createCustomerOrder",
        "summary": "CustomerOrder — créer",
        "description": "**Création disponible pour** : Acomba, Sage300.\n\n**Limitations connues**\n\n- Acomba : Numerotation des lignes : 990 lignes au total maximum pour les produits (991 a 998 sont reserves par Acomba aux taxes/frais de transport). Le total compte les lignes inscrites PLUS les lignes vides laissees par les trous de numerotation. Depuis v4.6.7, le SDK valide apres conversion et refuse avec un message explicite ; un document plus volumineux doit etre scinde.\n- Acomba : Pas de panachage (refuse depuis v4.6.7) : soit TOUTES les lignes de produits portent un NoLigneFacture, soit AUCUNE. Motif : pour une ligne laissee a 0, le SDK assigne la POSITION de la ligne dans la liste, pas le prochain numero libre - melanger les deux styles fait collisionner les numeros.\n- Sage300 : Requis : InfoClientFacturerA.NoClient (sinon ArgumentException)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerOrder"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerOrder"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerOrder/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.5 - Customer Order"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.5 - Customer Order",
        "operationId": "getCustomerOrder",
        "summary": "CustomerOrder — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerOrder demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerOrder"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "3 - Comptes clients",
          "3.5 - Customer Order"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.5 - Customer Order",
        "operationId": "updateCustomerOrder",
        "summary": "CustomerOrder — mettre à jour",
        "description": "**Modification disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Meme validation des numeros de lignes qu'au CREATE (990 lignes au total, numeros uniques, v4.6.7).\n- Sage300 : Non câblé : aucun case EntityType.CustomerOrder sous TaskType.UPDATE dans le GlobalInterfacor",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerOrder"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerOrder"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerOrder (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerOrderLine": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.6 - Customer Order Line"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.6 - Customer Order Line",
        "operationId": "listCustomerOrderLine",
        "summary": "CustomerOrderLine — lister",
        "description": "**Lecture disponible pour** : Acomba (partial).\n\n**Limitations connues**\n\n- Acomba : Routage seul : EntityType.CustomerOrderLine n'a PAS de case dédié dans ExtractManager.ExecuteExtractFromERPTask, il tombe dans le default -> ExecuteExtract_ConvertERPTask_To_ParamExtract (vieux ParamExtract).\n- Acomba : ConvertToOldType mappe CustomerOrderLine -> SI_ExtractContentType.CommandeDetails, qui n'est traité par AUCUN case dans ExecuteExtractFromParamExtraction -> default -> NotImplementedException à l'exécution.\n- Acomba : Seul filtre réellement câblé pour cette entité-ligne : plage de dates sur FicheTransactions.DateFacture (branche lignes de ExtractManager).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `gt`, `gte`, `lt`, `lte`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerOrderLine.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerOrderLine"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerOrderLine/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.6 - Customer Order Line"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.6 - Customer Order Line",
        "operationId": "getCustomerOrderLine",
        "summary": "CustomerOrderLine — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerOrderLine demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerOrderLine"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerOrderLine (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerInvoice": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.7 - Customer Invoice"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.7 - Customer Invoice",
        "operationId": "listCustomerInvoice",
        "summary": "CustomerInvoice — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba, Autotask, Avantage, ProShop, QuickBooksOnline.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/CustomerInvoice?$select=NoFacture,MontantNonPaye&$expand=ListeReglement\nGET /Entity/CustomerInvoice?$filter=DateFacture ge '2024-01-01'&$select=NoFacture,DateFacture,TotalFacture,InfoClientFacturerA\n```\n\n**Limitations connues**\n\n- Acomba : Header AcoSDK.Invoicing036 (index/clés) + GetCard AcoSDK.Transaction030 pour la fiche complète.\n- Acomba : Un seul filtre indexé à la fois, sauf la paire NoFacture + CompteRecevable_No.\n- Acomba : Index Acomba : NoFacture=index 1, NoUniqueSystemeSource=GetCard direct, DateFacture=index 6, Fiche_DerniereModification=index 17.\n- Acomba : Filtres MontantNonPaye, Description, Référence, NoVendeur, NoTerritoire appliqués en post-extraction (en mémoire, non indexés).\n- Acomba : Lignes supprimées (ILStatus!=0) et transactions supprimées (InStatus!=0) exclues.\n- Autotask : Lecture depuis AutoTask (Invoices + BillingItems)\n- Autotask : Graphe d'entités liées auto-résolu (Companies, BillingItem, TicketCharge, Products, BillingCode) : >= 5 appels API\n- Autotask : Contournement bug UDF multiples (fetch + filtrage en mémoire)\n- Avantage : Extraction SDK/TCP (ExtractInvoices)\n- Avantage : Lignes de détail lues séparément\n- ProShop : Lecture depuis ProShop 'invoices'\n- ProShop : Formats : PROSHOP, SOLINFO|FULLTRANSACTION (lignes produit + taxes), SOLINFO|INVOICEAR (journal GL AR)\n- ProShop : Mode AllRecords/LastModifiedDate REFUSÉ si ActionType=Synchronize (garde-fou)\n- ProShop : Groupes de taxe récupérés dynamiquement depuis Acomba (mapping ProShopAcombaTaxMapping)\n- QuickBooksOnline : Lit les entités QBO Invoice (pas les CreditMemo en lecture)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            },
            "example": "NoFacture,MontantNonPaye"
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "DateFacture ge '2024-01-01'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `InfoClientFacturerA` (QuickBooksOnline), `InfoClientLivrerA` (QuickBooksOnline), `LigneFacture` (QuickBooksOnline), `ListeReglement` (Acomba), `ProductGroup_PurchaseGlAccount` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "InfoClientFacturerA",
                  "InfoClientLivrerA",
                  "LigneFacture",
                  "ListeReglement",
                  "ProductGroup_PurchaseGlAccount"
                ]
              }
            },
            "style": "form",
            "explode": false,
            "example": [
              "ListeReglement"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerInvoice.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerInvoice"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "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
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "3 - Comptes clients",
          "3.7 - Customer Invoice"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.7 - Customer Invoice",
        "operationId": "createCustomerInvoice",
        "summary": "CustomerInvoice — créer",
        "description": "- **Headers recommandés** : Utilisez le header If-None-Match: * pour garantir que la création échouera si l'entité existe déjà.\n- **Important** : 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.\n- **Acomba — mode simulation** : Le header `SIMULATE_ONLY: TRUE` demande au connecteur de valider et calculer la facture (taxes, totaux) SANS rien écrire dans l'ERP. Disponible pour Acomba à partir d'ERPConnector V3.2.2. Voir l'exemple `post-request-simulate`.\n\n**Création disponible pour** : Acomba, QuickBooksOnline.\n\n**Champs requis, selon l'ERP**\n\n- `DateFacture` — Acomba : **requis**, QuickBooksOnline : **requis**\n- `TypeDoc` — Acomba : **requis**, QuickBooksOnline : non supporté\n- `InfoClientFacturerA` — Acomba : **requis**, QuickBooksOnline : **requis**\n- `InfoClientFacturerA.NoClient` — Acomba : **requis**, QuickBooksOnline : optionnel\n- `LigneFacture` — Acomba : **requis**, QuickBooksOnline : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Acomba : Numérotation des lignes : 990 lignes au total maximum pour les produits (991 à 998 sont réservés par Acomba aux taxes/frais de transport). Le total compte les lignes inscrites PLUS les lignes vides laissées par les trous de numérotation : 913 lignes numérotées jusqu'à 1063 comptent pour 1063. Depuis v4.6.7, le SDK valide après conversion et refuse avec un message explicite ; un document plus volumineux doit être scindé.\n- Acomba : Pas de panachage (refusé depuis v4.6.7) : soit TOUTES les lignes de produits portent un NoLigneFacture, soit AUCUNE. Motif : pour une ligne laissée à 0, le SDK assigne la POSITION de la ligne dans la liste, pas le prochain numéro libre — mélanger les deux styles fait collisionner les numéros.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          },
          {
            "name": "SIMULATE_ONLY",
            "in": "header",
            "required": false,
            "description": "`TRUE` : valide et calcule la requête (taxes, totaux) SANS rien écrire dans l'ERP.",
            "schema": {
              "type": "string"
            },
            "example": "TRUE"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true,
                "description": "Le corps attendu enveloppe le/la CustomerInvoice (voir les exemples ci-dessous). Cette enveloppe n'est pas décrite dans la documentation d'entité : ses propriétés ne sont donc pas validées ici."
              },
              "examples": {
                "post-request-qbo": {
                  "summary": "post request qbo",
                  "value": {
                    "Facture": {
                      "TypeDoc": "FACTURES",
                      "Référence": "From OERP",
                      "Description": "From OERP",
                      "DateFacture": "2024-04-24",
                      "InfoClientFacturerA": {
                        "NoClient": "Adwin Ko"
                      },
                      "Devise": "CAD",
                      "LigneFacture": [
                        {
                          "strNoProduit": "Employee Training",
                          "QteFacture": 4,
                          "PrixFinal": 15.41,
                          "Description": "Produit ABC"
                        },
                        {
                          "Description": "Ligne de description simple"
                        },
                        {
                          "strNoProduit": "Catering",
                          "QteFacture": 4
                        },
                        {
                          "strNoProduit_NoUniqueSystemeSource": "12",
                          "QteFacture": 4
                        },
                        {
                          "strNoProduit": "12",
                          "QteFacture": 4
                        }
                      ]
                    },
                    "ReturnFullTransaction": true
                  }
                },
                "post-request-simulate": {
                  "summary": "post request simulate",
                  "value": {
                    "Facture": {
                      "TypeDoc": "FACTURES",
                      "Référence": "From OERP",
                      "Description": "From OERP",
                      "DateFacture": "2024-04-24",
                      "InfoClientFacturerA": {
                        "NoClient": "0Comptoir"
                      },
                      "LigneFacture": [
                        {
                          "QteFacture": 1,
                          "PrixFinal": 100,
                          "strNoGroupeProduit": "190",
                          "DescriptionLigne": "Test 123"
                        },
                        {
                          "QteFacture": 1,
                          "strNoProduit": "CAThermo",
                          "PrixFinal": 100
                        }
                      ]
                    },
                    "ListeModePaiements": null,
                    "ReturnFullTransaction": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerInvoice"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "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
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerInvoice/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.7 - Customer Invoice"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.7 - Customer Invoice",
        "operationId": "getCustomerInvoice",
        "summary": "CustomerInvoice — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            },
            "example": "NoFacture,MontantNonPaye"
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerInvoice demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerInvoice"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "3 - Comptes clients",
          "3.7 - Customer Invoice"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.7 - Customer Invoice",
        "operationId": "updateCustomerInvoice",
        "summary": "CustomerInvoice — mettre à jour",
        "description": "**Modification disponible pour** : Acomba.\n\n**Champs requis, selon l'ERP**\n\n- `DateFacture` — Acomba : **requis**, QuickBooksOnline : **requis**\n- `TypeDoc` — Acomba : **requis**, QuickBooksOnline : non supporté\n- `InfoClientFacturerA` — Acomba : **requis**, QuickBooksOnline : **requis**\n- `InfoClientFacturerA.NoClient` — Acomba : **requis**, QuickBooksOnline : optionnel\n- `LigneFacture` — Acomba : **requis**, QuickBooksOnline : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Acomba : Même validation des numéros de lignes qu'au CREATE (990 lignes au total, numéros uniques, v4.6.7).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerInvoice"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerInvoice"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerInvoice (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerInvoiceLine": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.8 - Customer Invoice Line"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.8 - Customer Invoice Line",
        "operationId": "listCustomerInvoiceLine",
        "summary": "CustomerInvoiceLine — lister",
        "description": "- **Un seul filtre disponible** : Sur ce chemin, seule une plage de dates sur `DateFacture` est prise en compte (`gt`, `ge`, `lt`, `le`). Les autres champs ne sont pas filtrables, et `$expand` n'y est pas supporté. Pour filtrer sur un numéro de facture ou un client, interroger CustomerInvoice.\n\n**Lecture disponible pour** : Acomba (partial).\n\n**Limitations connues**\n\n- Acomba : Pas de route dédiée : tombe dans le 'default' de ExtractManager -> ExecuteExtract_ConvertERPTask_To_ParamExtract (vieux ParamExtract).\n- Acomba : Aucune extraction ligne-à-ligne : retourne des FicheTransactions complètes, lignes imbriquées dans LigneFacture (List<LigneTransactions>).\n- Acomba : Seul filtre de date appliqué : range sur DateFacture (gt/gte/lt/lte).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `gt`, `gte`, `lt`, `lte`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerInvoiceLine.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerInvoiceLine"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerInvoiceLine/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.8 - Customer Invoice Line"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.8 - Customer Invoice Line",
        "operationId": "getCustomerInvoiceLine",
        "summary": "CustomerInvoiceLine — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerInvoiceLine demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerInvoiceLine"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerInvoiceLine (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerARInvoice": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.9 - Customer AR Invoice"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.9 - Customer AR Invoice",
        "operationId": "listCustomerARInvoice",
        "summary": "CustomerARInvoice — lister",
        "description": "**Lecture disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Header InvoiceAR (clés) + GetCard TransAR. Lignes (LigneFacture) seulement si Expand=LigneFacture.\n- Acomba : Un seul filtre indexé à la fois, sauf paires NoFacture+NoClient et NoClient+DateFacture.\n- Acomba : Filtre NoFacture exige obligatoirement un filtre NoClient (eq) en complément.\n- Acomba : Filtres MontantNonPaye, Description, Référence, NoVendeur, NoTerritoire, SousTypeTransaction appliqués en post-extraction (en mémoire, non indexés).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `InfoClientFacturerA` (Acomba), `InfoClientLivrerA` (Acomba), `LigneFacture` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "InfoClientFacturerA",
                  "InfoClientLivrerA",
                  "LigneFacture"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerARInvoice.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerARInvoice"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "3 - Comptes clients",
          "3.9 - Customer AR Invoice"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.9 - Customer AR Invoice",
        "operationId": "createCustomerARInvoice",
        "summary": "CustomerARInvoice — créer",
        "description": "- **Création seulement** : La facture comptable se crée, mais ne se modifie pas par l'API (aucun PUT n'est routé). Une correction passe par le système comptable lui-même.\n\n**Création disponible pour** : Acomba.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerARInvoice"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerARInvoice"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerARInvoice/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.9 - Customer AR Invoice"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.9 - Customer AR Invoice",
        "operationId": "getCustomerARInvoice",
        "summary": "CustomerARInvoice — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerARInvoice demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerARInvoice"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerARInvoice (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerARInvoiceLine": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.10 - Customer AR Invoice Line"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.10 - Customer AR Invoice Line",
        "operationId": "listCustomerARInvoiceLine",
        "summary": "CustomerARInvoiceLine — lister",
        "description": "**Lecture disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Lecture seule. Lignes plates (1 entrée = 1 affectation comptable GL d'une TransAR).\n- Acomba : Extraction déléguée à AcombaSDK_ArInvoices.ExtractByQuerySettings (headers TransAR) puis aplatissement des lignes : les filtres s'appliquent au HEADER (NoFacture, NoClient, DateFacture, NoUniqueSystemeSource=CardPos, Fiche_DerniereModification), pas aux champs de ligne.\n- Acomba : Filtre NoFacture exige un filtre NoClient (eq) accompagnant.\n- Acomba : Combinaisons d'index supportées : NoFacture+NoClient, NoClient+DateFacture. Au-delà d'un filtre d'index : exception.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `gt`, `gte`, `in`, `lt`, `lte`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerARInvoiceLine.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/LigneTransactions"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerARInvoiceLine/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.10 - Customer AR Invoice Line"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.10 - Customer AR Invoice Line",
        "operationId": "getCustomerARInvoiceLine",
        "summary": "CustomerARInvoiceLine — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerARInvoiceLine demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LigneTransactions"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerARInvoiceLine (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerInvoicePayment": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.11 - Customer Invoice Payment"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.11 - Customer Invoice Payment",
        "operationId": "listCustomerInvoicePayment",
        "summary": "CustomerInvoicePayment — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/CustomerInvoicePayment?$filter=InvoicePayment.Facture_No eq '22197' and Client_No eq '1'\nGET /Entity/CustomerInvoicePayment\n```\n\n**Limitations connues**\n\n- Acomba : Header CustomerPayment031 (cles d'index) + GetCard, puis CustomerPaymentLine (index 4 Key_CPPaymentCP) pour le lien paiement->factures. Seuls les paiements CPStatus==0 sont retournes.\n- Acomba : Au plus 1 filtre principal indexe. Les seuls champs filtrables (ListAllowedFilter) sont NumeroPaiement, NoUniqueSystemeSource, DatePaiement, Client_No et Liste_PaiementFacture[].Facture_No ; tout autre champ -> Exception.\n- Acomba : Filtre Facture_No (eq seulement) exige obligatoirement un filtre Client_No (eq) en complement, sinon Exception.\n- Acomba : Sans filtre : scan complet via index 8 (Key_CPCustomerNumber+Key_CPPaymentDate+Key_CPUnique) ; supporte Skip/Top.\n- Acomba : Filtre synthetique CUSTOM_FILTER_UNPAID_INVOICES_ONLY (ExtractManager) -> GetPaiement.ExtractionReglement_InvoicePartiallyPaid (paiements touchant des factures AR non payees integralement, via InvoiceAR index 3) ; ignore les autres filtres.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `gt`, `gte`, `in`, `lt`, `lte`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "InvoicePayment.Facture_No eq '22197' and Client_No eq '1'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `ListePaiement` (Acomba), `Liste_PaiementFacture` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ListePaiement",
                  "Liste_PaiementFacture"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerInvoicePayment.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ARPayment"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NumeroPaiement": "PAY-2024-001",
                        "NoUniqueSystemeSource": "GUID-12345",
                        "DatePaiement": "2024-01-15T10:30:00",
                        "Client_No": "C001",
                        "TotalPaiement": 1250.00,
                        "TotalEscompte": 25.00,
                        "ReferencePaiement": "CHQ-123456",
                        "TypePaiement": "Chèques",
                        "ListePaiement": [
                          {
                            "ModePaiement": 4,
                            "dbl_MontantPaiement": 1250.00,
                            "date_DatePaiement": "2024-01-15T10:30:00"
                          }
                        ],
                        "Liste_PaiementFacture": [
                          {
                            "Facture_No": "F-2024-001",
                            "dbl_MontantTotalFacture": 1456.75,
                            "dbl_MontantDuPaiement": 1225.00,
                            "dbl_MontantEscompte": 25.00,
                            "DateFacture": "2024-01-05T00:00:00"
                          }
                        ]
                      },
                      {
                        "NumeroPaiement": "PAY-2024-002",
                        "NoUniqueSystemeSource": "GUID-67890",
                        "DatePaiement": "2024-01-16T14:15:00",
                        "Client_No": "C002",
                        "TotalPaiement": 3500.00,
                        "TotalEscompte": 0.00,
                        "ReferencePaiement": "Paiement mixte",
                        "TypePaiement": "Multiple",
                        "ListePaiement": [
                          {
                            "ModePaiement": 1,
                            "dbl_MontantPaiement": 1500.00,
                            "date_DatePaiement": "2024-01-16T14:15:00"
                          },
                          {
                            "ModePaiement": 5,
                            "dbl_MontantPaiement": 2000.00,
                            "date_DatePaiement": "2024-01-16T14:15:00"
                          }
                        ],
                        "Liste_PaiementFacture": [
                          {
                            "Facture_No": "F-2024-010",
                            "dbl_MontantTotalFacture": 2000.00,
                            "dbl_MontantDuPaiement": 2000.00,
                            "dbl_MontantEscompte": 0.00
                          },
                          {
                            "Facture_No": "F-2024-011",
                            "dbl_MontantTotalFacture": 1800.00,
                            "dbl_MontantDuPaiement": 1500.00,
                            "dbl_MontantEscompte": 0.00
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "3 - Comptes clients",
          "3.11 - Customer Invoice Payment"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.11 - Customer Invoice Payment",
        "operationId": "createCustomerInvoicePayment",
        "summary": "CustomerInvoicePayment — créer",
        "description": "- **Disponibilité** : La création de paiements clients est actuellement supportée pour Acomba uniquement. Cette fonctionnalité n'est pas disponible pour QuickBooks Online et Avantage.\n- **Paiements en lot** : Le body peut être un ARRAY pour soumettre plusieurs paiements en un seul appel. Deux garde-fous par paiement : `BlockIfAlreadyPaid` (refuse si la facture est déjà payée) et `RequireFullSettlement` (exige un règlement à 100 %, ni plus ni moins). Voir l'exemple `post-request-multiple`.\n\n**Création disponible pour** : Acomba.\n\n**Champs requis, selon l'ERP**\n\n- `Client_No` — Acomba : **requis**\n- `DatePaiement` — Acomba : **requis**\n- `Liste_PaiementFacture` — Acomba : **requis**\n- `ListePaiement` — Acomba : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ARPayment"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/ARPayment"
                    }
                  }
                ]
              },
              "examples": {
                "post-request-multiple": {
                  "summary": "post request multiple",
                  "value": [
                    {
                      "Client_No": "0Comptoir",
                      "BlockIfAlreadyPaid": true,
                      "ListePaiement": [
                        {
                          "ModePaiement": "PaiementDirect",
                          "dbl_MontantPaiement": 30.01
                        }
                      ],
                      "Liste_PaiementFacture": [
                        {
                          "Facture_No": "10038",
                          "dbl_MontantDuPaiement": 30.01,
                          "dbl_MontantEscompte": 0.00
                        }
                      ]
                    },
                    {
                      "Client_No": "8394577",
                      "BlockIfAlreadyPaid": true,
                      "RequireFullSettlement": true,
                      "ListePaiement": [
                        {
                          "ModePaiement": "Comptant",
                          "dbl_MontantPaiement": 1723.46
                        }
                      ],
                      "Liste_PaiementFacture": [
                        {
                          "Facture_No": "10019",
                          "dbl_MontantDuPaiement": 1723.46,
                          "dbl_MontantEscompte": 0.00
                        }
                      ]
                    }
                  ]
                },
                "post-request": {
                  "summary": "post request",
                  "value": {
                    "ReferencePaiement": "Test",
                    "Client_No": "1",
                    "DatePaiement": "2025-11-18",
                    "DateNotification": "2025-01-01",
                    "ListePaiement": [
                      {
                        "ModePaiement": "Comptant",
                        "dbl_MontantPaiement": 6.00,
                        "date_DatePaiement": "2025-11-18"
                      }
                    ],
                    "Liste_PaiementFacture": [
                      {
                        "Facture_No": "22197",
                        "dbl_MontantDuPaiement": 1.00,
                        "dbl_MontantEscompte": 0.00
                      },
                      {
                        "Facture_No": "22198",
                        "dbl_MontantDuPaiement": 1.00,
                        "dbl_MontantEscompte": 0.00
                      },
                      {
                        "Facture_No": "22199",
                        "dbl_MontantDuPaiement": 1.00,
                        "dbl_MontantEscompte": 0.00
                      },
                      {
                        "Facture_No": "22200",
                        "dbl_MontantDuPaiement": 1.00,
                        "dbl_MontantEscompte": 0.00
                      },
                      {
                        "Facture_No": "22201",
                        "dbl_MontantDuPaiement": 1.00,
                        "dbl_MontantEscompte": 0.00
                      },
                      {
                        "Facture_No": "22202",
                        "dbl_MontantDuPaiement": 1.00,
                        "dbl_MontantEscompte": 0.00
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/ARPayment"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ARPayment"
                      }
                    }
                  ]
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "NumeroPaiement": "PAY-2025-001",
                      "NoUniqueSystemeSource": "GUID-NEW-12345",
                      "DatePaiement": "2025-11-18T00:00:00",
                      "DateNotification": "2025-01-01T00:00:00",
                      "Client_No": "1",
                      "TotalPaiement": 6.00,
                      "TotalEscompte": 0.00,
                      "ReferencePaiement": "Test",
                      "TypePaiement": "Comptant",
                      "ListePaiement": [
                        {
                          "ModePaiement": "Comptant",
                          "dbl_MontantPaiement": 6.00,
                          "date_DatePaiement": "2025-11-18T00:00:00"
                        }
                      ],
                      "Liste_PaiementFacture": [
                        {
                          "Facture_No": "22197",
                          "Facture_NoUniqueSystemeSource": "INV-GUID-22197",
                          "dbl_MontantDuPaiement": 1.00,
                          "dbl_MontantEscompte": 0.00
                        },
                        {
                          "Facture_No": "22198",
                          "Facture_NoUniqueSystemeSource": "INV-GUID-22198",
                          "dbl_MontantDuPaiement": 1.00,
                          "dbl_MontantEscompte": 0.00
                        },
                        {
                          "Facture_No": "22199",
                          "Facture_NoUniqueSystemeSource": "INV-GUID-22199",
                          "dbl_MontantDuPaiement": 1.00,
                          "dbl_MontantEscompte": 0.00
                        },
                        {
                          "Facture_No": "22200",
                          "Facture_NoUniqueSystemeSource": "INV-GUID-22200",
                          "dbl_MontantDuPaiement": 1.00,
                          "dbl_MontantEscompte": 0.00
                        },
                        {
                          "Facture_No": "22201",
                          "Facture_NoUniqueSystemeSource": "INV-GUID-22201",
                          "dbl_MontantDuPaiement": 1.00,
                          "dbl_MontantEscompte": 0.00
                        },
                        {
                          "Facture_No": "22202",
                          "Facture_NoUniqueSystemeSource": "INV-GUID-22202",
                          "dbl_MontantDuPaiement": 1.00,
                          "dbl_MontantEscompte": 0.00
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerInvoicePayment/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.11 - Customer Invoice Payment"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.11 - Customer Invoice Payment",
        "operationId": "getCustomerInvoicePayment",
        "summary": "CustomerInvoicePayment — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerInvoicePayment demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ARPayment"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerInvoicePayment (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerServiceContract": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.12 - Customer Service Contract"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.12 - Customer Service Contract",
        "operationId": "listCustomerServiceContract",
        "summary": "CustomerServiceContract — lister",
        "description": "**Lecture disponible pour** : Autotask.\n\n**Limitations connues**\n\n- Autotask : Lecture depuis AutoTask (Contracts) via le pont ERPConnectorTask (TaskType.EXTRACT)\n- Autotask : Lookup CompanyID → CustomerCode si UseAccountIdForCustomerNumbering=false\n- Autotask : Skip max 10000",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerServiceContract.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerServiceContract"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerServiceContract/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.12 - Customer Service Contract"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.12 - Customer Service Contract",
        "operationId": "getCustomerServiceContract",
        "summary": "CustomerServiceContract — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerServiceContract demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerServiceContract"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerServiceContract (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/CustomerPaymentTerm": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.13 - Customer Payment Term"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.13 - Customer Payment Term",
        "operationId": "listCustomerPaymentTerm",
        "summary": "CustomerPaymentTerm — lister",
        "description": "- **Recoupement avec la fiche client** : `NoTermeDePaiement` se recoupe avec `Customer.TermeDePaiement_No`, et `NoTermeDePaiement_NoUniqueSystemeSource` avec le CardPos du terme.\n- **Aucun filtrage ni pagination** : l'appel retourne la table complète. Ces tables comptent quelques dizaines de lignes ; l'usage prévu est de tout charger une fois et de garder un index en mémoire.\n- **Valeurs de `TypeTerme`** : le champ est retourné sous forme de **code texte**, pas de valeur numérique — et les codes diffèrent entre les termes client (`TTAR_*`) et les termes fournisseur (`TT_*`) pour les mêmes concepts. Ne codez pas en dur une valeur d'un côté en supposant qu'elle vaut de l'autre.\n\n**Lecture disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Aucun filtrage ni pagination : RetrieveTermeDePaiement() ne prend pas de QuerySettings, itère tous les termes via FirstKey/NextKey(index 1).\n- Acomba : Seuls les termes à escompte sont couverts intégralement. Pour les termes à versements périodiques et à échéancier, la périodicité, le nombre de versements et les dates d'échéancier ne sont pas extraits.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de CustomerPaymentTerm.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerPaymentTerm"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/CustomerPaymentTerm/{id}": {
      "get": {
        "tags": [
          "3 - Comptes clients",
          "3.13 - Customer Payment Term"
        ],
        "x-apidog-folder": "3 - Comptes clients/3.13 - Customer Payment Term",
        "operationId": "getCustomerPaymentTerm",
        "summary": "CustomerPaymentTerm — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la CustomerPaymentTerm demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerPaymentTerm"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la CustomerPaymentTerm (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Supplier": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.1 - Supplier"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.1 - Supplier",
        "operationId": "listSupplier",
        "summary": "Supplier — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba, Autotask (experimental), Avantage, ProShop, QuickBooksOnline, Sage50.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/Supplier\n```\n\n**Limitations connues**\n\n- Acomba : Un seul filtre à la fois (Filters.Count > 1 => exception).\n- Acomba : Filtre sur Fiche_DerniereModification requiert Acomba >= 0036 (Supplier036 / Key_SuTimeModified), sinon exception.\n- Acomba : Pagination par Skip/Top via lecture par buffer sur index natif.\n- Autotask : Lecture depuis AutoTask (Companies, CompanyType=7) MAIS la conversion AutoTask→Solinfo lève NotImplementedException (non implémentée)\n- Autotask : Non supporté via le pont ERPConnectorTask\n- Avantage : Extraction SDK/TCP (ExtractFournisseurs)\n- ProShop : Lecture depuis ProShop 'contacts' (type=Vendor)\n- ProShop : Distinction Client/Vendor faite en C# APRÈS fetch\n- ProShop : Formats : PROSHOP, SOLINFO|FULLTRANSACTION (pas INVOICEAR)\n- ProShop : Mode ListOfInternalIds NON supporté pour Supplier\n- Sage50 : Lecture SQL table tVendor (clé lId)\n- Sage50 : Pagination LIMIT/OFFSET",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `AccountPayableSettings` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "AccountPayableSettings"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Supplier.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Fournisseurs"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "0000000000",
                        "NoFournisseur": "0000000000",
                        "NomFournisseur": "NOUS MEME",
                        "FicheNomComplet": "0000000000 - NOUS MEME",
                        "Addresse": "",
                        "CodePostal": "",
                        "Ville": "",
                        "Province": "QC",
                        "Pays": "CAN",
                        "DeviseParDefaut": "",
                        "EstActif": true,
                        "SiteWeb": "",
                        "ListeTelephonique": [
                          {
                            "Numero": "",
                            "TypeTel": 1
                          },
                          {
                            "Numero": "",
                            "TypeTel": 3
                          },
                          {
                            "Numero": "",
                            "TypeTel": 4
                          },
                          {
                            "Numero": "",
                            "TypeTel": 2
                          }
                        ],
                        "ExtendedProperties": {},
                        "EmailPrincipal_Adresse": "",
                        "EmailPrincipal_EstDepotElectronique": false,
                        "EmailPrincipal_EstPublicite": false,
                        "Email2_EstDepotElectronique": false,
                        "Email2_EstPublicite": false,
                        "Email3_EstDepotElectronique": false,
                        "Email3_EstPublicite": false
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.1 - Supplier"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.1 - Supplier",
        "operationId": "createSupplier",
        "summary": "Supplier — créer",
        "description": "- **Headers recommandés** : Utilisez le header If-None-Match: * pour garantir que la création échouera si l'entité existe déjà.\n- **Important** : Pour Acomba et Avantage, le NoFournisseur est obligatoire. Pour QuickBooks, il est généré automatiquement si non fourni. Le système retourne toujours le NoUniqueSystemeSource qui est la clé interne de l'ERP.\n- **Avantage — contraintes de format** : Dans Avantage, le `NoFournisseur` est limité à 10 caractères et le `CodePostal` doit suivre le format « AAA AAA ». Le champ `ExpenseAccountNumber` accepte jusqu'à 5 comptes GL de charge par défaut (séparés par des virgules), et le terme de paiement se définit via `ExtendedProperties` (clés `TERME_PAIEMENT_*`). Voir l'exemple `post-request-avantage`.\n\n**Création disponible pour** : Acomba, Autotask (partial), Avantage, QuickBooksOnline.\n\n**Champs requis, selon l'ERP**\n\n- `NoFournisseur` — Acomba : **requis**, Autotask : optionnel, Avantage : **requis**, QuickBooksOnline : optionnel\n- `NomFournisseur` — Acomba : **requis**, Autotask : non supporté, Avantage : **requis**, QuickBooksOnline : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Autotask : Écriture via SYNC ERP→AutoTask (upsert : lookup par NoFournisseur ou UDF ERPInternalId, puis POST/PATCH)\n- Avantage : AvantageSDK_Supplier.CreateSupplier (SDK, requête W04) : requiert NoFournisseur et NomFournisseur",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Fournisseurs"
              },
              "examples": {
                "post-request-avantage": {
                  "summary": "post request avantage",
                  "value": {
                    "NoFournisseur": "MonFournis",
                    "NomFournisseur": "ROZA le Rénovateur",
                    "Addresse": "837 8e Rue",
                    "Ville": "Cité du Printemps",
                    "CodePostal": "G0G 0G0",
                    "Pays": "Canada",
                    "Province": "QC",
                    "EmailPrincipal_Adresse": "roza@rozarenove.com",
                    "SiteWeb": "www.rozarenove.com",
                    "NomPersonneContact": "Mr. Roza",
                    "DeviseParDefaut": "CAD",
                    "FournisseurPayerA_No": "MonFournisseur02",
                    "NoEnregistrementTaxeFederale": "000000000",
                    "NoEnregistrementTaxeProvinciale": "000000000",
                    "ExpenseAccountNumber": "21310,21340,21341,21350,21360",
                    "ListeTelephonique": [
                      {
                        "Numero": "418-534-4450",
                        "TypeTel": 1
                      },
                      {
                        "Numero": "514-265-4126",
                        "TypeTel": 2
                      }
                    ],
                    "ExtendedProperties": {
                      "TERME_PAIEMENT_CONDITION": 30,
                      "TERME_PAIEMENT_DELAIS": 15,
                      "TERME_PAIEMENT_ESCOMPTE": 10.5,
                      "TERME_PAIEMENT_CONDITION_JOUR_PROCHAIN_MOIS": true,
                      "TERME_PAIEMENT_DELAIS_JOUR_PROCHAIN_MOIS": true,
                      "TERME_PAIEMENT_ESCOMPTE_APPLICABLE_TAXES": true
                    }
                  }
                },
                "post-request": {
                  "summary": "post request",
                  "value": {
                    "NoFournisseur": "monFourn02",
                    "NomFournisseur": "ROZA le Rénovateur",
                    "Addresse": "837 8e Rue",
                    "Ville": "Cité du Printemps  (QC)",
                    "NomPersonneContact": "Kalid Babouche",
                    "CodePostal": "G0G0G0",
                    "Pays": "CA",
                    "Langue": "Français",
                    "EstActif": true,
                    "SiteWeb": "www.rozarenove.com",
                    "ListeTelephonique": [
                      {
                        "Numero": "5142654125",
                        "Description": "Téléphone",
                        "TypeTel": 1
                      },
                      {
                        "Numero": "5142654126",
                        "Description": "Télécopieur",
                        "TypeTel": 2
                      },
                      {
                        "TypeTel": 3
                      },
                      {
                        "TypeTel": 4
                      }
                    ],
                    "TermeDePaiement_No": "2",
                    "NoCompteGLAchat": "8000000",
                    "NoClientLiaison": "458844545",
                    "RepresentantNom": "Pierre Michaud",
                    "EmailPrincipal_Adresse": "kalidebabouche@info.net",
                    "EmailPrincipal_EstDepotElectronique": false,
                    "EmailPrincipal_EstPublicite": false,
                    "Email2_Adresse": null,
                    "Email2_EstDepotElectronique": false,
                    "Email2_EstPublicite": false,
                    "Email3_Adresse": null,
                    "Email3_EstDepotElectronique": false,
                    "Email3_EstPublicite": false,
                    "ComptePayable": "0",
                    "CompteRecevableNo": "0"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fournisseurs"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "NoFournisseur": "monFourn02",
                      "NomFournisseur": "ROZA le Rénovateur",
                      "Addresse": "837 8e Rue",
                      "Ville": "Cité du Printemps  (QC)",
                      "NomPersonneContact": "Kalid Babouche",
                      "CodePostal": "G0G0G0",
                      "Pays": "CA",
                      "Langue": "Français",
                      "EstActif": true,
                      "SiteWeb": "www.rozarenove.com",
                      "ListeTelephonique": [
                        {
                          "Numero": "5142654125",
                          "Description": "Téléphone",
                          "TypeTel": 1
                        },
                        {
                          "Numero": "5142654126",
                          "Description": "Télécopieur",
                          "TypeTel": 2
                        },
                        {
                          "TypeTel": 3
                        },
                        {
                          "TypeTel": 4
                        }
                      ],
                      "TermeDePaiement_No": "2",
                      "NoCompteGLAchat": "8000000",
                      "NoClientLiaison": "458844545",
                      "RepresentantNom": "Pierre Michaud",
                      "EmailPrincipal_Adresse": "kalidebabouche@info.net",
                      "EmailPrincipal_EstDepotElectronique": false,
                      "EmailPrincipal_EstPublicite": false,
                      "Email2_Adresse": null,
                      "Email2_EstDepotElectronique": false,
                      "Email2_EstPublicite": false,
                      "Email3_Adresse": null,
                      "Email3_EstDepotElectronique": false,
                      "Email3_EstPublicite": false,
                      "ComptePayable": "0",
                      "CompteRecevableNo": "0"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Supplier/{id}": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.1 - Supplier"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.1 - Supplier",
        "operationId": "getSupplier",
        "summary": "Supplier — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Supplier demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fournisseurs"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.1 - Supplier"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.1 - Supplier",
        "operationId": "updateSupplier",
        "summary": "Supplier — mettre à jour",
        "description": "- **Headers recommandés** : Utilisez le header If-Match: * pour garantir que la mise à jour échouera si l'entité n'existe pas déjà.\n- **Support limité** : La mise à jour (PUT) n'est supportée que pour Acomba et QuickBooks Online. Avantage, Sage 50, Servex et Servicentre ne supportent pas cette opération.\n- **Mise à jour partielle** : Vous pouvez envoyer seulement les champs que vous souhaitez modifier. Les champs non fournis conserveront leur valeur actuelle dans l'ERP.\n\n**Modification disponible pour** : Acomba, Autotask (partial), Avantage, QuickBooksOnline.\n\n**Champs requis, selon l'ERP**\n\n- `NoFournisseur` — Acomba : **requis**, Autotask : optionnel, Avantage : **requis**, QuickBooksOnline : optionnel\n- `NomFournisseur` — Acomba : **requis**, Autotask : non supporté, Avantage : **requis**, QuickBooksOnline : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Autotask : Idem CREATE : upsert par SYNC\n- Avantage : AvantageSDK_Supplier.UpdateSupplier (SDK, requête W12) : requiert NoFournisseur\n- Avantage : Champs protégés par Avantage en modification (FDEB, FNUMTPS, FNUMTVQ, FGROS, FDATE, FBAL, FACM, FACA, FACD, FFLOT, FSOLRET, FDEVISE) : refusés\n- Avantage : Seuls les champs renseignés sont poussés ; « ! » remet un champ à zéro\n- Avantage : FINACTIF (EstActif) part toujours dans la requête",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la mise à jour échoue si l'entité n'existe pas.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Fournisseurs"
              },
              "examples": {
                "put-request": {
                  "summary": "put request",
                  "value": {
                    "NoFournisseur": "monFourn02",
                    "NomFournisseur": "ROZA le Rénovateur",
                    "Addresse": "837 8e Rue",
                    "Ville": "Cité du Printemps  (QC)",
                    "NomPersonneContact": "Kalid Babouche",
                    "CodePostal": "G0G0G0",
                    "Pays": "CA",
                    "Langue": "Français",
                    "EstActif": true,
                    "SiteWeb": "www.rozarenove.com",
                    "ListeTelephonique": [
                      {
                        "Numero": "5142654125",
                        "Description": "Téléphone",
                        "TypeTel": 1
                      },
                      {
                        "Numero": "5142654126",
                        "Description": "Télécopieur",
                        "TypeTel": 2
                      },
                      {
                        "TypeTel": 3
                      },
                      {
                        "TypeTel": 4
                      }
                    ],
                    "TermeDePaiement_No": "2",
                    "NoCompteGLAchat": "8000000",
                    "NoClientLiaison": "458844545",
                    "RepresentantNom": "Pierre Michaud",
                    "EmailPrincipal_Adresse": "kalidebabouche@info.net",
                    "EmailPrincipal_EstDepotElectronique": false,
                    "EmailPrincipal_EstPublicite": false,
                    "Email2_Adresse": null,
                    "Email2_EstDepotElectronique": false,
                    "Email2_EstPublicite": false,
                    "Email3_Adresse": null,
                    "Email3_EstDepotElectronique": false,
                    "Email3_EstPublicite": false,
                    "ComptePayable": "0",
                    "CompteRecevableNo": "0"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Fournisseurs"
                },
                "examples": {
                  "put-response": {
                    "summary": "put response",
                    "value": {
                      "NoFournisseur": "monFourn02",
                      "NomFournisseur": "ROZA le Rénovateur",
                      "Addresse": "837 8e Rue",
                      "Ville": "Cité du Printemps  (QC)",
                      "NomPersonneContact": "Kalid Babouche",
                      "CodePostal": "G0G0G0",
                      "Pays": "CA",
                      "Langue": "Français",
                      "EstActif": true,
                      "SiteWeb": "www.rozarenove.com",
                      "ListeTelephonique": [
                        {
                          "Numero": "5142654125",
                          "Description": "Téléphone",
                          "TypeTel": 1
                        },
                        {
                          "Numero": "5142654126",
                          "Description": "Télécopieur",
                          "TypeTel": 2
                        },
                        {
                          "TypeTel": 3
                        },
                        {
                          "TypeTel": 4
                        }
                      ],
                      "TermeDePaiement_No": "2",
                      "NoCompteGLAchat": "8000000",
                      "NoClientLiaison": "458844545",
                      "RepresentantNom": "Pierre Michaud",
                      "EmailPrincipal_Adresse": "kalidebabouche@info.net",
                      "EmailPrincipal_EstDepotElectronique": false,
                      "EmailPrincipal_EstPublicite": false,
                      "Email2_Adresse": null,
                      "Email2_EstDepotElectronique": false,
                      "Email2_EstPublicite": false,
                      "Email3_Adresse": null,
                      "Email3_EstDepotElectronique": false,
                      "Email3_EstPublicite": false,
                      "ComptePayable": "0",
                      "CompteRecevableNo": "0"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Supplier (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/SupplierProduct": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.2 - Supplier Product"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.2 - Supplier Product",
        "operationId": "listSupplierProduct",
        "summary": "SupplierProduct — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/SupplierProduct?$filter=No_Fournisseur eq 'FOUR001'&$select=NoProduit_Fournisseur,Description,prix_ProchainCoutant\n```\n\n**Limitations connues**\n\n- Acomba : Filtrage par index COM (1=SupplierCP+Catalog, 2=SupplierNumber+Catalog, 3=Catalog+SupplierNumber, 4=UPC). Un seul filtre cle determine l'index, les autres en post-filtre.\n- Acomba : Filtre Fiche_DerniereModification applique en post-filtre (lecture complete de chaque fiche).\n- Acomba : Fiches supprimees (PSStatus != 0) exclues du resultat.\n- Acomba : skip/top supportes via QuerySettings.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            },
            "example": "NoProduit_Fournisseur,Description,prix_ProchainCoutant"
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `gt`, `gte`, `in`, `lt`, `lte`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "No_Fournisseur eq 'FOUR001'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de SupplierProduct.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FicheProduitFournisseur"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "145",
                        "NoUniqueSystemeSource_Fournisseur": "12",
                        "No_Fournisseur": "FOUR001",
                        "NoProduit_Fournisseur": "ABC-12345",
                        "Description": "Produit ABC du fournisseur",
                        "CodeUPC_Fournisseur": "012345678901",
                        "CodeUnite_Court": "UN",
                        "CodeUnite_Long": "Unité",
                        "EstActif": true,
                        "prix_ProchainCoutant": 45.99,
                        "Qte_Economique": 12,
                        "Fiche_DerniereModification": "2024-03-15T14:30:00"
                      },
                      {
                        "NoUniqueSystemeSource": "146",
                        "NoUniqueSystemeSource_Fournisseur": "12",
                        "No_Fournisseur": "FOUR001",
                        "NoProduit_Fournisseur": "XYZ-67890",
                        "Description": "Produit XYZ du fournisseur",
                        "CodeUPC_Fournisseur": "098765432109",
                        "CodeUnite_Court": "BT",
                        "CodeUnite_Long": "Boîte",
                        "EstActif": true,
                        "prix_ProchainCoutant": 89.50,
                        "Qte_Economique": 6,
                        "Fiche_DerniereModification": "2024-03-20T09:15:00"
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.2 - Supplier Product"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.2 - Supplier Product",
        "operationId": "createSupplierProduct",
        "summary": "SupplierProduct — créer",
        "description": "- **Headers recommandés** : Utilisez le header If-None-Match: * pour garantir que la création échouera si l'entité existe déjà.\n- **Important** : La combinaison No_Fournisseur + NoProduit_Fournisseur forme la clé primaire dans Acomba. Si vous tentez de créer un produit fournisseur qui existe déjà avec le header If-None-Match: *, une erreur sera retournée.\n\n**Création disponible pour** : Acomba.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FicheProduitFournisseur"
              },
              "examples": {
                "post-request-acomba": {
                  "summary": "post request acomba",
                  "value": {
                    "No_Fournisseur": "FOUR001",
                    "NoProduit_Fournisseur": "CAT-ABC-12345",
                    "Description": "Produit ABC - Version fournisseur",
                    "CodeUPC_Fournisseur": "012345678901",
                    "CodeUnite_Court": "UN",
                    "CodeUnite_Long": "Unité",
                    "prix_ProchainCoutant": 45.99,
                    "Qte_Economique": 12
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheProduitFournisseur"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "NoUniqueSystemeSource": "147",
                      "NoUniqueSystemeSource_Fournisseur": "12",
                      "No_Fournisseur": "FOUR001",
                      "NoProduit_Fournisseur": "CAT-ABC-12345",
                      "Description": "Produit ABC - Version fournisseur",
                      "CodeUPC_Fournisseur": "012345678901",
                      "CodeUnite_Court": "UN",
                      "CodeUnite_Long": "Unité",
                      "EstActif": true,
                      "prix_ProchainCoutant": 45.99,
                      "Qte_Economique": 12,
                      "Fiche_DerniereModification": "2024-04-24T10:30:00"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/SupplierProduct/{id}": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.2 - Supplier Product"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.2 - Supplier Product",
        "operationId": "getSupplierProduct",
        "summary": "SupplierProduct — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            },
            "example": "NoProduit_Fournisseur,Description,prix_ProchainCoutant"
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la SupplierProduct demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheProduitFournisseur"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.2 - Supplier Product"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.2 - Supplier Product",
        "operationId": "updateSupplierProduct",
        "summary": "SupplierProduct — mettre à jour",
        "description": "- **Headers recommandés** : Utilisez le header If-Match: * pour garantir que la mise à jour échouera si l'entité n'existe pas.\n\n**Modification disponible pour** : Acomba.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FicheProduitFournisseur"
              },
              "examples": {
                "put-request": {
                  "summary": "put request",
                  "value": {
                    "NoUniqueSystemeSource": "147",
                    "Description": "Produit ABC - Description mise à jour",
                    "prix_ProchainCoutant": 49.99,
                    "Qte_Economique": 24
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheProduitFournisseur"
                },
                "examples": {
                  "put-response": {
                    "summary": "put response",
                    "value": {
                      "NoUniqueSystemeSource": "147",
                      "NoUniqueSystemeSource_Fournisseur": "12",
                      "No_Fournisseur": "FOUR001",
                      "NoProduit_Fournisseur": "CAT-ABC-12345",
                      "Description": "Produit ABC - Description mise à jour",
                      "CodeUPC_Fournisseur": "012345678901",
                      "CodeUnite_Court": "UN",
                      "CodeUnite_Long": "Unité",
                      "EstActif": true,
                      "prix_ProchainCoutant": 49.99,
                      "Qte_Economique": 24,
                      "Fiche_DerniereModification": "2024-04-25T08:45:00"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la SupplierProduct (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/SupplierOrder": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.3 - Supplier Order"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.3 - Supplier Order",
        "operationId": "listSupplierOrder",
        "summary": "SupplierOrder — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba, Avantage.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/SupplierOrder?$filter=DateFacture ge '2024-01-01'&$select=NoFacture,DateFacture,Fournisseur_No,TotalFacture\n```\n\n**Limitations connues**\n\n- Acomba : Dispatch : GetInvoices.ExtractByQuerySettings (groupe Customer*/Supplier*). entityType=SupplierOrder => Acomba InvoicingType.ITp_Purchase (un 'Achat').\n- Acomba : Un seul filtre par index à la fois, sauf la paire NoFacture + CompteRecevable_No.\n- Acomba : Requiert une version d'Acomba supportant Invoicing036 (Key_InTimeModified), sinon ApplicationException.\n- Avantage : Extraction SDK/TCP (ExtractSupplierOrders)\n- Avantage : Lignes de détail lues séparément\n- Avantage : Champs scalaires cœur et sous-entités client filtrables (TCP) via le chemin complet (NomChampSolinfoComplet, ex. InfoClientLivrerA.NoClient) ; ambiguïté facturé/livré levée",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            },
            "example": "NoFacture,DateFacture,Fournisseur_No,TotalFacture"
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "DateFacture ge '2024-01-01'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `ListeReglement` (Acomba), `ProductGroup_PurchaseGlAccount` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ListeReglement",
                  "ProductGroup_PurchaseGlAccount"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de SupplierOrder.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SupplierOrder"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoFacture": "BC-2024-001",
                        "DateFacture": "2024-01-15T00:00:00",
                        "TotalFacture": 2500.00,
                        "SousTotalFacture": 2173.91,
                        "Fournisseur_No": "FOUR001",
                        "Référence": "PO-EXT-12345",
                        "LigneFacture": [
                          {
                            "NoLigneFacture": 1,
                            "strNoProduit": "PROD-001",
                            "DescriptionLigne": "Matière première A",
                            "QteCommande": 100,
                            "PrixFinal": 15.00,
                            "Montant_SousTotalLigne": 1500.00
                          },
                          {
                            "NoLigneFacture": 2,
                            "strNoProduit": "PROD-002",
                            "DescriptionLigne": "Composant électronique B",
                            "QteCommande": 50,
                            "PrixFinal": 13.48,
                            "Montant_SousTotalLigne": 673.91
                          }
                        ]
                      },
                      {
                        "NoFacture": "BC-2024-002",
                        "DateFacture": "2024-01-18T00:00:00",
                        "TotalFacture": 875.50,
                        "SousTotalFacture": 761.30,
                        "Fournisseur_No": "FOUR002",
                        "Référence": "PO-EXT-12346",
                        "LigneFacture": [
                          {
                            "NoLigneFacture": 1,
                            "strNoProduit": "PROD-003",
                            "DescriptionLigne": "Fourniture de bureau",
                            "QteCommande": 25,
                            "PrixFinal": 30.45,
                            "Montant_SousTotalLigne": 761.30
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.3 - Supplier Order"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.3 - Supplier Order",
        "operationId": "createSupplierOrder",
        "summary": "SupplierOrder — créer",
        "description": "- **Headers recommandés** : Utilisez le header If-None-Match: * pour garantir que la création échouera si l'entité existe déjà.\n- **Important** : Pour les bons de commandes fournisseurs Acomba, le TypeDoc doit être \"ACHATS\". Les taxes sont calculées automatiquement selon le groupe de taxes configuré pour le fournisseur dans le système.\n\n**Création disponible pour** : Acomba.\n\n**Champs requis, selon l'ERP**\n\n- `TypeDoc` — Acomba : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true,
                "description": "Le corps attendu enveloppe le/la SupplierOrder (voir les exemples ci-dessous). Cette enveloppe n'est pas décrite dans la documentation d'entité : ses propriétés ne sont donc pas validées ici."
              },
              "examples": {
                "post-request-acomba": {
                  "summary": "post request acomba",
                  "value": {
                    "Facture": {
                      "TypeDoc": "ACHATS",
                      "Référence": "PO-EXT-12345",
                      "Description": "Commande matières premières Q1",
                      "DateFacture": "2024-04-24",
                      "Fournisseur_No": "FOUR001",
                      "LigneFacture": [
                        {
                          "QteCommande": 100,
                          "strNoProduit": "PROD-001"
                        },
                        {
                          "QteCommande": 50,
                          "strNoProduit": "PROD-002",
                          "PrixFinal": 13.48,
                          "DescriptionLigne": "Composant électronique B - Promotion"
                        },
                        {
                          "DescriptionLigne": "Livraison urgente demandée"
                        },
                        {
                          "QteCommande": 25,
                          "strNoGroupeProduit": "200",
                          "DescriptionLigne": "Fournitures diverses",
                          "PrixFinal": 30.45
                        }
                      ]
                    },
                    "ReturnFullTransaction": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierOrder"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "OrigRemoteTaskID": 129015,
                      "ResultType": "Success",
                      "ErrorType": "None",
                      "ResultMessage": "Tâche terminée avec succès",
                      "ResultPayload": {
                        "Message": "OK - Bon de commande créé sous le numéro : BC-2024-003",
                        "NoFacture": "BC-2024-003",
                        "RecCardPos": "256",
                        "SousTotal": 2935.21,
                        "Total": 3376.14,
                        "FullTransaction": {
                          "NoFacture": "BC-2024-003",
                          "NoUniqueSystemeSource": "256",
                          "TypeDoc": 4,
                          "Référence": "PO-EXT-12345",
                          "Description": "Commande matières premières Q1",
                          "DateFacture": "2024-04-24T00:00:00",
                          "Fournisseur_No": "FOUR001",
                          "SousTotalFacture": 2935.21,
                          "TotalFacture": 3376.14,
                          "ListeDesTaxes": [
                            {
                              "Taxe_Numero": "T.P.S. 100%",
                              "Taxe_Description": "Taxe sur les produits et services",
                              "MontantTaxe": 146.76,
                              "Taxe_NumeroLegalGouv": "RT100393939933"
                            },
                            {
                              "Taxe_Numero": "T.V.Q. 100%",
                              "Taxe_Description": "Taxe de Vente Québec",
                              "MontantTaxe": 294.17,
                              "Taxe_NumeroLegalGouv": "TQ1000292929922"
                            }
                          ],
                          "LigneFacture": [
                            {
                              "NoLigneFacture": 1,
                              "strNoProduit": "PROD-001",
                              "strNoGroupeProduit": "100",
                              "DescriptionLigne": "Matière première A",
                              "QteCommande": 100,
                              "PrixFinal": 15.00,
                              "PrixCoutant": 15.00,
                              "Montant_SousTotalLigne": 1500.00,
                              "Montant_TotalLigne": 1725.11
                            },
                            {
                              "NoLigneFacture": 2,
                              "strNoProduit": "PROD-002",
                              "strNoGroupeProduit": "100",
                              "DescriptionLigne": "Composant électronique B - Promotion",
                              "QteCommande": 50,
                              "PrixFinal": 13.48,
                              "Montant_SousTotalLigne": 674.00,
                              "Montant_TotalLigne": 775.24
                            },
                            {
                              "NoLigneFacture": 3,
                              "strNoProduit": "",
                              "DescriptionLigne": "Livraison urgente demandée",
                              "QteCommande": 0,
                              "Montant_SousTotalLigne": 0
                            },
                            {
                              "NoLigneFacture": 4,
                              "strNoProduit": "",
                              "strNoGroupeProduit": "200",
                              "DescriptionLigne": "Fournitures diverses",
                              "QteCommande": 25,
                              "PrixFinal": 30.45,
                              "Montant_SousTotalLigne": 761.21,
                              "Montant_TotalLigne": 875.79
                            }
                          ],
                          "NbLignes": 4
                        }
                      },
                      "IsTaskCompleted": true
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/SupplierOrder/{id}": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.3 - Supplier Order"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.3 - Supplier Order",
        "operationId": "getSupplierOrder",
        "summary": "SupplierOrder — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            },
            "example": "NoFacture,DateFacture,Fournisseur_No,TotalFacture"
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la SupplierOrder demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierOrder"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.3 - Supplier Order"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.3 - Supplier Order",
        "operationId": "updateSupplierOrder",
        "summary": "SupplierOrder — mettre à jour",
        "description": "**Modification disponible pour** : Acomba.\n\n**Champs requis, selon l'ERP**\n\n- `TypeDoc` — Acomba : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupplierOrder"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierOrder"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la SupplierOrder (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/SupplierOrderReceipt": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.4 - Supplier Order Receipt"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.4 - Supplier Order Receipt",
        "operationId": "listSupplierOrderReceipt",
        "summary": "SupplierOrderReceipt — lister",
        "description": "**Lecture disponible pour** : Acomba (unknown).\n\n**Limitations connues**\n\n- Acomba : Aucun case EXTRACT dédié dans AcombaSDK_ExtractManager : tombe dans le default (legacy ParamExtract). La doc v4.1.0 indique explicitement 'Pas de READ (CREATE-only)'.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de SupplierOrderReceipt.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SupplierOrderReceiptHeader"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.4 - Supplier Order Receipt"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.4 - Supplier Order Receipt",
        "operationId": "createSupplierOrderReceipt",
        "summary": "SupplierOrderReceipt — créer",
        "description": "- **Important - Validations** : Le système effectue plusieurs validations avant d'enregistrer la réception :\n\n**Création disponible pour** : Acomba.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupplierOrderReceiptHeader"
              },
              "examples": {
                "post-request-acomba": {
                  "summary": "post request acomba",
                  "value": {
                    "ReceiptDate": "2025-06-11",
                    "SupplierOrderNumberReference": "2424",
                    "SupplierNumberReference": "000000001",
                    "ReceiptLines": [
                      {
                        "QuantityReceived": 1,
                        "ProductNumber": "22",
                        "LineNumber": 1
                      },
                      {
                        "QuantityReceived": 1,
                        "ProductNumber": "852-GRO-00805",
                        "LineNumber": 2
                      },
                      {
                        "QuantityReceived": 1,
                        "ProductNumber": "ADA-DB25M-DB25F-5",
                        "LineNumber": 10
                      },
                      {
                        "QuantityReceived": 1,
                        "ProductNumber": "ADA-DB9FDB25M-29",
                        "LineNumber": 11
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierOrderReceiptHeader"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "OrigRemoteTaskID": 129015,
                      "ResultType": "Success",
                      "ErrorType": "None",
                      "ResultMessage": "OK - Réception de l'achat : 2424 effectué avec succès.",
                      "ResultPayload": [
                        {
                          "ErpInternalId": null,
                          "BusinessKey": "SupplierOrder 2424 - Line 1",
                          "ErrorMessage": null,
                          "Success": true
                        },
                        {
                          "ErpInternalId": null,
                          "BusinessKey": "SupplierOrder 2424 - Line 2",
                          "ErrorMessage": null,
                          "Success": true
                        },
                        {
                          "ErpInternalId": null,
                          "BusinessKey": "SupplierOrder 2424 - Line 10",
                          "ErrorMessage": null,
                          "Success": true
                        },
                        {
                          "ErpInternalId": null,
                          "BusinessKey": "SupplierOrder 2424 - Line 11",
                          "ErrorMessage": null,
                          "Success": true
                        }
                      ],
                      "IsTaskCompleted": true,
                      "NbEntitiesImpacted": 4
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/SupplierOrderReceipt/{id}": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.4 - Supplier Order Receipt"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.4 - Supplier Order Receipt",
        "operationId": "getSupplierOrderReceipt",
        "summary": "SupplierOrderReceipt — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la SupplierOrderReceipt demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierOrderReceiptHeader"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la SupplierOrderReceipt (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/SupplierInvoice": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.5 - Supplier Invoice"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.5 - Supplier Invoice",
        "operationId": "listSupplierInvoice",
        "summary": "SupplierInvoice — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba, Avantage, ProShop (partial), QuickBooksOnline, Sage50.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/SupplierInvoice?$expand=ListeReglementFournisseur\nGET /Entity/SupplierInvoice?$filter=DateFacture gt '2024-01-01'\nGET /Entity/SupplierInvoice?$select=NoFacture,InfoClientFacturerA.NoClient,DateFacture&$filter=NoFacture eq 'F1245' and Fournisseur_No eq '0000000BOI'\nGET /Entity/SupplierInvoice\n```\n\n**Limitations connues**\n\n- Acomba : Lecture via index InvoiceAP (CardPos) puis GetCard TransAP complet.\n- Acomba : Filtre NoFacture exige obligatoirement un filtre compagnon Fournisseur_No (eq).\n- Acomba : Au plus 1 filtre, sauf la paire NoFacture + Fournisseur_No.\n- Acomba : Filtre Fiche_DerniereModification sans index Acomba : scan complet + filtrage mecanique.\n- Acomba : Transactions supprimees (InStatus != 0) exclues du resultat.\n- Avantage : Extraction ODBC (ExtractionFacturesFournisseur)\n- Avantage : Lignes GL en 10 paires de colonnes (PGL1-10/PMONT1-10), lues par requête séparée\n- Avantage : Paiements liés via Expand (ListeReglementFournisseur)\n- ProShop : Lecture depuis ProShop 'bills' — EN-TÊTE seulement\n- ProShop : Lignes (LigneFacture[]) et taxes NON mappées en v1 (TODO)\n- ProShop : Formats : PROSHOP, SOLINFO|FULLTRANSACTION (partiel) ; INVOICEAR non supporté (TODO v2)\n- ProShop : Pas de mark-as-synced (les bills n'ont pas de champ status/originCode)\n- Sage50 : Lecture via SDK (PurchasesJournal lookup), pas SQL\n- Sage50 : Filtre TotalFacture non combinable avec d'autres filtres (limite SDK)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            },
            "example": "NoFacture,InfoClientFacturerA.NoClient,DateFacture"
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "DateFacture gt '2024-01-01'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `AccountPayableSettings` (Acomba), `InfoClientFacturerA` (QuickBooksOnline), `LigneFacture` (QuickBooksOnline), `ListeReglementFournisseur` (Avantage), `TermeDePaiement` (QuickBooksOnline).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "AccountPayableSettings",
                  "InfoClientFacturerA",
                  "LigneFacture",
                  "ListeReglementFournisseur",
                  "TermeDePaiement"
                ]
              }
            },
            "style": "form",
            "explode": false,
            "example": [
              "ListeReglementFournisseur"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de SupplierInvoice.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SupplierInvoice"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.5 - Supplier Invoice"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.5 - Supplier Invoice",
        "operationId": "createSupplierInvoice",
        "summary": "SupplierInvoice — créer",
        "description": "- **Headers recommandés** : Utilisez le header If-None-Match: * pour garantir que la création échouera si l'entité existe déjà.\n- **Acomba — ordre et signe des lignes** : Dans Acomba, la première ligne (`LigneFacture`) doit être le COMPTE À PAYER. Son `PrixFinal` est POSITIF pour une facture normale et NÉGATIF pour un crédit ; les lignes de dépense suivent le signe inverse. Voir l'exemple `post-request-acomba-credit`.\n- **Sage 50 — taxes par ligne** : Sage 50 offre trois façons de gérer les taxes sur une ligne : (1) fournir `strNoProduit` seul (taxe calculée automatiquement), (2) fournir `NoGroupeTaxe` (Sage calcule), ou (3) forcer les valeurs via `settingForcedTaxes.InfoTaxe_ListTaxesForcees`. Voir l'exemple `post-request-sage-taxes`.\n- **Avantage — retenues et terme de paiement** : Les retenues sont propres à Avantage et se placent dans `ExtendedProperties` (`MontantTotalRetenue`, `NoGlRetenuesAPayer`…). Pour le terme de paiement, si un `Paiement_JourDuMois` est défini, Avantage le PRIORISE devant `Paiement_NbJourMax`. Voir les exemples `post-request-avantage*`.\n\n**Création disponible pour** : Acomba, Avantage, QuickBooksOnline, Sage50.\n\n**Limitations connues**\n\n- Avantage : InvoiceAPSDK.CreationFactureFournisseur (SDK)\n- Avantage : Mapping des champs d'écriture non détaillé dans cette fiche (validation interne côté SDK)\n- Sage50 : Requis : >= 1 ligne (LigneFacture) + nom de fournisseur (InfoClientFacturerA.NomClient)\n- Sage50 : Écriture via SDK PurchasesJournal ; projets de ligne assignés après POST via SQL (tITLULiP)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupplierInvoice"
              },
              "examples": {
                "post-request-acomba-credit": {
                  "summary": "post request acomba credit",
                  "value": {
                    "DateFacture": "2025-07-05",
                    "TypeDoc": "FACTURESFOURNISSEURS",
                    "Description": "Exemple ERPConnector - Crédit fournisseur",
                    "NoFacture": "credit-test1",
                    "Référence": null,
                    "InfoClientFacturerA": {
                      "NoClient": "0000000BOI"
                    },
                    "LigneFacture": [
                      {
                        "DescriptionLigne": "COMPTES A PAYER",
                        "NoCompteGL": "21300",
                        "PrixFinal": -16.73
                      },
                      {
                        "DescriptionLigne": "ACHATS - MÉLAMINE TR",
                        "NoCompteGL": "41200",
                        "PrixFinal": 14.68
                      },
                      {
                        "DescriptionLigne": "T.P.S. à réclamer",
                        "NoCompteGL": "21340",
                        "PrixFinal": 0.88
                      },
                      {
                        "DescriptionLigne": "T.V.Q. à réclamer",
                        "NoCompteGL": "21370",
                        "PrixFinal": 1.17
                      }
                    ]
                  }
                },
                "post-request-avantage-terme-paiement": {
                  "summary": "post request avantage terme paiement",
                  "value": {
                    "DateFacture": "2024-04-05",
                    "TypeDoc": "FACTURESFOURNISSEURS",
                    "Description": "Exemple - terme de paiement Avantage",
                    "NoFacture": "terme-test1",
                    "SousTotalFacture": -14.68,
                    "InfoClientFacturerA": {
                      "NoClient": "0000000BOI"
                    },
                    "TermeDePaiement": {
                      "EscompteJour_Escompte": 9.51,
                      "EscompteJour_NbJourMax": 28,
                      "Paiement_JourDuMois": 14,
                      "ApplicableSurTaxes": false
                    },
                    "LigneFacture": [
                      {
                        "DescriptionLigne": "COMPTES A PAYER",
                        "NoCompteGL": "21300",
                        "PrixFinal": -16.73
                      },
                      {
                        "DescriptionLigne": "ACHATS - MÉLAMINE TR",
                        "NoCompteGL": "41200",
                        "PrixFinal": 14.68
                      }
                    ]
                  }
                },
                "post-request-avantage": {
                  "summary": "post request avantage",
                  "value": {
                    "DateFacture": "2024-04-05",
                    "TypeDoc": "FACTURESFOURNISSEURS",
                    "NoProjet": "0000000100",
                    "Description": "test1",
                    "NoFacture": "test activitee 01",
                    "Référence": null,
                    "SousTotalFacture": -14.68,
                    "InfoClientFacturerA": {
                      "NoClient": "0000000BOI"
                    },
                    "LigneFacture": [
                      {
                        "DescriptionLigne": "COMPTES A PAYER",
                        "NoCompteGL": "21300",
                        "PrixFinal": -16.73
                      },
                      {
                        "DescriptionLigne": "ACHATS - MÉLAMINE TR",
                        "NoCompteGL": "41200",
                        "NoActivitee": "13560",
                        "PrixFinal": 14.68
                      },
                      {
                        "DescriptionLigne": "T.P.S. à réclamer",
                        "NoCompteGL": "21340",
                        "PrixFinal": 0.88
                      },
                      {
                        "DescriptionLigne": "T.V.Q. à réclamer",
                        "NoCompteGL": "21370",
                        "PrixFinal": 1.17
                      },
                      {
                        "DescriptionLigne": "Retenues à payer T.P.S.",
                        "NoCompteGL": "21341",
                        "PrixFinal": 0.88
                      },
                      {
                        "DescriptionLigne": "Retenues à payer T.V.Q.",
                        "NoCompteGL": "21370",
                        "PrixFinal": 1.17
                      }
                    ],
                    "ExtendedProperties": {
                      "MontantTotalRetenue": 0.00,
                      "SoldeRetenueAPayer": 0.00,
                      "NoGlRetenuesAPayer": "21310",
                      "MontantPayeTVQTaux1SurRetenues": 0.00,
                      "MontantPayeTVQTaux2SurRetenues": 0.00,
                      "MontantPayeTPSSurRetenues": 0.00
                    }
                  }
                },
                "post-request-quickbooks": {
                  "summary": "post request quickbooks",
                  "value": {
                    "DateFacture": "2024-04-05",
                    "TypeDoc": "FACTURESFOURNISSEURS",
                    "CompteRecevable_No": "Visa Credit Card",
                    "Description": "Test 01",
                    "TermeDePaiement": {
                      "NomTermeDePaiement": "Credit Card",
                      "TypeTerme": "creditcard"
                    },
                    "NoFacture": "TestSupplierInvoice01",
                    "NoteGlobaleExterne01": "Memo QuickBooks",
                    "InfoClientFacturerA": {
                      "NoClient": "ROZA le Rénovateur"
                    },
                    "LigneFacture": [
                      {
                        "DescriptionLigne": "achats divers",
                        "NoCompteGL": "Purchases",
                        "PrixFinal": 10.00
                      }
                    ]
                  }
                },
                "post-request-sage-taxes": {
                  "summary": "post request sage taxes",
                  "value": {
                    "DateFacture": "2025-03-31",
                    "TypeDoc": "FACTURESFOURNISSEURS",
                    "Description": "Exemple - taxes Sage 50",
                    "NoFacture": "0000009",
                    "InfoClientFacturerA": {
                      "NoClient": "Abercrombie Hardware Inc."
                    },
                    "NoteGlobaleExterne01": "",
                    "LigneFacture": [
                      {
                        "strNoProduit": "C1020",
                        "PrixFinal": 100.0,
                        "QteCommande": 1.0
                      },
                      {
                        "DescriptionLigne": "GL# and Montant only",
                        "NoCompteGL": "5495",
                        "Montant_TotalLigne": 100.0
                      },
                      {
                        "DescriptionLigne": "Text with TaxGroup - autocalc",
                        "NoCompteGL": "5495",
                        "NoGroupeTaxe": "GP",
                        "PrixFinal": 100.0,
                        "QteCommande": 1.0
                      },
                      {
                        "DescriptionLigne": "Text with TaxGroup - forced value",
                        "NoCompteGL": "5495",
                        "PrixFinal": 100.0,
                        "QteCommande": 1.0,
                        "NoGroupeTaxe": "GP",
                        "settingForcedTaxes": {
                          "InfoTaxe_ListTaxesForcees": [
                            {
                              "Taxe_Numero": "TPS",
                              "MontantTaxe": 3.33
                            },
                            {
                              "Taxe_Numero": "TVP",
                              "MontantTaxe": 1.11
                            }
                          ]
                        }
                      }
                    ]
                  }
                },
                "post-request-sage": {
                  "summary": "post request sage",
                  "value": {
                    "DateFacture": "2025-07-01",
                    "TypeDoc": "FACTURESFOURNISSEURS",
                    "Description": "test 12345",
                    "NoFacture": "1",
                    "SousTotalFacture": 1.0,
                    "InfoClientFacturerA": {
                      "NoClient": "Harry's Lumber"
                    },
                    "NoteGlobaleExterne01": "",
                    "LigneFacture": [
                      {
                        "DescriptionLigne": "purchase test",
                        "NoCompteGL": "50300",
                        "strNoProduit": "Wood",
                        "Montant_TotalLigne": 1.0,
                        "PrixFinal": 1.0,
                        "QteCommande": 1.0
                      }
                    ]
                  }
                },
                "post-request": {
                  "summary": "post request",
                  "value": {
                    "DateFacture": "2024-04-05",
                    "TypeDoc": "FACTURESFOURNISSEURS",
                    "NoProjet": "NumeroDeProjet",
                    "Description": "test1",
                    "NoFacture": "test5",
                    "Référence": null,
                    "SousTotalFacture": -14.68,
                    "InfoClientFacturerA": {
                      "NoClient": "0000000BOI"
                    },
                    "LigneFacture": [
                      {
                        "DescriptionLigne": "COMPTES A PAYER",
                        "NoCompteGL": "21300",
                        "PrixFinal": -16.73
                      },
                      {
                        "DescriptionLigne": "ACHATS - MÉLAMINE TR",
                        "NoCompteGL": "41200",
                        "PrixFinal": 14.68
                      },
                      {
                        "DescriptionLigne": "T.P.S. à réclamer",
                        "NoCompteGL": "21340",
                        "PrixFinal": 0.88
                      },
                      {
                        "DescriptionLigne": "T.V.Q. à réclamer",
                        "NoCompteGL": "21370",
                        "PrixFinal": 1.17
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierInvoice"
                },
                "examples": {
                  "post-response-avantage": {
                    "summary": "post response avantage",
                    "value": {
                      "DateFacture": "2024-04-05",
                      "TypeDoc": "FACTURESFOURNISSEURS",
                      "NoProjet": "0000000100",
                      "Description": "test1",
                      "NoFacture": "test activitee 01",
                      "Référence": null,
                      "SousTotalFacture": -14.68,
                      "InfoClientFacturerA": {
                        "NoClient": "0000000BOI"
                      },
                      "LigneFacture": [
                        {
                          "DescriptionLigne": "COMPTES A PAYER",
                          "NoCompteGL": "21300",
                          "PrixFinal": -16.73
                        },
                        {
                          "DescriptionLigne": "ACHATS - MÉLAMINE TR",
                          "NoCompteGL": "41200",
                          "NoActivitee": "13560",
                          "PrixFinal": 14.68
                        },
                        {
                          "DescriptionLigne": "T.P.S. à réclamer",
                          "NoCompteGL": "21340",
                          "PrixFinal": 0.88
                        },
                        {
                          "DescriptionLigne": "T.V.Q. à réclamer",
                          "NoCompteGL": "21370",
                          "PrixFinal": 1.17
                        },
                        {
                          "DescriptionLigne": "Retenues à payer T.P.S.",
                          "NoCompteGL": "21341",
                          "PrixFinal": 0.88
                        },
                        {
                          "DescriptionLigne": "Retenues à payer T.V.Q.",
                          "NoCompteGL": "21370",
                          "PrixFinal": 1.17
                        }
                      ],
                      "ExtendedProperties": {
                        "MontantTotalRetenue": 0.00,
                        "SoldeRetenueAPayer": 0.00,
                        "NoGlRetenuesAPayer": "21310",
                        "MontantPayeTVQTaux1SurRetenues": 0.00,
                        "MontantPayeTVQTaux2SurRetenues": 0.00,
                        "MontantPayeTPSSurRetenues": 0.00
                      }
                    }
                  },
                  "post-response-quickbooks": {
                    "summary": "post response quickbooks",
                    "value": {
                      "DateFacture": "2024-04-05",
                      "TypeDoc": "FACTURESFOURNISSEURS",
                      "CompteRecevable_No": "Visa Credit Card",
                      "Description": "Test 01",
                      "TermeDePaiement": {
                        "NomTermeDePaiement": "Credit Card",
                        "TypeTerme": "creditcard"
                      },
                      "NoFacture": "TestSupplierInvoice01",
                      "NoteGlobaleExterne01": "Memo QuickBooks",
                      "InfoClientFacturerA": {
                        "NoClient": "ROZA le Rénovateur"
                      },
                      "LigneFacture": [
                        {
                          "DescriptionLigne": "achats divers",
                          "NoCompteGL": "Purchases",
                          "PrixFinal": 10.00
                        }
                      ]
                    }
                  },
                  "post-response-sage": {
                    "summary": "post response sage",
                    "value": {
                      "DateFacture": "2025-07-01",
                      "TypeDoc": "FACTURESFOURNISSEURS",
                      "Description": "test 12345",
                      "NoFacture": "1",
                      "SousTotalFacture": 1.0,
                      "InfoClientFacturerA": {
                        "NoClient": "Harry's Lumber"
                      },
                      "NoteGlobaleExterne01": "",
                      "LigneFacture": [
                        {
                          "DescriptionLigne": "purchase test",
                          "NoCompteGL": "50300",
                          "strNoProduit": "Wood",
                          "Montant_TotalLigne": 1.0,
                          "PrixFinal": 1.0,
                          "QteCommande": 1.0
                        }
                      ]
                    }
                  },
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "DateFacture": "2024-04-05",
                      "TypeDoc": "FACTURESFOURNISSEURS",
                      "NoProjet": "NumeroDeProjet",
                      "Description": "test1",
                      "NoFacture": "test5",
                      "Référence": null,
                      "SousTotalFacture": -14.68,
                      "InfoClientFacturerA": {
                        "NoClient": "0000000BOI"
                      },
                      "LigneFacture": [
                        {
                          "DescriptionLigne": "COMPTES A PAYER",
                          "NoCompteGL": "21300",
                          "PrixFinal": -16.73
                        },
                        {
                          "DescriptionLigne": "ACHATS - MÉLAMINE TR",
                          "NoCompteGL": "41200",
                          "PrixFinal": 14.68
                        },
                        {
                          "DescriptionLigne": "T.P.S. à réclamer",
                          "NoCompteGL": "21340",
                          "PrixFinal": 0.88
                        },
                        {
                          "DescriptionLigne": "T.V.Q. à réclamer",
                          "NoCompteGL": "21370",
                          "PrixFinal": 1.17
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/SupplierInvoice/{id}": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.5 - Supplier Invoice"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.5 - Supplier Invoice",
        "operationId": "getSupplierInvoice",
        "summary": "SupplierInvoice — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            },
            "example": "NoFacture,InfoClientFacturerA.NoClient,DateFacture"
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la SupplierInvoice demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierInvoice"
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": {
                      "NoFacture": "F1245",
                      "NoUniqueSystemeSource": "000001",
                      "TypeDoc": 18,
                      "Description": "ACHAT DE BOIS EN PALETTE",
                      "DateFacture": "2014-12-31T00:00:00",
                      "InfoClientFacturerA": {
                        "NoClient": "0000000BOI",
                        "ListeTelephonique": [],
                        "ListeTaxeException": []
                      },
                      "TotalFacture": 5000,
                      "SousTotalFacture": 5000,
                      "LigneFacture": [
                        {
                          "ListeDesTaxes": [],
                          "NoUniqueSystemeSource": "000001_LINE1",
                          "LigneParente_NoUniqueSystemeSource": "000001",
                          "TypeDoc": 18,
                          "NoLigneFacture": 1,
                          "NoCompteGL": "21340",
                          "TypeLigne": 1,
                          "QteFacture": 0,
                          "QteCommande": 0,
                          "PrixOrig": 0,
                          "PrixFinal": 0,
                          "PrixCoutant": 0,
                          "Montant_SousTotalLigne": 304.28
                        },
                        {
                          "ListeDesTaxes": [],
                          "NoUniqueSystemeSource": "000001_LINE2",
                          "LigneParente_NoUniqueSystemeSource": "000001",
                          "TypeDoc": 18,
                          "NoCompteGL": "21370",
                          "TypeLigne": 1,
                          "QteFacture": 0,
                          "QteCommande": 0,
                          "PrixOrig": 0,
                          "PrixFinal": 0,
                          "PrixCoutant": 0,
                          "Montant_SousTotalLigne": 348.84
                        },
                        {
                          "ListeDesTaxes": [],
                          "NoUniqueSystemeSource": "000001_LINE3",
                          "LigneParente_NoUniqueSystemeSource": "000001",
                          "TypeDoc": 18,
                          "NoLigneFacture": 3,
                          "NoCompteGL": "33520",
                          "TypeLigne": 1,
                          "QteFacture": 0,
                          "QteCommande": 0,
                          "PrixOrig": 0,
                          "PrixFinal": 0,
                          "PrixCoutant": 0,
                          "Montant_SousTotalLigne": 4346.88
                        }
                      ],
                      "ListeReglement": [],
                      "NbLignes": 3
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.5 - Supplier Invoice"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.5 - Supplier Invoice",
        "operationId": "updateSupplierInvoice",
        "summary": "SupplierInvoice — mettre à jour",
        "description": "**Modification disponible pour** : Acomba, QuickBooksOnline.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SupplierInvoice"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierInvoice"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la SupplierInvoice (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/SupplierInvoicePayment": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.6 - Supplier Invoice Payment"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.6 - Supplier Invoice Payment",
        "operationId": "listSupplierInvoicePayment",
        "summary": "SupplierInvoicePayment — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba (partial), Avantage, Sage50.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/SupplierInvoicePayment\n```\n\n**Limitations connues**\n\n- Acomba : Retourne une liste VIDE sauf si le filtre synthetique CUSTOM_FILTER_UNPAID_INVOICES_ONLY est present (ExtractManager: sinon `new List<APPayment>()`).\n- Acomba : Au plus 1 filtre autorise ; seul CUSTOM_FILTER_UNPAID_INVOICES_ONLY est permis, sinon Exception.\n- Acomba : Quand actif, n'extrait que les paiements touchant des factures fournisseur non payees integralement (InvoiceAP index 3).\n- Avantage : Extraction ODBC (ExtractionPaiementFournisseur)\n- Avantage : Souvent extrait comme collection enfant de SupplierInvoice (Expand)\n- Avantage : Mapping limité (~6 champs)\n- Sage50 : Lecture SQL (tPmtHdr + tVenTrDt), clé lChqId\n- Sage50 : Filtres via liste codée en dur",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `ListePaiement` (Acomba), `Liste_PaiementFacture` (Acomba).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ListePaiement",
                  "Liste_PaiementFacture"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de SupplierInvoicePayment.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/APPayment"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NumeroPaiement": "0001",
                        "NoUniqueSystemeSource": "45678",
                        "DatePaiement": "2024-11-06T00:00:00",
                        "Fournisseur_No": "000000001",
                        "Fournisseur_NoUniqueSystemeSource": "123",
                        "TotalPaiement": 1.00,
                        "TotalEscompte": 0.00,
                        "TypePaiement": "Check",
                        "NoCompteGLBanque": "10000",
                        "BankInfo_InstitutionNumber": "001",
                        "BankInfo_BranchNumber": "12345",
                        "BankInfo_AccountNumber": "1234567",
                        "ListePaiement": [
                          {
                            "ModePaiement": 1,
                            "dbl_MontantPaiement": 1.00,
                            "date_DatePaiement": "2024-11-06T00:00:00"
                          }
                        ],
                        "Liste_PaiementFacture": [
                          {
                            "Facture_No": "Test 01",
                            "Facture_NoUniqueSystemeSource": "789",
                            "dbl_MontantTotalFacture": 1.00,
                            "dbl_MontantDuPaiement": 1.00,
                            "dbl_MontantEscompte": 0.00,
                            "DateFacture": "2024-10-15T00:00:00",
                            "ClientFournisseur_No": "000000001",
                            "TypeTransaction": "Invoice"
                          }
                        ]
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.6 - Supplier Invoice Payment"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.6 - Supplier Invoice Payment",
        "operationId": "createSupplierInvoicePayment",
        "summary": "SupplierInvoicePayment — créer",
        "description": "- **Disponibilité** : La création de paiements fournisseurs est supportée pour Acomba et Sage 50. Cette fonctionnalité n'est pas disponible pour Avantage, QuickBooks Online, Servex et Servicentre.\n- **Type de paiement et compte de banque** : `TypePaiement` accepte `Check`, `DirectDeposit`, `CashReceipt`, `PaymentOnHold` ou `DirectDepositOnHold`. Le `NumeroPaiement` (n° de chèque ou de dépôt) est obligatoire si le type est `Check` ou `DirectDeposit`. Le `NoCompteGLBanque` (compte GL de la banque d'où sort la somme) est obligatoire. Voir les exemples `post-request-acomba` et `post-request-sage50`.\n\n**Création disponible pour** : Acomba, Sage50.\n\n**Champs requis, selon l'ERP**\n\n- `Fournisseur_No` — Acomba : **requis**, Sage50 : **requis**\n- `TypePaiement` — Acomba : **requis**, Sage50 : optionnel\n- `NoCompteGLBanque` — Acomba : **requis**, Sage50 : **requis**\n- `TotalPaiement` — Acomba : **requis**, Sage50 : **requis**\n- `TotalEscompte` — Acomba : **requis**, Sage50 : non supporté\n- `Liste_PaiementFacture` — Acomba : **requis**, Sage50 : **requis**\n- `DatePaiement` — Acomba : optionnel, Sage50 : **requis**\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Sage50 : Requis : Fournisseur_No, DatePaiement, TotalPaiement>0, NoCompteGLBanque, >= 1 ligne Liste_PaiementFacture (montant>0, no de facture non vide)\n- Sage50 : Écriture via INSERT SQL (tPmtHdr, tVenTrDt, tJourEnt)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/APPayment"
              },
              "examples": {
                "post-request-acomba": {
                  "summary": "post request acomba",
                  "value": {
                    "NumeroPaiement": "0001",
                    "Fournisseur_No": "000000001",
                    "TypePaiement": "Check",
                    "DatePaiement": "2024-11-06",
                    "TotalPaiement": 1.00,
                    "TotalEscompte": 0,
                    "NoCompteGLBanque": "10000",
                    "Liste_PaiementFacture": [
                      {
                        "Facture_No": "Test 01",
                        "dbl_MontantDuPaiement": 1.00,
                        "dbl_MontantEscompte": 0.00
                      }
                    ]
                  }
                },
                "post-request-sage50": {
                  "summary": "post request sage50",
                  "value": {
                    "NoCompteGLBanque": "10600",
                    "Fournisseur_No": "Abercrombie Hardware Inc.",
                    "DatePaiement": "2025-07-01",
                    "TotalPaiement": 1,
                    "DescriptionPaiement": "Test OERP",
                    "Liste_PaiementFacture": [
                      {
                        "Facture_No": "1134",
                        "dbl_MontantDuPaiement": 1
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/APPayment"
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "NumeroPaiement": "0001",
                      "NoUniqueSystemeSource": "67890",
                      "DatePaiement": "2024-11-06T00:00:00",
                      "Fournisseur_No": "000000001",
                      "Fournisseur_NoUniqueSystemeSource": "123",
                      "TotalPaiement": 1.00,
                      "TotalEscompte": 0.00,
                      "TypePaiement": "Check",
                      "NoCompteGLBanque": "10000",
                      "Liste_PaiementFacture": [
                        {
                          "NoUniqueSystemeSource": "111",
                          "PaiementEntete_NoUniqueSystemeSource": "67890",
                          "Facture_No": "Test 01",
                          "Facture_NoUniqueSystemeSource": "789",
                          "dbl_MontantDuPaiement": 1.00,
                          "dbl_MontantEscompte": 0.00,
                          "ClientFournisseur_NoUniqueSystemeSource": "123"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/SupplierInvoicePayment/{id}": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.6 - Supplier Invoice Payment"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.6 - Supplier Invoice Payment",
        "operationId": "getSupplierInvoicePayment",
        "summary": "SupplierInvoicePayment — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la SupplierInvoicePayment demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/APPayment"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la SupplierInvoicePayment (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/AccountPayableSettings": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.7 - Account Payable Settings"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.7 - Account Payable Settings",
        "operationId": "listAccountPayableSettings",
        "summary": "AccountPayableSettings — lister",
        "description": "- **Filtrage Acomba** : Pour Acomba, seul le champ ErpInternalId peut être utilisé pour filtrer avec les opérateurs Equals ou InList. Les identifiants valides sont les nombres de 0 à 19.\n\n**Lecture disponible pour** : Acomba.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/AccountPayableSettings\nGET /Entity/AccountPayableSettings?$filter=ErpInternalId eq '0'\nGET /Entity/AccountPayableSettings?$filter=ErpInternalId in ('0','1','2')\n```\n\n**Limitations connues**\n\n- Acomba : Maximum 20 configurations possibles dans Acomba (index 0 a 19). Pagination Skip/Top supportee. Le seul filtre permis est ErpInternalId (Equals/InList).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `in`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "ErpInternalId eq '0'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de AccountPayableSettings.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AccountPayableSettings"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/AccountPayableSettings/{id}": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.7 - Account Payable Settings"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.7 - Account Payable Settings",
        "operationId": "getAccountPayableSettings",
        "summary": "AccountPayableSettings — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la AccountPayableSettings demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountPayableSettings"
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": {
                      "Data": [
                        {
                          "ErpInternalId": "0",
                          "Name": "Configuration Comptes Payables Principale",
                          "DefaultGLAccountNumber": "2100",
                          "DefaultGLAccountErpInternalId": "12345",
                          "FreightGLAccountNumber": "5300",
                          "FreightGLAccountErpInternalId": "12389",
                          "DiscountGLAccountNumber": "4800",
                          "DiscountGLAccountErpInternalId": "12367",
                          "ExtendedProperties": null
                        },
                        {
                          "ErpInternalId": "1",
                          "Name": "Fournisseurs Internationaux",
                          "DefaultGLAccountNumber": "2110",
                          "DefaultGLAccountErpInternalId": "12346",
                          "FreightGLAccountNumber": "5310",
                          "FreightGLAccountErpInternalId": "12390",
                          "DiscountGLAccountNumber": "4801",
                          "DiscountGLAccountErpInternalId": "12368",
                          "ExtendedProperties": null
                        }
                      ],
                      "ResultsCount": 2,
                      "TotalCount": 20,
                      "Skipped": 0,
                      "Top": null
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la AccountPayableSettings (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/SupplierPaymentTerm": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.8 - Supplier Payment Term"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.8 - Supplier Payment Term",
        "operationId": "listSupplierPaymentTerm",
        "summary": "SupplierPaymentTerm — lister",
        "description": "- **Recoupement avec la fiche fournisseur** : `NoTermeDePaiement` se recoupe avec `Supplier.TermeDePaiement_No`, et `NoTermeDePaiement_NoUniqueSystemeSource` avec `Supplier.TermeDePaiement_NoUniqueSystemeSource`.\n- **Aucun filtrage ni pagination** : l'appel retourne la table complète. Ces tables comptent quelques dizaines de lignes ; l'usage prévu est de tout charger une fois et de garder un index en mémoire.\n- **Valeurs de `TypeTerme`** : le champ est retourné sous forme de **code texte**, pas de valeur numérique — et les codes diffèrent entre les termes fournisseur (`TT_*`) et les termes client (`TTAR_*`) pour les mêmes concepts. Ne codez pas en dur une valeur d'un côté en supposant qu'elle vaut de l'autre.\n\n**Lecture disponible pour** : Acomba.\n\n**Limitations connues**\n\n- Acomba : Aucun filtrage ni pagination : RetrieveTermeDePaiementFournisseur() ne prend pas de QuerySettings, itère tous les termes via FirstKey/NextKey(index 1).\n- Acomba : Seuls les termes à escompte sont couverts intégralement. Pour les termes à versements périodiques et à échéancier, la périodicité, le nombre de versements et les dates d'échéancier ne sont pas extraits.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de SupplierPaymentTerm.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SupplierPaymentTerm"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/SupplierPaymentTerm/{id}": {
      "get": {
        "tags": [
          "4 - Comptes fournisseurs",
          "4.8 - Supplier Payment Term"
        ],
        "x-apidog-folder": "4 - Comptes fournisseurs/4.8 - Supplier Payment Term",
        "operationId": "getSupplierPaymentTerm",
        "summary": "SupplierPaymentTerm — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la SupplierPaymentTerm demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SupplierPaymentTerm"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la SupplierPaymentTerm (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Product": {
      "get": {
        "tags": [
          "5 - Inventaire",
          "5.1 - Product"
        ],
        "x-apidog-folder": "5 - Inventaire/5.1 - Product",
        "operationId": "listProduct",
        "summary": "Product — lister",
        "description": "- **Segmentation Acomba** : Pour Acomba, les produits peuvent être segmentés (par couleur, grandeur, etc.). Utilisez les propriétés IsAProductItem, Caracteristique01_*, Caracteristique02_* et Caracteristique03_* pour gérer ces variantes.\n- **Note pour composer une requête** : Pour plus de détails, veuillez consulter cet article : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba, Autotask, QuickBooksOnline.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/Product?$select=NoProduit,Sequence,GroupeProduit.CodeGroupe&$filter=GroupeProduit.CodeGroupe ge 10 and Sequence eq '0'\nGET /Entity/Product?$filter=Fiche_DerniereModification ge '2025-01-01'\nGET /Entity/Product?$select=NoProduit,Description1,PrixVendant_Liste0_Prix1,Inventaire_QteEnMain&$filter=EstActif eq true&$top=2\n```\n\n**Limitations connues**\n\n- Acomba : Top max 10000\n- Autotask : Lecture depuis AutoTask (Products)\n- QuickBooksOnline : Filtre de base implicite : Type in ('Inventory','Service','NonInventory')",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            },
            "example": "NoProduit,Sequence,GroupeProduit.CodeGroupe"
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`, `startswith`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "GroupeProduit.CodeGroupe ge 10 and Sequence eq '0'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            },
            "example": 2
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Product.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FicheProduits"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoProduit": "WIDGET-001",
                        "Description1": "Widget Standard",
                        "PrixVendant_Liste0_Prix1": 99.99,
                        "Inventaire_QteEnMain": 150
                      },
                      {
                        "NoProduit": "WIDGET-002",
                        "Description1": "Widget Premium",
                        "PrixVendant_Liste0_Prix1": 149.99,
                        "Inventaire_QteEnMain": 75
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "5 - Inventaire",
          "5.1 - Product"
        ],
        "x-apidog-folder": "5 - Inventaire/5.1 - Product",
        "operationId": "createProduct",
        "summary": "Product — créer",
        "description": "- **Headers recommandés** : Utilisez le header If-None-Match: * pour garantir que la création échouera si l'entité existe déjà.\n- **Important** : La création de produits est uniquement supportée pour Acomba. Le NoProduit et la Description1 sont obligatoires.\n\n**Création disponible pour** : Acomba, Autotask (partial).\n\n**Champs requis, selon l'ERP**\n\n- `NoProduit` — Acomba : **requis**, Autotask : optionnel\n- `Description1` — Acomba : **requis**, Autotask : non supporté\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Autotask : Écriture via SYNC ERP→AutoTask (upsert par SKU : PATCH si trouvé, sinon POST)\n- Autotask : Lookup BillingCode requis ; emplacement d'inventaire codé en dur (DEFAULT_INVENTORY_LOCATION_ID=1)\n- Autotask : Sync ERP→AutoTask ignore les produits avec QteEnMain < 1",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la création échoue si l'entité existe déjà.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/FicheProduits"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/FicheProduits"
                    }
                  }
                ]
              },
              "examples": {
                "post-request-minimal": {
                  "summary": "post request minimal",
                  "value": {
                    "NoProduit": "produit5",
                    "Description1": "Engrais à gazon en sac",
                    "CodeUPC1": "1326884361",
                    "PrixVendant_Liste0_Prix1": 123.45,
                    "GroupeProduit": {
                      "CodeGroupe": "134"
                    }
                  }
                },
                "post-request-multiple": {
                  "summary": "post request multiple",
                  "value": [
                    {
                      "NoProduit": "produit2",
                      "EstActif": true,
                      "Description1": "Engrais à gazon en sac",
                      "PrixVendant_Liste0_Prix1": 11,
                      "GroupeProduit": {
                        "CodeGroupe": "140"
                      }
                    },
                    {
                      "NoProduit": "produit3",
                      "EstActif": true,
                      "Description1": "Terreau d'empotage 30L",
                      "PrixVendant_Liste0_Prix1": 8.99,
                      "GroupeProduit": {
                        "CodeGroupe": "140"
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/FicheProduits"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FicheProduits"
                      }
                    }
                  ]
                },
                "examples": {
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "ResultType": "Success",
                      "IsTaskCompleted": true,
                      "ResultPayload": {
                        "BusinessKey": "produit2",
                        "ErpInternalId": "12345",
                        "Success": true
                      },
                      "ResultMessage": "Produit créé avec succès"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Product/{id}": {
      "get": {
        "tags": [
          "5 - Inventaire",
          "5.1 - Product"
        ],
        "x-apidog-folder": "5 - Inventaire/5.1 - Product",
        "operationId": "getProduct",
        "summary": "Product — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            },
            "example": "NoProduit,Sequence,GroupeProduit.CodeGroupe"
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Product demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheProduits"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "put": {
        "tags": [
          "5 - Inventaire",
          "5.1 - Product"
        ],
        "x-apidog-folder": "5 - Inventaire/5.1 - Product",
        "operationId": "updateProduct",
        "summary": "Product — mettre à jour",
        "description": "- **Headers recommandés** : Utilisez le header If-Match: * pour garantir que la mise à jour échouera si l'entité n'existe pas.\n- **Mise à jour partielle** : Vous n'avez pas besoin d'envoyer tous les champs. Seuls les champs fournis seront modifiés, les autres conserveront leurs valeurs existantes.\n- **Important** : La modification de produits est uniquement supportée pour Acomba.\n\n**Modification disponible pour** : Acomba, Autotask (partial).\n\n**Champs requis, selon l'ERP**\n\n- `NoProduit` — Acomba : **requis**, Autotask : optionnel\n- `Description1` — Acomba : **requis**, Autotask : non supporté\n\n_Aucun champ n'est marqué `required` dans le schéma : l'exigence dépend de l'ERP derrière votre licence._\n\n**Limitations connues**\n\n- Autotask : Idem CREATE : upsert par SYNC",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "If-Match",
            "in": "header",
            "required": false,
            "description": "`*` : la mise à jour échoue si l'entité n'existe pas.",
            "schema": {
              "type": "string"
            },
            "example": "*"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/FicheProduits"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/FicheProduits"
                    }
                  }
                ]
              },
              "examples": {
                "put-request": {
                  "summary": "put request",
                  "value": {
                    "PrixVendant_Liste0_Prix1": 109.99,
                    "Description2": "Version améliorée",
                    "EstActif": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/FicheProduits"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FicheProduits"
                      }
                    }
                  ]
                },
                "examples": {
                  "put-response": {
                    "summary": "put response",
                    "value": {
                      "ResultType": "Success",
                      "IsTaskCompleted": true,
                      "ResultPayload": {
                        "BusinessKey": "WIDGET-001",
                        "ErpInternalId": "12345",
                        "Success": true
                      },
                      "ResultMessage": "Produit mis à jour avec succès"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Product (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/ProductGroup": {
      "get": {
        "tags": [
          "5 - Inventaire",
          "5.2 - Product Group"
        ],
        "x-apidog-folder": "5 - Inventaire/5.2 - Product Group",
        "operationId": "listProductGroup",
        "summary": "ProductGroup — lister",
        "description": "- **Note pour composer une requête** : Pour plus de détails, veuillez consulter cet article : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Acomba, QuickBooksOnline.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/ProductGroup\n```\n\n**Limitations connues**\n\n- QuickBooksOnline : Filtre de base implicite : Type = 'Category'",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de ProductGroup.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FicheGroupeProduit"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "2",
                        "FicheNomComplet": "10 - Ordinateur",
                        "CodeGroupe": "10",
                        "DescGroupe": "Ordinateur",
                        "NoCompteGL_Vente": "45100",
                        "NoCompteGL_Achat": "55100",
                        "ExceptionDeTaxesActives": false,
                        "ExceptionDeTaxes": null,
                        "EstActif": true,
                        "Fiche_DerniereModification": "2025-08-07T11:52:53",
                        "DefaultTaxCategoryId": null,
                        "DefaultTaxCategoryCode": null,
                        "ParentCategoryId": null,
                        "ParentCategoryCode": null
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/ProductGroup/{id}": {
      "get": {
        "tags": [
          "5 - Inventaire",
          "5.2 - Product Group"
        ],
        "x-apidog-folder": "5 - Inventaire/5.2 - Product Group",
        "operationId": "getProductGroup",
        "summary": "ProductGroup — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la ProductGroup demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheGroupeProduit"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la ProductGroup (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/ProductTrail": {
      "get": {
        "tags": [
          "5 - Inventaire",
          "5.3 - Product Trail"
        ],
        "x-apidog-folder": "5 - Inventaire/5.3 - Product Trail",
        "operationId": "listProductTrail",
        "summary": "ProductTrail — lister",
        "description": "**Lecture disponible pour** : Acomba.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/ProductTrail?$filter=dateMouvement ge '2010-01-01' and dateMouvement le '2024-02-01'\n```\n\n**Limitations connues**\n\n- Acomba : Lecture via le chemin ParamExtract (MouvementInventaire).",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `eq`, `gt`, `gte`, `lt`, `lte`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "dateMouvement ge '2010-01-01' and dateMouvement le '2024-02-01'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de ProductTrail.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MouvementInventaire"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "TypeMouvementInventaire": 3,
                        "Fiche_DerniereModification": "2024-05-14T22:14:25",
                        "NoMouvementInventaire": "316",
                        "NoMouvementInventaire_NoUniqueSystemeSource": "316",
                        "NoProduit": "PROD-001",
                        "NoProduit_NoUniqueSystemeSource": "6",
                        "DateMouvement": "2022-06-06T00:00:00",
                        "NoProduitFournisseur": "#NA",
                        "NoProduitFournisseur_NoUniqueSystemeSource": "0",
                        "Quantitee": -1,
                        "PrixCoutant": 35,
                        "PrixVendant": 26.09,
                        "NoDocumentAssociee": "10038",
                        "NoDocumentAssociee_NoUniqueSystemeSource": "104",
                        "NoLigneDocumentAssociee": 0,
                        "UsagerNo": "Supervisor",
                        "UsagerNoUniqueSystemeSource": "1",
                        "UsagerNoInterne": "1",
                        "IsAProductItem": false,
                        "ItemProduit_no": "#NA",
                        "ItemProduit_NoUniqueSystemeSource": "0"
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "5 - Inventaire",
          "5.3 - Product Trail"
        ],
        "x-apidog-folder": "5 - Inventaire/5.3 - Product Trail",
        "operationId": "createProductTrail",
        "summary": "ProductTrail — créer",
        "description": "- **Produits segmentés (Items de produit)** : Pour les produits segmentés avec des caractéristiques (couleur, taille, etc.), utilisez les champs IsAProductItem, Caracteristique01_ValeurNo, Caracteristique02_ValeurNo, et Caracteristique03_ValeurNo pour cibler l'item de produit spécifique.\n- **Traitement en lot** : Lors d'un traitement en lot (array de mouvements), chaque mouvement est traité indépendamment. Si un mouvement échoue, les autres peuvent tout de même réussir. La réponse inclura le statut de chaque mouvement.\n\n**Création disponible pour** : Acomba.",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/MouvementInventaire"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/MouvementInventaire"
                    }
                  }
                ]
              },
              "examples": {
                "post-request-item": {
                  "summary": "post request item",
                  "value": {
                    "NoProduit": "TSHIRT-001",
                    "IsAProductItem": true,
                    "Caracteristique01_ValeurNo": "BLEU",
                    "Caracteristique02_ValeurNo": "XL",
                    "Quantitee": 25,
                    "PrixCoutant": 12.99,
                    "Commentaire": "Réception T-Shirt Bleu XL"
                  }
                },
                "post-request-multi-partial-error": {
                  "summary": "post request multi partial error",
                  "value": [
                    {
                      "NoProduit": "PROD-001",
                      "Quantitee": -1,
                      "PrixCoutant": 10,
                      "PrixVendant": 12,
                      "Commentaire": "Test mouvement inventaire"
                    },
                    {
                      "NoProduit": "PROD-INEXISTANT",
                      "Quantitee": 1,
                      "PrixCoutant": 10,
                      "Commentaire": "Ce produit n'existe pas"
                    }
                  ]
                },
                "post-request-multi": {
                  "summary": "post request multi",
                  "value": [
                    {
                      "NoProduit": "PROD-001",
                      "Quantitee": 10,
                      "PrixCoutant": 25.50,
                      "Commentaire": "Entrée d'inventaire"
                    },
                    {
                      "NoProduit": "PROD-002",
                      "Quantitee": -5,
                      "PrixCoutant": 15.00,
                      "Commentaire": "Sortie pour perte/bris"
                    },
                    {
                      "NoProduit": "PROD-003",
                      "Quantitee": 100,
                      "DateMouvement": "2024-04-24",
                      "Commentaire": "Ajustement suite à inventaire physique"
                    }
                  ]
                },
                "post-request-single": {
                  "summary": "post request single",
                  "value": {
                    "NoProduit": "PROD-001",
                    "Quantitee": 10,
                    "PrixCoutant": 25.50,
                    "DateMouvement": "2024-04-24",
                    "Commentaire": "Réception de marchandise - Bon de livraison #12345"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/MouvementInventaire"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MouvementInventaire"
                      }
                    }
                  ]
                },
                "examples": {
                  "post-response-multi-partial-error": {
                    "summary": "post response multi partial error",
                    "value": [
                      {
                        "BusinessKey": "MouvInv:1/2 - NoProduit:PROD-001",
                        "ErpInternalId": "MouvInv:1/2 - NoProduit:PROD-001",
                        "ErrorMessage": "",
                        "Success": true
                      },
                      {
                        "BusinessKey": "MouvInv:2/2 - NoProduit:PROD-INEXISTANT",
                        "ErpInternalId": "MouvInv:2/2 - NoProduit:PROD-INEXISTANT",
                        "ErrorMessage": "Erreur lors de l'action [Recherche du produit 'PROD-INEXISTANT']. (Code10) - L'enregistrement demandé n'existe pas dans Acomba.",
                        "Success": false
                      }
                    ]
                  },
                  "post-response": {
                    "summary": "post response",
                    "value": {
                      "Success": true,
                      "ErrorMessage": "",
                      "BusinessKey": "PROD-001",
                      "ErpInternalId": "PROD-001"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/ProductTrail/{id}": {
      "get": {
        "tags": [
          "5 - Inventaire",
          "5.3 - Product Trail"
        ],
        "x-apidog-folder": "5 - Inventaire/5.3 - Product Trail",
        "operationId": "getProductTrail",
        "summary": "ProductTrail — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la ProductTrail demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MouvementInventaire"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la ProductTrail (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Employee": {
      "get": {
        "tags": [
          "6 - Ressources humaines",
          "6.1 - Employee"
        ],
        "x-apidog-folder": "6 - Ressources humaines/6.1 - Employee",
        "operationId": "listEmployee",
        "summary": "Employee — lister",
        "description": "- **Note pour composer une requête** : Pour plus de détails, veuillez consulter cet article : Composer une requête à l'API d'ERP Connector\n- **Limitation Servicentre** : L'intégration Servicentre pour l'entité Employee est limitée. Seules les informations de base sont disponibles.\n\n**Lecture disponible pour** : Avantage.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/Employee\n```\n\n**Limitations connues**\n\n- Avantage : Extraction SDK/TCP (ExtractEmployes)\n- Avantage : Mapping minimal (~9 champs sur ~150 dans EMPLOY.DBF)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Employee.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Employe"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Employee/{id}": {
      "get": {
        "tags": [
          "6 - Ressources humaines",
          "6.1 - Employee"
        ],
        "x-apidog-folder": "6 - Ressources humaines/6.1 - Employee",
        "operationId": "getEmployee",
        "summary": "Employee — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Employee demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Employe"
                },
                "examples": {
                  "get-response-servicentre": {
                    "summary": "get response servicentre",
                    "value": {
                      "EmployeeId": "1",
                      "EmployeeNumber": "1",
                      "EmployeeFirstName": "JOHN",
                      "EmployeeLastName": "DOE"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Employee (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Payroll": {
      "get": {
        "tags": [
          "6 - Ressources humaines",
          "6.2 - Payroll"
        ],
        "x-apidog-folder": "6 - Ressources humaines/6.2 - Payroll",
        "operationId": "listPayroll",
        "summary": "Payroll — lister",
        "description": "- **Note pour composer une requête** : Pour plus de détails, veuillez consulter cet article : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Avantage.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/Payroll?$filter=date_Emission ge '2024-01-01' and date_Emission le '2024-12-31'\n```\n\n**Limitations connues**\n\n- Avantage : Extraction ODBC (ExtractionEntetePaie)\n- Avantage : Filtres WHERE SQL sur champs mappés (l'overload (dateDebut,dateFin) ne fait que pré-remplir un filtre de plage sur WDEB/WFIN)\n- Avantage : Lignes de salaire reconstruites depuis des colonnes d'heures/montants",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "date_Emission ge '2024-01-01' and date_Emission le '2024-12-31'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Payroll.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/EntetePaie"
                  }
                },
                "examples": {
                  "get-response-avantage": {
                    "summary": "get response avantage",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "1542",
                        "int_NoPeriode": 3,
                        "date_DebutPeriodPaie": "2024-02-01T00:00:00",
                        "date_FinPeriodPaie": "2024-02-15T00:00:00",
                        "date_Emission": "2024-02-20T00:00:00",
                        "MontantBrut": 3200.00,
                        "MontantNet": 2340.75,
                        "EmployePaie": {
                          "NoUniqueSystemeSource": "0025",
                          "NoEmploye": "0025",
                          "NomEmploye": "GAGNON",
                          "PrenomEmploye": "JULIE",
                          "NomCompletEmploye": "JULIE GAGNON",
                          "NoAssuranceSocial": "***-***-***",
                          "EmailEmploye": "j.gagnon@exemple.com",
                          "Departement": "Comptabilité"
                        },
                        "ListeLignePaie": [
                          {
                            "NoRubrique": "100",
                            "NomRubrique": "Salaire de base",
                            "TypeLignePAie": 100,
                            "QteOuPourcent": 80.00,
                            "MontantUnitaire": 40.00,
                            "Valeur": 3200.00
                          },
                          {
                            "NoRubrique": "400",
                            "NomRubrique": "RQAP Employeur",
                            "TypeLignePAie": 400,
                            "Valeur": 24.32
                          },
                          {
                            "NoRubrique": "910",
                            "NomRubrique": "Impôt fédéral",
                            "TypeLignePAie": 900,
                            "Valeur": -425.00
                          },
                          {
                            "NoRubrique": "920",
                            "NomRubrique": "Impôt provincial",
                            "TypeLignePAie": 900,
                            "Valeur": -389.25,
                            "ImposableImpotProvincial": true
                          }
                        ],
                        "ListeTransactionBanqueRH": []
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Payroll/{id}": {
      "get": {
        "tags": [
          "6 - Ressources humaines",
          "6.2 - Payroll"
        ],
        "x-apidog-folder": "6 - Ressources humaines/6.2 - Payroll",
        "operationId": "getPayroll",
        "summary": "Payroll — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Payroll demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EntetePaie"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Payroll (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Timesheet": {
      "get": {
        "tags": [
          "6 - Ressources humaines",
          "6.3 - Timesheet"
        ],
        "x-apidog-folder": "6 - Ressources humaines/6.3 - Timesheet",
        "operationId": "listTimesheet",
        "summary": "Timesheet — lister",
        "description": "**Lecture disponible pour** : Avantage.\n\n**Limitations connues**\n\n- Avantage : Extraction ODBC (ExtractionTimeSheet) : chaque en-tête agrège plusieurs lignes\n- Avantage : Filtres WHERE SQL sur champs mappés",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Timesheet.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/TimesheetHeader"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      },
      "post": {
        "tags": [
          "6 - Ressources humaines",
          "6.3 - Timesheet"
        ],
        "x-apidog-folder": "6 - Ressources humaines/6.3 - Timesheet",
        "operationId": "createTimesheet",
        "summary": "Timesheet — créer",
        "description": "**Création disponible pour** : Avantage.\n\n**Limitations connues**\n\n- Avantage : AvantageSDK_TimeSheet.CreateTimeSheet (SDK, commande W08 par ligne)\n- Avantage : Requis : EmployeeNumber (<= 4 car.), PeriodEndDate, >= 1 ligne\n- Avantage : Résultat agrégé (Success=false si une ligne échoue) ; mapping d'écriture des lignes non entièrement audité\n- Avantage : Bonis re-packés en champs fixes (SPRIM, SPRIPRC…)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimesheetHeader"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Entité créée ou mise à jour.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetHeader"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Timesheet/{id}": {
      "get": {
        "tags": [
          "6 - Ressources humaines",
          "6.3 - Timesheet"
        ],
        "x-apidog-folder": "6 - Ressources humaines/6.3 - Timesheet",
        "operationId": "getTimesheet",
        "summary": "Timesheet — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Timesheet demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimesheetHeader"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Timesheet (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Activity": {
      "get": {
        "tags": [
          "8 - Divers",
          "8.1 - Activity"
        ],
        "x-apidog-folder": "8 - Divers/8.1 - Activity",
        "operationId": "listActivity",
        "summary": "Activity — lister",
        "description": "- **Note importante** : Pour plus de détails sur la composition des requêtes, consultez : Composer une requête à l'API d'ERP Connector\n\n**Lecture disponible pour** : Avantage.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/Activity?$expand=RepartitionParProjet&$filter=RepartitionParProjet.DateTransaction ge '2024-01-01'\nGET /Entity/Activity?$expand=RepartitionParProjet\nGET /Entity/Activity\n```\n\n**Limitations connues**\n\n- Avantage : Extraction ODBC (ExtractionActivites)\n- Avantage : Répartition par projet (TRANS.DBF) via Expand RepartitionParProjet — jointure mémoire sur ANUM/TANUM\n- Avantage : Mapping minimal (ACTIVE.DBF : AINT/AMNTCF/AMNTBO non mappés)",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            },
            "example": "RepartitionParProjet.DateTransaction ge '2024-01-01'"
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `RepartitionParProjet` (Avantage).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "RepartitionParProjet"
                ]
              }
            },
            "style": "form",
            "explode": false,
            "example": [
              "RepartitionParProjet"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Activity.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FicheActivite"
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Activity/{id}": {
      "get": {
        "tags": [
          "8 - Divers",
          "8.1 - Activity"
        ],
        "x-apidog-folder": "8 - Divers/8.1 - Activity",
        "operationId": "getActivity",
        "summary": "Activity — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Activity demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheActivite"
                },
                "examples": {
                  "get-response-expand": {
                    "summary": "get response expand",
                    "value": {
                      "NoUniqueSystemeSource": "02820",
                      "NoActivite": "02820",
                      "DescriptionFR": "Clôtures et barrières",
                      "DescriptionEN": null,
                      "NoFournisseur": null,
                      "NoCompteGL": "41100",
                      "ExtendedProperties": {
                        "RepartitionParProjet": [
                          {
                            "NoUniqueSystemeSource": "P000022",
                            "NoActivite": "02820",
                            "NoCompteGL": "33510",
                            "DateTransaction": "2015-02-25T00:00:00",
                            "MontantReparti": 1717.5,
                            "NoProjet": "0000000110"
                          }
                        ]
                      }
                    }
                  },
                  "get-response": {
                    "summary": "get response",
                    "value": {
                      "NoUniqueSystemeSource": "02820",
                      "NoActivite": "02820",
                      "DescriptionFR": "Clôtures et barrières",
                      "DescriptionEN": null,
                      "NoFournisseur": null,
                      "NoCompteGL": "41100",
                      "ExtendedProperties": {
                        "RepartitionParProjet": [
                          {
                            "NoUniqueSystemeSource": "P000022",
                            "NoActivite": "02820",
                            "NoCompteGL": "33510",
                            "DateTransaction": "2015-02-25T00:00:00",
                            "MontantReparti": 1717.5,
                            "NoProjet": "0000000110"
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Activity (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    },
    "/Entity/Project": {
      "get": {
        "tags": [
          "8 - Divers",
          "8.2 - Project"
        ],
        "x-apidog-folder": "8 - Divers/8.2 - Project",
        "operationId": "listProject",
        "summary": "Project — lister",
        "description": "**Lecture disponible pour** : Acomba, Avantage, Sage50.\n\n**Exemples d'appels**\n\n```http\nGET /Entity/Project\n```\n\n**Limitations connues**\n\n- Acomba : QuerySettings ignore: aucun filtre/Top/Skip/Expand honore par ExtractProjects (lecture brute du fichier complet)\n- Acomba : Lecture ODBC dBase directe sur FTPROJET.DBF (necessite Acomba Construction)\n- Avantage : Extraction SDK/TCP (ExtactProjets)\n- Avantage : Mapping limité (~11 champs cœur)\n- Sage50 : Lecture SQL table tProject (clé lId)\n- Sage50 : Champs financiers via Expand='ExtendedProperties'",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules. Les sous-champs sont supportés (`InfoAgeDesComptes.MontantDu_Cycle1_Courant`).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$filter",
            "in": "query",
            "required": false,
            "description": "Restreindre les résultats : `Champ opérateur 'valeur'`. Textes et dates entre apostrophes (dates `yyyy-MM-dd`), décimales avec un point. Opérateurs rencontrés sur cette entité : `contains`, `eq`, `gt`, `gte`, `in`, `lt`, `lte`, `ne`. Le détail par champ est indiqué sur chaque propriété du schéma.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$orderby",
            "in": "query",
            "required": false,
            "description": "Trier les résultats : `NomDuChamp ASC` (défaut) ou `DESC`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "$top",
            "in": "query",
            "required": false,
            "description": "Nombre maximal d'éléments retournés (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$skip",
            "in": "query",
            "required": false,
            "description": "Nombre d'éléments à sauter (voir la pagination).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "$expand",
            "in": "query",
            "required": false,
            "description": "Inclure un ou plusieurs sous-objets, séparés par des virgules. Valeurs connues : `ExtendedProperties` (Sage50).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "ExtendedProperties"
                ]
              }
            },
            "style": "form",
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "Liste de Project.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FicheProjet"
                  }
                },
                "examples": {
                  "get-response": {
                    "summary": "get response",
                    "value": [
                      {
                        "NoUniqueSystemeSource": "0000000001",
                        "NoProjet": "0000000001",
                        "NomProjet": "Agrandissement Centre administratif",
                        "EmployeResponsable_No": "0001",
                        "EmployeResponsable_NoUniqueSystemeSource": null,
                        "Client_No": "",
                        "Client_NoUniqueSystemeSource": null,
                        "ClientFacturerA_No": null,
                        "ClientFacturerA_NoUniqueSystemeSource": null,
                        "ProjetInitial_No": null,
                        "ProjetInitial_NoUniqueSystemeSource": null,
                        "EstActif": true,
                        "Adresse": "1234, rue Principale",
                        "Ville": "Québec",
                        "Province": "QC",
                        "TypeProjet1": null,
                        "CompteClientMontantVenteADate": 0.0,
                        "CompteClientMontantAchatADate": 0.0,
                        "CompteClientRetenueTotaleADate": 0.0,
                        "CompteClientRetetueARecevoirADate": 0.0,
                        "CompteFournisseurMontantAchatADate": 0.0,
                        "CompteFournisseurSoldeAPayerADate": 0.0,
                        "CompteFournisseurRetenueTotaleADate": 0.0,
                        "CompteFournisseurRetetueAPayerADate": 0.0,
                        "DateDebutProjet": null,
                        "DateFinProjet": null,
                        "Fiche_DerniereModification": null
                      }
                    ]
                  }
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          }
        }
      }
    },
    "/Entity/Project/{id}": {
      "get": {
        "tags": [
          "8 - Divers",
          "8.2 - Project"
        ],
        "x-apidog-folder": "8 - Divers/8.2 - Project",
        "operationId": "getProject",
        "summary": "Project — lire par identifiant",
        "parameters": [
          {
            "$ref": "#/components/parameters/CompanyCode"
          },
          {
            "name": "$select",
            "in": "query",
            "required": false,
            "description": "Limiter les champs retournés, séparés par des virgules.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Le/la Project demandé(e).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FicheProjet"
                }
              }
            }
          },
          "401": {
            "description": "401 — code licence ou clé secrète invalide ou expirée."
          },
          "404": {
            "description": "404 — aucune entité ne porte cet identifiant."
          }
        }
      },
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Identifiant d'affaires du/de la Project (ex. `NoClient` pour Customer).",
          "schema": {
            "type": "string"
          }
        }
      ]
    }
  },
  "components": {
    "securitySchemes": {
      "licenceBasicAuth": {
        "type": "http",
        "scheme": "basic",
        "description": "Nom d'utilisateur = Code Licence · Mot de passe = Clé API secrète. Une licence inexistante, expirée ou non démarrée est refusée (401)."
      }
    },
    "parameters": {
      "CompanyCode": {
        "name": "CompanyCode",
        "in": "header",
        "required": false,
        "description": "Compagnie visée lorsque la licence en couvre plusieurs. Par défaut : `0`.",
        "schema": {
          "type": "string"
        },
        "example": "0"
      }
    },
    "schemas": {
      "FicheEntreprise": {
        "type": "object",
        "description": "Récupérez les informations de l'entreprise connectée à travers différents systèmes ERP avec une API REST unifiée. L'entité CompanyInfo permet d'extraire les coordonnées, les paramètres comptables et les informations générales de la société configurée dans votre système ERP.\n\nL'entité CompanyInfo représente les informations de l'entreprise (société) connectée dans votre système ERP. Cette entité est en lecture seule et permet d'extraire les coordonnées de l'entreprise, les paramètres comptables (périodes, budgets) et d'autres informations générales de configuration.\n\nL'API utilise un endpoint REST standard avec la méthode HTTP appropriée :\n\n- GET /Entity/CompanyInfo - Récupérer les informations de l'entreprise connectée\n\n- **Note importante** : L'entité CompanyInfo est en lecture seule (GET uniquement). Elle retourne les informations de la société configurée dans l'ERP, incluant les coordonnées, les paramètres GL et les informations de contact.\n\n- **Différences entre ERP** : Certaines propriétés sont spécifiques à certains ERP :",
        "properties": {
          "NomEntreprise": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de l'entreprise tel que configuré dans l'ERP Acomba : AcoSDK.CompanyInformation.CIName."
          },
          "Addresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse complète de l'entreprise (lignes 1 et 2 combinées si applicable) Acomba : AcoSDK.CompanyInformation.CIAddress. Sage50 : Concaténation conditionnelle (', ' si les deux lignes présentes)."
          },
          "Ville": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ville de l'entreprise Acomba : AcoSDK.CompanyInformation.CICity."
          },
          "Province": {
            "type": [
              "string",
              "null"
            ],
            "description": "Province ou état de l'entreprise (code à 2 caractères) Acomba : AcoSDK.CompanyInformation.CIProvince."
          },
          "Pays": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pays de l'entreprise Acomba : AcoSDK.CompanyInformation.CICountry."
          },
          "CodePostal": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code postal de l'entreprise Acomba : AcoSDK.CompanyInformation.CIPostalCode."
          },
          "NoTelephone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de téléphone principal de l'entreprise Acomba : Acces indexe CIPhoneNumber[AcoSDK.PhoneType.Ph_Number]."
          },
          "NoTelephone2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de téléphone secondaire (télécopieur dans certains ERP) Acomba : Telecopieur. CIPhoneNumber[AcoSDK.PhoneType.Ph_Fax]."
          },
          "PersonneContact": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la personne contact principale (Acomba uniquement) Acomba : AcoSDK.CompanyInformation.CICareOf (a/s). Ajoute en v1.4.7.4."
          },
          "EmailPrincipal": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel principale de l'entreprise Acomba : Acces indexe CIEMail[AcoSDK.EMailType.EMail_One]. Ajoute en v1.4.7.4."
          },
          "SiteWebMain": {
            "type": [
              "string",
              "null"
            ],
            "description": "Site web de l'entreprise Acomba : AcoSDK.CompanyInformation.CIWWW. Ajoute en v1.4.7.4."
          },
          "GL_PeriodeComptableCourante": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de la période comptable courante (1 à 13). Retourne -1 si non disponible. Acomba : Lu sur AcoSDK.ControlGL.CGCurrentPeriod (apres GetCard(1)). Ajoute en v1.0.1.0."
          },
          "GL_NbPeriodeComptable": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Nombre total de périodes comptables dans l'année fiscale (généralement 12 ou 13) Acomba : AcoSDK.ControlGL.CGNumberOfPeriods."
          },
          "GL_NomColonneBudgetGL1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la première colonne de budget (Acomba/Avantage) Acomba : Acces indexe AcoSDK.ControlGL.CGBudgetTitles[1]."
          },
          "GL_NomColonneBudgetGL2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la deuxième colonne de budget (Acomba/Avantage) Acomba : Acces indexe AcoSDK.ControlGL.CGBudgetTitles[2]."
          },
          "GL_NomColonneBudgetGL3": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la troisième colonne de budget (Acomba/Avantage) Acomba : Acces indexe AcoSDK.ControlGL.CGBudgetTitles[3]."
          },
          "ARDefaultPaymentMode": {
            "type": [
              "string",
              "null"
            ],
            "description": "Mode de paiement par défaut pour les comptes à recevoir (Acomba uniquement) Acomba : Lu sur AcoSDK.ControlCustomer.CCDefaultPaymentMode (cast int -> string), pas sur CompanyInformation."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la dernière modification des informations de l'entreprise Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          }
        },
        "additionalProperties": true
      },
      "ComptesGL": {
        "type": "object",
        "description": "Accédez aux comptes du Grand Livre (GL) à travers différents systèmes ERP avec une API REST unifiée. Extrayez les informations des comptes comptables incluant les soldes par période pour Acomba, Avantage et Sage 50.\n\nL'entité GLAccount représente un compte du Grand Livre dans votre système ERP. Cette API permet d'effectuer des opérations de lecture (GET) sur les comptes comptables de manière standardisée, peu importe le système ERP sous-jacent.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/GLAccount - Récupérer une liste de comptes GL\n\n- GET /Entity/GLAccount/{NoCompteGL} - Récupérer un compte GL spécifique\n\n- **Expansion des soldes** : Les soldes par période (année courante, année précédente, budgets) sont disponibles via le paramètre $expand. Sans expansion, seules les informations de base du compte sont retournées.\n\n- **Filtres supportés (Acomba)** : Pour Acomba, seuls les filtres suivants sont actuellement supportés : • NoCompteGL eq 'valeur' - Recherche par numéro de compte exact • NoCompteGL in ('val1','val2') - Recherche par liste de numéros de comptes • ValeurAuCompte ne 0 - Exclure les comptes avec solde à zéro",
        "properties": {
          "NoCompteGL": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du compte GL (clé d'affaires) Filtrable (contains, eq, in, ne) — Acomba, Avantage. Acomba : Cle. Filtrable Equals/InList (declares dans AllowedFilters). Doit etre un entier. Avantage : N° de compte (5 car.), clé. Toujours inclus au SELECT. Sage50 : Formaté à la longueur BD ; suffixé '- {DepartementCode}' si département."
          },
          "NomCompteGL": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom descriptif du compte Filtrable (contains, eq, in, ne) — Avantage. Acomba : Si null a l'extraction -> 'Compte sans nom = #<NoCompteGL>'. Avantage : Description française du compte (LNOM ; LNOMA anglais non mappé). Sage50 : Suffixé '- {DepartementDesc}' si département."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique interne du système ERP Filtrable (contains, eq, in, ne) — Avantage. Acomba : CardPos Acomba (position interne). Avantage : Même colonne que NoCompteGL (LNUM). Sage50 : Suffixé '- {DepartementId}' si compte ventilé par département."
          },
          "TypeDeCompte": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Type de compte (voir tableau ci-dessous) Énumération : la valeur est un texte ou un entier selon l'ERP. Acomba : AcoSDK.CharterCategory converti en ComptesGL_TypeCompte (Actif/Passif/Revenu/Depense/Quantite/Banque/Capitaux/Multiple/Inconnu). Sage50 : 1=Actif, 2=Passif, 3=Capitaux, 4=Revenu, 5=Dépense (résolu via plages tActRang)."
          },
          "ActifPassif": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Classification Actif/Passif du compte Énumération : la valeur est un texte ou un entier selon l'ERP. Sage50 : Dérivé de nAcctClass (1,3,4=Actif ; 2,5=Passif)."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification de la fiche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Acomba : Horodatage systeme Acomba."
          },
          "AnneeCourante": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/GLPeriodValue"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Soldes par période pour l'année courante (requiert $expand) Acomba : Liste de GLPeriodValue (periodes 0..13) issue de ChBalances[i]. Null sauf si Expand AnneeCourante. Valeurs a 0 exclues sauf IncludeEmptyBalance. Avantage : Montants cette année (13 périodes + total), composite → liste GLPeriodValue. Sage50 : Peuplé seulement si Expand='AnneeCourante' : soldes budgétaires par période dans ExtendedProperties."
          },
          "AnneePrécédente": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/GLPeriodValue"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Soldes par période pour l'année précédente (requiert $expand) Acomba : Force a null en fin d'extraction (ConvertirCharterACompteGL ligne 1565) : 'Vieille valeur inutile'. Avantage : ATTENTION : alimenté depuis L2PERn (colonnes PRÉVISIONNEL) — comportement historique conservé, le code fait foi. Sage50 : STUB : Expand='AnneePrecedente' non implémenté (aucune requête SQL dans le code)."
          },
          "Budget01": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/GLPeriodValue"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Valeurs budgétaires scénario 1 (requiert $expand) Acomba : GLPeriodValue 0..13 issue de ChBudgets[1,i]. Null sauf si Expand Budget01. Avantage : ATTENTION : alimenté depuis L3PERn (colonnes ANNÉE PRÉCÉDENTE) — comportement historique conservé, le code fait foi."
          },
          "Budget02": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/GLPeriodValue"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Valeurs budgétaires scénario 2 (requiert $expand) Acomba : GLPeriodValue 0..13 issue de ChBudgets[2,i]. Null sauf si Expand Budget02."
          },
          "Budget03": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/GLPeriodValue"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Valeurs budgétaires scénario 3 (requiert $expand) Acomba : GLPeriodValue 0..13 issue de ChBudgets[3,i]. Null sauf si Expand Budget03."
          }
        },
        "additionalProperties": true
      },
      "GLPeriodValue": {
        "type": "object",
        "properties": {
          "NoPeriode": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de la période comptable (1-12 pour mensuel, 1-4 pour trimestriel, etc.)"
          },
          "ValeurAuCompte": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Solde ou montant pour cette période"
          }
        },
        "additionalProperties": true
      },
      "EcritureComptable_Entete": {
        "type": "object",
        "description": "Gérez les écritures comptables du Grand Livre à travers différents systèmes ERP avec une API REST unifiée. Créez et lisez les écritures GL pour Acomba, Avantage, Sage 50 et autres systèmes ERP.\n\nL'entité GLJournalEntry (Écriture comptable GL) représente une écriture au Grand Livre dans votre système ERP. Cette API permet d'effectuer des opérations de lecture (GET) et de création (POST) sur les écritures comptables de manière standardisée, peu importe le système ERP sous-jacent.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/GLJournalEntry - Récupérer une liste d'écritures comptables\n\n- GET /Entity/GLJournalEntry/{id} - Récupérer une écriture comptable spécifique\n\n- POST /Entity/GLJournalEntry - Créer une nouvelle écriture comptable\n\n- **Note importante** : Les champs disponibles et requis varient selon le système ERP. Les écritures comptables incluent généralement un en-tête avec les informations de date et de description, ainsi que des lignes de détail avec les comptes GL, montants et directions (débit/crédit).\n\n- **ExtendedProperties** : L'objet ÉcritureComptable_Entete supporte un dictionnaire ExtendedProperties pour des propriétés personnalisées ou spécifiques à un ERP.",
        "properties": {
          "ComptesGL.NoCompteGL": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du compte GL Requis."
          },
          "Direction_DebitCredit": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Direction de l'écriture: \"Debit\" ou \"Credit\" Énumération : la valeur est un texte ou un entier selon l'ERP."
          },
          "Montant_Écriture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant de la ligne"
          },
          "DescriptionLignes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de la ligne"
          },
          "Projet_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de projet associé"
          },
          "NoEcritureComptable": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'écriture comptable Acomba : EXTRACT : lu depuis JournalX.JoTransactionNumber. En CREATE renseigné en sortie après AddCard (TransGL.JoTransactionNumber)."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique de la ligne dans le système source Filtrable (contains, eq, in, ne) — Avantage, Sage50. Acomba : CardPos Acomba (surrogate key). EXTRACT lit JournalX.CardPos. En CREATE renseigné en sortie après AddCard (TransGL.CardPos). Avantage : N° d'écriture séquentiel (6 car.)."
          },
          "DateEcriture": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de l'écriture comptable Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. À la création — Acomba : requis, Avantage : optionnel, Sage50 : requis. Création : Acomba, Avantage, Sage50. Filtrable (eq, gt, gte, lt, lte, ne) — Acomba, Avantage, Sage50. Acomba : Seul champ filtrable (range). gt/gte -> DateDebut, lt/lte -> DateFin (ExtractManager case GLJournalEntry/GLJournalEntryLine). CREATE pousse TransGL.JoDate. Avantage : Requise à la création. Sage50 : Requise à la création (non défaut)."
          },
          "DescriptionÉcriture": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description générale de l'écriture Création : Acomba, Avantage, Sage50. Acomba : EXTRACT lit JournalX.JoDescription ; CREATE pousse TransGL.JoDescription. Avantage : Description sur 4 × 40 car. ; la création tronque au-delà de 160 car."
          },
          "PériodeGLÉcriture": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de période comptable Création : Acomba. Acomba : EXTRACT lit JournalX.JoPeriod ; CREATE pousse TransGL.JoPeriod (période fermée/invalide -> erreur Acomba 1997 JOPERIOD)."
          },
          "NoLot_Ecriture": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de lot Acomba : Utilisé uniquement par ÉcritureComptables_Lot_Écrire (Batch/TransBatch), méthode NON câblée au dispatch GLJournalEntry. Ignoré par la création câblée ÉcritureComptables_Écrire."
          },
          "Montant_Ecriture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total de l'écriture Acomba : EXTRACT lit JournalX.JoAmount. CREATE force TransGL.JoAmount = 0 (total non piloté par ce champ d'entête)."
          },
          "NoDocumentSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du document source (facture, chèque, etc.) Création : Sage50. Filtrable (contains, eq, ne) — Sage50. Acomba : Présent sur le DTO mais ni poussé au CREATE ni peuplé à l'EXTRACT côté Acomba. Sage50 : Requis à la création."
          },
          "PartiePrenanteNo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la partie prenante (client, fournisseur) Acomba : Présent sur le DTO mais non géré côté Acomba (ni CREATE ni EXTRACT)."
          },
          "PartiePrenanteNoUniqueSystemSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID unique de la partie prenante dans le système source Filtrable (eq, in, ne) — Sage50. Acomba : Présent sur le DTO mais non géré côté Acomba (ni CREATE ni EXTRACT)."
          },
          "LignesÉcriture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/EcritureComptable_Detail"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de détail de l'écriture À la création — Acomba : requis, Avantage : requis, Sage50 : requis. Création : Avantage, Sage50. Avantage : Collection des lignes de l'ecriture. Au moins deux lignes sont exigees au CREATE (l'ecriture doit etre balancee). Objet agrege : ses membres sont decrits par les entrees LignesEcriture[].* ci-dessous. Sage50 : Collection de lignes. Requise à la création (>= 2, équilibrée débits=crédits)."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification de la ligne Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, lt, lte, ne) — Sage50. Acomba : Horodatage système, lu depuis JournalX.JoTimeModified. Non filtrable (le code ne traite la dernière modif que pour FicheClient). Sage50 : Colonne scalaire dtASDate → filtrable (contrairement à Supplier/Project où elle est composite)."
          },
          "ExtendedProperties": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Propriétés étendues spécifiques à l'ERP Acomba : EXTRACT seulement : peuplé avec AcoJoFlags/AcoJoFlagsDecoded/AcoJoCurSess/AcoJoStat/AcoJoUnique (drapeaux et statuts JournalX). Non lu au CREATE."
          },
          "ComptesGL": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ComptesGL"
              },
              {
                "type": "null"
              }
            ],
            "description": "Objet contenant les informations du compte GL"
          },
          "Projet_NoUniqueSystemesource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID unique du projet dans le système source"
          }
        },
        "additionalProperties": true
      },
      "GLProject": {
        "type": "object",
        "description": "Gérez les projets de grand livre (General Ledger) à travers différents systèmes ERP avec une API REST unifiée. Créez et récupérez les projets GL, leurs segments hiérarchiques et leurs budgets pour Acomba et autres systèmes ERP supportant la gestion de projets comptables.\n\nL'entité GLProject représente un projet de grand livre dans votre système ERP. Dans Acomba, les projets GL permettent une gestion comptable multi-dimensionnelle avec jusqu'à 3 niveaux de segmentation et 3 budgets indépendants par projet. Cette API permet de créer et d'extraire les projets, leurs segments et leurs données budgétaires de manière standardisée.\n\n- Projet (TypeProjet = \"Projet\") : Projet principal avec 3 segments optionnels\n\n- Segment1, Segment2, Segment3 : Niveaux de segmentation hiérarchique pour organiser les projets\n\n- 3 Budgets indépendants : Chaque projet peut avoir jusqu'à 3 budgets avec 14 périodes (0-13)\n\n- GET /Entity/GLProject - Récupérer les projets GL avec filtrage et expansion optionnelle des budgets\n\n- POST /Entity/GLProject - Créer un nouveau projet GL\n\n- **Note importante** : Les budgets peuvent être obtenus via le paramètre $expand pour obtenir les données détaillées des 3 budgets et de leurs 14 périodes.\n\n- **Spécificités Acomba** : Périodes : Acomba utilise 14 périodes (0-13). La période 0 représente le solde d'ouverture du projet.Budgets null par défaut : Sans $expand, les budgets sont retournés à null pour optimiser les performances.Segments : Les segments de projets permettent une hiérarchie à 3 niveaux si la segmentation a été activée dans les options de la société Acomba",
        "properties": {
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique interne du système source (Id Acomba)"
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du projet ou du segment (clé primaire, max 15 caractères) Création : Acomba. Filtrable (eq) — Acomba."
          },
          "NomProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du projet ou du segment (max 90 caractères)"
          },
          "TypeProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type de projet : \"Projet\", \"Segment1\", \"Segment2\", \"Segment3\" ou \"Inconnu\""
          },
          "NoUniqueSystemeSourceSegment1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Id du premier segment associé au projet"
          },
          "NoUniqueSystemeSourceSegment2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Id du deuxième segment associé au projet"
          },
          "NoUniqueSystemeSourceSegment3": {
            "type": [
              "string",
              "null"
            ],
            "description": "Id du troisième segment associé au projet"
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date et heure de la dernière modification de la fiche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (gt, gte, lt, lte) — Acomba."
          },
          "Budget01": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/GLPeriodValue"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Premier budget avec 14 périodes (requiert $expand)"
          },
          "Budget02": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/GLPeriodValue"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Deuxième budget avec 14 périodes (requiert $expand)"
          },
          "Budget03": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/GLPeriodValue"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Troisième budget avec 14 périodes (requiert $expand)"
          },
          "NoPeriode": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de la période (0-13, où 0 est le solde d'ouverture)"
          },
          "ValeurAuCompte": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant budgété pour cette période"
          }
        },
        "additionalProperties": true
      },
      "FinancialTransaction": {
        "type": "object",
        "description": "Gérez les transactions financières (dépôts bancaires) à travers différents systèmes ERP avec une API REST unifiée. Créez et lisez les dépôts pour QuickBooks Online et autres systèmes ERP supportés.\n\nL'entité FinancialTransaction représente une transaction financière (typiquement un dépôt bancaire) dans votre système ERP. Cette API permet d'effectuer des opérations de lecture (GET) et de création (POST) sur les transactions financières de manière standardisée, peu importe le système ERP sous-jacent.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/FinancialTransaction - Récupérer une liste de transactions financières\n\n- GET /Entity/FinancialTransaction/{id} - Récupérer une transaction financière spécifique\n\n- POST /Entity/FinancialTransaction - Créer une nouvelle transaction financière (dépôt)\n\n- **QuickBooks Online** : Dans QuickBooks Online, l'entité FinancialTransaction correspond à un Deposit (dépôt bancaire).\n\nModèle unifié : `FicheTransactions` (partagé avec d'autres entités de même nature).\n\n- **Correspondance QuickBooks** : L'entité FinancialTransaction mappe vers l'entité Deposit de QuickBooks Online. Les comptes GL sont recherchés par leur nom.",
        "properties": {
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique interne du système ERP (QuickBooks Id) Filtrable (eq, ne) — QuickBooksOnline. QuickBooksOnline : Id interne QBO du Deposit. Forcé à null à la création."
          },
          "NoFacture": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de référence du dépôt (DocNumber) Création : QuickBooksOnline. QuickBooksOnline : Écrit et relu (DocNumber). Non filtrable pour Deposit (le switch mappe Référence→DocNumber, pas NoFacture)."
          },
          "DateFacture": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la transaction Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : QuickBooksOnline. Filtrable (eq, gt, gte, lt, lte, ne) — QuickBooksOnline."
          },
          "CompteRecevable_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom du compte bancaire de destination Création : QuickBooksOnline. QuickBooksOnline : Compte bancaire de dépôt OBLIGATOIRE, résolu par Name."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "TypeDoc": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Type de document (FacturesFournisseurs pour les dépôts) Énumération : la valeur est un texte ou un entier selon l'ERP."
          },
          "NoteGlobaleExterne01": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note privée du dépôt (PrivateNote) Création : QuickBooksOnline."
          },
          "Devise": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code devise ISO 4217 (CAD, USD, etc.) Création : QuickBooksOnline. QuickBooksOnline : Écriture : défaut CAD (obligatoire si compagnie multi-devises). Lecture inopérante (condition inversée dans le code)."
          },
          "InfoClientFacturerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Informations du client/fournisseur associé (premier de la liste des lignes)"
          },
          "TermeDePaiement": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TermeDePaiement"
              },
              {
                "type": "null"
              }
            ],
            "description": "Méthode de paiement utilisée"
          },
          "LigneFacture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LigneTransactions"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de détail du dépôt"
          }
        },
        "additionalProperties": true
      },
      "LigneTransactions": {
        "type": "object",
        "properties": {
          "DescriptionLigne": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de la ligne"
          },
          "PrixFinal": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix unitaire"
          },
          "NoCompteGL": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de compte du Grand Livre"
          },
          "NoCompteGL_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant QuickBooks du compte GL"
          },
          "NoLigneFacture": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de séquence de la ligne"
          },
          "strNoProduit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du produit"
          },
          "QteFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité reçue/facturée"
          },
          "QteCommande": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité commandée"
          },
          "PrixOrig": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix unitaire original avant rabais"
          },
          "PrixCoutant": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix coûtant du produit"
          },
          "MontantRabais_pct": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Pourcentage de rabais appliqué"
          },
          "Montant_SousTotalLigne": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Sous-total de la ligne avant taxes"
          },
          "Montant_TotalLigne": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total de la ligne incluant les taxes"
          },
          "NoGroupeTaxe": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du groupe de taxes à appliquer"
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de projet associé à la ligne Création : Acomba. Modification : Acomba. Filtrable (contains, eq, ne) — Avantage. Acomba : Assigné par numéro si pas de CardPos."
          },
          "UniteMesure": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unité de mesure (unité, kg, m², etc.)"
          },
          "TypeLigne": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Type de ligne (produit, commentaire, sous-total, etc.) Énumération : la valeur est un texte ou un entier selon l'ERP."
          },
          "FicheProduit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheProduits"
              },
              {
                "type": "null"
              }
            ],
            "description": "Objet complet du produit associé"
          },
          "ListeDesTaxes": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InfoTaxe"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Détail des taxes calculées pour cette ligne"
          },
          "strNoGroupeProduit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du groupe de produit"
          }
        },
        "additionalProperties": true
      },
      "TermeDePaiement": {
        "type": "object",
        "properties": {
          "NomTermeDePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la méthode de paiement"
          },
          "NoTermeDePaiement_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant QuickBooks de la méthode de paiement"
          },
          "TypeTerme": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type de terme (identique au nom)"
          }
        },
        "additionalProperties": true
      },
      "InfoTaxe": {
        "type": "object",
        "description": "Consultez les taxes configurées dans vos systèmes ERP avec une API REST unifiée. Récupérez les informations de taxes pour Acomba, QuickBooks Online et autres systèmes ERP.\n\nL'entité Tax représente une taxe configurée dans votre système ERP (TPS, TVQ, TVA, etc.). Cette API permet d'effectuer des opérations de lecture (GET) sur les taxes de manière standardisée, peu importe le système ERP sous-jacent.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/Tax - Récupérer la liste des taxes configurées\n\n- **Note importante** : Les champs retournés varient selon le système ERP. Acomba retourne un modèle plus détaillé (InfoTaxe) incluant les taux et les comptes GL, tandis que QuickBooks Online retourne un modèle simplifié (FicheTaxe) avec le nom et l'identifiant unique.\n\n- **Différences entre ERP** : Acomba retourne le modèle InfoTaxe avec les comptes GL et les taux détaillés, tandis que QuickBooks Online retourne le modèle FicheTaxe qui correspond aux TaxCode de QuickBooks.",
        "properties": {
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique QuickBooks Filtrable (eq, ne) — QuickBooksOnline. Acomba : Clé alternative (surrogate key). Lu via TaxInt.CardPos.ToString(). QuickBooksOnline : Id interne du TaxCode QBO."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification de la fiche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Acomba : Horodatage système. Lu mais non filtrable (RetrievesTaxes ignore QuerySettings)."
          },
          "Taxe_Numero": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la taxe (ex: T.P.S. 100%, T.V.Q. 100%) Acomba : Numéro de taxe Acomba. Clé fonctionnelle (utilisée pour rattacher la taxe au groupe via TGTaxNumber)."
          },
          "Taxe_Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de la taxe"
          },
          "MontantTaxe": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant de la taxe"
          },
          "Taxe_NumeroLegalGouv": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro d'enregistrement légal gouvernemental Acomba : Numéro légal/gouvernemental de la taxe."
          },
          "NoCompteGL_PayedTax": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de compte GL pour les taxes payées Acomba : Compte GL de la taxe payée (récupérable). Lu via .ToString()."
          },
          "NoCompteGL_PerceivedTax": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de compte GL pour les taxes perçues Acomba : Compte GL de la taxe perçue (collectée). Lu via .ToString()."
          },
          "ListeTaux": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/TaxRate"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des différents taux de la taxe (0 à 9 dans Acomba)"
          },
          "NoTaxe": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la taxe"
          },
          "NomTaxe": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la taxe Filtrable (eq, ne) — QuickBooksOnline."
          }
        },
        "additionalProperties": true
      },
      "TaxRate": {
        "type": "object",
        "properties": {
          "TaxRateId": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Identifiant du taux (index 0 à 9 dans Acomba)"
          },
          "EffectiveTaxRate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Taux effectif de la taxe (ex: 5.0 pour 5%)"
          }
        },
        "additionalProperties": true
      },
      "FicheClient": {
        "type": "object",
        "description": "Gérez les clients à travers différents systèmes ERP avec une API REST unifiée. Créez, lisez et mettez à jour les informations clients pour Acomba, QuickBooks Online et autre système ERP.\n\nL'entité Customer représente un client dans votre système ERP. Cette API permet d'effectuer des opérations CRUD (Create, Read, Update) sur les clients de manière standardisée, peu importe le système ERP sous-jacent.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/Customer - Récupérer une liste de clients\n\n- GET /Entity/Customer/{id} - Récupérer un client spécifique\n\n- POST /Entity/Customer - Créer un nouveau client\n\n- PUT /Entity/Customer/{id} - Mettre à jour un client existant\n\n- **Note importante** : Les champs disponibles et requis varient selon le système ERP. Consultez la matrice de support ci-dessous pour connaître les opérations supportées.\n- **Limitation** : L'entité Customer n'est pas supportée pour Sage 50, Servex et Servicentre.\n\n- **ExtendedProperties** : Le dictionnaire ExtendedProperties permet d'ajouter des attributs personnalisés spécifiques à certains ERP ou besoins d'affaires particuliers sans modifier le modèle de données principal.",
        "properties": {
          "NoClient": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du client (clé business) À la création — Acomba : requis, Autotask : optionnel, QuickBooksOnline : optionnel, Sage300 : optionnel. Création : Acomba, Autotask, QuickBooksOnline, Sage300. Modification : Acomba, Autotask, QuickBooksOnline. Filtrable (contains, eq, in, ne) — Acomba, Autotask, Avantage, QuickBooksOnline, Sage300. Acomba : Clé d'identification. Changement de valeur possible seulement si CardPos (NoUniqueSystemeSource) fourni comme clé alternative. Autotask : Clé métier quand UseAccountIdForCustomerNumbering=false. Avantage : Clé du client. ProShop : Clé métier calculée (CadSystem si présent, sinon Name). NON filtrable directement (lève une exception) : filtrer via NoUniqueSystemeSource ou NoUniqueSystemeExterne. QuickBooksOnline : DisplayName QBO, unique. Obligatoire à l'UPDATE : sert de clé pour retrouver le client. Sage300 : Clé métier du client. Requis à la création. Sert aussi de NoUniqueSystemeSource."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé unique interne de l'ERP Création : Acomba. Modification : Acomba. Filtrable (contains, eq, gt, gte, in, ne) — Acomba, Autotask, Avantage, ProShop, QuickBooksOnline, Sage300. Acomba : Clé alternative (surrogate key). Autotask : Id système AutoTask (long). Clé, non écrite (utilisée pour le PATCH). ProShop : ID Acomba du contact. Filtrable via mode ListOfInternalIds (Customer seulement). QuickBooksOnline : Id interne QBO. Généré par QuickBooks (forcé à null à la création), non modifiable. Sage300 : Alimenté avec CustomerNumber (même valeur que NoClient)."
          },
          "NomClient": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom du client À la création — Acomba : requis, Autotask : optionnel, QuickBooksOnline : requis, Sage300 : optionnel. Création : Acomba, Autotask, QuickBooksOnline, Sage300. Modification : Acomba, Autotask, QuickBooksOnline. Filtrable (contains, eq, in, ne, startswith) — Autotask, Avantage, ProShop, QuickBooksOnline, Sage300. Autotask : Obligatoire. ProShop : Filtrable via mode ListOfNames (companyName)."
          },
          "FicheNomComplet": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true,
            "description": "Format: \"{NoClient} - {NomClient}\""
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le client est actif Création : Acomba, Autotask, QuickBooksOnline, Sage300. Modification : Acomba, Autotask, QuickBooksOnline. Filtrable (eq, ne) — Acomba, Autotask, Sage300. Acomba : Natif int 0/1. ProShop : true si Status != 'inactive' (insensible à la casse). QuickBooksOnline : Non filtrable pour Customer (absent du switch GetQBOCustomerFilterField). Sage300 : Bool ↔ 'Active'/'Inactive' (conversion de valeur dans le mapping OData)."
          },
          "Bool_ClientComptoir": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si c'est un client comptoir"
          },
          "DescriptionAdresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de l'adresse"
          },
          "Adresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse ligne 1 Création : Acomba, Autotask, QuickBooksOnline, Sage300. Modification : Acomba, Autotask, QuickBooksOnline. Filtrable (contains, eq, ne) — Autotask, Avantage, Sage300."
          },
          "Adresse2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse ligne 2 Création : Autotask, QuickBooksOnline, Sage300. Modification : Autotask, QuickBooksOnline. Filtrable (contains, eq, ne) — Autotask, Avantage, Sage300. QuickBooksOnline : Écrit seulement (non relu dans la conversion QBO→FicheClient)."
          },
          "Ville": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ville Création : Acomba, Autotask, QuickBooksOnline, Sage300. Modification : Acomba, Autotask, QuickBooksOnline. Filtrable (contains, eq, ne) — Autotask, Sage300."
          },
          "Province": {
            "type": [
              "string",
              "null"
            ],
            "description": "Province/État Création : Autotask, QuickBooksOnline, Sage300. Modification : Autotask, QuickBooksOnline. Filtrable (contains, eq, ne) — Autotask, Sage300."
          },
          "CodePostal": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code postal Création : Acomba, Autotask, QuickBooksOnline, Sage300. Modification : Acomba, Autotask, QuickBooksOnline. Filtrable (contains, eq, ne) — Autotask, Sage300. Autotask : Sert à déduire la province pour le Canada."
          },
          "Pays": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pays Création : Autotask, QuickBooksOnline, Sage300. Modification : Autotask, QuickBooksOnline. Filtrable (contains, eq, ne) — Autotask, Sage300. Autotask : Résolu via un lookup Country (CountryID)."
          },
          "MRC": {
            "type": [
              "string",
              "null"
            ],
            "description": "MRC (Municipalité régionale de comté)"
          },
          "CleTri1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé de tri personnalisée Création : Sage300. Filtrable (contains, eq, ne) — Sage300."
          },
          "NomPersonneContact": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la personne contact Création : QuickBooksOnline, Sage300. Modification : QuickBooksOnline. Filtrable (contains, eq, ne) — Sage300. QuickBooksOnline : Tronqué à 25 caractères max côté QBO."
          },
          "EmailPrincipal_Adresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel principale Création : QuickBooksOnline, Sage300. Modification : QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage, Sage300."
          },
          "EmailPrincipal_Desc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du courriel principal"
          },
          "EmailPrincipal_EstEtatDeCompte": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Envoyer les états de compte"
          },
          "EmailPrincipal_EstEmailFacturation": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Envoyer les factures"
          },
          "EmailPrincipal_EstPublicite": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Accepte la publicité"
          },
          "Email2_Adresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel secondaire Création : Sage300. Filtrable (contains, eq, ne) — Avantage. Sage300 : Non filtrable (hors ODataMapping)."
          },
          "Email2_Desc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du courriel secondaire"
          },
          "Email2_EstEtatDeCompte": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Envoyer les états de compte"
          },
          "Email2_EstEmailFacturation": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Envoyer les factures"
          },
          "Email2_EstPublicite": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Accepte la publicité"
          },
          "Email3_Adresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel tertiaire Filtrable (contains, eq, ne) — Avantage."
          },
          "Email3_Desc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du courriel tertiaire"
          },
          "Email3_EstEtatDeCompte": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Envoyer les états de compte"
          },
          "Email3_EstEmailFacturation": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Envoyer les factures"
          },
          "Email3_EstPublicite": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Accepte la publicité"
          },
          "SiteWeb": {
            "type": [
              "string",
              "null"
            ],
            "description": "Site web du client Création : Autotask, QuickBooksOnline, Sage300. Modification : Autotask, QuickBooksOnline. Filtrable (contains, eq, ne) — Sage300."
          },
          "ListeTelephonique": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/FicheTelephonique"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des numéros de téléphone"
          },
          "Telephone_Principal": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheTelephonique"
              },
              {
                "type": "null"
              }
            ],
            "description": "Téléphone principal"
          },
          "Telephone_Telecopieur": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheTelephonique"
              },
              {
                "type": "null"
              }
            ],
            "description": "Numéro de télécopieur"
          },
          "NoVendeur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du vendeur assigné Création : Acomba, Sage300. Modification : Acomba. Filtrable (contains, eq, ne) — Sage300."
          },
          "NoVendeur_NoUniqueSystemSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du vendeur"
          },
          "Vendeur_NomComplet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom complet du vendeur"
          },
          "Territoire": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code du territoire Création : Sage300. Filtrable (contains, eq, ne) — Sage300."
          },
          "Territoire_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du territoire"
          },
          "Territoire_NomComplet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom complet du territoire"
          },
          "ClientFacturation_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Client de facturation (si différent)"
          },
          "ClientFacturation_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du client de facturation"
          },
          "NoModeExpeditionDefaut": {
            "type": [
              "string",
              "null"
            ],
            "description": "Mode d'expédition par défaut Création : Sage300. Filtrable (contains, eq, ne) — Sage300."
          },
          "NoModeExpeditionDefaut_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du mode d'expédition"
          },
          "InfoLivraisonSpeciale1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Information de livraison spéciale 1"
          },
          "InfoLivraisonSpeciale2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Information de livraison spéciale 2"
          },
          "TermeDePaiement_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Terme de paiement Création : Acomba, Sage300. Modification : Acomba. Filtrable (contains, eq, ne) — Sage300."
          },
          "TermeDePaiement_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du terme de paiement"
          },
          "TermeDePaiement_NomComplet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description complète du terme"
          },
          "MargeCredit_MontantMarge": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant de la marge de crédit Création : Sage300. Filtrable (eq, gt, gte, lt, lte, ne) — Sage300."
          },
          "MargeCredit_TypeMarge": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Client_TypeDeMargeDeCredit"
              },
              {
                "type": "null"
              }
            ],
            "description": "Type de marge de crédit"
          },
          "NiveauPrixClient": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Client_NiveauPrixClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Niveau de prix pour le client"
          },
          "InfoAgeDesComptes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AgeDesComptes"
              },
              {
                "type": "null"
              }
            ],
            "description": "Information sur l'âge des comptes"
          },
          "NoGroupeTaxe": {
            "type": [
              "string",
              "null"
            ],
            "description": "Groupe de taxes applicable Création : Sage300. Filtrable (contains, eq, ne) — Sage300. ProShop : Résolu depuis CustomerTaxType → code de groupe Acomba. Échoue si CustomerTaxType hors table de mapping. Sage300 : Requis à la création."
          },
          "NoGroupeTaxe_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du groupe de taxes"
          },
          "ListeTaxeException": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/FicheTaxe"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des exceptions de taxes"
          },
          "CompteRecevable": {
            "type": [
              "string",
              "null"
            ],
            "description": "Compte recevable (Acomba)"
          },
          "CompteRecevable_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du compte recevable Création : Sage300. Sage300 : Requis à la création. Non filtrable (hors ODataMapping)."
          },
          "PPA_Actif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Paiement préautorisé activé"
          },
          "PPA_NoInstitution": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'institution bancaire"
          },
          "PPA_NoSuccursale": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la succursale"
          },
          "PPA_NoCompte": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de compte bancaire"
          },
          "Projet_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de projet associé"
          },
          "Projet_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du projet"
          },
          "DateRefference1": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de référence personnalisée 1 Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Sage300 : Date d'inactivation (lecture seule, non filtrable — hors ODataMapping)."
          },
          "DateRefference2": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de référence personnalisée 2 Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "DescriptionDateRefference1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de la date de référence 1"
          },
          "DescriptionDateRefference2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de la date de référence 2"
          },
          "DateOuvertureDossier": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date d'ouverture du compte client Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Sage300 : Non filtrable (hors ODataMapping)."
          },
          "LangueClient": {
            "type": [
              "string",
              "null"
            ],
            "description": "Langue du client"
          },
          "CommentairesClients": {
            "type": [
              "string",
              "null"
            ],
            "description": "Commentaires sur le client Création : Autotask, QuickBooksOnline. Modification : Autotask, QuickBooksOnline."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, in, lt, lte, ne) — Acomba, Autotask, Avantage, ProShop, Sage300. Acomba : Horodatage système. Lecture et filtrage par plage seulement. Autotask : Audit, lecture seule côté AutoTask. ProShop : DateTime. Filtrable via mode LastModifiedDate (greaterThan) et opérateurs de date. QuickBooksOnline : Horodatage QBO, lecture seule. Non filtrable côté QBO pour cette entité. Sage300 : Lecture seule (horodatage Sage 300)."
          },
          "ExtendedProperties": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Propriétés étendues personnalisées"
          }
        },
        "additionalProperties": true
      },
      "CustomerBid": {
        "type": "object",
        "description": "Gérez les soumissions clientes à travers différents systèmes ERP avec une API REST unifiée. Créez, modifiez et extrayez les soumissions — première étape du cycle de vente, avant la commande et la facture.\n\nL'entité CustomerBid représente une soumission cliente (une offre de prix) dans votre système ERP. C'est la première étape du cycle de vente, présent dans la plupart des ERP : CustomerBid (soumission) → CustomerOrder (commande) → CustomerInvoice (facture). Cette API permet de créer, modifier et extraire les soumissions de manière standardisée, quel que soit le système ERP sous-jacent.\n\n- Lignes de la soumission : les produits, quantités soumissionnées et montants sont retournés avec l'entête, dans la collection LigneFacture[]\n\n- GET /Entity/CustomerBid - Récupérer les soumissions clientes avec filtrage, tri et pagination\n\n- POST /Entity/CustomerBid - Créer une nouvelle soumission cliente\n\n- PUT /Entity/CustomerBid/{id} - Modifier une soumission existante\n\n- **Le cycle de vente** : Soumission, commande et facture sont trois entités distinctes de l'API — CustomerBid, CustomerOrder et CustomerInvoice. Chacune se lit et s'écrit séparément ; consulter la matrice ci-dessous pour savoir lesquelles votre ERP supporte.\n\nModèle unifié : `FicheTransactions` (partagé avec d'autres entités de même nature).\n\n- **Même objet que la facture** : Soumission, commande et facture partagent le même DTO `FicheTransactions` (avec ses `LigneTransactions`). Les champs décrits ci-dessous sont donc les mêmes que ceux de CustomerOrder et CustomerInvoice ; c'est `TypeDoc` qui distingue le document, et la matrice qui dit lesquels votre ERP supporte réellement sur cette entité.\n- **ExtendedProperties** : Les objets FicheTransactions et LigneTransactions supportent également un dictionnaire ExtendedProperties pour des propriétés personnalisées ou spécifiques à un ERP.\n- **InfoClientFacturerA / InfoClientLivrerA (type FicheClient)** : Ces deux objets sont des FicheClient complètes (mêmes champs qu'une fiche Client : Adresse, Ville, CodePostal, Pays, personne-contact, téléphones) — voir la page Client. InfoClientFacturerA = client facturé (SoldTo) ; InfoClientLivrerA = client livré (ShipTo, adresse de livraison).",
        "properties": {
          "NoFacture": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la soumission Création : Acomba. Modification : Acomba. Filtrable (eq, in) — Acomba. Acomba : Cle metier (numero du document). Pour une soumission, peut etre assigne au CREATE (sinon numero sequentiel reserve via ReserveCardNumber). Fetch immediat via GetFromPrimaryKey (PKey_InInvoiceNumber + PKey_InInvoiceType=ITp_Bid + PKey_InReceivable)."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source ERP Modification : Acomba. Filtrable (eq, in) — Acomba. Acomba : Cle alternative (CardPos Acomba). Sert de cle pour UpdateTransaction (ReserveCard). Renseigne au CREATE comme retour."
          },
          "TypeDoc": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "enum": [
              "Soumissions"
            ],
            "description": "Type de document — vaut `Soumissions` pour une soumission cliente Énumération : la valeur est un texte ou un entier selon l'ERP. Valeurs permises : `Soumissions`. Création : Acomba. Modification : Acomba. Acomba : Pour cette entite, fixe a Soumission (AcoSDK.InvoicingType.ITp_Bid). Le dispatch impose le type via EntityType.CustomerBid."
          },
          "DateFacture": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la soumission Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba. Modification : Acomba. Filtrable (gt, gte, lt, lte) — Acomba. Acomba : Index 6. Filtrage par plage uniquement (les operateurs eq/in ne sont pas declares pour la date)."
          },
          "DateExpirationDocument": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date d'expiration de la soumission Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba. Modification : Acomba. Acomba : Pertinent pour une soumission (date d'expiration)."
          },
          "Référence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de référence du client Création : Acomba. Modification : Acomba. Filtrable (eq, ne) — Acomba. Acomba : Filtre post-extraction (en memoire), eq/ne. Tronque a 30 caracteres au CREATE."
          },
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description générale de la soumission Création : Acomba. Modification : Acomba. Filtrable (eq, ne) — Acomba. Acomba : Filtre post-extraction (en memoire), eq/ne. Tronque a 255 caracteres au CREATE."
          },
          "TotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total incluant les taxes Acomba : Calcule par Acomba. Lecture seule."
          },
          "SousTotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Sous-total avant taxes Acomba : Calcule par Acomba. Lecture seule (au CREATE, recalcule via CalculateTaxes)."
          },
          "FraisDeTransport": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Frais de livraison ou de transport Création : Acomba. Modification : Acomba. Acomba : Gere via une ligne de type transport (IL_Shipping) plus le recalcul de taxes. A l'extraction, somme des lignes transport (+ InSales_Shipping selon version)."
          },
          "InfoClientFacturerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Informations du client à facturer"
          },
          "InfoClientLivrerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Informations du client pour la livraison"
          },
          "NoVendeur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du vendeur assigné Création : Acomba. Modification : Acomba. Filtrable (eq, ne) — Acomba. Acomba : Filtre post-extraction (en memoire). CREATE/UPDATE acceptent NoVendeur (InSalesRepNumber) ou NoVendeur_NoUniqueSystemeSource (InSalesRepCP). Lecture via cache CardPos->Numero."
          },
          "NoTerritoire": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du territoire de vente Création : Acomba. Modification : Acomba. Filtrable (eq, ne) — Acomba. Acomba : Filtre post-extraction (en memoire). CREATE/UPDATE via numero (InTerritoryNumber) ou CardPos (InTerritoryCP)."
          },
          "NoModeExpedition": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du mode d'expédition Création : Acomba. Modification : Acomba. Acomba : CREATE/UPDATE via numero (InShippingNumber) ou CardPos (InShippingCP). Sinon valeur par defaut du client."
          },
          "TermeDePaiement": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TermeDePaiement"
              },
              {
                "type": "null"
              }
            ],
            "description": "Conditions de paiement (Net 30, Net 60, etc.)"
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de projet associé Création : Acomba. Modification : Acomba. Acomba : Entete. CREATE/UPDATE via numero (InProjectNumber) ou CardPos (InProjectCP)."
          },
          "LigneFacture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LigneTransactions"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de détail de la soumission"
          },
          "ListeDesTaxes": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InfoTaxe"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Détail des taxes calculées"
          },
          "NoCommandeRéférence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la commande issue de cette soumission Création : Acomba. Modification : Acomba. Acomba : Reference de commande associee."
          },
          "NoSoumissionRéférence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de soumission de référence Création : Acomba. Modification : Acomba. Acomba : Reference de soumission associee."
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si la soumission est active Acomba : Derive de InStatus (0 = actif). Les transactions supprimees (InStatus != 0) sont exclues a l'extraction."
          }
        },
        "additionalProperties": true
      },
      "CustomerOrder": {
        "type": "object",
        "description": "Gérez les commandes clientes à travers différents systèmes ERP avec une API REST unifiée. Créez, modifiez et extrayez les commandes — avec leurs lignes, leurs dépôts et leur état de livraison — pour Acomba, Avantage, Sage 300 et les autres systèmes supportés.\n\nL'entité CustomerOrder représente une commande cliente dans votre système ERP. Elle occupe la place centrale du cycle de vente, qui va typiquement de la soumission à la facture : CustomerBid (soumission) → CustomerOrder (commande) → CustomerInvoice (facture). Cette API permet de créer, modifier et extraire les commandes de manière standardisée, quel que soit le système ERP sous-jacent.\n\n- Dépôt en argent : selon l'ERP, une commande peut porter un dépôt versé par le client\n\n- Livraison : selon l'ERP, une commande peut être livrée totalement ou partiellement\n\n- Lignes de la commande : les produits et quantités sont retournés avec l'entête, dans la collection LigneFacture[]\n\n- GET /Entity/CustomerOrder - Récupérer les commandes clientes avec filtrage, tri et pagination\n\n- POST /Entity/CustomerOrder - Créer une nouvelle commande cliente\n\n- PUT /Entity/CustomerOrder/{id} - Modifier une commande existante\n\n- **Le cycle de vente** : Soumission, commande et facture sont trois entités distinctes de l'API — CustomerBid, CustomerOrder et CustomerInvoice. Chacune se lit et s'écrit séparément ; consulter la matrice ci-dessous pour savoir lesquelles votre ERP supporte.\n- **Écriture selon l'ERP** : La création et la modification ne sont pas disponibles partout — Avantage expose la commande en lecture seule, Sage 300 permet la création mais pas la modification. La matrice ci-dessous fait foi.\n\nModèle unifié : `FicheTransactions` (partagé avec d'autres entités de même nature).\n\n- **Même objet que la facture** : Commande, soumission et facture partagent le même DTO `FicheTransactions` (avec ses `LigneTransactions`). Les champs décrits ci-dessous sont donc les mêmes que ceux de CustomerInvoice et CustomerBid ; c'est `TypeDoc` qui distingue le document, et la matrice qui dit lesquels votre ERP supporte réellement sur cette entité.\n- **ExtendedProperties** : Les objets FicheTransactions et LigneTransactions supportent également un dictionnaire ExtendedProperties pour des propriétés personnalisées ou spécifiques à un ERP.\n- **InfoClientFacturerA / InfoClientLivrerA (type FicheClient)** : Ces deux objets sont des FicheClient complètes (mêmes champs qu'une fiche Client : Adresse, Ville, CodePostal, Pays, personne-contact, téléphones) — voir la page Client. InfoClientFacturerA = client facturé (SoldTo) ; InfoClientLivrerA = client livré (ShipTo, adresse de livraison).",
        "properties": {
          "NoFacture": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la commande Création : Acomba, Sage300. Modification : Acomba. Filtrable (contains, eq, in, ne) — Acomba, Sage300. Acomba : Cle metier (numero de document). En CREATE, sur une commande, le numero est auto-assigne via ReserveCardNumber si absent. Fetch direct par NoFacture (+ CompteRecevable_No optionnel). Sage300 : N° de commande. À la création, alimente aussi OrderNumber + InvoiceNumber."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source ERP Modification : Acomba. Filtrable (contains, eq, in, ne) — Acomba, Sage300. Acomba : Cle surrogate (CardPos Acomba). Sert de cle d'identification pour l'UPDATE (UpdateTransaction -> ReserveCard). Genere par Acomba a la creation."
          },
          "TypeDoc": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Type de document — vaut `Commandes` pour une commande cliente Énumération : la valeur est un texte ou un entier selon l'ERP. Valeurs permises — Acomba : `Commandes`. Création : Acomba. Modification : Acomba. Acomba : Type de document. Pour CustomerOrder, mappe a AcoSDK.InvoicingType.ITp_Order (Commande). Sage300 : Constante SI_ExtractContentType.Commandes (pas un champ natif)."
          },
          "SousTypeTransaction": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "INVOICE_AR"
            ],
            "description": "Sous-type de la transaction Valeurs permises : `INVOICE_AR`. Création : Acomba. Modification : Acomba. Acomba : La valeur 'INVOICE_AR' shunte la machinerie commande/taxes vers une creation TransAR directe (voir CustomerARInvoice)."
          },
          "DateFacture": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la commande Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba, Sage300. Modification : Acomba. Filtrable (eq, gt, gte, lt, lte, ne) — Acomba, Sage300. Acomba : Filtre par plage de dates (index 6). Sert de balise min/max lors de l'extraction. Sage300 : À la création, la date par défaut (1899-12-30) est envoyée null pour éviter une erreur Sage 300."
          },
          "Référence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de référence ou de bon de commande du client Création : Acomba, Sage300. Modification : Acomba. Filtrable (contains, eq, ne) — Acomba, Sage300. Acomba : Filtre post-extraction (en memoire)."
          },
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description générale de la commande Création : Acomba, Sage300. Modification : Acomba. Filtrable (contains, eq, ne) — Acomba, Sage300. Acomba : Filtre post-extraction (en memoire). Operateurs Contains/DoesntContains aussi geres dans le code mais sans token dans le vocabulaire ferme."
          },
          "TotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total incluant les taxes Filtrable (eq, gt, gte, lt, lte, ne) — Sage300. Acomba : Calcule par Acomba (taxes incluses)."
          },
          "SousTotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Sous-total avant taxes Création : Sage300. Filtrable (eq, gt, gte, lt, lte, ne) — Sage300. Acomba : Calcule par Acomba. Sage300 : À la création alimente OrderSubtotalAmount + OrderTotalBeforeTax. À l'extraction, calculé depuis les lignes si absent."
          },
          "MontantNonPaye": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Solde restant à payer Filtrable (eq, gt, gte, lt, lte, ne) — Acomba, Sage300. Acomba : Solde. Filtre post-extraction (applique en memoire apres lecture Acomba). Renseigne via l'expand ListeReglement. Sage300 : Filtrable OData seulement."
          },
          "FraisDeTransport": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Frais de livraison ou de transport Filtrable (eq, gt, gte, lt, lte, ne) — Sage300. Sage300 : Filtrable OData seulement."
          },
          "InfoClientFacturerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Informations du client à facturer Création : Acomba. Modification : Acomba. Acomba : Facturer a (sous-objet client). Si seul NoClient fourni, les coordonnees sont forcees depuis Acomba."
          },
          "InfoClientLivrerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Informations du client pour la livraison Création : Acomba. Modification : Acomba. Acomba : Livrer a (sous-objet client). Si seul NoClient fourni, les coordonnees sont forcees depuis Acomba."
          },
          "NoVendeur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du vendeur assigné Création : Acomba. Modification : Acomba. Filtrable (contains, eq, ne) — Acomba, Sage300. Acomba : Filtre post-extraction (en memoire). Sage300 : Filtrable OData seulement."
          },
          "NoTerritoire": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du territoire de vente Création : Acomba, Sage300. Modification : Acomba. Filtrable (contains, eq, ne) — Acomba, Sage300. Acomba : Filtre post-extraction (en memoire)."
          },
          "NoModeExpedition": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du mode d'expédition Filtrable (contains, eq, ne) — Sage300."
          },
          "TermeDePaiement": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TermeDePaiement"
              },
              {
                "type": "null"
              }
            ],
            "description": "Conditions de paiement (Net 30, Net 60, etc.)"
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de projet associé Filtrable (contains, eq, ne) — Sage300. Sage300 : Filtrable OData seulement (native 'ContractCode')."
          },
          "LigneFacture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LigneTransactions"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de détail de la commande"
          },
          "ListeDesTaxes": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InfoTaxe"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Détail des taxes calculées"
          },
          "ListeReglement": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ARPayment"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des dépôts et paiements reçus"
          },
          "NoCommandeRéférence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de commande de référence Filtrable (contains, eq, ne) — Sage300."
          },
          "NoSoumissionRéférence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la soumission dont la commande est issue Filtrable (contains, eq, ne) — Sage300. Sage300 : Filtrable OData seulement."
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si la commande est active Filtrable (eq, ne) — Sage300. Sage300 : EstActif = !OnHold à l'extraction."
          },
          "EstInversee": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si la commande a été inversée (annulée)"
          }
        },
        "additionalProperties": true
      },
      "CustomerInvoice": {
        "type": "object",
        "description": "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.\n\nL'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.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/CustomerInvoice - Récupérer une liste de factures\n\n- GET /Entity/CustomerInvoice/{id} - Récupérer une facture spécifique\n\n- POST /Entity/CustomerInvoice - Créer une nouvelle facture\n\n- **Note importante** : 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.\n\nModèle unifié : `FicheTransactions` (partagé avec d'autres entités de même nature).\n\n- **ExtendedProperties** : Les objets FicheTransactions et LigneTransactions supportent également un dictionnaire ExtendedProperties pour des propriétés personnalisées ou spécifiques à un ERP.\n- **InfoClientFacturerA / InfoClientLivrerA (type FicheClient)** : Ces deux objets sont des FicheClient complètes (mêmes champs qu'une fiche Client : Adresse, Ville, CodePostal, Pays, personne-contact, téléphones) — voir la page Client. InfoClientFacturerA = client facturé (SoldTo) ; InfoClientLivrerA = client livré (ShipTo, adresse de livraison).",
        "properties": {
          "NoFacture": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la facture Création : Acomba, QuickBooksOnline. Modification : Acomba. Filtrable (contains, eq, gt, gte, in, ne) — Acomba, Autotask, Avantage, ProShop, QuickBooksOnline. Acomba : Clé d'affaires (numéro de document). Au CREATE d'une Facture (TypeDoc=Factures) le numéro doit être VIDE (sinon erreur : utiliser UPDATE). Pour commande/soumission/achat un numéro peut être fourni, sinon ReserveCardNumber l'attribue. Filtre eq/in via index 1 (fetch immédiat, pas de limite Top). Autotask : Id unique de la facture. Avantage : N° de facture (6 car.). ProShop : ID de facture ProShop. Filtrable via mode ListOfExternalIds."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source ERP Modification : Acomba. Filtrable (contains, eq, in, ne) — Acomba, Avantage, ProShop, QuickBooksOnline. Acomba : CardPos Acomba (surrogate key). Renseigné en sortie après AddCard. Clé du ReserveCard pour l'UPDATE (UpdateTransaction). Filtre eq/in via GetCard direct. QuickBooksOnline : Id interne QBO. Forcé à null à la création (throw si fourni)."
          },
          "TypeDoc": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Type de document (FACTURES, COMMANDES, SOUMISSIONS) Énumération : la valeur est un texte ou un entier selon l'ERP. À la création — Acomba : requis, QuickBooksOnline : non supporté. Valeurs permises — Acomba : `Factures`. Création : Acomba. Modification : Acomba. Acomba : Type de document (Facture/Commande/Soumission/Achat). Détermine l'entité dispatchée (CustomerInvoice/CustomerOrder/CustomerBid/SupplierOrder). Au CREATE, forcé à Factures si non commande/achat/soumission. ProShop : Constante SI_ExtractContentType.Factures."
          },
          "DateFacture": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la facture Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. À la création — Acomba : requis, QuickBooksOnline : requis. Création : Acomba, QuickBooksOnline. Modification : Acomba. Filtrable (eq, gt, gte, lt, lte, ne) — Acomba, Autotask, Avantage, QuickBooksOnline. Acomba : Date de transaction. Filtrage par plage via index 6."
          },
          "Référence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de référence ou de bon de commande Création : Acomba. Modification : Acomba. Filtrable (eq, ne) — Acomba, QuickBooksOnline. Acomba : Tronqué à 30 caractères au CREATE. Filtre post-extraction (en mémoire) ; supporte aussi Contains/DoesntContains, hors vocabulaire fermé. QuickBooksOnline : = DocNumber (alias de NoFacture en lecture)."
          },
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description générale de la facture Création : Acomba, QuickBooksOnline. Modification : Acomba. Filtrable (contains, eq, ne) — Acomba, Avantage. Acomba : Tronqué à 255 caractères au CREATE. Filtre post-extraction (en mémoire) ; supporte aussi Contains/DoesntContains, hors vocabulaire fermé. Avantage : Remarques."
          },
          "TotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total incluant les taxes Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Acomba : Calculé par Acomba (CalculateTaxes). En sortie après création. Autotask : Calculé (somme des BillingItems), non un champ AutoTask direct. Avantage : Total dû (taxes + escompte inclus). ProShop : Calculé (sous-total + lignes de taxe). QuickBooksOnline : Calculé par QBO. Signe inversé (négatif) quand la transaction est une note de crédit."
          },
          "SousTotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Sous-total avant taxes Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Acomba : Calculé par Acomba. En sortie après création. Avantage : Sous-total hors taxes. ProShop : Source de vérité pour le recalcul de taxe."
          },
          "MontantNonPaye": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Solde restant à payer Filtrable (eq, gt, gte, lt, lte, ne) — Acomba. Acomba : EXTRACT : initialisé au total, mis à 0 si InAllPaid!=0 ; valeur réelle calculée seulement si Expand=ListeReglement. Filtre post-extraction décimal."
          },
          "FraisDeTransport": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Frais de livraison ou de transport Création : Acomba. Acomba : EXTRACT : somme des lignes de transport / InSales_Shipping. CREATE : ajouté via AjouterFraisTransport (ligne IL_Shipping) si non nul."
          },
          "InfoClientFacturerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Informations du client à facturer À la création — Acomba : requis, QuickBooksOnline : requis. Création : Acomba. Modification : Acomba. Acomba : Sous-objet client a facturer (FicheClient), exige au CREATE. Objet agrege : ses membres sont decrits par les entrees InfoClientFacturerA.* ci-dessous, il n'a pas de membre natif propre."
          },
          "InfoClientLivrerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Informations du client pour la livraison"
          },
          "NoVendeur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du vendeur assigné Création : Acomba. Modification : Acomba. Filtrable (eq, ne) — Acomba. Acomba : EXTRACT : résolu depuis InSalesRepCP (clé naturelle). CREATE : InSalesRepCP via _NoUniqueSystemeSource sinon InSalesRepNumber ; défaut = vendeur de la fiche client. Filtre post-extraction (aussi Contains/DoesntContains)."
          },
          "NoTerritoire": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du territoire de vente Création : Acomba. Modification : Acomba. Filtrable (eq, ne) — Acomba. Acomba : EXTRACT : résolu depuis InTerritoryCP. CREATE : InTerritoryCP sinon InTerritoryNumber ; défaut = territoire de la fiche client. Filtre post-extraction (aussi Contains/DoesntContains)."
          },
          "TermeDePaiement": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TermeDePaiement"
              },
              {
                "type": "null"
              }
            ],
            "description": "Conditions de paiement (Net 30, Net 60, etc.)"
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de projet associé Création : Acomba. Modification : Acomba. Filtrable (contains, eq, ne) — Avantage. Acomba : Projet d'entête. CREATE : InProjectCP via _NoUniqueSystemeSource sinon InProjectNumber ; défaut = projet de la fiche client."
          },
          "LigneFacture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LigneTransactions"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de détail de la facture À la création — Acomba : requis, QuickBooksOnline : requis. Création : Acomba. Modification : Acomba. Acomba : Collection des lignes de la facture (LigneTransactions). Au moins une ligne est exigee au CREATE. Objet agrege : ses membres sont decrits par les entrees LigneFacture[].* ci-dessous."
          },
          "ListeDesTaxes": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InfoTaxe"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Détail des taxes calculées"
          },
          "ListeReglement": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ARPayment"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des paiements reçus"
          },
          "NoCommandeRéférence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de commande de référence Création : Acomba. Modification : Acomba. Filtrable (contains, eq, ne) — Avantage. Avantage : N° de commande client."
          },
          "NoSoumissionRéférence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de soumission de référence Création : Acomba. Modification : Acomba."
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si la facture est active Acomba : Calculé : InStatus == 0. Les transactions supprimées (InStatus!=0) sont exclues de l'extraction. ProShop : Constante true."
          },
          "EstInversee": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si la facture a été inversée (annulée)"
          }
        },
        "additionalProperties": true
      },
      "ARPayment": {
        "type": "object",
        "description": "Gérez les paiements/règlements clients à travers différents systèmes ERP avec une API REST unifiée. Lisez et créez les paiements pour Acomba, QuickBooks Online, Avantage et autres systèmes ERP. Un règlement peut concerner une ou plusieurs factures et utiliser un ou plusieurs modes de paiement.\n\nL'entité CustomerInvoicePayment (ARPayment) représente un règlement client dans votre système ERP. Un règlement est une transaction de paiement qui peut être appliquée à une ou plusieurs factures clients, et peut combiner différents modes de paiement (comptant, carte de crédit, chèque, etc.).\n\n- GET /Entity/CustomerInvoicePayment - Récupérer une liste de paiements\n\n- GET /Entity/CustomerInvoicePayment/{id} - Récupérer un paiement spécifique\n\n- POST /Entity/CustomerInvoicePayment - Créer un nouveau paiement client (Acomba seulement)",
        "properties": {
          "NumeroPaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du paiement (chèque, transaction, etc.) Filtrable (eq, in) — Acomba. Acomba : Numero de reglement. EXTRACT : recherche via index 3 (Key_CPPaymentType+Key_CPPaymentNumber), essaie chaque PaymentARType. CREATE : assigne par Acomba (sortie dans BusinessKey, '; '-joint si plusieurs fiches)."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique interne du système ERP Filtrable (eq, in) — Acomba. Acomba : CardPos Acomba (surrogate). EXTRACT par eq/in = GetCard direct. CREATE : renseigne en sortie (ErpInternalId) apres ReserveCard/ModifyCard."
          },
          "Client_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du client qui effectue le paiement À la création — Acomba : requis. Création : Acomba. Filtrable (eq, in) — Acomba. Acomba : Cle client. Requis au CREATE (resout le client via Customer.PKey_CuNumber). Filtre eq utilise comme borne du scan index 8 ; in declare dans ListAllowedFilter."
          },
          "Client_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID unique système du client Acomba : CardPos client. EXTRACT : CPCustomerCP.ToString(). CREATE : resolu automatiquement (BillTo) cote SDK, non lu depuis le DTO."
          },
          "DatePaiement": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date du paiement Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. À la création — Acomba : requis. Création : Acomba. Filtrable (gt, gte, lt, lte) — Acomba. Acomba : Date du paiement. CREATE : defaut DateTime.Now si null. EXTRACT : bornes min/max appliquees sur l'index 8."
          },
          "DateNotification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de notification du paiement Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba. Acomba : Date d'avis. CREATE seulement si non nulle/non MinValue. Non relue dans le convertisseur d'extraction."
          },
          "TotalPaiement": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total du paiement Acomba : EXTRACT : calcule = somme de ListePaiement[].dbl_MontantPaiement. Pas un membre natif unique. CREATE : non lu (la repartition vient de ListePaiement + Liste_PaiementFacture)."
          },
          "TotalEscompte": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Total des escomptes/rabais accordés Acomba : EXTRACT : calcule = somme de Liste_PaiementFacture[].dbl_MontantEscompte. Pas un membre natif unique."
          },
          "ReferencePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Référence externe du paiement Création : Acomba. Acomba : Reference du paiement (optionnelle). Poussee en CREATE si non vide."
          },
          "DescriptionPaiementPaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description/note du paiement"
          },
          "TypePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type/catégorie du paiement Acomba : EXTRACT : CPPaymentType.ToString() (PaymentARType). CREATE : force a PM_Payment cote SDK, non pilote par ce champ."
          },
          "Recevable": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Indicateur de compte recevable"
          },
          "Date_FicheDerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Acomba : Horodatage systeme, lecture seule."
          },
          "ListePaiement": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Paiement"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des modes de paiement utilisés À la création — Acomba : requis."
          },
          "Liste_PaiementFacture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InvoicePayment"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des factures payées avec montants À la création — Acomba : requis."
          }
        },
        "additionalProperties": true
      },
      "Paiement": {
        "type": "object",
        "properties": {
          "ModePaiement": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Code du mode de paiement Énumération : la valeur est un texte ou un entier selon l'ERP."
          },
          "dbl_MontantPaiement": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant payé avec ce mode"
          },
          "date_DatePaiement": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de ce paiement spécifique Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "dbl_MontantPaiement_PerteArrondissement": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Perte d'arrondissement"
          },
          "dbl_Montant_RetraitInteract": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant du retrait Interac"
          },
          "dbl_Montant_ChangeRemit": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Monnaie remise"
          },
          "str_NoUniqueSystemeSource_CommandePourDepot": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID de la commande pour dépôt (si applicable)"
          }
        },
        "additionalProperties": true
      },
      "InvoicePayment": {
        "type": "object",
        "properties": {
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID unique du lien paiement-facture Filtrable (contains, eq, in, ne) — Avantage, Sage50. Acomba : Sortie en CREATE (assigne depuis CardPos apres ReserveCard) ; lu en EXTRACT. Avantage : N° de paiement (9 car.), clé. Filtré via l'invoice (PCOMPTE) lors d'un Expand."
          },
          "PaiementEntete_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lien vers le règlement parent (APPayment)"
          },
          "Facture_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la facture payée"
          },
          "Facture_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID unique système de la facture"
          },
          "TypeTransaction": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type de transaction (Invoice, Credit, etc.)"
          },
          "dbl_MontantTotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total original de la facture"
          },
          "dbl_MontantDuPaiement": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant du paiement appliqué à cette facture"
          },
          "dbl_MontantEscompte": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant de l'escompte accordé"
          },
          "ClientFournisseur_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur"
          },
          "ClientFournisseurSoldTo_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du payeur (si différent)"
          },
          "DateFacture": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la facture Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "Date_FicheDerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification du lien Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Acomba : Horodatage systeme, lecture seule."
          }
        },
        "additionalProperties": true
      },
      "CustomerPaymentTerm": {
        "type": "object",
        "description": "Consultez les termes de paiement client configurés dans vos systèmes ERP avec une API REST unifiée. Récupérez la description, le pourcentage d'escompte et les délais derrière le code de terme porté par une fiche client.\n\nL'entité CustomerPaymentTerm représente un **terme de paiement client** (comptes recevables) : la définition complète derrière le code de terme qu'une fiche client porte dans son champ `TermeDePaiement_No`. Sans cette entité, un intégrateur qui lit `TermeDePaiement_No = 3` sur un client n'a aucun moyen d'afficher « 2 % 10 jours, net 30 », de calculer une date d'échéance ou d'appliquer un escompte.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/CustomerPaymentTerm - Récupérer la liste des termes de paiement client\n\n- **Deux tables distinctes, à ne pas confondre** : les termes client (CustomerPaymentTerm) et les termes fournisseur (SupplierPaymentTerm) sont deux tables indépendantes, avec des clés séparées. Un numéro de terme client et un numéro de terme fournisseur qui portent le même chiffre n'ont **aucun rapport**. Interrogez l'entité correspondant au côté que vous traitez.\n- **Ne pas confondre avec le terme figé sur une transaction** : le sous-objet `TermeDePaiement` porté par une facture, une commande ou une soumission décrit le terme **tel qu'il était au moment de la facturation**, copié dans la transaction. Cette entité-ci décrit la table de référence, qui peut avoir changé depuis.\n\nModèle unifié : `TermeDePaiement` (partagé avec d'autres entités de même nature).\n\n- **Lecture seule** : aucune opération de création, de modification ou de suppression n'est offerte sur les termes de paiement. Ils se configurent dans l'ERP.\n- **Termes à versements et échéanciers** : les champs propres aux termes à versements périodiques et à échéancier personnalisé (périodicité, nombre de versements, dates d'échéancier) ne sont pas extraits. Les termes à escompte — le cas courant — sont complets.",
        "properties": {
          "NoTermeDePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du terme tel qu'affiché dans l'ERP. C'est la valeur portée par `Customer.TermeDePaiement_No`. Acomba : Clé d'affaires. Numéro du terme tel qu'affiché dans Acomba ; c'est la valeur portée par Customer.CuTermNumber. Lu via .ToString()."
          },
          "NoTermeDePaiement_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source (CardPos dans Acomba) Acomba : Clé alternative (surrogate key). Lu via Key_CTCardPos.ToString() ; c'est la valeur portée par Customer.CuTermCP."
          },
          "NomTermeDePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description lisible du terme (ex. « 2 % 10 jours, net 30 ») Acomba : Description lisible du terme."
          },
          "TypeTerme": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "TTAR_Min",
              "TTAR_DiscountAccordingToDate",
              "TTAR_PeriodicInstallments",
              "TTAR_PaymentSchedule"
            ],
            "description": "Type de terme, en code texte : `TTAR_DiscountAccordingToDate` (escompte selon la date de paiement), `TTAR_PeriodicInstallments` (versements périodiques), `TTAR_PaymentSchedule` (échéancier personnalisé), `TTAR_Min` (non défini) Valeurs permises : `TTAR_Min`, `TTAR_DiscountAccordingToDate`, `TTAR_PeriodicInstallments`, `TTAR_PaymentSchedule`. Acomba : Retourné sous forme de code texte, pas de valeur numérique. Attention : les codes diffèrent de ceux de SupplierPaymentTerm (TT_*) alors qu'ils désignent les mêmes concepts."
          },
          "EscompteJour_Escompte": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Pourcentage d'escompte accordé si le paiement est fait dans le délai Acomba : Pourcentage d'escompte si paiement dans le délai (EscompteJour_NbJour). Natif int, exposé en decimal."
          },
          "EscompteJour_NbJour": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Nombre de jours durant lesquels l'escompte s'applique Acomba : Nombre de jours durant lesquels l'escompte s'applique."
          },
          "EscompteJour_NbJourMax": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Nombre de jours avant échéance (net) Acomba : Nombre de jours avant échéance (net)."
          }
        },
        "additionalProperties": true
      },
      "Fournisseurs": {
        "type": "object",
        "description": "Gérez les fournisseurs à travers différents systèmes ERP avec une API REST unifiée. Créez, lisez et mettez à jour les fournisseurs pour Acomba, QuickBooks Online, Avantage, Sage 50 et autres systèmes ERP.\n\nL'entité Supplier représente un fournisseur dans votre système ERP. Cette API permet d'effectuer des opérations de lecture (GET), création (POST) et mise à jour (PUT) sur les fournisseurs de manière standardisée, peu importe le système ERP sous-jacent.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/Supplier - Récupérer une liste de fournisseurs\n\n- GET /Entity/Supplier/{id} - Récupérer un fournisseur spécifique\n\n- POST /Entity/Supplier - Créer un nouveau fournisseur\n\n- PUT /Entity/Supplier/{id} - Mettre à jour un fournisseur existant\n\n- **Note importante** : Les champs disponibles et requis varient selon le système ERP. La plupart des systèmes supportent les informations de base du fournisseur comme le nom, l'adresse et les coordonnées.\n- **Note** : Sage 50 supporte uniquement la lecture (GET) des fournisseurs. Acomba et QuickBooks Online offrent un support complet pour toutes les opérations. Avantage supporte la création mais pas la mise à jour.\n\n- **ExtendedProperties** : Le dictionnaire ExtendedProperties permet d'ajouter des attributs personnalisés spécifiques à certains ERP ou besoins d'affaires particuliers sans modifier le modèle de données principal.",
        "properties": {
          "NoFournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur (clé business) À la création — Acomba : requis, Autotask : optionnel, Avantage : requis, QuickBooksOnline : optionnel. Création : Acomba, Autotask, Avantage. Modification : Acomba, Autotask, Avantage, QuickBooksOnline. Filtrable (contains, eq, in, ne) — Acomba, Autotask, Avantage, QuickBooksOnline, Sage50. Acomba : Clé d'affaires (PKey_SuNumber, index 1). Max 20 caractères. Changement de valeur en UPDATE géré via ChangeSupplierNumber lorsque la clé est NoUniqueSystemeSource (CardPos). Autotask : Clé métier (CompanyNumber ou Id selon UseAccountIdForSupplierNumbering). Avantage : Clé du fournisseur. Requis à la création ET à la modification, mais NON modifiable : en W12 il identifie la fiche à corriger (numéro positionnel) et Avantage le protège en écriture. ProShop : Clé métier calculée. NON filtrable directement (lève une exception) : utiliser NoUniqueSystemeSource. QuickBooksOnline : = Id interne QBO (identique à NoUniqueSystemeSource). Interdit à la création (throw si fourni). Sert de clé pour l'UPDATE (GET par NoFournisseur)."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé unique interne de l'ERP Création : Acomba. Modification : Acomba. Filtrable (contains, eq, in, ne) — Autotask, Avantage, ProShop, QuickBooksOnline, Sage50. Acomba : Clé alternative (CardPos Acomba). Interdit en CreateOnly (signifie que le fournisseur existe déjà). Le filtrage EXTRACT par CardPos est présent en code mort (commenté) -> non filtrable actuellement. Autotask : Id AutoTask. ProShop : Nom du fournisseur ProShop. Filtrable via mode ListOfExternalIds. QuickBooksOnline : Id interne QBO du Vendor. Généré par QuickBooks (forcé à null à la création)."
          },
          "NomFournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom du fournisseur À la création — Acomba : requis, Autotask : non supporté, Avantage : requis, QuickBooksOnline : requis. Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (contains, eq, in, ne) — Avantage, ProShop, QuickBooksOnline, Sage50. Avantage : Requis à la création, optionnel en modification (non fourni = nom actuel conservé). ProShop : Filtrable via mode ListOfNames. QuickBooksOnline : Écrit à la fois DisplayName ET CompanyName ; relu depuis DisplayName."
          },
          "FicheNomComplet": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true,
            "description": "Format: \"{NoFournisseur} - {NomFournisseur}\""
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le fournisseur est actif (par défaut: true) Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (eq, ne) — Acomba, Avantage, QuickBooksOnline, Sage50. Acomba : Natif int 0/1. Filtre eq seulement (index actifs/inactifs 4/5). Avantage : Booléen inversé : EstActif ↔ EstInactif (FINACTIF) ; conversion appliquée au filtre. bool NON nullable qui vaut true par défaut : FINACTIF part donc TOUJOURS dans la requête, et une fiche construite de zéro RÉACTIVE un fournisseur inactif. ProShop : true si Status != 'inactive'. QuickBooksOnline : Filtrable pour Vendor (présent dans GetQBOVendorFilterField). Sage50 : Booléen inversé : bInactive=1 → EstActif=false. Sens de tri inversé côté Sage 50."
          },
          "Addresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse du fournisseur Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage. QuickBooksOnline : Orthographe du DTO Fournisseurs : 'Addresse' (double d). Sage50 : Champ composite (2 lignes d'adresse concaténées) → non filtrable/triable."
          },
          "Ville": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ville Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage, Sage50."
          },
          "Province": {
            "type": [
              "string",
              "null"
            ],
            "description": "Province/État Création : Avantage, QuickBooksOnline. Modification : Avantage, QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage, Sage50. Acomba : Lu seulement ; non poussé par UpdateInsertFournisseur."
          },
          "CodePostal": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code postal Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage, Sage50. Acomba : Validé (format CA X9X9X9 / US 99999) et normalisé (espaces retirés, majuscules) à l'écriture."
          },
          "Pays": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pays Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage, Sage50. Acomba : Écriture : mappé en code ISO 2 lettres (CANADA->CA, USA/STATES->US, sinon 2 premières lettres). Défaut CA."
          },
          "MRC": {
            "type": [
              "string",
              "null"
            ],
            "description": "MRC (Municipalité régionale de comté)"
          },
          "NomPersonneContact": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la personne contact Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage, Sage50. QuickBooksOnline : Tronqué à 25 caractères max côté QBO."
          },
          "SiteWeb": {
            "type": [
              "string",
              "null"
            ],
            "description": "Site web du fournisseur Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage, Sage50. QuickBooksOnline : Doit commencer par 'https://' sinon exception à l'écriture."
          },
          "ListeTelephonique": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/FicheTelephonique"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des numéros de téléphone"
          },
          "EmailPrincipal_Adresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel principale Création : Acomba, Avantage, QuickBooksOnline. Modification : Acomba, Avantage, QuickBooksOnline. Filtrable (contains, eq, ne) — Avantage, Sage50. QuickBooksOnline : Écrit seulement (non relu dans la conversion Vendor→Fournisseurs)."
          },
          "EmailPrincipal_Desc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du courriel principal Création : Acomba. Modification : Acomba."
          },
          "EmailPrincipal_EstDepotElectronique": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Dépôt électronique activé"
          },
          "EmailPrincipal_EstPublicite": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Accepte la publicité Création : Acomba. Modification : Acomba. Acomba : Poussé à l'écriture (int 0/1) ; non relu par ConvertirFournisseurAcomba."
          },
          "Email2_Adresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel secondaire Création : Acomba. Modification : Acomba."
          },
          "Email2_Desc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du courriel secondaire Création : Acomba. Modification : Acomba."
          },
          "Email2_EstDepotElectronique": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Dépôt électronique activé"
          },
          "Email2_EstPublicite": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Accepte la publicité Création : Acomba. Modification : Acomba. Acomba : Poussé à l'écriture seulement."
          },
          "Email3_Adresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel tertiaire Création : Acomba. Modification : Acomba."
          },
          "Email3_Desc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du courriel tertiaire Création : Acomba. Modification : Acomba."
          },
          "Email3_EstDepotElectronique": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Dépôt électronique activé"
          },
          "Email3_EstPublicite": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Accepte la publicité Création : Acomba. Modification : Acomba. Acomba : Poussé à l'écriture seulement."
          },
          "RepresentantNom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom du représentant Création : Acomba. Modification : Acomba."
          },
          "RepresentantEmail": {
            "type": [
              "string",
              "null"
            ],
            "description": "Courriel du représentant Création : Acomba. Modification : Acomba."
          },
          "RepresentantTelephone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Téléphone du représentant Création : Acomba. Modification : Acomba."
          },
          "RepresentantTelephoneExt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Extension téléphonique du représentant Création : Acomba. Modification : Acomba."
          },
          "ComptePayable": {
            "type": [
              "string",
              "null"
            ],
            "description": "Compte payable (Acomba) Création : Acomba, Avantage. Modification : Acomba, Avantage. Filtrable (contains, eq, ne) — Avantage. Avantage : Numéro de G/L des comptes à payer."
          },
          "CompteRecevableNo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Compte recevable (Acomba) Création : Acomba. Modification : Acomba."
          },
          "NoEnregistrementTaxeFederale": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro d'enregistrement TPS (Avantage) Création : Avantage. Filtrable (contains, eq, ne) — Avantage."
          },
          "NoEnregistrementTaxeProvinciale": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro d'enregistrement TVQ (Avantage) Création : Avantage. Filtrable (contains, eq, ne) — Avantage."
          },
          "NoCompteGLAchat": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de compte GL d'achat Création : Acomba. Modification : Acomba. Acomba : À l'écriture, le compte GL est validé via Charter.GetFromPrimaryKey (erreur si introuvable)."
          },
          "NoCompteGLAchat_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du compte GL d'achat Acomba : Lu seulement (CardPos du compte d'achat)."
          },
          "ExpenseAccountNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Compte de dépense par défaut (Avantage) Création : Avantage. Modification : Avantage. Avantage : 5 comptes GL (composite)."
          },
          "ExpenseAccountErpInternalId": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du compte de dépense"
          },
          "FournisseurPayerA_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Fournisseur à payer (si différent) Création : Avantage. Filtrable (contains, eq, ne) — Avantage. Acomba : Fournisseur 'Payer à'. Lu seulement."
          },
          "FournisseurPayerA_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du fournisseur à payer Acomba : Lu seulement."
          },
          "NoClientLiaison": {
            "type": [
              "string",
              "null"
            ],
            "description": "Client de liaison associé Filtrable (contains, eq, ne) — Avantage. Acomba : Numéro de client lié. Lu seulement. Avantage : Client associé (le même tiers vu de l'autre bord) ; pendant de CFOURNI sur la fiche client. LECTURE seule : le SDK accepte FCLIENT en écriture sans erreur mais n'établit jamais l'association — CreateSupplier/UpdateSupplier LÈVENT si ce champ est renseigné."
          },
          "TermeDePaiement_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Terme de paiement Création : Acomba, Avantage. Modification : Acomba, Avantage. Avantage : Mapping composite (conditions de paiement)."
          },
          "TermeDePaiement_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du terme de paiement Acomba : Lu seulement (CardPos du terme). En CREATE, SuPaymentTermCP n'est alimenté que depuis le fournisseur DEF."
          },
          "Projet_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de projet associé"
          },
          "Projet_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du projet"
          },
          "Langue": {
            "type": [
              "string",
              "null"
            ],
            "description": "Langue du fournisseur Création : Acomba, Avantage. Modification : Acomba, Avantage. Filtrable (eq, ne) — Avantage. Acomba : EXTRACT : LCID natif converti en CultureInfo.DisplayName. ÉCRITURE : SuLanguage n'est pas alimenté depuis la propriété unifiée ; uniquement copié depuis le fournisseur DEF à la création. Avantage : FFRA est un booléen Avantage (langue parlée = français). Converti en code ISO minuscule : T -> 'fr', F -> 'en'. Le filtre accepte le code ISO ou un booléen."
          },
          "DeviseParDefaut": {
            "type": [
              "string",
              "null"
            ],
            "description": "Devise par défaut Création : Avantage. Filtrable (contains, eq, ne) — Avantage."
          },
          "InternalNotes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Notes internes Création : Avantage. Modification : Avantage. Avantage : 5 lignes de notes (composite)."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, in, lt, lte, ne) — Acomba, Avantage, ProShop. Acomba : Horodatage système (lu via Supplier036.Key_SuTimeModified, index 6). Lecture et filtrage par plage seulement. Requiert Acomba >= 0036. ProShop : DateTime. Filtrable via mode LastModifiedDate et opérateurs de date. QuickBooksOnline : Horodatage QBO, lecture seule. Non filtrable. Sage50 : Champ composite date+heure (deux colonnes) → non filtrable/triable."
          },
          "ExtendedProperties": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Propriétés étendues personnalisées"
          }
        },
        "additionalProperties": true
      },
      "FicheProduitFournisseur": {
        "type": "object",
        "description": "Gérez les produits fournisseurs à travers différents systèmes ERP avec une API REST unifiée. Créez, mettez à jour et lisez les associations entre produits et fournisseurs pour Acomba et autres systèmes ERP.\n\nL'entité SupplierProduct (FicheProduitFournisseur) représente l'association entre un produit et un fournisseur dans votre système ERP. Cette entité permet de gérer les informations spécifiques au fournisseur pour un produit donné, telles que le numéro de catalogue fournisseur, le code UPC, le prix coûtant, et la quantité économique de commande.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/SupplierProduct - Récupérer une liste de produits fournisseurs\n\n- GET /Entity/SupplierProduct/{id} - Récupérer un produit fournisseur spécifique\n\n- POST /Entity/SupplierProduct - Créer un nouveau produit fournisseur\n\n- PUT /Entity/SupplierProduct/{id} - Mettre à jour un produit fournisseur existant\n\n- **Note importante** : Un produit fournisseur est une association entre un fournisseur et un produit. Cette entité permet de stocker les informations spécifiques au fournisseur comme son numéro de catalogue interne, son code UPC, et ses prix.\n\n- **Clés d'identification** : L'entité SupplierProduct utilise deux types de clés : • Clé interne : NoUniqueSystemeSource (Id Acomba) • Clé métier composite : No_Fournisseur + NoProduit_Fournisseur",
        "properties": {
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du produit chez le fournisseur Création : Acomba. Modification : Acomba."
          },
          "CodeUPC_Fournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code UPC du produit chez le fournisseur Création : Acomba. Modification : Acomba. Filtrable (eq) — Acomba. Acomba : Code UPC fournisseur (interface ProductSupplier, pas V3)."
          },
          "CodeUnite_Court": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code court de l'unité de mesure (max 3 caractères) Création : Acomba. Modification : Acomba. Acomba : Tronque a 3 caracteres en ecriture (Left(3))."
          },
          "CodeUnite_Long": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code long de l'unité de mesure (max 15 caractères) Création : Acomba. Modification : Acomba. Acomba : Tronque a 15 caracteres en ecriture (Left(15))."
          },
          "prix_ProchainCoutant": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix coûtant unitaire pour le prochain achat Création : Acomba. Modification : Acomba. Acomba : decimal cote unifie, double cote COM."
          },
          "Qte_Economique": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité économique de commande (EOQ) Création : Acomba. Modification : Acomba. Acomba : decimal cote unifie, double cote COM."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique interne du système ERP (Id Acomba) Création : Acomba. Modification : Acomba. Filtrable (eq, in) — Acomba. Acomba : CardPos interne Acomba. Cle d'acces direct (GetCard) en lecture; en ecriture, si fourni, sert a recuperer/reserver la fiche existante (UPSERT). Non assignable directement."
          },
          "NoUniqueSystemeSource_Fournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique interne du fournisseur dans le système ERP Création : Acomba. Modification : Acomba. Acomba : CardPos du fournisseur. En ecriture, alternative a No_Fournisseur pour identifier le fournisseur; ecrit dans PSSupplierCP a la creation. En lecture: PSSupplierCP.ToString()."
          },
          "No_Fournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur (clé métier) Création : Acomba. Modification : Acomba. Filtrable (eq) — Acomba. Acomba : En ecriture, resout le fournisseur (Supplier.GetFromPrimaryKey) pour alimenter PSSupplierCP; pas ecrit directement. En lecture, resolu via cache CardPos->Numero."
          },
          "NoProduit_Fournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de catalogue du produit chez le fournisseur (clé métier) Création : Acomba. Modification : Acomba. Filtrable (eq) — Acomba. Acomba : Numero de catalogue fournisseur. Cle metier (PKey_PSCatalogNumber). Obligatoire en CREATE si NoUniqueSystemeSource absent."
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le produit fournisseur est actif Acomba : Derive en lecture (PSStatus == 0). Non ecrit; un produit-fournisseur n'a pas d'etat actif/inactif, seulement supprime ou non."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date et heure de la dernière modification de la fiche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (gt, gte, lt, lte) — Acomba. Acomba : Horodatage systeme, lecture seule. Filtre applique en post-filtre."
          },
          "ExtendedProperties": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Propriétés étendues pour des attributs supplémentaires"
          }
        },
        "additionalProperties": true
      },
      "SupplierOrder": {
        "type": "object",
        "description": "Gérez les bons de commandes fournisseurs à travers différents systèmes ERP avec une API REST unifiée. Créez et lisez les bons de commandes pour Acomba, Avantage et autres systèmes ERP supportés.\n\nL'entité SupplierOrder représente un bon de commande fournisseur (achat) dans votre système ERP. Cette API permet d'effectuer des opérations de lecture (GET) et de création (POST) sur les bons de commandes de manière standardisée, peu importe le système ERP sous-jacent.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/SupplierOrder - Récupérer une liste de bons de commandes fournisseurs\n\n- GET /Entity/SupplierOrder/{id} - Récupérer un bon de commande spécifique\n\n- POST /Entity/SupplierOrder - Créer un nouveau bon de commande fournisseur\n\n- **Note importante** : Les champs disponibles et requis varient selon le système ERP. Les bons de commandes incluent généralement un en-tête avec les informations fournisseur, ainsi que des lignes de détail pour chaque produit commandé.\n\nModèle unifié : `FicheTransactions` (partagé avec d'autres entités de même nature).\n\n- **ExtendedProperties** : Les objets FicheTransactions et LigneTransactions supportent également un dictionnaire ExtendedProperties pour des propriétés personnalisées ou spécifiques à un ERP.\n- **InfoClientFacturerA / InfoClientLivrerA (type FicheClient)** : Ces deux objets sont des FicheClient complètes (mêmes champs qu'une fiche Client : Adresse, Ville, CodePostal, Pays, personne-contact, téléphones) — voir la page Client. Particularité Achat : InfoClientFacturerA porte en réalité le FOURNISSEUR (Acomba stocke un CardPos polymorphe qui pointe vers un client OU un fournisseur selon le type de transaction), tandis que InfoClientLivrerA porte le client à livrer.",
        "properties": {
          "NoFacture": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du bon de commande Création : Acomba. Modification : Acomba. Filtrable (contains, eq, in, ne) — Acomba, Avantage. Acomba : Numéro du document (no d'achat). Filtre par index : fetch immédiat. Assignable au CREATE pour les achats (type != Facture). Avantage : N° de commande séquentiel (7 car.)."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source ERP Création : Acomba. Modification : Acomba. Filtrable (contains, eq, in, ne) — Acomba, Avantage. Acomba : CardPos Acomba (clé surrogate). Sert de clé d'identification pour UPDATE (UpdateTransaction via ReserveCard). Avantage : N° séquentiel (9 car.)."
          },
          "TypeDoc": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "enum": [
              "Achats"
            ],
            "description": "Type de document (ACHATS pour bon de commande fournisseur) Énumération : la valeur est un texte ou un entier selon l'ERP. À la création — Acomba : requis. Valeurs permises : `Achats`. Création : Acomba. Modification : Acomba. Acomba : Pour SupplierOrder, mappé à AcoSDK.InvoicingType.ITp_Purchase (SI_ExtractContentType.Achats)."
          },
          "DateFacture": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date du bon de commande Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba. Modification : Acomba. Filtrable (eq, gt, gte, lt, lte, ne) — Acomba, Avantage. Acomba : Filtre par index date (index 6). Plage haute+basse possible. Avantage : Date de réception."
          },
          "Référence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de référence externe (ex: PO du système appelant) Création : Acomba. Modification : Acomba. Acomba : Tronqué à 30 caractères au CREATE. Filtre post-extraction présent dans le code (eq/ne) mais non déclaré dans ListAllowedFilter."
          },
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description générale du bon de commande Création : Acomba. Modification : Acomba. Acomba : Tronqué à 255 caractères au CREATE. Filtre post-extraction présent dans le code (eq/ne) mais non déclaré dans ListAllowedFilter."
          },
          "Fournisseur_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur Filtrable (contains, eq, ne) — Avantage."
          },
          "Fournisseur_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du fournisseur dans l'ERP"
          },
          "InfoClientFacturerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Objet FicheClient complet (voir la page Client). ⚠️ Dans un Achat, porte en réalité le FOURNISSEUR malgré le nom."
          },
          "InfoClientLivrerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Adresse de livraison (ship-to) — objet FicheClient complet (voir la page Client) : le client à livrer."
          },
          "TotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total incluant les taxes Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Acomba : Calculé par Acomba."
          },
          "SousTotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Sous-total avant taxes Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Acomba : Calculé par Acomba. En sortie au résultat de création."
          },
          "FraisDeTransport": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Frais de livraison ou de transport Création : Acomba. Modification : Acomba. Acomba : Extract : somme InSales_Shipping[1..5] + lignes IL_Shipping. CREATE/UPDATE : ajouté via ligne IL_Shipping (AjouterFraisTransport)."
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de projet associé Création : Acomba. Modification : Acomba. Filtrable (contains, eq, ne) — Avantage. Acomba : Assigné par numéro si pas de CardPos."
          },
          "EmployeResponsable_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'employé responsable de la commande"
          },
          "LigneFacture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LigneTransactions"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de détail du bon de commande"
          },
          "ListeDesTaxes": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InfoTaxe"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Détail des taxes calculées"
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le bon de commande est actif Acomba : Extract : EstActif = (InStatus == 0). Les transactions supprimées (InStatus != 0) sont ignorées."
          },
          "DateExpirationDocument": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date d'expiration du bon de commande Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba. Modification : Acomba."
          }
        },
        "additionalProperties": true
      },
      "SupplierOrderReceiptHeader": {
        "type": "object",
        "description": "Gérez les réceptions de commandes fournisseurs à travers différents systèmes ERP avec une API REST unifiée. Enregistrez la réception de marchandises liées à vos commandes d'achat et mettez à jour automatiquement les quantités reçues.\n\nL'entité SupplierOrderReceipt représente une réception de commande fournisseur (achat) dans votre système ERP. Cette API permet d'enregistrer la réception de marchandises liées à une commande d'achat existante, mettant à jour les quantités reçues et le statut de livraison.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- POST /Entity/SupplierOrderReceipt - Enregistrer une nouvelle réception de commande fournisseur\n\n- **Note importante** : La réception de commande fournisseur est liée à une commande d'achat existante. Vous devez fournir le numéro de la commande fournisseur de référence ainsi que les détails des lignes reçues (numéro de ligne, produit, quantité reçue).",
        "properties": {
          "SupplierOrderNumberReference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la commande fournisseur associée à cette réception Création : Acomba. Acomba : Clé : numéro de l'achat (SupplierOrder) à recevoir. Obligatoire. Sert à auto-fetch l'achat existant via GetInvoices.ExtractByQuerySettings (filtre interne FicheTransactions.NoFacture = Equals). Pas de membre AcoSDK directement lié."
          },
          "ReceiptDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la réception de la commande fournisseur Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba. Acomba : Date de réception. Obligatoire (rejet si null/default). Transmise à AcoSDK.InvoicingLine.PurchaseReceipt en paramètre date."
          },
          "ReceiptLines": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SupplierOrderReceiptLine"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de réception associées"
          },
          "Id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé unique de l'entête de réception de commande fournisseur"
          },
          "IssueDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de création du document de réception Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "Note": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note ou commentaire associé à la réception"
          },
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de la réception"
          },
          "SupplierNumberReference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur associé à cette réception"
          },
          "ShippingReference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Référence de l'expédition associée à cette réception"
          },
          "IsComplete": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si la réception est complète"
          },
          "ErpInternalId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé unique du système comptable (ERP)"
          }
        },
        "additionalProperties": true
      },
      "SupplierOrderReceiptLine": {
        "type": "object",
        "properties": {
          "LineNumber": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de ligne de la réception (correspond à la ligne de l'achat original)"
          },
          "ProductNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du produit ou service associé à cette ligne"
          },
          "QuantityReceived": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité reçue du produit"
          },
          "Id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé unique de la ligne de réception"
          },
          "ProductCondition": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de la condition du produit (Neuf, Endommagé, etc.)"
          },
          "Note": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note sur la ligne de réception"
          },
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de la ligne"
          },
          "QuantityToReceive": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité restante à recevoir"
          },
          "QuantityOrdered": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité commandée du produit"
          },
          "QuantityBackordered": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité en rupture de stock"
          },
          "QuantityInvoiced": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité facturée du produit"
          },
          "QuantityReturned": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité retournée du produit"
          },
          "ErpInternalId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé unique du système comptable (ERP)"
          }
        },
        "additionalProperties": true
      },
      "SupplierInvoice": {
        "type": "object",
        "description": "Gérez les factures fournisseurs à travers différents systèmes ERP avec une API REST unifiée. Créez et lisez les factures fournisseurs pour Acomba, QuickBooks Online, Avantage, Sage 50 et autres systèmes ERP.\n\nL'entité SupplierInvoice représente une facture fournisseur dans votre système ERP. Cette API permet d'effectuer des opérations de lecture (GET), de création (POST) et de modification (PUT) sur les factures fournisseurs de manière standardisée, peu importe le système ERP sous-jacent.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/SupplierInvoice - Récupérer une liste de factures fournisseurs\n\n- GET /Entity/SupplierInvoice/{id} - Récupérer une facture fournisseur spécifique\n\n- POST /Entity/SupplierInvoice - Créer une nouvelle facture fournisseur\n\n- **Note importante** : Les champs disponibles et requis varient selon le système ERP. Les factures fournisseurs incluent généralement un en-tête avec les informations du fournisseur, ainsi que des lignes de détail pour chaque produit/service acheté.\n\nModèle unifié : `FicheTransactions` (partagé avec d'autres entités de même nature).\n\n- **ExtendedProperties** : Le dictionnaire ExtendedProperties permet d'ajouter des attributs personnalisés spécifiques à certains ERP ou besoins d'affaires particuliers sans modifier le modèle de données principal.\n- **InfoClientFacturerA / InfoClientLivrerA (type FicheClient)** : Ces deux objets sont des FicheClient complètes (mêmes champs qu'une fiche Client — voir la page Client). ⚠️ Pour une facture fournisseur, les deux portent en réalité un FOURNISSEUR malgré le nom « Client » : InfoClientFacturerA = fournisseur « payer à », InfoClientLivrerA = fournisseur de base (équivalent de Fournisseur_No) — ce n'est PAS une adresse de livraison.",
        "properties": {
          "NoFacture": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la facture fournisseur (clé business) Création : Acomba, QuickBooksOnline, Sage50. Modification : Acomba, QuickBooksOnline. Filtrable (contains, eq, in, ne) — Acomba, Avantage, ProShop, QuickBooksOnline, Sage50. Acomba : Cle naturelle (PKey_InInvoiceNumber). EXTRACT par NoFacture exige Fournisseur_No compagnon. Avantage : N° de facture fournisseur. ProShop : N° de facture fournisseur (ReferenceNumber ; sinon BillId). Filtrable via mode ListOfExternalIds."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé unique interne de l'ERP Modification : QuickBooksOnline. Filtrable (contains, eq, in, ne) — Acomba, Avantage, ProShop, QuickBooksOnline, Sage50. Acomba : Cle surrogate (CardPos TransAP). Renseignee par le SDK apres AddCard, non poussable. Avantage : Clé (6 car.). ProShop : ID interne du bill ProShop. QuickBooksOnline : Id interne QBO. Forcé à null à la création ; OBLIGATOIRE à l'UPDATE (clé)."
          },
          "TypeDoc": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Type de document (doit être 'ACHATS' pour facture fournisseur) Énumération : la valeur est un texte ou un entier selon l'ERP. Acomba : Fixe a FacturesFournisseurs a l'extraction (constante, pas un membre natif). Sage50 : Constante SI_ExtractContentType.FacturesFournisseurs."
          },
          "Référence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Référence du document (ex: numéro de bon de commande) Création : Acomba. Modification : Acomba. Filtrable (eq, ne) — QuickBooksOnline. QuickBooksOnline : = DocNumber (alias de NoFacture en lecture)."
          },
          "NoAutorisation": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro d'autorisation du document"
          },
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description générale de la facture Création : Acomba. Modification : Acomba. Filtrable (contains, eq, ne) — Avantage. Avantage : Description de transaction (50 car.)."
          },
          "DateFacture": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la facture fournisseur Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba, QuickBooksOnline, Sage50. Modification : Acomba, QuickBooksOnline. Filtrable (eq, gt, gte, lt, lte, ne) — Acomba, Avantage, QuickBooksOnline, Sage50."
          },
          "CodeUsagerCreation": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code de l'utilisateur ayant créé le document"
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification du document Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, in, lt, lte) — Acomba, ProShop. Acomba : Horodatage systeme. Pas d'index Acomba : filtrage applique mecaniquement apres GetCard. Avantage : Non mappé dans la source : forcé à 1900-01-01."
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le document est actif Acomba : Calcule a l'extraction (InActive != 0 && InStatus == 0). ProShop : Constante true."
          },
          "SousTypeTransaction": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sous-type de transaction (crédit, facture normale, etc.) Création : Acomba. Modification : Acomba. Acomba : EXTRACT = InType.ToString(). En ecriture, InType est deduit (IT_Invoice, ou IT_Credit si 1ere ligne < 0), pas lu du payload. ProShop : Constante 'Bill'."
          },
          "NoteGlobaleExterne01": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note globale externe visible sur le document Création : QuickBooksOnline, Sage50. Modification : QuickBooksOnline. Sage50 : Écriture seule (commentaire additionnel)."
          },
          "EstInversee": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si la facture a été inversée"
          },
          "RaisonInversement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Raison de l'inversement du document"
          },
          "ReferenceInversement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Référence du document d'inversement"
          },
          "Fournisseur_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur (clé business) Création : Acomba. Modification : Acomba. Filtrable (contains, eq, in, ne) — Acomba, Avantage. Acomba : No fournisseur de base (InfoClientLivrerA). En CREATE alimente InSupplierNumber via le payload sous-objet. Filtre eq seul; sert aussi de compagnon obligatoire au filtre NoFacture."
          },
          "Fournisseur_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé interne du fournisseur dans l'ERP"
          },
          "InfoClientFacturerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Objet FicheClient complet (voir la page Client). ⚠️ Porte le FOURNISSEUR « payer à » malgré le nom « Client »."
          },
          "InfoClientLivrerA": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FicheClient"
              },
              {
                "type": "null"
              }
            ],
            "description": "Objet FicheClient complet (voir la page Client). ⚠️ Porte le FOURNISSEUR de base (≡ Fournisseur_No), PAS une adresse de livraison."
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du projet associé Filtrable (contains, eq, in, ne) — Avantage."
          },
          "NoProjet_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne du projet dans l'ERP"
          },
          "EmployeResponsable_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'employé responsable"
          },
          "EmployeResponsable_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne de l'employé responsable"
          },
          "TotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total de la facture (taxes incluses) Création : Acomba. Modification : Acomba. Filtrable (eq, gt, gte, lt, lte, ne) — Avantage, QuickBooksOnline, Sage50. Acomba : En ecriture, recalcule depuis LigneFacture[0].PrixFinal (valeur entrante ignoree). QuickBooksOnline : Calculé par QBO. Sage50 : Filtre non combinable avec d'autres filtres (limite SDK)."
          },
          "SousTotalFacture": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Sous-total de la facture (avant taxes) Création : Acomba. Modification : Acomba. Acomba : En ecriture, recalcule (total - taxes - escompte/transport) si nul/0; valeur InSubTotal forcee en absolu. Avantage : Même colonne que TotalFacture (PTOTAL)."
          },
          "MontantNonPaye": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Solde impayé sur la facture Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Avantage : Solde dû."
          },
          "FraisDeTransport": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Frais de transport/livraison"
          },
          "Montant_Retrait": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant du retrait"
          },
          "Montant_ChangeRemit": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant de change remis"
          },
          "Montant_Depot": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant du dépôt"
          },
          "Montant_MonnaieRecu": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant de monnaie reçu"
          },
          "boolUtiliserMontantMonnaieRecu": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si on utilise le montant de monnaie reçu"
          },
          "Devise": {
            "type": [
              "string",
              "null"
            ],
            "description": "Devise de la facture (CAD, USD, etc.) Création : QuickBooksOnline. Modification : QuickBooksOnline. Filtrable (eq) — ProShop. QuickBooksOnline : Écriture : défaut CAD. Lecture actuellement inopérante (condition inversée dans le code : n'assigne que si value est vide)."
          },
          "ListeDesTaxes": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InfoTaxe"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des taxes appliquées sur la facture ProShop : STUB v1 : TaxType non mappé dans ListeDesTaxes. TODO."
          },
          "ComptePayable_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du compte payable (Acomba) Création : Acomba. Modification : Acomba. Acomba : EXTRACT = InPayable.ToString(). En CREATE, InPayable = valeur si numerique, sinon 0."
          },
          "CompteRecevable_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du compte recevable (Acomba) Création : QuickBooksOnline. Modification : QuickBooksOnline. QuickBooksOnline : Compte principal OBLIGATOIRE. Résolu par Name. Validé selon le type de paiement : Check → compte Bank ; CreditCard → compte CreditCard."
          },
          "OptionsTaxesForcees": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SettingForcedTaxes"
              },
              {
                "type": "null"
              }
            ],
            "description": "Options de taxes forcées sur la facture"
          },
          "TermeDePaiement": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TermeDePaiement"
              },
              {
                "type": "null"
              }
            ],
            "description": "Objet contenant les conditions de paiement ProShop : NON entièrement mappé (TODO)."
          },
          "TermePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Obsolète - Utiliser TermeDePaiement à la place QuickBooksOnline : Lecture seule : = purchase.PaymentType.ToString(). Pour l'écriture, utiliser TermeDePaiement."
          },
          "NoCommandeRéférence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de commande d'achat de référence"
          },
          "NoCommandeRéférence_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne de la commande de référence"
          },
          "NoSoumissionRéférence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de soumission de référence"
          },
          "NoSoumissionRéférence_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne de la soumission de référence"
          },
          "NoLivraison01Référence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de livraison de référence"
          },
          "NoLivraison01Référence_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne de la livraison de référence"
          },
          "NoFacture01Référence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de facture de référence"
          },
          "NoFacture01Référence_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID interne de la facture de référence"
          },
          "DateExpirationDocument": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date d'expiration du document Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Acomba : Force a null a l'extraction (anti-crash CloudBI), pas de membre natif lu."
          },
          "LigneFacture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LigneTransactions"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de détail de la facture Création : Sage50. ProShop : STUB v1 : les lignes du bill (partDescription, quantity, pricePer, totalDollars, accountNumber, taxType) existent côté ProShop mais NE SONT PAS mappées vers LigneFacture[]. TODO. Sage50 : Collection de lignes (sous-entité). Requise à la création (>= 1)."
          },
          "NbLignes": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "readOnly": true,
            "description": "Nombre de lignes dans la facture"
          },
          "NbLignes_DocumentOriginal": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Nombre de lignes du document original (avant modification)"
          },
          "ListeReglementFournisseur": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/APPayment"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des paiements fournisseur associés"
          },
          "ctrl_Update_AncienNombreLigne": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Ancien nombre de lignes (contrôle interne)"
          },
          "ctrl_InfoCreation_NomUsagerWindows": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de l'utilisateur Windows ayant créé le document"
          },
          "ctrl_InfoCreation_NomLogiciel": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom du logiciel ayant créé le document"
          },
          "ctrl_InfoCreation_NomPoste": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom du poste ayant créé le document"
          },
          "ctrl_NoDocumentLocal": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de document local (avant création dans l'ERP)"
          },
          "ExtendedProperties": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Propriétés étendues personnalisées"
          }
        },
        "additionalProperties": true
      },
      "APPayment": {
        "type": "object",
        "description": "Gérez les paiements/règlements fournisseurs à travers différents systèmes ERP avec une API REST unifiée. Lisez et créez les paiements pour Acomba, Sage 50, Avantage et autres systèmes ERP. Un règlement peut concerner une ou plusieurs factures fournisseurs et utiliser différents modes de paiement (chèque, dépôt direct, etc.).\n\nL'entité SupplierInvoicePayment (APPayment) représente un règlement fournisseur dans votre système ERP. Un règlement est une transaction de paiement qui peut être appliquée à une ou plusieurs factures fournisseurs, et utilise différents modes de paiement (chèque, dépôt direct, réception de caisse, etc.).\n\n- GET /Entity/SupplierInvoicePayment - Récupérer une liste de paiements fournisseurs\n\n- GET /Entity/SupplierInvoicePayment/{id} - Récupérer un paiement spécifique\n\n- POST /Entity/SupplierInvoicePayment - Créer un nouveau paiement fournisseur (Acomba et Sage 50)",
        "properties": {
          "NumeroPaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du paiement (chèque, dépôt direct, etc.) Création : Acomba. Acomba : Obligatoire en CREATE uniquement pour Check et DirectDeposit ; doit etre un entier. Avantage : N° de chèque/confirmation (composite, conversion int↔string)."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique interne du système ERP Filtrable (contains, eq, in, ne) — Avantage, Sage50. Acomba : Sortie en CREATE (assigne depuis CardPos apres ReserveCard) ; lu en EXTRACT. Avantage : N° de paiement (9 car.), clé. Filtré via l'invoice (PCOMPTE) lors d'un Expand."
          },
          "Fournisseur_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur payé À la création — Acomba : requis, Sage50 : requis. Création : Acomba, Sage50. Filtrable (contains, eq, ne) — Sage50. Acomba : Cle fournisseur. Si NoUniqueSystemeSource absent, sert a resoudre PaSupplierCP via Supplier. Sage50 : Nom du fournisseur. Requis à la création."
          },
          "Fournisseur_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "ID unique système du fournisseur Création : Acomba. Filtrable (eq, in, ne) — Sage50. Acomba : CardPos fournisseur. Prioritaire sur Fournisseur_No en CREATE."
          },
          "DatePaiement": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date du paiement Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. À la création — Acomba : optionnel, Sage50 : requis. Création : Acomba, Sage50. Filtrable (eq, gt, gte, lt, lte, ne) — Avantage, Sage50. Acomba : Defaut DateTime.Now si null en CREATE. Avantage : Date du paiement (10 car.). Sage50 : Requis à la création."
          },
          "DateNotification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de notification du paiement Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "TotalPaiement": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total du paiement À la création — Acomba : requis, Sage50 : requis. Création : Acomba, Sage50. Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Acomba : Montant total du paiement (header). Avantage : Montant (N 12.2). Sage50 : Requis à la création (> 0)."
          },
          "TotalEscompte": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Total des escomptes/rabais accordés À la création — Acomba : requis, Sage50 : non supporté. Création : Acomba. Acomba : Escompte total du paiement (header)."
          },
          "ReferencePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Référence externe du paiement Filtrable (contains, eq, in, ne) — Avantage, Sage50. Avantage : Référence de séquence bancaire (6 car.)."
          },
          "DescriptionPaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description/note du paiement"
          },
          "TypePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type/mode du paiement (Check, CashReceipt, etc.) À la création — Acomba : requis, Sage50 : optionnel. Valeurs permises — Acomba : `Check` / `CashReceipt` / `PaymentOnHold` / `DirectDepositOnHold` / `DirectDeposit`. Création : Acomba. Acomba : Enum ModePaiementFournisseur (Check, CashReceipt, PaymentOnHold, DirectDepositOnHold, DirectDeposit) ; converti vers PaymentAPType. Sage50 : 0=Cash, 1=Chèque, >=2=Carte de crédit."
          },
          "NoCompteGLBanque": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du compte GL de banque À la création — Acomba : requis, Sage50 : requis. Création : Acomba, Sage50. Filtrable (contains, eq, in, ne) — Avantage. Acomba : Entier requis en CREATE ; resout aussi PaBankCP via Charter. Non lu en EXTRACT (BankInfo_* le sont). Avantage : Compte GL banque (5 car.). Sage50 : Requis à la création (compte GL banque, écrit dans tJourEnt). Non extrait."
          },
          "BankInfo_InstitutionNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro d'institution bancaire Acomba : Lu en EXTRACT seulement."
          },
          "BankInfo_BranchNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de succursale bancaire Acomba : Lu en EXTRACT seulement."
          },
          "BankInfo_AccountNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de compte bancaire Acomba : Lu en EXTRACT (ConvertAPPaymentAcombaToSolinfo affecte PaBankNumber.ToString()). Non ecrit en CREATE."
          },
          "Recevable": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Indicateur de compte recevable"
          },
          "Date_FicheDerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Acomba : Horodatage systeme, lecture seule."
          },
          "ListePaiement": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/Paiement"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des modes de paiement utilisés Sage50 : STUB : champ non implémenté (TODO)."
          },
          "Liste_PaiementFacture": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/InvoicePayment"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des factures payées avec montants À la création — Acomba : requis, Sage50 : requis. Création : Sage50. Sage50 : Collection des factures réglées (JOIN tVenTrDt.NTranType=1). Requise à la création (>= 1)."
          }
        },
        "additionalProperties": true
      },
      "AccountPayableSettings": {
        "type": "object",
        "description": "Consultez les paramètres de configuration des comptes payables à travers différents systèmes ERP avec une API REST unifiée. Récupérez les comptes GL par défaut, les configurations de frais de transport, d'escomptes et autres paramètres pour Acomba et autres systèmes ERP.\n\nL'entité AccountPayableSettings représente les paramètres de configuration du module des comptes payables (fournisseurs) dans votre système ERP. Cette API permet de récupérer les configurations comptables par défaut utilisées pour les transactions fournisseurs de manière standardisée, peu importe le système ERP sous-jacent.\n\n- Compte GL par défaut : Compte utilisé pour les comptes payables (passif courant)\n\n- Compte GL de transport : Compte utilisé pour les frais de livraison/expédition reçus\n\n- Compte GL d'escompte : Compte utilisé pour les rabais et escomptes obtenus des fournisseurs\n\n- Nom de configuration : Description de la configuration (jusqu'à 20 configurations dans Acomba)\n\n- GET /Entity/AccountPayableSettings - Récupérer les paramètres de comptes payables\n\n- **Note importante** : Cette entité est en lecture seule. Les paramètres de comptes payables doivent être configurés directement dans le système ERP source. L'API permet uniquement de consulter la configuration actuelle pour validation et intégration. Acomba permet jusqu'à 20 configurations de comptes payables différentes (numérotées de 0 à 19).\n- **Implémentation Acomba** : AccountPayableSettings est implémenté et disponible pour Acomba. L'implémentation permet d'extraire toutes les configurations de comptes payables (jusqu'à 20 configurations simultanées numérotées de 0 à 19).\n\n- **Spécificités Acomba** : Dans Acomba, lorsqu'un compte GL n'est pas configuré, la valeur \"0\" est retournée. L'implémentation convertit automatiquement cette valeur en null pour plus de clarté. Les 20 configurations possibles (0-19) correspondent aux propriétés indexées PADescription[i], PaAccountPayableNumber[i], etc.",
        "properties": {
          "ErpInternalId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Filtrable (eq, in) — Acomba. Acomba : Cle. Index de la configuration 0..19 (i.ToString() dans la boucle), pas un membre COM distinct. Seul champ filtrable, via AllowedFilters (Equals/InList)."
          },
          "Name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Acomba : Description de la configuration (PADescription[i])."
          },
          "DefaultGLAccountNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Acomba : Numero du compte GL comptes payables (PaAccountPayableNumber[i]). '0' normalise en null."
          },
          "DefaultGLAccountErpInternalId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Acomba : CardPos du compte GL comptes payables (PaAccountPayableCP[i]). '0' est normalise en null par ValidateValue."
          },
          "FreightGLAccountNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Acomba : Numero du compte GL transport/freight (PaShippingNumber[i]). '0' normalise en null."
          },
          "FreightGLAccountErpInternalId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Acomba : CardPos du compte GL transport/freight (PaShippingCP[i]). '0' normalise en null."
          },
          "DiscountGLAccountNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "Acomba : Numero du compte GL escompte (PaDiscountNumber[i]). '0' normalise en null."
          },
          "DiscountGLAccountErpInternalId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Acomba : CardPos du compte GL escompte (PaDiscountCP[i]). '0' normalise en null."
          },
          "ExtendedProperties": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Acomba : Dictionnaire d'extension du DTO. Jamais peuple par ExtractByQuerySettings."
          }
        },
        "additionalProperties": true
      },
      "SupplierPaymentTerm": {
        "type": "object",
        "description": "Consultez les termes de paiement fournisseur configurés dans vos systèmes ERP avec une API REST unifiée. Récupérez la description, le pourcentage d'escompte et les délais derrière le code de terme porté par une fiche fournisseur.\n\nL'entité SupplierPaymentTerm représente un **terme de paiement fournisseur** (comptes payables) : la définition complète derrière le code de terme qu'une fiche fournisseur porte dans son champ `TermeDePaiement_No`. Sans cette entité, un intégrateur qui lit `TermeDePaiement_No = 3` sur un fournisseur n'a aucun moyen d'afficher « 2 % 10 jours, net 30 », de calculer une date d'échéance ou d'appliquer un escompte.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/SupplierPaymentTerm - Récupérer la liste des termes de paiement fournisseur\n\n- **Deux tables distinctes, à ne pas confondre** : les termes fournisseur (SupplierPaymentTerm) et les termes client (CustomerPaymentTerm) sont deux tables indépendantes, avec des clés séparées. Un numéro de terme fournisseur et un numéro de terme client qui portent le même chiffre n'ont **aucun rapport**. Interrogez l'entité correspondant au côté que vous traitez.\n\nModèle unifié : `TermeDePaiement` (partagé avec d'autres entités de même nature).\n\n- **Lecture seule** : aucune opération de création, de modification ou de suppression n'est offerte sur les termes de paiement. Ils se configurent dans l'ERP.\n- **Termes à versements et échéanciers** : les champs propres aux termes à versements périodiques et à échéancier personnalisé (périodicité, nombre de versements, dates d'échéancier) ne sont pas extraits. Les termes à escompte — le cas courant — sont complets.",
        "properties": {
          "NoTermeDePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du terme tel qu'affiché dans l'ERP. C'est la valeur portée par `Supplier.TermeDePaiement_No`. Acomba : Clé d'affaires. Numéro du terme tel qu'affiché dans Acomba ; c'est la valeur portée par Supplier.SuPaymentTermNumber. Lu via .ToString()."
          },
          "NoTermeDePaiement_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source (CardPos dans Acomba) Acomba : Clé alternative (surrogate key). Lu via Key_PTCardPos.ToString() ; c'est la valeur portée par Supplier.SuPaymentTermCP."
          },
          "NomTermeDePaiement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description lisible du terme (ex. « 2 % 10 jours, net 30 ») Acomba : Description lisible du terme."
          },
          "TypeTerme": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "TT_Min",
              "TT_DiscountAccordingToDate",
              "TT_PeriodicInstallments",
              "TT_PaymentSchedule"
            ],
            "description": "Type de terme, en code texte : `TT_DiscountAccordingToDate` (escompte selon la date de paiement), `TT_PeriodicInstallments` (versements périodiques), `TT_PaymentSchedule` (échéancier personnalisé), `TT_Min` (non défini) Valeurs permises : `TT_Min`, `TT_DiscountAccordingToDate`, `TT_PeriodicInstallments`, `TT_PaymentSchedule`. Acomba : Retourné sous forme de code texte, pas de valeur numérique. Attention : les codes diffèrent de ceux de CustomerPaymentTerm (TTAR_*) alors qu'ils désignent les mêmes concepts."
          },
          "EscompteJour_Escompte": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Pourcentage d'escompte accordé si le paiement est fait dans le délai Acomba : Pourcentage d'escompte si paiement dans le délai (EscompteJour_NbJour). Natif int, exposé en decimal."
          },
          "EscompteJour_NbJour": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Nombre de jours durant lesquels l'escompte s'applique Acomba : Nombre de jours durant lesquels l'escompte s'applique."
          },
          "EscompteJour_NbJourMax": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Nombre de jours avant échéance (net) Acomba : Nombre de jours avant échéance (net)."
          }
        },
        "additionalProperties": true
      },
      "FicheProduits": {
        "type": "object",
        "description": "Gérez les produits à travers différents systèmes ERP avec une API REST unifiée. Créez, lisez et mettez à jour les informations de produits incluant les prix, inventaire et classifications pour Acomba, QuickBooks Online et autres systèmes ERP.\n\nL'entité Product représente un produit ou un article dans votre système ERP. Cette API permet d'effectuer des opérations CRUD (Create, Read, Update) sur les produits de manière standardisée, incluant les informations de prix, d'inventaire et de classification.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/Product - Récupérer une liste de produits\n\n- GET /Entity/Product/{id} - Récupérer un produit spécifique\n\n- POST /Entity/Product - Créer un nouveau produit\n\n- PUT /Entity/Product/{id} - Mettre à jour un produit existant\n\n- **Note importante** : Les champs disponibles et requis varient selon le système ERP. Consultez la matrice de support ci-dessous pour connaître les opérations supportées par chaque système.\n\n- **Produits segmentés** : Acomba supporte la segmentation de produits par caractéristiques (couleur, taille, etc.). Ces propriétés permettent de gérer les variantes de produits.",
        "properties": {
          "NoProduit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code/numéro du produit (clé business) À la création — Acomba : requis, Autotask : optionnel. Création : Acomba, Autotask. Modification : Acomba, Autotask. Filtrable (contains, eq, in, ne) — Acomba, Autotask, QuickBooksOnline. Acomba : Clé. Changement de numéro via ChangeProductNumber. Nom natif à confirmer. Autotask : Clé métier. QuickBooksOnline : Nom de l'Item (sert de clé lors de la résolution des lignes de facture par nom)."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Clé unique interne de l'ERP Création : Acomba. Modification : Acomba. Filtrable (eq, in, ne) — Acomba, Autotask, QuickBooksOnline. Acomba : Clé alternative (CardPos). Nom natif à confirmer. Autotask : Id AutoTask du produit. QuickBooksOnline : Id interne de l'Item QBO."
          },
          "Description1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description principale À la création — Acomba : requis, Autotask : non supporté. Création : Acomba. Modification : Acomba. Filtrable (eq, ne, startswith) — Acomba, QuickBooksOnline."
          },
          "Description2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description secondaire"
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le produit est actif Création : Acomba, Autotask. Modification : Acomba, Autotask. Filtrable (eq, ne) — Acomba, Autotask."
          },
          "PrixVendant_Liste0_Prix1": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix de vente niveau 1"
          },
          "PrixCoutant_DernierCoutant": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Dernier prix coûtant"
          },
          "Inventaire_QteEnMain": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité physique en stock Filtrable (eq, gt, gte, lt, lte, ne) — QuickBooksOnline."
          },
          "Inventaire_QteDisponible": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité disponible à la vente"
          },
          "CodeUPC1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code UPC/barre Création : Acomba. Modification : Acomba. Filtrable (startswith) — Acomba."
          },
          "GroupeProduit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GroupeProduit"
              },
              {
                "type": "null"
              }
            ],
            "description": "Groupe/catégorie du produit"
          },
          "Description3": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description tertiaire"
          },
          "Description_Courte1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description courte 1"
          },
          "CodeUnite_Court": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code d'unité court (ex: UN, BTE)"
          },
          "CodeUnite_Long": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description longue de l'unité"
          },
          "PrixVendant_Liste0_Prix2-5": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix de vente additionnels (niveaux 2 à 5)"
          },
          "PrixCoutant_ProchainCoutant": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prochain prix coûtant"
          },
          "Inventaire_Localisation": {
            "type": [
              "string",
              "null"
            ],
            "description": "Localisation dans l'entrepôt"
          },
          "GroupeProduit.CodeGroupe": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code du groupe de produit QuickBooksOnline : Nom de la catégorie parente (si l'Item a un ParentRef)."
          },
          "ListeProduitsFournisseurs": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/FicheProduitFournisseur"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des fournisseurs du produit"
          },
          "No_Fournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur dans l'ERP Requis."
          },
          "NoProduit_Fournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du produit chez le fournisseur Requis."
          },
          "prix_ProchainCoutant": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prochain prix coûtant chez ce fournisseur"
          },
          "CodeUPC_Fournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code UPC du fournisseur"
          },
          "Description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du produit-fournisseur Création : Autotask. Modification : Autotask."
          },
          "Qte_Economique": {
            "type": [
              "number",
              "null"
            ],
            "description": "Quantité économique de commande"
          },
          "Description_Courte2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description courte 2"
          },
          "Commentaire": {
            "type": [
              "string",
              "null"
            ],
            "description": "Commentaire interne"
          },
          "PrixVendant_Liste0_Prix2": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix de vente niveau 2"
          },
          "PrixVendant_Liste0_Prix3": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix de vente niveau 3"
          },
          "PrixVendant_Liste0_Prix4": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix de vente niveau 4"
          },
          "PrixVendant_Liste0_Prix5": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix de vente niveau 5"
          },
          "PrixCoutant_CoutantMoyen": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix coûtant moyen"
          },
          "Inventaire_QteReservee": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité réservée"
          },
          "Inventaire_QteEnCommande": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité en commande client Filtrable (eq, gt, gte, lt, lte, ne) — QuickBooksOnline."
          },
          "Inventaire_QteEnAchat": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité en commande fournisseur"
          },
          "Inventaire_QteMininum": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité minimum"
          },
          "Inventaire_QteMaximum": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité maximum"
          },
          "Inventaire_Entrepôt": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code de l'entrepôt"
          },
          "IsAProductItem": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si c'est un produit segmenté"
          },
          "ItemProduit_ProduitParent_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du produit parent"
          },
          "Caracteristique01_Nom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la 1ère caractéristique (ex: Couleur)"
          },
          "Caracteristique01_ValeurNom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Valeur de la 1ère caractéristique (ex: Bleu)"
          },
          "Caracteristique02_Nom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la 2ème caractéristique (ex: Taille)"
          },
          "Caracteristique02_ValeurNom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Valeur de la 2ème caractéristique (ex: XL)"
          },
          "Caracteristique03_Nom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la 3ème caractéristique"
          },
          "Caracteristique03_ValeurNom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Valeur de la 3ème caractéristique"
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (gt, gte, lt, lte) — Acomba. Acomba : Horodatage système, filtrage par plage."
          },
          "ListeRabaisVolume": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/RabaisVolume"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des rabais de volume"
          },
          "ListeQteEntrepot": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/EntrepotInventaire"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Quantités par entrepôt"
          },
          "ExtendedProperties": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Propriétés étendues personnalisées"
          }
        },
        "additionalProperties": true
      },
      "FicheGroupeProduit": {
        "type": "object",
        "description": "Gérez les groupes/catégories de produits à travers différents systèmes ERP avec une API REST unifiée. Lisez et organisez les classifications de produits pour Acomba, QuickBooks Online et autres systèmes ERP.\n\nL'entité ProductGroup (aussi appelée ProductCategory dans certains systèmes) représente un groupe ou une catégorie de produits dans votre système ERP. Cette API permet principalement d'effectuer des opérations de lecture (Read) sur les groupes de produits de manière standardisée, facilitant l'organisation et la classification de votre catalogue.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/ProductGroup - Récupérer une liste de groupes de produits\n\n- GET /Entity/ProductGroup/{id} - Récupérer un groupe spécifique\n\n- **Note importante** : Les champs disponibles varient selon le système ERP. Dans QuickBooks Online, les ProductGroup correspondent aux Items de type Category.\n\n- **Hiérarchie de catégories** : Certains systèmes ERP supportent une hiérarchie de catégories (sous-catégories). Ces propriétés permettent de définir la relation parent-enfant.",
        "properties": {
          "CodeGroupe": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code du groupe de produits (clé métier) Filtrable (eq, ne) — QuickBooksOnline."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source ERP Filtrable (eq, ne) — QuickBooksOnline."
          },
          "FicheNomComplet": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true,
            "description": "Nom complet formaté (CodeGroupe - DescGroupe)"
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le groupe de produits est actif"
          },
          "DescGroupe": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du groupe de produits Filtrable (eq, ne) — QuickBooksOnline."
          },
          "NoCompteGL_Vente": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de compte du Grand Livre pour les ventes"
          },
          "NoCompteGL_Achat": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de compte du Grand Livre pour les achats"
          },
          "ExceptionDeTaxesActives": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si une exception de taxe est active pour ce groupe"
          },
          "ExceptionDeTaxes": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ExceptionTaxesEntete"
              },
              {
                "type": "null"
              }
            ],
            "description": "Détails de l'exception de taxe utilisée sur ce groupe"
          },
          "DefaultTaxCategoryId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant de la catégorie de taxe par défaut"
          },
          "DefaultTaxCategoryCode": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code de la catégorie de taxe par défaut"
          },
          "ParentCategoryId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant de la catégorie parente (hiérarchie)"
          },
          "ParentCategoryCode": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code de la catégorie parente (hiérarchie)"
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date et heure de la dernière modification de la fiche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          }
        },
        "additionalProperties": true
      },
      "MouvementInventaire": {
        "type": "object",
        "description": "Gérez les mouvements d'inventaire à travers différents systèmes ERP avec une API REST unifiée. Effectuez des ajustements de quantité, des entrées et sorties d'inventaire pour Acomba.\n\nL'entité ProductTrail représente un mouvement d'inventaire dans votre système ERP. Cette API permet d'effectuer des opérations de création (POST) sur les mouvements d'inventaire de manière standardisée, permettant d'ajuster les quantités de produits en stock.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- POST /Entity/ProductTrail - Créer un nouveau mouvement d'inventaire (ajustement de quantité)\n\n- **Note importante** : Les mouvements d'inventaire permettent d'ajuster les quantités de produits en stock. Vous pouvez soumettre un seul mouvement ou une liste de mouvements pour un traitement en lot. Les produits segmentés (avec caractéristiques) sont également supportés.\n\n- **Recherche automatique de l'item de produit** : Lorsque IsAProductItem est à true et que les caractéristiques sont fournies, le système recherchera automatiquement l'item de produit correspondant dans Acomba. Si l'item n'est pas trouvé, une erreur sera retournée.",
        "properties": {
          "NoMouvementInventaire": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du mouvement d'inventaire (généré par le système)"
          },
          "NoMouvementInventaire_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique interne du système ERP"
          },
          "TypeMouvementInventaire": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Type de mouvement (Ajustement, Entrée, Sortie) Énumération : la valeur est un texte ou un entier selon l'ERP. Acomba : Converti depuis/vers le type natif."
          },
          "NoProduit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du produit concerné Création : Acomba."
          },
          "NoProduit_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "CardPos du produit dans Acomba Création : Acomba. Acomba : Clé alternative produit (CardPos)."
          },
          "DescriptionProduit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du produit"
          },
          "Localisation": {
            "type": [
              "string",
              "null"
            ],
            "description": "Emplacement du produit (entrepôt, étagère, etc.)"
          },
          "Localisation_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique de la localisation"
          },
          "DateMouvement": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date du mouvement d'inventaire Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Création : Acomba. Filtrable (eq, gt, gte, lt, lte) — Acomba. Acomba : Filtre par date/plage."
          },
          "Commentaire": {
            "type": [
              "string",
              "null"
            ],
            "description": "Note ou commentaire associé au mouvement"
          },
          "Quantitee": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité ajustée (positive = entrée, négative = sortie) Création : Acomba."
          },
          "PrixCoutant": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix coûtant unitaire Création : Acomba."
          },
          "PrixVendant": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Prix de vente unitaire Acomba : Lu à l'extraction ; non poussé à la création."
          },
          "NoDocumentAssociee": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du document associé (facture, bon de commande, etc.) Filtrable (eq) — Acomba."
          },
          "NoDocumentAssociee_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du document associé"
          },
          "NoLigneDocumentAssociee": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de ligne du document associé"
          },
          "UsagerNo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'usager ayant effectué le mouvement"
          },
          "NoProduitFournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du produit chez le fournisseur"
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de dernière modification de la fiche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "IsAProductItem": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le mouvement concerne un item de produit segmenté"
          },
          "ItemProduit_no": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'item de produit"
          },
          "ItemProduit_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique de l'item de produit"
          },
          "Segment_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du segment (catégorie de segmentation)"
          },
          "Segment_Nom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom du segment (ex: COULEUR + GRANDEUR)"
          },
          "Caracteristique01_ValeurNo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Valeur de la caractéristique 1 (ex: BLEU)"
          },
          "Caracteristique01_Nom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la caractéristique 1 (ex: COULEUR)"
          },
          "Caracteristique02_ValeurNo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Valeur de la caractéristique 2 (ex: XL)"
          },
          "Caracteristique02_Nom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la caractéristique 2 (ex: GRANDEUR)"
          },
          "Caracteristique03_ValeurNo": {
            "type": [
              "string",
              "null"
            ],
            "description": "Valeur de la caractéristique 3"
          },
          "Caracteristique03_Nom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la caractéristique 3"
          }
        },
        "additionalProperties": true
      },
      "Employe": {
        "type": "object",
        "description": "Gérez les employés à travers différents systèmes ERP avec une API REST unifiée. Lisez les informations des employés pour Avantage, Servicentre et autres systèmes ERP.\n\nL'entité Employee (Employé) représente un employé dans votre système ERP. Cette API permet principalement d'effectuer des opérations de lecture (Read) sur les fiches employés de manière standardisée, facilitant l'accès aux données RH de votre organisation.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/Employee - Récupérer une liste d'employés\n\n- GET /Entity/Employee/{id} - Récupérer un employé spécifique\n\n- **Note importante** : Les champs disponibles varient selon le système ERP. Avantage offre des informations RH complètes, tandis que Servicentre offre des informations de base.",
        "properties": {
          "NoEmploye": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'employé Filtrable (contains, eq, ne) — Avantage. Avantage : Clé de l'employé."
          },
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source ERP Filtrable (contains, eq, ne) — Avantage."
          },
          "NoAssuranceSocial": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro d'assurance sociale Filtrable (contains, eq, ne) — Avantage."
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si l'employé est actif"
          },
          "NomEmploye": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de l'employé Filtrable (contains, eq, ne) — Avantage."
          },
          "PrenomEmploye": {
            "type": [
              "string",
              "null"
            ],
            "description": "Prénom de l'employé Filtrable (contains, eq, ne) — Avantage."
          },
          "NomCompletEmploye": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true,
            "description": "Nom complet formaté (Prénom + Nom)"
          },
          "DateNaissance": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de naissance de l'employé Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "Adresse1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse ligne 1 Filtrable (contains, eq, ne) — Avantage."
          },
          "Adresse2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse ligne 2"
          },
          "Ville": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ville Filtrable (contains, eq, ne) — Avantage."
          },
          "CodePostal": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code postal Filtrable (contains, eq, ne) — Avantage."
          },
          "Telephone1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de téléphone principal Filtrable (contains, eq, ne) — Avantage."
          },
          "Telephone2": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de téléphone secondaire"
          },
          "EmailEmploye": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel principale"
          },
          "Courriel1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse courriel alternative"
          },
          "Departement": {
            "type": [
              "string",
              "null"
            ],
            "description": "Département ou service de l'employé"
          },
          "DateEmbauche": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date d'embauche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "DateFinEmploi": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de fin d'emploi Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date et heure de la dernière modification de la fiche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          }
        },
        "additionalProperties": true
      },
      "EntetePaie": {
        "type": "object",
        "description": "Accédez aux données de paie à travers différents systèmes ERP avec une API REST unifiée. Extrayez les informations de paie des employés.\n\nL'entité Payroll (Paie) représente les données de paie d'un employé dans votre système ERP. Cette API permet d'effectuer des opérations de lecture (GET) sur les fiches de paie, incluant les en-têtes de période et les lignes de détail (salaires, avantages, déductions, retenues à la source, contributions employeur).\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/Payroll - Récupérer une liste de fiches de paie",
        "properties": {
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source ERP"
          },
          "int_NoPeriode": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de la période de paie"
          },
          "date_DebutPeriodPaie": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de début de la période de paie Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Avantage : Date de début de période (C 10, yyyy/MM/dd ; comparée en date)."
          },
          "date_FinPeriodPaie": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de fin de la période de paie Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Avantage : Date de fin de période."
          },
          "date_Emission": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date d'émission du chèque de paie Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, lt, lte, ne) — Avantage. Avantage : Date du chèque de paye."
          },
          "MontantBrut": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant brut total de la paie Filtrable (eq, gt, gte, lt, lte, ne) — Avantage."
          },
          "MontantNet": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant net de la paie (après déductions) Filtrable (eq, gt, gte, lt, lte, ne) — Avantage."
          },
          "EmployePaie": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Employe"
              },
              {
                "type": "null"
              }
            ],
            "description": "Objet Employé associé à cette paie"
          },
          "ListeLignePaie": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/LignePaie"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des lignes de détail de la paie Avantage : Lignes de salaire reconstruites depuis les colonnes d'heures et de montants (composite). Mappées uniquement pour que le $select ramène les colonnes."
          },
          "ListeTransactionBanqueRH": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/TransactionBanqueRH"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Liste des transactions de banques RH (vacances, maladie, etc.)"
          },
          "ListeRepartitionProjets": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/RepartitionProjet"
                },
                {
                  "type": "null"
                }
              ]
            },
            "description": "Répartition de la paie par projet"
          }
        },
        "additionalProperties": true
      },
      "LignePaie": {
        "type": "object",
        "properties": {
          "NoRubrique": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la rubrique de paie"
          },
          "NomRubrique": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom/description de la rubrique"
          },
          "TypeLignePAie": {
            "type": [
              "string",
              "integer",
              "null"
            ],
            "description": "Type de ligne (voir tableau des types ci-dessous)"
          },
          "Valeur": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant de la ligne (positif pour gains, négatif pour déductions)"
          },
          "ValeurSommaire": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Valeur cumulative depuis le début de l'année"
          },
          "QteOuPourcent": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Quantité (heures) ou pourcentage selon le type de rubrique"
          },
          "MontantUnitaire": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Taux horaire ou montant unitaire"
          },
          "Departement": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Departement"
              },
              {
                "type": "null"
              }
            ],
            "description": "Département associé à cette ligne"
          },
          "Fonction": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Fonction"
              },
              {
                "type": "null"
              }
            ],
            "description": "Fonction de l'employé associée à cette ligne"
          },
          "ImposableImpotProvincial": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si la ligne est imposable au provincial"
          }
        },
        "additionalProperties": true
      },
      "TransactionBanqueRH": {
        "type": "object",
        "properties": {
          "NoBanque": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de la banque RH"
          },
          "NomBanque": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la banque (Vacances, Maladie, etc.)"
          },
          "NoPeriode": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Numéro de période associé"
          },
          "TypeTransaction": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TypeTransactionBanqueRH"
              },
              {
                "type": "null"
              }
            ],
            "description": "Type de transaction (Entrée ou Sortie)"
          },
          "Valeur": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Valeur de la transaction (heures ou montant)"
          },
          "ValeurCumul": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Solde cumulatif de la banque"
          },
          "Fonction": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Fonction"
              },
              {
                "type": "null"
              }
            ],
            "description": "Fonction associée à la banque RH"
          }
        },
        "additionalProperties": true
      },
      "FicheActivite": {
        "type": "object",
        "description": "Gérez les activités à travers différents systèmes ERP avec une API REST unifiée. Les activités représentent des codes ou catégories utilisées pour classifier les transactions, les achats et les projets dans votre système comptable.\n\nL'entité Activity représente une activité (ou code d'activité) dans votre système ERP. Les activités sont généralement utilisées pour catégoriser les transactions, associer des comptes GL et suivre les coûts par projet ou par fournisseur.\n\nL'API utilise des endpoints REST standards avec les méthodes HTTP appropriées :\n\n- GET /Entity/Activity - Récupérer une liste d'activités\n\n- **Note importante** : L'entité Activity est actuellement supportée uniquement en lecture (GET) pour le système ERP Avantage. Elle permet d'extraire les codes d'activités avec leurs associations aux comptes GL et fournisseurs.\n\n- **RepartitionParProjet** : Lorsque vous utilisez $expand=RepartitionParProjet, le dictionnaire ExtendedProperties contiendra une liste de répartitions par projet avec les propriétés suivantes :",
        "properties": {
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique de la transaction de répartition Filtrable (contains, eq, in, ne) — Avantage. Avantage : N° d'activité (5 car.). Même colonne que NoActivite (ANUM)."
          },
          "NoActivite": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'activité parent Filtrable (contains, eq, in, ne) — Avantage."
          },
          "DescriptionFR": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de l'activité en français Filtrable (contains, eq, ne) — Avantage. Avantage : Description de l'activité (français, 45 car.)."
          },
          "DescriptionEN": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description de l'activité en anglais Filtrable (contains, eq, ne) — Avantage. Avantage : Description de l'activité (anglais, 45 car.)."
          },
          "NoFournisseur": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du fournisseur associé à cette activité Filtrable (contains, eq, in, ne) — Avantage. Avantage : Fournisseur associé (10 car.)."
          },
          "NoCompteGL": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du compte GL de la transaction Filtrable (contains, eq, in, ne) — Avantage. Avantage : Compte GL d'achat (5 car.)."
          },
          "ExtendedProperties": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Dictionnaire contenant des propriétés additionnelles (ex: RepartitionParProjet)"
          },
          "DateTransaction": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de la transaction Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture."
          },
          "MontantReparti": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant réparti sur le projet"
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du projet associé à la répartition"
          }
        },
        "additionalProperties": true
      },
      "FicheProjet": {
        "type": "object",
        "description": "Gérez les projets à travers différents systèmes ERP avec une API REST unifiée.\n\nL'entité Project représente un projet de construction ou de travail dans votre système ERP. Cette entité est différente de GLProject qui concerne les projets comptables (Grand Livre). Les projets de construction incluent des informations sur les clients, les montants de ventes/achats, les retenues, et l'état d'avancement des travaux.\n\n- GET /Entity/Project - Récupérer les projets de construction (Acomba Construction, Avantage)\n\n- **Distinction Project vs GLProject** : Project (EntityType.Project) : Projets de construction/travail avec clients, montants, retenuesGLProject (EntityType.GLProject) : Projets comptables du Grand Livre avec budgets et segments Ces deux entités sont indépendantes et servent des besoins différents.",
        "properties": {
          "NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du système source ERP Filtrable (contains, eq, in, ne) — Avantage, Sage50. Acomba : Cle systeme (PJCARDPOS converti en string)."
          },
          "NoProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du projet (clé métier) Filtrable (contains, eq, in, ne) — Avantage, Sage50. Acomba : Concatenation CCODE_P (projet) + SCODE_P (sous-projet/segment), sans tiret. Avantage : Clé du projet."
          },
          "NomProjet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom du projet Filtrable (contains, eq, ne) — Avantage, Sage50. Acomba : CDESCRIP1 + CDESCRIP2 concatenes; patch d'encodage (cp1252 corrompu) applique a l'extraction."
          },
          "EstActif": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Indique si le projet est actif Filtrable (eq, ne) — Avantage, Sage50. Acomba : Derive de CFORFAIT: true si 'O' (Actif) ou 'F' (Forfaitaire), false sinon ('N' Inactif). Avantage : Booléen inversé (EstActif ↔ EstInactif) ; conversion appliquée au filtre. Sage50 : Booléen inversé (bInactive=1 → EstActif=false). Sens de tri inversé."
          },
          "TypeProjet1": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type ou catégorie du projet Acomba : Mappe depuis CFORFAIT: N=Inactif, O=Actif, F=Forfaitaire, sinon Inconnu. Sage50 : Libellé de statut (0=En attente, 1=En cours, 2=Annulé, 3=Complété) via NStatusVersLibelle()."
          },
          "Client_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du client associé Filtrable (contains, eq, ne) — Avantage."
          },
          "Client_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du client dans le système source"
          },
          "ClientFacturerA_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du client à facturer (si différent du client principal)"
          },
          "ClientFacturerA_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du client à facturer"
          },
          "EmployeResponsable_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro de l'employé responsable du projet Filtrable (contains, eq, ne) — Avantage."
          },
          "EmployeResponsable_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique de l'employé responsable"
          },
          "ProjetInitial_No": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du projet initial (pour les projets liés)"
          },
          "ProjetInitial_NoUniqueSystemeSource": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant unique du projet initial"
          },
          "Adresse": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse du site du projet Filtrable (contains, eq, ne) — Avantage."
          },
          "Ville": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ville du site du projet Filtrable (contains, eq, ne) — Avantage."
          },
          "Province": {
            "type": [
              "string",
              "null"
            ],
            "description": "Province ou état du site du projet Filtrable (contains, eq, ne) — Avantage."
          },
          "DateDebutProjet": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de début du projet Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, lt, lte, ne) — Avantage, Sage50. Acomba : Lecture dans un try/catch silencieux; absent si la date dBase est invalide."
          },
          "DateFinProjet": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date de fin prévue ou réelle du projet Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Filtrable (eq, gt, gte, lt, lte, ne) — Avantage, Sage50. Acomba : Lecture dans un try/catch silencieux; absent si la date dBase est invalide."
          },
          "CompteClientMontantVenteADate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total des ventes au client à ce jour"
          },
          "CompteClientMontantAchatADate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total des achats facturés au client à ce jour"
          },
          "CompteClientRetenueTotaleADate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total des retenues appliquées par le client à ce jour"
          },
          "CompteClientRetetueARecevoirADate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant des retenues à recevoir du client à ce jour"
          },
          "CompteFournisseurMontantAchatADate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total des achats aux fournisseurs à ce jour"
          },
          "CompteFournisseurSoldeAPayerADate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Solde à payer aux fournisseurs à ce jour"
          },
          "CompteFournisseurRetenueTotaleADate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant total des retenues appliquées aux fournisseurs à ce jour"
          },
          "CompteFournisseurRetetueAPayerADate": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Montant des retenues à payer aux fournisseurs à ce jour"
          },
          "Fiche_DerniereModification": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?)?$",
            "description": "Date et heure de la dernière modification de la fiche Date/heure ISO 8601 **sans fuseau** (`yyyy-MM-ddTHH:mm:ss`) ; une date seule (`yyyy-MM-dd`) est acceptée en écriture. Sage50 : Champ composite date+heure → non filtrable/triable."
          }
        },
        "additionalProperties": true
      },
      "_generique_": {
        "description": "Type « (generique) » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "AgeDesComptes": {
        "description": "Type « AgeDesComptes » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "Client_NiveauPrixClient": {
        "description": "Type « Client_NiveauPrixClient » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "Client_TypeDeMargeDeCredit": {
        "description": "Type « Client_TypeDeMargeDeCredit » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "CustomerAddress": {
        "description": "Type « CustomerAddress » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "CustomerARInvoice": {
        "description": "Type « CustomerARInvoice » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "CustomerBidLine": {
        "description": "Type « CustomerBidLine » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "CustomerInvoiceLine": {
        "description": "Type « CustomerInvoiceLine » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "CustomerOrderLine": {
        "description": "Type « CustomerOrderLine » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "CustomerServiceContract": {
        "description": "Type « CustomerServiceContract » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "Departement": {
        "description": "Type « Departement » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "EcritureComptable_Detail": {
        "description": "Type « ÉcritureComptable_Détail » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "EntrepotInventaire": {
        "description": "Type « EntrepotInventaire » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "ExceptionTaxesEntete": {
        "description": "Type « ExceptionTaxesEntete » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "FicheTaxe": {
        "description": "Type « FicheTaxe » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "FicheTelephonique": {
        "description": "Type « FicheTelephonique » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "Fonction": {
        "description": "Type « Fonction » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "GLProjectBalance": {
        "description": "Type « GLProjectBalance » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "GroupeProduit": {
        "description": "Type « GroupeProduit » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "GroupeTaxeEntete": {
        "description": "Type « GroupeTaxeEntete » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "RabaisVolume": {
        "description": "Type « RabaisVolume » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "RepartitionProjet": {
        "description": "Type « RepartitionProjet » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "SettingForcedTaxes": {
        "description": "Type « SettingForcedTaxes » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "TimesheetHeader": {
        "description": "Type « TimesheetHeader » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      },
      "TypeTransactionBanqueRH": {
        "description": "Type « TypeTransactionBanqueRH » du modèle unifié ERPConnector. Sa structure n'est pas encore documentée dans content/fields/ : la valeur est acceptée telle quelle, sans validation."
      }
    }
  }
}