При настройке скидок и цен используется принцип группировок. Так для настройки скидок по строке все товары и клиенты делятся на группы – группы скидок по строке.

Для настройки многострочных скидок данный принцип тоже остается справедливым, используются так называемые группы многострочных скидок.

Для настройки общих скидок используются группы общих скидок, но они настраиваются только для клиентов, так как общая скидка не зависит от товарных позиций.

При этом группировки по каждому из видов скидок независимы друг от друга.

Скидки по строке

Скидки по строке могут быть определены для следующих разрезов данных:

§  Клиент - Товар

§  Клиент - Группа товаров

§  Клиент - Все товары

§  Группа клиентов - Товар

§  Группа клиентов - Группа товара

§  Группа клиентов - Все товары

§  Все клиенты - Товар

§  Все клиенты - Группа товаров

§  Все клиенты - Всех товары

При автоматическом поиске скидки система будет выполнять поиск начиная с разреза Клиент – Товар, и будет опускаться ниже до разреза Все клиенты - Все товары. В случае если для одной товарной позиции подходит несколько скидок, то данные по скидкам будут суммироваться.

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

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

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

Таким образом, для одной товарной позиции в заказе, может существовать  несколько скидок по строке. При этом в строку заказа будет перенесено суммарное значение по всем скидкам. Однако для каждой скидки есть параметр, который позволяет прекратить дальнейший поиск. В случае если при расчете скидки будет обнаружена такая настройка, то дальнейшее суммирование проводиться не будет.

Алгоритм поиска скидок по строке можно представить в виде дерева:

 

Алгоритм поиска скидок по строке в Dymanics AX

Поддеревья узлов Скидка настроена для группы клиентов и Скидка настроена для всех клиентов такие же, как у узла Скидка настроена для клиента.

           Количество в скидке минимально и меньше либо равно количеству в строке заказа -  если для текущей товарной позиции в заказе настроено несколько скидок, удовлетворяющих условиям предыдущих узлов, то система первоначально выберет ту скидку, у которой количественный критерий будет минимальным.

Минимальная дата начала временного диапазона действия скидки - если для текущей товарной позиции в заказе настроено несколько скидок удовлетворяющих условиям предыдущих узлов, то система первоначально выберет ту, у которой дата начала временного диапазона минимальна или не задана.

 Правила поиска:

1.      При поиске скидки по строке заказа система анализирует валюту заказа, единицу измерения, дату создания строки заказа. Из поиска сразу исключаются скидки, настройка которых не соответствует этим критериям.

2.      Для каждой скидки существует настройка (чек-бокс «Найти далее»), которая позволяет прекратить дальнейший поиск скидок. То есть, как только система обнаружит скидку с такой настройкой, поиск других скидок прекращается, даже если они и удовлетворяют текущей товарной позиции в заказе.

3.      В оставшемся множестве скидок система будет выполнять поиск,  начиная с ветки 1.1. Если правило 2 не выполнено (чек-боксы «Найти далее» активны), или скидки по ветке 1.1 не были найдены, то система продолжит поиск по ветке 1.2. и так далее, до ветки 3.3.

4.      Все найденные скидки суммируются

           

Пример:

Товары

Товар

Группа скидок по строке

Товар1

ГрТов1

Клиенты

Клиент

Группа скидок по строке

Клиент1

ГрКл1

Настройка скидок по строке

Связь клиента

Клиент

Связь товара

Товар

Дата С

Дата По

Кол-во

Скидка, %

Найти далее

1

Таблица

Клиент1

Таблица

Товар1

23.09.2005

30.09.2005

15

10

2

Таблица

Клиент1

Таблица

Товар1

21.09.2005

30.09.2005

10

8

3

Все

Группа

ГрТов1

20.09.2005

30.09.2005

10

6

4

Все

Все

10

4

Поле «№», не хранится в БД, и введено для упрощения дальнейшего описания примера. Считаем, что все скидки настроены в той же валюте, что и заказ и для тех же единиц измерения.

Создается заказ клиенту Клиент1, в котором есть следующая товарная позиция, которая создавалась 22.09.2005:

Товар

Количество

Цена

Скидка, %

Товар1

