Jump to content

Заказ в валюте по-умолчанию.


Recommended Posts

Выбираем главной валюту "рупь", прописываем еще несколько валют: "бакс", "евры"...

 

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

 

Непонятная логика создателей престы.

 

Может есть где переключение, чтобы все заказы падали в основной валюте, а не в той, что выбрал пользователь?

Share this post


Link to post
Share on other sites

  • 2 weeks later...

Я так понимаю, что русскоговорящей поддержки у магазина нет? Ок, буду сам с собой вести диалог. :)

 

Хотел сделать так - найти все функции и файлы, где заказ оформляется, ну т.е. те функции, которые записывают в БД данные о заказе.

Нашел, папка classes/order - там около десятка файлов php.

 

Берем файл Order.php, ищем функцию

 

public function addOrderPayment($amount_paid, $payment_method = null, $payment_transaction_id = null, $currency = null, $date = null, $order_invoice = null)

 

Функция, как я понял, записывает данные по стоимости заказа для платежных систем. Пишет данные в таблицу order_payment.

 

Нас интересует код

 

 

 

$order_payment->id_currency = ($currency ? $currency->id : $this->id_currency);
// we kept the currency rate for historization reasons
$order_payment->conversion_rate = ($currency ? $currency->conversion_rate : 1);
// if payment_method is define, we used this
$order_payment->payment_method = ($payment_method ? $payment_method : $this->payment);
$order_payment->transaction_id = $payment_transaction_id;
$order_payment->amount = $amount_paid;
$order_payment->date_add = ($date ? $date : null);

 

Который заменил на такой

 

 

 

$this->id_currency=(int)Configuration::get('PS_CURRENCY_DEFAULT');
$this->id_currency_customer=$this->id_currency;
$order_payment->conversion_rate = ($currency ? $currency->conversion_rate : 1);
$order_payment->payment_method = ($payment_method ? $payment_method : $this->payment);
$order_payment->transaction_id = $payment_transaction_id;
$amount_paid=Tools::ps_round(Tools::convertPrice($amount_paid, $order_payment->id_currency, false), 0);
$order_payment->id_currency = (int)Configuration::get('PS_CURRENCY_DEFAULT');
$order_payment->amount = $amount_paid;
$order_payment->date_add = ($date ? $date : null);

 

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

При таком способе конвертации появляется погрешность, например, у меня товар в японских йенах, стоит 19 040 JPY, в евро он стоит 135. При сохранении заказа, когда из евро обратно в JPY конвертируем, стоимость возрастает до 19 042, т.е. 2 лишних йены прибавляются к стоимости.

 

С точки зрения продавца это хорошо, это прибыль. Но это не правильно. 

 

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

 

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

 

Но, снова но, документации по магазину не очень много, непонятно какие поля в БД за что отвечают.

 

Например, таблица order_detail, там есть поле product_quantity_discount  - непонятно, что это такое, то ли количество товаров, то ли скидка на товары. 

 

Если скидка, то как она формируется? Цена товара в поле product_price 192.766400 евро (еще одно замечательное свойство магазина, писать цены в виде дробного числа). Скидка на товары в поле reduction_percent = 30%.

 

Если считать с помощью классической математики, то цена со скидкой будет 192.766400*0.7= 134.94, что мы и видим в поле total_price_tax_incl, но вот в чудесном поле  product_quantity_discount стоит другое число 135.940000

 

 

Откуда лишняя единица? Это баг или фишка движка?

Share this post


Link to post
Share on other sites

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

Как только переходит в корзину (оформление заказа), так меняем ID на дефолтный.

 

После оформления снова меняем на валюту покупателя.

Share this post


Link to post
Share on other sites

Все, победил я их.

 

classes/Tools.php

 

Ищем функцию "public static function setCurrency($cookie)"

 

И в самом начале вставлям

 

 

if($_POST['confirm']==1) return $currency = Currency::getCurrencyInstance(Configuration::get('PS_CURRENCY_DEFAULT'));

 

Configuration::get('PS_CURRENCY_DEFAULT') - валюта по-умолчанию, можно заменить на ID любой валюты

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More