avatar

Бонусная система

Опубликовал в блог Дополнения и модули для Simpla CMS
0


Системы бонусных начислений за выполненные заказы с последующим использованием накопленных бонусов на расчет за заказы.

Начнем, делаем 3 SQL-запроса

INSERT INTO `s_settings` (`setting_id`, `name`, `value`) VALUES (NULL, 'bonus_order', ''), (NULL, 'bonus_limit', '');
ALTER TABLE  `s_users` ADD  `balance` FLOAT( 8, 2 ) NOT NULL AFTER  `name`;
ALTER TABLE  `s_orders` ADD  `bonus_discount` FLOAT( 10, 2 ) NOT NULL AFTER  `discount`;

Открываем файл api/Users.php, ищем (примерно 95 строка)
$query = $this->db->placehold("SELECT u.id, u.email, u.password, u.name, u.group_id, u.enabled, u.last_ip, u.created, g.discount, g.name as group_name FROM __users u LEFT JOIN __groups g ON u.group_id=g.id $where LIMIT 1", $id);

и меняем на
$query = $this->db->placehold("SELECT u.id, u.email, u.password, u.name, u.balance, u.group_id, u.enabled, u.last_ip, u.created, g.discount, g.name as group_name FROM __users u LEFT JOIN __groups g ON u.group_id=g.id $where LIMIT 1", $id);

Открываем файл simpla/UserAdmin.php и после (14 строка)
$user->email = $this->request->post('email');

добавим
$user->balance = $this->request->post('balance', 'float');

Открываем файл simpla/design/html/user.tpl и после (68 строка)
<li><label class=property>Email</label><input name="email" class="simpla_inp" type="text" value="{$user->email|escape}" /></li>

добавим
<li><label class=property>Начислено бонусов</label><input name="balance" class="simpla_inp" type="text" value="{$user->balance|escape}" /> {$currency->sign}</li>

Открываем файл simpla/SettingsAdmin.php и после (29 строка)
$this->settings->thousands_separator = $this->request->post('thousands_separator');

добавим
$this->settings->bonus_order = $this->request->post('bonus_order');
$this->settings->bonus_limit = $this->request->post('bonus_limit');

Открываем файл simpla/design/html/settings.tpl и перед (80 строка)
<!-- Параметры -->
                <div class="block layer">
                        <h2>Настройки каталога</h2>

добавим
<div class="block layer">
      <h2>Бонусы</h2>
      <ul>
        <li><label class=property>Начисление от заказа</label><input name="bonus_order" class="simpla_inp" type="text" value="{$settings->bonus_order|escape}" /> %</li>
        <li><label class=property>Лимит бонусов при заказе</label><input name="bonus_limit" class="simpla_inp" type="text" value="{$settings->bonus_limit|escape}" /> %</li>
      </ul>
    </div>

Открываем файл api/Orders.php заменим в двух местах в запросе (строки 25 и 81)
o.discount

на
o.discount, o.bonus_discount

Далее в этом же файле заменим (500 строка)
$query = $this->db->placehold("UPDATE __orders o SET o.total_price=IFNULL((SELECT SUM(p.price*p.amount)*(100-o.discount)/100 FROM __purchases p WHERE p.order_id=o.id), 0)+o.delivery_price*(1-o.separate_delivery)-o.coupon_discount, modified=NOW() WHERE o.id=? LIMIT 1", $order->id);

на
$query = $this->db->placehold("UPDATE __orders o SET o.total_price=IFNULL((SELECT SUM(p.price*p.amount)*(100-o.discount)/100 FROM __purchases p WHERE p.order_id=o.id), 0)+o.delivery_price*(1-o.separate_delivery)-o.coupon_discount-o.bonus_discount, modified=NOW() WHERE o.id=? LIMIT 1", $order->id);

Далее перед (451 строка)
}
return $order->id;

добавим
if($order->user_id) {
   $user = $this->users->get_user(intval($order->user_id));
f(!empty($user))
          $this->users->update_user($user->id, array('balance' => ($user->balance + $order->total_price * $this->settings->bonus_order / 100)));
      }