11

50

?

Первоначально система выберет скидку № 2, так как она находится в ветке 1.1, которая является самой приоритетной. Ссылка № 1  будет пропущена, так она не удовлетворяет количественному критерию. На данном этапе скидка по строке заказа будет равна 10%.

Так как для ссылки № 2 параметр «Найти далее» включен, то система продолжит поиск, и следующей будет выбрана скидка № 3, так как из оставшихся скидок она является наиболее приоритетной. Параметр «Найти далее» для данной скидки не активирован, как следствие система прекратит дальнейший поиск. Итоговая ссылка по строке заказа будет равна сумме скидок №1 и №3, т.е. 8 + 6 = 14 %.

Многострочные скидки

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

Пример:

В группу многострочных скидок входят две товарные позиции: А и В. В случае если количество в заказе превышает 10, то клиенту предоставляется скидка в размере 10%. Оформляем заказ не продажу, в котором имеется три товарных позиции: А – 7 шт., В – 5 шт., С – 11 шт. При расчете многострочной скидке будет анализироваться данные по позициям А и В, так как их суммарное количестве 7 + 5 = 12, больше 10, то к этим товарным позициям будет применена скидка в размере 10%. На товарную позицию С эта скидка распространятся не будет, так как он не входит в группу многострочных скидок.

Многострочные скидки могут быть определены для следующих разрезов данных:

§  Клиент - Группа товаров

§  Клиент - Все товары

§  Группа клиентов - Группа товара

§  Группа клиентов - Все товары

§  Все клиенты - Группа товаров

§  Все клиенты - Всех товары

При автоматическом поиске скидки система будет выполнять поиск начиная с разреза Клиент – Группа товаров, и будет опускаться ниже до разреза Все клиенты - Все товары. В случае если для одной товарной позиции подходит несколько скидок, то данные по скидкам будут суммироваться.

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

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

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

Таким образом, для одних и тех же товарных позиций в заказе, может существовать  несколько многострочных скидок. При этом на эти товарные позиции будет перенесено суммарное значение по всем скидкам. Однако для каждой скидки есть параметр, который позволяет прекратить дальнейший поиск. В случае если при расчете скидки будет обнаружена такая настройка, то дальнейшее суммирование проводиться не будет.

Алгоритм поиска многострочных скидок можно представить в виде дерева:

Алгоритм настройки многострочных скидок в Microsoft Dynamics AX

Поддеревья узлов Скидка настроена для группы клиентов и Скидка настроена для всех клиентов такие же, как у узла Скидка настроена для клиента.

            Количество в скидке минимально и меньше либо равно количеству в строках заказа -  если для текущих товарных позиций в заказе настроено несколько многострочных скидок, удовлетворяющих условиям предыдущих узлов, то система первоначально выберет ту скидку, у которой количественный критерий будет минимальным.

Минимальная дата начала временного диапазона действия скидки - если для текущих товарных позиций в заказе настроено несколько скидок удовлетворяющих условиям предыдущих узлов, то система первоначально выберет ту, у которой дата начала временного диапазона минимальна или не задана.

Правила поиска:

1.      При поиске многострочных скидок система анализирует валюту заказа, единицу измерения, дату создания строки заказа. Из поиска сразу исключаются скидки, настройка которых не соответствует этим критериям.

2.      Для каждой скидки существует настройка (чек-бокс «Найти далее»), которая позволяет прекратить дальнейший поиск скидок. То есть, как только система обнаружит скидку с такой настройкой, поиск других скидок прекращается, даже если они и удовлетворяют текущим товарным позициям в заказе.

3.      В оставшемся множестве скидок система будет выполнять поиск,  начиная с ветки 1.1. Если правило 2 не выполнено (чек-боксы «Найти далее» активны), или скидки по ветке 1.1 не были найдены, то система продолжит поиск по ветке 1.2. и так далее, до ветки 3.2.

4.      Все найденные скидки суммируются

 

Пример:

Товары

Товар

Группа многострочных скидок

Товар1

ГрТов1

Товар2

ГрТов1

Клиенты

Клиент

Группа многострочных скидок

Клиент1

ГрКл1

Настройка многострочных скидок

