jasonOk
@jasonOk
Легче болтать, чем код писать

Как работать с ценами в разной валюте?

Привет!

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

Вопрос: как организовать сортировку и фильтрацию товаров по цене, учитывая, что 1-й пользователь выбрал показ товаров от 100 рублей, а второй ввёл "только с ценой ниже $10"?

Есть ли вообще смысл заморачиваться по этому вопросу с ElasticSearch, тем более, что курс меняется каждый день?
Как подобное решено, например, у eBay?
  • Вопрос задан
  • 1170 просмотров
Пригласить эксперта
Ответы на вопрос 6
Хранить значения в одной (универсальной) валюте. С сортировкой проблем быть не должно. Что касается фильтрации, то просто конвертировать значение фильтра в универсальную валюту.

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

При выводе можно конвертировать на лету, выводиться ведь будет немного записей. В крайнем случае, если будут проблемы с производительностью, можно кешировать.
Ответ написан
Комментировать
@dravor
Задавая подобный вопрос нужно помнить, что большинство программистов никогда не работали с финансами и не представляют причины возникновения слова "бухгалтерия" (в которой свои правила работы с числами).
На этот вопрос ответ может быть только один: ваш код должен полностью повторять реальные процессы работы с финансами в данном сервисе: при оплате сумма пересчитывается по курсу - код пересчитывает цифры в онлайне, под каждую валюту финансисты ведут свои цифры - код не занимается отсебятиной.
Ответ написан
Комментировать
@akurash
Для начала вам нужно проконсультироваться со своими финансистами/экономистами/бухгалтерами (кто занимается ценообразованием и отвечает за цены). Консультация нужна для того, чтобы выяснить, будет ли допустимым хранение только одной учетной цены в учетной валюте при условии, что все остальные цены (в других валютах) будут формироваться на лету путем пересчета учетной цены по курсу.
В ряде случаев это недопустимо, т.к. внезапно может выясниться, например, что ваши ценовики для формирования цен используют свои собственные представления о том, как именно нужно их формировать, и эти представления могут отличаться от логики вашего ПО (например, могут отличаться правила округления при пересчете по курсу, или не все полученные цифры удастся объяснить с точки зрения представлений программиста о математике и/или о здравом смысле).
Также может оказаться, что все цены в разных валютах фиксируются в бумажных документах (прейскурантах или т.п.) за подписью каких-либо должностных лиц, и эта фиксация происходит не ежедневно с учетом изменяющегося курса, а, к примеру, раз в месяц, или по факту изменения учетной цены. Если фиксация цен имеет место, то скорее всего цены на сайте всегда должны будут соответствовать ценам в документах, а не просто вычисляться по ежедневному курсу.
Дальнейшую стратегию нужно строить с учетом всплывших обстоятельств ценообразования. В идеале никаких нюансов не обнаружится и вы будете вольны реализовать работу с ценами по собственному усмотрению.
Ответ написан
Комментировать
@RidgeA
хранить цену в одной валюте, при запросах делать пересчет с помощью скриптов

https://www.elastic.co/guide/en/elasticsearch/refe...

https://www.elastic.co/guide/en/elasticsearch/refe...

https://www.elastic.co/guide/en/elasticsearch/refe...
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
Обычно в системе фигурирует учетная валюта. Ну и на лету или стационарно вычисляемая иная валюта. В определенных ситуациях пересчет в иную валюту может оказаться не в лоб по кросс-курсам, а еще и с учетом конвертационных издержек. В общем случае это может быть нечто типа y=ax+b или даже посложнее с учетом (%, но не менее хх монет)
Ответ написан
Комментировать
@mamontovdmitriy
PHP Developer
Воспользуйтесь паттерном Money
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы