diff --git a/docker-compose.yaml b/docker-compose.yaml index bba1f2d..7fb4af4 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -14,6 +14,12 @@ services: resources: limits: memory: 512M + healthcheck: + test: [ "CMD", "curl" ,"-f", "http://localhost/index.php?route=extension/tgshop/handle&api_action=health" ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 5s environment: - WEB_DOCUMENT_ROOT=/web/upload - PHP_DISPLAY_ERRORS=1 @@ -25,6 +31,8 @@ services: - PHP_IDE_CONFIG=serverName=orbstack - php.session.gc_maxlifetime=28800 - php.session.cookie_lifetime=0 + depends_on: + - mysql mysql: image: mariadb:10.2.7 @@ -34,7 +42,7 @@ services: - MYSQL_ROOT_PASSWORD=secret - MYSQL_DATABASE=ocstore3 healthcheck: - test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-psecret" ] timeout: 20s retries: 10 ports: diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/CriteriaBuilder/Rules/BaseRule.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/CriteriaBuilder/Rules/BaseRule.php index e983e99..ef997be 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/CriteriaBuilder/Rules/BaseRule.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/CriteriaBuilder/Rules/BaseRule.php @@ -11,6 +11,7 @@ abstract class BaseRule public const CRITERIA_OPTION_NUMBER = 'number'; public const CRITERIA_OPTION_BOOLEAN = 'boolean'; public const CRITERIA_OPTION_PRODUCT_CATEGORIES = 'product_categories'; + public const CRITERIA_OPTION_PRODUCT_CATEGORY = 'product_category'; public const CRITERIA_OPTION_PRODUCT_MANUFACTURER = 'product_manufacturer'; public const CRITERIA_OPTION_PRODUCT_ATTRIBUTE = 'product_attribute'; public const CRITERIA_OPTION_PRODUCT_MODEL = 'product_model'; diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Builder.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Builder.php index e4cdb1e..c52f4e4 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Builder.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Builder.php @@ -22,6 +22,7 @@ class Builder public $joins = []; public $wheres = []; public $orders = []; + public $groupBy = []; public $limit; public $offset; public $distinct = false; @@ -447,4 +448,11 @@ class Builder return count($join) > 0; } + + public function groupBy(array $columns): Builder + { + $this->groupBy = $columns; + + return $this; + } } diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Grammars/Grammar.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Grammars/Grammar.php index c0aac10..476dfa9 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Grammars/Grammar.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Grammars/Grammar.php @@ -17,6 +17,7 @@ abstract class Grammar 'orders' => [], 'limit' => [], 'offset' => [], + 'groupBy' => [], ]; private function resetCompiled(): void @@ -29,6 +30,7 @@ abstract class Grammar 'orders' => [], 'limit' => [], 'offset' => [], + 'groupBy' => [], ]; } @@ -194,4 +196,9 @@ abstract class Grammar return $this->getRawValue($condition['column']) . " $inOperator (" . $inValues . ')'; } + + public function compileGroupBy(Builder $builder, array $groupBy): string + { + return 'GROUP BY ' . implode(', ', $groupBy); + } } diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Table.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Table.php old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/Telegram/Commands/StartCommand.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/Telegram/Commands/StartCommand.php old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/Telegram/TelegramValidateInitDataMiddleware.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/Telegram/TelegramValidateInitDataMiddleware.php index 3dcb1c9..8720a2e 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/Telegram/TelegramValidateInitDataMiddleware.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/Telegram/TelegramValidateInitDataMiddleware.php @@ -12,6 +12,7 @@ class TelegramValidateInitDataMiddleware 'testTgMessage', 'manifest', 'webhook', + 'health', ]; public function __construct(SignatureValidator $signatureValidator) diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductCategory.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductCategory.php new file mode 100755 index 0000000..3d5ff3b --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductCategory.php @@ -0,0 +1,63 @@ + new Criterion(static::CRITERIA_OPTION_PRODUCT_CATEGORIES, [ + 'operator' => static::CRITERIA_OPERATOR_CONTAINS, + 'value' => null, + ]) + ]); + } + + public function apply(Builder $builder, $operand): void + { + /** @var Criterion $criterion */ + foreach ($this->criteria as $criterion) { + if ($criterion->type === static::CRITERIA_OPTION_PRODUCT_CATEGORY) { + $operator = $criterion->params['operator']; + $categoryId = $criterion->params['value']; + + if (! $categoryId) { + return; + } + + $uniqHash = md5(serialize($criterion)); + $joinAlias = 'product_category_' . $uniqHash; + if ($builder->hasJoinAlias($joinAlias)) { + return; + } + + $builder->join( + db_table('product_to_category') . " AS $joinAlias", + function (JoinClause $join) use ($joinAlias, $categoryId) { + $join + ->on('products.product_id', '=', "$joinAlias.product_id") + ->where("$joinAlias.category_id", '=', $categoryId); + }, + 'left' + ); + + if ($operator === 'contains') { + $builder->whereNotNull("$joinAlias.product_id", $operand); + } elseif ($operator === 'not_contains') { + $builder->whereNull("$joinAlias.product_id", $operand); + } else { + throw new InvalidArgumentException('Invalid operator: ' . $operator); + } + } + } + } +} diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductPrice.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductPrice.php index 420dd19..7eb7b98 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductPrice.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductPrice.php @@ -42,8 +42,7 @@ class ProductPrice extends BaseRule */ public function apply(Builder $builder, $operand) { - $includeSpecials = Arr::get($this->criteria, 'include_specials.value', true); - $includeDiscounts = Arr::get($this->criteria, 'include_discounts.value', false); + $includeSpecials = $this->criteria['include_specials']->params['value'] ?? true; /** @var Criterion|null $productPriceCriterion */ $productPriceCriterion = $this->criteria['product_price'] ?? null; @@ -67,10 +66,10 @@ class ProductPrice extends BaseRule $customerGroupId = config('oc_customer_group_id', 1); - $sub = $builder->newQuery() + $sub2 = $builder->newQuery() ->select([ - 'ps.product_id', - 'ps.price', + 'product_id', + new RawExpression("MIN(CONCAT(LPAD(priority, 5, '0'), LPAD(price, 10, '0'))) AS sort_key"), ]) ->from(db_table('product_special'), 'ps') ->where("ps.customer_group_id", '=', $customerGroupId) @@ -80,9 +79,18 @@ class ProductPrice extends BaseRule AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()) " ) - ->orderBy('ps.priority', 'ASC') - ->orderBy('ps.price', 'ASC') - ->limit(1); + ->groupBy(['product_id']); + + $sub = $builder->newQuery() + ->select([ + 'ps1.product_id', + 'ps1.price', + ]) + ->from(db_table('product_special'), 'ps1') + ->join(new Table($sub2, 'ps2'), function (JoinClause $join) { + $join->on('ps1.product_id', '=', 'ps2.product_id') + ->whereRaw("CONCAT(LPAD(ps1.priority, 5, '0'), LPAD(ps1.price, 10, '0')) = ps2.sort_key"); + }); $builder->join(new Table($sub, $joinAlias), function (JoinClause $join) use ($joinAlias) { $join->on('products.product_id', '=', "$joinAlias.product_id"); diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/FiltersHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/FiltersHandler.php new file mode 100755 index 0000000..4274dbc --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/FiltersHandler.php @@ -0,0 +1,62 @@ + 'AND', + 'rules' => [ + ProductPrice::NAME => [ + 'criteria' => [ + 'product_price' => [ + 'type' => 'number', + 'params' => [ + 'operator' => 'between', + 'value' => [ + 'from' => 0, + 'to' => null, + ], + ], + ], + ], + ], + + ProductForMainPage::NAME => [ + 'criteria' => [ + 'product_for_main_page' => [ + 'type' => 'boolean', + 'params' => [ + 'operator' => 'equals', + 'value' => true, + ], + ], + ], + ], + + ProductCategory::NAME => [ + 'criteria' => [ + 'product_category_id' => [ + 'type' => 'product_category', + 'params' => [ + 'operator' => 'contains', + 'value' => null, + ], + ], + ] + ], + ], + ]; + + return new JsonResponse([ + 'data' => $filters, + ]); + } +} diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/HealthCheckHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/HealthCheckHandler.php new file mode 100755 index 0000000..ee80e87 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/HealthCheckHandler.php @@ -0,0 +1,16 @@ + 'ok', + ], Response::HTTP_OK); + } +} diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/ServiceProviders/AppServiceProvider.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/ServiceProviders/AppServiceProvider.php index 07695c8..cfb3fbf 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/ServiceProviders/AppServiceProvider.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/ServiceProviders/AppServiceProvider.php @@ -5,6 +5,7 @@ namespace App\ServiceProviders; use App\Exceptions\CustomExceptionHandler; use App\Filters\ProductAttribute; use App\Filters\ProductCategories; +use App\Filters\ProductCategory; use App\Filters\ProductForMainPage; use App\Filters\ProductManufacturer; use App\Filters\ProductModel; @@ -64,6 +65,7 @@ class AppServiceProvider extends ServiceProvider ProductQuantity::NAME => ProductQuantity::class, ProductStatus::NAME => ProductStatus::class, ProductForMainPage::NAME => ProductForMainPage::class, + ProductCategory::NAME => ProductCategory::class, ]); } } diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Services/ProductsService.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Services/ProductsService.php index b44ed68..6450c34 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Services/ProductsService.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Services/ProductsService.php @@ -59,7 +59,7 @@ class ProductsService $maxPages = $params['maxPages'] ?? 50; $filters = $params['filters'] ?? []; - $customerGroupId = (int) $this->oc->config->get('config_customer_group_id'); + $customerGroupId = (int) $this->settings->get('oc_customer_group_id'); $specialPriceSql = "(SELECT price FROM oc_product_special ps WHERE ps.product_id = products.product_id diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/routes.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/routes.php index bac7257..a043814 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/routes.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/routes.php @@ -1,16 +1,21 @@ [HealthCheckHandler::class, 'handle'], + 'products' => [ProductsHandler::class, 'index'], 'product_show' => [ProductsHandler::class, 'show'], 'storeOrder' => [OrderHandler::class, 'store'], + 'filtersForMainPage' => [FiltersHandler::class, 'getFiltersForMainPage'], 'categoriesList' => [CategoriesHandler::class, 'index'], diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/BuilderTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/BuilderTest.php index 0aa4d8b..76db14e 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/BuilderTest.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/BuilderTest.php @@ -498,4 +498,18 @@ class BuilderTest extends TestCase $this->assertEquals($expected, $query->toRawSql()); } + + public function testGroupBy(): void + { + $query = $this->builder->newQuery() + ->select(['foo', 'bar']) + ->from('table_1') + ->groupBy(['foo', 'bar']); + + $this->assertEquals( + 'SELECT foo, bar FROM table_1 GROUP BY foo, bar', + $query->toRawSql(), + ); + + } } \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/CriteriaBuilderTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/CriteriaBuilderTest.php index 2db04c3..415ec12 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/CriteriaBuilderTest.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/CriteriaBuilderTest.php @@ -4,6 +4,7 @@ namespace Tests\Unit; use App\Filters\ProductAttribute; use App\Filters\ProductCategories; +use App\Filters\ProductCategory; use App\Filters\ProductForMainPage; use App\Filters\ProductManufacturer; use App\Filters\ProductModel; @@ -89,6 +90,7 @@ class CriteriaBuilderTest extends TestCase $rulesRegistry->register(ProductQuantity::NAME, ProductQuantity::class); $rulesRegistry->register(ProductAttribute::NAME, ProductAttribute::class); $rulesRegistry->register(ProductForMainPage::NAME, ProductForMainPage::class); + $rulesRegistry->register(ProductCategory::NAME, ProductCategory::class); $this->builder = $application->get(Builder::class); $this->criteriaBuilder = $application->get(CriteriaBuilder::class); diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/MySqlGrammarTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/MySqlGrammarTest.php index 42e722c..18cc146 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/MySqlGrammarTest.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/MySqlGrammarTest.php @@ -219,4 +219,15 @@ class MySqlGrammarTest extends TestCase ['column' => 'bar', 'as' => null], ])); } + + public function testCompileGroupBy(): void + { + $mock = m::mock(Builder::class); + $mock->groupBy = ['foo', 'bar']; + + $this->assertEquals( + 'GROUP BY foo, bar', + $this->grammar->compileGroupBy($mock, ['foo', 'bar']) + ); + } } \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/TableTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/TableTest.php old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/contains/input.json b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/contains/input.json new file mode 100755 index 0000000..3b233c7 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/contains/input.json @@ -0,0 +1,19 @@ +{ + "operand": "AND", + "rules": { + "RULE_PRODUCT_CATEGORY": { + "criteria": { + "product_category_id": { + "type": "product_category", + "params": { + "operator": "contains", + "value": 58 + } + } + }, + "__meta": { + "group": "other" + } + } + } +} 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 new file mode 100644 index 0000000..7ab0968 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/contains/output.sql @@ -0,0 +1,17 @@ +SELECT + products.product_id AS product_id, + products.image AS image, + product_description.name AS name, + products.model AS model, + products.price AS price, + products.quantity AS quantity, + products.status AS STATUS, + products.noindex AS noindex +FROM + oc_product AS products + INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id + AND product_description.language_id = 1 + LEFT JOIN oc_product_to_category AS product_category_a46414dc254a7328c63a5de8a760fa8f ON products.product_id = product_category_a46414dc254a7328c63a5de8a760fa8f.product_id + AND product_category_a46414dc254a7328c63a5de8a760fa8f.category_id = 58 +WHERE + product_category_a46414dc254a7328c63a5de8a760fa8f.product_id IS NOT NULL \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/not_contains/input.json b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/not_contains/input.json new file mode 100755 index 0000000..b7b77e7 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/not_contains/input.json @@ -0,0 +1,19 @@ +{ + "operand": "AND", + "rules": { + "RULE_PRODUCT_CATEGORY": { + "criteria": { + "product_category_id": { + "type": "product_category", + "params": { + "operator": "not_contains", + "value": 58 + } + } + }, + "__meta": { + "group": "other" + } + } + } +} 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 new file mode 100644 index 0000000..cd850fb --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_category/not_contains/output.sql @@ -0,0 +1,17 @@ +SELECT + products.product_id AS product_id, + products.image AS image, + product_description.name AS name, + products.model AS model, + products.price AS price, + products.quantity AS quantity, + products.status AS STATUS, + products.noindex AS noindex +FROM + oc_product AS products + INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id + AND product_description.language_id = 1 + LEFT JOIN oc_product_to_category AS product_category_fa9affd75942255178dc16d1ec8b424f ON products.product_id = product_category_fa9affd75942255178dc16d1ec8b424f.product_id + AND product_category_fa9affd75942255178dc16d1ec8b424f.category_id = 58 +WHERE + product_category_fa9affd75942255178dc16d1ec8b424f.product_id IS NULL \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured/output.sql old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured/settings_override.json b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured/settings_override.json old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured_empty_products/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured_empty_products/output.sql old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured_empty_products/settings_override.json b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured_empty_products/settings_override.json old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/latests/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/latests/output.sql old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/latests/settings_override.json b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/latests/settings_override.json old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/most_viewed/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/most_viewed/output.sql old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/most_viewed/settings_override.json b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/most_viewed/settings_override.json old mode 100644 new mode 100755 diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between/output.sql index c578d4a..6bf58c5 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_4bf5415bae7c037731801559d0410697 ON products.product_id = product_specials_4bf5415bae7c037731801559d0410697.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_equals/output.sql index c026f02..105e833 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_equals/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_f1ca65a396fc2e41a23a3661b84d1519 ON products.product_id = product_specials_f1ca65a396fc2e41a23a3661b84d1519.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_empty_string/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_empty_string/output.sql index ced3015..2b80009 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_empty_string/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_empty_string/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_f0c4ece67502916e844720b12abc54a9 ON products.product_id = product_specials_f0c4ece67502916e844720b12abc54a9.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_null/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_null/output.sql index 4ad27f8..5121075 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_null/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_null/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_5173bd7b8335ab5a9f4e37227d0c317f ON products.product_id = product_specials_5173bd7b8335ab5a9f4e37227d0c317f.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_num_as_string/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_num_as_string/output.sql index e4734cd..3877769 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_num_as_string/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_num_as_string/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_7b934dfdfc5b809270875934c10acc06 ON products.product_id = product_specials_7b934dfdfc5b809270875934c10acc06.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals/output.sql index c70a7c1..f30b4ac 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals_num_as_string/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals_num_as_string/output.sql index d1a14bc..946e55f 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals_num_as_string/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals_num_as_string/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_7de8997be994ada47d62cdfe2b7369c9 ON products.product_id = product_specials_7de8997be994ada47d62cdfe2b7369c9.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater/output.sql index 1609c7b..1fb3886 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_78ccac1dc1d86997e6eac0613f2eb5f3 ON products.product_id = product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater_or_equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater_or_equals/output.sql index 33786b7..3228f6a 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater_or_equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater_or_equals/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_5816f1e65a3d296a26635f070d0439bc ON products.product_id = product_specials_5816f1e65a3d296a26635f070d0439bc.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_discounts/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_discounts/output.sql index c70a7c1..f30b4ac 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_discounts/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_discounts/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_specials/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_specials/output.sql index c70a7c1..f30b4ac 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_specials/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_specials/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less/output.sql index 9a7a814..192064a 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_cf0f856fa900f18f5c8c0a57357532f5 ON products.product_id = product_specials_cf0f856fa900f18f5c8c0a57357532f5.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less_or_equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less_or_equals/output.sql index 4fb358c..e779987 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less_or_equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less_or_equals/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_08e0a0248dc92591ae55fdd966728ba0 ON products.product_id = product_specials_08e0a0248dc92591ae55fdd966728ba0.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_equals/output.sql index 6d58168..8956f4d 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_equals/output.sql @@ -13,25 +13,38 @@ FROM AND product_description.language_id = 1 LEFT JOIN ( SELECT - ps.product_id, - ps.price + ps1.product_id, + ps1.price FROM - oc_product_special AS ps - WHERE - ps.customer_group_id = 1 - AND ( - ps.date_start = '0000-00-00' - OR ps.date_start < NOW() - ) - AND ( - ps.date_end = '0000-00-00' - OR ps.date_end > NOW() - ) - ORDER BY - ps.priority ASC, - ps.price ASC - LIMIT - 1 + oc_product_special AS ps1 + INNER JOIN ( + SELECT + product_id, + MIN( + CONCAT( + LPAD(priority, 5, '0'), + LPAD(price, 10, '0') + ) + ) AS sort_key + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + GROUP BY + product_id + ) AS ps2 ON ps1.product_id = ps2.product_id + AND CONCAT( + LPAD(ps1.priority, 5, '0'), + LPAD(ps1.price, 10, '0') + ) = ps2.sort_key ) AS product_specials_47d71067324729b89b13414a6ea869e0 ON products.product_id = product_specials_47d71067324729b89b13414a6ea869e0.product_id WHERE COALESCE( diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_include_specials/input.json b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_include_specials/input.json new file mode 100755 index 0000000..90282c1 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_include_specials/input.json @@ -0,0 +1,25 @@ +{ + "operand": "AND", + "rules": { + "RULE_PRODUCT_PRICE": { + "criteria": { + "product_price": { + "type": "number", + "params": { + "operator": "equals", + "value": { + "from": 100, + "to": null + } + } + }, + "include_specials": { + "type": "boolean", + "params": { + "value": false + } + } + } + } + } +} \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_include_specials/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_include_specials/output.sql new file mode 100755 index 0000000..73598b7 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_include_specials/output.sql @@ -0,0 +1,15 @@ +SELECT + products.product_id AS product_id, + products.image AS image, + product_description.name AS name, + products.model AS model, + products.price AS price, + products.quantity AS quantity, + products.status AS STATUS, + products.noindex AS noindex +FROM + oc_product AS products + INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id + AND product_description.language_id = 1 +WHERE + products.price = 100 \ No newline at end of file diff --git a/spa/src/App.vue b/spa/src/App.vue index eee9235..4ff5a24 100644 --- a/spa/src/App.vue +++ b/spa/src/App.vue @@ -5,9 +5,9 @@ - + - + @@ -21,6 +21,7 @@ import {useMiniApp, FullscreenViewport} from 'vue-tg'; import {useRoute, useRouter} from "vue-router"; import CartButton from "@/components/CartButton.vue"; import {useSettingsStore} from "@/stores/SettingsStore.js"; +import {useProductFiltersStore} from "@/stores/ProductFiltersStore.js"; const tg = useMiniApp(); const platform = ref(); @@ -32,6 +33,7 @@ disableVerticalSwipes(); const router = useRouter(); const route = useRoute(); const settings = useSettingsStore(); +const filtersStore = useProductFiltersStore(); const backButton = window.Telegram.WebApp.BackButton; const haptic = window.Telegram.WebApp.HapticFeedback; @@ -54,21 +56,3 @@ watch( {immediate: true} ); - - \ No newline at end of file diff --git a/spa/src/components/NoProducts.vue b/spa/src/components/NoProducts.vue index 165c226..4d6b229 100644 --- a/spa/src/components/NoProducts.vue +++ b/spa/src/components/NoProducts.vue @@ -1,14 +1,10 @@ 🛒 - Здесь пока пусто - Мы уже выехали на склад, чтобы найти что-нибудь подходящее. - - - - - Назад - + Здесь нет товаров + + Попробуйте изменить настройки фильтров + diff --git a/spa/src/components/ProductFilters/Components/ForMainPage.vue b/spa/src/components/ProductFilters/Components/ForMainPage.vue index 706ae4c..cb8fb87 100644 --- a/spa/src/components/ProductFilters/Components/ForMainPage.vue +++ b/spa/src/components/ProductFilters/Components/ForMainPage.vue @@ -1,12 +1,11 @@ - Товары для главной страницы + Рекомендуемые товары diff --git a/spa/src/components/ProductFilters/Components/ProductCategory/ProductCategory.vue b/spa/src/components/ProductFilters/Components/ProductCategory/ProductCategory.vue new file mode 100644 index 0000000..dc3d530 --- /dev/null +++ b/spa/src/components/ProductFilters/Components/ProductCategory/ProductCategory.vue @@ -0,0 +1,42 @@ + + + Категория + + + Любая категория + + + + + + + + \ No newline at end of file diff --git a/spa/src/components/ProductFilters/Components/ProductCategory/SelectOption.vue b/spa/src/components/ProductFilters/Components/ProductCategory/SelectOption.vue new file mode 100644 index 0000000..8a29ebb --- /dev/null +++ b/spa/src/components/ProductFilters/Components/ProductCategory/SelectOption.vue @@ -0,0 +1,31 @@ + + + {{ "-".repeat(level) }} {{ category.name }} + + + + + + + + \ No newline at end of file diff --git a/spa/src/components/ProductFilters/Filters.vue b/spa/src/components/ProductFilters/Filters.vue deleted file mode 100644 index a051fd7..0000000 --- a/spa/src/components/ProductFilters/Filters.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - - - Фильтры - - - - - - - Not supported {{ filter.type }} - - - - Нет фильтров - - - - - - - diff --git a/spa/src/components/ProductFilters/filters.js b/spa/src/components/ProductFilters/filters.js deleted file mode 100644 index 4f60b56..0000000 --- a/spa/src/components/ProductFilters/filters.js +++ /dev/null @@ -1,31 +0,0 @@ -export const FILTERS_MAIN_PAGE_DEFAULT = { - operand: "AND", - rules: { - RULE_PRODUCT_PRICE: { - criteria: { - "product_price": - { - "type": "number", - "params": { - "operator": "between", - "value": { - "from": "", - "to": "" - }, - }, - }, - }, - }, - RULE_PRODUCT_FOR_MAIN_PAGE: { - "criteria": { - "product_for_main_page": { - "type": "boolean", - "params": { - "operator": "equals", - "value": true - } - } - } - }, - }, -}; diff --git a/spa/src/components/ProductImageSwiper.vue b/spa/src/components/ProductImageSwiper.vue index 193c225..8568cb8 100644 --- a/spa/src/components/ProductImageSwiper.vue +++ b/spa/src/components/ProductImageSwiper.vue @@ -2,7 +2,7 @@ @@ -18,7 +18,7 @@ diff --git a/spa/src/components/ProductsList.vue b/spa/src/components/ProductsList.vue index e880060..6da8712 100644 --- a/spa/src/components/ProductsList.vue +++ b/spa/src/components/ProductsList.vue @@ -1,13 +1,13 @@ - - {{ productsStore.products.meta.currentCategoryName }} + + {{ categoryName }} - + - - Загрузка... + + Загрузка товаров... - + {{ settings.noMoreProductsMessage }} - + - - - @@ -48,32 +43,71 @@ + +
Мы уже выехали на склад, чтобы найти что-нибудь подходящее.
+ Попробуйте изменить настройки фильтров +
Not supported {{ filter.type }}