web-dev-qa-db-fra.com

Multi-devises - quoi stocker et quand convertir?

J'ai lu différentes questions et réponses sur SO concernant les devises multiples, mais aucune d'entre elles n'est claire pour moi ou ne fournit pas suffisamment de détails concernant mon cas d'utilisation.

Scénario:

La société Raddo possède 3 succursales, au Royaume-Uni, en France et aux États-Unis. Raddo a une devise de base en dollars américains. Les budgets sont créés en dollars américains. Raddo stocke les taux de change des devises prises en charge dans la base de données.

Au Royaume-Uni, les employés créent des bons de commande en livres sterling et en France, ils créent des bons de commande en euros.

Q1: Que doit-on stocker dans le tableau de la base de données des bons de commande/postes de commande - Devise de la succursale et taux de change actuel ou montants convertis en devise de base en dollars américains? Veuillez garder à l'esprit que le taux de change doit être celui au moment de la création de la commande d'achat.

Q2: Que convertir et quand, pour pouvoir générer des rapports en dollars US/devise de base?

Q3: quel est l'impact sur les données existantes si quelqu'un dit, après 2 ans, changer la devise de base du dollar américain en dollar australien australien?

Q4: Quelle est la meilleure façon de gérer les devises multiples afin que l'application gère le nombre minimum de conversions?

22
Iffi

Gardez à l'esprit que les réponses que vous recevrez seront subjectives. Avec cette clause de non-responsabilité, c'est ainsi que je procéderais pour mettre en place un tel système.

TL; DR: utilisez un tableau des taux de change pour stocker les taux de change pour différentes devises et dates lorsqu'elles sont applicables. Stockez les montants dans la devise locale et dans une valeur USD calculée.


n tableau des taux de change

Créez une table de devises (taux de change) du formulaire:

