diff --git a/application/Espo/ORM/DB/Query/Base.php b/application/Espo/ORM/DB/Query/Base.php index 679b465e0f..2afce2c0a7 100644 --- a/application/Espo/ORM/DB/Query/Base.php +++ b/application/Espo/ORM/DB/Query/Base.php @@ -162,6 +162,8 @@ abstract class Base 'NOT', 'IN', 'NOT_IN', + 'IFNULL', + 'NULLIF', 'BINARY', 'UNIX_TIMESTAMP', 'TIMESTAMPDIFF_DAY', @@ -195,6 +197,8 @@ abstract class Base 'MUL', 'DIV', 'MOD', + 'IFNULL', + 'NULLIF', 'TIMESTAMPDIFF_DAY', 'TIMESTAMPDIFF_MONTH', 'TIMESTAMPDIFF_YEAR', @@ -1401,8 +1405,10 @@ abstract class Base $fieldPath = 'TRIM(CONCAT(' . implode(', ', $foreign). '))'; if ($wsCount > 1) { - $fieldPath = "REPLACE({$fieldPath}, ' ', ' ')"; + $fieldPath = "REPLACE({$fieldPath}, ' ', ' ')"; } + + $fieldPath = "NULLIF({$fieldPath}, '')"; } else { $expression = $this->getAlias($entity, $relationName) . '.' . $foreign; $fieldPath = $this->convertComplexExpression($entity, $expression, false, $params); diff --git a/client/modules/crm/src/views/meeting/modals/acceptance-status.js b/client/modules/crm/src/views/meeting/modals/acceptance-status.js index 4e57ea3cda..0e744646f7 100644 --- a/client/modules/crm/src/views/meeting/modals/acceptance-status.js +++ b/client/modules/crm/src/views/meeting/modals/acceptance-status.js @@ -35,13 +35,14 @@ define('crm:views/meeting/modals/acceptance-status', 'views/modal', function (De templateContent: `

{{viewObject.message}}

{{#each viewObject.statusDataList}} -

- -

+
+
+ + {{#if selected}}{{/if}} +
+
{{/each}} `, diff --git a/install/cli.php b/install/cli.php index 1d951ac3af..27ebc2f962 100644 --- a/install/cli.php +++ b/install/cli.php @@ -68,12 +68,14 @@ if ($installerConfig->get('isInstalled')) { exit; } -if (!$installerConfig->get('cliSessionId')) { - session_start(); - $installerConfig->set('cliSessionId', session_id()); - $installerConfig->save(); -} else { - session_id($installerConfig->get('cliSessionId')); +if (session_status() != \PHP_SESSION_ACTIVE) { + if (!$installerConfig->get('cliSessionId')) { + session_start(); + $installerConfig->set('cliSessionId', session_id()); + $installerConfig->save(); + } else { + session_id($installerConfig->get('cliSessionId')); + } } ob_start(); diff --git a/tests/unit/Espo/ORM/DB/MapperTest.php b/tests/unit/Espo/ORM/DB/MapperTest.php index 02e7be8d6d..9deef2a34c 100644 --- a/tests/unit/Espo/ORM/DB/MapperTest.php +++ b/tests/unit/Espo/ORM/DB/MapperTest.php @@ -120,7 +120,7 @@ class DBMapperTest extends \PHPUnit\Framework\TestCase public function testSelectById() { $query = - "SELECT post.id AS `id`, post.name AS `name`, TRIM(CONCAT(IFNULL(createdBy.salutation_name, ''), IFNULL(createdBy.first_name, ''), ' ', IFNULL(createdBy.last_name, ''))) AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ". + "SELECT post.id AS `id`, post.name AS `name`, NULLIF(TRIM(CONCAT(IFNULL(createdBy.salutation_name, ''), IFNULL(createdBy.first_name, ''), ' ', IFNULL(createdBy.last_name, ''))), '') AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ". "FROM `post` ". "LEFT JOIN `user` AS `createdBy` ON post.created_by_id = createdBy.id " . "WHERE post.id = '1' AND post.deleted = '0'"; @@ -140,7 +140,7 @@ class DBMapperTest extends \PHPUnit\Framework\TestCase public function testSelect() { $query = - "SELECT post.id AS `id`, post.name AS `name`, TRIM(CONCAT(IFNULL(createdBy.salutation_name, ''), IFNULL(createdBy.first_name, ''), ' ', IFNULL(createdBy.last_name, ''))) AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ". + "SELECT post.id AS `id`, post.name AS `name`, NULLIF(TRIM(CONCAT(IFNULL(createdBy.salutation_name, ''), IFNULL(createdBy.first_name, ''), ' ', IFNULL(createdBy.last_name, ''))), '') AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ". "FROM `post` ". "LEFT JOIN `user` AS `createdBy` ON post.created_by_id = createdBy.id " . "JOIN `post_tag` AS `tagsMiddle` ON post.id = tagsMiddle.post_id AND tagsMiddle.deleted = '0' ". @@ -290,7 +290,7 @@ class DBMapperTest extends \PHPUnit\Framework\TestCase public function testSelectRelatedBelongsTo() { $query = - "SELECT post.id AS `id`, post.name AS `name`, TRIM(CONCAT(IFNULL(createdBy.salutation_name, ''), IFNULL(createdBy.first_name, ''), ' ', IFNULL(createdBy.last_name, ''))) AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ". + "SELECT post.id AS `id`, post.name AS `name`, NULLIF(TRIM(CONCAT(IFNULL(createdBy.salutation_name, ''), IFNULL(createdBy.first_name, ''), ' ', IFNULL(createdBy.last_name, ''))), '') AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ". "FROM `post` ". "LEFT JOIN `user` AS `createdBy` ON post.created_by_id = createdBy.id " . "WHERE post.id = '1' AND post.deleted = '0' ". diff --git a/tests/unit/Espo/ORM/DB/QueryTest.php b/tests/unit/Espo/ORM/DB/QueryTest.php index b11b202b86..5b7f9e89bb 100644 --- a/tests/unit/Espo/ORM/DB/QueryTest.php +++ b/tests/unit/Espo/ORM/DB/QueryTest.php @@ -764,6 +764,17 @@ class QueryTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expectedSql, $sql); } + public function testFunction18() + { + $sql = $this->query->createSelectQuery('Comment', [ + 'select' => [["IFNULL:(name, '')", 'test']], + 'withDeleted' => true + ]); + $expectedSql = + "SELECT IFNULL(comment.name, '') AS `test` FROM `comment`"; + $this->assertEquals($expectedSql, $sql); + } + public function testFunctionTZ1() { $sql = $this->query->createSelectQuery('Comment', [