diff --git a/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php b/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php index 16c95d9..686f99d 100755 --- a/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php +++ b/module/oc_telegram_shop/upload/admin/controller/extension/module/tgshop.php @@ -348,11 +348,24 @@ TEXT, 'module_tgshop_mini_app_url' => rtrim(HTTPS_CATALOG, '/') . '/image/catalog/tgshopspa/#/', 'module_tgshop_mainpage_categories' => 'latest10', 'module_tgshop_enable_store' => 1, + 'module_tgshop_feature_coupons' => 0, + 'module_tgshop_feature_vouchers' => 0, ]; } private function getSettingsConfig(): array { + $ocCouponsLink = $this->url->link( + 'marketing/coupon', + 'user_token=' . $this->session->data['user_token'], + true + ); + $ocVouchersLink = $this->url->link( + 'sale/voucher', + 'user_token=' . $this->session->data['user_token'], + true + ); + return [ 'general' => [ 'module_tgshop_status' => [ @@ -486,6 +499,28 @@ HTML, 'type' => 'categories', 'help' => 'На главной странице будут отображаться эти категории, если вы выберете этот вариант в настройке “Категории на главной”.', ], + + 'module_tgshop_feature_coupons' => [ + 'type' => 'select', + 'options' => [ + 0 => 'Выключено', + 1 => 'Включено', + ], + 'help' => <<купоны OpenCart для предоставления скидок при оформлении заказа. +HTML, + ], + + 'module_tgshop_feature_vouchers' => [ + 'type' => 'select', + 'options' => [ + 0 => 'Выключено', + 1 => 'Включено', + ], + 'help' => <<подарочные сертификаты OpenCart при оформлении заказа. +HTML, + ], ], 'orders' => [ diff --git a/module/oc_telegram_shop/upload/admin/language/ru-ru/extension/module/tgshop.php b/module/oc_telegram_shop/upload/admin/language/ru-ru/extension/module/tgshop.php index 0898eab..8fdb66b 100755 --- a/module/oc_telegram_shop/upload/admin/language/ru-ru/extension/module/tgshop.php +++ b/module/oc_telegram_shop/upload/admin/language/ru-ru/extension/module/tgshop.php @@ -30,6 +30,8 @@ $_['lbl_module_tgshop_mini_app_url'] = 'Ссылка на Telegram Mini App'; $_['lbl_module_tgshop_mainpage_categories'] = 'Категории на главной'; $_['lbl_module_tgshop_featured_categories'] = 'Избранные категории'; $_['lbl_module_tgshop_enable_store'] = 'Разрешить покупки'; +$_['lbl_module_tgshop_feature_coupons'] = 'Промокоды'; +$_['lbl_module_tgshop_feature_vouchers'] = 'Подарочные сертификаты'; // Entry $_['entry_status'] = 'Статус'; diff --git a/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php b/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php index 01e493e..fce4b93 100755 --- a/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php +++ b/module/oc_telegram_shop/upload/catalog/controller/extension/tgshop/handle.php @@ -83,23 +83,30 @@ class ControllerExtensionTgshopHandle extends Controller ], 'cache_categories_main' => 60 * 10, 'cache_products_main' => 60 * 10, + 'feature_coupons' => filter_var( + $this->config->get('module_tgshop_feature_coupons'), + FILTER_VALIDATE_BOOLEAN + ), + 'feature_vouchers' => filter_var( + $this->config->get('module_tgshop_feature_vouchers'), + FILTER_VALIDATE_BOOLEAN + ), ]); $app->bind(OcModelCatalogProductAdapter::class, function () { - return new OcModelCatalogProductAdapter($this->model_catalog_product); }); - $app->bind(Url::class, fn () => $this->url); - $app->bind(Currency::class, fn () => $this->currency); - $app->bind(Tax::class, fn () => $this->tax); - $app->bind(ImageToolInterface::class, fn () => new ImageTool(DIR_IMAGE, HTTPS_SERVER)); - $app->bind(Cart::class, fn () => $this->cart); - $app->bind(OcRegistryDecorator::class, fn () => new OcRegistryDecorator($this->registry)); - $app->singleton(Log::class, fn () => $this->log); + $app->bind(Url::class, fn() => $this->url); + $app->bind(Currency::class, fn() => $this->currency); + $app->bind(Tax::class, fn() => $this->tax); + $app->bind(ImageToolInterface::class, fn() => new ImageTool(DIR_IMAGE, HTTPS_SERVER)); + $app->bind(Cart::class, fn() => $this->cart); + $app->bind(OcRegistryDecorator::class, fn() => new OcRegistryDecorator($this->registry)); + $app->singleton(Log::class, fn() => $this->log); $app - ->withLogger(fn () => new OpenCartLogAdapter($this->log, 'TeleCart')) + ->withLogger(fn() => new OpenCartLogAdapter($this->log, 'TeleCart')) ->bootAndHandleRequest(); } diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php index 56fde3c..ff413b0 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/SettingsHandler.php @@ -52,6 +52,8 @@ class SettingsHandler 'ya_metrika_enabled' => $this->settings->get('ya_metrika_enabled'), 'app_enabled' => $this->settings->get('app_enabled'), 'store_enabled' => $this->settings->get('store_enabled'), + 'feature_coupons' => $this->settings->get('feature_coupons') ?? false, + 'feature_vouchers' => $this->settings->get('feature_vouchers') ?? false, ]); } diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/contains/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/contains/output.sql old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/not_contains/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/not_contains/output.sql old mode 100644 new mode 100755 diff --git a/spa/src/stores/CartStore.js b/spa/src/stores/CartStore.js index 248504f..c390136 100644 --- a/spa/src/stores/CartStore.js +++ b/spa/src/stores/CartStore.js @@ -1,6 +1,6 @@ import {defineStore} from "pinia"; import {isNotEmpty} from "@/helpers.js"; -import {addToCart, cartEditItem, cartRemoveItem, getCart} from "@/utils/ftch.js"; +import {addToCart, cartEditItem, cartRemoveItem, getCart, setCoupon, setVoucher} from "@/utils/ftch.js"; export const useCartStore = defineStore('cart', { state: () => ({ @@ -12,6 +12,8 @@ export const useCartStore = defineStore('cart', { error_warning: '', attention: '', success: '', + coupon: '', + voucher: '', }), getters: { @@ -104,5 +106,43 @@ export const useCartStore = defineStore('cart', { this.isLoading = false; } }, + + async applyCoupon() { + try { + this.isLoading = true; + this.error_warning = ''; + const response = await setCoupon(this.coupon); + + if (response.error) { + this.error_warning = response.error; + } else { + await this.getProducts(); + } + } catch (error) { + console.log(error); + this.error_warning = 'Возникла ошибка'; + } finally { + this.isLoading = false; + } + }, + + async applyVoucher() { + try { + this.isLoading = true; + this.error_warning = ''; + const response = await setVoucher(this.voucher); + + if (response.error) { + this.error_warning = response.error; + } else { + await this.getProducts(); + } + } catch (error) { + console.log(error); + this.error_warning = 'Возникла ошибка'; + } finally { + this.isLoading = false; + } + }, }, }); diff --git a/spa/src/stores/SettingsStore.js b/spa/src/stores/SettingsStore.js index 59e05cd..4d07b9e 100644 --- a/spa/src/stores/SettingsStore.js +++ b/spa/src/stores/SettingsStore.js @@ -14,10 +14,10 @@ export const useSettingsStore = defineStore('settings', { manifest_url: null, night_auto: true, ya_metrika_enabled: false, + feature_coupons: false, + feature_vouchers: false, theme: { - light: 'light', - dark: 'dark', - variables: { + light: 'light', dark: 'dark', variables: { '--product_list_title_max_lines': 2, } }, @@ -40,6 +40,8 @@ export const useSettingsStore = defineStore('settings', { this.ya_metrika_enabled = settings.ya_metrika_enabled; this.app_enabled = settings.app_enabled; this.store_enabled = settings.store_enabled; + this.feature_coupons = settings.feature_coupons; + this.feature_vouchers = settings.feature_vouchers; } } }); diff --git a/spa/src/utils/ftch.js b/spa/src/utils/ftch.js index d50ad13..c114376 100644 --- a/spa/src/utils/ftch.js +++ b/spa/src/utils/ftch.js @@ -72,4 +72,24 @@ export async function getFiltersForMainPage() { return await ftch('filtersForMainPage'); } +export async function setCoupon(coupon) { + const formData = new FormData(); + formData.append('coupon', coupon); + + return await apiFetch(`${BASE_URL}index.php?route=extension/total/coupon/coupon`, { + method: 'POST', + body: formData, + }); +} + +export async function setVoucher(voucher) { + const formData = new FormData(); + formData.append('voucher', voucher); + + return await apiFetch(`${BASE_URL}index.php?route=extension/total/voucher/voucher`, { + method: 'POST', + body: formData, + }); +} + export default ftch; diff --git a/spa/src/views/Cart.vue b/spa/src/views/Cart.vue index 52a2b43..b2430e2 100644 --- a/spa/src/views/Cart.vue +++ b/spa/src/views/Cart.vue @@ -71,7 +71,7 @@ -
+

Ваша корзина

@@ -84,6 +84,31 @@
+
+
+
+ + +
+ +
+ + +
+
+
+
@@ -122,9 +147,11 @@ import OptionCheckbox from "@/components/ProductOptions/Cart/OptionCheckbox.vue" import OptionText from "@/components/ProductOptions/Cart/OptionText.vue"; import {computed} from "vue"; import {useRouter} from "vue-router"; +import {useSettingsStore} from "@/stores/SettingsStore.js"; const cart = useCartStore(); const router = useRouter(); +const settings = useSettingsStore(); // const componentMap = { // radio: OptionRadio,