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', [