From 7ebcc6c71affaf521f3bd95a414998ff0e7036d3 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 16 May 2024 14:51:55 +0300 Subject: [PATCH] kb active status list --- .../KnowledgeBaseArticle/AccessChecker.php | 12 +++++++++--- .../AccessControlFilters/Mandatory.php | 14 +++++++++----- .../PrimaryFilters/Published.php | 12 +++++++++--- .../Crm/Entities/KnowledgeBaseArticle.php | 5 +++++ .../Jobs/ControlKnowledgeBaseArticleStatus.php | 16 +++++++++------- .../entityDefs/KnowledgeBaseArticle.json | 7 +++++++ 6 files changed, 48 insertions(+), 18 deletions(-) diff --git a/application/Espo/Modules/Crm/Classes/AclPortal/KnowledgeBaseArticle/AccessChecker.php b/application/Espo/Modules/Crm/Classes/AclPortal/KnowledgeBaseArticle/AccessChecker.php index 6f2385a730..0358a61161 100644 --- a/application/Espo/Modules/Crm/Classes/AclPortal/KnowledgeBaseArticle/AccessChecker.php +++ b/application/Espo/Modules/Crm/Classes/AclPortal/KnowledgeBaseArticle/AccessChecker.php @@ -29,6 +29,7 @@ namespace Espo\Modules\Crm\Classes\AclPortal\KnowledgeBaseArticle; +use Espo\Core\Utils\Metadata; use Espo\Entities\User; use Espo\Modules\Crm\Entities\KnowledgeBaseArticle; use Espo\ORM\Entity; @@ -45,8 +46,10 @@ class AccessChecker implements AccessEntityCREDChecker { use DefaultAccessCheckerDependency; - public function __construct(DefaultAccessChecker $defaultAccessChecker) - { + public function __construct( + DefaultAccessChecker $defaultAccessChecker, + private Metadata $metadata + ) { $this->defaultAccessChecker = $defaultAccessChecker; } @@ -56,7 +59,10 @@ class AccessChecker implements AccessEntityCREDChecker return false; } - if ($entity->get('status') !== KnowledgeBaseArticle::STATUS_PUBLISHED) { + $statusList = $this->metadata->get("entityDefs.KnowledgeBaseArticle.fields.status.activeOptions") ?? + [KnowledgeBaseArticle::STATUS_PUBLISHED]; + + if (!in_array($entity->getStatus(), $statusList)) { return false; } diff --git a/application/Espo/Modules/Crm/Classes/Select/KnowledgeBaseArticle/AccessControlFilters/Mandatory.php b/application/Espo/Modules/Crm/Classes/Select/KnowledgeBaseArticle/AccessControlFilters/Mandatory.php index a03c503470..e9ec3582fa 100644 --- a/application/Espo/Modules/Crm/Classes/Select/KnowledgeBaseArticle/AccessControlFilters/Mandatory.php +++ b/application/Espo/Modules/Crm/Classes/Select/KnowledgeBaseArticle/AccessControlFilters/Mandatory.php @@ -30,6 +30,7 @@ namespace Espo\Modules\Crm\Classes\Select\KnowledgeBaseArticle\AccessControlFilters; use Espo\Core\Select\AccessControl\Filter; +use Espo\Core\Utils\Metadata; use Espo\Modules\Crm\Entities\KnowledgeBaseArticle; use Espo\ORM\Query\SelectBuilder; @@ -37,8 +38,10 @@ use Espo\Entities\User; class Mandatory implements Filter { - public function __construct(private User $user) - {} + public function __construct( + private User $user, + private Metadata $metadata + ) {} public function apply(SelectBuilder $queryBuilder): void { @@ -46,10 +49,11 @@ class Mandatory implements Filter return; } + $statusList = $this->metadata->get("entityDefs.KnowledgeBaseArticle.fields.status.activeOptions") ?? + [KnowledgeBaseArticle::STATUS_PUBLISHED]; + $queryBuilder - ->where([ - 'status' => KnowledgeBaseArticle::STATUS_PUBLISHED, - ]) + ->where(['status' => $statusList]) ->distinct() ->leftJoin('portals', 'portalsAccess') ->where([ diff --git a/application/Espo/Modules/Crm/Classes/Select/KnowledgeBaseArticle/PrimaryFilters/Published.php b/application/Espo/Modules/Crm/Classes/Select/KnowledgeBaseArticle/PrimaryFilters/Published.php index da98d6bf39..fc2e318fad 100644 --- a/application/Espo/Modules/Crm/Classes/Select/KnowledgeBaseArticle/PrimaryFilters/Published.php +++ b/application/Espo/Modules/Crm/Classes/Select/KnowledgeBaseArticle/PrimaryFilters/Published.php @@ -30,15 +30,21 @@ namespace Espo\Modules\Crm\Classes\Select\KnowledgeBaseArticle\PrimaryFilters; use Espo\Core\Select\Primary\Filter; +use Espo\Core\Utils\Metadata; use Espo\Modules\Crm\Entities\KnowledgeBaseArticle; use Espo\ORM\Query\SelectBuilder; class Published implements Filter { + public function __construct( + private Metadata $metadata + ) {} + public function apply(SelectBuilder $queryBuilder): void { - $queryBuilder->where([ - 'status' => KnowledgeBaseArticle::STATUS_PUBLISHED, - ]); + $statusList = $this->metadata->get("entityDefs.KnowledgeBaseArticle.fields.status.activeOptions") ?? + [KnowledgeBaseArticle::STATUS_PUBLISHED]; + + $queryBuilder->where(['status' => $statusList]); } } diff --git a/application/Espo/Modules/Crm/Entities/KnowledgeBaseArticle.php b/application/Espo/Modules/Crm/Entities/KnowledgeBaseArticle.php index ad9bb13865..91b26db04b 100644 --- a/application/Espo/Modules/Crm/Entities/KnowledgeBaseArticle.php +++ b/application/Espo/Modules/Crm/Entities/KnowledgeBaseArticle.php @@ -40,6 +40,11 @@ class KnowledgeBaseArticle extends Entity public const STATUS_PUBLISHED = 'Published'; public const STATUS_ARCHIVED = 'Archived'; + public function getStatus(): string + { + return (string) $this->get('status'); + } + public function getOrder(): ?int { return $this->get('order'); diff --git a/application/Espo/Modules/Crm/Jobs/ControlKnowledgeBaseArticleStatus.php b/application/Espo/Modules/Crm/Jobs/ControlKnowledgeBaseArticleStatus.php index dd4b761314..8f290f8425 100644 --- a/application/Espo/Modules/Crm/Jobs/ControlKnowledgeBaseArticleStatus.php +++ b/application/Espo/Modules/Crm/Jobs/ControlKnowledgeBaseArticleStatus.php @@ -30,26 +30,28 @@ namespace Espo\Modules\Crm\Jobs; use Espo\Core\Utils\DateTime; +use Espo\Core\Utils\Metadata; use Espo\Modules\Crm\Entities\KnowledgeBaseArticle; use Espo\Core\Job\JobDataLess; use Espo\Core\ORM\EntityManager; class ControlKnowledgeBaseArticleStatus implements JobDataLess { - private EntityManager $entityManager; - - public function __construct(EntityManager $entityManager) - { - $this->entityManager = $entityManager; - } + public function __construct( + private EntityManager $entityManager, + private Metadata $metadata + ) {} public function run(): void { + $statusList = $this->metadata->get("entityDefs.KnowledgeBaseArticle.fields.status.activeOptions") ?? + [KnowledgeBaseArticle::STATUS_PUBLISHED]; + $list = $this->entityManager ->getRDBRepository(KnowledgeBaseArticle::ENTITY_TYPE) ->where([ 'expirationDate<=' => date(DateTime::SYSTEM_DATE_FORMAT), - 'status' => KnowledgeBaseArticle::STATUS_PUBLISHED, + 'status' => $statusList, ]) ->find(); diff --git a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/KnowledgeBaseArticle.json b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/KnowledgeBaseArticle.json index 90fa7b0b04..32400f0f19 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/entityDefs/KnowledgeBaseArticle.json +++ b/application/Espo/Modules/Crm/Resources/metadata/entityDefs/KnowledgeBaseArticle.json @@ -20,6 +20,13 @@ }, "view": "crm:views/knowledge-base-article/fields/status", "default": "Draft", + "fieldManagerAdditionalParamList": [ + { + "name": "activeOptions", + "view": "views/admin/field-manager/fields/not-actual-options" + } + ], + "activeOptions": ["Published"], "customizationOptionsReferenceDisabled": true }, "language": {