Bases du modèle de données de facture GST : champs minimaux, gestion des HSN et écrans d'administration nécessaires pour générer des factures conformes et simplifier la réconciliation.

La plupart des problèmes de facturation GST ne sont pas des problèmes de « fiscalité complexe ». Ce sont des problèmes de données manquantes ou incohérentes. Un audit échoue quand la facture ne peut pas être reliée proprement à ce qui a été vendu, à qui, où la fourniture a eu lieu et comment la taxe a été calculée.
Un déclencheur fréquent est l'absence, l'obsolescence ou l'application au mauvais niveau du HSN. Les équipes peuvent stocker un HSN sur le produit, mais la ligne de facture est créée à partir d'un autre nom de SKU ou d'un variant, si bien que le HSN n'atteint jamais le document final. Un autre problème fréquent est une mauvaise répartition des taxes : facturer IGST alors qu'il aurait fallu CGST et SGST (ou inversement) parce que le « lieu d'approvisionnement » a été deviné depuis l'adresse de livraison sans stocker les codes d'état utilisés pour la décision.
Les équipes financières ressentent cela immédiatement. La réconciliation devient un travail de nettoyage quotidien : les totaux de la facture ne correspondent pas à la commande, la commande ne correspond pas au règlement de la passerelle de paiement, et les remboursements deviennent une chaîne de notes manuelles. Même de petites différences d'arrondi entre les lignes peuvent créer des discordances entre le PDF de la facture, les rapports GST et le grand livre.
Voici les motifs qui causent le plus de douleur lors des rapprochements :
L'objectif d'un modèle de données de facture GST est simple : stocker un ensemble minimal de champs pour la commande, le produit, les parties, la taxe, la facture et les notes de crédit afin que chaque montant puisse être reproduit et expliqué ultérieurement. Gardez le modèle restreint, mais ne supprimez pas les champs légalement importants qui déterminent le type de taxe, le taux et le reporting.
Si vous voulez que les factures GST soient faciles à générer et à rapprocher ensuite, commencez par un petit ensemble d'objets et faites en sorte que chacun ait une seule responsabilité. Un modèle de données propre pour la facture GST tient moins à la multiplication des tables qu'à la stabilité des faits au fil du temps.
Voici les enregistrements de base dont la plupart des équipes ont besoin dès le premier jour :
Une Facture doit être distincte d'une Commande. Les commandes peuvent changer (adresse modifiée, articles annulés, exécution partielle). Les factures ne doivent pas changer. Elles ont besoin d'une numérotation stable, de dates et de totaux qui ne « dérivent » pas parce que quelqu'un a modifié une commande plus tard.
L'ancre de la précision fiscale est les Lignes de facture. Chaque ligne de commande (et plus tard chaque ligne de facture) doit contenir la quantité exacte, le prix unitaire, la remise et la ventilation fiscale pour cet article spécifique. C'est là que le HSN/SAC et les taux GST sont appliqués.
Un détail qui sauve les équipes financières : stocker des snapshots. Lors de la génération d'une facture, copiez la description du produit, le HSN/SAC, le taux de taxe et le prix dans les lignes de facture. Ne vous fiez pas au produit maître actuel, car les taux et les noms changent.
Il est facultatif mais souvent utile d'ajouter tôt des enregistrements séparés pour les Retours, Remboursements et Notes de crédit. Exemple : si un client retourne un article d'une commande de deux articles, vous souhaitez une note de crédit qui référence la ligne de facture d'origine, tandis que l'enregistrement de remboursement référence la transaction de la passerelle. Les garder comme objets explicites évite les « corrections manuelles » en fin de mois dans les registres GST.
Si vous construisez cela dans Koder.ai, traitez chaque objet d'abord comme un écran simple (créer, voir, modifier), puis ajoutez la génération de facture uniquement après que les snapshots et les champs au niveau des lignes sont en place.
HSN (pour les biens) et SAC (pour les services) ne sont pas des détails « réservés à la facture ». Ils commencent à la définition du produit ou du service, puis sont copiés sur chaque ligne de facture au moment de l'émission. Cela maintient les paniers mixtes corrects et facilite les audits car chaque ligne est autonome.
Un modèle de données minimal pratique est :
Placer le HSN/SAC sur le Product aide votre équipe admin à le maintenir en un seul endroit. Le copier dans InvoiceLine rend les factures passées stables. Même si le produit change plus tard, la facture montre ce qui était vrai au moment de la vente. C'est le cœur d'un modèle de données GST qui ne casse pas lors des rapprochements.
Pour le stockage du HSN, gardez-le simple : le code est requis, la description est optionnelle, et une date effective (effective_from) est optionnelle si vous voulez un historique des changements. La plupart des équipes n'ont pas besoin de la description sur chaque ligne, mais cela peut aider quand la finance vérifie des exceptions.
Les paniers mixtes sont normaux : une facture peut contenir plusieurs lignes et donc plusieurs codes HSN/SAC. N'essayez pas d'imposer un seul code par facture. Les totaux s'agrègent au niveau de la facture tandis que la classification reste au niveau des lignes.
La gestion des changements est un point d'accroche courant. Utilisez un petit ensemble de règles :
Côté écrans admin, il suffit d'un endroit pour éditer les champs fiscaux produit, plus une vue en lecture seule sur la ligne de facture pour confirmer ce qui a été capturé lors de la création de la facture. Si vous construisez ces écrans rapidement, des outils comme Koder.ai peuvent générer les pages CRUD de base et les tableaux de données à partir de ce modèle avec un minimum d'effort.
Un modèle de données de facture GST échoue le plus souvent sur les détails des parties. Si l'identité de l'acheteur ou du vendeur est même légèrement incorrecte, votre facture peut être valide sur le papier mais problématique dans les déclarations et la réconciliation.
Commencez par traiter « vendeur », « acheteur » et « destinataire » comme des parties séparées, même lorsqu'il s'agit de la même personne. Cela évite des bricolages ultérieurs quand un client ajoute une adresse de livraison différente ou quand vous vendez à partir de plusieurs enregistrements GST.
Gardez les champs simples et explicites. Ce sont ceux dont on a généralement besoin sur la facture et dans les rapports :
Stockez l'état à la fois comme nom lisible et comme code d'état, car le reporting et les règles de lieu d'approvisionnement reposent souvent sur le code.
Capturez à la commande à la fois les adresses de facturation et de livraison, pas seulement sur le profil client. Les profils changent ; les factures ne doivent pas.
Le lieu d'approvisionnement doit être stocké comme un code d'état spécifique sur la facture (copié depuis la commande au moment de la facturation). Ne le « recalculez » pas plus tard. Si votre règle est « état de livraison », stockez ce résultat, ainsi que l'état utilisé pour décider. Cela facilite audits et litiges.
Pour le B2B, le GSTIN de l'acheteur est généralement requis et doit être validé en longueur et format lors de la saisie. Pour le B2C, le GSTIN peut rester vide, mais vous avez toujours besoin d'une adresse complète et d'un état pour déterminer si CGST/SGST ou IGST s'applique.
Une règle simple qui marche dans la plupart des systèmes : si le GSTIN de l'acheteur est présent, traitez comme B2B ; sinon, traitez comme B2C. Si vous avez besoin d'exceptions, stockez un champ customer_type explicite.
Si vous avez des succursales ou des unités avec des immatriculations GST différentes, modélisez « Seller Entity » comme un enregistrement distinct avec son propre GSTIN et adresse. Chaque commande doit référencer exactement une entité vendeuse, et chaque facture doit copier ces détails pour que les factures historiques restent exactes même si l'adresse du vendeur change plus tard.
Des outils comme Koder.ai peuvent générer rapidement les formulaires admin pour ces enregistrements, mais l'essentiel est la structure : entité vendeur séparée, snapshots au moment de la commande, et un code d'état explicite pour le lieu d'approvisionnement.
Le partage le plus courant est simple : si le lieu d'approvisionnement est dans le même état que le fournisseur, la taxe est CGST + SGST. Si c'est dans un état différent, la taxe est IGST. Votre système ne doit pas « recalculer plus tard à partir des totaux » parce que de petites différences (arrondi, remises, livraison) sont précisément ce qui cause des discordances.
Au minimum, stockez les montants fiscaux au niveau de la ligne de facture, pas seulement dans l'en-tête. Ainsi vous pouvez expliquer chaque roupie sur la facture et la rattacher au produit, au HSN et au revenu.
Un minimum pratique par ligne de facture dans votre modèle de données GST ressemble à ceci :
Les remises sont là où les systèmes se compliquent. Décidez d'une règle et stockez-la clairement. Si les remises réduisent le prix avant taxe (typique pour remises sur article et coupons), stockez le montant brut d'origine, le montant de la remise et la valeur taxable résultante. Si vous avez un coupon au niveau commande, répartissez-le sur les lignes (généralement proportionnellement à la valeur taxable pré-remise de chaque ligne) et stockez la remise allouée sur chaque ligne pour que la comptabilité fiscale reste explicable.
L'arrondi doit être cohérent et enregistré. Choisissez si vous arrondissez au niveau ligne ou uniquement au niveau facture, puis stockez les résultats arrondis que vous avez imprimés. Beaucoup d'équipes calculent la taxe par ligne, arrondissent à 2 décimales, font la somme, puis appliquent un champ invoice_rounding_adjustment final pour atteindre le montant payable exact.
Les frais de port et de manutention ne doivent pas être un ajout caché. Traitez-les comme une ligne de facture séparée avec son propre code HSN/service et règles de taux. Par exemple, une commande avec deux produits et des frais de livraison devient trois lignes, chacune avec valeur taxable et montants de taxe stockés, ce qui facilite grandement la réconciliation financière.
Une fois la taxe calculée, la facture a toujours besoin de champs « document » qui la rendent valide, vérifiable et facile à rapprocher ensuite. Dans un modèle de données facture GST, traitez l'en-tête de la facture comme un enregistrement légal : il doit être stable même si les données produit ou client changent dans le futur.
Commencez par les bases de l'en-tête : numéro de facture, date d'émission (la date sur la facture), type de facture (tax invoice, export, B2B, B2C, etc.) et devise. Même si vous facturez principalement en INR, stocker la devise évite des cas limites pour les exportations ou les places de marché multi-devises.
La numérotation est un point critique. Gardez une série ou un préfixe (par exemple FY25-INV-), stockez l'année financière et imposez l'unicité au niveau base de données. Stockez aussi des contrôles « prochain numéro » par série dans l'admin pour que deux admins ne puissent pas émettre le même numéro en même temps.
Les totaux doivent être stockés explicitement, pas seulement dérivés. Sauvegardez le sous-total (valeur taxable), le total taxe et le montant global, ainsi qu'un montant séparé d'arrondi. Si vous recalculer plus tard à partir des lignes, un petit changement de règle peut faire que d'anciennes factures ne correspondent plus aux déclarations déposées.
Les statuts doivent refléter le cycle de vie réel et verrouiller l'enregistrement quand c'est nécessaire :
Enfin, stockez les métadonnées des artefacts générés : version du template PDF, horodatage de génération et identifiant de fichier. Un hash est optionnel, mais utile si vous devez prouver que le PDF n'a pas été altéré.
Exemple : si un agent support régénère un PDF après une mise à jour du template, les totaux et le numéro de la facture doivent rester identiques, mais la version du template stockée explique pourquoi la mise en page du PDF est différente.
Si vous voulez des factures GST propres, ne commencez pas par l'écran facture. Commencez par les pages admin qui l'alimentent. Un bon modèle de données de facture GST reste petit lorsque ces entrées sont contrôlées et cohérentes.
La fiche produit est là où la plupart des divergences futures commencent, donc soyez strict. Chaque SKU doit avoir exactement un HSN par défaut (ou SAC pour les services), plus un taux GST par défaut et les exceptions applicables seulement à certaines dates.
Un écran produit pratique a généralement :
Évitez une UI de type « calculatrice ». Stockez plutôt les entrées que votre système peut appliquer de façon cohérente : tables de taux, règles de lieu d'approvisionnement que vous suivez, et comment vous décidez intra-state vs inter-state (généralement en comparant l'état du fournisseur et l'état du destinataire).
Concentrez l'écran taxe sur : taux par catégorie/goupe HSN, dates effectives et ce qui doit se passer lorsque l'acheteur fournit un GSTIN valide ou non.
L'écran client doit capturer le GSTIN et son statut de validation, plus les adresses par défaut de facturation et de livraison. N'autorisez pas la saisie d'états en texte libre ; utilisez une liste contrôlée pour que "KA" et "Karnataka" ne deviennent pas deux valeurs différentes.
L'écran profil entreprise est tout aussi important : raison sociale, GSTIN, adresse enregistrée et paramètres de série de facturation (préfixe, prochain numéro et limites d'année financière). Verrouillez ceci avec des permissions car les changements affectent tous les documents futurs.
Vous n'avez pas besoin d'un système complexe, mais vous avez besoin d'une piste. Enregistrez qui a changé le HSN/SAC, les taux, les paramètres de série de factures ou le GSTIN de l'entreprise, avec l'ancienne valeur, la nouvelle, l'horodatage et la raison.
Si vous construisez ces écrans dans un outil comme Koder.ai, traitez le logging d'audit et les dates effectives comme des champs de première classe dès le jour 1. Ils coûtent peu à ajouter tôt et font gagner des heures lors des revues financières.
Une facture conforme tient moins à la mise en forme qu'au gel des bons faits au bon moment. Si vous concevez votre modèle de données facture GST autour de ce flux, le travail financier devient un simple rapprochement, pas une enquête hebdomadaire.
Avant de calculer la taxe, verrouillez un snapshot de la commande : articles, quantités, prix unitaires, remises, frais de livraison, GSTIN client (si présent), adresses de facturation et de livraison, et signaux de lieu d'approvisionnement. Le snapshot ne doit pas changer même si le prix du produit ou le mappage HSN change plus tard.
Calculez les taxes et générez les lignes de facture à partir du snapshot. Chaque ligne de facture doit copier le HSN/SAC, le(s) taux de taxe, la valeur taxable et les montants de taxe utilisés à ce moment-là, au lieu de les rechercher dynamiquement plus tard.
Assignez le numéro de facture et la date d'émission, puis marquez la facture comme émise. À partir de ce moment, bloquez les modifications de prix, des taux fiscaux, des codes HSN et des adresses sur l'enregistrement de la facture. Si vous devez autoriser quelque chose, limitez-le aux notes non financières et aux tags internes.
Générez le PDF/vue impression depuis la facture émise, puis stockez les totaux finaux que vous déclarerez : total taxable, totaux CGST/SGST/IGST, arrondi et montant global. Si vous voulez une sécurité supplémentaire, stockez une version du document ou un checksum pour prouver que l'impression correspond aux nombres stockés.
Après émission, les changements doivent suivre des règles, pas des éditions :
Si vous intégrez ce flux dans vos écrans admin (le mode Planification de Koder.ai est utile pour cartographier les étapes avant de construire), votre équipe pourra générer des factures rapidement sans casser la réconciliation ultérieure.
La réconciliation devient pénible quand les paiements sont traités comme un simple indicateur payé/non payé sur la commande. Gardez paiements et remboursements comme des enregistrements séparés qui pointent vers la commande et la facture, afin que la finance puisse rapprocher les règlements bancaires sans réécrire l'historique.
Une facture conforme doit rester stable après émission. Si un client paie en plusieurs fois, ou si vous remboursez plus tard, enregistrez ce mouvement comme une entrée de paiement ou de remboursement, pas comme un changement des totaux de la facture.
Champs minimaux qui facilitent la réconciliation :
Si le client retourne un article, ne « réduisez » pas la facture. Émettez une note de crédit et liez-la à la facture d'origine. Le registre des factures reste propre, et le remboursement se rattache à la note de crédit.
Donnez à la finance un écran unique qui répond : qu'est‑ce qui a été émis, qu'est‑ce qui a été payé, qu'est‑ce qui est encore ouvert, et qu'est‑ce qui a été annulé. Incluez un vieillissement (0-7, 8-30, 31-60, 60+ jours) et la possibilité d'explorer les paiements et remboursements liés.
Exports dont la plupart des équipes ont besoin chaque mois :
Exemple : une commande est Rs 10,000, payée Rs 6,000 aujourd'hui et Rs 4,000 la semaine suivante. La facture reste Rs 10,000. Votre vue finance affiche solde Rs 4,000 jusqu'à l'arrivée du second règlement, puis marque comme entièrement payée sans modifier le document émis.
La plupart des problèmes de facture GST ne sont pas des problèmes de logique fiscale. Ce sont des problèmes de tenue des enregistrements : les chiffres sur le PDF ne correspondent pas à ceux des exports financiers, ou la facture ne peut pas être expliquée des mois plus tard.
Le premier piège est de calculer la GST uniquement au moment de l'affichage. Si vous calculez CGST/SGST/IGST à chaque ouverture d'une facture, vous finirez par obtenir des résultats différents après un changement de taux, un changement d'arrondi ou une correction de bug. Stockez la ventilation fiscale calculée utilisée lors de l'émission, même si vous stockez aussi les entrées.
Un second piège est d'autoriser des modifications sur une facture émise. Une fois la facture finale, les modifications doivent se faire via une note de crédit ou un flux de remplacement avec une piste d'audit. Sinon, vous entendrez « pourquoi le PDF client diffère des livres ? ».
Voici les motifs de discordance qui apparaissent le plus souvent :
Un exemple rapide : vous vendez à un client au Karnataka, mais l'adresse de livraison est au Maharashtra. Si votre système prend par erreur l'état de facturation pour le lieu d'approvisionnement, vous pouvez facturer CGST+SGST au lieu d'IGST. Si vous recalculer aussi la taxe à la volée, cette erreur peut se « corriger » silencieusement plus tard, laissant la finance avec des chiffres qui ne correspondent pas au document émis.
Lorsque vous construisez des écrans admin (personnalisés ou via une plateforme comme Koder.ai), ajoutez de petits garde-fous : verrouillez les factures émises, affichez les entrées de lieu d'approvisionnement à côté du type de taxe calculé, et conservez un snapshot immuable du HSN, du taux et de l'arrondi utilisés au moment de l'émission.
Avant d'envoyer une facture à un client ou de la marquer comme « émise », exécutez un petit ensemble de vérifications. C'est là que la plupart des petites erreurs deviennent de gros casse‑têtes de réconciliation. Si vous construisez un modèle de données facture GST, il vaut la peine d'intégrer ces contrôles dans les règles de validation et votre UI admin.
Un exemple simple : un client met à jour son adresse de livraison après le paiement et l'état change. Si vous réémettez le même numéro de facture avec une nouvelle taxe, votre registre et les enregistrements de paiement cessent de correspondre. L'approche plus sûre est de garder la facture originale immuable et de créer un document d'ajustement.
Étapes suivantes : implémentez d'abord les écrans et validations, puis itérez. Dans Koder.ai, commencez en mode Planification pour esquisser les enregistrements et les écrans admin (produits avec mappage HSN/SAC, détails client/GSTIN, règles fiscales et factures). Générez l'application, testez quelques commandes réelles de bout en bout, puis utilisez les snapshots et le rollback pour affiner en toute sécurité le workflow. Quand vous avez besoin de personnalisations plus profondes ou de revues, exportez le code source et continuez à l'évoluer avec votre processus habituel.