Ошибка подсчета комисси для партнера в Опенкарт
Странное чудо случилось. Казалось бы opencart нууууу очень хорошая система для интернет-магазина, но все мы люди и разработчики опенкарт тоже. Заказчик выявил интересный баг. При оформлении заказа с купоном на скидку процент для партнера высчитывается не от финальной суммы, т.е. total а от суммы по продуктам. Итого при скидке в 50% партнер получает + 50% от процента комиссии даром, а сам владелец в убытке...
Немного покопав, я вышел на код, который и считает процент для партнера при оформлении заказ. Лежит он по пути:
catalog/controller/checkout/confirm.php
И выглядит так:
$subtotal = $this->cart->getSubTotal();
// Affiliate
$this->load->model('affiliate/affiliate');
$affiliate_info = $this->model_affiliate_affiliate->getAffiliateByCode($this->request->cookie['tracking']);
if ($affiliate_info) {
$order_data['affiliate_id'] = $affiliate_info['affiliate_id'];
$order_data['commission'] = ($subtotal / 100) * $affiliate_info['commission'];
} else {
$order_data['affiliate_id'] = 0;
$order_data['commission'] = 0;
}
Как можно заметить из примера, в коде нет проверки на применение купона или другой скидки, которая может учитываться в total. Для решения данной задачи в максимально короткие сроки было решено добавить проверку на применение купона и последующую работу с купоном. Код представлен ниже проверн на oc 2.1.x / 2.0.x. На версиях постарше с небольшими доработками так же будет работать.
$subtotal = $this->cart->getSubTotal();
if(isset($this->session->data['coupon'])){
$cupinf = $this->model_total_coupon->getCoupon($this->session->data['coupon']);
if($cupinf['type'] == 'P'){
$perc = ($subtotal * round($cupinf['discount'])) / 100;
$priceto = $subtotal - $perc;
}else{
$priceto = $subtotal - round($cupinf['discount']);
}
}
// Affiliate
$this->load->model('affiliate/affiliate');
$affiliate_info = $this->model_affiliate_affiliate->getAffiliateByCode($this->request->cookie['tracking']);
if ($affiliate_info) {
$order_data['affiliate_id'] = $affiliate_info['affiliate_id'];
$cnt = ($priceto) ? $priceto : $subtotal;
$order_data['commission'] = ($cnt / 100) * $affiliate_info['commission'];
} else {
$order_data['affiliate_id'] = 0;
$order_data['commission'] = 0;
}