Question

Nous créons logiciel de point de vente pour le mac, et cherchons à moderniser notre moteur d'impôt. Il est assez simple maintenant, avec les impôts constitués d'un nom, le code et le taux qui peut être appliqué à chaque produit individuellement. Bien que ce soit assez bon pour certaines personnes, nous avons eu beaucoup de demandes pour gérer des situations plus avancées. Quelques exemples sont la taxe de vente des États-Unis Ville / comté, composé du Canada (empilés) les impôts, les écotaxes français et la taxe de luxe de New York.

Nous avons identifié la plupart des caractéristiques que ces taxes ont été et sont penchaient vers une sorte de mise en œuvre basée sur des règles moteur. Nous ne devons pas soutenir tous les cas là-bas, mais nous voulons être en mesure de le prolonger si nécessaire (pour éviter une autre réécriture).

Nous recherchons des conseils de gens qui ont construit quelque chose comme ça avant, ou des exemples de projets qui tentent de résoudre le même d'une manière élégante.

Était-ce utile?

La solution

Je recommande un ensemble de tables de base de données et les jointures.

Exemple:

  • Compétence :. Liste des états, comtés, pays, villes, etc.
  • Produit : évident
  • Magasin : liste des endroits que vous vendez de
  • StoreJurisdiction (StoreID, JurisdictionID): la liste des Juridictions le magasin est responsable de percevoir des impôts pour
  • ProductTaxCode (int ProductID, TaxCodeID int): le type de produit aux fins de l'impôt:. De base, luxe, etc
  • JurisdictionTaxCodeRate (JurisdictionID, TaxCodeID, InterestRate, RateType): pour chaque combinaison de la compétence et le code fiscal, fournir le taux d'imposition à appliquer, et le type de taux (composé, simple, etc. .).

Pour trouver la liste des taxes à appliquer, tout ce que vous avez besoin est un INNER JOIN du magasin, ses champs de compétence, les jurisdictiontaxcoderates pour ces pays, et les codes fiscaux du produit.

Vous pouvez définir ProductTaxCode comme tous les produits Voir si reçoivent une TaxCode par défaut, sauf si un spécial est prévu. Par abstraire TaxCode, vous pouvez avoir les mêmes métadonnées sur un produit (par exemple « Food ») appliquer à différentes régions de différentes façons. Si une juridiction particulière a sa propre définition de « nourriture », vous ajoutez juste un code spécifique à la compétence et l'appliquer aux produits, au besoin.

Cela peut nécessiter quelques ajustements pour les achats sur Internet, les achats en gros, et d'autres situations où la vente est en quelque sorte exonéré d'impôts ou le client est responsable de les remettre. Il aurait également besoin peaufinage pour les situations où l'emplacement du client, plutôt que le magasin, le taux décide d'imposition.

Autres réglages: ici au Texas, par exemple, nous avons un « libre d'impôt » week-end où les taxes nationales et locales ne sont pas collectées sur certains catégories de produits où le prix de vente d'article individuel est moins 100 $. L'idée est de fournir des fournitures scolaires, des vêtements moins chers, etc. pour les enfants à l'école de partir pour une nouvelle année. Ce genre de tweak pourrait être mis en œuvre en ayant une table de plage de dates pour chaque JurisdictionTaxCodeRate partir dans l'avenir dans la mesure où ils peuvent être planifiées.

Autres conseils

Ma suggestion serait d'utiliser des tables de base de données pour ce qu'ils sont bons pour (stockage de valeurs) et des règles pour ce qu'ils sont bons pour (la logique métier). Je certainement pas mettre des choses comme les taux d'imposition ou des listes de juridictions dans les règles - celles-ci devraient être dans les tableaux. Ce que j'utiliser un moteur de règles pour définir est la logique qui détermine le taux à appliquer à quelles transactions. Ainsi, par exemple, si j'achète un ensemble de produits en ligne à partir d'une société basée dans l'État X que les navires d'Etat Y à trois endroits différents, ce taux d'imposition applicables auxquels des parties de la transaction? Cette combinaison de règles et de tables de base de données est très fréquent - les règles assurez-vous de regarder les bonnes choses alors que les tables d'aide dans les rapports, etc. Par exemple, la Californie DMV a fait avec les frais d'immatriculation des véhicules - tous les différents frais sont stockés dans un base de données alors que les règles qui déterminent les frais auxquels s'applique la voiture sont gérées dans une base de règles. Si vous essayez de mettre tout dans les règles, vous ne serez pas en mesure de rapporter bien et si vous essayez de mettre tout dans les tables de base de données, vous finirez avec des dizaines de tables pour gérer toutes les exceptions et les cas d'angle. JT

Voici un exemple d'une ville « règle d'origine » dans la région de Denver, CO région métropolitaine:

http://www.c3gov.com/pages/about/division_salestax.html

Vous, en tant que détaillant, peut aussi avoir besoin d'envoyer les paiements d'impôts à des endroits différents. Pour les villes qui ne sont pas « règle d'origine » des villes (ce qui est un terme spécial qui s'applique probablement au Colorado, mais probablement chaque Etat a un terme tout aussi spécial comme celui-ci), vous envoyer tous les paiements d'impôts à l'Etat qui sera puis les traiter sur les parties concernées. Colorado a une fonction où il y a des « districts fiscaux spéciaux » qui sont autorisés à percevoir les taxes de vente pour certains avantages (sur le lien par exemple, RTD est le quartier des transports en commun, et « Invesco Field » est le stade où les Broncos de Denver jouer).

Pour élargir la réponse de M. Tallent sur ce fil, vous aurez besoin d'inclure également dans le tableau de la compétence d'une certaine façon de représenter que les taxes peuvent aller à des endroits différents.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top