FX_RATES 
-------- 
SOURCE_CURRENCY  -- e.g. USD, GBP, EUR 
TARGET_CURRENCY  -- as above 
EXCHANGE_RATE    -- a suitable decimal field representing the conversion 
VALID_FROM_DATE  -- date range when the above exchange rate is valid 
VALID_TO_DATE    -- as above 
  • La combinaison des 4 premières colonnes représentera un enregistrement unique.
  • Il est recommandé que chaque fois qu'un enregistrement pour une paire de devises (USD -> GBP) est entré, l'enregistrement inversé équivalent est également inséré (GBP -> USD), soit avec le taux de change réel (les conversions dans un sens peuvent utiliser un taux différent que dans l'autre sens), ou avec l'inverse de l'enregistrement d'origine.
  • Pour une paire de devises, les lignes successives doivent présenter la continuité des dates (c'est-à-dire que pour une paire de devises, il ne doit jamais y avoir de date qui ne se situe pas entre VALID_FROM_DATE et VALID_TO_DATE sur exactement une ligne).
  • Pour plus de commodité, entrez également une seule ligne ('USD', 'USD', 1, smallest_date, largest_date) avec les dates les plus petites et les plus grandes prises en charge par les bases de données. Cela facilite le traitement des cas lorsque les entrées sont effectuées dans la devise de base elle-même.
  • Vous devrez déterminer une source de taux de change des devises qui alimente ce tableau, ainsi qu'une fréquence de mise à jour. Par exemple, votre équipe financière peut publier un tableau de taux de change hebdomadaire (même si les valeurs sur le marché des devises changent quotidiennement).

Un exemple de tableau ressemblerait à ce qui suit. Bien qu'il semble qu'il y ait des chevauchements entre la date de fin d'une ligne et la date de début de la suivante, l'opération de recherche vérifie l'égalité uniquement sur une colonne (c'est-à-dire >= VALID_FROM_DATE AND < VALID_TO_DATE)

SOURCE_CURRENCY TARGET_CURRENCY EXCHANGE_RATE          VALID_FROM_DATE VALID_TO_DATE 
--------------- --------------- ---------------------- --------------- -------------- 
GBP             USD             1.250000               06-Mar-2017     13-Mar-2017 
GBP             USD             1.260000               13-Mar-2017     20-Mar-2017 
GBP             USD             1.240000               20-Mar-2017     27-Mar-2017 
GBP             USD             1.250000               27-Mar-2017     03-Apr-2017 
USD             GBP             0.800000               06-Mar-2017     13-Mar-2017 
USD             GBP             0.793651               13-Mar-2017     20-Mar-2017 
USD             GBP             0.806452               20-Mar-2017     27-Mar-2017 
USD             GBP             0.800000               27-Mar-2017     03-Apr-2017 
USD             USD             1.000000               01-Jan-1900     31-Dec-9999 

Colonnes dans la table PO

Dans le tableau des bons de commande, conservez les champs suivants:

PURCHASE_ORDERS 
--------------- 
... other fields 
PO_TXN_DATE         -- Date for the PO that represents the financial transaction 
ORDER_VALUE_LOC     -- Decimal field with the order value in local currency 
ORDER_CURRENCY_LOC  -- The currency used for ORDER_VALUE_LOC (e.g. GBP/EUR) 
ORDER_VALUE_USD     -- The order value in USD (as this is the company's base currency) 
... other fields 

Remplissage des colonnes PO

Il y aura déjà un processus qui remplira la table PO, qui devra être étendu pour remplir les champs suivants:

  • PO_TXN_DATE est la date de la transaction financière sur le bon de commande. Selon les règles de votre entreprise, il peut s'agir ou non de la date de création/augmentation du bon de commande.
  • ORDER_VALUE_LOC est la valeur de la transaction dans la devise locale.
  • ORDER_CURRENCY_LOC est le code de devise pour la devise locale.
  • Ces trois champs seront utilisés pour rechercher le tableau des taux de change.
  • ORDER_VALUE_USD est renseigné en recherchant le taux de change dans le FX_RATES table:

Remplir ORDER_VALUE_USD est démontré par le pseudo-code suivant

ORDER_VALUE_USD = PURCHASE_ORDERS.ORDER_VALUE_LOC * FX_RATES.EXCHANGE_RATE 
                  WHERE 
                        FX_RATES.SOURCE_CURRENCY = PURCHASE_ORDERS.ORDER_CURRENCY_LOC 
                    AND FX_RATES.TARGET_CURRENCY = 'USD' 
                    AND PURCHASE_ORDERS.PO_TXN_DATE >= FX_RATES.VALID_FROM_DATE 
                    AND PURCHASE_ORDERS.PO_TXN_DATE <  FX_RATES.VALID_TO_DATE 

Réponses aux questions de l'OP

Q1: Que doit-on stocker dans le tableau de la base de données des bons de commande/postes de commande - Devise de la succursale et taux de change actuel ou montants convertis en devise de base en dollars américains? Veuillez garder à l'esprit que le taux de change doit être celui au moment de la création de la commande d'achat.

Comme mentionné, dans le tableau des bons de commande, stockez la valeur en devise locale, la date de transaction, le nom de la devise locale; calcule et enregistre également la valeur dans la devise de base (USD). Le taux de change peut être recherché à nouveau si nécessaire, il n'est pas nécessaire de le stocker de manière redondante ici.

La valeur en USD est stockée ici pour permettre une agrégation plus facile dans une seule monnaie (par exemple pour générer un rapport qui montre la valeur totale des bons de commande en attente à envoyer au siège social). Si le besoin d'un tel cas d'utilisation est faible, il n'est pas nécessaire de stocker la valeur en USD, elle peut être calculée à partir du tableau des taux de change pour les durées requises. Cependant, la question suivante implique qu'il y aura un besoin raisonnable d'obtenir la valeur dans la devise de base (USD).

Q2: Que convertir et quand, pour pouvoir générer des rapports en dollars US/devise de base?

En stockant les valeurs dans la devise de base et en USD, ces rapports seront grandement simplifiés. C'est la raison pour laquelle nous prenons le coût unique du calcul et du stockage de la valeur USD, afin qu'elle puisse être lue plusieurs fois.

Q3: Quel est l'impact sur les données existantes si quelqu'un - disons après 2 ans - change la devise de base du dollar américain en AUD dollar australien?

Techniquement, si une telle modification est attendue, ne nommez aucune structure de base de données avec USD, utilisez plutôt quelque chose de générique comme BASE. :-)

Si un tel changement est effectué, la division financière de l'entreprise vous indiquera comment retraiter les données financières - par ex. devez-vous recalculer les valeurs de base en fonction du taux de change en vigueur au moment de la transaction, ou simplement utiliser un facteur de conversion fixe? Dans tous les cas, une fois cette décision prise, il vous suffit de saisir les facteurs de conversion appropriés dans le FX_RATES table et exécutez un processus unique pour repeupler le PURCHASE_ORDERS.ORDER_VALUE_BASE colonne. Hormis le taux de change, toutes les autres informations pour cette recherche sont déjà présentes et inchangées dans le PURCHASE_ORDERS table.

Q4: Quelle est la meilleure façon de gérer plusieurs devises afin que l'application gère le nombre minimum de conversions?

Cela dépendra à nouveau des besoins de votre entreprise, ce ne sera pas une décision technique. S'il est nécessaire de déclarer fréquemment à la fois la devise locale et la devise de base (USD), il est utile de stocker les valeurs de transaction pertinentes dans les deux devises. En le calculant une fois et en le stockant, vous pouvez bénéficier de l'accès aux données stockées par la suite.

De plus, comme vous ne supprimez aucune donnée, vous pouvez toujours recalculer les données financières si nécessaire. Voici certains scénarios où cela peut être requis:

  • Une décision d'entreprise est prise que la devise de base est calculée en utilisant le taux de change en vigueur au moment de l'augmentation de la commande, mais la devise de base (USD) doit être recalculée lorsque la commande est fermée ou facturée. Dans un tel cas, vous utiliseriez une date différente pour rechercher le FX_RATES table au moment de la fermeture du bon de commande.
  • Si la livre bat soudainement et passe de 1 GBP = 1,25 USD à 1,5 GBP = 1 USD, vous devrez peut-être calculer l'impact en dollars d'un tel changement. Ensuite, vous pouvez obtenir la différence entre la valeur stockée ORDER_VALUE_USD et une valeur recalculée en utilisant le taux de change d'aujourd'hui à partir du FX_RATES tableau, pour déterminer l'impact en dollars d'un tel changement.

Q5: Le taux de change au moment de la transaction ne peut-il pas être enregistré dans le tableau des bons de commande? De cette façon, le système n'a pas besoin de rechercher le taux de change dans le tableau des taux de change. (Question via un commentaire de suivi)

Le taux de change peut certainement être stocké dans la table PO, au lieu du montant en USD. Il n'y a rien de intrinsèquement "mauvais" dans le stockage des taux de change dans le tableau des bons de commande, ni rien de "correct" dans le stockage du montant en USD à la place.

Bien sûr, cela mènera alors à une question de - d'où obtenez-vous le taux de change afin de le remplir dans la table PO, si vous ne le stockez pas dans une table de recherche en premier lieu. Gardez à l'esprit que dans les grandes sociétés mondiales, les taux de change ne seront probablement pas renseignés via l'application LOB elle-même, il s'agira d'une source externe, telle qu'une équipe de taux de change qui détermine les taux de change à utiliser dans toute l'entreprise. Dans un tel cas, le stockage des taux de change dans une table séparée est plus pratique.

J'ai énuméré ci-dessous certains des avantages des différentes approches. Vous devez choisir celui (s) que vous utilisez en fonction de vos besoins.

  • Avantage du stockage des USD dans le tableau des bons de commande : les montants en USD sont directement disponibles sans nécessiter de calcul supplémentaire (c.-à-d. Pas besoin de calculer ORDER_VALUE_LOC x EXCHANGE_RATE lors de l'exécution d'un rapport).
  • Bénéficiez d'une table de taux de change séparée : les taux de change sont stockés de manière centralisée dans une seule table, ce qui facilite la mise à jour et la révision ( rappelez-vous que les grandes entreprises peuvent avoir une équipe distincte fixant les taux de change pour une utilisation à l'échelle de l'entreprise ), ainsi que valider ( par exemple pour vérifier la continuité des taux de change - dans l'exemple ci-dessus, il est trivialement simple de vérifier qu'il n'y a pas d'espace pour les taux de change en enchaînant les dates de début/fin valides sur les lignes successives ). Les taux de change ne sont pas répartis sur plusieurs tables.
  • Avantage du stockage du taux de change dans la table PO : Pas besoin d'un FX_RATES table.

Bien sûr, vous pouvez stocker de manière redondante des informations supplémentaires (échange de stockage) pour obtenir un avantage (par exemple, dans la table PO, vous stockez le montant en devise locale, le taux de change et le montant USD, ainsi que conserver une table de taux de change distincte. vous permet d'imprimer facilement des documents de commande affichant le montant en devise locale et le taux de change utilisé pour le convertir en USD. Dans le même temps, le tableau des taux de change reste une source faisant autorité de taux de change).

N'oubliez pas que la question - et ses réponses - sont subjectives, il n'y a donc ni bien ni mal. Adaptez toutes ces recommandations à vos besoins et aux normes de votre entreprise.

34
Phylyp

Habituellement, vous utilisez la monnaie du pays où l'entreprise a sa base et vous payez ses impôts. Vous devez donc convertir les autres devises en $ US avec un taux de change valide au moment de la transaction. Les conversions ont lieu dès que vous obtenez toutes les données. L'impact du changement de devise est inconnu car il peut changer une multitude de choses non seulement la devise. Je ne sais pas quelle est la meilleure façon, mais il semble logique de garder une trace de tous les taux de change chaque fois qu'une transaction se produit, afin que vous puissiez fournir les données appropriées.

1
Zed McJack