Вы здесь

Как конвертирование валюту заказа в рубли или гривны?

1

Здравствуйте.
На сайте используется Commerce, в котором настроено две валюты - USD и RUB.
Также установлен модуль оплаты "Интеркасса" (https://www.drupal.org/project/commerce_interkassa). Всё настроено и работает правильно. Но есть одна проблема.

Ранее сам платёжный шлюз интеркассы (interkassa.com) поддерживал 4 валюты - рубли, гривны, доллары и евро. Около года назад они отказались от долларов и евро и инвойсы допустимо формировать и принимать платежи теперь можно только в рублях или гривнах.

При добавлении товара в корзину оно создаёт сущности с указанием той валюты, которая указана при создании самого товара. То есть если администратором товар был добавлен с указанием цены в долларах, то сущность тоже создаться в корзине покупок в долларах. И наоборот - если в рублях, то в рублях. В итоге получаем total_amount у заказа то в рублях, то в долларах (в зависимости от того, в какой валюте была указана цена модератором при создании самого товара).

Собственно сама проблема:
Если total_amount получается в рублях - то в модуль Интеркассы передаётся информация о заказе и total_amount в рублях и всё работает и проходить как нужно. Но если в модуль Интеркассы передаётся total_amount в долларах, то она пытается сформировать инвойс в долларах, а платёжный шлюз (interkassa.com) больше неподдерживает кошельки в долларах и выдаёт ошибку по этому поводу.

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

Я вижу следующие варианты.

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

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

Также может быть есть какие то альтернативы? Буду рад любым советам.

UPD. Наблюдение:
- Если добавить в корзину товар сформированный рублях, то в разделе "Корзины покупок" мы увидим, что на всех этапах [Корзина > Оформление заказа > Оплата] total_amount (Итого) будет всегда в рублях и в итоге мы откроем страницу оплаты Интеркассы со счётом в рублях для оплаты.
- Если добавить в корзину товар сформированный в ДОЛЛАРАХ, то в разделе "Корзины покупок" на этапе [Корзина] total_amount (Итого) будет ещё в рублях. А при переходе на этап [Оформление заказа] становится уже в долларах. Дальше при переходе к оплате - ошибка Интеркассы из за счёта в долларах.
- Если добавить в корзину ДВА ТОВАРА, один сформированный в долларах, другой в рублях, то как и в первом случае на всех этапах total_amount будет рубли, дойдём до оплаты и нормально откроется страница оплаты в рублях и без ошибок.

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

Версия Drupal: 
7.x
Связанные проекты: 
Drupal Commerce
Вопрос задан 12.08.2015 - 13:43
Аватар пользователя Quty
Quty
34

Ответы

1

Конвертировать валюты можно с помощью функции commerce_multicurrency_conversion() из модуля Commerce Multicurrency

Ответ дан 12.08.2015 - 14:08
Аватар пользователя xandeadx
xandeadx
1542

Спасибо. Это как раз именно то, что нужно для первого способа. Функцию в модуле нашёл, как работает разобрался. Но она не работает из модуля интеркассы.
Простите за туповатый вопрос )) А как вызвать эту функцию из другого модуля?

UPD: вызов функции работает.. Это у меня проблемы с типами для передачи в саму интеркассу. Разбираюсь. Ещё раз спасибо )

Комментарий оставлен 12.08.2015 - 15:28
1

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

Ответ дан 12.08.2015 - 15:17

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

Комментарий оставлен 12.08.2015 - 20:24