From a7530dcce9cd6118b315edaf7bc6b0b57e52cd94 Mon Sep 17 00:00:00 2001 From: Taras Machyshyn Date: Fri, 23 Feb 2018 15:50:49 +0200 Subject: [PATCH 1/3] Bug fixes in File Manager --- application/Espo/Core/Utils/File/Manager.php | 40 ++++++---- .../unit/Espo/Core/Utils/File/ManagerTest.php | 74 ++++++++++++++++++ .../testCase2/custom/Espo/Custom/test1.php | 0 .../FileManager/copy/testCase2/data/test2.php | 0 .../testCase2/data/upload/5a86d9bf1154968dc | Bin 0 -> 37265 bytes .../FileManager/copy/testCase2/test0.php | 0 .../testCase3/custom/Espo/Custom/test1.php | 0 .../FileManager/copy/testCase3/data/test2.php | 0 .../testCase3/data/upload/5a86d9bf1154968dc | Bin 0 -> 37265 bytes .../FileManager/copy/testCase3/test0.php | 0 .../testCase4/custom/Espo/Custom/test1.php | 0 .../FileManager/copy/testCase4/data/test2.php | 0 .../testCase4/data/upload/5a86d9bf1154968dc | Bin 0 -> 37265 bytes .../FileManager/copy/testCase4/test0.php | 0 14 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 tests/unit/testData/FileManager/copy/testCase2/custom/Espo/Custom/test1.php create mode 100644 tests/unit/testData/FileManager/copy/testCase2/data/test2.php create mode 100644 tests/unit/testData/FileManager/copy/testCase2/data/upload/5a86d9bf1154968dc create mode 100644 tests/unit/testData/FileManager/copy/testCase2/test0.php create mode 100644 tests/unit/testData/FileManager/copy/testCase3/custom/Espo/Custom/test1.php create mode 100644 tests/unit/testData/FileManager/copy/testCase3/data/test2.php create mode 100644 tests/unit/testData/FileManager/copy/testCase3/data/upload/5a86d9bf1154968dc create mode 100644 tests/unit/testData/FileManager/copy/testCase3/test0.php create mode 100644 tests/unit/testData/FileManager/copy/testCase4/custom/Espo/Custom/test1.php create mode 100644 tests/unit/testData/FileManager/copy/testCase4/data/test2.php create mode 100644 tests/unit/testData/FileManager/copy/testCase4/data/upload/5a86d9bf1154968dc create mode 100644 tests/unit/testData/FileManager/copy/testCase4/test0.php diff --git a/application/Espo/Core/Utils/File/Manager.php b/application/Espo/Core/Utils/File/Manager.php index 667b92028a..8ad15d5341 100644 --- a/application/Espo/Core/Utils/File/Manager.php +++ b/application/Espo/Core/Utils/File/Manager.php @@ -28,8 +28,9 @@ ************************************************************************/ namespace Espo\Core\Utils\File; -use Espo\Core\Utils, - Espo\Core\Exceptions\Error; + +use Espo\Core\Utils; +use Espo\Core\Exceptions\Error; class Manager { @@ -110,7 +111,7 @@ class Manager } if ($isReturnSingleArray) { - return $this->getSingeFileList($result, $onlyFileType); + return $this->getSingeFileList($result, $onlyFileType, $path); } return $result; @@ -125,7 +126,7 @@ class Manager * * @return aray */ - protected function getSingeFileList(array $fileList, $onlyFileType = null, $parentDirName = '') + protected function getSingeFileList(array $fileList, $onlyFileType = null, $basePath = null, $parentDirName = '') { $singleFileList = array(); foreach($fileList as $dirName => $fileName) { @@ -133,16 +134,16 @@ class Manager if (is_array($fileName)) { $currentDir = Utils\Util::concatPath($parentDirName, $dirName); - if (!isset($onlyFileType) || $onlyFileType == $this->isFile($currentDir)) { + if (!isset($onlyFileType) || $onlyFileType == $this->isFile($currentDir, $basePath)) { $singleFileList[] = $currentDir; } - $singleFileList = array_merge($singleFileList, $this->getSingeFileList($fileName, $onlyFileType, $currentDir)); + $singleFileList = array_merge($singleFileList, $this->getSingeFileList($fileName, $onlyFileType, $basePath, $currentDir)); } else { $currentFileName = Utils\Util::concatPath($parentDirName, $fileName); - if (!isset($onlyFileType) || $onlyFileType == $this->isFile($currentFileName)) { + if (!isset($onlyFileType) || $onlyFileType == $this->isFile($currentFileName, $basePath)) { $singleFileList[] = $currentFileName; } } @@ -221,7 +222,6 @@ class Manager */ public function putPhpContents($path, $data, $withObjects = false) { - return $this->putContents($path, $this->wrapForDataExport($data, $withObjects), LOCK_EX); } @@ -425,13 +425,7 @@ class Manager $sourcePath = $this->concatPaths($sourcePath); $destPath = $this->concatPaths($destPath); - if (isset($fileList)) { - if (!empty($sourcePath)) { - foreach ($fileList as &$fileName) { - $fileName = $this->concatPaths(array($sourcePath, $fileName)); - } - } - } else { + if (!isset($fileList)) { $fileList = is_file($sourcePath) ? (array) $sourcePath : $this->getFileList($sourcePath, $recursively, '', true, true); } @@ -679,10 +673,16 @@ class Manager * Check if $dirname is directory. * * @param string $dirname + * @param string $basePath + * * @return boolean */ - public function isDir($dirname) + public function isDir($dirname, $basePath = null) { + if (!empty($basePath)) { + $dirname = $this->concatPaths([$basePath, $dirname]); + } + return is_dir($dirname); } @@ -690,10 +690,16 @@ class Manager * Check if $filename is file. If $filename doesn'ot exist, check by pathinfo * * @param string $filename + * @param string $basePath + * * @return boolean */ - public function isFile($filename) + public function isFile($filename, $basePath = null) { + if (!empty($basePath)) { + $filename = $this->concatPaths([$basePath, $filename]); + } + if (file_exists($filename)) { return is_file($filename); } diff --git a/tests/unit/Espo/Core/Utils/File/ManagerTest.php b/tests/unit/Espo/Core/Utils/File/ManagerTest.php index 38a1c90a75..e2f203aea9 100644 --- a/tests/unit/Espo/Core/Utils/File/ManagerTest.php +++ b/tests/unit/Espo/Core/Utils/File/ManagerTest.php @@ -432,4 +432,78 @@ class ManagerTest extends \PHPUnit\Framework\TestCase $this->object->removeInDir($cachePath); } } + + public function testCopyTestCase2() + { + $path = 'tests/unit/testData/FileManager/copy/testCase2'; + $cachePath = $this->cachePath . '/copy/testCase2'; + + $expectedResult = [ + 'custom/Espo/Custom/test1.php', + 'data/test2.php', + 'data/upload/5a86d9bf1154968dc', + 'test0.php' + ]; + + $result = $this->object->copy($path, $cachePath, true); + + if ($result) { + $this->assertEquals($expectedResult, $this->object->getFileList($cachePath, true, '', true, true)); + $this->object->removeInDir($cachePath); + } + } + + public function testCopyTestCase3() + { + $path = 'tests/unit/testData/FileManager/copy/testCase3'; + $cachePath = $this->cachePath . '/copy/testCase3'; + + $expectedResult = [ + 'custom/Espo/Custom/test1.php', + 'data/test2.php', + 'data/upload/5a86d9bf1154968dc', + 'test0.php' + ]; + + $fileList = $this->object->getFileList($path, true, '', true, true); + + $this->assertEquals($expectedResult, $fileList, "Expected Result and File List"); + + $result = $this->object->copy($path, $cachePath, true, $fileList); + + if ($result) { + $this->assertEquals($expectedResult, $this->object->getFileList($cachePath, true, '', true, true), "Expected Result and List of copied files"); + $this->object->removeInDir($cachePath); + } + } + + public function testCopyTestCase4() + { + $path = 'tests/unit/testData/FileManager/copy/testCase4'; + $cachePath = $this->cachePath . '/copy/testCase4'; + + $expectedResult = [ + 'custom', + 'custom/Espo', + 'custom/Espo/Custom', + 'custom/Espo/Custom/test1.php', + 'data', + 'data/test2.php', + 'data/upload', + 'data/upload/5a86d9bf1154968dc', + 'test0.php' + ]; + + $fileList = $this->object->getFileList($path, true, '', null, true); + + $this->assertEquals($expectedResult, $fileList, "Expected Result and File List"); + + $result = $this->object->copy($path, $cachePath, true, $fileList); + + if ($result) { + $this->assertEquals($expectedResult, $this->object->getFileList($cachePath, true, '', null, true), "Expected Result and List of copied files"); + $this->object->removeInDir($cachePath); + } + } + } \ No newline at end of file diff --git a/tests/unit/testData/FileManager/copy/testCase2/custom/Espo/Custom/test1.php b/tests/unit/testData/FileManager/copy/testCase2/custom/Espo/Custom/test1.php new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/unit/testData/FileManager/copy/testCase2/data/test2.php b/tests/unit/testData/FileManager/copy/testCase2/data/test2.php new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/unit/testData/FileManager/copy/testCase2/data/upload/5a86d9bf1154968dc b/tests/unit/testData/FileManager/copy/testCase2/data/upload/5a86d9bf1154968dc new file mode 100644 index 0000000000000000000000000000000000000000..27df8018594171c1a23350d4b85d46c7eaf2d1f9 GIT binary patch literal 37265 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 tkX;YbsxCS+WvC5|@j{iz2jm5pa93n3 Date: Mon, 26 Feb 2018 13:03:25 +0200 Subject: [PATCH 2/3] Metadata: getCustom() changes --- application/Espo/Core/Utils/Metadata.php | 18 ++--- tests/unit/Espo/Core/Utils/MetadataTest.php | 79 +++++++++------------ 2 files changed, 38 insertions(+), 59 deletions(-) diff --git a/application/Espo/Core/Utils/Metadata.php b/application/Espo/Core/Utils/Metadata.php index 1f16f2c2ed..74cd22c653 100644 --- a/application/Espo/Core/Utils/Metadata.php +++ b/application/Espo/Core/Utils/Metadata.php @@ -311,25 +311,15 @@ class Metadata * @param string|array $key * @param mixed $default * - * @return array|null + * @return object|mixed */ - public function getCustom($key = null, $default = null) + public function getCustom($key1, $key2, $default = null) { - $keyList = is_array($key) ? $key : explode('.', $key); - - if (!isset($keyList[0]) || !isset($keyList[1])) { - return $default; - } - - list($key1, $key2) = $keyList; - unset($keyList[0], $keyList[1]); - $filePath = array($this->paths['customPath'], $key1, $key2.'.json'); $fileContent = $this->getFileManager()->getContents($filePath); if ($fileContent) { - $data = Json::getArrayData($fileContent); - return Util::getValueByKey($data, $keyList, $default); + return Json::decode($fileContent); } return $default; @@ -346,8 +336,8 @@ class Metadata */ public function saveCustom($key1, $key2, $data) { - $changedData = Json::encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $filePath = array($this->paths['customPath'], $key1, $key2.'.json'); + $changedData = Json::encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $result = $this->getFileManager()->putContents($filePath, $changedData); diff --git a/tests/unit/Espo/Core/Utils/MetadataTest.php b/tests/unit/Espo/Core/Utils/MetadataTest.php index 1a39d873f3..ee06e91f56 100644 --- a/tests/unit/Espo/Core/Utils/MetadataTest.php +++ b/tests/unit/Espo/Core/Utils/MetadataTest.php @@ -238,28 +238,22 @@ class MetadataTest extends \PHPUnit\Framework\TestCase $paths['customPath'] = $customPath; $this->reflection->setProperty('paths', $paths); - $this->assertNull($this->object->getCustom(['entityDefs', 'Lead'])); - $this->assertNull($this->object->getCustom('entityDefs.Lead')); - $this->assertNull($this->object->getCustom('entityDefs.Lead.fields')); + $this->assertNull($this->object->getCustom('entityDefs', 'Lead')); - $customData = $this->object->getCustom('entityDefs.Lead', []); - $this->assertTrue(is_array($customData)); + $customData = $this->object->getCustom('entityDefs', 'Lead', (object) []); + $this->assertTrue(is_object($customData)); - $data = array ( - 'fields' => - array ( - 'status' => - array ( + $data = (object) [ + 'fields' => (object) [ + 'status' => (object) [ "type" => "enum", "options" => ["__APPEND__", "Test1", "Test2"], - ), - ), - ); + ], + ], + ]; $this->object->saveCustom('entityDefs', 'Lead', $data); - $this->assertEquals($data, $this->object->getCustom('entityDefs.Lead')); - $this->assertEquals($data['fields'], $this->object->getCustom('entityDefs.Lead.fields')); - $this->assertEquals($data['fields'], $this->object->getCustom(['entityDefs', 'Lead', 'fields'])); + $this->assertEquals($data, $this->object->getCustom('entityDefs', 'Lead')); unlink($customPath . '/entityDefs/Lead.json'); } @@ -274,22 +268,20 @@ class MetadataTest extends \PHPUnit\Framework\TestCase $paths['customPath'] = $customPath; $this->reflection->setProperty('paths', $paths); - $data = array ( - 'fields' => - array ( - 'status' => - array ( + $data = (object) [ + 'fields' => (object) [ + 'status' => (object) [ "type" => "enum", "options" => ["__APPEND__", "Test1", "Test2"], - ), - ), - ); + ], + ], + ]; $this->object->saveCustom('entityDefs', 'Lead', $data); $savedFile = $customPath . '/entityDefs/Lead.json'; $fileContent = $this->objects['fileManager']->getContents($savedFile); - $savedData = \Espo\Core\Utils\Json::getArrayData($fileContent); + $savedData = \Espo\Core\Utils\Json::decode($fileContent); $this->assertEquals($data, $savedData); @@ -308,37 +300,34 @@ class MetadataTest extends \PHPUnit\Framework\TestCase $paths['customPath'] = $customPath; $this->reflection->setProperty('paths', $paths); - $initData = array ( - 'fields' => - array ( - 'status' => - array ( + $initData = (object) [ + 'fields' => (object) [ + 'status' => (object) [ "type" => "enum", "options" => ["__APPEND__", "Test1", "Test2"], - ), - ), - ); + ], + ], + ]; $this->object->saveCustom('entityDefs', 'Lead', $initData); - $customData = $this->object->getCustom(['entityDefs', 'Lead']); - unset($customData['fields']['status']['type']); - $customData['fields']['status']['options'] = ["__APPEND__", "Test1"]; + $customData = $this->object->getCustom('entityDefs', 'Lead'); + + unset($customData->fields->status->type); + $customData->fields->status->options = ["__APPEND__", "Test1"]; $this->object->saveCustom('entityDefs', 'Lead', $customData); $savedFile = $customPath . '/entityDefs/Lead.json'; $fileContent = $this->objects['fileManager']->getContents($savedFile); - $savedData = \Espo\Core\Utils\Json::getArrayData($fileContent); + $savedData = \Espo\Core\Utils\Json::decode($fileContent); - $expectedData = array ( - 'fields' => - array ( - 'status' => - array ( + $expectedData = (object) [ + 'fields' => (object) [ + 'status' => (object) [ "options" => ["__APPEND__", "Test1"], - ), - ), - ); + ], + ], + ]; $this->assertEquals($expectedData, $savedData); From f94d1f3cd8894e861859d0e44644ed490333db10 Mon Sep 17 00:00:00 2001 From: Taras Machyshyn Date: Mon, 26 Feb 2018 14:22:14 +0200 Subject: [PATCH 3/3] Metadata: get metadata in object format --- application/Espo/Core/Utils/Metadata.php | 28 +- tests/unit/Espo/Core/Utils/MetadataTest.php | 23 +- tests/unit/Espo/Core/Utils/UtilTest.php | 32 + .../testData/Utils/Metadata/objMetadata.php | 8258 +++++++++++++++++ 4 files changed, 8337 insertions(+), 4 deletions(-) create mode 100644 tests/unit/testData/Utils/Metadata/objMetadata.php diff --git a/application/Espo/Core/Utils/Metadata.php b/application/Espo/Core/Utils/Metadata.php index 74cd22c653..d3857535e5 100644 --- a/application/Espo/Core/Utils/Metadata.php +++ b/application/Espo/Core/Utils/Metadata.php @@ -236,17 +236,39 @@ class Metadata } } - public function getAllObjects($isJSON = false, $reload = false) + protected function getObjData($reload = false) { if (!isset($this->objData) || $reload) { $this->objInit($reload); } + return $this->objData; + } + + /** + * Get Object Metadata + * + * @param mixed string|array $key + * @param mixed $default + * + * @return object + */ + public function getObjects($key = null, $default = null) + { + $objData = $this->getObjData(); + + return Util::getValueByKey($objData, $key, $default); + } + + public function getAllObjects($isJSON = false, $reload = false) + { + $objData = $this->getObjData($reload); + if ($isJSON) { - return Json::encode($this->objData); + return Json::encode($objData); } - return $this->objData; + return $objData; } public function getAllForFrontend() diff --git a/tests/unit/Espo/Core/Utils/MetadataTest.php b/tests/unit/Espo/Core/Utils/MetadataTest.php index ee06e91f56..9f21f23dad 100644 --- a/tests/unit/Espo/Core/Utils/MetadataTest.php +++ b/tests/unit/Espo/Core/Utils/MetadataTest.php @@ -40,9 +40,10 @@ class MetadataTest extends \PHPUnit\Framework\TestCase protected $reflection; protected $defaultCacheFile = 'tests/unit/testData/Utils/Metadata/metadata.php'; + protected $defaultObjCacheFile = 'tests/unit/testData/Utils/Metadata/metadata.php'; protected $cacheFile = 'tests/unit/testData/cache/metadata.php'; - protected $ormCacheFile = 'tests/unit/testData/Utils/Metadata/ormMetadata.php'; + protected $objCacheFile = 'tests/unit/testData/cache/objMetadata.php'; protected function setUp() { @@ -51,6 +52,10 @@ class MetadataTest extends \PHPUnit\Framework\TestCase copy($this->defaultCacheFile, $this->cacheFile); } + if (!file_exists($this->objCacheFile)) { + copy($this->defaultObjCacheFile, $this->objCacheFile); + } + $this->objects['fileManager'] = new \Espo\Core\Utils\File\Manager(); $this->objects['log'] = $this->getMockBuilder('\\Espo\\Core\\Utils\\Log')->disableOriginalConstructor()->getMock(); @@ -60,6 +65,7 @@ class MetadataTest extends \PHPUnit\Framework\TestCase $this->reflection = new ReflectionHelper($this->object); $this->reflection->setProperty('cacheFile', $this->cacheFile); + $this->reflection->setProperty('objCacheFile', $this->objCacheFile); } protected function tearDown() @@ -333,4 +339,19 @@ class MetadataTest extends \PHPUnit\Framework\TestCase unlink($savedFile); } + + public function testGetObjects() + { + $result = 'System'; + $this->assertEquals($result, $this->object->getObjects('app.adminPanel.system.label')); + + $result = 'fields'; + $this->assertObjectHasAttribute($result, $this->object->getObjects('entityDefs.User')); + + $result = (object) [ + 'type' => 'bool', + 'tooltip' => true + ]; + $this->assertEquals($result, $this->object->getObjects('entityDefs.User.fields.isAdmin')); + } } \ No newline at end of file diff --git a/tests/unit/Espo/Core/Utils/UtilTest.php b/tests/unit/Espo/Core/Utils/UtilTest.php index 274e863319..0eda0c1b7f 100644 --- a/tests/unit/Espo/Core/Utils/UtilTest.php +++ b/tests/unit/Espo/Core/Utils/UtilTest.php @@ -1437,6 +1437,38 @@ class UtilTest extends \PHPUnit\Framework\TestCase $this->assertEquals('customReturns', Util::getValueByKey($inputArray, 'Contact.notExists', 'customReturns')); } + public function testGetValueByKeyWithObjects() + { + $inputObject = (object) [ + 'Account' => (object) [ + 'useCache' => true, + 'sub' => (object) [ + 'subV' => '125', + 'subO' => (object) [ + 'subOV' => '125', + 'subOV2' => '125', + ], + ], + ], + 'Contact' => (object) [ + 'useCache' => true, + ], + ]; + + $this->assertEquals($inputObject, Util::getValueByKey($inputObject)); + $this->assertEquals($inputObject, Util::getValueByKey($inputObject, '')); + + $this->assertEquals('125', Util::getValueByKey($inputObject, 'Account.sub.subV')); + + $result = (object) ['useCache' => true]; + $this->assertEquals($result, Util::getValueByKey($inputObject, 'Contact')); + + $this->assertNull(Util::getValueByKey($inputObject, 'Contact.notExists')); + + $this->assertEquals('customReturns', Util::getValueByKey($inputObject, 'Contact.notExists', 'customReturns')); + $this->assertNotEquals('customReturns', Util::getValueByKey($inputObject, 'Contact.useCache', 'customReturns')); + } + public function testUnsetInArrayByValue() { $newArray = json_decode('[ diff --git a/tests/unit/testData/Utils/Metadata/objMetadata.php b/tests/unit/testData/Utils/Metadata/objMetadata.php new file mode 100644 index 0000000000..f1c7cd0edd --- /dev/null +++ b/tests/unit/testData/Utils/Metadata/objMetadata.php @@ -0,0 +1,8258 @@ + (object) [ + 'adminPanel' => (object) [ + 'system' => (object) [ + 'label' => 'System', + 'itemList' => [ + 0 => (object) [ + 'url' => '#Admin/settings', + 'label' => 'Settings', + 'description' => 'settings' + ], + 1 => (object) [ + 'url' => '#Admin/userInterface', + 'label' => 'User Interface', + 'description' => 'userInterface' + ], + 2 => (object) [ + 'url' => '#Admin/authentication', + 'label' => 'Authentication', + 'description' => 'authentication' + ], + 3 => (object) [ + 'url' => '#ScheduledJob', + 'label' => 'Scheduled Jobs', + 'description' => 'scheduledJob' + ], + 4 => (object) [ + 'url' => '#Admin/currency', + 'label' => 'Currency', + 'description' => 'currency' + ], + 5 => (object) [ + 'url' => '#Admin/notifications', + 'label' => 'Notifications', + 'description' => 'notifications' + ], + 6 => (object) [ + 'url' => '#Admin/integrations', + 'label' => 'Integrations', + 'description' => 'integrations' + ], + 7 => (object) [ + 'url' => '#Admin/upgrade', + 'label' => 'Upgrade', + 'description' => 'upgrade' + ], + 8 => (object) [ + 'url' => '#Admin/clearCache', + 'label' => 'Clear Cache', + 'description' => 'clearCache' + ], + 9 => (object) [ + 'url' => '#Admin/rebuild', + 'label' => 'Rebuild', + 'description' => 'rebuild' + ] + ], + 'order' => 0 + ], + 'users' => (object) [ + 'label' => 'Users', + 'itemList' => [ + 0 => (object) [ + 'url' => '#User', + 'label' => 'Users', + 'description' => 'users' + ], + 1 => (object) [ + 'url' => '#Team', + 'label' => 'Teams', + 'description' => 'teams' + ], + 2 => (object) [ + 'url' => '#Role', + 'label' => 'Roles', + 'description' => 'roles' + ], + 3 => (object) [ + 'url' => '#Admin/authTokens', + 'label' => 'Auth Tokens', + 'description' => 'authTokens' + ], + 4 => (object) [ + 'url' => '#ActionHistoryRecord', + 'label' => 'Action History', + 'description' => 'actionHistory' + ] + ], + 'order' => 5 + ], + 'customization' => (object) [ + 'label' => 'Customization', + 'itemList' => [ + 0 => (object) [ + 'url' => '#Admin/layouts', + 'label' => 'Layout Manager', + 'description' => 'layoutManager' + ], + 1 => (object) [ + 'url' => '#Admin/entityManager', + 'label' => 'Entity Manager', + 'description' => 'entityManager' + ], + 2 => (object) [ + 'url' => '#Admin/labelManager', + 'label' => 'Label Manager', + 'description' => 'labelManager' + ], + 3 => (object) [ + 'url' => '#Admin/extensions', + 'label' => 'Extensions', + 'description' => 'extensions' + ] + ], + 'order' => 10 + ], + 'email' => (object) [ + 'label' => 'Email', + 'itemList' => [ + 0 => (object) [ + 'url' => '#Admin/outboundEmails', + 'label' => 'Outbound Emails', + 'description' => 'outboundEmails' + ], + 1 => (object) [ + 'url' => '#Admin/inboundEmails', + 'label' => 'Inbound Emails', + 'description' => 'inboundEmails' + ], + 2 => (object) [ + 'url' => '#InboundEmail', + 'label' => 'Group Email Accounts', + 'description' => 'groupEmailAccounts' + ], + 3 => (object) [ + 'url' => '#EmailAccount', + 'label' => 'Personal Email Accounts', + 'description' => 'personalEmailAccounts' + ], + 4 => (object) [ + 'url' => '#EmailFilter', + 'label' => 'Email Filters', + 'description' => 'emailFilters' + ], + 5 => (object) [ + 'url' => '#EmailTemplate', + 'label' => 'Email Templates', + 'description' => 'emailTemplates' + ] + ], + 'order' => 15 + ], + 'portal' => (object) [ + 'label' => 'Portal', + 'itemList' => [ + 0 => (object) [ + 'url' => '#Portal', + 'label' => 'Portals', + 'description' => 'portals' + ], + 1 => (object) [ + 'url' => '#PortalUser', + 'label' => 'Portal Users', + 'description' => 'portalUsers' + ], + 2 => (object) [ + 'url' => '#PortalRole', + 'label' => 'Portal Roles', + 'description' => 'portalRoles' + ] + ], + 'order' => 20 + ], + 'data' => (object) [ + 'label' => 'Data', + 'itemList' => [ + 0 => (object) [ + 'url' => '#Import', + 'label' => 'Import', + 'description' => 'import' + ] + ], + 'order' => 25 + ] + ], + 'popupNotifications' => (object) [ + 'event' => (object) [ + 'url' => 'Activities/action/popupNotifications', + 'interval' => 15, + 'view' => 'crm:views/meeting/popup-notification' + ] + ] + ], + 'entityDefs' => (object) [ + 'ActionHistoryRecord' => (object) [ + 'fields' => (object) [ + 'number' => (object) [ + 'type' => 'autoincrement', + 'index' => true + ], + 'targetType' => (object) [ + 'view' => 'views/action-history-record/fields/target-type', + 'translation' => 'Global.scopeNames' + ], + 'target' => (object) [ + 'type' => 'linkParent', + 'view' => 'views/action-history-record/fields/target' + ], + 'data' => (object) [ + 'type' => 'jsonObject' + ], + 'action' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'read', + 1 => 'update', + 2 => 'create', + 3 => 'delete' + ] + ], + 'createdAt' => (object) [ + 'type' => 'datetime' + ], + 'user' => (object) [ + 'type' => 'link' + ], + 'ipAddress' => (object) [ + 'type' => 'varchar', + 'maxLength' => '39' + ], + 'authToken' => (object) [ + 'type' => 'link' + ] + ], + 'links' => (object) [ + 'user' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'target' => (object) [ + 'type' => 'belongsToParent' + ], + 'authToken' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'AuthToken', + 'foreignName' => 'id', + 'foreign' => 'actionHistoryRecords' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'number', + 'asc' => false, + 'textFilterFields' => [ + 0 => 'ipAddress', + 1 => 'userName' + ] + ] + ], + 'Attachment' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'type' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100 + ], + 'size' => (object) [ + 'type' => 'int', + 'min' => 0 + ], + 'parent' => (object) [ + 'type' => 'linkParent' + ], + 'related' => (object) [ + 'type' => 'linkParent', + 'noLoad' => true + ], + 'sourceId' => (object) [ + 'type' => 'varchar', + 'maxLength' => 36, + 'readOnly' => true, + 'disabled' => true + ], + 'field' => (object) [ + 'type' => 'varchar', + 'disabled' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'contents' => (object) [ + 'type' => 'text', + 'notStorable' => true + ], + 'role' => (object) [ + 'type' => 'varchar', + 'maxLength' => 36 + ], + 'storage' => (object) [ + 'type' => 'varchar', + 'maxLength' => 24, + 'default' => NULL + ], + 'storageFilePath' => (object) [ + 'type' => 'varchar', + 'maxLength' => 260, + 'default' => NULL + ], + 'global' => (object) [ + 'type' => 'bool', + 'default' => false + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'parent' => (object) [ + 'type' => 'belongsToParent', + 'foreign' => 'attachments' + ], + 'related' => (object) [ + 'type' => 'belongsToParent' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ], + 'indexes' => (object) [ + 'parent' => (object) [ + 'columns' => [ + 0 => 'parentType', + 1 => 'parentId' + ] + ] + ], + 'sourceList' => [ + 0 => 'Document' + ] + ], + 'AuthToken' => (object) [ + 'fields' => (object) [ + 'token' => (object) [ + 'type' => 'varchar', + 'maxLength' => '36', + 'index' => true, + 'readOnly' => true + ], + 'hash' => (object) [ + 'type' => 'varchar', + 'maxLength' => 150, + 'index' => true, + 'readOnly' => true + ], + 'userId' => (object) [ + 'type' => 'varchar', + 'maxLength' => '36', + 'readOnly' => true + ], + 'user' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'portal' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'ipAddress' => (object) [ + 'type' => 'varchar', + 'maxLength' => '36', + 'readOnly' => true + ], + 'isActive' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'lastAccess' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'user' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'portal' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Portal' + ], + 'actionHistoryRecords' => (object) [ + 'type' => 'hasMany', + 'entity' => 'ActionHistoryRecord', + 'foreign' => 'authToken' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'lastAccess', + 'asc' => false, + 'textFilterFields' => [ + 0 => 'ipAddress', + 1 => 'userName' + ] + ], + 'indexes' => (object) [ + 'token' => (object) [ + 'columns' => [ + 0 => 'token', + 1 => 'deleted' + ] + ] + ] + ], + 'Currency' => (object) [ + 'fields' => (object) [ + 'rate' => (object) [ + 'type' => 'float' + ] + ] + ], + 'Email' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'subject' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'notStorable' => true, + 'view' => 'views/email/fields/subject', + 'disabled' => true, + 'trim' => true + ], + 'fromName' => (object) [ + 'type' => 'varchar' + ], + 'fromString' => (object) [ + 'type' => 'varchar' + ], + 'replyToString' => (object) [ + 'type' => 'varchar' + ], + 'addressNameMap' => (object) [ + 'type' => 'jsonObject', + 'disabled' => true, + 'readOnly' => true + ], + 'from' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'required' => true, + 'view' => 'views/email/fields/from-address-varchar' + ], + 'to' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'required' => true, + 'view' => 'views/email/fields/email-address-varchar' + ], + 'cc' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'view' => 'views/email/fields/email-address-varchar' + ], + 'bcc' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'view' => 'views/email/fields/email-address-varchar' + ], + 'replyTo' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'view' => 'views/email/fields/email-address-varchar' + ], + 'personStringData' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'disabled' => true + ], + 'isRead' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'default' => true, + 'readOnly' => true + ], + 'isNotRead' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'readOnly' => true + ], + 'isReplied' => (object) [ + 'type' => 'bool', + 'readOnly' => true + ], + 'isNotReplied' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'readOnly' => true + ], + 'isImportant' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'default' => false + ], + 'inTrash' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'default' => false + ], + 'folderId' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'default' => false + ], + 'isUsers' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'default' => false + ], + 'folder' => (object) [ + 'type' => 'link', + 'notStorable' => true, + 'readOnly' => true + ], + 'nameHash' => (object) [ + 'type' => 'text', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'typeHash' => (object) [ + 'type' => 'text', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'idHash' => (object) [ + 'type' => 'text', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'messageId' => (object) [ + 'type' => 'varchar', + 'maxLength' => 255, + 'readOnly' => true, + 'index' => true + ], + 'messageIdInternal' => (object) [ + 'type' => 'varchar', + 'maxLength' => 300, + 'readOnly' => true + ], + 'emailAddress' => (object) [ + 'type' => 'base', + 'notStorable' => true, + 'view' => 'views/email/fields/email-address' + ], + 'fromEmailAddress' => (object) [ + 'type' => 'link', + 'view' => 'views/email/fields/from-email-address' + ], + 'toEmailAddresses' => (object) [ + 'type' => 'linkMultiple' + ], + 'ccEmailAddresses' => (object) [ + 'type' => 'linkMultiple' + ], + 'bodyPlain' => (object) [ + 'type' => 'text', + 'readOnly' => true, + 'seeMoreDisabled' => true + ], + 'body' => (object) [ + 'type' => 'wysiwyg', + 'seeMoreDisabled' => true, + 'view' => 'views/email/fields/body' + ], + 'isHtml' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Draft', + 1 => 'Sending', + 2 => 'Sent', + 3 => 'Archived', + 4 => 'Failed' + ], + 'readOnly' => true, + 'default' => 'Archived' + ], + 'attachments' => (object) [ + 'type' => 'attachmentMultiple', + 'sourceList' => [ + 0 => 'Document' + ] + ], + 'hasAttachment' => (object) [ + 'type' => 'bool', + 'readOnly' => true + ], + 'parent' => (object) [ + 'type' => 'linkParent', + 'entityList' => [ + 0 => 'Account', + 1 => 'Lead', + 2 => 'Contact', + 3 => 'Opportunity', + 4 => 'Case' + ] + ], + 'dateSent' => (object) [ + 'type' => 'datetime' + ], + 'deliveryDate' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'sentBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'noLoad' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'required' => false, + 'view' => 'views/fields/assigned-user' + ], + 'replied' => (object) [ + 'type' => 'link', + 'noJoin' => true, + 'readOnly' => true + ], + 'replies' => (object) [ + 'type' => 'linkMultiple', + 'readOnly' => true + ], + 'isSystem' => (object) [ + 'type' => 'bool', + 'default' => false, + 'readOnly' => true + ], + 'isJustSent' => (object) [ + 'type' => 'bool', + 'default' => false, + 'disabled' => true, + 'notStorable' => true + ], + 'isBeingImported' => (object) [ + 'type' => 'bool', + 'disabled' => true, + 'notStorable' => true + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'users' => (object) [ + 'type' => 'linkMultiple', + 'noLoad' => true, + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'readOnly' => true, + 'columns' => (object) [ + 'inTrash' => 'inTrash', + 'folderId' => 'folderId' + ] + ], + 'assignedUsers' => (object) [ + 'type' => 'linkMultiple', + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'readOnly' => true + ], + 'inboundEmails' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'noLoad' => true + ], + 'emailAccounts' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'noLoad' => true + ], + 'account' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam' + ], + 'assignedUsers' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'relationName' => 'entityUser' + ], + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'emails', + 'additionalColumns' => (object) [ + 'isRead' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'isImportant' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'inTrash' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'folderId' => (object) [ + 'type' => 'varchar', + 'default' => NULL, + 'maxLength' => 24 + ] + ] + ], + 'sentBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'attachments' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Attachment', + 'foreign' => 'parent', + 'relationName' => 'attachments' + ], + 'parent' => (object) [ + 'type' => 'belongsToParent', + 'entityList' => [ + + ], + 'foreign' => 'emails' + ], + 'replied' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Email', + 'foreign' => 'replies' + ], + 'replies' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Email', + 'foreign' => 'replied' + ], + 'fromEmailAddress' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'EmailAddress' + ], + 'toEmailAddresses' => (object) [ + 'type' => 'hasMany', + 'entity' => 'EmailAddress', + 'relationName' => 'emailEmailAddress', + 'conditions' => (object) [ + 'addressType' => 'to' + ], + 'additionalColumns' => (object) [ + 'addressType' => (object) [ + 'type' => 'varchar', + 'len' => '4' + ] + ] + ], + 'ccEmailAddresses' => (object) [ + 'type' => 'hasMany', + 'entity' => 'EmailAddress', + 'relationName' => 'emailEmailAddress', + 'conditions' => (object) [ + 'addressType' => 'cc' + ], + 'additionalColumns' => (object) [ + 'addressType' => (object) [ + 'type' => 'varchar', + 'len' => '4' + ] + ] + ], + 'bccEmailAddresses' => (object) [ + 'type' => 'hasMany', + 'entity' => 'EmailAddress', + 'relationName' => 'emailEmailAddress', + 'conditions' => (object) [ + 'addressType' => 'bcc' + ], + 'additionalColumns' => (object) [ + 'addressType' => (object) [ + 'type' => 'varchar', + 'len' => '4' + ] + ] + ], + 'inboundEmails' => (object) [ + 'type' => 'hasMany', + 'entity' => 'InboundEmail', + 'foreign' => 'emails' + ], + 'emailAccounts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'EmailAccount', + 'foreign' => 'emails' + ], + 'account' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Account' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'dateSent', + 'asc' => false, + 'textFilterFields' => [ + 0 => 'name', + 1 => 'bodyPlain', + 2 => 'body' + ] + ], + 'indexes' => (object) [ + 'dateSent' => (object) [ + 'columns' => [ + 0 => 'dateSent', + 1 => 'deleted' + ] + ], + 'dateSentStatus' => (object) [ + 'columns' => [ + 0 => 'dateSent', + 1 => 'status', + 2 => 'deleted' + ] + ] + ] + ], + 'EmailAccount' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'emailAddress' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 100, + 'trim' => true, + 'view' => 'views/email-account/fields/email-address' + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Active', + 1 => 'Inactive' + ], + 'default' => 'Active' + ], + 'host' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'port' => (object) [ + 'type' => 'varchar', + 'default' => '143', + 'required' => true + ], + 'ssl' => (object) [ + 'type' => 'bool' + ], + 'username' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'password' => (object) [ + 'type' => 'password' + ], + 'monitoredFolders' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'default' => 'INBOX', + 'view' => 'views/email-account/fields/folders', + 'tooltip' => true + ], + 'sentFolder' => (object) [ + 'type' => 'varchar', + 'view' => 'views/email-account/fields/folder' + ], + 'storeSentEmails' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'keepFetchedEmailsUnread' => (object) [ + 'type' => 'bool' + ], + 'fetchSince' => (object) [ + 'type' => 'date', + 'required' => true + ], + 'fetchData' => (object) [ + 'type' => 'jsonObject', + 'readOnly' => true + ], + 'emailFolder' => (object) [ + 'type' => 'link', + 'view' => 'views/email-account/fields/email-folder' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'required' => true + ], + 'useImap' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'useSmtp' => (object) [ + 'type' => 'bool' + ], + 'smtpHost' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'smtpPort' => (object) [ + 'type' => 'int', + 'min' => 0, + 'max' => 9999, + 'default' => 25 + ], + 'smtpAuth' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'smtpSecurity' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'SSL', + 2 => 'TLS' + ] + ], + 'smtpUsername' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'smtpPassword' => (object) [ + 'type' => 'password' + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'filters' => (object) [ + 'type' => 'hasChildren', + 'foreign' => 'parent', + 'entity' => 'EmailFilter' + ], + 'emails' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Email', + 'foreign' => 'emailAccounts' + ], + 'emailFolder' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'EmailFolder' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'EmailAddress' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true + ], + 'lower' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'index' => true + ], + 'invalid' => (object) [ + 'type' => 'bool' + ], + 'optOut' => (object) [ + 'type' => 'bool' + ] + ], + 'links' => (object) [ + + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'EmailFilter' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 100, + 'tooltip' => true, + 'trim' => true + ], + 'from' => (object) [ + 'type' => 'varchar', + 'maxLength' => 255, + 'tooltip' => true, + 'trim' => true + ], + 'to' => (object) [ + 'type' => 'varchar', + 'maxLength' => 255, + 'tooltip' => true, + 'trim' => true + ], + 'subject' => (object) [ + 'type' => 'varchar', + 'maxLength' => 255, + 'tooltip' => true + ], + 'bodyContains' => (object) [ + 'type' => 'array', + 'tooltip' => true + ], + 'isGlobal' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'parent' => (object) [ + 'type' => 'linkParent' + ], + 'action' => (object) [ + 'type' => 'enum', + 'default' => 'Skip', + 'options' => [ + 0 => 'Skip', + 1 => 'Move to Folder' + ], + 'view' => 'views/email-filter/fields/action' + ], + 'emailFolder' => (object) [ + 'type' => 'link', + 'view' => 'views/email-filter/fields/email-folder' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'parent' => (object) [ + 'type' => 'belongsToParent', + 'entityList' => [ + 0 => 'User', + 1 => 'EmailAccount', + 2 => 'InboundEmail' + ] + ], + 'emailFolder' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'EmailFolder' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ] + ], + 'EmailFolder' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 64, + 'trim' => true + ], + 'order' => (object) [ + 'type' => 'int' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'skipNotifications' => (object) [ + 'type' => 'bool' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'order', + 'asc' => true + ] + ], + 'EmailTemplate' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'subject' => (object) [ + 'type' => 'varchar' + ], + 'body' => (object) [ + 'type' => 'text', + 'view' => 'views/fields/wysiwyg' + ], + 'isHtml' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'oneOff' => (object) [ + 'type' => 'bool', + 'default' => false, + 'tooltip' => true + ], + 'attachments' => (object) [ + 'type' => 'attachmentMultiple' + ], + 'assignedUser' => (object) [ + 'type' => 'link' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ] + ], + 'links' => (object) [ + 'attachments' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Attachment', + 'foreign' => 'parent' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ] + ], + 'Extension' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true + ], + 'version' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 50 + ], + 'fileList' => (object) [ + 'type' => 'jsonArray' + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'isInstalled' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ] + ], + 'ExternalAccount' => (object) [ + 'fields' => (object) [ + 'id' => (object) [ + 'maxLength' => 64 + ], + 'data' => (object) [ + 'type' => 'jsonObject' + ], + 'enabled' => (object) [ + 'type' => 'bool' + ] + ] + ], + 'Import' => (object) [ + 'fields' => (object) [ + 'entityType' => (object) [ + 'type' => 'enum', + 'translation' => 'Global.scopeNames', + 'required' => true, + 'readOnly' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'In Process', + 1 => 'Complete', + 2 => 'Failed' + ], + 'readOnly' => true, + 'view' => 'views/fields/enum-styled', + 'style' => (object) [ + 'Complete' => 'success', + 'Failed' => 'danger' + ] + ], + 'file' => (object) [ + 'type' => 'file', + 'required' => true, + 'readOnly' => true + ], + 'importedCount' => (object) [ + 'type' => 'int', + 'readOnly' => true, + 'notStorable' => true + ], + 'duplicateCount' => (object) [ + 'type' => 'int', + 'readOnly' => true, + 'notStorable' => true + ], + 'updatedCount' => (object) [ + 'type' => 'int', + 'readOnly' => true, + 'notStorable' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ] + ], + 'InboundEmail' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'emailAddress' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 100, + 'view' => 'views/inbound-email/fields/email-address', + 'trim' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Active', + 1 => 'Inactive' + ], + 'default' => 'Active' + ], + 'host' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'port' => (object) [ + 'type' => 'varchar', + 'default' => '143' + ], + 'ssl' => (object) [ + 'type' => 'bool' + ], + 'username' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'password' => (object) [ + 'type' => 'password' + ], + 'monitoredFolders' => (object) [ + 'type' => 'varchar', + 'default' => 'INBOX', + 'view' => 'views/inbound-email/fields/folders', + 'tooltip' => true + ], + 'fetchSince' => (object) [ + 'type' => 'date', + 'required' => true + ], + 'fetchData' => (object) [ + 'type' => 'jsonObject', + 'readOnly' => true + ], + 'assignToUser' => (object) [ + 'type' => 'link', + 'tooltip' => true + ], + 'team' => (object) [ + 'type' => 'link', + 'tooltip' => true + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'addAllTeamUsers' => (object) [ + 'type' => 'bool', + 'tooltip' => true, + 'default' => true + ], + 'sentFolder' => (object) [ + 'type' => 'varchar', + 'view' => 'views/inbound-email/fields/folder' + ], + 'storeSentEmails' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'useImap' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'useSmtp' => (object) [ + 'type' => 'bool' + ], + 'smtpIsShared' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'smtpIsForMassEmail' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'smtpHost' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'smtpPort' => (object) [ + 'type' => 'int', + 'min' => 0, + 'max' => 9999, + 'default' => 25 + ], + 'smtpAuth' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'smtpSecurity' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'SSL', + 2 => 'TLS' + ] + ], + 'smtpUsername' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'smtpPassword' => (object) [ + 'type' => 'password' + ], + 'createCase' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'caseDistribution' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Direct-Assignment', + 2 => 'Round-Robin', + 3 => 'Least-Busy' + ], + 'default' => 'Direct-Assignment', + 'tooltip' => true + ], + 'targetUserPosition' => (object) [ + 'type' => 'enum', + 'view' => 'views/inbound-email/fields/target-user-position', + 'tooltip' => true + ], + 'reply' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'replyEmailTemplate' => (object) [ + 'type' => 'link' + ], + 'replyFromAddress' => (object) [ + 'type' => 'varchar' + ], + 'replyToAddress' => (object) [ + 'type' => 'varchar', + 'tooltip' => true + ], + 'replyFromName' => (object) [ + 'type' => 'varchar' + ], + 'fromName' => (object) [ + 'type' => 'varchar' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'foreign' => 'inboundEmails' + ], + 'assignToUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'team' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Team' + ], + 'replyEmailTemplate' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'EmailTemplate' + ], + 'filters' => (object) [ + 'type' => 'hasChildren', + 'foreign' => 'parent', + 'entity' => 'EmailFilter' + ], + 'emails' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Email', + 'foreign' => 'inboundEmails' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'Integration' => (object) [ + 'fields' => (object) [ + 'data' => (object) [ + 'type' => 'jsonObject' + ], + 'enabled' => (object) [ + 'type' => 'bool' + ] + ] + ], + 'Job' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'view' => 'views/admin/job/fields/name' + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Pending', + 1 => 'Running', + 2 => 'Success', + 3 => 'Failed' + ], + 'default' => 'Pending' + ], + 'executeTime' => (object) [ + 'type' => 'datetime', + 'required' => true + ], + 'serviceName' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 100 + ], + 'method' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 100 + ], + 'methodName' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100 + ], + 'data' => (object) [ + 'type' => 'jsonObject' + ], + 'scheduledJob' => (object) [ + 'type' => 'link' + ], + 'scheduledJobJob' => (object) [ + 'type' => 'foreign', + 'link' => 'scheduledJob', + 'field' => 'job' + ], + 'pid' => (object) [ + 'type' => 'int' + ], + 'attempts' => (object) [ + 'type' => 'int' + ], + 'targetId' => (object) [ + 'type' => 'varchar', + 'maxLength' => 48 + ], + 'targetType' => (object) [ + 'type' => 'varchar', + 'maxLength' => 64 + ], + 'failedAttempts' => (object) [ + 'type' => 'int' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'scheduledJob' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'ScheduledJob' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false, + 'textFilterFields' => [ + 0 => 'name', + 1 => 'methodName', + 2 => 'serviceName', + 3 => 'scheduledJobName' + ] + ], + 'indexes' => (object) [ + 'executeTime' => (object) [ + 'columns' => [ + 0 => 'status', + 1 => 'executeTime' + ] + ], + 'status' => (object) [ + 'columns' => [ + 0 => 'status', + 1 => 'deleted' + ] + ] + ] + ], + 'NextNumber' => (object) [ + 'fields' => (object) [ + 'entityType' => (object) [ + 'type' => 'varchar', + 'index' => true + ], + 'fieldName' => (object) [ + 'type' => 'varchar' + ], + 'value' => (object) [ + 'type' => 'int', + 'default' => 1 + ] + ] + ], + 'Note' => (object) [ + 'fields' => (object) [ + 'post' => (object) [ + 'type' => 'text', + 'rows' => 30 + ], + 'data' => (object) [ + 'type' => 'jsonObject', + 'readOnly' => true + ], + 'type' => (object) [ + 'type' => 'varchar', + 'readOnly' => true, + 'view' => 'views/fields/enum', + 'options' => [ + 0 => 'Post' + ] + ], + 'targetType' => (object) [ + 'type' => 'varchar' + ], + 'parent' => (object) [ + 'type' => 'linkParent', + 'readOnly' => true + ], + 'related' => (object) [ + 'type' => 'linkParent', + 'readOnly' => true + ], + 'attachments' => (object) [ + 'type' => 'attachmentMultiple', + 'view' => 'views/stream/fields/attachment-multiple' + ], + 'number' => (object) [ + 'type' => 'autoincrement', + 'index' => true, + 'readOnly' => true + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'noLoad' => true + ], + 'portals' => (object) [ + 'type' => 'linkMultiple', + 'noLoad' => true + ], + 'users' => (object) [ + 'type' => 'linkMultiple', + 'noLoad' => true + ], + 'isGlobal' => (object) [ + 'type' => 'bool' + ], + 'createdByGender' => (object) [ + 'type' => 'foreign', + 'link' => 'createdBy', + 'field' => 'gender' + ], + 'notifiedUserIdList' => (object) [ + 'type' => 'jsonArray', + 'notStorable' => true, + 'disabled' => true + ], + 'isInternal' => (object) [ + 'type' => 'bool' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'attachments' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Attachment', + 'relationName' => 'attachments', + 'foreign' => 'parent' + ], + 'parent' => (object) [ + 'type' => 'belongsToParent', + 'foreign' => 'notes' + ], + 'superParent' => (object) [ + 'type' => 'belongsToParent' + ], + 'related' => (object) [ + 'type' => 'belongsToParent' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'foreign' => 'notes' + ], + 'portals' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Portal', + 'foreign' => 'notes' + ], + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'notes' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'number', + 'asc' => false + ], + 'statusStyles' => (object) [ + 'Lead' => (object) [ + 'Assigned' => 'primary', + 'In Process' => 'primary', + 'Converted' => 'success', + 'Recycled' => 'danger', + 'Dead' => 'danger' + ], + 'Case' => (object) [ + 'New' => 'primary', + 'Assigned' => 'primary', + 'Pending' => 'default', + 'Closed' => 'success', + 'Rejected' => 'danger', + 'Duplicate' => 'danger' + ], + 'Opportunity' => (object) [ + 'Proposal' => 'primary', + 'Negotiation' => 'primary', + 'Closed Won' => 'success', + 'Closed Lost' => 'danger' + ], + 'Task' => (object) [ + 'Completed' => 'success', + 'Started' => 'primary', + 'Canceled' => 'danger' + ], + 'Meeting' => (object) [ + 'Held' => 'success' + ], + 'Call' => (object) [ + 'Held' => 'success' + ] + ], + 'indexes' => (object) [ + 'createdAt' => (object) [ + 'type' => 'index', + 'columns' => [ + 0 => 'createdAt' + ] + ], + 'parent' => (object) [ + 'type' => 'index', + 'columns' => [ + 0 => 'parentId', + 1 => 'parentType' + ] + ], + 'parentAndSuperParent' => (object) [ + 'type' => 'index', + 'columns' => [ + 0 => 'parentId', + 1 => 'parentType', + 2 => 'superParentId', + 3 => 'superParentType' + ] + ] + ] + ], + 'Notification' => (object) [ + 'fields' => (object) [ + 'number' => (object) [ + 'type' => 'autoincrement', + 'index' => true + ], + 'data' => (object) [ + 'type' => 'jsonObject' + ], + 'noteData' => (object) [ + 'type' => 'jsonObject', + 'notStorable' => true + ], + 'type' => (object) [ + 'type' => 'varchar' + ], + 'read' => (object) [ + 'type' => 'bool' + ], + 'emailIsProcessed' => (object) [ + 'type' => 'bool' + ], + 'user' => (object) [ + 'type' => 'link' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'message' => (object) [ + 'type' => 'text' + ], + 'related' => (object) [ + 'type' => 'linkParent', + 'readOnly' => true + ], + 'relatedParent' => (object) [ + 'type' => 'linkParent', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'user' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'related' => (object) [ + 'type' => 'belongsToParent' + ], + 'relatedParent' => (object) [ + 'type' => 'belongsToParent' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'number', + 'asc' => false + ], + 'indexes' => (object) [ + 'createdAt' => (object) [ + 'type' => 'index', + 'columns' => [ + 0 => 'createdAt' + ] + ], + 'user' => (object) [ + 'type' => 'index', + 'columns' => [ + 0 => 'userId', + 1 => 'createdAt' + ] + ] + ] + ], + 'PasswordChangeRequest' => (object) [ + 'fields' => (object) [ + 'requestId' => (object) [ + 'type' => 'varchar', + 'maxLength' => 24, + 'index' => true + ], + 'user' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'index' => true + ], + 'url' => (object) [ + 'type' => 'url' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'user' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ] + ] + ], + 'PhoneNumber' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 36, + 'index' => true + ], + 'type' => (object) [ + 'type' => 'enum' + ] + ], + 'links' => (object) [ + + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'Portal' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100, + 'trim' => true + ], + 'logo' => (object) [ + 'type' => 'image' + ], + 'url' => (object) [ + 'type' => 'url', + 'notStorable' => true, + 'readOnly' => true + ], + 'customId' => (object) [ + 'type' => 'varchar', + 'maxLength' => 36, + 'view' => 'views/portal/fields/custom-id', + 'trim' => true, + 'index' => true + ], + 'isActive' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'isDefault' => (object) [ + 'type' => 'bool', + 'default' => false, + 'notStorable' => true + ], + 'portalRoles' => (object) [ + 'type' => 'linkMultiple' + ], + 'tabList' => (object) [ + 'type' => 'array', + 'view' => 'views/portal/fields/tab-list' + ], + 'quickCreateList' => (object) [ + 'type' => 'array', + 'translation' => 'Global.scopeNames', + 'view' => 'views/portal/fields/quick-create-list' + ], + 'companyLogo' => (object) [ + 'type' => 'image' + ], + 'theme' => (object) [ + 'type' => 'enum', + 'view' => 'views/preferences/fields/theme', + 'translation' => 'Global.themes', + 'default' => '' + ], + 'language' => (object) [ + 'type' => 'enum', + 'view' => 'views/preferences/fields/language', + 'default' => '' + ], + 'timeZone' => (object) [ + 'type' => 'enum', + 'detault' => '', + 'view' => 'views/preferences/fields/time-zone' + ], + 'dateFormat' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'MM/DD/YYYY', + 1 => 'YYYY-MM-DD', + 2 => 'DD.MM.YYYY', + 3 => 'DD/MM/YYYY' + ], + 'default' => '', + 'view' => 'views/preferences/fields/date-format' + ], + 'timeFormat' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'HH:mm', + 1 => 'hh:mma', + 2 => 'hh:mmA', + 3 => 'hh:mm A', + 4 => 'hh:mm a' + ], + 'default' => '', + 'view' => 'views/preferences/fields/time-format' + ], + 'weekStart' => (object) [ + 'type' => 'enumInt', + 'options' => [ + 0 => 0, + 1 => 1 + ], + 'default' => -1, + 'view' => 'views/preferences/fields/week-start' + ], + 'defaultCurrency' => (object) [ + 'type' => 'enum', + 'default' => '', + 'view' => 'views/preferences/fields/default-currency' + ], + 'dashboardLayout' => (object) [ + 'type' => 'jsonArray', + 'view' => 'views/settings/fields/dashboard-layout' + ], + 'dashletsOptions' => (object) [ + 'type' => 'jsonObject', + 'disabled' => true + ], + 'customUrl' => (object) [ + 'type' => 'url' + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'portals' + ], + 'portalRoles' => (object) [ + 'type' => 'hasMany', + 'entity' => 'PortalRole', + 'foreign' => 'portals' + ], + 'notes' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Note', + 'foreign' => 'portals' + ], + 'articles' => (object) [ + 'type' => 'hasMany', + 'entity' => 'KnowledgeBaseArticle', + 'foreign' => 'portals' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'PortalRole' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'maxLength' => 150, + 'required' => true, + 'type' => 'varchar', + 'trim' => true + ], + 'data' => (object) [ + 'type' => 'jsonObject' + ], + 'fieldData' => (object) [ + 'type' => 'jsonObject' + ], + 'exportPermission' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'not-set', + 1 => 'yes', + 2 => 'no' + ], + 'default' => 'not-set', + 'tooltip' => true, + 'translation' => 'Role.options.levelList' + ] + ], + 'links' => (object) [ + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'portalRoles' + ], + 'portals' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Portal', + 'foreign' => 'portalRoles' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'Preferences' => (object) [ + 'fields' => (object) [ + 'timeZone' => (object) [ + 'type' => 'enum', + 'detault' => '', + 'view' => 'views/preferences/fields/time-zone' + ], + 'dateFormat' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'MM/DD/YYYY', + 1 => 'YYYY-MM-DD', + 2 => 'DD.MM.YYYY', + 3 => 'DD/MM/YYYY' + ], + 'default' => '', + 'view' => 'views/preferences/fields/date-format' + ], + 'timeFormat' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'HH:mm', + 1 => 'hh:mma', + 2 => 'hh:mmA', + 3 => 'hh:mm A', + 4 => 'hh:mm a' + ], + 'default' => '', + 'view' => 'views/preferences/fields/time-format' + ], + 'weekStart' => (object) [ + 'type' => 'enumInt', + 'options' => [ + 0 => 0, + 1 => 1 + ], + 'default' => -1, + 'view' => 'views/preferences/fields/week-start' + ], + 'defaultCurrency' => (object) [ + 'type' => 'enum', + 'default' => '', + 'view' => 'views/preferences/fields/default-currency' + ], + 'thousandSeparator' => (object) [ + 'type' => 'varchar', + 'default' => ',', + 'maxLength' => 1, + 'view' => 'views/settings/fields/thousand-separator' + ], + 'decimalMark' => (object) [ + 'type' => 'varchar', + 'default' => '.', + 'required' => true, + 'maxLength' => 1 + ], + 'dashboardLayout' => (object) [ + 'type' => 'jsonArray', + 'view' => 'views/settings/fields/dashboard-layout' + ], + 'dashletsOptions' => (object) [ + 'type' => 'jsonObject' + ], + 'sharedCalendarUserList' => (object) [ + 'type' => 'jsonArray' + ], + 'presetFilters' => (object) [ + 'type' => 'jsonObject' + ], + 'smtpEmailAddress' => (object) [ + 'type' => 'varchar', + 'readOnly' => true, + 'notStorable' => true, + 'view' => 'views/preferences/fields/smtp-email-address', + 'trim' => true + ], + 'smtpServer' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'smtpPort' => (object) [ + 'type' => 'int', + 'min' => 0, + 'max' => 9999, + 'default' => 25 + ], + 'smtpAuth' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'smtpSecurity' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'SSL', + 2 => 'TLS' + ] + ], + 'smtpUsername' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'smtpPassword' => (object) [ + 'type' => 'password' + ], + 'language' => (object) [ + 'type' => 'enum', + 'default' => '', + 'view' => 'views/preferences/fields/language' + ], + 'exportDelimiter' => (object) [ + 'type' => 'varchar', + 'default' => ',', + 'required' => true, + 'maxLength' => 1 + ], + 'receiveAssignmentEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'receiveMentionEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'receiveStreamEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'autoFollowEntityTypeList' => (object) [ + 'type' => 'multiEnum', + 'view' => 'views/preferences/fields/auto-follow-entity-type-list', + 'translation' => 'Global.scopeNamesPlural', + 'notStorable' => true, + 'tooltip' => true + ], + 'signature' => (object) [ + 'type' => 'text', + 'view' => 'views/fields/wysiwyg' + ], + 'defaultReminders' => (object) [ + 'type' => 'jsonArray', + 'view' => 'crm:views/meeting/fields/reminders' + ], + 'theme' => (object) [ + 'type' => 'enum', + 'view' => 'views/preferences/fields/theme', + 'translation' => 'Global.themes' + ], + 'useCustomTabList' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'tabList' => (object) [ + 'type' => 'array', + 'view' => 'views/preferences/fields/tab-list' + ], + 'emailReplyToAllByDefault' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'emailReplyForceHtml' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'isPortalUser' => (object) [ + 'type' => 'bool', + 'notStorable' => true + ], + 'doNotFillAssignedUserIfNotRequired' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'followEntityOnStreamPost' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'followCreatedEntities' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'followCreatedEntityTypeList' => (object) [ + 'type' => 'multiEnum', + 'view' => 'views/preferences/fields/auto-follow-entity-type-list', + 'translation' => 'Global.scopeNamesPlural', + 'tooltip' => true + ] + ] + ], + 'Role' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'maxLength' => 150, + 'required' => true, + 'type' => 'varchar', + 'trim' => true + ], + 'assignmentPermission' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'not-set', + 1 => 'all', + 2 => 'team', + 3 => 'no' + ], + 'default' => 'not-set', + 'tooltip' => true, + 'translation' => 'Role.options.levelList' + ], + 'userPermission' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'not-set', + 1 => 'all', + 2 => 'team', + 3 => 'no' + ], + 'default' => 'not-set', + 'tooltip' => true, + 'translation' => 'Role.options.levelList' + ], + 'portalPermission' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'not-set', + 1 => 'yes', + 2 => 'no' + ], + 'default' => 'not-set', + 'tooltip' => true, + 'translation' => 'Role.options.levelList' + ], + 'groupEmailAccountPermission' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'not-set', + 1 => 'all', + 2 => 'team', + 3 => 'no' + ], + 'default' => 'not-set', + 'tooltip' => true, + 'translation' => 'Role.options.levelList' + ], + 'exportPermission' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'not-set', + 1 => 'yes', + 2 => 'no' + ], + 'default' => 'not-set', + 'tooltip' => true, + 'translation' => 'Role.options.levelList' + ], + 'data' => (object) [ + 'type' => 'jsonObject' + ], + 'fieldData' => (object) [ + 'type' => 'jsonObject' + ] + ], + 'links' => (object) [ + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'roles' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'foreign' => 'roles' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'ScheduledJob' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true + ], + 'job' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'view' => 'views/scheduled-job/fields/job' + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Active', + 1 => 'Inactive' + ] + ], + 'scheduling' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'view' => 'views/scheduled-job/fields/scheduling', + 'tooltip' => true + ], + 'lastRun' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'isInternal' => (object) [ + 'type' => 'bool', + 'readOnly' => true, + 'disabled' => true, + 'default' => false + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'log' => (object) [ + 'type' => 'hasMany', + 'entity' => 'ScheduledJobLogRecord', + 'foreign' => 'scheduledJob' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ], + 'jobSchedulingMap' => (object) [ + 'CheckInboundEmails' => '*/2 * * * *', + 'CheckEmailAccounts' => '*/1 * * * *', + 'SendEmailReminders' => '*/2 * * * *', + 'Cleanup' => '1 1 * * 0', + 'AuthTokenControl' => '*/6 * * * *', + 'SendEmailNotifications' => '*/2 * * * *', + 'ProcessMassEmail' => '15 * * * *', + 'ControlKnowledgeBaseArticleStatus' => '10 1 * * *' + ], + 'jobs' => (object) [ + 'Dummy' => (object) [ + 'isSystem' => true, + 'scheduling' => '1 */12 * * *' + ], + 'CheckNewVersion' => (object) [ + 'name' => 'Check for New Version', + 'isSystem' => true, + 'scheduling' => '15 5 * * *' + ] + ] + ], + 'ScheduledJobLogRecord' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'readOnly' => true + ], + 'status' => (object) [ + 'type' => 'varchar', + 'readOnly' => true + ], + 'executionTime' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'scheduledJob' => (object) [ + 'type' => 'link' + ], + 'target' => (object) [ + 'type' => 'linkParent' + ] + ], + 'links' => (object) [ + 'scheduledJob' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'ScheduledJob' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'executionTime', + 'asc' => false + ] + ], + 'Settings' => (object) [ + 'fields' => (object) [ + 'useCache' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'recordsPerPage' => (object) [ + 'type' => 'int', + 'min' => 1, + 'max' => 200, + 'default' => 20, + 'required' => true, + 'tooltip' => true + ], + 'recordsPerPageSmall' => (object) [ + 'type' => 'int', + 'min' => 1, + 'max' => 100, + 'default' => 10, + 'required' => true, + 'tooltip' => true + ], + 'timeZone' => (object) [ + 'type' => 'enum', + 'detault' => 'UTC', + 'options' => [ + 0 => 'UTC', + 1 => 'Africa/Abidjan', + 2 => 'Africa/Accra', + 3 => 'Africa/Addis_Ababa', + 4 => 'Africa/Algiers', + 5 => 'Africa/Asmara', + 6 => 'Africa/Bamako', + 7 => 'Africa/Bangui', + 8 => 'Africa/Banjul', + 9 => 'Africa/Bissau', + 10 => 'Africa/Blantyre', + 11 => 'Africa/Brazzaville', + 12 => 'Africa/Bujumbura', + 13 => 'Africa/Cairo', + 14 => 'Africa/Casablanca', + 15 => 'Africa/Ceuta', + 16 => 'Africa/Conakry', + 17 => 'Africa/Dakar', + 18 => 'Africa/Dar_es_Salaam', + 19 => 'Africa/Djibouti', + 20 => 'Africa/Douala', + 21 => 'Africa/El_Aaiun', + 22 => 'Africa/Freetown', + 23 => 'Africa/Gaborone', + 24 => 'Africa/Harare', + 25 => 'Africa/Johannesburg', + 26 => 'Africa/Juba', + 27 => 'Africa/Kampala', + 28 => 'Africa/Khartoum', + 29 => 'Africa/Kigali', + 30 => 'Africa/Kinshasa', + 31 => 'Africa/Lagos', + 32 => 'Africa/Libreville', + 33 => 'Africa/Lome', + 34 => 'Africa/Luanda', + 35 => 'Africa/Lubumbashi', + 36 => 'Africa/Lusaka', + 37 => 'Africa/Malabo', + 38 => 'Africa/Maputo', + 39 => 'Africa/Maseru', + 40 => 'Africa/Mbabane', + 41 => 'Africa/Mogadishu', + 42 => 'Africa/Monrovia', + 43 => 'Africa/Nairobi', + 44 => 'Africa/Ndjamena', + 45 => 'Africa/Niamey', + 46 => 'Africa/Nouakchott', + 47 => 'Africa/Ouagadougou', + 48 => 'Africa/Porto-Novo', + 49 => 'Africa/Sao_Tome', + 50 => 'Africa/Tripoli', + 51 => 'Africa/Tunis', + 52 => 'Africa/Windhoek', + 53 => 'America/Adak', + 54 => 'America/Anchorage', + 55 => 'America/Anguilla', + 56 => 'America/Antigua', + 57 => 'America/Araguaina', + 58 => 'America/Argentina/Buenos_Aires', + 59 => 'America/Argentina/Catamarca', + 60 => 'America/Argentina/Cordoba', + 61 => 'America/Argentina/Jujuy', + 62 => 'America/Argentina/La_Rioja', + 63 => 'America/Argentina/Mendoza', + 64 => 'America/Argentina/Rio_Gallegos', + 65 => 'America/Argentina/Salta', + 66 => 'America/Argentina/San_Juan', + 67 => 'America/Argentina/San_Luis', + 68 => 'America/Argentina/Tucuman', + 69 => 'America/Argentina/Ushuaia', + 70 => 'America/Aruba', + 71 => 'America/Asuncion', + 72 => 'America/Atikokan', + 73 => 'America/Bahia', + 74 => 'America/Bahia_Banderas', + 75 => 'America/Barbados', + 76 => 'America/Belem', + 77 => 'America/Belize', + 78 => 'America/Blanc-Sablon', + 79 => 'America/Boa_Vista', + 80 => 'America/Bogota', + 81 => 'America/Boise', + 82 => 'America/Cambridge_Bay', + 83 => 'America/Campo_Grande', + 84 => 'America/Cancun', + 85 => 'America/Caracas', + 86 => 'America/Cayenne', + 87 => 'America/Cayman', + 88 => 'America/Chicago', + 89 => 'America/Chihuahua', + 90 => 'America/Costa_Rica', + 91 => 'America/Creston', + 92 => 'America/Cuiaba', + 93 => 'America/Curacao', + 94 => 'America/Danmarkshavn', + 95 => 'America/Dawson', + 96 => 'America/Dawson_Creek', + 97 => 'America/Denver', + 98 => 'America/Detroit', + 99 => 'America/Dominica', + 100 => 'America/Edmonton', + 101 => 'America/Eirunepe', + 102 => 'America/El_Salvador', + 103 => 'America/Fortaleza', + 104 => 'America/Glace_Bay', + 105 => 'America/Godthab', + 106 => 'America/Goose_Bay', + 107 => 'America/Grand_Turk', + 108 => 'America/Grenada', + 109 => 'America/Guadeloupe', + 110 => 'America/Guatemala', + 111 => 'America/Guayaquil', + 112 => 'America/Guyana', + 113 => 'America/Halifax', + 114 => 'America/Havana', + 115 => 'America/Hermosillo', + 116 => 'America/Indiana/Indianapolis', + 117 => 'America/Indiana/Knox', + 118 => 'America/Indiana/Marengo', + 119 => 'America/Indiana/Petersburg', + 120 => 'America/Indiana/Tell_City', + 121 => 'America/Indiana/Vevay', + 122 => 'America/Indiana/Vincennes', + 123 => 'America/Indiana/Winamac', + 124 => 'America/Inuvik', + 125 => 'America/Iqaluit', + 126 => 'America/Jamaica', + 127 => 'America/Juneau', + 128 => 'America/Kentucky/Louisville', + 129 => 'America/Kentucky/Monticello', + 130 => 'America/Kralendijk', + 131 => 'America/La_Paz', + 132 => 'America/Lima', + 133 => 'America/Los_Angeles', + 134 => 'America/Lower_Princes', + 135 => 'America/Maceio', + 136 => 'America/Managua', + 137 => 'America/Manaus', + 138 => 'America/Marigot', + 139 => 'America/Martinique', + 140 => 'America/Matamoros', + 141 => 'America/Mazatlan', + 142 => 'America/Menominee', + 143 => 'America/Merida', + 144 => 'America/Metlakatla', + 145 => 'America/Mexico_City', + 146 => 'America/Miquelon', + 147 => 'America/Moncton', + 148 => 'America/Monterrey', + 149 => 'America/Montevideo', + 150 => 'America/Montserrat', + 151 => 'America/Nassau', + 152 => 'America/New_York', + 153 => 'America/Nipigon', + 154 => 'America/Nome', + 155 => 'America/Noronha', + 156 => 'America/North_Dakota/Beulah', + 157 => 'America/North_Dakota/Center', + 158 => 'America/North_Dakota/New_Salem', + 159 => 'America/Ojinaga', + 160 => 'America/Panama', + 161 => 'America/Pangnirtung', + 162 => 'America/Paramaribo', + 163 => 'America/Phoenix', + 164 => 'America/Port-au-Prince', + 165 => 'America/Port_of_Spain', + 166 => 'America/Porto_Velho', + 167 => 'America/Puerto_Rico', + 168 => 'America/Rainy_River', + 169 => 'America/Rankin_Inlet', + 170 => 'America/Recife', + 171 => 'America/Regina', + 172 => 'America/Resolute', + 173 => 'America/Rio_Branco', + 174 => 'America/Santa_Isabel', + 175 => 'America/Santarem', + 176 => 'America/Santiago', + 177 => 'America/Santo_Domingo', + 178 => 'America/Sao_Paulo', + 179 => 'America/Scoresbysund', + 180 => 'America/Sitka', + 181 => 'America/St_Barthelemy', + 182 => 'America/St_Johns', + 183 => 'America/St_Kitts', + 184 => 'America/St_Lucia', + 185 => 'America/St_Thomas', + 186 => 'America/St_Vincent', + 187 => 'America/Swift_Current', + 188 => 'America/Tegucigalpa', + 189 => 'America/Thule', + 190 => 'America/Thunder_Bay', + 191 => 'America/Tijuana', + 192 => 'America/Toronto', + 193 => 'America/Tortola', + 194 => 'America/Vancouver', + 195 => 'America/Whitehorse', + 196 => 'America/Winnipeg', + 197 => 'America/Yakutat', + 198 => 'America/Yellowknife', + 199 => 'Antarctica/Casey', + 200 => 'Antarctica/Davis', + 201 => 'Antarctica/DumontDUrville', + 202 => 'Antarctica/Macquarie', + 203 => 'Antarctica/Mawson', + 204 => 'Antarctica/McMurdo', + 205 => 'Antarctica/Palmer', + 206 => 'Antarctica/Rothera', + 207 => 'Antarctica/Syowa', + 208 => 'Antarctica/Vostok', + 209 => 'Arctic/Longyearbyen', + 210 => 'Asia/Aden', + 211 => 'Asia/Almaty', + 212 => 'Asia/Amman', + 213 => 'Asia/Anadyr', + 214 => 'Asia/Aqtau', + 215 => 'Asia/Aqtobe', + 216 => 'Asia/Ashgabat', + 217 => 'Asia/Baghdad', + 218 => 'Asia/Bahrain', + 219 => 'Asia/Baku', + 220 => 'Asia/Bangkok', + 221 => 'Asia/Beirut', + 222 => 'Asia/Bishkek', + 223 => 'Asia/Brunei', + 224 => 'Asia/Choibalsan', + 225 => 'Asia/Chongqing', + 226 => 'Asia/Colombo', + 227 => 'Asia/Damascus', + 228 => 'Asia/Dhaka', + 229 => 'Asia/Dili', + 230 => 'Asia/Dubai', + 231 => 'Asia/Dushanbe', + 232 => 'Asia/Gaza', + 233 => 'Asia/Harbin', + 234 => 'Asia/Hebron', + 235 => 'Asia/Ho_Chi_Minh', + 236 => 'Asia/Hong_Kong', + 237 => 'Asia/Hovd', + 238 => 'Asia/Irkutsk', + 239 => 'Asia/Jakarta', + 240 => 'Asia/Jayapura', + 241 => 'Asia/Jerusalem', + 242 => 'Asia/Kabul', + 243 => 'Asia/Kamchatka', + 244 => 'Asia/Karachi', + 245 => 'Asia/Kashgar', + 246 => 'Asia/Kathmandu', + 247 => 'Asia/Khandyga', + 248 => 'Asia/Kolkata', + 249 => 'Asia/Krasnoyarsk', + 250 => 'Asia/Kuala_Lumpur', + 251 => 'Asia/Kuching', + 252 => 'Asia/Kuwait', + 253 => 'Asia/Macau', + 254 => 'Asia/Magadan', + 255 => 'Asia/Makassar', + 256 => 'Asia/Manila', + 257 => 'Asia/Muscat', + 258 => 'Asia/Nicosia', + 259 => 'Asia/Novokuznetsk', + 260 => 'Asia/Novosibirsk', + 261 => 'Asia/Omsk', + 262 => 'Asia/Oral', + 263 => 'Asia/Phnom_Penh', + 264 => 'Asia/Pontianak', + 265 => 'Asia/Pyongyang', + 266 => 'Asia/Qatar', + 267 => 'Asia/Qyzylorda', + 268 => 'Asia/Rangoon', + 269 => 'Asia/Riyadh', + 270 => 'Asia/Sakhalin', + 271 => 'Asia/Samarkand', + 272 => 'Asia/Seoul', + 273 => 'Asia/Shanghai', + 274 => 'Asia/Singapore', + 275 => 'Asia/Taipei', + 276 => 'Asia/Tashkent', + 277 => 'Asia/Tbilisi', + 278 => 'Asia/Tehran', + 279 => 'Asia/Thimphu', + 280 => 'Asia/Tokyo', + 281 => 'Asia/Ulaanbaatar', + 282 => 'Asia/Urumqi', + 283 => 'Asia/Ust-Nera', + 284 => 'Asia/Vientiane', + 285 => 'Asia/Vladivostok', + 286 => 'Asia/Yakutsk', + 287 => 'Asia/Yekaterinburg', + 288 => 'Asia/Yerevan', + 289 => 'Atlantic/Azores', + 290 => 'Atlantic/Bermuda', + 291 => 'Atlantic/Canary', + 292 => 'Atlantic/Cape_Verde', + 293 => 'Atlantic/Faroe', + 294 => 'Atlantic/Madeira', + 295 => 'Atlantic/Reykjavik', + 296 => 'Atlantic/South_Georgia', + 297 => 'Atlantic/St_Helena', + 298 => 'Atlantic/Stanley', + 299 => 'Australia/Adelaide', + 300 => 'Australia/Brisbane', + 301 => 'Australia/Broken_Hill', + 302 => 'Australia/Currie', + 303 => 'Australia/Darwin', + 304 => 'Australia/Eucla', + 305 => 'Australia/Hobart', + 306 => 'Australia/Lindeman', + 307 => 'Australia/Lord_Howe', + 308 => 'Australia/Melbourne', + 309 => 'Australia/Perth', + 310 => 'Australia/Sydney', + 311 => 'Europe/Amsterdam', + 312 => 'Europe/Andorra', + 313 => 'Europe/Athens', + 314 => 'Europe/Belgrade', + 315 => 'Europe/Berlin', + 316 => 'Europe/Bratislava', + 317 => 'Europe/Brussels', + 318 => 'Europe/Bucharest', + 319 => 'Europe/Budapest', + 320 => 'Europe/Busingen', + 321 => 'Europe/Chisinau', + 322 => 'Europe/Copenhagen', + 323 => 'Europe/Dublin', + 324 => 'Europe/Gibraltar', + 325 => 'Europe/Guernsey', + 326 => 'Europe/Helsinki', + 327 => 'Europe/Isle_of_Man', + 328 => 'Europe/Istanbul', + 329 => 'Europe/Jersey', + 330 => 'Europe/Kaliningrad', + 331 => 'Europe/Kiev', + 332 => 'Europe/Lisbon', + 333 => 'Europe/Ljubljana', + 334 => 'Europe/London', + 335 => 'Europe/Luxembourg', + 336 => 'Europe/Madrid', + 337 => 'Europe/Malta', + 338 => 'Europe/Mariehamn', + 339 => 'Europe/Minsk', + 340 => 'Europe/Monaco', + 341 => 'Europe/Moscow', + 342 => 'Europe/Oslo', + 343 => 'Europe/Paris', + 344 => 'Europe/Podgorica', + 345 => 'Europe/Prague', + 346 => 'Europe/Riga', + 347 => 'Europe/Rome', + 348 => 'Europe/Samara', + 349 => 'Europe/San_Marino', + 350 => 'Europe/Sarajevo', + 351 => 'Europe/Simferopol', + 352 => 'Europe/Skopje', + 353 => 'Europe/Sofia', + 354 => 'Europe/Stockholm', + 355 => 'Europe/Tallinn', + 356 => 'Europe/Tirane', + 357 => 'Europe/Uzhgorod', + 358 => 'Europe/Vaduz', + 359 => 'Europe/Vatican', + 360 => 'Europe/Vienna', + 361 => 'Europe/Vilnius', + 362 => 'Europe/Volgograd', + 363 => 'Europe/Warsaw', + 364 => 'Europe/Zagreb', + 365 => 'Europe/Zaporozhye', + 366 => 'Europe/Zurich', + 367 => 'Indian/Antananarivo', + 368 => 'Indian/Chagos', + 369 => 'Indian/Christmas', + 370 => 'Indian/Cocos', + 371 => 'Indian/Comoro', + 372 => 'Indian/Kerguelen', + 373 => 'Indian/Mahe', + 374 => 'Indian/Maldives', + 375 => 'Indian/Mauritius', + 376 => 'Indian/Mayotte', + 377 => 'Indian/Reunion', + 378 => 'Pacific/Apia', + 379 => 'Pacific/Auckland', + 380 => 'Pacific/Chatham', + 381 => 'Pacific/Chuuk', + 382 => 'Pacific/Easter', + 383 => 'Pacific/Efate', + 384 => 'Pacific/Enderbury', + 385 => 'Pacific/Fakaofo', + 386 => 'Pacific/Fiji', + 387 => 'Pacific/Funafuti', + 388 => 'Pacific/Galapagos', + 389 => 'Pacific/Gambier', + 390 => 'Pacific/Guadalcanal', + 391 => 'Pacific/Guam', + 392 => 'Pacific/Honolulu', + 393 => 'Pacific/Johnston', + 394 => 'Pacific/Kiritimati', + 395 => 'Pacific/Kosrae', + 396 => 'Pacific/Kwajalein', + 397 => 'Pacific/Majuro', + 398 => 'Pacific/Marquesas', + 399 => 'Pacific/Midway', + 400 => 'Pacific/Nauru', + 401 => 'Pacific/Niue', + 402 => 'Pacific/Norfolk', + 403 => 'Pacific/Noumea', + 404 => 'Pacific/Pago_Pago', + 405 => 'Pacific/Palau', + 406 => 'Pacific/Pitcairn', + 407 => 'Pacific/Pohnpei', + 408 => 'Pacific/Port_Moresby', + 409 => 'Pacific/Rarotonga', + 410 => 'Pacific/Saipan', + 411 => 'Pacific/Tahiti', + 412 => 'Pacific/Tarawa', + 413 => 'Pacific/Tongatapu', + 414 => 'Pacific/Wake', + 415 => 'Pacific/Wallis' + ] + ], + 'dateFormat' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'MM/DD/YYYY', + 1 => 'YYYY-MM-DD', + 2 => 'DD.MM.YYYY', + 3 => 'DD/MM/YYYY' + ], + 'default' => 'MM/DD/YYYY' + ], + 'timeFormat' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'HH:mm', + 1 => 'hh:mma', + 2 => 'hh:mmA', + 3 => 'hh:mm A', + 4 => 'hh:mm a' + ], + 'default' => 'HH:mm' + ], + 'weekStart' => (object) [ + 'type' => 'enumInt', + 'options' => [ + 0 => 0, + 1 => 1 + ], + 'default' => 0 + ], + 'thousandSeparator' => (object) [ + 'type' => 'varchar', + 'default' => ',', + 'maxLength' => 1, + 'view' => 'views/settings/fields/thousand-separator' + ], + 'decimalMark' => (object) [ + 'type' => 'varchar', + 'default' => '.', + 'required' => true, + 'maxLength' => 1 + ], + 'currencyList' => (object) [ + 'type' => 'multiEnum', + 'default' => [ + 0 => 'USD', + 1 => 'EUR' + ], + 'options' => [ + 0 => 'AED', + 1 => 'ANG', + 2 => 'ARS', + 3 => 'AUD', + 4 => 'BAM', + 5 => 'BGN', + 6 => 'BHD', + 7 => 'BND', + 8 => 'BOB', + 9 => 'BRL', + 10 => 'BWP', + 11 => 'CAD', + 12 => 'CHF', + 13 => 'CLP', + 14 => 'CNY', + 15 => 'COP', + 16 => 'CRC', + 17 => 'CZK', + 18 => 'DKK', + 19 => 'DOP', + 20 => 'DZD', + 21 => 'EEK', + 22 => 'EGP', + 23 => 'EUR', + 24 => 'FJD', + 25 => 'GBP', + 26 => 'HKD', + 27 => 'HNL', + 28 => 'HRK', + 29 => 'HUF', + 30 => 'IDR', + 31 => 'ILS', + 32 => 'INR', + 33 => 'JMD', + 34 => 'JOD', + 35 => 'JPY', + 36 => 'KES', + 37 => 'KRW', + 38 => 'KWD', + 39 => 'KYD', + 40 => 'KZT', + 41 => 'LBP', + 42 => 'LKR', + 43 => 'LTL', + 44 => 'LVL', + 45 => 'MAD', + 46 => 'MDL', + 47 => 'MKD', + 48 => 'MUR', + 49 => 'MXN', + 50 => 'MYR', + 51 => 'NAD', + 52 => 'NGN', + 53 => 'NIO', + 54 => 'NOK', + 55 => 'NPR', + 56 => 'NZD', + 57 => 'OMR', + 58 => 'PEN', + 59 => 'PGK', + 60 => 'PHP', + 61 => 'PKR', + 62 => 'PLN', + 63 => 'PYG', + 64 => 'QAR', + 65 => 'RON', + 66 => 'RSD', + 67 => 'RUB', + 68 => 'SAR', + 69 => 'SCR', + 70 => 'SEK', + 71 => 'SGD', + 72 => 'SKK', + 73 => 'SLL', + 74 => 'SVC', + 75 => 'THB', + 76 => 'TND', + 77 => 'TRY', + 78 => 'TTD', + 79 => 'TWD', + 80 => 'TZS', + 81 => 'UAH', + 82 => 'UGX', + 83 => 'USD', + 84 => 'UYU', + 85 => 'UZS', + 86 => 'VND', + 87 => 'YER', + 88 => 'ZAR', + 89 => 'ZMK' + ], + 'required' => true + ], + 'defaultCurrency' => (object) [ + 'type' => 'enum', + 'default' => 'USD', + 'required' => true, + 'view' => 'views/settings/fields/default-currency' + ], + 'baseCurrency' => (object) [ + 'type' => 'enum', + 'default' => 'USD', + 'required' => true, + 'view' => 'views/settings/fields/default-currency' + ], + 'currencyRates' => (object) [ + 'type' => 'base', + 'view' => 'views/settings/fields/currency-rates' + ], + 'outboundEmailIsShared' => (object) [ + 'type' => 'bool', + 'default' => false, + 'tooltip' => true + ], + 'outboundEmailFromName' => (object) [ + 'type' => 'varchar', + 'default' => 'EspoCRM', + 'trim' => true + ], + 'outboundEmailFromAddress' => (object) [ + 'type' => 'varchar', + 'default' => 'crm@example.com', + 'trim' => true + ], + 'smtpServer' => (object) [ + 'type' => 'varchar' + ], + 'smtpPort' => (object) [ + 'type' => 'int', + 'min' => 0, + 'max' => 9999, + 'default' => 25 + ], + 'smtpAuth' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'smtpSecurity' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'SSL', + 2 => 'TLS' + ] + ], + 'smtpUsername' => (object) [ + 'type' => 'varchar', + 'required' => true + ], + 'smtpPassword' => (object) [ + 'type' => 'password' + ], + 'tabList' => (object) [ + 'type' => 'array', + 'view' => 'views/settings/fields/tab-list' + ], + 'quickCreateList' => (object) [ + 'type' => 'array', + 'translation' => 'Global.scopeNames', + 'view' => 'views/settings/fields/quick-create-list' + ], + 'language' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'en_US' + ], + 'default' => 'en_US', + 'view' => 'views/settings/fields/language', + 'isSorted' => true + ], + 'globalSearchEntityList' => (object) [ + 'type' => 'multiEnum', + 'translation' => 'Global.scopeNames', + 'view' => 'views/settings/fields/global-search-entity-list' + ], + 'exportDelimiter' => (object) [ + 'type' => 'varchar', + 'default' => ',', + 'required' => true, + 'maxLength' => 1 + ], + 'companyLogo' => (object) [ + 'type' => 'image' + ], + 'authenticationMethod' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Espo', + 1 => 'LDAP' + ], + 'default' => 'Espo' + ], + 'ldapHost' => (object) [ + 'type' => 'varchar', + 'required' => true + ], + 'ldapPort' => (object) [ + 'type' => 'varchar', + 'default' => 389 + ], + 'ldapSecurity' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'SSL', + 2 => 'TLS' + ] + ], + 'ldapAuth' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'ldapUsername' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'tooltip' => true + ], + 'ldapPassword' => (object) [ + 'type' => 'password', + 'tooltip' => true + ], + 'ldapBindRequiresDn' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'ldapUserLoginFilter' => (object) [ + 'type' => 'varchar', + 'tooltip' => true + ], + 'ldapBaseDn' => (object) [ + 'type' => 'varchar', + 'tooltip' => true + ], + 'ldapAccountCanonicalForm' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Dn', + 1 => 'Username', + 2 => 'Backslash', + 3 => 'Principal' + ], + 'tooltip' => true + ], + 'ldapAccountDomainName' => (object) [ + 'type' => 'varchar', + 'tooltip' => true + ], + 'ldapAccountDomainNameShort' => (object) [ + 'type' => 'varchar', + 'tooltip' => true + ], + 'ldapAccountFilterFormat' => (object) [ + 'type' => 'varchar' + ], + 'ldapTryUsernameSplit' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'ldapOptReferrals' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'ldapCreateEspoUser' => (object) [ + 'type' => 'bool', + 'default' => true, + 'tooltip' => true + ], + 'ldapUserNameAttribute' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'tooltip' => true + ], + 'ldapUserObjectClass' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'tooltip' => true + ], + 'ldapUserFirstNameAttribute' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'tooltip' => true + ], + 'ldapUserLastNameAttribute' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'tooltip' => true + ], + 'ldapUserTitleAttribute' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'tooltip' => true + ], + 'ldapUserEmailAddressAttribute' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'tooltip' => true + ], + 'ldapUserPhoneNumberAttribute' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'tooltip' => true + ], + 'ldapUserDefaultTeam' => (object) [ + 'type' => 'link', + 'tooltip' => true, + 'entity' => 'Team' + ], + 'ldapUserTeams' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true, + 'entity' => 'Team' + ], + 'exportDisabled' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'assignmentEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'assignmentEmailNotificationsEntityList' => (object) [ + 'type' => 'multiEnum', + 'translation' => 'Global.scopeNamesPlural', + 'view' => 'views/settings/fields/assignment-email-notifications-entity-list' + ], + 'assignmentNotificationsEntityList' => (object) [ + 'type' => 'multiEnum', + 'translation' => 'Global.scopeNamesPlural', + 'view' => 'views/settings/fields/assignment-notifications-entity-list' + ], + 'postEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'updateEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'mentionEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'streamEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'portalStreamEmailNotifications' => (object) [ + 'type' => 'bool', + 'default' => true + ], + 'streamEmailNotificationsEntityList' => (object) [ + 'type' => 'multiEnum', + 'translation' => 'Global.scopeNamesPlural', + 'view' => 'views/settings/fields/stream-email-notifications-entity-list' + ], + 'b2cMode' => (object) [ + 'type' => 'bool', + 'default' => false, + 'tooltip' => true + ], + 'avatarsDisabled' => (object) [ + 'type' => 'bool', + 'default' => false + ], + 'followCreatedEntities' => (object) [ + 'type' => 'bool', + 'default' => false, + 'tooltip' => true + ], + 'adminPanelIframeUrl' => (object) [ + 'type' => 'varchar' + ], + 'displayListViewRecordCount' => (object) [ + 'type' => 'bool' + ], + 'userThemesDisabled' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'theme' => (object) [ + 'type' => 'enum', + 'view' => 'views/settings/fields/theme', + 'translation' => 'Global.themes' + ], + 'emailMessageMaxSize' => (object) [ + 'type' => 'float', + 'min' => 0, + 'tooltip' => true + ], + 'inboundEmailMaxPortionSize' => (object) [ + 'type' => 'int', + 'min' => 1, + 'max' => 500 + ], + 'personalEmailMaxPortionSize' => (object) [ + 'type' => 'int', + 'min' => 1, + 'max' => 500 + ], + 'maxEmailAccountCount' => (object) [ + 'type' => 'int' + ], + 'massEmailMaxPerHourCount' => (object) [ + 'type' => 'int', + 'min' => 1 + ], + 'authTokenLifetime' => (object) [ + 'type' => 'float', + 'min' => 0, + 'default' => 0, + 'tooltip' => true + ], + 'authTokenMaxIdleTime' => (object) [ + 'type' => 'float', + 'min' => 0, + 'default' => 0, + 'tooltip' => true + ], + 'dashboardLayout' => (object) [ + 'type' => 'jsonArray', + 'view' => 'views/settings/fields/dashboard-layout' + ], + 'dashletsOptions' => (object) [ + 'type' => 'jsonObject', + 'disabled' => true + ], + 'siteUrl' => (object) [ + 'type' => 'varchar' + ], + 'applicationName' => (object) [ + 'type' => 'varchar' + ], + 'readableDateFormatDisabled' => (object) [ + 'type' => 'bool' + ], + 'addressFormat' => (object) [ + 'type' => 'enumInt', + 'options' => [ + 0 => 1, + 1 => 2, + 2 => 3, + 3 => 4 + ] + ], + 'addressPreview' => (object) [ + 'type' => 'address', + 'notStorable' => true, + 'readOnly' => true, + 'view' => 'views/settings/fields/address-preview' + ], + 'currencyFormat' => (object) [ + 'type' => 'enumInt', + 'options' => [ + 0 => 1, + 1 => 2 + ] + ], + 'currencyDecimalPlaces' => (object) [ + 'type' => 'int', + 'tooltip' => true, + 'min' => 0, + 'max' => 20 + ], + 'notificationSoundsDisabled' => (object) [ + 'type' => 'bool' + ], + 'calendarEntityList' => (object) [ + 'type' => 'multiEnum', + 'view' => 'views/settings/fields/calendar-entity-list' + ], + 'activitiesEntityList' => (object) [ + 'type' => 'multiEnum', + 'view' => 'views/settings/fields/activities-entity-list' + ], + 'historyEntityList' => (object) [ + 'type' => 'multiEnum', + 'view' => 'views/settings/fields/history-entity-list' + ], + 'googleMapsApiKey' => (object) [ + 'type' => 'varchar' + ], + 'massEmailDisableMandatoryOptOutLink' => (object) [ + 'type' => 'bool' + ], + 'aclStrictMode' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'aclAllowDeleteCreated' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'lastViewedCount' => (object) [ + 'type' => 'int', + 'min' => 1, + 'max' => 200, + 'default' => 20, + 'required' => true + ], + 'adminNotifications' => (object) [ + 'type' => 'bool' + ], + 'adminNotificationsNewVersion' => (object) [ + 'type' => 'bool' + ], + 'addressPreviewStreet' => (object) [ + 'notStorable' => true, + 'readOnly' => true, + 'type' => 'text', + 'maxLength' => 255, + 'dbType' => 'varchar' + ], + 'addressPreviewCity' => (object) [ + 'notStorable' => true, + 'readOnly' => true, + 'type' => 'varchar', + 'trim' => true + ], + 'addressPreviewState' => (object) [ + 'notStorable' => true, + 'readOnly' => true, + 'type' => 'varchar', + 'trim' => true + ], + 'addressPreviewCountry' => (object) [ + 'notStorable' => true, + 'readOnly' => true, + 'type' => 'varchar', + 'trim' => true + ], + 'addressPreviewPostalCode' => (object) [ + 'notStorable' => true, + 'readOnly' => true, + 'type' => 'varchar', + 'trim' => true + ], + 'addressPreviewMap' => (object) [ + 'notStorable' => true, + 'readOnly' => true, + 'type' => 'map', + 'layoutListDisabled' => true, + 'provider' => 'Google', + 'height' => 300 + ] + ] + ], + 'Team' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100, + 'trim' => true + ], + 'roles' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'positionList' => (object) [ + 'type' => 'array', + 'tooltip' => true + ], + 'userRole' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'disabled' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'teams' + ], + 'roles' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Role', + 'foreign' => 'teams' + ], + 'notes' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Note', + 'foreign' => 'teams' + ], + 'inboundEmails' => (object) [ + 'type' => 'hasMany', + 'entity' => 'InboundEmail', + 'foreign' => 'teams' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'Template' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'body' => (object) [ + 'type' => 'text', + 'view' => 'views/fields/wysiwyg' + ], + 'header' => (object) [ + 'type' => 'text', + 'view' => 'views/fields/wysiwyg' + ], + 'footer' => (object) [ + 'type' => 'text', + 'view' => 'views/fields/wysiwyg', + 'tooltip' => true + ], + 'entityType' => (object) [ + 'type' => 'enum', + 'required' => true, + 'translation' => 'Global.scopeNames', + 'view' => 'views/fields/entity-type' + ], + 'leftMargin' => (object) [ + 'type' => 'float', + 'default' => 10 + ], + 'rightMargin' => (object) [ + 'type' => 'float', + 'default' => 10 + ], + 'topMargin' => (object) [ + 'type' => 'float', + 'default' => 10 + ], + 'bottomMargin' => (object) [ + 'type' => 'float', + 'default' => 25 + ], + 'printFooter' => (object) [ + 'type' => 'bool' + ], + 'footerPosition' => (object) [ + 'type' => 'float', + 'default' => 15 + ], + 'teams' => (object) [ + 'type' => 'linkMultiple' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'variables' => (object) [ + 'type' => 'base', + 'notStorable' => true, + 'tooltip' => true + ] + ], + 'links' => (object) [ + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam' + ], + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'UniqueId' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'index' => true + ], + 'data' => (object) [ + 'type' => 'jsonObject' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ] + ], + 'User' => (object) [ + 'fields' => (object) [ + 'isAdmin' => (object) [ + 'type' => 'bool', + 'tooltip' => true + ], + 'userName' => (object) [ + 'type' => 'varchar', + 'maxLength' => 50, + 'required' => true, + 'view' => 'views/user/fields/user-name', + 'tooltip' => true + ], + 'name' => (object) [ + 'type' => 'personName', + 'view' => 'views/user/fields/name' + ], + 'password' => (object) [ + 'type' => 'password', + 'maxLength' => 150, + 'internal' => true, + 'disabled' => true + ], + 'passwordConfirm' => (object) [ + 'type' => 'password', + 'maxLength' => 150, + 'internal' => true, + 'disabled' => true, + 'notStorable' => true + ], + 'salutationName' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Mr.', + 2 => 'Ms.', + 3 => 'Mrs.', + 4 => 'Dr.' + ] + ], + 'firstName' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'maxLength' => 100, + 'default' => '' + ], + 'lastName' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'maxLength' => 100, + 'required' => true, + 'default' => '' + ], + 'isActive' => (object) [ + 'type' => 'bool', + 'tooltip' => true, + 'default' => true + ], + 'isPortalUser' => (object) [ + 'type' => 'bool' + ], + 'isSuperAdmin' => (object) [ + 'type' => 'bool', + 'default' => false, + 'disabled' => true + ], + 'title' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100, + 'trim' => true + ], + 'position' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100, + 'notStorable' => true, + 'where' => (object) [ + 'LIKE' => (object) [ + 'leftJoins' => [ + 0 => [ + 0 => 'teams', + 1 => 'teamsPosition' + ] + ], + 'sql' => 'teamsPositionMiddle.role LIKE {value}', + 'distinct' => true + ], + '=' => (object) [ + 'leftJoins' => [ + 0 => [ + 0 => 'teams', + 1 => 'teamsPosition' + ] + ], + 'sql' => 'teamsPositionMiddle.role = {value}', + 'distinct' => true + ], + '<>' => (object) [ + 'leftJoins' => [ + 0 => [ + 0 => 'teams', + 1 => 'teamsPosition' + ] + ], + 'sql' => 'teamsPositionMiddle.role <> {value}', + 'distinct' => true + ], + 'IS NULL' => (object) [ + 'leftJoins' => [ + 0 => [ + 0 => 'teams', + 1 => 'teamsPosition' + ] + ], + 'sql' => 'teamsPositionMiddle.role IS NULL', + 'distinct' => true + ], + 'IS NOT NULL' => (object) [ + 'leftJoins' => [ + 0 => [ + 0 => 'teams', + 1 => 'teamsPosition' + ] + ], + 'sql' => 'teamsPositionMiddle.role IS NOT NULL', + 'distinct' => true + ] + ], + 'trim' => true, + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true + ], + 'emailAddress' => (object) [ + 'type' => 'email', + 'required' => false + ], + 'phoneNumber' => (object) [ + 'type' => 'phone', + 'typeList' => [ + 0 => 'Mobile', + 1 => 'Office', + 2 => 'Home', + 3 => 'Fax', + 4 => 'Other' + ], + 'defaultType' => 'Mobile' + ], + 'token' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'disabled' => true + ], + 'authTokenId' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'disabled' => true + ], + 'ipAddress' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'disabled' => true + ], + 'defaultTeam' => (object) [ + 'type' => 'link', + 'tooltip' => true + ], + 'acceptanceStatus' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'exportDisabled' => true, + 'disabled' => true + ], + 'acceptanceStatusMeetings' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'exportDisabled' => true, + 'view' => 'crm:views/lead/fields/acceptance-status', + 'link' => 'meetings', + 'column' => 'status' + ], + 'acceptanceStatusCalls' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'exportDisabled' => true, + 'view' => 'crm:views/lead/fields/acceptance-status', + 'link' => 'calls', + 'column' => 'status' + ], + 'teamRole' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'disabled' => true + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true, + 'columns' => (object) [ + 'role' => 'userRole' + ], + 'view' => 'views/user/fields/teams', + 'default' => 'javascript: return {teamsIds: []}' + ], + 'roles' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'portals' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'portalRoles' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'contact' => (object) [ + 'type' => 'link', + 'view' => 'views/user/fields/contact' + ], + 'accounts' => (object) [ + 'type' => 'linkMultiple' + ], + 'account' => (object) [ + 'type' => 'link', + 'notStorable' => true, + 'readOnly' => true + ], + 'portal' => (object) [ + 'type' => 'link', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'avatar' => (object) [ + 'type' => 'image', + 'view' => 'views/user/fields/avatar', + 'previewSize' => 'small' + ], + 'sendAccessInfo' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'disabled' => true + ], + 'gender' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Male', + 2 => 'Female', + 3 => 'Neutral' + ], + 'default' => '' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ] + ], + 'links' => (object) [ + 'defaultTeam' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Team' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'foreign' => 'users', + 'additionalColumns' => (object) [ + 'role' => (object) [ + 'type' => 'varchar', + 'len' => 100 + ] + ], + 'layoutRelationshipsDisabled' => true + ], + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'roles' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Role', + 'foreign' => 'users', + 'layoutRelationshipsDisabled' => true + ], + 'portals' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Portal', + 'foreign' => 'users', + 'layoutRelationshipsDisabled' => true + ], + 'portalRoles' => (object) [ + 'type' => 'hasMany', + 'entity' => 'PortalRole', + 'foreign' => 'users', + 'layoutRelationshipsDisabled' => true + ], + 'preferences' => (object) [ + 'type' => 'hasOne', + 'entity' => 'Preferences' + ], + 'meetings' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Meeting', + 'foreign' => 'users' + ], + 'calls' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Call', + 'foreign' => 'users' + ], + 'emails' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Email', + 'foreign' => 'users' + ], + 'notes' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Note', + 'foreign' => 'users', + 'layoutRelationshipsDisabled' => true + ], + 'contact' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Contact', + 'foreign' => 'portalUser' + ], + 'accounts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Account', + 'foreign' => 'portalUsers', + 'relationName' => 'AccountPortalUser' + ], + 'tasks' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Task', + 'foreign' => 'assignedUser' + ], + 'targetLists' => (object) [ + 'type' => 'hasMany', + 'entity' => 'TargetList', + 'foreign' => 'users' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'userName', + 'asc' => true, + 'textFilterFields' => [ + 0 => 'name', + 1 => 'userName' + ] + ] + ], + 'Account' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'website' => (object) [ + 'type' => 'url' + ], + 'emailAddress' => (object) [ + 'type' => 'email' + ], + 'phoneNumber' => (object) [ + 'type' => 'phone', + 'typeList' => [ + 0 => 'Office', + 1 => 'Mobile', + 2 => 'Fax', + 3 => 'Other' + ], + 'defaultType' => 'Office' + ], + 'type' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Customer', + 2 => 'Investor', + 3 => 'Partner', + 4 => 'Reseller' + ], + 'default' => '' + ], + 'industry' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Advertising', + 2 => 'Aerospace', + 3 => 'Agriculture', + 4 => 'Apparel & Accessories', + 5 => 'Architecture', + 6 => 'Automotive', + 7 => 'Banking', + 8 => 'Biotechnology', + 9 => 'Building Materials & Equipment', + 10 => 'Chemical', + 11 => 'Construction', + 12 => 'Consulting', + 13 => 'Computer', + 14 => 'Culture', + 15 => 'Creative', + 16 => 'Defense', + 17 => 'Education', + 18 => 'Electronics', + 19 => 'Electric Power', + 20 => 'Energy', + 21 => 'Entertainment & Leisure', + 22 => 'Finance', + 23 => 'Food & Beverage', + 24 => 'Grocery', + 25 => 'Healthcare', + 26 => 'Hospitality', + 27 => 'Insurance', + 28 => 'Legal', + 29 => 'Manufacturing', + 30 => 'Mass Media', + 31 => 'Marketing', + 32 => 'Mining', + 33 => 'Music', + 34 => 'Publishing', + 35 => 'Petroleum', + 36 => 'Real Estate', + 37 => 'Retail', + 38 => 'Service', + 39 => 'Sports', + 40 => 'Software', + 41 => 'Support', + 42 => 'Shipping', + 43 => 'Travel', + 44 => 'Technology', + 45 => 'Telecommunications', + 46 => 'Television', + 47 => 'Transportation', + 48 => 'Testing, Inspection & Certification', + 49 => 'Venture Capital', + 50 => 'Wholesale', + 51 => 'Water' + ], + 'default' => '', + 'isSorted' => true + ], + 'sicCode' => (object) [ + 'type' => 'varchar', + 'maxLength' => 40, + 'trim' => true + ], + 'contactRole' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'disabled' => true + ], + 'contactIsInactive' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'default' => false, + 'disabled' => true + ], + 'billingAddress' => (object) [ + 'type' => 'address', + 'trim' => true + ], + 'billingAddressStreet' => (object) [ + 'type' => 'text', + 'maxLength' => 255, + 'dbType' => 'varchar' + ], + 'billingAddressCity' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'billingAddressState' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'billingAddressCountry' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'billingAddressPostalCode' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'shippingAddress' => (object) [ + 'type' => 'address', + 'view' => 'crm:views/account/fields/shipping-address' + ], + 'shippingAddressStreet' => (object) [ + 'type' => 'text', + 'maxLength' => 255, + 'dbType' => 'varchar', + 'trim' => true + ], + 'shippingAddressCity' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'shippingAddressState' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'shippingAddressCountry' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'shippingAddressPostalCode' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'campaign' => (object) [ + 'type' => 'link', + 'layoutListDisabled' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'targetLists' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'importDisabled' => true, + 'exportDisabled' => true, + 'noLoad' => true + ], + 'targetList' => (object) [ + 'type' => 'link', + 'notStorable' => true, + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'layoutFiltersDisabled' => true, + 'entity' => 'TargetList' + ], + 'originalLead' => (object) [ + 'type' => 'link', + 'layoutMassUpdateDisabled' => true, + 'layoutListDisabled' => true, + 'readOnly' => true, + 'view' => 'views/fields/link-one' + ], + 'billingAddressMap' => (object) [ + 'type' => 'map', + 'notStorable' => true, + 'readOnly' => true, + 'layoutListDisabled' => true, + 'provider' => 'Google', + 'height' => 300 + ], + 'shippingAddressMap' => (object) [ + 'type' => 'map', + 'notStorable' => true, + 'readOnly' => true, + 'layoutListDisabled' => true, + 'provider' => 'Google', + 'height' => 300 + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'contacts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Contact', + 'foreign' => 'accounts' + ], + 'opportunities' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Opportunity', + 'foreign' => 'account' + ], + 'cases' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Case', + 'foreign' => 'account' + ], + 'documents' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Document', + 'foreign' => 'accounts', + 'audited' => true + ], + 'meetingsPrimary' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Meeting', + 'foreign' => 'account', + 'layoutRelationshipsDisabled' => true + ], + 'emailsPrimary' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Email', + 'foreign' => 'account', + 'layoutRelationshipsDisabled' => true + ], + 'callsPrimary' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Call', + 'foreign' => 'account', + 'layoutRelationshipsDisabled' => true + ], + 'tasksPrimary' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Task', + 'foreign' => 'account', + 'layoutRelationshipsDisabled' => true + ], + 'meetings' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Meeting', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'calls' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Call', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'tasks' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Task', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true + ], + 'emails' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Email', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true + ], + 'campaign' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Campaign', + 'foreign' => 'accounts', + 'noJoin' => true + ], + 'campaignLogRecords' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'CampaignLogRecord', + 'foreign' => 'parent' + ], + 'targetLists' => (object) [ + 'type' => 'hasMany', + 'entity' => 'TargetList', + 'foreign' => 'accounts' + ], + 'portalUsers' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'accounts' + ], + 'originalLead' => (object) [ + 'type' => 'hasOne', + 'entity' => 'Lead', + 'foreign' => 'createdAccount' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true, + 'textFilterFields' => [ + 0 => 'name', + 1 => 'emailAddress' + ] + ], + 'indexes' => (object) [ + 'name' => (object) [ + 'columns' => [ + 0 => 'name', + 1 => 'deleted' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ] + ] + ], + 'Call' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Planned', + 1 => 'Held', + 2 => 'Not Held' + ], + 'default' => 'Planned', + 'view' => 'views/fields/enum-styled', + 'style' => (object) [ + 'Held' => 'success' + ], + 'audited' => true + ], + 'dateStart' => (object) [ + 'type' => 'datetime', + 'required' => true, + 'default' => 'javascript: return this.dateTime.getNow(15);', + 'audited' => true + ], + 'dateEnd' => (object) [ + 'type' => 'datetime', + 'required' => true, + 'after' => 'dateStart' + ], + 'duration' => (object) [ + 'type' => 'duration', + 'start' => 'dateStart', + 'end' => 'dateEnd', + 'options' => [ + 0 => 300, + 1 => 600, + 2 => 900, + 3 => 1800, + 4 => 2700, + 5 => 3600, + 6 => 7200 + ], + 'default' => 300, + 'notStorable' => true, + 'select' => 'TIMESTAMPDIFF(SECOND, call.date_start, call.date_end)', + 'orderBy' => 'duration {direction}' + ], + 'reminders' => (object) [ + 'type' => 'jsonArray', + 'notStorable' => true, + 'view' => 'crm:views/meeting/fields/reminders', + 'layoutListDisabled' => true + ], + 'direction' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Outbound', + 1 => 'Inbound' + ], + 'default' => 'Outbound' + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'parent' => (object) [ + 'type' => 'linkParent', + 'entityList' => [ + 0 => 'Account', + 1 => 'Lead', + 2 => 'Contact', + 3 => 'Opportunity', + 4 => 'Case' + ] + ], + 'account' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'acceptanceStatus' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'options' => [ + 0 => 'None', + 1 => 'Accepted', + 2 => 'Tentative', + 3 => 'Declined' + ], + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'where' => (object) [ + '=' => (object) [ + 'leftJoins' => [ + 0 => 'users', + 1 => 'contacts', + 2 => 'leads' + ], + 'sql' => 'contactsMiddle.status = {value} OR leadsMiddle.status = {value} OR usersMiddle.status = {value}', + 'distinct' => true + ], + '<>' => 'call.id NOT IN (SELECT call_id FROM call_contact WHERE deleted = 0 AND status = {value}) AND call.id NOT IN (SELECT call_id FROM call_user WHERE deleted = 0 AND status = {value}) AND call.id NOT IN (SELECT call_id FROM call_lead WHERE deleted = 0 AND status = {value})', + 'IN' => (object) [ + 'leftJoins' => [ + 0 => 'users', + 1 => 'leads', + 2 => 'contacts' + ], + 'sql' => 'contactsMiddle.status IN {value} OR leadsMiddle.status IN {value} OR usersMiddle.status IN {value}', + 'distinct' => true + ], + 'NOT IN' => 'call.id NOT IN (SELECT call_id FROM call_contact WHERE deleted = 0 AND status IN {value}) AND call.id NOT IN (SELECT call_id FROM call_user WHERE deleted = 0 AND status IN {value}) AND call.id NOT IN (SELECT call_id FROM call_lead WHERE deleted = 0 AND status IN {value})', + 'IS NULL' => (object) [ + 'leftJoins' => [ + 0 => 'users', + 1 => 'contacts', + 2 => 'leads' + ], + 'sql' => 'contactsMiddle.status IS NULL AND leadsMiddle.status IS NULL AND usersMiddle.status IS NULL', + 'distinct' => true + ], + 'IS NOT NULL' => 'call.id NOT IN (SELECT call_id FROM call_contact WHERE deleted = 0 AND status IS NULL) OR call.id NOT IN (SELECT call_id FROM call_user WHERE deleted = 0 AND status IS NULL) OR call.id NOT IN (SELECT call_id FROM call_lead WHERE deleted = 0 AND status IS NULL)' + ], + 'view' => 'crm:views/meeting/fields/acceptance-status' + ], + 'users' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'view' => 'crm:views/meeting/fields/users', + 'columns' => (object) [ + 'status' => 'acceptanceStatus' + ] + ], + 'contacts' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'view' => 'crm:views/meeting/fields/contacts', + 'columns' => (object) [ + 'status' => 'acceptanceStatus' + ] + ], + 'leads' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'view' => 'crm:views/meeting/fields/attendees', + 'columns' => (object) [ + 'status' => 'acceptanceStatus' + ] + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'required' => true, + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ] + ], + 'links' => (object) [ + 'account' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Account' + ], + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'calls', + 'additionalColumns' => (object) [ + 'status' => (object) [ + 'type' => 'varchar', + 'len' => '36', + 'default' => 'None' + ] + ] + ], + 'contacts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Contact', + 'foreign' => 'calls', + 'additionalColumns' => (object) [ + 'status' => (object) [ + 'type' => 'varchar', + 'len' => '36', + 'default' => 'None' + ] + ] + ], + 'leads' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Lead', + 'foreign' => 'calls', + 'additionalColumns' => (object) [ + 'status' => (object) [ + 'type' => 'varchar', + 'len' => '36', + 'default' => 'None' + ] + ] + ], + 'parent' => (object) [ + 'type' => 'belongsToParent', + 'foreign' => 'calls' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'dateStart', + 'asc' => false + ], + 'indexes' => (object) [ + 'dateStartStatus' => (object) [ + 'columns' => [ + 0 => 'dateStart', + 1 => 'status' + ] + ], + 'dateStart' => (object) [ + 'columns' => [ + 0 => 'dateStart', + 1 => 'deleted' + ] + ], + 'status' => (object) [ + 'columns' => [ + 0 => 'status', + 1 => 'deleted' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ], + 'assignedUserStatus' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'status' + ] + ] + ] + ], + 'Campaign' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Planning', + 1 => 'Active', + 2 => 'Inactive', + 3 => 'Complete' + ], + 'default' => 'Planning' + ], + 'type' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Email', + 1 => 'Newsletter', + 2 => 'Web', + 3 => 'Television', + 4 => 'Radio', + 5 => 'Mail' + ], + 'default' => 'Email' + ], + 'startDate' => (object) [ + 'type' => 'date' + ], + 'endDate' => (object) [ + 'type' => 'date' + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'targetLists' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'excludingTargetLists' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'sentCount' => (object) [ + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'openedCount' => (object) [ + 'view' => 'crm:views/campaign/fields/int-with-percentage', + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'clickedCount' => (object) [ + 'view' => 'crm:views/campaign/fields/int-with-percentage', + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'optedOutCount' => (object) [ + 'view' => 'crm:views/campaign/fields/int-with-percentage', + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'bouncedCount' => (object) [ + 'view' => 'crm:views/campaign/fields/int-with-percentage', + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'hardBouncedCount' => (object) [ + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'softBouncedCount' => (object) [ + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'leadCreatedCount' => (object) [ + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'openedPercentage' => (object) [ + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'clickedPercentage' => (object) [ + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'optedOutPercentage' => (object) [ + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'bouncedPercentage' => (object) [ + 'type' => 'int', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'revenue' => (object) [ + 'type' => 'currency', + 'notStorable' => true, + 'readOnly' => true, + 'disabled' => true + ], + 'budget' => (object) [ + 'type' => 'currency' + ], + 'revenueCurrency' => (object) [ + 'notStorable' => true, + 'readOnly' => true, + 'type' => 'varchar', + 'disabled' => true + ], + 'revenueConverted' => (object) [ + 'notStorable' => true, + 'readOnly' => true, + 'type' => 'currencyConverted' + ], + 'budgetCurrency' => (object) [ + 'type' => 'varchar', + 'disabled' => true + ], + 'budgetConverted' => (object) [ + 'type' => 'currencyConverted', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'targetLists' => (object) [ + 'type' => 'hasMany', + 'entity' => 'TargetList', + 'foreign' => 'campaigns' + ], + 'excludingTargetLists' => (object) [ + 'type' => 'hasMany', + 'entity' => 'TargetList', + 'foreign' => 'campaignsExcluding', + 'relationName' => 'campaignTargetListExcluding' + ], + 'accounts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Account', + 'foreign' => 'campaign' + ], + 'contacts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Contact', + 'foreign' => 'campaign' + ], + 'leads' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Lead', + 'foreign' => 'campaign' + ], + 'opportunities' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Opportunity', + 'foreign' => 'campaign' + ], + 'campaignLogRecords' => (object) [ + 'type' => 'hasMany', + 'entity' => 'CampaignLogRecord', + 'foreign' => 'campaign' + ], + 'trackingUrls' => (object) [ + 'type' => 'hasMany', + 'entity' => 'CampaignTrackingUrl', + 'foreign' => 'campaign' + ], + 'massEmails' => (object) [ + 'type' => 'hasMany', + 'entity' => 'MassEmail', + 'foreign' => 'campaign', + 'layoutRelationshipsDisabled' => true + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ], + 'indexes' => (object) [ + 'createdAt' => (object) [ + 'columns' => [ + 0 => 'createdAt', + 1 => 'deleted' + ] + ] + ] + ], + 'CampaignLogRecord' => (object) [ + 'fields' => (object) [ + 'action' => (object) [ + 'type' => 'enum', + 'required' => true, + 'maxLength' => 50, + 'options' => [ + 0 => 'Sent', + 1 => 'Opened', + 2 => 'Opted Out', + 3 => 'Bounced', + 4 => 'Clicked', + 5 => 'Lead Created' + ] + ], + 'actionDate' => (object) [ + 'type' => 'datetime', + 'required' => true + ], + 'data' => (object) [ + 'type' => 'jsonObject', + 'view' => 'crm:views/campaign-log-record/fields/data' + ], + 'stringData' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100 + ], + 'stringAdditionalData' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100 + ], + 'application' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'maxLength' => 36, + 'default' => 'Espo' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'campaign' => (object) [ + 'type' => 'link' + ], + 'parent' => (object) [ + 'type' => 'linkParent' + ], + 'object' => (object) [ + 'type' => 'linkParent' + ], + 'queueItem' => (object) [ + 'type' => 'link' + ], + 'isTest' => (object) [ + 'type' => 'bool', + 'default' => false + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'campaign' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Campaign', + 'foreign' => 'campaignLogRecords' + ], + 'queueItem' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'EmailQueueItem', + 'noJoin' => true + ], + 'parent' => (object) [ + 'type' => 'belongsToParent', + 'entityList' => [ + 0 => 'Account', + 1 => 'Contact', + 2 => 'Lead', + 3 => 'Opportunity', + 4 => 'User' + ] + ], + 'object' => (object) [ + 'type' => 'belongsToParent', + 'entityList' => [ + 0 => 'Email', + 1 => 'CampaignTrackingUrl' + ] + ] + ], + 'collection' => (object) [ + 'sortBy' => 'actionDate', + 'asc' => false + ], + 'indexes' => (object) [ + 'actionDate' => (object) [ + 'columns' => [ + 0 => 'actionDate', + 1 => 'deleted' + ] + ], + 'action' => (object) [ + 'columns' => [ + 0 => 'action', + 1 => 'deleted' + ] + ] + ] + ], + 'CampaignTrackingUrl' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'url' => (object) [ + 'type' => 'url', + 'required' => true + ], + 'urlToUse' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'readOnly' => true + ], + 'campaign' => (object) [ + 'type' => 'link', + 'required' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'campaign' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Campaign', + 'foreign' => 'trackingUrls' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true + ] + ], + 'Case' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'number' => (object) [ + 'type' => 'autoincrement', + 'index' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'New', + 1 => 'Assigned', + 2 => 'Pending', + 3 => 'Closed', + 4 => 'Rejected', + 5 => 'Duplicate' + ], + 'default' => 'New', + 'view' => 'views/fields/enum-styled', + 'style' => (object) [ + 'Closed' => 'success', + 'Duplicate' => 'danger', + 'Rejected' => 'danger' + ], + 'audited' => true + ], + 'priority' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Low', + 1 => 'Normal', + 2 => 'High', + 3 => 'Urgent' + ], + 'default' => 'Normal', + 'audited' => true + ], + 'type' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Question', + 2 => 'Incident', + 3 => 'Problem' + ], + 'default' => '', + 'audited' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'account' => (object) [ + 'type' => 'link' + ], + 'lead' => (object) [ + 'type' => 'link' + ], + 'contact' => (object) [ + 'type' => 'link', + 'view' => 'crm:views/case/fields/contact' + ], + 'contacts' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'crm:views/case/fields/contacts' + ], + 'inboundEmail' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'attachments' => (object) [ + 'type' => 'attachmentMultiple', + 'layoutListDisabled' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'inboundEmail' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'InboundEmail' + ], + 'account' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Account', + 'foreign' => 'cases' + ], + 'lead' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Lead', + 'foreign' => 'cases' + ], + 'contact' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Contact', + 'foreign' => 'casesPrimary' + ], + 'contacts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Contact', + 'foreign' => 'cases', + 'layoutRelationshipsDisabled' => true + ], + 'meetings' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Meeting', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'calls' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Call', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'tasks' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Task', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'emails' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Email', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true + ], + 'articles' => (object) [ + 'type' => 'hasMany', + 'entity' => 'KnowledgeBaseArticle', + 'foreign' => 'cases', + 'audited' => true + ] + ], + 'collection' => (object) [ + 'sortBy' => 'number', + 'asc' => false + ], + 'indexes' => (object) [ + 'status' => (object) [ + 'columns' => [ + 0 => 'status', + 1 => 'deleted' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ], + 'assignedUserStatus' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'status' + ] + ] + ] + ], + 'Contact' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'personName' + ], + 'salutationName' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Mr.', + 2 => 'Ms.', + 3 => 'Mrs.', + 4 => 'Dr.' + ] + ], + 'firstName' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'maxLength' => 100, + 'default' => '' + ], + 'lastName' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'maxLength' => 100, + 'required' => true, + 'default' => '' + ], + 'accountId' => (object) [ + 'type' => 'varchar', + 'where' => (object) [ + '=' => 'contact.id IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND account_id = {value})', + '<>' => 'contact.id NOT IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND account_id = {value})', + 'IN' => 'contact.id IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND account_id IN {value})', + 'NOT IN' => 'contact.id NOT IN (SELECT contact_id FROM account_contact WHERE deleted = 0 AND account_id IN {value})', + 'IS NULL' => 'contact.account_id IS NULL', + 'IS NOT NULL' => 'contact.account_id IS NOT NULL' + ], + 'disabled' => true + ], + 'title' => (object) [ + 'type' => 'varchar', + 'maxLength' => 50, + 'notStorable' => true, + 'select' => 'accountContact.role', + 'orderBy' => 'accountContact.role {direction}', + 'where' => (object) [ + 'LIKE' => (object) [ + 'leftJoins' => [ + 0 => 'accounts' + ], + 'sql' => 'accountsMiddle.role LIKE {value}', + 'distinct' => true + ], + '=' => (object) [ + 'leftJoins' => [ + 0 => 'accounts' + ], + 'sql' => 'accountsMiddle.role = {value}', + 'distinct' => true + ], + '<>' => (object) [ + 'leftJoins' => [ + 0 => 'accounts' + ], + 'sql' => 'accountsMiddle.role <> {value}', + 'distinct' => true + ], + 'IS NULL' => (object) [ + 'leftJoins' => [ + 0 => 'accounts' + ], + 'sql' => 'accountsMiddle.role IS NULL', + 'distinct' => true + ], + 'IS NOT NULL' => (object) [ + 'leftJoins' => [ + 0 => 'accounts' + ], + 'sql' => 'accountsMiddle.role IS NOT NULL', + 'distinct' => true + ] + ], + 'trim' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'emailAddress' => (object) [ + 'type' => 'email' + ], + 'phoneNumber' => (object) [ + 'type' => 'phone', + 'typeList' => [ + 0 => 'Mobile', + 1 => 'Office', + 2 => 'Home', + 3 => 'Fax', + 4 => 'Other' + ], + 'defaultType' => 'Mobile' + ], + 'doNotCall' => (object) [ + 'type' => 'bool' + ], + 'address' => (object) [ + 'type' => 'address' + ], + 'addressStreet' => (object) [ + 'type' => 'text', + 'maxLength' => 255, + 'dbType' => 'varchar' + ], + 'addressCity' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressState' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressCountry' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressPostalCode' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'account' => (object) [ + 'type' => 'link', + 'view' => 'crm:views/contact/fields/account' + ], + 'accounts' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'crm:views/contact/fields/accounts', + 'columns' => (object) [ + 'role' => 'contactRole', + 'isInactive' => 'contactIsInactive' + ] + ], + 'accountRole' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'layoutFiltersDisabled' => true, + 'exportDisabled' => true, + 'importDisabled' => true, + 'view' => 'crm:views/contact/fields/account-role' + ], + 'accountIsInactive' => (object) [ + 'type' => 'bool', + 'notStorable' => true, + 'select' => 'accountContact.is_inactive', + 'orderBy' => 'accountContact.is_inactive {direction}', + 'where' => (object) [ + '=' => (object) [ + 'leftJoins' => [ + 0 => 'accounts' + ], + 'sql' => 'accountsMiddle.is_inactive = {value}', + 'distinct' => true + ], + '<>' => (object) [ + 'leftJoins' => [ + 0 => 'accounts' + ], + 'sql' => 'accountsMiddle.is_inactive <> {value}', + 'distinct' => true + ] + ], + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true + ], + 'accountType' => (object) [ + 'type' => 'foreign', + 'link' => 'account', + 'field' => 'type', + 'readOnly' => true, + 'view' => 'views/fields/foreign-enum' + ], + 'opportunityRole' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'options' => [ + 0 => '', + 1 => 'Decision Maker', + 2 => 'Evaluator', + 3 => 'Influencer' + ], + 'layoutMassUpdateDisabled' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'where' => (object) [ + '=' => (object) [ + 'leftJoins' => [ + 0 => 'opportunities' + ], + 'sql' => 'opportunitiesMiddle.role = {value}', + 'distinct' => true + ], + '<>' => 'contact.id NOT IN (SELECT contact_id FROM contact_opportunity WHERE deleted = 0 AND role = {value})', + 'IN' => (object) [ + 'leftJoins' => [ + 0 => 'opportunities' + ], + 'sql' => 'opportunitiesMiddle.role IN {value}', + 'distinct' => true + ], + 'NOT IN' => 'contact.id NOT IN (SELECT contact_id FROM contact_opportunity WHERE deleted = 0 AND role IN {value})', + 'LIKE' => (object) [ + 'leftJoins' => [ + 0 => 'opportunities' + ], + 'sql' => 'opportunitiesMiddle.role LIKE {value}', + 'distinct' => true + ], + 'IS NULL' => (object) [ + 'leftJoins' => [ + 0 => 'opportunities' + ], + 'sql' => 'opportunitiesMiddle.role IS NULL', + 'distinct' => true + ], + 'IS NOT NULL' => 'contact.id NOT IN (SELECT contact_id FROM contact_opportunity WHERE deleted = 0 AND role IS NULL)' + ], + 'view' => 'crm:views/contact/fields/opportunity-role' + ], + 'acceptanceStatus' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'exportDisabled' => true, + 'disabled' => true + ], + 'acceptanceStatusMeetings' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'exportDisabled' => true, + 'view' => 'crm:views/lead/fields/acceptance-status', + 'link' => 'meetings', + 'column' => 'status' + ], + 'acceptanceStatusCalls' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'exportDisabled' => true, + 'view' => 'crm:views/lead/fields/acceptance-status', + 'link' => 'calls', + 'column' => 'status' + ], + 'campaign' => (object) [ + 'type' => 'link', + 'layoutListDisabled' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'targetLists' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'importDisabled' => true, + 'noLoad' => true + ], + 'targetList' => (object) [ + 'type' => 'link', + 'notStorable' => true, + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'layoutFiltersDisabled' => true, + 'exportDisabled' => true, + 'entity' => 'TargetList' + ], + 'portalUser' => (object) [ + 'type' => 'link', + 'layoutMassUpdateDisabled' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'readOnly' => true, + 'notStorable' => true, + 'view' => 'views/fields/link-one' + ], + 'originalLead' => (object) [ + 'type' => 'link', + 'layoutMassUpdateDisabled' => true, + 'layoutListDisabled' => true, + 'readOnly' => true, + 'view' => 'views/fields/link-one' + ], + 'addressMap' => (object) [ + 'type' => 'map', + 'notStorable' => true, + 'readOnly' => true, + 'layoutListDisabled' => true, + 'provider' => 'Google', + 'height' => 300 + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'account' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Account' + ], + 'accounts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Account', + 'foreign' => 'contacts', + 'additionalColumns' => (object) [ + 'role' => (object) [ + 'type' => 'varchar', + 'len' => 50 + ], + 'isInactive' => (object) [ + 'type' => 'bool', + 'default' => false + ] + ], + 'layoutRelationshipsDisabled' => true + ], + 'opportunities' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Opportunity', + 'foreign' => 'contacts' + ], + 'casesPrimary' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Case', + 'foreign' => 'contact', + 'layoutRelationshipsDisabled' => true + ], + 'cases' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Case', + 'foreign' => 'contacts' + ], + 'meetings' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Meeting', + 'foreign' => 'contacts', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'calls' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Call', + 'foreign' => 'contacts', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'tasks' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Task', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'emails' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Email', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true + ], + 'campaign' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Campaign', + 'foreign' => 'contacts', + 'noJoin' => true + ], + 'campaignLogRecords' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'CampaignLogRecord', + 'foreign' => 'parent' + ], + 'targetLists' => (object) [ + 'type' => 'hasMany', + 'entity' => 'TargetList', + 'foreign' => 'contacts' + ], + 'portalUser' => (object) [ + 'type' => 'hasOne', + 'entity' => 'User', + 'foreign' => 'contact' + ], + 'originalLead' => (object) [ + 'type' => 'hasOne', + 'entity' => 'Lead', + 'foreign' => 'createdContact' + ], + 'documents' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Document', + 'foreign' => 'contacts', + 'audited' => true + ], + 'tasksPrimary' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Task', + 'foreign' => 'contact', + 'layoutRelationshipsDisabled' => true + ] + ], + 'collection' => (object) [ + 'sortBy' => 'name', + 'asc' => true, + 'textFilterFields' => [ + 0 => 'name', + 1 => 'emailAddress' + ] + ], + 'indexes' => (object) [ + 'firstName' => (object) [ + 'columns' => [ + 0 => 'firstName', + 1 => 'deleted' + ] + ], + 'name' => (object) [ + 'columns' => [ + 0 => 'firstName', + 1 => 'lastName' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ] + ] + ], + 'Document' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'view' => 'crm:views/document/fields/name', + 'trim' => true + ], + 'file' => (object) [ + 'type' => 'file', + 'required' => true, + 'view' => 'crm:views/document/fields/file' + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Active', + 1 => 'Draft', + 2 => 'Expired', + 3 => 'Canceled' + ], + 'view' => 'views/fields/enum-styled', + 'style' => (object) [ + 'Canceled' => 'danger', + 'Expired' => 'danger' + ] + ], + 'type' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Contract', + 2 => 'NDA', + 3 => 'EULA', + 4 => 'License Agreement' + ] + ], + 'publishDate' => (object) [ + 'type' => 'date', + 'required' => true, + 'default' => 'javascript: return this.dateTime.getToday();' + ], + 'expirationDate' => (object) [ + 'type' => 'date', + 'after' => 'publishDate' + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'accounts' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'importDisabled' => true, + 'noLoad' => true + ], + 'folder' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/link-category-tree' + ] + ], + 'links' => (object) [ + 'accounts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Account', + 'foreign' => 'documents' + ], + 'opportunities' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Opportunity', + 'foreign' => 'documents' + ], + 'leads' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Lead', + 'foreign' => 'documents' + ], + 'contacts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Contact', + 'foreign' => 'documents' + ], + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'folder' => (object) [ + 'type' => 'belongsTo', + 'foreign' => 'documents', + 'entity' => 'DocumentFolder' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ] + ], + 'DocumentFolder' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'parent' => (object) [ + 'type' => 'link' + ], + 'childList' => (object) [ + 'type' => 'jsonArray', + 'notStorable' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'parent' => (object) [ + 'type' => 'belongsTo', + 'foreign' => 'children', + 'entity' => 'DocumentFolder' + ], + 'children' => (object) [ + 'type' => 'hasMany', + 'foreign' => 'parent', + 'entity' => 'DocumentFolder' + ], + 'documents' => (object) [ + 'type' => 'hasMany', + 'foreign' => 'folder', + 'entity' => 'Document' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'parent', + 'asc' => true + ], + 'additionalTables' => (object) [ + 'DocumentFolderPath' => (object) [ + 'fields' => (object) [ + 'id' => (object) [ + 'type' => 'id', + 'dbType' => 'int', + 'len' => '11', + 'autoincrement' => true, + 'unique' => true + ], + 'ascendorId' => (object) [ + 'type' => 'varchar', + 'len' => '100', + 'index' => true + ], + 'descendorId' => (object) [ + 'type' => 'varchar', + 'len' => '24', + 'index' => true + ] + ] + ] + ] + ], + 'EmailQueueItem' => (object) [ + 'fields' => (object) [ + 'massEmail' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Pending', + 1 => 'Sent', + 2 => 'Failed', + 3 => 'Sending' + ], + 'readOnly' => true + ], + 'attemptCount' => (object) [ + 'type' => 'int', + 'readOnly' => true, + 'default' => 0 + ], + 'target' => (object) [ + 'type' => 'linkParent', + 'readOnly' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'sentAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'emailAddress' => (object) [ + 'type' => 'varchar', + 'readOnly' => true + ], + 'isTest' => (object) [ + 'type' => 'bool' + ] + ], + 'links' => (object) [ + 'massEmail' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'MassEmail', + 'foreign' => 'queueItems' + ], + 'target' => (object) [ + 'type' => 'belongsToParent' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ] + ], + 'KnowledgeBaseArticle' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Draft', + 1 => 'In Review', + 2 => 'Published', + 3 => 'Archived' + ], + 'view' => 'crm:views/knowledge-base-article/fields/status', + 'default' => 'Draft' + ], + 'language' => (object) [ + 'type' => 'enum', + 'view' => 'crm:views/knowledge-base-article/fields/language', + 'default' => '' + ], + 'type' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Article' + ] + ], + 'portals' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'publishDate' => (object) [ + 'type' => 'date' + ], + 'expirationDate' => (object) [ + 'type' => 'date', + 'after' => 'publishDate' + ], + 'order' => (object) [ + 'type' => 'int', + 'disableFormatting' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'categories' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/link-multiple-category-tree' + ], + 'attachments' => (object) [ + 'type' => 'attachmentMultiple' + ], + 'body' => (object) [ + 'type' => 'wysiwyg' + ] + ], + 'links' => (object) [ + 'cases' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Case', + 'foreign' => 'articles' + ], + 'portals' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Portal', + 'foreign' => 'articles' + ], + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'categories' => (object) [ + 'type' => 'hasMany', + 'foreign' => 'articles', + 'entity' => 'KnowledgeBaseCategory' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'order', + 'asc' => true + ] + ], + 'KnowledgeBaseCategory' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'order' => (object) [ + 'type' => 'int', + 'required' => true, + 'disableFormatting' => true + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'parent' => (object) [ + 'type' => 'link' + ], + 'childList' => (object) [ + 'type' => 'jsonArray', + 'notStorable' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'parent' => (object) [ + 'type' => 'belongsTo', + 'foreign' => 'children', + 'entity' => 'KnowledgeBaseCategory' + ], + 'children' => (object) [ + 'type' => 'hasMany', + 'foreign' => 'parent', + 'entity' => 'KnowledgeBaseCategory' + ], + 'articles' => (object) [ + 'type' => 'hasMany', + 'foreign' => 'categories', + 'entity' => 'KnowledgeBaseArticle' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'parent', + 'sortByByColumn' => 'parentId', + 'asc' => true + ], + 'additionalTables' => (object) [ + 'KnowledgeBaseCategoryPath' => (object) [ + 'fields' => (object) [ + 'id' => (object) [ + 'type' => 'id', + 'dbType' => 'int', + 'len' => '11', + 'autoincrement' => true, + 'unique' => true + ], + 'ascendorId' => (object) [ + 'type' => 'varchar', + 'len' => '100', + 'index' => true + ], + 'descendorId' => (object) [ + 'type' => 'varchar', + 'len' => '24', + 'index' => true + ] + ] + ] + ] + ], + 'Lead' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'personName' + ], + 'salutationName' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Mr.', + 2 => 'Ms.', + 3 => 'Mrs.', + 4 => 'Dr.' + ] + ], + 'firstName' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'maxLength' => 100, + 'default' => '' + ], + 'lastName' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'maxLength' => 100, + 'default' => '' + ], + 'title' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100 + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'New', + 1 => 'Assigned', + 2 => 'In Process', + 3 => 'Converted', + 4 => 'Recycled', + 5 => 'Dead' + ], + 'default' => 'New', + 'view' => 'views/fields/enum-styled', + 'style' => (object) [ + 'Converted' => 'success', + 'Recycled' => 'danger', + 'Dead' => 'danger' + ], + 'audited' => true + ], + 'source' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Call', + 2 => 'Email', + 3 => 'Existing Customer', + 4 => 'Partner', + 5 => 'Public Relations', + 6 => 'Web Site', + 7 => 'Campaign', + 8 => 'Other' + ], + 'default' => '' + ], + 'industry' => (object) [ + 'type' => 'enum', + 'view' => 'crm:views/lead/fields/industry', + 'customizationOptionsDisabled' => true, + 'default' => '', + 'isSorted' => true + ], + 'opportunityAmount' => (object) [ + 'type' => 'currency', + 'audited' => true + ], + 'opportunityAmountConverted' => (object) [ + 'type' => 'currencyConverted', + 'readOnly' => true + ], + 'website' => (object) [ + 'type' => 'url' + ], + 'address' => (object) [ + 'type' => 'address' + ], + 'addressStreet' => (object) [ + 'type' => 'text', + 'maxLength' => 255, + 'dbType' => 'varchar' + ], + 'addressCity' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressState' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressCountry' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressPostalCode' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'emailAddress' => (object) [ + 'type' => 'email' + ], + 'phoneNumber' => (object) [ + 'type' => 'phone', + 'typeList' => [ + 0 => 'Mobile', + 1 => 'Office', + 2 => 'Home', + 3 => 'Fax', + 4 => 'Other' + ], + 'defaultType' => 'Mobile' + ], + 'doNotCall' => (object) [ + 'type' => 'bool' + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'accountName' => (object) [ + 'type' => 'varchar' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'acceptanceStatus' => (object) [ + 'type' => 'varchar', + 'notStorable' => true, + 'exportDisabled' => true, + 'disabled' => true + ], + 'acceptanceStatusMeetings' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'exportDisabled' => true, + 'view' => 'crm:views/lead/fields/acceptance-status', + 'link' => 'meetings', + 'column' => 'status' + ], + 'acceptanceStatusCalls' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'exportDisabled' => true, + 'view' => 'crm:views/lead/fields/acceptance-status', + 'link' => 'calls', + 'column' => 'status' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'campaign' => (object) [ + 'type' => 'link', + 'layoutListDisabled' => true + ], + 'createdAccount' => (object) [ + 'type' => 'link', + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true + ], + 'createdContact' => (object) [ + 'type' => 'link', + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'view' => 'crm:views/lead/fields/created-contact' + ], + 'createdOpportunity' => (object) [ + 'type' => 'link', + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'view' => 'crm:views/lead/fields/created-opportunity' + ], + 'targetLists' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'importDisabled' => true, + 'noLoad' => true + ], + 'targetList' => (object) [ + 'type' => 'link', + 'notStorable' => true, + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'layoutFiltersDisabled' => true, + 'entity' => 'TargetList' + ], + 'opportunityAmountCurrency' => (object) [ + 'type' => 'varchar', + 'disabled' => true + ], + 'addressMap' => (object) [ + 'type' => 'map', + 'notStorable' => true, + 'readOnly' => true, + 'layoutListDisabled' => true, + 'provider' => 'Google', + 'height' => 300 + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'meetings' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Meeting', + 'foreign' => 'leads', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'calls' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Call', + 'foreign' => 'leads', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'tasks' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Task', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'cases' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Case', + 'foreign' => 'lead', + 'audited' => true + ], + 'emails' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Email', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true + ], + 'createdAccount' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Account', + 'noJoin' => true, + 'foreign' => 'originalLead' + ], + 'createdContact' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Contact', + 'noJoin' => true, + 'foreign' => 'originalLead' + ], + 'createdOpportunity' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Opportunity', + 'noJoin' => true, + 'foreign' => 'originalLead' + ], + 'campaign' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Campaign', + 'foreign' => 'leads', + 'noJoin' => true + ], + 'campaignLogRecords' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'CampaignLogRecord', + 'foreign' => 'parent' + ], + 'targetLists' => (object) [ + 'type' => 'hasMany', + 'entity' => 'TargetList', + 'foreign' => 'leads' + ], + 'documents' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Document', + 'foreign' => 'leads', + 'audited' => true + ] + ], + 'convertEntityList' => [ + 0 => 'Account', + 1 => 'Contact', + 2 => 'Opportunity' + ], + 'convertFields' => (object) [ + 'Contact' => (object) [ + + ], + 'Account' => (object) [ + 'name' => 'accountName', + 'billingAddressStreet' => 'addressStreet', + 'billingAddressCity' => 'addressCity', + 'billingAddressState' => 'addressState', + 'billingAddressPostalCode' => 'addressPostalCode', + 'billingAddressCountry' => 'addressCountry' + ], + 'Opportunity' => (object) [ + 'amount' => 'opportunityAmount', + 'leadSource' => 'source' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false, + 'textFilterFields' => [ + 0 => 'name', + 1 => 'accountName', + 2 => 'emailAddress' + ] + ], + 'indexes' => (object) [ + 'firstName' => (object) [ + 'columns' => [ + 0 => 'firstName', + 1 => 'deleted' + ] + ], + 'name' => (object) [ + 'columns' => [ + 0 => 'firstName', + 1 => 'lastName' + ] + ], + 'status' => (object) [ + 'columns' => [ + 0 => 'status', + 1 => 'deleted' + ] + ], + 'createdAt' => (object) [ + 'columns' => [ + 0 => 'createdAt', + 1 => 'deleted' + ] + ], + 'createdAtStatus' => (object) [ + 'columns' => [ + 0 => 'createdAt', + 1 => 'status' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ], + 'assignedUserStatus' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'status' + ] + ] + ] + ], + 'MassEmail' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Draft', + 1 => 'Pending', + 2 => 'Complete', + 3 => 'In Process', + 4 => 'Failed' + ], + 'default' => 'Pending' + ], + 'storeSentEmails' => (object) [ + 'type' => 'bool', + 'default' => false, + 'tooltip' => true + ], + 'optOutEntirely' => (object) [ + 'type' => 'bool', + 'default' => false, + 'tooltip' => true + ], + 'fromAddress' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'view' => 'crm:views/mass-email/fields/from-address' + ], + 'fromName' => (object) [ + 'type' => 'varchar' + ], + 'replyToAddress' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'replyToName' => (object) [ + 'type' => 'varchar' + ], + 'startAt' => (object) [ + 'type' => 'datetime', + 'required' => true + ], + 'emailTemplate' => (object) [ + 'type' => 'link', + 'required' => true, + 'view' => 'crm:views/mass-email/fields/email-template' + ], + 'campaign' => (object) [ + 'type' => 'link' + ], + 'targetLists' => (object) [ + 'type' => 'linkMultiple', + 'required' => true, + 'tooltip' => true + ], + 'excludingTargetLists' => (object) [ + 'type' => 'linkMultiple', + 'tooltip' => true + ], + 'inboundEmail' => (object) [ + 'type' => 'link' + ], + 'smtpAccount' => (object) [ + 'type' => 'base', + 'notStorable' => true, + 'view' => 'crm:views/mass-email/fields/smtp-account' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'emailTemplate' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'EmailTemplate' + ], + 'campaign' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Campaign', + 'foreign' => 'massEmails' + ], + 'targetLists' => (object) [ + 'type' => 'hasMany', + 'entity' => 'TargetList', + 'foreign' => 'massEmails' + ], + 'excludingTargetLists' => (object) [ + 'type' => 'hasMany', + 'entity' => 'TargetList', + 'foreign' => 'massEmailsExcluding', + 'relationName' => 'massEmailTargetListExcluding' + ], + 'inboundEmail' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'InboundEmail' + ], + 'queueItems' => (object) [ + 'type' => 'hasMany', + 'entity' => 'EmailQueueItem', + 'foreign' => 'massEmail' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ] + ], + 'Meeting' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Planned', + 1 => 'Held', + 2 => 'Not Held' + ], + 'default' => 'Planned', + 'view' => 'views/fields/enum-styled', + 'style' => (object) [ + 'Held' => 'success' + ], + 'audited' => true + ], + 'dateStart' => (object) [ + 'type' => 'datetime', + 'required' => true, + 'default' => 'javascript: return this.dateTime.getNow(15);', + 'audited' => true + ], + 'dateEnd' => (object) [ + 'type' => 'datetime', + 'required' => true, + 'after' => 'dateStart' + ], + 'duration' => (object) [ + 'type' => 'duration', + 'start' => 'dateStart', + 'end' => 'dateEnd', + 'options' => [ + 0 => 900, + 1 => 1800, + 2 => 3600, + 3 => 7200, + 4 => 10800, + 5 => 86400 + ], + 'default' => 3600, + 'notStorable' => true, + 'select' => 'TIMESTAMPDIFF(SECOND, meeting.date_start, meeting.date_end)', + 'orderBy' => 'duration {direction}' + ], + 'reminders' => (object) [ + 'type' => 'jsonArray', + 'notStorable' => true, + 'view' => 'crm:views/meeting/fields/reminders', + 'layoutListDisabled' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'parent' => (object) [ + 'type' => 'linkParent', + 'entityList' => [ + 0 => 'Account', + 1 => 'Lead', + 2 => 'Contact', + 3 => 'Opportunity', + 4 => 'Case' + ] + ], + 'account' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'acceptanceStatus' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'options' => [ + 0 => 'None', + 1 => 'Accepted', + 2 => 'Tentative', + 3 => 'Declined' + ], + 'layoutDetailDisabled' => true, + 'layoutMassUpdateDisabled' => true, + 'where' => (object) [ + '=' => (object) [ + 'leftJoins' => [ + 0 => 'users', + 1 => 'contacts', + 2 => 'leads' + ], + 'sql' => 'contactsMiddle.status = {value} OR leadsMiddle.status = {value} OR usersMiddle.status = {value}', + 'distinct' => true + ], + '<>' => 'meeting.id NOT IN (SELECT meeting_id FROM contact_meeting WHERE deleted = 0 AND status = {value}) AND meeting.id NOT IN (SELECT meeting_id FROM meeting_user WHERE deleted = 0 AND status = {value}) AND meeting.id NOT IN (SELECT meeting_id FROM lead_meeting WHERE deleted = 0 AND status = {value})', + 'IN' => (object) [ + 'leftJoins' => [ + 0 => 'users', + 1 => 'leads', + 2 => 'contacts' + ], + 'sql' => 'contactsMiddle.status IN {value} OR leadsMiddle.status IN {value} OR usersMiddle.status IN {value}', + 'distinct' => true + ], + 'NOT IN' => 'meeting.id NOT IN (SELECT meeting_id FROM contact_meeting WHERE deleted = 0 AND status IN {value}) AND meeting.id NOT IN (SELECT meeting_id FROM meeting_user WHERE deleted = 0 AND status IN {value}) AND meeting.id NOT IN (SELECT meeting_id FROM lead_meeting WHERE deleted = 0 AND status IN {value})', + 'IS NULL' => (object) [ + 'leftJoins' => [ + 0 => 'users', + 1 => 'contacts', + 2 => 'leads' + ], + 'sql' => 'contactsMiddle.status IS NULL AND leadsMiddle.status IS NULL AND usersMiddle.status IS NULL', + 'distinct' => true + ], + 'IS NOT NULL' => 'meeting.id NOT IN (SELECT meeting_id FROM contact_meeting WHERE deleted = 0 AND status IS NULL) OR meeting.id NOT IN (SELECT meeting_id FROM meeting_user WHERE deleted = 0 AND status IS NULL) OR meeting.id NOT IN (SELECT meeting_id FROM lead_meeting WHERE deleted = 0 AND status IS NULL)' + ], + 'view' => 'crm:views/meeting/fields/acceptance-status' + ], + 'users' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'crm:views/meeting/fields/users', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'columns' => (object) [ + 'status' => 'acceptanceStatus' + ] + ], + 'contacts' => (object) [ + 'type' => 'linkMultiple', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'view' => 'crm:views/meeting/fields/contacts', + 'columns' => (object) [ + 'status' => 'acceptanceStatus' + ] + ], + 'leads' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'crm:views/meeting/fields/attendees', + 'layoutDetailDisabled' => true, + 'layoutListDisabled' => true, + 'columns' => (object) [ + 'status' => 'acceptanceStatus' + ] + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'required' => true, + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ] + ], + 'links' => (object) [ + 'account' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Account' + ], + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'meetings', + 'additionalColumns' => (object) [ + 'status' => (object) [ + 'type' => 'varchar', + 'len' => '36', + 'default' => 'None' + ] + ] + ], + 'contacts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Contact', + 'foreign' => 'meetings', + 'additionalColumns' => (object) [ + 'status' => (object) [ + 'type' => 'varchar', + 'len' => '36', + 'default' => 'None' + ] + ] + ], + 'leads' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Lead', + 'foreign' => 'meetings', + 'additionalColumns' => (object) [ + 'status' => (object) [ + 'type' => 'varchar', + 'len' => '36', + 'default' => 'None' + ] + ] + ], + 'parent' => (object) [ + 'type' => 'belongsToParent', + 'foreign' => 'meetings' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'dateStart', + 'asc' => false + ], + 'indexes' => (object) [ + 'dateStartStatus' => (object) [ + 'columns' => [ + 0 => 'dateStart', + 1 => 'status' + ] + ], + 'dateStart' => (object) [ + 'columns' => [ + 0 => 'dateStart', + 1 => 'deleted' + ] + ], + 'status' => (object) [ + 'columns' => [ + 0 => 'status', + 1 => 'deleted' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ], + 'assignedUserStatus' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'status' + ] + ] + ] + ], + 'Opportunity' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'amount' => (object) [ + 'type' => 'currency', + 'required' => true, + 'audited' => true + ], + 'amountConverted' => (object) [ + 'type' => 'currencyConverted', + 'readOnly' => true + ], + 'amountWeightedConverted' => (object) [ + 'type' => 'float', + 'readOnly' => true, + 'notStorable' => true, + 'select' => 'opportunity.amount * amount_currency_alias.rate * opportunity.probability / 100', + 'where' => (object) [ + '=' => '(opportunity.amount * amount_currency_alias.rate * opportunity.probability / 100) = {value}', + '<' => '(opportunity.amount * amount_currency_alias.rate * opportunity.probability / 100) < {value}', + '>' => '(opportunity.amount * amount_currency_alias.rate * opportunity.probability / 100) > {value}', + '<=' => '(opportunity.amount * amount_currency_alias.rate * opportunity.probability / 100) <= {value}', + '>=' => '(opportunity.amount * amount_currency_alias.rate * opportunity.probability / 100) >= {value}', + '<>' => '(opportunity.amount * amount_currency_alias.rate * opportunity.probability / 100) <> {value}' + ], + 'orderBy' => 'amountWeightedConverted {direction}', + 'view' => 'views/fields/currency-converted' + ], + 'account' => (object) [ + 'type' => 'link' + ], + 'contacts' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'crm:views/opportunity/fields/contacts', + 'columns' => (object) [ + 'role' => 'opportunityRole' + ] + ], + 'stage' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Prospecting', + 1 => 'Qualification', + 2 => 'Proposal', + 3 => 'Negotiation', + 4 => 'Closed Won', + 5 => 'Closed Lost' + ], + 'view' => 'crm:views/opportunity/fields/stage', + 'default' => 'Prospecting', + 'audited' => true, + 'probabilityMap' => (object) [ + 'Prospecting' => 10, + 'Qualification' => 20, + 'Proposal' => 50, + 'Negotiation' => 80, + 'Closed Won' => 100, + 'Closed Lost' => 0 + ], + 'fieldManagerAdditionalParamList' => [ + 0 => (object) [ + 'name' => 'probabilityMap', + 'view' => 'crm:views/opportunity/admin/field-manager/fields/probability-map' + ] + ] + ], + 'probability' => (object) [ + 'type' => 'int', + 'required' => true, + 'min' => 0, + 'max' => 100 + ], + 'leadSource' => (object) [ + 'type' => 'enum', + 'view' => 'crm:views/opportunity/fields/lead-source', + 'customizationOptionsDisabled' => true, + 'default' => '' + ], + 'closeDate' => (object) [ + 'type' => 'date', + 'required' => true, + 'audited' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'campaign' => (object) [ + 'type' => 'link' + ], + 'originalLead' => (object) [ + 'type' => 'link', + 'layoutMassUpdateDisabled' => true, + 'layoutListDisabled' => true, + 'readOnly' => true, + 'view' => 'views/fields/link-one' + ], + 'contactRole' => (object) [ + 'type' => 'enum', + 'notStorable' => true, + 'layoutMassUpdateDisabled' => true, + 'layoutListDisabled' => true, + 'layoutDetailDisabled' => true, + 'where' => (object) [ + '=' => (object) [ + 'leftJoins' => [ + 0 => 'contacts' + ], + 'sql' => 'contactsMiddle.role = {value}', + 'distinct' => true + ], + '<>' => 'opportunity.id NOT IN (SELECT opportunity_id FROM contact_opportunity WHERE deleted = 0 AND role = {value})', + 'IN' => (object) [ + 'leftJoins' => [ + 0 => 'contacts' + ], + 'sql' => 'contactsMiddle.role IN {value}', + 'distinct' => true + ], + 'NOT IN' => 'opportunity.id NOT IN (SELECT opportunity_id FROM contact_opportunity WHERE deleted = 0 AND role IN {value})', + 'LIKE' => (object) [ + 'leftJoins' => [ + 0 => 'contacts' + ], + 'sql' => 'contactsMiddle.role LIKE {value}', + 'distinct' => true + ], + 'IS NULL' => (object) [ + 'leftJoins' => [ + 0 => 'contacts' + ], + 'sql' => 'contactsMiddle.role IS NULL', + 'distinct' => true + ], + 'IS NOT NULL' => 'opportunity.id NOT IN (SELECT opportunity_id FROM contact_opportunity WHERE deleted = 0 AND role IS NULL)' + ], + 'view' => 'crm:views/opportunity/fields/contact-role', + 'customizationOptionsDisabled' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'required' => false, + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'amountCurrency' => (object) [ + 'type' => 'varchar', + 'disabled' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'account' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Account', + 'foreign' => 'opportunities' + ], + 'contacts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Contact', + 'foreign' => 'opportunities', + 'additionalColumns' => (object) [ + 'role' => (object) [ + 'type' => 'varchar', + 'len' => 50 + ] + ] + ], + 'meetings' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Meeting', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'calls' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Call', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'tasks' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Task', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true, + 'audited' => true + ], + 'emails' => (object) [ + 'type' => 'hasChildren', + 'entity' => 'Email', + 'foreign' => 'parent', + 'layoutRelationshipsDisabled' => true + ], + 'documents' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Document', + 'foreign' => 'opportunities', + 'audited' => true + ], + 'campaign' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Campaign', + 'foreign' => 'opportunities', + 'noJoin' => true + ], + 'originalLead' => (object) [ + 'type' => 'hasOne', + 'entity' => 'Lead', + 'foreign' => 'createdOpportunity' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ], + 'indexes' => (object) [ + 'stage' => (object) [ + 'columns' => [ + 0 => 'stage', + 1 => 'deleted' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ], + 'createdAt' => (object) [ + 'columns' => [ + 0 => 'createdAt', + 1 => 'deleted' + ] + ], + 'createdAtStage' => (object) [ + 'columns' => [ + 0 => 'createdAt', + 1 => 'stage' + ] + ], + 'assignedUserStage' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'stage' + ] + ] + ] + ], + 'Reminder' => (object) [ + 'fields' => (object) [ + 'remindAt' => (object) [ + 'type' => 'datetime', + 'index' => true + ], + 'startAt' => (object) [ + 'type' => 'datetime', + 'index' => true + ], + 'type' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Popup', + 1 => 'Email' + ], + 'maxLength' => 36, + 'index' => true, + 'default' => 'Popup' + ], + 'seconds' => (object) [ + 'type' => 'enumInt', + 'options' => [ + 0 => 0, + 1 => 60, + 2 => 120, + 3 => 300, + 4 => 600, + 5 => 900, + 6 => 1800, + 7 => 3600, + 8 => 7200, + 9 => 10800, + 10 => 18000, + 11 => 86400, + 12 => 172800, + 13 => 259200, + 14 => 432000 + ], + 'default' => 0 + ], + 'entityType' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100 + ], + 'entityId' => (object) [ + 'type' => 'varchar', + 'maxLength' => 50 + ], + 'userId' => (object) [ + 'type' => 'varchar', + 'maxLength' => 50 + ] + ], + 'collection' => (object) [ + 'sortBy' => 'remindAt', + 'asc' => false + ] + ], + 'Target' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'personName' + ], + 'salutationName' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => '', + 1 => 'Mr.', + 2 => 'Mrs.', + 3 => 'Ms.', + 4 => 'Dr.', + 5 => 'Drs.' + ] + ], + 'firstName' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'maxLength' => 100, + 'default' => '' + ], + 'lastName' => (object) [ + 'type' => 'varchar', + 'trim' => true, + 'maxLength' => 100, + 'required' => true, + 'default' => '' + ], + 'title' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100 + ], + 'accountName' => (object) [ + 'type' => 'varchar', + 'maxLength' => 100 + ], + 'website' => (object) [ + 'type' => 'url' + ], + 'address' => (object) [ + 'type' => 'address' + ], + 'addressStreet' => (object) [ + 'type' => 'text', + 'maxLength' => 255, + 'dbType' => 'varchar' + ], + 'addressCity' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressState' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressCountry' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'addressPostalCode' => (object) [ + 'type' => 'varchar', + 'trim' => true + ], + 'emailAddress' => (object) [ + 'type' => 'email' + ], + 'phoneNumber' => (object) [ + 'type' => 'phone', + 'typeList' => [ + 0 => 'Mobile', + 1 => 'Office', + 2 => 'Home', + 3 => 'Fax', + 4 => 'Other' + ], + 'defaultType' => 'Mobile' + ], + 'doNotCall' => (object) [ + 'type' => 'bool' + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'addressMap' => (object) [ + 'type' => 'map', + 'notStorable' => true, + 'readOnly' => true, + 'layoutListDisabled' => true, + 'provider' => 'Google', + 'height' => 300 + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ], + 'indexes' => (object) [ + 'firstName' => (object) [ + 'columns' => [ + 0 => 'firstName', + 1 => 'deleted' + ] + ], + 'name' => (object) [ + 'columns' => [ + 0 => 'firstName', + 1 => 'lastName' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ] + ] + ], + 'TargetList' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'entryCount' => (object) [ + 'type' => 'int', + 'readOnly' => true, + 'notStorable' => true + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'campaigns' => (object) [ + 'type' => 'link' + ], + 'includingActionList' => (object) [ + 'type' => 'multiEnum', + 'view' => 'crm:views/target-list/fields/including-action-list', + 'layoutDetailDisabled' => true, + 'layoutFiltersDisabled' => true, + 'layoutLinkDisabled' => true, + 'notStorable' => true, + 'required' => true, + 'disabled' => true + ], + 'excludingActionList' => (object) [ + 'type' => 'multiEnum', + 'view' => 'crm:views/target-list/fields/including-action-list', + 'layoutDetailDisabled' => true, + 'layoutFiltersDisabled' => true, + 'layoutLinkDisabled' => true, + 'notStorable' => true, + 'disabled' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'campaigns' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Campaign', + 'foreign' => 'targetLists' + ], + 'massEmails' => (object) [ + 'type' => 'hasMany', + 'entity' => 'MassEmail', + 'foreign' => 'targetLists' + ], + 'campaignsExcluding' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Campaign', + 'foreign' => 'excludingTargetLists' + ], + 'massEmailsExcluding' => (object) [ + 'type' => 'hasMany', + 'entity' => 'MassEmail', + 'foreign' => 'excludingTargetLists' + ], + 'accounts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Account', + 'foreign' => 'targetLists', + 'additionalColumns' => (object) [ + 'optedOut' => (object) [ + 'type' => 'bool' + ] + ] + ], + 'contacts' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Contact', + 'foreign' => 'targetLists', + 'additionalColumns' => (object) [ + 'optedOut' => (object) [ + 'type' => 'bool' + ] + ] + ], + 'leads' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Lead', + 'foreign' => 'targetLists', + 'additionalColumns' => (object) [ + 'optedOut' => (object) [ + 'type' => 'bool' + ] + ] + ], + 'users' => (object) [ + 'type' => 'hasMany', + 'entity' => 'User', + 'foreign' => 'targetLists', + 'additionalColumns' => (object) [ + 'optedOut' => (object) [ + 'type' => 'bool' + ] + ] + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ], + 'indexes' => (object) [ + 'createdAt' => (object) [ + 'columns' => [ + 0 => 'createdAt', + 1 => 'deleted' + ] + ] + ] + ], + 'Task' => (object) [ + 'fields' => (object) [ + 'name' => (object) [ + 'type' => 'varchar', + 'required' => true, + 'trim' => true + ], + 'status' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Not Started', + 1 => 'Started', + 2 => 'Completed', + 3 => 'Canceled', + 4 => 'Deferred' + ], + 'view' => 'views/fields/enum-styled', + 'style' => (object) [ + 'Completed' => 'success' + ], + 'default' => 'Not Started', + 'audited' => true + ], + 'priority' => (object) [ + 'type' => 'enum', + 'options' => [ + 0 => 'Low', + 1 => 'Normal', + 2 => 'High', + 3 => 'Urgent' + ], + 'default' => 'Normal', + 'audited' => true + ], + 'dateStart' => (object) [ + 'type' => 'datetimeOptional', + 'before' => 'dateEnd' + ], + 'dateEnd' => (object) [ + 'type' => 'datetimeOptional', + 'after' => 'dateStart', + 'view' => 'crm:views/task/fields/date-end', + 'audited' => true + ], + 'dateStartDate' => (object) [ + 'type' => 'date', + 'disabled' => true + ], + 'dateEndDate' => (object) [ + 'type' => 'date', + 'disabled' => true + ], + 'dateCompleted' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'isOverdue' => (object) [ + 'type' => 'bool', + 'readOnly' => true, + 'notStorable' => true, + 'view' => 'crm:views/task/fields/is-overdue', + 'disabled' => true + ], + 'reminders' => (object) [ + 'type' => 'jsonArray', + 'notStorable' => true, + 'view' => 'crm:views/meeting/fields/reminders' + ], + 'description' => (object) [ + 'type' => 'text' + ], + 'parent' => (object) [ + 'type' => 'linkParent', + 'entityList' => [ + 0 => 'Account', + 1 => 'Contact', + 2 => 'Lead', + 3 => 'Opportunity', + 4 => 'Case' + ] + ], + 'account' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'contact' => (object) [ + 'type' => 'link', + 'readOnly' => true + ], + 'createdAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'modifiedAt' => (object) [ + 'type' => 'datetime', + 'readOnly' => true + ], + 'createdBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'modifiedBy' => (object) [ + 'type' => 'link', + 'readOnly' => true, + 'view' => 'views/fields/user' + ], + 'assignedUser' => (object) [ + 'type' => 'link', + 'required' => true, + 'view' => 'views/fields/assigned-user' + ], + 'teams' => (object) [ + 'type' => 'linkMultiple', + 'view' => 'views/fields/teams' + ], + 'attachments' => (object) [ + 'type' => 'attachmentMultiple', + 'sourceList' => [ + 0 => 'Document' + ], + 'layoutListDisabled' => true + ] + ], + 'links' => (object) [ + 'createdBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'modifiedBy' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User' + ], + 'assignedUser' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'User', + 'foreign' => 'tasks' + ], + 'teams' => (object) [ + 'type' => 'hasMany', + 'entity' => 'Team', + 'relationName' => 'entityTeam', + 'layoutRelationshipsDisabled' => true + ], + 'parent' => (object) [ + 'type' => 'belongsToParent', + 'foreign' => 'tasks' + ], + 'account' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Account' + ], + 'contact' => (object) [ + 'type' => 'belongsTo', + 'entity' => 'Contact' + ] + ], + 'collection' => (object) [ + 'sortBy' => 'createdAt', + 'asc' => false + ], + 'indexes' => (object) [ + 'dateStartStatus' => (object) [ + 'columns' => [ + 0 => 'dateStart', + 1 => 'status' + ] + ], + 'dateEndStatus' => (object) [ + 'columns' => [ + 0 => 'dateEnd', + 1 => 'status' + ] + ], + 'dateStart' => (object) [ + 'columns' => [ + 0 => 'dateStart', + 1 => 'deleted' + ] + ], + 'status' => (object) [ + 'columns' => [ + 0 => 'status', + 1 => 'deleted' + ] + ], + 'assignedUser' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'deleted' + ] + ], + 'assignedUserStatus' => (object) [ + 'columns' => [ + 0 => 'assignedUserId', + 1 => 'status' + ] + ] + ] + ] + ] +]; +?> \ No newline at end of file