Какая общая методология добавления валют на сайт,
- например, можно сделать для документа в базе, три новых ключа на каждую валюту,
и выводить её в карточке, это удобно, меняя слово триггер в поле вывода. Но минусы, к примеру, каждую необходимо ночь обходить все позиции и синхронизировать их с новым курсом.
- можно при запросе товара для карточки отправлять тип валюты, получать в ответе мультипликатор значения, на которое можно умножить и конвертировать валюту на странице,
Как в данном случае, лучше синхронизировать прайсы к курсу валюты и их получать?
Можно ли обойтись одной ценой в базе, и далее умножая на коэффициент получать нужную валюту?
GNUBack,
но, в данном случае имея схему:
- прайс лист в csv формате, где наверно курс и указан и берётся где-то.
- или прайс-лист генерируется от базы в сsv формат, и изменения прайса уже синхронизируются с базой.
Сервер один раз в день получает курс, и дальше отдаёт мультипликатор число на клиент?
Мне тоже нужны были исторические данные по ценам и прайслисты.
Я сделал сущность Price и таблицу к ней prices, со следующими полями
currency как ENUM("EURO","USD","CNY","RUR")
value как int, стоит заметить что мы храним деньги в копейках, центах и прочее
created_at чтобы в будущем фильтровать их по дате
Теперь везде, где мне нужна цена, я указываю price_id и все.
Все расчеты внутри компании мы проводим в Долларах США.
Там, где нужно выйти за пределы компании, можно запросить для каждой цены курс, так как дата этой цены известна в created_at.
сделал просто, у товара есть базовая стоимость по базовой валюте,
если покупатель выбирает на сайте другую валюту,
то в товаре есть объект с курсом валют на текущий день (хотя правильней наверно использовать какой-либо глобальный объект window или т.п.),
страница перезагружается и клиент пересчитывает стоимость,
всё как string,
если нужна конвертация или калькуляция, то в js это не проблема, для преобразования в цифры.
но есть нюанс в кол-ве знаков после запятой и округлении, при подсчёте некоторые значения давали на 1 копейку меньше,
тут нужно делать тесты.
также новая валюта и пересчёт добавляется в новый объект корзины и отправляется в базу данных.
formasters777, Существует еще пара моментов.
1. Иногда для разных валют может быть разная цена, на которую влияет к примеру стоимость процессинга (разный процессинг при оплате разными валютами), платежные системы, дополнительные комиссии на ввод/вывод и прочее. Даже разный VAT в случае с евро и странами ЕС.
2. Есть задачи маркетинга, у которых должна быть красивая цена $10.99. IKEA так делает, в каждой стране красивая цена но в локальной валюте.
Можно обоими способами. Тут уже от бизнес задачи зависит.
Делал по второму способу сначала. Вручную указывали курс по отношению к валютам. Все это работало, пока не поступила задача, делать "Красивые прайсы".
И в итоге остановились на первом пункте. Чтобы делать прайсы по типу -
$99.99, RUB7.699 и тд.
Например, если есть три валюты,
при выборе валюты на клиенте, происходит перезагрузка и отправляется запрос с значением типа валюты, сервер видит значение,
и для этого значения отправляет число мультипликатор для умножения,
сервер создаёт мультипликатор раз в сутки,
но в данном случае данные должны быть в body или кукис?
или мне добавлять объект в ответ с уже действительными цифрами валют, и умножать всё на единицу,
и в корзине фактическая цена, которая есть изначально в документе продукта, она уже не учитывается при расчёте в этом случае?
но в данном случае данные должны быть в body или кукис?
Где угодно, как правило или в сессии или в куках.
сервер создаёт мультипликатор раз в сутки,
Это неважно. Хоть каждый час проверять курс валюты. О чем действительно стоит задуматься на этом этапе, к примеру:
Допустим, у вас базовая цена на товар считается в долларах. К пример юнит стоит 10 долларов.
Это вы записываете в систему,
Далее в модели товара создаете функцию, типа
public function getPriceByCurrency($currency) {
// и вот здесь, и для доллара и для другой любой валюты делаете калькуляцию.
$price = $this->price;
if ($currency === 'usd') {
return $price;
}
if ($currency === 'rub') {
return $price * Helper::getUsdRubRate() * Helper::COEF_ANOTHER_CURRENCY; // тут можно добавить даже множитель на 2-5 процентов, чтобы курс был выгоден вам.
}
}
Куда передаете текущую валюту клиента.
или мне добавлять объект в ответ с уже действительными цифрами валют, и умножать всё на единицу,
Как вам удобнее, можно сделать этот функционал десятками способов, хоть без перезагрузки страницы, хоть с перезагрузкой.
ЦБ устанавливает курс на следующий день в 11-30 текущего дня. Соответственно на текущий день курс уже известен заранее.
В итоге для вашей задачи проще получить 1 раз в день курсы всех валют по отношению к рублю из сервиса цб: www.cbr.ru/development/sxml
И сохранить их в БД.
Потом при обращении к карточке товара просто умножать цену на коэффициент валюты. И не нужно будет в базе хранить значения на каждую валюту.
Это интересное решение, но как быть тогда с теми данными, что приходят, как оформленный заказ.
например если, в продукте, есть изначально базовая цена, в какой-либо валюте.
И человек меняет валюту, значения для UI перемножаются, и визуально мы видим новый прайс,
но если человек оформляет заказ, то в данном случае, нужно менять существующее значение в документе продукта Price: "12.99" на новую валюту?
или добавлять к объекту новые ключи с значением Price: "3.45" и Currency: "USD", и CurrencyThisDay: "1=17.43USD"
и при просмотре заказа, делать проверку на значение Currency и выводить на UI тип валюты к заказу.
В таком случае базовый документ изменится на следующий: