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

Движок: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');
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

СТАТЬИ БЛОГА ПО РУБРИКЕ И МЕТКАМ

img

Какие включить доп. функции в плитку тегов

1. добавление тегов с автоподстановкой* через админку

*автоподстановкой названий товаров/категорий

см.видео

2. вывод плитки в любом месте шаблона через селекторы html(class или id)

см.видео

пояснения

подробная инструкция

3. замена дизайна плитки тегов с «карусели»(базовый дизайн) на «таблетки»

скрин (декстопная версия)

скрин (мобильная версия)


3а. замена изначального дизайна на «квадраты»

живой пример

скрины


3b. замена изначального дизайна на цепочку с кнопкой

живой пример

скрины


3c. замена изначального дизайна на дизайн с табами

скрин

живой пример_1

живой пример_2 (с картинками у тегов)

живой_пример_3 (с кнопкой <показать все>)


4. функция «упорядочивание тегов по полкам на витрине».

Подойдёт тем, у кого на одной странице очень много тегов и их нужно как-то упорядочить.

см.скриншот(декстоп)

см.скриншот(смартфон)

видео

живой пример

4а.Вывод плиток тегов в нескольких областях сразу

скриншот

инструкция

5. функция «отобразить плитку во всех товарах категории».

Допустим, у вас в магазине есть категория, в которой 500 товаров, а вам требуется добавить одну и туже плитку тегов в каждом из них. Если подключена данная функция, то достаточно добавить в эксель-файл для импорта только 1 строку и теги появятся на 500 страницах.


5_a. расширение функции №5 на подкатегории.


6. вывод плитки в листинге товаров

см.скрин

7. мультиязычность

с данной функцией отпадает необходимость создавать плитки под каждый язык отдельно

скриншот

8. Самостоятельный генератор тегов из товаров

см.статью


10. выгрузка всех тегов с сайта в эксель-файл

11. добавление тегов непосредственно в админке товара или категории

скрин

инструкция

12. Формирование посадочных страниц  к опциям/атрибутам стандартного фильтра

у страниц стандартного фильтра товаров появится ЧПУ(SEO URL), мета-теги (keywords,description), title (заголовок страницы) и h1.

видео


13. Ранжирование тегов по популярности

Какие включить доп. функции в плитку тегов

1. добавление тегов с автоподстановкой* через админку

*автоподстановкой названий товаров/категорий

см.видео

2. вывод плитки в любом месте шаблона через селекторы html(class или id)

см.видео

пояснения

подробная инструкция

3. замена дизайна плитки тегов с "карусели"(базовый дизайн) на "таблетки"

скрин (декстопная версия)

скрин (мобильная версия)


3а. замена изначального дизайна на "квадраты"

живой пример

скрины


3b. замена изначального дизайна на цепочку с кнопкой

живой пример

скрины


3c. замена изначального дизайна на дизайн с табами

скрин

живой пример_1

живой пример_2 (с картинками у тегов)

живой_пример_3 (с кнопкой <показать все>)


4. функция "упорядочивание тегов по полкам на витрине".

Подойдёт тем, у кого на одной странице очень много тегов и их нужно как-то упорядочить.

см.скриншот(декстоп)

см.скриншот(смартфон)

видео

живой пример

4а.Вывод плиток тегов в нескольких областях сразу

скриншот

инструкция

5. функция "отобразить плитку во всех товарах категории".

Допустим, у вас в магазине есть категория, в которой 500 товаров, а вам требуется добавить одну и туже плитку тегов в каждом из них. Если подключена данная функция, то достаточно добавить в эксель-файл для импорта только 1 строку и теги появятся на 500 страницах.


5_a. расширение функции №5 на подкатегории.


6. вывод плитки в листинге товаров

см.скрин

7. мультиязычность

с данной функцией отпадает необходимость создавать плитки под каждый язык отдельно

скриншот

8. Самостоятельный генератор тегов из товаров

см.статью


10. выгрузка всех тегов с сайта в эксель-файл

11. добавление тегов непосредственно в админке товара или категории

скрин

инструкция

12. Формирование посадочных страниц  к опциям/атрибутам стандартного фильтра

у страниц стандартного фильтра товаров появится ЧПУ(SEO URL), мета-теги (keywords,description), title (заголовок страницы) и h1.

видео


13. Ранжирование тегов по популярности

img

Создание мульти склада в opencart и получение остатков из 1С

  • Реализована возможность работать с несколькими складами в Opencart. Общий остаток товара складывается из остатков на складах.
  • Реализована передача остатков в интернет-магазин (ИМ) из выгрузки 1С.
  • Реализован вывод остатков по складам в карточке товара.

II. Подробное описание модуля

1.Передача остатков в ИМ настраивается с любых складов 1с, например, с основного склада и двух других.  Есть возможность использовать любые статусы наличия, например,

— если на «складе 1» товара нет, но на основном складе этот товар есть (или есть на складе 2), то в карточке на витрине будет показываться статус ожидание 1 день
— если нигде товара нет, то в карточке — статус нет в наличии
— если на выбранном складе товара менее Х штук, то статус — мало. (значение Х доступно для корректировки из админ-панели)

