Мультивалютная передовая практика и реализация - программирование
Подтвердить что ты не робот

Мультивалютная передовая практика и реализация

Мне сложно найти какое-либо обсуждение лучших практик для работы с несколькими валютами. Может ли кто-нибудь предоставить некоторые идеи или ссылки, чтобы помочь?

Я понимаю, что есть несколько способов сделать это - либо транзакционно, где вы храните введенное значение, либо функционально, где вы конвертируете в базовую ставку. В обоих случаях необходимо сохранить обменный курс, который охватывает время транзакций для каждой валюты, которое может потребоваться для его конвертации в будущем.

Мне нравится гибкость транзакционного подхода, который позволяет вводить информацию старого обменного курса позднее, но, вероятно, имеет больше накладных расходов (так как вы должны хранить больше данных обменного курса), чем функциональный подход.

Производительность и масштабируемость являются основными факторами. У нас есть (все .net) победитель и веб-клиент, набор отчетов и набор веб-сервисов, которые обеспечивают функциональность для базы данных. Я могу кэшировать информацию о обменном курсе где-нибудь (например, на клиенте), если это необходимо.

EDIT: Мне бы очень хотелось, чтобы ссылки на некоторые документы или ответы, которые включают "gotchas" из предыдущего опыта.

4b9b3361

Ответ 1

Я не мог найти окончательного обсуждения, поэтому я публикую свои выводы, я надеюсь, что это поможет кому-то.

Таблица валют должна включать код культуры, чтобы использовать любые классы глобализации.

Транзакционный метод

  • Хранить в валюте локально для клиента и хранить несколько коэффициентов конверсии для валюты транзакции, которая применяется при совершении транзакции.
  • Требуется несколько обменных курсов для каждой валюты.
  • Таблица настроек сайта сохранит входную валюту
  • Ввод и вывод значений на уровне клиента не будет иметь накладных расходов, поскольку можно предположить, что значение находится в правильной валюте.
  • Чтобы применить обменные курсы, вам нужно знать валюту введенных значений (что может быть разным для отчетов с кросс-клиентами), а затем умножить это на связанный с ним обменный курс сущности, который был действителен в течение периода транзакций.

Функциональный метод

  • Храните в одной базовой валюте, удерживайте ставки конверсии для этой валюты, которые применяются с течением времени.
  • Учет должен быть задан в точке между интерфейсом и базой данных - лучшее место для преобразования значений
  • Эффективность ввода незначительно влияет на то, что конверсия в базовую валюту должна произойти. Обменный курс можно кэшировать на клиенте (обратите внимание, что каждый объект может использовать другой обменный курс).
  • Для этого потребовался один набор обменных курсов (от базовой до всех других необходимых валют)
  • Чтобы применить обменные курсы, каждая транзакция должна быть конвертирована между базой и требуемыми валютами.

Композитный

  • В точке транзакции храните транзакционное значение и функциональное значение, таким образом, информация о обменном курсе не требуется хранить. (Это не подходит для решения, поскольку оно эффективно ограничивает вас двумя валютами для любого заданного значения)

Сравнение

Реально, вам нужно выбирать между функциями и транзакционными методами. Оба имеют свои преимущества и недостатки.

Функциональному методу не нужно хранить местную валюту для транзакции, необходимо преобразовать текущие значения db в базовую валюту, требуется только один набор обменных курсов, немного сложнее реализовать и поддерживать, хотя требует меньшего объема хранения.

Метод транзакций гораздо более гибкий, хотя он требует большей информации о курсах обмена, и каждая транзакция должна быть связана с входной валютой (хотя это может применяться к группе клиентов, а не к каждой транзакции). Это, как правило, не повлияет на код, уже существующий в производстве, поскольку локальные валюты все равно будут использоваться на местном уровне, что упростит внедрение и поддержку этого решения. Хотя очевидно, что будут затронуты любые отчеты или значения, которые необходимо преобразовать в другую валюту.

В обоих случаях для каждой транзакции потребуются обменные курсы за время транзакции для каждой валюты, в которой она нуждается, - это необходимо в точке транзакции для функционального метода, однако транзакционный метод обеспечивает большую гибкость по сравнению с данными прошлых обменных курсов вводиться в любое время (позволяя использовать любую валюту), т.е. вы теряете возможность использовать другие обменные курсы в функциональном методе.

