axis / axiscommerce

Open Source Shopping Cart
axiscommerce.com
GNU General Public License v3.0
1 stars 1 forks source link

Работа с валютами #147

Open kehskas opened 12 years ago

kehskas commented 12 years ago

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

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

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

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

vovayatsyuk commented 12 years ago

Это сильное усложнение логики. К каждому продукту необходимо добавлять валюту.

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

Так что это, как сказали из команды Магенто, скорее нереально.

kehskas commented 12 years ago

У магенто логика работы другая. Поэтому все плачут колются но продолжают есть все тот же кактус... Достаточно поиском пройтись по этой проблеме. Для владельцев ИМ картина более чем унылая.

Без добавления валюты действительно никак. Я не силен в нынешней версии MySQL но припоминаю что вроде как можно выполнять арифметические операции в процессе запроса.

Поле "валюта" для товара, не более чем связь с конкретным числовым значением в другой таблице. Даже если курсы у поставщиков разные, это не имеет значения. Можно взять базовые курсы с РБК или cbr.ru и на основе их добавить свои варианты валют с %-м или другим модификатором для каждого поставщика или тупо установить фиксированное значение. Как правило большего и не требуется.

Ну если говорите нереально, придется пока кормить фрилансеров опенкарта ;) они по крайней мере знают какие костыли нужны.

vovayatsyuk commented 12 years ago

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

Пример как это можно сделать с помощью стороннего модуля.

Нужно создать такие таблицы: supplier, supplier_product, supplier_currency_rate.

supplier (id, name, base_currency_id) - список поставщиков. По типу таблицы производителей. base_currency_id - валюта в которой поставщик передает цены (возможно эта колонка и ненужна). supplier_product (supplier_id, product_id) - привязка продуктов к поставщику. Отдельная таблица тут необязательна. Может быть такая же колонка как manufacturer_id в таблице catalog_product supplier_currency_rate (supplier_id, currency_id, rate) - Приявязка наших валют к курсам обмена поставщика. Курсы наших валют будут использоваться только если у продукта нет поставщика.

Исходные данные подготовлены и это было самое меньшее что нужно сделать.

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

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

kehskas commented 12 years ago

Не стоит так усложнять. Зачем нужен поставщик и иже с ними, если от него требуется только курс обмена который привязывается к конкретному товару? Тем более что поставщик в моем понимании это дистрибьютор, а у него может быть несколько брендов (производителей).

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

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

Работа конечно орфографию править, но она решает одну из двух главных задач по поддержке актуальности, которые стоят перед каждый владельцем ИМ имеющим прайсы в разных валютах. Это реально самая геморойная проблема при эксплуатации и системно, кроме Virtuemart её еще никто не решил. На вашем этапе развития еще стоит добавить этот функционал по умолчанию, дальше - будет еще сложнее или вовсе невозможно.

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

vovayatsyuk commented 12 years ago

Посмотрел. В демке нашел только указание валюты для каждого продукта.

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

Тогда цена продукта будет считатся так:

цена / курс_скрытой_валюты_для_перевода_в_базовою * курс_валюты_пользователя

kehskas commented 12 years ago

Да. Функционала VM будет достаточно. Эти внутренние курсы и валюты действительно должны быть недоступны для фронтэнда. См.первое сообщение.

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

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

Базовые курсы уже есть: Локализация > Валюты (обновление автоматически? настройки источника?) Необходима возможность использовать их, или их реплику/ссылку на них, в том числе (присутствие в выпадающем списке выбора валют в карточке товара).

Хранить какие-то особенные курсы для каждого поставщика (у кого-то +2% к базе по ЦБ, у кого-то +3%, у некоторых вообще фиксированый) вероятно разумнее в Каталог > Курсы обмена / валюты поставщиков. Или что-то типа того.

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

kehskas commented 12 years ago

Да. Могу написать раздел справки посвященный этой возможности.

kehskas commented 11 years ago

Еще один движок где есть реализация подобного http://www.tabernacms.com/

Вполне. Функция работы с валютами - то что надо, но нет автоматического обновления.