Sélectionner une page

Numérotation automatique de factures

Introduction

Un des points essentiel lorsque l’on gère de la facturation dans Airtable est de pouvoir numéroter les factures.

En effet, la règlementation est assez stricte et, en cas de contrôle, avoir des « trous » dans la numérotation, des doublons ou autre peut inutilement éveiller les soupçons.

Alors comment faire pour avoir une numérotation de documents propre dans Airtable ?

C’est ce que nous allons voir dans cet article !

Objectif final

Avant de commencer la mise en place, essayons de définir l’objectif.

Nous souhaitons avoir un champ dans Airtable qui contiendra à la fois l’année et un numéro séquentiel, auto-incrémenté (1, puis 2, puis 3, …). Chaque année, on reprendra la numérotation de zéro.

Afin d’avoir toujours un numéro de facture de la même longueur, on préfixera le numéro séquentiel avec autant que 0 qu’il faut pour compléter la séquence.

Par exemple, cela pourra nous donner des numéros de factures comme :

  • 2024_0001
  • ….
  • 2024_0123
  • ….
  • 2024_9999

Vous l’aurez compris, je pars ici sur une base de maximum 9999 factures sur 1 année, ce qui semble déjà pas mal.

Si vous devez en générer plus que cela, augmentez la longueur de la séquence à 5 et vous pourrez avoir 99999 (donc juste un peu moins de 100.000 factures sur une année.)

Mise en place

Pour mettre en place ce système, nous aurons besoin d’une table « Factures » (avec les bons champs) & une automatisation avec un script. (que je vous fournis ci-dessous)

Mise en place de la table & des champs requis

Cette table contiendra 1 ligne par facture émise. Cela pourrait aussi être une table « Projet » si vous êtes certain d’émettre au maximum 1 facture par projet, mais je le déconseille.

En effet, si pour une raison quelconque vous devez par exemple émettre une seconde facture ou une note de crédit, vous serez obligé de recréer un « faux projet » pour pouvoir y mettre une facture.

Dans notre table « Factures », nous allons créer 3 champs :

  • Numéro – type « Formule »
  • Séquence – type « Nombre » – sans décimales
  • Date – type « Date »

Le numéro sera le numéro complet, par exemple : 2024_0123

La séquence sera juste la numérotation séquentielle, par exemple : 1, 34 ou 123

La date servira pour extraite l’année. Cela peut être aussi un champ « Créé le ».

Mise en place de l’automatisation avec script

Paramétrage du déclencheur

Rendez-vous dans l’onglet automatisations.

Créez une nouvelle automatisation avec le déclencheur « Lorsqu’une entrée correspond aux conditions ».
Dans les conditions, définissez à partir de QUAND vous voulez commencer à numéroter une facture.

Dans mon cas, je considère que dès qu’une facture a une date, elle doit être numérotée.

Vous pourriez également considérer qu’une facture doit :

  • avoir un client pour être numérotée
  • avoir un montant total

La seconde condition, est que la « Séquence » soit vide (donc qu’on ai pas déjà numéroté ce document)

Paramétrage du script

Ajoutez ensuite une action de type script et copiez coller le script donné ci-dessous.

/*********************************/
/*   Invoice autonumber by year  */
/*********************************/
/*  Author  : Florian VERDONCK   */
/*  Website : airtablefacile.fr  */
/*  Version : 1.0                */
/*********************************/

let config = input.config();

// Script configuration
const TABLE_NAME = config.TABLE_NAME;
const INCREMENTED_FIELD_NAME = config.INCREMENTED_FIELD_NAME;
const DATE_FIELD_NAME = config.DATE_FIELD_NAME;
const RECORD_ID = config.RECORD_ID;

// Query all records, sorted by number descending (biggest numbers first)
let table = base.getTable(TABLE_NAME);
let tableQuery = await table.selectRecordsAsync({
    "sorts" : [
        {
            field: INCREMENTED_FIELD_NAME,
            direction: "desc"
        }
    ],
    "fields": [
        INCREMENTED_FIELD_NAME,
        DATE_FIELD_NAME
    ]
});

let invoiceRecord = await table.selectRecordAsync(RECORD_ID);
let invoiceDate = invoiceRecord.getCellValue(DATE_FIELD_NAME);
let targetInvoiceYear = (new Date(invoiceDate)).getFullYear();
console.log(targetInvoiceYear)

let existingInvoices = tableQuery.records;

let invoicesForSameYear = existingInvoices.filter(
    invoice => {

        let invoiceDateAsString = invoice.getCellValue(DATE_FIELD_NAME);
        let sequence = invoice.getCellValue(INCREMENTED_FIELD_NAME);

        console.log(
            invoiceDateAsString,
            sequence
        )

        if (!invoiceDateAsString || !sequence) return false;

        let currentInvoiceYear = new Date(invoiceDateAsString).getFullYear();
        console.log(currentInvoiceYear)

        return currentInvoiceYear === targetInvoiceYear;
    }
);

console.log(invoicesForSameYear)

// Define the default value to zero (in case the next condition is false)
let latestNumber = 0;

// Get the first one (so the biggest number)
if (invoicesForSameYear.length > 0) {
    latestNumber = invoicesForSameYear[0].getCellValue(INCREMENTED_FIELD_NAME);
}

// Updates the created records and define it's number to (latestNumber + 1)
let numberToAssign = latestNumber+1;
await table.updateRecordAsync(
    config.RECORD_ID,
    {
        [INCREMENTED_FIELD_NAME]: numberToAssign
    }
)

output.set("assignedNumber", numberToAssign)

N’oubliez pas d’activer l’automatisation et tout devrait désormais fonctionner

Limitations

Attention cependant, si vous numérotez beaucoup de factures, le système peut donner des résultats inattendus à cause d’un problème connu en informatique appelé les « Race Conditions » ou Situation de compétitions en français.

Pour faire simple, si vous numérotez 2 factures exactement au même moment, les deux pourraient donner le même résultat.

Si vous avez besoin d’un système qui traite de très hauts volumes (potentiellement + de 1 facture par seconde), contactez nous et nous vous aiderons à mettre cela en place.

La solution est inutilement complexe pour être présentée ici.

Conclusion

Vous disposez désormais d’un système permettant de numéroter facilement vos factures, sans créer des trous et en conservant une bonne traçabilité.

Besoin d’aide sur Airtable ?

Découvrez les services que nous proposons.

0 commentaires

Soumettre un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *