Функционал раздачи промокода покупателями

Движок:opencart 2.1

Что должно быть предустановлено

система поощрения/лояльности клиентов https://opencartforum.com/topic/33823-podderzhka-sistema-pooschreniyaloyalnosti-klienta-15-23/

мой модуль раздачи промокодов

Основная идея

У покупателей в личном кабинете на главной странице выводится промокод, который они могут сообщать своим знакомым. При каждом использовании промокода в заказах раздающему начисляются баллы. Промокоды для раздачи привязываются к функционалу купонов опенкарта, т.е. создаётся один купон под это дело в настройках маркетинга, а в модуле промокода данный купон прописывается в отдельном поле.

Ход работ

В catalog\controller\checkout\simplecheckout_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;
                    }

В файле catalog\controller\checkout\simplecheckout.php после строчки

        $data['fax']                    = $customer_info['fax'];

поставить

        $data['promocode']              = $this->session->data['promocode'];

В файле C:\workproject\openserver\domains\promo\admin\controller\sale\order.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:\workproject\openserver\domains\promo\catalog\controller\api\order.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:\workproject\openserver\domains\promo\system\library\customer.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 = '';

В файл admin\model\customer\customer.php добавить фунцкцию

	public function getCustomerByPromo($promocode) {
		$query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "customer WHERE promocode = '" . (int)$promocode . "'");

		return $query->row;
	}

В файле catalog\model\checkout\order.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'],

Из файла admin\controller\extension\total.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');
Print Friendly, PDF & Email

Добавить комментарий