Функционал раздачи промокода покупателями
Движок:opencart 2.1
Что должно быть предустановлено
система поощрения/лояльности клиентов https://opencartforum.com/topic/33823-podderzhka-sistema-pooschreniyaloyalnosti-klienta-15-23/
мой модуль раздачи промокодов
Основная идея
У покупателей в личном кабинете на главной странице выводится промокод, который они могут сообщать своим знакомым. При каждом использовании промокода в заказах раздающему начисляются баллы. Промокоды для раздачи привязываются к функционалу купонов опенкарта, т.е. создаётся один купон под это дело в настройках маркетинга, а в модуле промокода данный купон прописывается в отдельном поле.
Ход работ
В catalogcontrollercheckoutsimplecheckout_cart.php добавить
private function validatePromoCodeCoupon() { // if (empty($this->request->post['promocode'])) return true; $error = false; $this->load->model('total/promocode'); $check = $this->model_total_promocode->checkPromoCode($this->request->post['coupon']); if(!$check) { // self::$error['warning'] = 'Такого промокода не существует'; $error = true; } else { $promocode = $this->config->get('promocode_coupon'); $version = $this->simplecheckout->getOpencartVersion(); if ($version < 210) { $this->load->model('checkout/coupon'); $coupon_info = $this->model_checkout_coupon->getCoupon($promocode); } else { $this->load->model('total/coupon'); $coupon_info = $this->model_total_coupon->getCoupon($promocode); } if (!$coupon_info) { // self::$error['warning'] = 'У купона промокода '.$this->language->get('error_coupon'); $error = true; } } return $error; }
В этом же файле заменить код
if (!$coupon_info) { self::$error['warning'] = $this->language- $error = true; }
на
if (!$coupon_info) { $error = $this->validatePromoCodeCoupon(); if($error){ self::$error['warning'] = $this->language->get('error_coupon'); $error = true; }
В файле catalogcontrollercheckoutsimplecheckout.php после строчки
$data['fax'] = $customer_info['fax'];
поставить
$data['promocode'] = $this->session->data['promocode'];
В файле C:workprojectopenserverdomainspromoadmincontrollersaleorder.php после кода
$res = file_get_contents( sprintf( 'https://fruitonline.ru/index.php?route=api/order/triggerStatusChangeEvent&token=%s&order_id=%d', $_GET['token'], $select ) );
поставить
if($_POST["selected_update"] == 5){ $this->load->model('extension/module/promocode'); $promocode = $this->model_extension_module_promocode->getPromoByOrderid($select); $customer_id = $this->model_extension_module_promocode->getCustomerByPromo($promocode); $this->model_extension_module_promocode->addReward($customer_id,$this->config->get('promocode_points'),'Покупатель воспользовался вашим промокодом в заказе #'.$select); }
В файл C:workprojectopenserverdomainspromocatalogcontrollerapiorder.php после кода
$this->model_checkout_order->addOrderHistory($order_id, $this->request->post['order_status_id'], $this->request->post['comment'], $this->request->post['notify'], $this->request->post['override']);
if($this->request->post['order_status_id'] == 5){ $this->load->model('total/promocode'); $customer_id = $this->model_total_promocode->getCustomerByPromo($order_info['promocode']); $this->model_total_promocode->addReward($customer_id,$this->config->get('promocode_points'),'Покупатель воспользовался вашим промокодом в заказе #'.$order_id); }
и после кода
$this->model_checkout_order->editOrder($order_id, $order_data); // Set the order history if (isset($this->request->post['order_status_id'])) { $order_status_id = $this->request->post['order_status_id']; } else { $order_status_id = $this->config->get('config_order_status_id'); } $this->model_checkout_order->addOrderHistory($order_id, $order_status_id);
поставить
if($order_status_id == 5){ $this->load->model('total/promocode'); $customer_id = $this->model_total_promocode->getCustomerByPromo($order_info['promocode']); $this->model_total_promocode->addReward($customer_id,$this->config->get('promocode_points'),'Покупатель воспользовался вашим промокодом в заказе #'.$order_id); }
В файл C:workprojectopenserverdomainspromosystemlibrarycustomer.php
добавить
public function getPromoCode() { return $this->promocode; } public function setPromoCode($promocode) { $this->promocode = $promocode; $query = $this->db->query("UPDATE `" . DB_PREFIX ."customer` SET `promocode`='" .$promocode ."' WHERE `customer_id` =" .$this->customer_id);
ещё закрытое свойство класса
private $promocode;
после всех строчек
$this->address_id = $customer_query->row['address_id'];
добавить
$this->promocode = $customer_query->row['promocode'];
После строчки
$this->address_id = '';
добавить
$this->promocode = '';
В файл adminmodelcustomercustomer.php добавить фунцкцию
public function getCustomerByPromo($promocode) { $query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "customer WHERE promocode = '" . (int)$promocode . "'"); return $query->row; }
В файле catalogmodelcheckoutorder.php
заменить
$this->db->query("INSERT INTO `" . DB_PREFIX . "order` SET invoice_prefix = '"
на
$this->db->query("INSERT INTO `" . DB_PREFIX . "order` SET promocode='" . $this->db->escape($data['promocode']) ."', invoice_prefix = '"
После строчки
'fax' => $order_query->row['fax'],
поставить
'promocode' => $order_query->row['promocode'],
Из файла admincontrollerextensiontotal.php удалить
foreach ($extensions as $key => $value) {
if (!file_exists(DIR_APPLICATION . 'controller/total/' . $value . '.php')) {
$this->model_extension_extension->uninstall('total', $value);
unset($extensions[$key]);
}
}
Какие добавления в таблицы БД
Таблицы customer,order: новое поле promocode c типом VARCHAR, длину ставил 11, значение NULL — по умолчанию
Таблица extension — новую строку запросом
INSERT INTO `oc_extension` (`extension_id`, `type`, `code`) VALUES ( 'module', 'module_extract');