Связь клиента

Клиент

Связь товара

Товар

Дата С

Дата По

Кол-во

Скидка, %

Найти далее

1

Таблица

Клиент1

Группа

ГрТов1

22.09.2005

30.09.2005

15

10

2

Группа

ГрКл1

Группа

ГрТов1

21.09.2005

30.09.2005

10

8

3

Все

Все

20.09.2005

30.09.2005

10

6

4

Все

Все

20

2

Поле «№», не хранится в БД, и введено для упрощения дальнейшего описания примера. Считаем, что все скидки настроены в той же валюте, что и заказ на продажу.

Создается заказ клиенту Клиент1, в котором есть следующие товарные позиции, которая создавалась 22.09.2005:

Товар

Количество

Цена

Скидка, %

Товар1

5

50

?

Товар2

6

45

?

Система будем рассматривать скидки в следующем порядке: №1, №2, №3, №4.

Скидка №1 учитываться не будет, так как она не удовлетворяет количественному критерию (5 + 6 < 15).

Скидка №2 будет учтена, так как она удовлетворяет всем критериям. Так как параметр «Найти далее» активен, то поиск будет продолжен.

Скидка №3 так же будет учтена, так как и она удовлетворит всем критериям, однако дальнейший поиск выполняться не будет, так как параметр «Найти далее» не активен.

В результате на строки заказа будет начислена суммарная скидка, состоящая из скидок  №2  и №3, равная 8 + 6 = 14%.

Общая скидка

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

§  Строка – будут использоваться только скидки по строке, а многострочные скидки учитываться не будут

§  Многострочная - будут использоваться только многострочные скидки, а скидка по строке учитываться не будут

§  Максимум (По строке, Многострочная) – будет учитываться максимальная

§  Минимум (По строке, Многострочная) - будет учитываться минимальная

§  По строке + Многострочная –скидки будут суммироваться между собой

§  По строке * Многострочная – скидки будут перемножаться между собой

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

При настройке общих скидок клиентов необходимо разделить на группы – группы общих скидок. Затем общую скидку можно задать для следующих разрезов данных:

§  Клиент

§  Группа клиентов

§  Все клиенты

При автоматическом поиске скидки система будет выполнять поиск начиная с разреза Клиент, затем перейдет к разрезу Группа, и в последнюю очередь рассмотрит разрез Все клиенты. В случае если для заказа подходит несколько скидок, то данные по скидкам будут суммироваться.

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

Кроме этого сумма общей скидки зависит от суммы заказа. При этом скидка будет применена к заказу, если сумма заказа превышает критерий Сумма в настройке общей скидки. При таком подходе к одному заказу могут быть применены несколько скидок, в таком случае данных по ним будут суммироваться.

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

Таким образом, к одному заказа, может быть применено несколько общих скидок. При этом к заказу будет применено суммарное значение по всем скидкам. Однако для каждой скидки есть параметр, который позволяет прекратить дальнейший поиск. В случае если при расчете скидки будет обнаружена такая настройка, то дальнейшее суммирование проводиться не будет.

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

Первоначально система будет рассматривать скидки, настроенные для конкретного клиента. При этом для одного клиента может быть несколько общих скидок, с различным критерием «Сумма». В первую очередь будут учтены скидки, у которых критерий «Сумма» минимальный. В случае если для клиента существует несколько общих скидок с одинаковым критерием «Сумма», но с различными диапазонами действия, в которые попадает дата заказа, то выбрана будет та, у которой дата начала диапазона минимальна. В случае если у найденной скидки параметр «Найти далее» активен, то система продолжит поиск, и перейдет к скидкам с более поздними датами начала временного диапазона, а затем и с большим значением критерия «Сумма».

После того как все общие скидки по конкретному клиенту будут рассмотрены, система перейдет к поиску скидок настроенных для группы данного клиента, а затем и для скидок настроенных для всех клиентов. При этом принцип подбора  скидок согласно значению критерия «Сумма» и дате начала временного диапазона действия останется без изменений.

В случае если среди скидок будет обнаружена та, у которой параметр «Найти далее» не активен, то поиск скидок будет прекращен.

Пример:

Клиент