Далее перед (482 строка)
}
return $order->id;

добавим
if($order->user_id) {
        $user = $this->users->get_user(intval($order->user_id));
        if(!empty($user))
          $this->users->update_user($user->id, array('balance' => max(0, $user->balance - $order->total_price * $this->settings->bonus_order / 100)));
      }

Открываем файл simpla/design/html/order.tpl и перед (308 строка)
<div class="block discount layer">
                <h2>Скидка</h2>

добавим
<div class="block discount layer">
<h2>Бонусы</h2>
<input type=text name=bonus_discount value='{$order->bonus_discount}' disabled> <span class=currency>{$currency->sign}</span>    
</div>
<div class="subtotal layer">
С учетом бонусов<b> {($subtotal-$order->bonus_discount)|round:2} {$currency->sign}</b>
</div>

Открываем файл view/CartView.php и после (47 строка)
$order->name = $this->request->post('name');

добавим
$bonus  = $this->request->post('bonus','integer');

Далее после (строка 56)
$this->design->assign('name', $order->name);

добавим
$this->design->assign('bonus', $bonus);

Открываем файл design/default/html/cart.tpl и перед (72 строка)
{if $coupon_request}

добавим
{if $settings->bonus_limit && $user->balance}
<tr>
        <th class="image"></th>
        <th class="name"><label><input type="checkbox" name="bonus" value="1"{if $bonus} checked{/if} /> оплатить бонусами (доступно {$user->balance|convert} {$currency->sign})</label></th>
        <th class="price"></th>
        <th class="amount"></th>
        <th class="price">
    {if ($cart->total_price * $settings->bonus_limit / 100) >= $user->balance}
                {$user->balance|convert} {$currency->sign}
    {else}
    −{($cart->total_price * $settings->bonus_limit / 100)|convert} {$currency->sign}
    {/if}
        </th>
        <th class="remove"></th>
</tr>
{/if}

Открываем design/default/html/order.tpl и перед (61 строка)
{* Скидка, если есть *}
{if $order->discount > 0}

добавим
{* Скидка, если есть *}
{if $order->bonus_discount > 0}
<tr>
  <th class="image"></th>
  <th class="name">бонусы</th>
  <th class="price"></th>
  <th class="amount"></th>
  <th class="price">
    −{$order->bonus_discount|convert} {$currency->sign}
  </th>
</tr>
{/if}


Вот и все.
13 комментариев RSS
avatar
В версии 2.1.5 нету в api/Orders.php — o.discount
Как быть в данной версии?
avatar
в вашем случае это строка 72, после discount
avatar
ничего не изменилось.
и при оплате бонусами то не оплачиваются, а просто растут дальше
avatar
Ответов и грамотной поддержки вообще нет я так понимаю
avatar
Покупайте платное расширение, будут и ответы, и грамотная поддержка…
Возмущаются еще… :I
avatar
ты кто такой чтобы делать замечание и говорить мне что делать?
avatar
Ты чё тут понты разводишь, иди во двор выйди и попробуй так пообщаться на улице — без головы останешься, потому что ты видимо сраный задрот, там пизды получаешь а тут понтуешься. Овца е… я :)
avatar
ошибка к запросу к базе
#1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(NULL, 'bonus_limit', '')' at line 1
решение
Запятой не хватает после (NULL, 'bonus_order', ''),
avatar
Мужики, помогите пожалуйста. Если выполняю данный шаг.

Далее перед (451 строка)
}
return $order->id;


добавим
if($order->user_id) {
   $user = $this->users->get_user(intval($order->user_id));
f(!empty($user))
          $this->users->update_user($user->id, array('balance' => ($user->balance + $order->total_price * $this->settings->bonus_order / 100)));
      }


Далее перед (482 строка)
}
return $order->id;


добавим
if($order->user_id) {
        $user = $this->users->get_user(intval($order->user_id));
        if(!empty($user))
          $this->users->update_user($user->id, array('balance' => max(0, $user->balance - $order->total_price * $this->settings->bonus_order / 100)));
      }


И после этого шага сайт уходит в ошибку 500.

Что я делаю не так?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.