2. В модуле опенкарта реализована возможность добавлять/убирать склады и корректировать их настройки.  Чтобы работало обновление остатков из 1С, в настройках модуля требуется складам присвоить GUID из 1с.

3. Списание остатков производится в зависимости от способа доставки в заказе. Например, если выбрана курьерская доставка, то списание товара начнётся с основного склада, продолжится со склада 1 (при отсутствии на основном), далее со склада 2. Если в методе доставки заказа выбран самовывоз со склада 1 или со склада 2, то вначале списание произойдет с выбранного склада, затем с основного склада, и далее с последнего склада, где остались остатки. Приоритеты списания остатков настраиваются в админ-панели модуля.

Создание мульти склада в opencart и получение остатков из 1С

  • Реализована возможность работать с несколькими складами в Opencart. Общий остаток товара складывается из остатков на складах.
  • Реализована передача остатков в интернет-магазин (ИМ) из выгрузки 1С.
  • Реализован вывод остатков по складам в карточке товара.

II. Подробное описание модуля

1.Передача остатков в ИМ настраивается с любых складов 1с, например, с основного склада и двух других.  Есть возможность использовать любые статусы наличия, например,

-- если на "складе 1" товара нет, но на основном складе этот товар есть (или есть на складе 2), то в карточке на витрине будет показываться статус ожидание 1 день
-- если нигде товара нет, то в карточке - статус нет в наличии
-- если на выбранном складе товара менее Х штук, то статус - мало. (значение Х доступно для корректировки из админ-панели)

2. В модуле опенкарта реализована возможность добавлять/убирать склады и корректировать их настройки.  Чтобы работало обновление остатков из 1С, в настройках модуля требуется складам присвоить GUID из 1с.

3. Списание остатков производится в зависимости от способа доставки в заказе. Например, если выбрана курьерская доставка, то списание товара начнётся с основного склада, продолжится со склада 1 (при отсутствии на основном), далее со склада 2. Если в методе доставки заказа выбран самовывоз со склада 1 или со склада 2, то вначале списание произойдет с выбранного склада, затем с основного склада, и далее с последнего склада, где остались остатки. Приоритеты списания остатков настраиваются в админ-панели модуля.

img

Переход на https в opencart wordpress

Для wordpress

https://zen.yandex.ru/media/id/5b4ae96b3d0e9500a9a853c7/podkliuchenie-besplatnogo-sslsertifikata-na-hostinge-timeweb-5b5eb4e09bef9e00a82f7564

Для нулевых сайтов на opencart

Переход на https в opencart wordpress

Для wordpress https://zen.yandex.ru/media/id/5b4ae96b3d0e9500a9a853c7/podkliuchenie-besplatnogo-sslsertifikata-na-hostinge-timeweb-5b5eb4e09bef9e00a82f7564 Для нулевых сайтов на opencart
img

Переход на https в opencart wordpress

Для wordpress

https://zen.yandex.ru/media/id/5b4ae96b3d0e9500a9a853c7/podkliuchenie-besplatnogo-sslsertifikata-na-hostinge-timeweb-5b5eb4e09bef9e00a82f7564

Для нулевых сайтов на opencart

Переход на https в opencart wordpress

Для wordpress https://zen.yandex.ru/media/id/5b4ae96b3d0e9500a9a853c7/podkliuchenie-besplatnogo-sslsertifikata-na-hostinge-timeweb-5b5eb4e09bef9e00a82f7564 Для нулевых сайтов на opencart
img

Как наполнить opencart 2.3 fake-заказами

Подключиться к БД другого интернет-магазина и выкачать оттуда заказы с помощью запроса С помощью хранимой процедуры актуализируем заказы, на одну дату по пять заказов Если получились заказы из будущего, то запросом delete удаляем лишнии, в […]

Как наполнить opencart 2.3 fake-заказами

Подключиться к БД другого интернет-магазина и выкачать оттуда заказы с помощью запроса С помощью хранимой процедуры актуализируем заказы, на одну дату по пять заказов Если получились заказы из будущего, то запросом delete удаляем лишнии, в […]
img

Создание pdf с деталями заказа в письме клиенту. Opencart

Сделано в OPENCART 2.3. Скачать библиотеку, зайти в папку с ней через консоль команд и выполнить команды git clone https://github.com/dompdf/dompdf.git cd dompdf git clone https://github.com/PhenX/php-font-lib.git lib/php-font-lib cd lib/php-font-libgit checkout 0.5.1 cd .. git clone https://github.com/PhenX/php-svg-lib.git […]

Создание pdf с деталями заказа в письме клиенту. Opencart

Сделано в OPENCART 2.3. Скачать библиотеку, зайти в папку с ней через консоль команд и выполнить команды git clone https://github.com/dompdf/dompdf.git cd dompdf git clone https://github.com/PhenX/php-font-lib.git lib/php-font-lib cd lib/php-font-libgit checkout 0.5.1 cd .. git clone https://github.com/PhenX/php-svg-lib.git […]
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x