Journal Entries

    Endpoints pour consulter les écritures comptables

    Journal Entries API

    Endpoints pour accéder aux écritures comptables (journal général, achats, ventes, trésorerie).

    Lister les écritures comptables

    GET /v1/public-api/journal-entries

    Scope requis: read:accounting

    Paramètres de requête

    ParamètreTypeDescription
    pagenumberNuméro de page (défaut: 1)
    limitnumberÉléments par page (défaut: 20, max: 100)
    dateFromstringDate de début (ISO 8601)
    dateTostringDate de fin (ISO 8601)
    journalTypestringType de journal
    statusstringStatut de l'écriture

    Exemple de requête

    curl -X GET "https://api.nerpsuite.com/v1/public-api/journal-entries?dateFrom=2024-01-01&dateTo=2024-01-31&journalType=VENTES&status=POSTED" \
      -H "X-API-Key: sk_live_xxx"

    Réponse

    {
      "data": [
        {
          "id": "je_001",
          "entryNumber": "JV-2024-000045",
          "journalType": "VENTES",
          "entryDate": "2024-01-25T00:00:00Z",
          "description": "Vente ORD-2024-001234 - Jean Dupont",
          "status": "POSTED",
          "lines": [
            {
              "lineNumber": 1,
              "accountId": "acc_411",
              "debit": 2257.64,
              "credit": 0,
              "description": "Client Jean Dupont"
            },
            {
              "lineNumber": 2,
              "accountId": "acc_707",
              "debit": 0,
              "credit": 1898.00,
              "description": "Vente de marchandises"
            },
            {
              "lineNumber": 3,
              "accountId": "acc_4457",
              "debit": 0,
              "credit": 359.64,
              "description": "TVA collectée 18%"
            }
          ],
          "createdAt": "2024-01-25T10:30:05Z"
        }
      ],
      "total": 156,
      "page": 1,
      "limit": 20,
      "totalPages": 8
    }

    Obtenir une écriture comptable

    GET /v1/public-api/journal-entries/:id

    Scope requis: read:accounting

    Paramètres de chemin

    ParamètreTypeDescription
    idstringID de l'écriture

    Exemple de requête

    curl -X GET "https://api.nerpsuite.com/v1/public-api/journal-entries/je_001" \
      -H "X-API-Key: sk_live_xxx"

    Réponse

    Même format que dans la liste, mais pour une seule écriture.

    Types de journal

    TypeDescription
    GENERALJournal général
    VENTESJournal des ventes
    ACHATSJournal des achats
    TRESORERIEJournal de trésorerie

    Statuts d'écriture

    StatutDescription
    DRAFTBrouillon
    PENDING_APPROVALEn attente de validation
    POSTEDComptabilisée
    CANCELLEDAnnulée

    Champs de réponse

    Écriture comptable

    ChampTypeDescription
    idstringIdentifiant unique
    entryNumberstringNuméro d'écriture
    journalTypestringType de journal
    entryDatestringDate de l'écriture (ISO 8601)
    descriptionstringLibellé de l'écriture
    statusstringStatut
    linesarrayLignes d'écriture (débit/crédit)
    createdAtstringDate de création (ISO 8601)

    Ligne d'écriture

    ChampTypeDescription
    lineNumbernumberNuméro de ligne
    accountIdstringID du compte comptable
    debitnumberMontant au débit
    creditnumberMontant au crédit
    descriptionstringLibellé de la ligne

    Cas d'usage

    Exporter les écritures pour Power BI

    async function exportJournalEntries(dateFrom, dateTo) {
      let allEntries = [];
      let page = 1;
      let hasMore = true;
    
      while (hasMore) {
        const response = await fetch(
          `/v1/public-api/journal-entries?dateFrom=${dateFrom}&dateTo=${dateTo}&status=POSTED&page=${page}&limit=100`,
          { headers: { 'X-API-Key': apiKey } }
        );
    
        const result = await response.json();
        allEntries = allEntries.concat(result.data);
        hasMore = page < result.totalPages;
        page++;
      }
    
      return allEntries;
    }

    Calculer la balance par compte

    async function getAccountBalances(dateFrom, dateTo) {
      const entries = await exportJournalEntries(dateFrom, dateTo);
    
      const balances = {};
      for (const entry of entries) {
        for (const line of entry.lines) {
          if (!balances[line.accountId]) {
            balances[line.accountId] = { debit: 0, credit: 0 };
          }
          balances[line.accountId].debit += line.debit;
          balances[line.accountId].credit += line.credit;
        }
      }
    
      return Object.entries(balances).map(([accountId, b]) => ({
        accountId,
        debit: b.debit,
        credit: b.credit,
        balance: b.debit - b.credit
      }));
    }

    Analyse des ventes vs achats

    async function getSalesVsPurchases(dateFrom, dateTo) {
      const [sales, purchases] = await Promise.all([
        fetch(`/v1/public-api/journal-entries?dateFrom=${dateFrom}&dateTo=${dateTo}&journalType=VENTES&status=POSTED`, {
          headers: { 'X-API-Key': apiKey }
        }).then(r => r.json()),
        fetch(`/v1/public-api/journal-entries?dateFrom=${dateFrom}&dateTo=${dateTo}&journalType=ACHATS&status=POSTED`, {
          headers: { 'X-API-Key': apiKey }
        }).then(r => r.json())
      ]);
    
      return {
        salesEntries: sales.total,
        purchaseEntries: purchases.total
      };
    }