UMIhelp

Разработка сайта на UMI.CMS => Настройка системы и модулей => Тема начата: stud_mai от 09 Апреля 2016, 23:07:22

Название: Накопительные скидки и заказ в 1 шаг
Отправлено: stud_mai от 09 Апреля 2016, 23:07:22
Добрый вечер!

Интересует такой вопрос: кто-либо озадачивался проблемой настройки накопительной скидки если в корзине используется "заказ в 1 шаг", а не как в demodizzy пошаговый? Если кто-то делал такое, можете поподробнее описать действия

Заранее спасибо откликнувшимся!
Название: Re: Накопительные скидки и заказ в 1 шаг
Отправлено: e.ioffe от 10 Апреля 2016, 09:17:36
А в чем заключается проблема?

Насколько вижу, все решается достаточно стандартными средствами.
Название: Re: Накопительные скидки и заказ в 1 шаг
Отправлено: aghigay от 10 Апреля 2016, 13:41:50
Согласен с e.ioffe: если вы используете "заказ в 1 шаг" именно как заказ в ЮМИ, то накопительная скидка работает как и для обычного заказа - по механизму скидок. Ведь заказ же создается как обычно - значит все применяется как и к любому другому заказу.
Название: Re: Накопительные скидки и заказ в 1 шаг
Отправлено: stud_mai от 10 Апреля 2016, 17:28:18
Возникают проблема следующего рода: так как используется "заказ в 1 шаг", при оформлении заказа этап оплаты бонусами пролетаем мимо, что видно из следующего кода (как в wiki "Оформление заказа в один шаг – xslt шаблонизатор", да и в classes\modules\emarket\__purchasing_one_step.php точно такое же написано):

//сохранение способа оплаты и редирект на итоговую страницу, либо страницу подтверждения оплаты.
  $order->setValue('payment_id', getRequest('payment-id'));
  $order->refresh();
 
  $paymentId = getRequest('payment-id');
  if(!$paymentId) {
    $this->errorNewMessage(getLabel('error-emarket-choose-payment'));
    $this->errorPanic();
  }
  $payment = payment::get($paymentId);
 
  if($payment instanceof payment) {
    $paymentName = $payment->getCodeName();
    $url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/purchase/payment/{$paymentName}/";
  } else {
    $url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/cart/";
  }
  $this->redirect($url);

Здесь мне становиться непонятно как и когда вызвать метод отвечающий за оплату бонусами. Ради интереса, пробовал, находясь в корзине с товаром, вбивать в адресную строку запрос вида mysite/emarket/purchase/payment/bonus/. Попадал на этап оплаты бонусами, далее если бонусов хватало на всю покупку, то выдавалась страница об успешном оформлении заказа, если нет, то предлагался выбор способа оплаты, затем опять успешное завершение оформления. Ни в том, ни в другом случае после оформления заказа в нем не было сохранено ни способа оплаты, ни адреса доставки. Также заметил, что если доставка выбиралась платной, то ее бонусами оплатить нельзя было, т.е. оплачивать можно только товары.
Есть ли какие-то мысли? Может это только мне не очевидно, т.к. недавно работаю в этой области :(
Название: Re: Накопительные скидки и заказ в 1 шаг
Отправлено: aghigay от 10 Апреля 2016, 21:26:25
А какой метод вы хотите вызывать для оплаты бонусами? Фактически: бонусы - это отдельное поле в каждом заказе. Туда можно написать какую-то сумму. И эта сумма вычтется (при соблюдении некоторых условий) из общей стоимости заказа. Так что просто делаете поле со смыслом "сколько бонусов потратить", сами проверяете, что бонусов можно потратить не больше, чем есть у клиента и все
Название: Re: Накопительные скидки и заказ в 1 шаг
Отправлено: stud_mai от 17 Апреля 2016, 19:56:08
Может кому понадобится... В общем, решил задачу переписав немного стандартный метод использования бонусов в заказе и их начисления покупателю. Кастомный метод использования бонусов в заказе описал в emarket/__custom.php:
public function applyBonus(){
$urlPrefix = cmsController::getInstance()->getUrlPrefix() ? (cmsController::getInstance()->getUrlPrefix() . '/') : '';
$order = $this->getBasketOrder();
$bonus = getRequest('bonus');
if ($bonus || $bonus === 0 || $bonus === '0') {
$order->setBonusDiscount($bonus);
$order->refresh();
if (!$order->getActualPrice()) {
$order->setPaymentStatus('accepted');
}
}
$this->redirect($this->pre_lang .'/'. $urlPrefix . 'emarket/cart/');
}

Также не надо забывать про permissions.custom.php:

$permissions = array('purchasing' => array('applyBonus'));

В xsl-шаблоне, описывающий вывод корзины, добавил следующее:
<xsl:if test="$bonus > 0">
  <tr>
      <td colspan="6" style="border:0;text-align:right;color:#408fd1;font-weight:bold;padding:2px 5px;">
Вы можете оплатить Ваш заказ накопленными бонусами. Доступно бонусов на <span id="bonus_available"><xsl:value-of select="$bonus" /></span> руб.
      </td>
      <td colspan="2" style="border:0;text-align:center;padding:2px 5px;">
            <input type="text" id="bonus_amount" name="bonus" placeholder="Введите кол-во бонусов"/>
      </td>
      <td style="border:0">
            <input type="button" id="bonus_apply" class="btn bonus_apply" value="Оплатить" />
      </td>
  </tr>
</xsl:if>

Далее остается только связать это дело ajax'ом:

$('#bonus_apply').live('click',function(e){
e.preventDefault();

//Вызов кастомного метода зачисления бонусов
$.ajax({
type: "POST",
url: '/emarket/applyBonus/',
data: $('#bonus_amount').serialize(),
success: function(response){

var totalPrice = $('#total_price').text().replace(/\s/g, ''),
deliveryPrice = $('#result_delivery_price').text(),
newDiscount = $(response).find('#result_discount').text().replace(/\s/g, ''),
bonusAvailable = $(response).find('#bonus_available').text(),
resultTotalPrice;

resultTotalPrice = +totalPrice + +deliveryPrice - +newDiscount;
$('#result_discount').text(newDiscount.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 '));
$('#result_total_price').text(String(resultTotalPrice).replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 '));
$('#bonus_available').text(bonusAvailable);
}
});

});

Также была необходимость сделать зачисление бонусов покупателю всегда от полной стоимости покупки. Изменил строчку в функции addBonus в файле emarket/__events.php, описывающий события:
$price = $order->getActualPrice();
на
$price = $order->getOriginalPrice();

Понимаю, что это неправильно. Кто подскажет как это вынести в кастомный файл?
Название: Re: Накопительные скидки и заказ в 1 шаг
Отправлено: aghigay от 17 Апреля 2016, 23:04:10
Ну вот с зачислением - это вы зря. Вам же нужно зачислить просто зная сколько. Это значит что нужно навесить свое событие и в нем записать в нужное место нужное число. Зачем же переписывать системные? После обновления системы все упадет и придется опять переделывать.
А остальное выглядит более-менее норм. По крайней мере с точки зрения обновления системы.