humbert Posted April 4, 2014 Share Posted April 4, 2014 Выбираем главной валюту "рупь", прописываем еще несколько валют: "бакс", "евры"... Покупатель выбирают нужную валюту, смотрит цены, делает заказ и... хочу чтобы заказ падал в базу в валюте "рупь". А он падает в валюте покупателя. Непонятная логика создателей престы. Может есть где переключение, чтобы все заказы падали в основной валюте, а не в той, что выбрал пользователь? Link to comment Share on other sites More sharing options...
humbert Posted April 14, 2014 Author Share Posted April 14, 2014 Я так понимаю, что русскоговорящей поддержки у магазина нет? Ок, буду сам с собой вести диалог. Хотел сделать так - найти все функции и файлы, где заказ оформляется, ну т.е. те функции, которые записывают в БД данные о заказе. Нашел, папка 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 Откуда лишняя единица? Это баг или фишка движка? Link to comment Share on other sites More sharing options...
humbert Posted April 14, 2014 Author Share Posted April 14, 2014 Еще вариант - ID валюты хранится в куках, когда покупатель бродит по магазину, цены показываются в выбранной им валюте. Как только переходит в корзину (оформление заказа), так меняем ID на дефолтный. После оформления снова меняем на валюту покупателя. Link to comment Share on other sites More sharing options...
humbert Posted April 15, 2014 Author Share Posted April 15, 2014 Все, победил я их. 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 любой валюты Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now