Заключение

Транзакционный метод управления валютой обеспечит гибкий подход, избегая любого негативного влияния на производительность клиента и модификацию кода нулевого клиента. Отрицательное влияние на производительность, вероятно, произойдет в отчетах, в которых все потребуются для повторной обработки, если требуются разные валюты. Каждому клиентскому сайту необходимо будет сохранить ссылку на валюту, в которой указывается, что представляет собой их входная валюта. Должно быть возможно уйти с сохранением обменных курсов на высоком уровне (например, группой клиентских сайтов и т.д.), Это позволит свести к минимуму объем хранимых данных. Проблемы могут возникать, если информация о обменном курсе требуется на более низком уровне.

Ответ 2

Нет единого ответа, поскольку он очень зависит от того, как бизнес обрабатывает транзакции в этих валютах. Некоторые компании используют довольно сложные способы управления иностранной валютой. Я предлагаю вам прочитать многовалютную отчетность.

Главное - захватить данные в единице, значение и дату, в которой бизнес-транзакция выполняется без какого-либо преобразования, или вы рискуете потерять что-то в переводе. Для отображения и отчетности конвертируйте по требованию, используя либо исходный обменный курс, либо любой другой обменный курс в зависимости от намерения пользователя.

Сохранять и вычислять значения в виде типа "Десятичный" (в С#) - не используйте float/double или вы не подвергаетесь уязвимости для ошибок округления.

Например, способ, которым я использовал несколько валютных приложений в предыдущей жизни, был следующим:

  • Каждый день будут установлены обменные курсы на день, и это будет сохранено в базе данных и кэшировано для преобразования в приложение.
  • Все транзакции будут учитываться как значение + валюта + дата (т.е. без преобразования)
  • Отображение транзакции в валюте пользователя было сделано "на лету". Проясните, что это не валюта транзакции, а валюта отображения. Это похоже на выписку по кредитной карте, когда вы отправились в отпуск. Он показывает сумму иностранной транзакции, а затем, сколько она окажется в вашей национальной валюте.

Ответ 3

Наша компания занимается учету и бюджетированием нескольких валют. Реализованное нами решение довольно прямолинейно и включает в себя следующее:

  • таблица с одной валютой, с несколькими полями, включая числа десятичных знаков, которые необходимо учитывать для валюты (да, некоторые валюты должны управляться с помощью трех десятичных знаков...) и значение обменного курса, у которого нет другого что означает "предлагаемый/обменный курс по умолчанию" при оценке "неисполненных" или "ожидающих" финансовых транзакций (см. ниже)

  • В этой таблице валют одна из записей имеет обменный курс 1. Это основная/сводная валюта в нашей системе.

Все финансовые операции или все операции с финансовым измерением (что мы называем обязательствами на нашем языке) либо сортируются как "ожидающие" или "выполняемые":

  1. Ожидающими транзакциями являются, например, счета-фактуры, которые, как ожидается, будут получены за определенную сумму на определенную дату. В нашей системе контроля за бюджетом эти суммы всегда переоцениваются в соответствии с "предлагаемым/обменным курсом по умолчанию", доступным в таблице валют.

  2. Выполненные транзакции всегда сохраняются с курсом даты, количества, валюты И, который должен быть подтвержден/введен при вводе данных выполнения.

Ответ 4

(Я предполагаю, что вы уже знаете, что определенно не следует хранить данные в валюте как float и почему)

По моему мнению, работать с единой базовой валютой может быть проще; однако вы должны сохранить первоначальную сумму, первоначальную валюту, коэффициент конверсии и сумму базовой валюты - в противном случае ваш учетный отдел. могут съесть вас живыми, так как они, вероятно, будут хранить разные валюты отдельно.

Ответ 5

Так как обменные курсы колеблются, один подход, как вы упомянули, - хранить сумму "введено как есть", которая не конвертируется, но отображает поле сопутствующего объекта, которое отображается только и показывает конвертированную сумму. Чтобы сделать конверсию, потребуется таблица обменных курсов и соответствующие диапазоны дат. Если размер этого мал, кеширование на клиенте является опцией. В противном случае для выполнения преобразования потребуется удаленный вызов.