Клиент

Группа общих скидок

Клиент1

ГрКл1

Настройка общих скидок:

Связь клиента

Клиент

Дата С

Дата По

Сумма

Скидка, %

Найти далее

1

Таблица

Клиент1

22.09.2005

30.09.2005

150

10

2

Группа

ГрКл1

21.09.2005

30.09.2005

100

8

3

Группа

ГрКл1

20.09.2005

30.09.2005

100

6

4

Все

110

2

Поле «№», не хранится в БД, и введено для упрощения дальнейшего описания примера. Считаем, что все скидки настроены в руб.

Создаем заказ клиенту Клиент1 на сумму 150 руб. Дата создания заказа 23.09.2005.

Система будет рассматривать скидки в следующем порядке: №1, №3,№2,№4.

Все эти скидки удовлетворяют условиям данного заказа. Однако в системе будут учтены только скидки №1 и №3, так как на скидке №3 параметр «Найти далее» не активен, то на ней дальнейший поиск будет прекращен. Скидка №3 имеет более высокий приоритет по отношению к скидке №2, так как критерий «Сумма» у них одинаковый, а дата начала временного диапазона у скидки №3 более ранняя. В результате на данный заказ будет начислена скидка равная 10 + 6 = 16%.

 Автор Daiver

Settings3.85MBMemory Usage73.2msRequest Duration
Theme
Open Button Position
Hide Empty Tabs
Autoshow
Reset to defaults
Joomla! Version5.3.0
PHP Version8.2.28
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.11.11-MariaDB-0+deb12u1
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
[]
$_SERVER
array:42 [ "USER" => "www-data" "HOME" => "/var/www" "HTTP_PRIORITY" => "u=0, i" "HTTP_ACCEP...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1751692052 "last" => 1751692052...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (82.19KB) (1.07ms)
  • afterInitialise (1.13MB) (18.49ms)
  • afterRoute (72.85KB) (5.88ms)
  • beforeRenderComponent com_content (104.66KB) (3.85ms)
  • Before Access::preloadComponents (all components) (35.02KB) (470μs)
  • After Access::preloadComponents (all components) (114.12KB) (2.08ms)
  • Before Access::preloadPermissions (com_content) (424B) (15μs)
  • After Access::preloadPermissions (com_content) (13.34KB) (1.22ms)
  • Before Access::getAssetRules (id:135 name:com_content.article.42) (104B) (15μs)
  • After Access::getAssetRules (id:135 name:com_content.article.42) (7.38KB) (72μs)
  • afterRenderComponent com_content (879.29KB) (25.93ms)
  • afterDispatch (3.16KB) (185μs)
  • beforeRenderRawModule mod_menu (Main Menu) (345.79KB) (4.09ms)
  • afterRenderRawModule mod_menu (Main Menu) (83.09KB) (627μs)
  • beforeRenderModule mod_menu (Main Menu) (704B) (6μs)
  • afterRenderModule mod_menu (Main Menu) (3.56KB) (106μs)
  • afterRender (422.48KB) (8.79ms)
  • 1 x afterRenderComponent com_content (879.29KB) (35.42%)
    25.93ms
    1 x afterInitialise (1.13MB) (25.26%)
    18.49ms
    1 x afterRender (422.48KB) (12.01%)
    8.79ms
    1 x afterRoute (72.85KB) (8.04%)
    5.88ms
    1 x beforeRenderRawModule mod_menu (Main Menu) (345.79KB) (5.59%)
    4.09ms
    1 x beforeRenderComponent com_content (104.66KB) (5.25%)
    3.85ms
    1 x After Access::preloadComponents (all components) (114.12KB) (2.85%)
    2.08ms
    1 x After Access::preloadPermissions (com_content) (13.34KB) (1.67%)
    1.22ms
    1 x afterLoad (82.19KB) (1.46%)
    1.07ms
    1 x afterRenderRawModule mod_menu (Main Menu) (83.09KB) (0.86%)
    627μs
    1 x Before Access::preloadComponents (all components) (35.02KB) (0.64%)
    470μs
    1 x afterDispatch (3.16KB) (0.25%)
    185μs
    1 x afterRenderModule mod_menu (Main Menu) (3.56KB) (0.14%)
    106μs
    1 x After Access::getAssetRules (id:135 name:com_content.article.42) (7.38KB) (0.1%)
    72μs
    1 x Before Access::preloadPermissions (com_content) (424B) (0.02%)
    15μs
    1 x Before Access::getAssetRules (id:135 name:com_content.article.42) (104B) (0.02%)
    15μs
    1 x beforeRenderModule mod_menu (Main Menu) (704B) (0.01%)
    6μs
31 statements were executed, 6 of which were duplicates, 25 unique38.69ms899.83KB
  • SELECT @@SESSION.sql_mode;116μs968B/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:259Copy
  • SELECT `data` FROM `ef_session` WHERE `session_id` = ?1.1ms1008BParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:250Copy
  • SELECT `session_id` FROM `ef_session` WHERE `session_id` = :session_id LIMIT 1106μs1.3KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • INSERT INTO `ef_session` (`session_id`,`guest`,`time`,`userid`,`username`,`client_id`) VALUES (:session_id, :guest, :time, :user_id, :username, :client_id)1.79ms944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `extension_id` AS `id`,`element` AS `option`,`params`,`enabled` FROM `ef_extensions` WHERE `type` = 'component' AND `state` = 0 AND `enabled` = 12.8ms1.61KB/libraries/src/Component/ComponentHelper.php:399Copy
  • SELECT `id`,`rules` FROM `ef_viewlevels`613μs656B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `ef_usergroups` AS `a` LEFT JOIN `ef_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest1ms1.33KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `folder` AS `type`,`element` AS `name`,`params` AS `params`,`extension_id` AS `id` FROM `ef_extensions` WHERE `enabled` = 1 AND `type` = 'plugin' AND `state` IN (0,1) AND `access` IN (:preparedArray1,:preparedArray2) ORDER BY `ordering`2.4ms3.98KBParams/libraries/src/Plugin/PluginHelper.php:294Copy
  • SELECT `m`.`id`,`m`.`menutype`,`m`.`title`,`m`.`alias`,`m`.`note`,`m`.`link`,`m`.`type`,`m`.`level`,`m`.`language`,`m`.`browserNav`,`m`.`access`,`m`.`params`,`m`.`home`,`m`.`img`,`m`.`template_style_id`,`m`.`component_id`,`m`.`parent_id`,`m`.`path` AS `route`,`e`.`element` AS `component` FROM `ef_menu` AS `m` LEFT JOIN `ef_extensions` AS `e` ON `m`.`component_id` = `e`.`extension_id` WHERE ( (`m`.`published` = 1 AND `m`.`parent_id` > 0 AND `m`.`client_id` = 0) AND (`m`.`publish_up` IS NULL OR `m`.`publish_up` <= :currentDate1)) AND (`m`.`publish_down` IS NULL OR `m`.`publish_down` >= :currentDate2) ORDER BY `m`.`lft`1.05ms3.95KBParams/libraries/src/Menu/SiteMenu.php:166Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `ef_categories` AS `s` INNER JOIN `ef_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`1.6ms3.86KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `alias` FROM `ef_content` WHERE `id` = :id865μs1.31KBParams/components/com_content/src/Service/Router.php:289Copy
  • SELECT * FROM `ef_languages` WHERE `published` = 1 ORDER BY `ordering` ASC570μs1.59KB/libraries/src/Language/LanguageHelper.php:179Copy
  • SELECT `id`,`home`,`template`,`s`.`params`,`inheritable`,`parent` FROM `ef_template_styles` AS `s` LEFT JOIN `ef_extensions` AS `e` ON `e`.`element` = `s`.`template` AND `e`.`type` = 'template' AND `e`.`client_id` = `s`.`client_id` WHERE `s`.`client_id` = 0 AND `e`.`enabled` = 11.91ms832B/administrator/components/com_templates/src/Model/StyleModel.php:718Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `ef_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39)1.76ms7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `ef_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 0998μs2.36KBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `ef_content`406μs1.77KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:539Copy
  • UPDATE `ef_content` SET `hits` = (`hits` + 1) WHERE `id` = '42'4.33ms1.3KB/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `ef_content` AS `a` INNER JOIN `ef_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `ef_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `ef_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `ef_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `ef_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)1.32ms278.13KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `ef_categories` AS `s` INNER JOIN `ef_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`660μs3.91KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `ef_contentitem_tag_map` AS `m` INNER JOIN `ef_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)1.77ms4KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `ef_categories` AS `s` INNER JOIN `ef_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`372μs3.91KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM ef_fields AS a LEFT JOIN `ef_languages` AS l ON l.lang_code = a.language LEFT JOIN ef_users AS uc ON uc.id=a.checked_out LEFT JOIN ef_viewlevels AS ag ON ag.id = a.access LEFT JOIN ef_users AS ua ON ua.id = a.created_user_id LEFT JOIN ef_fields_groups AS g ON g.id = a.group_id LEFT JOIN `ef_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2)) AND `a`.`access` IN (:preparedArray3,:preparedArray4)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray5,:preparedArray6)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC1.65ms4.75KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `a`.`id`,`a`.`title`,`a`.`catid`,`a`.`language`, CASE WHEN CHAR_LENGTH(`a`.`alias`) != 0 THEN CONCAT_WS(':', `a`.`id`, `a`.`alias`) ELSE a.id END AS `slug`, CASE WHEN CHAR_LENGTH(`cc`.`alias`) != 0 THEN CONCAT_WS(':', `cc`.`id`, `cc`.`alias`) ELSE cc.id END AS `catslug` FROM `ef_content` AS `a` LEFT JOIN `ef_categories` AS `cc` ON `cc`.`id` = `a`.`catid` WHERE `a`.`catid` = :catid AND `a`.`state` = :state AND `a`.`access` IN (:preparedArray1,:preparedArray2) AND (`publish_up` IS NULL OR `publish_up` <= :nowDate1) AND (`publish_down` IS NULL OR `publish_down` >= :nowDate2) ORDER BY CASE WHEN `a`.`publish_up` IS NULL THEN `a`.`created` ELSE `a`.`publish_up` END DESC4.95ms2.47KBParams/plugins/content/pagenavigation/src/Extension/PageNavigation.php:205Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `ef_categories` AS `s` INNER JOIN `ef_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`327μs3.91KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`id`,`m`.`title`,`m`.`module`,`m`.`position`,`m`.`content`,`m`.`showtitle`,`m`.`params`,`mm`.`menuid` FROM `ef_modules` AS `m` LEFT JOIN `ef_modules_menu` AS `mm` ON `mm`.`moduleid` = `m`.`id` LEFT JOIN `ef_extensions` AS `e` ON `e`.`element` = `m`.`module` AND `e`.`client_id` = `m`.`client_id` WHERE ( ( (`m`.`published` = 1 AND `e`.`enabled` = 1 AND `m`.`client_id` = :clientId AND `m`.`access` IN (:preparedArray1,:preparedArray2)) AND (`m`.`publish_up` IS NULL OR `m`.`publish_up` <= :publishUp)) AND (`m`.`publish_down` IS NULL OR `m`.`publish_down` >= :publishDown)) AND (`mm`.`menuid` = :itemId OR `mm`.`menuid` <= 0) ORDER BY `m`.`position`,`m`.`ordering`1.25ms1.83KBParams/libraries/src/Cache/Controller/CallbackController.php:51Copy
  • SELECT * FROM `ef_schemaorg` WHERE `itemId` = :itemId AND `context` = :context589μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:406Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `ef_content` AS `a` INNER JOIN `ef_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `ef_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `ef_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `ef_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `ef_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)336μs278.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `ef_content` AS `a` INNER JOIN `ef_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `ef_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `ef_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `ef_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `ef_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)304μs278.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `ef_scheduler_tasks` AS `a` WHERE `a`.`state` = 1700μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:517Copy
  • SELECT `session_id` FROM `ef_session` WHERE `session_id` = ?105μs1KBParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:277Copy
  • UPDATE `ef_session` SET `data` = ? , `time` = ? WHERE `session_id` = ?932μs592BParams/libraries/vendor/joomla/session/src/Handler/DatabaseHandler.php:301Copy