Merge next into suite 8

Merge commit '5fa70e2794' into release/8.0.4

# Conflicts:
#	public/legacy/suitecrm_version.php
This commit is contained in:
Clemente Raposo 2022-03-01 14:38:06 +00:00
commit 63b969478d
47 changed files with 824 additions and 137 deletions

View file

@ -1,7 +1,9 @@
<!--- Provide a general summary of the issue in the **Title** above -->
<!--- Before you open an issue, please check if a similar issue already exists or has been closed before. --->
<!--- If you have discovered a security risk please report it by emailing security@suitecrm.com. This will be delivered to the product team who handle security issues. Please don't disclose security bugs publicly until they have been handled by the security team. --->

<!--- Please be aware that as of the 31st January 2022 we no longer support 7.10.x.
New issues referring to 7.10.x will only be valid if applicable to 7.12.x and above.
If your issue is still applicable in 7.12.x, please create the issue following the template below -->
#### Issue
<!--- Provide a more detailed introduction to the issue itself, and why you consider it to be a bug -->
<!--- Ensure that all code ``` is surrounded ``` by triple back quotes. This can also be done over multiple lines -->

View file

@ -1,4 +1,8 @@
<!--- Provide a general summary of your changes in the Title above -->
<!--- Please be aware that as of the 31st January 2022 we no longer support 7.10.x.
New PRs to hotfix-7.10.x will be invalid. If your fix is still applicable to 7.12.x,
please create the pull request to the hotfix branch accordingly. -->


## Description
<!--- Describe your changes in detail -->

View file

@ -44,7 +44,14 @@ class Filter
unset($params['operator']);
}

$params = $this->addDeletedParameter($params);
$deleted = false;
if (isset($params['deleted'])) {
if (isset($params['deleted']['eq'])) {
$deleted = ($params['deleted']['eq'] == 1);
}
unset($params['deleted']);
}

$where = [];
foreach ($params as $field => $expr) {
@ -75,12 +82,25 @@ class Filter
}
}

return implode(sprintf(' %s ', $operator), $where);
if (empty($where)) {
return sprintf(
"%s.deleted = '%d'",
$bean->getTableName(),
$deleted
);
}

return sprintf(
"(%s) AND %s.deleted = '%d'",
implode(sprintf(' %s ', $operator), $where),
$bean->getTableName(),
$deleted
);
}

/**
* Only return deleted records if they were explicitly requested
*
* @deprecated
* @param array $params
* @return array
*/

View file

@ -0,0 +1,249 @@
<?php

namespace SuiteCRM\ModuleInstall;

use \LoggerManager;

/**
* Class ExtensionManager
*/
class ExtensionManager
{
/**
* @var array
*/
protected static $moduleList = [];

/**
* @var
*/
protected static $logger;

/**
* Checks if authenticated and dies if not.
*
* @return void
*/
protected static function handleAuth()
{
if (!defined('sugarEntry') || !sugarEntry) {
die('Not A Valid Entry Point');
}
}

/**
* Sets the static module and extension lists.
*
* @return void
*/
protected static function initialise()
{
static::$moduleList = get_module_dir_list();
static::$logger = LoggerManager::getLogger();
}

/**
* Compiles source files for given extension to targeted file applying any given filters.
*
* @param string $extension Name of Extension i.e. 'Language'
* @param string $targetFileName Name of target file
* @param string $filter To filter file names such as language prefixes
* @param bool $applicationOnly Whether or not to only compile application extensions
* @return void
*/
public static function compileExtensionFiles(
$extension,
$targetFileName,
$filter = '',
$applicationOnly = false
) {
static::handleAuth();
static::initialise();

if ($extension === 'Language' && strpos($targetFileName, $filter) !== 0) {
$targetFileName = $filter . $targetFileName;
}

if (!$applicationOnly) {
static::compileModuleExtensions($extension, $targetFileName, $filter);
}

static::compileApplicationExtensions($extension, $targetFileName, $filter);
}

/**
* @param $extension
* @param $targetFileName
* @param string $filter
* @return void
*/
protected static function compileApplicationExtensions(
$extension,
$targetFileName,
$filter = ''
) {
static::$logger->{'debug'}("Merging application files for $targetFileName in $extension");

$extensionContents = '<?php' . PHP_EOL . '// WARNING: The contents of this file are auto-generated' . PHP_EOL;
$extPath = "application/Ext/$extension";
$moduleInstall = "custom/Extension/$extPath";
$shouldSave = false;

if (is_dir($moduleInstall)) {
$dir = dir($moduleInstall);

while ($entry = $dir->read()) {
if (static::shouldSkipFile($entry, $moduleInstall, $filter)) {
continue;
}
$shouldSave = true;
$file = file_get_contents("$moduleInstall/$entry");
$extensionContents .= PHP_EOL . static::removePhpTagsFromString($file);
}
}

if ($shouldSave) {
static::saveFile($extPath, $targetFileName, $extensionContents);
return;
}

static::unlinkFile($extPath, $targetFileName);
}

/**
* @param $extension
* @param $targetFileName
* @param string $filter
* @return void
*/
protected static function compileModuleExtensions(
$extension,
$targetFileName,
$filter = ''
) {
static::$logger->{'debug'}(
self::class . "::compileExtensionFiles() : Merging module files in " .
"custom/Extension/modules/<module>/$extension to custom/modules/<module>/$extension/$targetFileName"
);

foreach (static::$moduleList as $module) {
$extensionContents = '<?php'
. PHP_EOL
. '// WARNING: The contents of this file are auto-generated'
. PHP_EOL;

$extPath = "modules/$module/Ext/$extension";
$moduleInstall = "custom/Extension/$extPath";
$shouldSave = false;

if (is_dir($moduleInstall)) {
$dir = dir($moduleInstall);
$shouldSave = true;
$override = [];

while ($entry = $dir->read()) {
if (static::shouldSkipFile($entry, $moduleInstall, $filter)) {
continue;
}

if (strpos($entry, '_override') === 0) {
$override[] = $entry;
continue;
}

$file = file_get_contents("$moduleInstall/$entry");
static::$logger->{'debug'}(
self::class . "->compileExtensionFiles(): found {$moduleInstall}{$entry}"
);

$extensionContents .= PHP_EOL . static::removePhpTagsFromString($file);
}

foreach ($override as $entry) {
$file = file_get_contents("$moduleInstall/$entry");
$extensionContents .= PHP_EOL . static::removePhpTagsFromString($file);
}
}

if ($shouldSave) {
static::saveFile($extPath, $targetFileName, $extensionContents);
continue;
}

static::unlinkFile($extPath, $targetFileName);
}
}

/**
* @param string $string
* @return string
*/
protected static function removePhpTagsFromString($string)
{
return str_replace(
['<?php', '?>', '<?PHP', '<?'],
'',
$string
);
}

/**
* @param $entry
* @param $moduleInstall
* @param $filter
* @return bool
*/
protected static function shouldSkipFile(
$entry,
$moduleInstall,
$filter
) {
if ($entry === '.' || $entry === '..' || strtolower(substr($entry, -4)) !== '.php') {
return true;
}

if (!is_file("$moduleInstall/$entry")) {
return true;
}

if (!empty($filter) && substr_count($entry, $filter) <= 0) {
return true;
}

return false;
}

/**
* @param string $extPath
* @param string $targetFileName
* @param string $extensionContents
* @return void
*/
protected static function saveFile(
$extPath,
$targetFileName,
$extensionContents
) {
if (!file_exists("custom/$extPath")) {
mkdir_recursive("custom/$extPath", true);
}

$extensionContents .= PHP_EOL;

$out = sugar_fopen("custom/$extPath/$targetFileName", 'wb');
fwrite($out, $extensionContents);
fclose($out);
}

/**
* @param $extPath
* @param $targetFileName
* @return void
*/
protected static function unlinkFile($extPath, $targetFileName)
{
if (file_exists("custom/$extPath/$targetFileName")) {
unlink("custom/$extPath/$targetFileName");
}
}
}

View file

@ -2,7 +2,7 @@
<img width="180px" height="41px" src="https://suitecrm.com/wp-content/uploads/2017/12/logo.png" align="right" />
</a>

# SuiteCRM 7.12.3
# SuiteCRM 7.12.5

[![LICENSE](https://img.shields.io/github/license/suitecrm/suitecrm.svg)](https://github.com/salesagility/suitecrm/blob/hotfix/LICENSE.txt)
[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/salesagility/SuiteCRM-Core/issues)

View file

@ -380,6 +380,11 @@ class SugarBean
*/
public $in_save;

/**
* @var array $bean_fields_to_save
*/
public $bean_fields_to_save;

/**
* @var integer $logicHookDepth
*/
@ -2506,6 +2511,70 @@ class SugarBean
return $this->id;
}

/**
* Saves only the listed fields. Does not create record, existing records only.
* @param array $fieldToSave
* @return void
*/
public function saveFields(array $fieldToSave): void
{
global $current_user, $action, $timedate;

if (empty($this->id) || $this->new_with_id || empty($fieldToSave)) {
return;
}

$this->in_save = true;

// cn: SECURITY - strip XSS potential vectors
$this->cleanBean();

// This is used so custom/3rd-party code can be upgraded with fewer issues,
// this will be removed in a future release
$this->fixUpFormatting();

$isUpdate = true;

$this->bean_fields_to_save = $fieldToSave;

if (empty($this->date_modified) || $this->update_date_modified) {
$this->date_modified = $timedate->nowDb();
$this->bean_fields_to_save[] = 'date_modified';
}

$this->_checkOptimisticLocking($action, $isUpdate);

if (!empty($this->modified_by_name)) {
$this->old_modified_by_name = $this->modified_by_name;
}

if ($this->update_modified_by) {
$this->modified_user_id = 1;
$this->bean_fields_to_save[] = 'modified_user_id';

if (!empty($current_user)) {
$this->modified_user_id = $current_user->id;

$this->modified_by_name = $current_user->user_name;
$this->bean_fields_to_save[] = 'modified_by_name';
}
}

if ($this->deleted != 1) {
$this->deleted = 0;
}

if (isset($this->custom_fields)) {
$this->custom_fields->bean = $this;
$this->custom_fields->save($isUpdate);
}

$this->db->update($this);

$this->bean_fields_to_save = null;
$this->in_save = false;
}

/**
* Cleans char, varchar, text, etc. fields of XSS type materials
*/

View file

@ -1,5 +1,5 @@
<?php
// created: 2022-01-26 17:00:00
// created: 2022-03-01 17:00:00
$md5_string = array (
'./Api/Core/Config/ApiConfig.php' => '69a1e7b3d7755a2a63499a16ddae81cf',
'./Api/Core/Config/slim.php' => 'b134e68765e6a1403577e2a5a06322b8',
@ -40,7 +40,7 @@ $md5_string = array (
'./Api/V8/JsonApi/Helper/AttributeObjectHelper.php' => '8c2e2f889cefdc7912fd62da3e6a6f71',
'./Api/V8/JsonApi/Helper/PaginationObjectHelper.php' => 'dbeb8f36cc7b70ff9459443c26bdfb70',
'./Api/V8/JsonApi/Helper/RelationshipObjectHelper.php' => '6681a3fc26e420f12875d4239532946e',
'./Api/V8/JsonApi/Repository/Filter.php' => 'cc024de98508d60c0d091a58a49fa879',
'./Api/V8/JsonApi/Repository/Filter.php' => '21279c505e18aacd9f6aea51cc62a3bc',
'./Api/V8/JsonApi/Repository/Sort.php' => '7e9fb4704a056bc944840def1482042d',
'./Api/V8/JsonApi/Response/AttributeResponse.php' => '84318e63e42f0062c8f8231fd4c230d5',
'./Api/V8/JsonApi/Response/DataResponse.php' => '08239b06a911f9d0bd46a28a28d11eda',
@ -101,6 +101,7 @@ $md5_string = array (
'./Api/index.php' => 'c69f9b5950f7c42e8f9b73e1eb5e7e49',
'./HandleAjaxCall.php' => '954cebdd8ea2ab1e5c03658b184322fd',
'./LICENSE.txt' => 'd3f150e4a5bed444763ebe8a81742a95',
'./ModuleInstall/ExtensionManager.php' => 'e9699caa01beb5c4fdae7cc9c8cc4bc6',
'./ModuleInstall/ModuleInstaller.php' => '526a3e11024b84f3602f9857d69a8e47',
'./ModuleInstall/ModuleScanner.php' => '5bd029e1955c5c243ce4cc567cc99367',
'./ModuleInstall/PackageManager/ListViewPackages.php' => 'dd40ddc497010be809cb03c63499ac4f',
@ -115,7 +116,7 @@ $md5_string = array (
'./ModuleInstall/PackageManager/tpls/PackageManagerLicense.tpl' => 'df5e267d1df5ce08fb9406e42d5b4816',
'./ModuleInstall/PackageManager/tpls/PackageManagerScripts.tpl' => '98e396c0aa57329731fda19c790fffb2',
'./ModuleInstall/extensions.php' => '094f4650261f6efbab1b90b119829388',
'./README.md' => 'b9d83b3570f46a4e80c328aaf7e184b6',
'./README.md' => 'b9189e1dc12fb6ee741b6057b9e70147',
'./RoboFile.php' => '045b82c1df69553824d0e4ffcce6e03c',
'./SugarSecurity.php' => '47e316b2d408e8c5192c8ea4a4f921b3',
'./TreeData.php' => '32873e20cb5fd33f9d1cdaf18c3cac5c',
@ -519,7 +520,7 @@ $md5_string = array (
'./data/Relationships/One2OneRelationship.php' => 'c46d3067d5651fbc928763600d5e1a51',
'./data/Relationships/RelationshipFactory.php' => '98a46e44186f2d2db23be9b894a4f1e2',
'./data/Relationships/SugarRelationship.php' => 'a71b96492ee7457826fc91a2356c4ebd',
'./data/SugarBean.php' => 'd8544e7bffbd4eeea20053f52c5514bd',
'./data/SugarBean.php' => 'ccf600118e4ad9437e82efb376443ea4',
'./deprecated.php' => 'f5f507fd6314f38d29c97e2cc2c62239',
'./dictionary.php' => 'b7c1370fb75a2940c04db74627c4462c',
'./download.php' => '1d337efcbfc68d524faab8c4460e107a',
@ -699,7 +700,7 @@ $md5_string = array (
'./include/SearchForm/tpls/header.tpl' => '2d1c49e167dbeb93e8e03ec79c1fec2c',
'./include/SearchForm/tpls/headerPopup.tpl' => '49f913824175dafd993fbc8a1bf7923c',
'./include/Services/Batch/BatchJob.php' => 'bada8d2023e3824673b3a709a54e76f7',
'./include/Services/NormalizeRecords/NormalizeRecords.php' => 'a0d64b3a4d41c72d4f00dad0b0d62f7d',
'./include/Services/NormalizeRecords/NormalizeRecords.php' => '0daac688a03ca6212dee84f6411a8b30',
'./include/Services/NormalizeRecords/NormalizeRecordsSchedulerJob.php' => '8931bcef83a853868bd8f0dc934818d1',
'./include/Smarty/plugins/block.minify.php' => 'a4a8771c5a8a48c7ab030b0b552957dd',
'./include/Smarty/plugins/block.nocache.php' => '66bb941778de43b9e52d06a47becb9f5',
@ -851,7 +852,7 @@ $md5_string = array (
'./include/SugarDependentDropdown/javascript/SugarDependentDropdown.js' => '14748d0133b9731b97c11b95e3713489',
'./include/SugarDependentDropdown/metadata/dependentDropdown.php' => 'deb131d92c6a4447d8265600ba46e9b2',
'./include/SugarEmailAddress/SugarEmailAddress.js' => 'def2d76e0bee474993ae52ce8bafe7c0',
'./include/SugarEmailAddress/SugarEmailAddress.php' => '141b5619a3476eaef690ae6adba2a126',
'./include/SugarEmailAddress/SugarEmailAddress.php' => 'aaf058b834446b2ca595aa957e7d958e',
'./include/SugarEmailAddress/getEmailAddressWidget.php' => '732df9ab640f7e9713d81a2a2c5579d0',
'./include/SugarEmailAddress/templates/forDetailView.tpl' => 'f40f05d1278c144c7e7fd4a1e9e77eb4',
'./include/SugarEmailAddress/templates/forDuplicatesView.tpl' => '99609f76277d97556395e7dc3923c402',
@ -1032,7 +1033,7 @@ $md5_string = array (
'./include/SugarLogger/SugarLogger.php' => '6d9af5c4188da26af4e791ec168c3cf6',
'./include/SugarOAuthServer.php' => 'c0f2ca51199ee2876bcfcdd82f47875d',
'./include/SugarOauth.php' => '2911b35f051569a701eecb9d53f23597',
'./include/SugarObjects/LanguageManager.php' => 'a2bae88124926a27721ce4d6f1e9bd50',
'./include/SugarObjects/LanguageManager.php' => 'a8906e64d8e063305a02b5f8763dfdef',
'./include/SugarObjects/SugarConfig.php' => '8d4e3692d1ae8d49de22c4d27690808d',
'./include/SugarObjects/SugarRegistry.php' => '8a694257c940b967209750983849a49d',
'./include/SugarObjects/SugarSession.php' => '43948517d3dc23cc227474220a1fe06e',
@ -1063,10 +1064,11 @@ $md5_string = array (
'./include/SugarObjects/templates/basic/metadata/detailviewdefs.php' => '5e50674a38a33a6a32e0ccaf452901cf',
'./include/SugarObjects/templates/basic/metadata/editviewdefs.php' => 'a72fc3bcb6c8d3af8c7e2fd5a16b449e',
'./include/SugarObjects/templates/basic/metadata/listviewdefs.php' => '12c67a104a6f959be11749ba807adf8a',
'./include/SugarObjects/templates/basic/metadata/metafiles.php' => '5dc7c77d1e65d8f0e5dafa6f5d4b3969',
'./include/SugarObjects/templates/basic/metadata/metafiles.php' => '80e1c107fcf93fe0a78cf5dd7146b3f5',
'./include/SugarObjects/templates/basic/metadata/popupdefs.php' => '853844b094d4dfe9a29d59759b21ce1b',
'./include/SugarObjects/templates/basic/metadata/quickcreatedefs.php' => '4b0e405788feef127942e060963a7ee8',
'./include/SugarObjects/templates/basic/metadata/searchdefs.php' => '94bf8c5a3bbffdfb32a1415dd9328587',
'./include/SugarObjects/templates/basic/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0',
'./include/SugarObjects/templates/basic/metadata/subpanels/default.php' => 'eef3e143d70cb857fdc15b0014bcbf2d',
'./include/SugarObjects/templates/basic/vardefs.php' => '0c874ef332c71fca9a1255b24ff3a9c8',
'./include/SugarObjects/templates/company/Company.php' => 'b39fc86fb36507f7eb9dcaa95e58e295',
@ -1085,10 +1087,11 @@ $md5_string = array (
'./include/SugarObjects/templates/company/metadata/detailviewdefs.php' => '6b9f79584faeb9de6b3ea8e1b7773390',
'./include/SugarObjects/templates/company/metadata/editviewdefs.php' => '9149a6f92ca93c9f77d6dcfa74b36f6a',
'./include/SugarObjects/templates/company/metadata/listviewdefs.php' => 'ceae1760bc12932b69ab3f35f68f1998',
'./include/SugarObjects/templates/company/metadata/metafiles.php' => '5dc7c77d1e65d8f0e5dafa6f5d4b3969',
'./include/SugarObjects/templates/company/metadata/metafiles.php' => '80e1c107fcf93fe0a78cf5dd7146b3f5',
'./include/SugarObjects/templates/company/metadata/popupdefs.php' => 'e59bf2a176a15e758c982d110b876ab3',
'./include/SugarObjects/templates/company/metadata/quickcreatedefs.php' => '26986647ae09963d834ca32deedf04c7',
'./include/SugarObjects/templates/company/metadata/searchdefs.php' => '32412c1a5d2bec1928b8c1e750308e25',
'./include/SugarObjects/templates/company/metadata/subpaneldefs.php' => '50acf29d6c53bd5a58dac8b21971d94b',
'./include/SugarObjects/templates/company/metadata/subpanels/default.php' => 'd572c5b3d3492d77bc86949f62fb9a5e',
'./include/SugarObjects/templates/company/vardefs.php' => 'e8c82088efe99f717f63a02b5dc83b29',
'./include/SugarObjects/templates/file/File.php' => 'ea3b3d8394cfac726b77e699597c6370',
@ -1109,9 +1112,10 @@ $md5_string = array (
'./include/SugarObjects/templates/file/metadata/detailviewdefs.php' => '38ba4302edc39bde885cd3fbd23cef46',
'./include/SugarObjects/templates/file/metadata/editviewdefs.php' => '4e01916bccc26dd18213c486af79339f',
'./include/SugarObjects/templates/file/metadata/listviewdefs.php' => 'ba627c916655ab0e7086aaafba0a2278',
'./include/SugarObjects/templates/file/metadata/metafiles.php' => '30b981844f4f61f7120cc6fd71e6df2b',
'./include/SugarObjects/templates/file/metadata/metafiles.php' => 'c44b4a1bae97f1d29608af2aaf3e931d',
'./include/SugarObjects/templates/file/metadata/quickcreatedefs.php' => '6d473036b76f6d6fcc6bf754c8d28748',
'./include/SugarObjects/templates/file/metadata/searchdefs.php' => '968d0e10883675aae697ac2a4915bfcd',
'./include/SugarObjects/templates/file/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0',
'./include/SugarObjects/templates/file/metadata/subpanels/default.php' => '1843a1eea57d11427483b4e8760a9c8e',
'./include/SugarObjects/templates/file/vardefs.php' => 'b9cd2c914907a6d18c30117a0ac07b66',
'./include/SugarObjects/templates/file/views/view.edit.php' => 'c6ad729501b57cb2d1c567277a706ee2',
@ -1133,10 +1137,11 @@ $md5_string = array (
'./include/SugarObjects/templates/issue/metadata/detailviewdefs.php' => '3f99f9fd8ae0b8fc67b635e33b2c69e3',
'./include/SugarObjects/templates/issue/metadata/editviewdefs.php' => 'b0df2be5daf35ad78b51a1bb085e2c36',
'./include/SugarObjects/templates/issue/metadata/listviewdefs.php' => 'fdfc52d80121c3bb7b769955abefd892',
'./include/SugarObjects/templates/issue/metadata/metafiles.php' => '5dc7c77d1e65d8f0e5dafa6f5d4b3969',
'./include/SugarObjects/templates/issue/metadata/metafiles.php' => '80e1c107fcf93fe0a78cf5dd7146b3f5',
'./include/SugarObjects/templates/issue/metadata/popupdefs.php' => '0d8e904d55dd66a7a90d38f1d0664bd8',
'./include/SugarObjects/templates/issue/metadata/quickcreatedefs.php' => '368961ada69c8553e7137b604a877f09',
'./include/SugarObjects/templates/issue/metadata/searchdefs.php' => '79c07472d9392384942e22bc6132c8fa',
'./include/SugarObjects/templates/issue/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0',
'./include/SugarObjects/templates/issue/metadata/subpanels/default.php' => '11ea1311363e3db9a0b077d21f84f257',
'./include/SugarObjects/templates/issue/vardefs.php' => 'cec1c24e9ae386c840dda523c65ecd77',
'./include/SugarObjects/templates/person/Person.php' => '5586b56db82db3b6a69d31f4cd46d1d9',
@ -1156,10 +1161,11 @@ $md5_string = array (
'./include/SugarObjects/templates/person/metadata/detailviewdefs.php' => '298b0c970095d044eb0977c8e5ee0376',
'./include/SugarObjects/templates/person/metadata/editviewdefs.php' => '955ed57a59f08bbd8cbb0b7459b2fdb3',
'./include/SugarObjects/templates/person/metadata/listviewdefs.php' => '693f66188d1665c8e410b6bf5be15d27',
'./include/SugarObjects/templates/person/metadata/metafiles.php' => '5dc7c77d1e65d8f0e5dafa6f5d4b3969',
'./include/SugarObjects/templates/person/metadata/metafiles.php' => '80e1c107fcf93fe0a78cf5dd7146b3f5',
'./include/SugarObjects/templates/person/metadata/popupdefs.php' => '94cac00bca2eecc5ad30c6169147aa2b',
'./include/SugarObjects/templates/person/metadata/quickcreatedefs.php' => 'a720ca8346a61cb442fa6ad93a51d1b3',
'./include/SugarObjects/templates/person/metadata/searchdefs.php' => '21606aab371fa03e267883d902d944be',
'./include/SugarObjects/templates/person/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0',
'./include/SugarObjects/templates/person/metadata/subpanels/default.php' => '552bbb8e4bdecc081ea5567effb05c6b',
'./include/SugarObjects/templates/person/vardefs.php' => '0ff81025316998a27fd5b63f678fa2e4',
'./include/SugarObjects/templates/sale/Chance.php' => 'a22453ee390a8e4f4fe89cde6b7f937c',
@ -1183,10 +1189,11 @@ $md5_string = array (
'./include/SugarObjects/templates/sale/metadata/detailviewdefs.php' => '3f1afa19a4c3d714e132f69c9d6e7cfa',
'./include/SugarObjects/templates/sale/metadata/editviewdefs.php' => '767b86f216ab3624cb51bebc36c7b79e',
'./include/SugarObjects/templates/sale/metadata/listviewdefs.php' => 'b8a70bd4bc2da7021120f6c92a914acd',
'./include/SugarObjects/templates/sale/metadata/metafiles.php' => 'c66eca250effcffa927a528e55be1420',
'./include/SugarObjects/templates/sale/metadata/metafiles.php' => 'c44b4a1bae97f1d29608af2aaf3e931d',
'./include/SugarObjects/templates/sale/metadata/popupdefs.php' => 'dd08f5844bddaf9c47b2323388ae8f00',
'./include/SugarObjects/templates/sale/metadata/quickcreatedefs.php' => '40de9275a19046c346932a467511d903',
'./include/SugarObjects/templates/sale/metadata/searchdefs.php' => '259ca47ed60f67f3fcc5ff9b21487022',
'./include/SugarObjects/templates/sale/metadata/subpaneldefs.php' => 'decf6423acb6b44f331f9f8b54c19ff0',
'./include/SugarObjects/templates/sale/metadata/subpanels/default.php' => '933ed06ff0fd822b455b6c05d3526b35',
'./include/SugarObjects/templates/sale/vardefs.php' => '0594cbe418f268edf893cced47b022f3',
'./include/SugarObjects/translated_prefix.php' => 'ba8e90a225dfa38f779119b10c366d40',
@ -1322,7 +1329,7 @@ $md5_string = array (
'./include/contextMenus/menuDefs/sugarObject.php' => '119e653126765edb0358ab54697b862a',
'./include/contextMenus/menuDefs/sugarPerson.php' => '215d244d2fbd4bce5facc8fe2091cc27',
'./include/controller/Controller.php' => '0ee78cfd4c12448eec89ea50b7ea143b',
'./include/database/DBManager.php' => 'd2ecb6db9ceda8d9f1042c2f00ba5d63',
'./include/database/DBManager.php' => 'd43d19f2e402b1d9eb2f8a13d2162e90',
'./include/database/DBManagerFactory.php' => 'ba1e996ceb661905208e38df2459b095',
'./include/database/FreeTDSManager.php' => '23ec109e38260e0ffa2a1676d486fd62',
'./include/database/MssqlManager.php' => '8ec8ad4bd3df1c19aa96b228f3b356a7',
@ -2335,7 +2342,7 @@ $md5_string = array (
'./include/javascript/yui/build/yuitest/yuitest_core.js' => 'ed5230a0f4a885d8ea51c2fe78895d07',
'./include/javascript/yui/ygDDList.js' => '0cd9051a220de7e8c79bf5b9cccce10f',
'./include/json_config.php' => 'ba7fb6f2fb1df51bc367835406ef7ba5',
'./include/language/en_us.lang.php' => 'b3e2e4ddf37fa8614a55749c8f22aea6',
'./include/language/en_us.lang.php' => '9b8bee2691bda327f6b973fa789de805',
'./include/language/en_us.notify_template.html' => 'c6a897ace7af46a44889dfab1a9d44c5',
'./include/language/getJSLanguage.php' => '1bc910bd5a9953fbf443d3d97fddbffa',
'./include/language/jsLanguage.php' => '3d27819dc00f2fe5426f72733a7edca1',
@ -2435,7 +2442,7 @@ $md5_string = array (
'./include/utils/db_utils.php' => '7fa7c67aec162fd9da259a1f33cef514',
'./include/utils/encryption_utils.php' => 'cf87e84efe3764464056e6473aac9c79',
'./include/utils/external_cache.php' => '7439d9b6252e242a9c852ecb58df44ec',
'./include/utils/file_utils.php' => '28de9dc2ca22c07972fb85f334024bea',
'./include/utils/file_utils.php' => '32ed2174485ae7cdc829415d4dcaef86',
'./include/utils/layout_utils.php' => 'f1bfbecd81ffaea9483b39ee7925a523',
'./include/utils/logic_utils.php' => 'df0882131989fd10f9855cc3b66d4572',
'./include/utils/mvc_utils.php' => '38de4382713debfb1cbbe33442a8fc5b',
@ -2874,7 +2881,7 @@ $md5_string = array (
'./lib/Search/UI/MVC/View.php' => '060017bf23671e429cca7187b72ddd2a',
'./lib/Search/UI/SearchFormController.php' => '2cf159703562da6348ece57ef68313b4',
'./lib/Search/UI/SearchFormView.php' => '15662e4bd9237044fe1b74f41632660d',
'./lib/Search/UI/SearchResultsController.php' => '5c3be29f03a58a39dea00393c1dfc01e',
'./lib/Search/UI/SearchResultsController.php' => '21c2ecf52498c7e3109464e4fddd32a7',
'./lib/Search/UI/SearchResultsView.php' => 'ce2615a6390cfe62924d44fdfc7a18fa',
'./lib/Search/UI/SearchThrowableHandler.php' => '14cd2232a5a73df32a755e85a52cd7fd',
'./lib/Search/UI/templates/search.form.tpl' => '8a03f27dd8860270f7c91d64c211fffe',
@ -3396,7 +3403,7 @@ $md5_string = array (
'./modules/AOR_Reports/vardefs.php' => 'bf0ea6c174abbb8e242b4d6963b8686f',
'./modules/AOR_Reports/views/view.detail.php' => '4b9c8598d6e8a76aa6ec470227012cbc',
'./modules/AOR_Reports/views/view.edit.php' => '0e078b86d2078fc47e4ccf24b3b5d8d4',
'./modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php' => '1d67cfee23f2da1d546578bc27545a74',
'./modules/AOR_Scheduled_Reports/AOR_Scheduled_Reports.php' => '37085ac71ea851fc00d66dbf569885f7',
'./modules/AOR_Scheduled_Reports/Menu.php' => '5a02efb3ec80ffcb5044e33ac30338c7',
'./modules/AOR_Scheduled_Reports/emailRecipients.js' => '30056240ca6885b19bac0dffe6a15b06',
'./modules/AOR_Scheduled_Reports/emailRecipients.php' => '7859bbf38e5016778fc56495e7d4e177',
@ -3891,7 +3898,7 @@ $md5_string = array (
'./modules/Bugs/views/view.edit.php' => 'f406f3c7f19e15cd646373151994fa1c',
'./modules/Calendar/Cal.js' => '106379c83260c2472f7c65114d7a9fdb',
'./modules/Calendar/Calendar.php' => '8b5970e1adbf735e0d7f5222012f48ec',
'./modules/Calendar/CalendarActivity.php' => '0cead97402da329cb1f4748058f3dd0a',
'./modules/Calendar/CalendarActivity.php' => '9e55048969b6abcb58443296057f8fce',
'./modules/Calendar/CalendarDisplay.php' => 'fd05f849dff1db7bb47713be26e6a3d2',
'./modules/Calendar/CalendarGrid.php' => 'a77c39c149c93a681a75e91f889f9b2c',
'./modules/Calendar/CalendarUtils.php' => '295ad053fe74484ae3943b9fb4487ae1',
@ -4442,7 +4449,7 @@ $md5_string = array (
'./modules/Documents/views/view.detail.php' => 'eac3d5189949259727d9a1037f0e0070',
'./modules/Documents/views/view.edit.php' => '80f2e5e7e9fa1170f7e0452b9ca8b816',
'./modules/Documents/views/view.extdoc.php' => 'a596ceb8005df2241ae53b4146bfc8f5',
'./modules/DynamicFields/DynamicField.php' => '872af3f181df101e6dada8b0d39e685f',
'./modules/DynamicFields/DynamicField.php' => 'c0ff8ecd1a1453c37756ef849de12664',
'./modules/DynamicFields/FieldCases.php' => '727d05978bb8a62c33ec9c8b7ab91489',
'./modules/DynamicFields/FieldViewer.php' => '85058d135229ad1103524d52cfd06d82',
'./modules/DynamicFields/FieldsMetaData.php' => '8e5a2e1af51b342d83f81910e11cb046',
@ -4652,10 +4659,10 @@ $md5_string = array (
'./modules/Emails/controller.php' => '65d6d5ad5e977930403a2b89cb15004a',
'./modules/Emails/field_arrays.php' => 'f8ad985446f13141ea7365aa8565c500',
'./modules/Emails/include/ComposeView/ComposeView.php' => '45b1a69671ca5c5f2a8ab1455e9f730c',
'./modules/Emails/include/ComposeView/ComposeView.tpl' => '1ec29fbb9803c24e5ed8a12155668e58',
'./modules/Emails/include/ComposeView/ComposeView.tpl' => 'aee5736e992aecc485afbb5973d9e535',
'./modules/Emails/include/ComposeView/ComposeViewBlank.tpl' => '22365ce6727ffb560e5ad3fc187f13f2',
'./modules/Emails/include/ComposeView/ComposeViewToolbar.tpl' => '656b26827857375278124e4610b9ff06',
'./modules/Emails/include/ComposeView/EmailsComposeView.js' => '65624a5e5985e5f9deee1e4725533462',
'./modules/Emails/include/ComposeView/EmailsComposeView.js' => '8ed14ba39eff3d7ec030538431ad3999',
'./modules/Emails/include/DetailView/EmailsDetailView.php' => 'f95937f398f37afe3927ecc035b8b743',
'./modules/Emails/include/DetailView/EmailsDraftDetailView.php' => 'baafca815e89a4c0ec3df8b6192552ea',
'./modules/Emails/include/DetailView/EmailsNonImportedDetailView.php' => 'ef9ecbcf65fa6f03e32f94b6a9805b2f',
@ -4754,7 +4761,7 @@ $md5_string = array (
'./modules/Emails/templates/outboundDialogTest.tpl' => '6d9e938d23d33fb7fa5582fa15c65662',
'./modules/Emails/templates/overlay.tpl' => '2e323ca505c0e45a3c660f993a20ba29',
'./modules/Emails/templates/successMessage.tpl' => 'dcafb0a92cfae5ffd539a75cb82db2b7',
'./modules/Emails/vardefs.php' => '3b7cf8c8a768bd5c4d1bcdb5bd05e7d2',
'./modules/Emails/vardefs.php' => 'dae3869d4728b0bc63a3afe2532ee0cb',
'./modules/Emails/views/view.compose.php' => '655ace129db29e568d901f3223b8afbb',
'./modules/Emails/views/view.deletedraftemail.php' => '4a14718938a8577c683466fbbfec9b23',
'./modules/Emails/views/view.detail.php' => '1dd813258abcba95f09418ef063f0fa7',
@ -4766,7 +4773,7 @@ $md5_string = array (
'./modules/Emails/views/view.popup.php' => '4ff1e52f105970c29fed966e2f058dd3',
'./modules/Emails/views/view.savedraftemail.php' => '000c8d786c87e0ad997fc5de443d9b2c',
'./modules/Emails/views/view.sendemail.php' => '78784b11ddb5257b0f3f5c59c9db17a1',
'./modules/Employees/Employee.php' => 'c837db1f7627ee68383a041c51bb8b9c',
'./modules/Employees/Employee.php' => '2a70486e775ccc8e4c36176855d5c1e7',
'./modules/Employees/EmployeeStatus.php' => 'a2be5cfeb49ef4f8deec01de9686edb9',
'./modules/Employees/EmployeesSearchForm.php' => '0437d91e2221d02c38e0db6830fef057',
'./modules/Employees/EmployeesStudioModule.php' => '5b71bea7b6e7b7a77bc5a48d4fb10a55',
@ -5170,7 +5177,7 @@ $md5_string = array (
'./modules/ModuleBuilder/MB/header.php' => 'de67588e0b8d859dc2d9fc71709036b4',
'./modules/ModuleBuilder/Module/DropDownBrowser.php' => '3f1698938d776a91255703c257049fac',
'./modules/ModuleBuilder/Module/DropDownTree.php' => '3685a4b70a81e30fccf6c6b2f770c9d8',
'./modules/ModuleBuilder/Module/IconRepository.php' => '20cd01f8300b411bacffb53361ed6f08',
'./modules/ModuleBuilder/Module/IconRepository.php' => '5fbd04824f79784669ba38326a18096f',
'./modules/ModuleBuilder/Module/MainTree.php' => '3122ae95f6c9a62db7c6eec12b2581f0',
'./modules/ModuleBuilder/Module/StudioBrowser.php' => '32112741c23435fe2794f797933cfacc',
'./modules/ModuleBuilder/Module/StudioModule.php' => '35525c18e7b1e00379f7d766b9001af5',
@ -5188,13 +5195,13 @@ $md5_string = array (
'./modules/ModuleBuilder/javascript/studio2RowDD.js' => 'ce2a4bfa3dbaca4249d73df0bc5dfaad',
'./modules/ModuleBuilder/javascript/studiotabgroups.js' => 'c3d48dec838914e457aa099d9225d174',
'./modules/ModuleBuilder/javascript/wizardTemplate.js' => '92c65dce9153db13c20731de44d14d87',
'./modules/ModuleBuilder/language/en_us.lang.php' => '9171bfd805fcedff0bbc38266d6395b5',
'./modules/ModuleBuilder/language/en_us.lang.php' => 'b73ec441c51179efa58d1a65e2160252',
'./modules/ModuleBuilder/parsers/ModuleBuilderParser.php' => '1a5d8c3c8c7736c4e9011960732c4647',
'./modules/ModuleBuilder/parsers/ParserFactory.php' => '9f49fbae9d8aadc97257d4cf18672978',
'./modules/ModuleBuilder/parsers/StandardField.php' => '4cbf549bc313959427dc126e9afe01e7',
'./modules/ModuleBuilder/parsers/constants.php' => '01917f1fa30ccbaabf69cf03f3a37946',
'./modules/ModuleBuilder/parsers/parser.dropdown.php' => 'adfd8f59d8b6072d2aabee8f2ec68ceb',
'./modules/ModuleBuilder/parsers/parser.label.php' => 'b026e2f0249fe89f848312ece6d1ca1d',
'./modules/ModuleBuilder/parsers/parser.label.php' => '282ab5608f39a5ea18d3ff0b6c236766',
'./modules/ModuleBuilder/parsers/parser.modifylayoutview.php' => 'f69b0f61304ac1a038a9ee4fc5e64faf',
'./modules/ModuleBuilder/parsers/parser.modifylistview.php' => '7b370f6ed426a6e1be2f6b0fa422eb76',
'./modules/ModuleBuilder/parsers/parser.modifysubpanel.php' => '27b433079ba0b51495f59defd0bb348f',
@ -5547,7 +5554,7 @@ $md5_string = array (
'./modules/ProjectTask/vardefs.php' => 'd1966d1060fcc2f8245f83e983f4a477',
'./modules/ProjectTask/views/view.list.php' => '8beeb6373e9925ea68b4f1d2121abf06',
'./modules/ProspectLists/Delete.php' => '49e5493083f478e993c36e0941d16bcd',
'./modules/ProspectLists/Duplicate.php' => '51ef701820dbf25644722d961ed1121f',
'./modules/ProspectLists/Duplicate.php' => 'f73bdc77dd9e63b24e69897105947500',
'./modules/ProspectLists/Forms.html' => 'f2cb6003b845b3ae60c954c3543c6fe8',
'./modules/ProspectLists/Forms.php' => '304e40b1231cb7dcc58dd49612680582',
'./modules/ProspectLists/Menu.php' => '353995ef7f262ec1186a49f0425f21c0',
@ -5753,7 +5760,7 @@ $md5_string = array (
'./modules/Spots/vardefs.php' => '5e4d751e31f3684b35e34af55d53be25',
'./modules/Spots/views/view.edit.php' => 'be1fbcd8c6b5871b18244cdb7ef02bb3',
'./modules/Spots/views/view.list.php' => '0d9934545e44b644cb8f65f33a908004',
'./modules/Studio/DropDowns/DropDownHelper.php' => '459e0789955425379aeae7314e581b10',
'./modules/Studio/DropDowns/DropDownHelper.php' => 'fca5f36c4e2b0ab0a6fbff17cf051def',
'./modules/Studio/DropDowns/EditView.php' => 'fc1f1181fe3ecf9d446078ef3998a912',
'./modules/Studio/DropDowns/EditView.tpl' => '1daa9d2575cfd5788576f7c8f06940a5',
'./modules/Studio/Forms.php' => 'f1b9c09d71cbf6919f46b99b9a0286d3',
@ -6048,7 +6055,7 @@ $md5_string = array (
'./modules/Users/SetTimezone.tpl' => 'f0fb5ed64fae81a5657ebc8f167967c9',
'./modules/Users/UpdateTourStatus.php' => 'cc111e28e6df1d96b98678661dd42490',
'./modules/Users/User.js' => '351f8d8e74bd1bd0a56dcc2bae31b147',
'./modules/Users/User.php' => 'e0e65bf73d91fcc730b923eb95fe37c2',
'./modules/Users/User.php' => 'a75ad79197349bc156f9365ef3830b9c',
'./modules/Users/UserEditView.js' => '421e1c38f1ee78933134b987b7c3c251',
'./modules/Users/UserEmailOptions.tpl' => '96b848efbf7f6d4fee7b6bf13a1a1aee',
'./modules/Users/UserEmailSettings.tpl' => '5d9ff3379f63dcf7c5efbbcc3e88d8ed',
@ -6265,7 +6272,7 @@ $md5_string = array (
'./modules/vCals/HTTP_WebDAV_Server_vCal.php' => '966b7f0c7c2297ce1bea3a944e4cbd91',
'./modules/vCals/Server.php' => '42c9c6a727bca02d7f1a6c6f4591257b',
'./modules/vCals/field_arrays.php' => 'a1a41e8dd4710a3671fa359dcb8267ba',
'./modules/vCals/vCal.php' => '11257a95accc06fa64afc8d60425d663',
'./modules/vCals/vCal.php' => 'e20c0d7ec2b900ce37c8d621db8835ad',
'./modules/vCals/vardefs.php' => 'aa722f4d5a1fa352bc808da9fce072bd',
'./pdf.php' => '9c17ce70f633f699b8f5accd104f7e67',
'./php_version.php' => '928257f676637cf31a03032c3e661e27',
@ -6335,32 +6342,32 @@ $md5_string = array (
'./soap.php' => 'e28988c2e0b8e2c484587b537a710525',
'./sugar_version.json' => 'bdfbcefae2f9af559bef6a36367df7bb',
'./sugar_version.php' => 'db7b6c8d51f87879fce1e6172eedfbed',
'./suitecrm_version.php' => '4c7d3c4f6802cc2a615832b2c09f8c8e',
'./suitecrm_version.php' => '44698d65949ec2aaa3489747310fb8be',
'./themes/SuiteP/css/Dawn/color-palette.scss' => 'e64677d79e1d68c069bdc2dc661c4f99',
'./themes/SuiteP/css/Dawn/icons.scss' => 'd59f8c5855e7a8df09542a663835a196',
'./themes/SuiteP/css/Dawn/select.ico' => '22393ad23f16c3f1462455bae8f20279',
'./themes/SuiteP/css/Dawn/style.css' => '4b00f6c1bbea501b7b2d100b7b11e556',
'./themes/SuiteP/css/Dawn/style.css' => 'fa371bfc0663c488d723ce828d1e7171',
'./themes/SuiteP/css/Dawn/style.scss' => '2fe759bc1c69865732f0ae0cca88916c',
'./themes/SuiteP/css/Dawn/variables.scss' => 'f8f8acf976e6cb0f1d27ea46891ead2e',
'./themes/SuiteP/css/Day/color-palette.scss' => '91bed2ed878a141ccdc521512f0daa33',
'./themes/SuiteP/css/Day/icons.scss' => '7a77bb17a810866e1ec4e0667e58e536',
'./themes/SuiteP/css/Day/style.css' => 'aa909eb7a2ec2772a66ca0707fe8d419',
'./themes/SuiteP/css/Day/style.css' => '6d2e8777837f4a3c9c673b403b95eef2',
'./themes/SuiteP/css/Day/style.scss' => '9cdabde7436f1037e691c81017972b8f',
'./themes/SuiteP/css/Day/variables.scss' => '31b6e279ea974581ad42f95a3bb694a4',
'./themes/SuiteP/css/Dusk/color-palette.scss' => '3fa059d1033bfd1bfa342ec0bc4ffe25',
'./themes/SuiteP/css/Dusk/icons.scss' => '7a77bb17a810866e1ec4e0667e58e536',
'./themes/SuiteP/css/Dusk/style.css' => 'c948f679584e96d3ce39050d36b82e8b',
'./themes/SuiteP/css/Dusk/style.css' => '5bfde54ca4e8a9315b384a4ae0cdc7f7',
'./themes/SuiteP/css/Dusk/style.scss' => '2fe759bc1c69865732f0ae0cca88916c',
'./themes/SuiteP/css/Dusk/variables.scss' => 'ac38ee874a0668e1d3b86972a850f91d',
'./themes/SuiteP/css/Night/color-palette.scss' => '25653200b97822a2d0f2594b180858c8',
'./themes/SuiteP/css/Night/icons.scss' => '2adfbf917fd7f0748090ef79ec4657c9',
'./themes/SuiteP/css/Night/style.css' => 'b08ab4c6a46bca69b8b5affc3c108f24',
'./themes/SuiteP/css/Night/style.css' => 'ee55328617a2cfa5a1a7583db1afd6b6',
'./themes/SuiteP/css/Night/style.scss' => '4b811594274100e02331d7bace01a687',
'./themes/SuiteP/css/Night/variables.scss' => '4fc04d66ddb30f18da508b82e71a6cde',
'./themes/SuiteP/css/Noon/color-palette.scss' => '952a2c7a3fb020ca2232b24a9ac58fe4',
'./themes/SuiteP/css/Noon/icons.scss' => 'b5d0e65cf55142e8591bfcd792b6bed6',
'./themes/SuiteP/css/Noon/select.ico' => '09333d8f426c1a4743e9b977a67d1d1f',
'./themes/SuiteP/css/Noon/style.css' => '5f0a4b744c3057d5efc137791411aa2a',
'./themes/SuiteP/css/Noon/style.css' => '504a6fcca636cdbad859ac6a8d1b47c8',
'./themes/SuiteP/css/Noon/style.scss' => '2fe759bc1c69865732f0ae0cca88916c',
'./themes/SuiteP/css/Noon/variables.scss' => 'bea284c3121762d58279aca24c873d9e',
'./themes/SuiteP/css/bootstrap/alerts.scss' => 'c0e5396555dd4c70b9eeb314e4c4613d',
@ -6460,7 +6467,7 @@ $md5_string = array (
'./themes/SuiteP/css/suitep-base/email.scss' => '4b0a570ce4cdac8bb449f31bccb0ee72',
'./themes/SuiteP/css/suitep-base/forms.scss' => 'e1626b89c1cf4ac8fc16c5f5532c8ac0',
'./themes/SuiteP/css/suitep-base/jstree.scss' => '946510970bb0774a31a01c2fb57a9552',
'./themes/SuiteP/css/suitep-base/listview.scss' => '083c62124b7f3c7dbf32a3f10e06cf35',
'./themes/SuiteP/css/suitep-base/listview.scss' => '46898f8372bdd796e5ddeed167bd0c30',
'./themes/SuiteP/css/suitep-base/login.scss' => '25d85a91770e80b7b0357cece6eb5c4b',
'./themes/SuiteP/css/suitep-base/main.scss' => '0ddf085214424ea1f19a13f7930f1c9a',
'./themes/SuiteP/css/suitep-base/mixins.scss' => '9edffdf421f6277979bd76df64d34fad',
@ -7740,15 +7747,15 @@ $md5_string = array (
'./themes/SuiteP/images/wizmenu/left-start.png' => '85bb13bfd189a2c3e306e7c08753434d',
'./themes/SuiteP/images/wizmenu/right-empty.png' => 'd3037d7c75385e7d5a5708092e8cb94c',
'./themes/SuiteP/images/wizmenu/right-full.png' => '2f6f9936252b8c9dfd7bb71b140061e5',
'./themes/SuiteP/include/Dashlets/DashletHeader.tpl' => '83586d72dbd43540f4d71b6b5db354f5',
'./themes/SuiteP/include/DetailView/DetailView.tpl' => '4829a5f5b6ac00c01c321948b4481a95',
'./themes/SuiteP/include/Dashlets/DashletHeader.tpl' => '09e4767d1ff01a830c0de2706e833a11',
'./themes/SuiteP/include/DetailView/DetailView.tpl' => 'ff62ab3dc8d5b6e91a4c1041c043592e',
'./themes/SuiteP/include/DetailView/actions_buttons.tpl' => '8a6fff7933b92178c28f5a58feddef75',
'./themes/SuiteP/include/DetailView/actions_menu.tpl' => '43988446570fc2820b7b0fb3da42e199',
'./themes/SuiteP/include/DetailView/footer.tpl' => '74cd1da7edd3386ee51db3e8ba8bb53b',
'./themes/SuiteP/include/DetailView/header.tpl' => 'ba7fbc5faa2a0e336373aae9b1e52a8e',
'./themes/SuiteP/include/DetailView/tab_panel_content.tpl' => '6d222e6e0637382cff40a4dff5dbb851',
'./themes/SuiteP/include/DetailView/test.tpl' => 'fcf838f4139733066cc727fc7f3818ae',
'./themes/SuiteP/include/EditView/EditView.tpl' => '5e279ffcc56b22f3c2d6032247fa288e',
'./themes/SuiteP/include/EditView/EditView.tpl' => '7ad41f35fa8b0aa7dbaae48189c38edb',
'./themes/SuiteP/include/EditView/QuickCreate.tpl' => '3acca81ef6a983731de021c1943f4c0b',
'./themes/SuiteP/include/EditView/SugarVCR.tpl' => 'eed25c746ed4a7ffeeaaae25a36f49c4',
'./themes/SuiteP/include/EditView/actions_buttons.tpl' => '3ccfac667a36f3f67706deb6de2f9a77',

View file

@ -43,8 +43,8 @@ if (!defined('sugarEntry') || !sugarEntry) {
die('Not A Valid Entry Point');
}

require_once __DIR__ .'/../../../modules/SchedulersJobs/SchedulersJob.php';
require_once __DIR__ .'/../Batch/BatchJob.php';
require_once __DIR__ . '/../../../modules/SchedulersJobs/SchedulersJob.php';
require_once __DIR__ . '/../Batch/BatchJob.php';


class NormalizeRecords extends BatchJob
@ -110,6 +110,9 @@ class NormalizeRecords extends BatchJob
if (empty($ids)) {
$this->debugLog("No ids found for module $type");
$this->echoOutput($echo, "No ids found for module $type");
$this->echoOutput($echo, "$type 0 records normalized");
$messages[] = "$type 0 records normalized";
$this->debugLog("$type 0 records normalized");
continue;
}

@ -291,17 +294,13 @@ class NormalizeRecords extends BatchJob
protected function setupTracking(): array
{
// Populate the $moduleList variable to target only specific modules
$moduleList = [];
if (empty($moduleList)) {
$moduleList = $GLOBALS["moduleList"];
$moduleList[] = 'Users';
}
$moduleList = $this->getModulesToNormalize();

$tracking = [];

foreach ($moduleList as $module) {

if (empty($GLOBALS["beanList"][$module])){
if (empty($GLOBALS["beanList"][$module])) {
continue;
}

@ -406,8 +405,8 @@ class NormalizeRecords extends BatchJob
$records = $this->getRecordChunk($ids, $type);
foreach ($records as $row) {

$normalized = $this->repairStringValues($row, $fieldList);
if (!$normalized) {
$normalized = $this->repairStringValues($type, $row, $fieldList);
if (empty($normalized)) {
continue;
}

@ -417,7 +416,7 @@ class NormalizeRecords extends BatchJob
$bean->update_modified_by = false;
$bean->processed = true;
$bean->notify_inworkflow = false;
$bean->save(false);
$bean->saveFields($normalized);
$this->debugLog("$type - " . $bean->id . " normalized");
++$i;
if ($i % 100 === 0) {
@ -425,7 +424,7 @@ class NormalizeRecords extends BatchJob
}
}
$messages[] = "$type " . $i . " records normalized";
$result['normalize_count'] = $i;
$result['normalize_count'] = $i;
$this->debugLog("$type " . $i . " records normalized");

$result['messages'] = $messages;
@ -437,14 +436,29 @@ class NormalizeRecords extends BatchJob
* Check and Normalize values from database row
* which exist in the $fieldList array
*
* @param $row
* @param string $type
* @param array $row
* @param array $fieldList
* @return bool
* @return array
*/
protected function repairStringValues(&$row, array $fieldList): bool
protected function repairStringValues(string $type, &$row, array $fieldList): array
{
$normalized = false;
$fieldsToExclude = [
'Users' => [
'user_hash' => true
],
];

$normalized = [];
foreach ($fieldList as $fieldName) {

$exclude = $fieldsToExclude[$type][$fieldName] ?? false;

if ($exclude === true) {
$this->debugLog("Excluded $fieldName");
continue;
}

if (!empty($row[$fieldName])) {

// Check if normalization is required
@ -455,7 +469,7 @@ class NormalizeRecords extends BatchJob
//debugLog("Pre : $row[$fieldName]");
$row[$fieldName] = Normalizer::normalize($row[$fieldName], Normalizer::FORM_C);
//debugLog("Post: $row[$fieldName]");
$normalized = true;
$normalized[] = $fieldName;
}
}

@ -479,6 +493,10 @@ class NormalizeRecords extends BatchJob
$repairableTypes = ['enum', 'longtext', 'name', 'text', 'varchar'];
$varDefFields = $bean->getFieldDefinitions();

if ($type === 'Users') {
$repairableTypes[] = 'user_name';
}

$fieldList = array();
foreach ($varDefFields as $field) {
if (in_array($field['type'], $repairableTypes, true)) {
@ -532,7 +550,7 @@ class NormalizeRecords extends BatchJob
{
global $log;

$log->info("[utf-normalize]" . $string);
$log->info("[utf-normalize] " . $string);
}

/**
@ -542,13 +560,105 @@ class NormalizeRecords extends BatchJob
*/
protected function echoOutput(bool $echo, string $string): void
{
if (empty($echo)){
if (empty($echo)) {
return;
}

echo '<div>' . $string. '</div>';
echo '<div>' . $string . '</div>';
ob_flush();
flush();
}

/**
* @return array|mixed
*/
protected function getModulesToNormalize()
{
$moduleList = [];
if (empty($moduleList)) {
$moduleList = $GLOBALS["moduleList"];
$moduleList[] = 'Users';
}

$modInvisList = $GLOBALS["modInvisList"] ?? [];

$toExlude = [
'Calendar',
'Administration',
'CustomFields',
'Connectors',
'Dropdown',
'Dynamic',
'DynamicFields',
'DynamicLayout',
'EditCustomFields',
'Help',
'Import',
'MySettings',
'EditCustomFields',
'FieldsMetaData',
'UpgradeWizard',
'Trackers',
'Connectors',
'Employees',
'Calendar',
'Sync',
'Versions',
'LabelEditor',
'Roles',
'EmailMarketing',
'OptimisticLock',
'TeamMemberships',
'TeamSets',
'TeamSetModule',
'Audit',
'MailMerge',
'MergeRecords',
'EmailText',
'Schedulers',
'Schedulers_jobs',
'CampaignTrackers',
'CampaignLog',
'EmailMan',
'Groups',
'InboundEmail',
'ACLActions',
'ACLRoles',
'DocumentRevisions',
'ModuleBuilder',
'Alert',
'ResourceCalendar',
'ACL',
'Configurator',
'UserPreferences',
'SavedSearch',
'Studio',
'Connectors',
'SugarFeed',
'EAPM',
'OAuthKeys',
'OAuthTokens',
'AM_TaskTemplates',
'Reminders',
'Reminders_Invitees',
'AOD_IndexEvent',
'AOD_Index',
'AOR_Fields',
'AOR_Charts',
'AOR_Conditions',
'AOS_Line_Item_Groups',
'AOW_Processed',
'Calls_Reschedule',
'OutboundEmailAccounts',
'TemplateSectionLine',
'OAuth2Tokens',
'OAuth2Clients',
];

$modInvisList = array_diff($modInvisList, $toExlude);
$moduleList = array_merge($moduleList, $modInvisList);

return $moduleList;
}

}

View file

@ -239,7 +239,7 @@ class SugarEmailAddress extends SugarBean
|| !isset($_REQUEST[$bean->module_dir . '_email_widget_id'])
|| !isset($_REQUEST['massupdate'])
) {
if (empty($this->addresses) || (!empty($bean->email1))) {
if (empty($this->addresses)) {
$this->addresses = array();
$optOut = (isset($bean->email_opt_out) && $bean->email_opt_out == '1');
$invalid = (isset($bean->invalid_email) && $bean->invalid_email == '1');

View file

@ -202,6 +202,9 @@ class LanguageManager
'custom/modules/' . $module . '/Ext/Language/' . $lang . '.lang.ext.php',
);

require_once 'ModuleInstall/ExtensionManager.php';
SuiteCRM\ModuleInstall\ExtensionManager::compileExtensionFiles('Language', '.lang.ext.php', $lang);

#27023, if this module template language file was not attached , get the template from this module vardef cache file if exsits and load the template language files.
static $createdModules;
if (empty($createdModules[$module]) && isset($GLOBALS['beanList'][$module])) {

View file

@ -46,4 +46,5 @@ $metafiles[$module_name] = array(
'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php',
'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php',
'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php',
'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php',
);

View file

@ -0,0 +1,14 @@
<?php
$module_name = '<module_name>';
$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array(
'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')),
'order' => 900,
'sort_by' => 'name',
'sort_order' => 'asc',
'module' => 'SecurityGroups',
'refresh_page' => 1,
'subpanel_name' => 'default',
'get_subpanel_data' => 'SecurityGroups',
'add_subpanel_data' => 'securitygroup_id',
'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE',
);

View file

@ -46,4 +46,5 @@ $metafiles[$module_name] = array(
'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php',
'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php',
'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php',
'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php',
);

View file

@ -0,0 +1,14 @@
<?php
$module_name = '<module_name>';
$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array(
'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect'),),
'order' => 900,
'sort_by' => 'name',
'sort_order' => 'asc',
'module' => 'SecurityGroups',
'refresh_page' => 1,
'subpanel_name' => 'default',
'get_subpanel_data' => 'SecurityGroups',
'add_subpanel_data' => 'securitygroup_id',
'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE',
);

View file

@ -50,4 +50,5 @@ $metafiles[$module_name] = array(
'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php',
'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php',
'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php',
'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php',
);

View file

@ -0,0 +1,14 @@
<?php
$module_name = '<module_name>';
$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array(
'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')),
'order' => 900,
'sort_by' => 'name',
'sort_order' => 'asc',
'module' => 'SecurityGroups',
'refresh_page' => 1,
'subpanel_name' => 'default',
'get_subpanel_data' => 'SecurityGroups',
'add_subpanel_data' => 'securitygroup_id',
'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE',
);

View file

@ -46,4 +46,5 @@ $metafiles[$module_name] = array(
'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php',
'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php',
'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php',
'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php',
);

View file

@ -0,0 +1,14 @@
<?php
$module_name = '<module_name>';
$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array(
'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')),
'order' => 900,
'sort_by' => 'name',
'sort_order' => 'asc',
'module' => 'SecurityGroups',
'refresh_page' => 1,
'subpanel_name' => 'default',
'get_subpanel_data' => 'SecurityGroups',
'add_subpanel_data' => 'securitygroup_id',
'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE',
);

View file

@ -46,4 +46,5 @@ $metafiles[$module_name] = array(
'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php',
'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php',
'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php',
'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php',
);

View file

@ -0,0 +1,14 @@
<?php
$module_name = '<module_name>';
$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array(
'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')),
'order' => 900,
'sort_by' => 'name',
'sort_order' => 'asc',
'module' => 'SecurityGroups',
'refresh_page' => 1,
'subpanel_name' => 'default',
'get_subpanel_data' => 'SecurityGroups',
'add_subpanel_data' => 'securitygroup_id',
'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE',
);

View file

@ -50,5 +50,5 @@ $metafiles[$module_name] = array(
'searchdefs' => 'modules/' . $module_name . '/metadata/searchdefs.php',
'popupdefs' => 'modules/' . $module_name . '/metadata/popupdefs.php',
'searchfields' => 'modules/' . $module_name . '/metadata/SearchFields.php',

'subpaneldefs' => 'modules/' . $module_name . '/metadata/subpaneldefs.php',
);

View file

@ -0,0 +1,14 @@
<?php
$module_name = '<module_name>';
$layout_defs[$module_name]['subpanel_setup']['securitygroups'] = array(
'top_buttons' => array(array('widget_class' => 'SubPanelTopSelectButton', 'popup_module' => 'SecurityGroups', 'mode' => 'MultiSelect')),
'order' => 900,
'sort_by' => 'name',
'sort_order' => 'asc',
'module' => 'SecurityGroups',
'refresh_page' => 1,
'subpanel_name' => 'default',
'get_subpanel_data' => 'SecurityGroups',
'add_subpanel_data' => 'securitygroup_id',
'title_key' => 'LBL_SECURITYGROUPS_SUBPANEL_TITLE',
);

View file

@ -2090,6 +2090,11 @@ abstract class DBManager
if (!empty($val) && !empty($fieldDef['len']) && strlen($val) > $fieldDef['len']) {
$val = $this->truncate($val, $fieldDef['len']);
}

if (!empty($bean->bean_fields_to_save) && !in_array($fieldDef['name'], $bean->bean_fields_to_save, true)) {
continue;
}

$columnName = $this->quoteIdentifier($fieldDef['name']);
if (!is_null($val) || !empty($fieldDef['required'])) {
$columns[] = "{$columnName}=".$this->massageValue($val, $fieldDef);

View file

@ -930,6 +930,9 @@ $app_list_strings = array(
'custom_fields_merge_dup_dom' => array(
0 => 'Disabled',
1 => 'Enabled',
2 => 'Filter',
3 => 'Default selected filter',
4 => 'Only filter',
),

'projects_priority_options' => array(

View file

@ -116,7 +116,7 @@ function remove_file_extension($filename)

function write_array_to_file($the_name, $the_array, $the_file, $mode="w", $header='')
{
if (!empty($header) && ($mode != 'a' || !file_exists($the_file))) {
if (!empty($header) && ($mode !== 'a' || $mode !== 'ab' || !file_exists($the_file))) {
$the_string = $header;
} else {
$the_string = "<?php\n" .
@ -129,6 +129,27 @@ function write_array_to_file($the_name, $the_array, $the_file, $mode="w", $heade
return sugar_file_put_contents($the_file, $the_string, LOCK_EX) !== false;
}

function write_override_label_to_file($the_name, $the_array, $the_file, $mode = 'w', $header = '')
{
if (!empty($header) && ($mode !== 'a' || $mode !== 'ab' || !file_exists($the_file))) {
$the_string = $header;
} else {
$the_string = "<?php\n" .
'// created: ' . date('Y-m-d H:i:s') . "\n";
}

foreach ($the_array as $labelName => $labelValue) {
$the_string .= '$' . "{$the_name}['{$labelName}'] = '{$labelValue}';\n";
}

$result = sugar_file_put_contents($the_file, $the_string, LOCK_EX) !== false;

if (function_exists('opcache_invalidate')) {
opcache_invalidate($the_file, true);
}
return $result;
}

function write_encoded_file($soap_result, $write_to_dir, $write_to_file="")
{
// this function dies when encountering an error -- use with caution!

View file

@ -86,6 +86,16 @@ class SearchResultsController extends Controller
$this->results = $results;
}

public function getQuery(): SearchQuery
{
return $this->query;
}

public function getResults(): SearchResults
{
return $this->results;
}

public function display(): void
{
$headers = [];

View file

@ -83,9 +83,7 @@ class AOR_Scheduled_Reports extends basic

public function save($check_notify = false)
{
if (isset($_POST['email_recipients']) && is_array($_POST['email_recipients'])) {
$this->email_recipients = base64_encode(serialize($_POST['email_recipients']));
}
$this->parseRecipients();

return parent::save($check_notify);
}
@ -180,7 +178,7 @@ class AOR_Scheduled_Reports extends basic
}

$lastRun = $this->last_run ? $timedate->fromDb($this->last_run) : $timedate->fromDb($this->date_entered);

$this->handleTimeZone($lastRun);
$next = $cron->getNextRunDate($lastRun);

@ -200,4 +198,26 @@ class AOR_Scheduled_Reports extends basic
$date->modify($offset . 'second');
}

/**
* Parse and set recipients
* @return void
*/
protected function parseRecipients(): void
{
$recipients = $_POST['email_recipients'] ?? null;
unset($_POST['email_recipients'], $_REQUEST['email_recipients'], $_GET['email_recipients']);
$this->email_recipients = null;

if (is_array($recipients)) {
$types = $recipients['email_target_type'] ?? [];
$emailInfo = $recipients['email'] ?? [];
$recipients = [
'email_target_type' => $types,
'email' => $emailInfo,
];

$this->email_recipients = base64_encode(serialize($recipients));
}
}

}

View file

@ -266,11 +266,12 @@ class CalendarActivity
}

$focus_list = build_related_list_by_user_id($bean, $user_id, $where);
require_once 'modules/SecurityGroups/SecurityGroup.php';
//require_once 'modules/SecurityGroups/SecurityGroup.php';
foreach ($focus_list as $focusBean) {
if (isset($seen_ids[$focusBean->id])) {
continue;
}
/* TODO update currently unused functionality, disabled as expensive
$in_group = SecurityGroup::groupHasAccess($key, $focusBean->id, 'list');
$show_as_busy = !ACLController::checkAccess(
$key,
@ -279,7 +280,7 @@ class CalendarActivity
'module',
$in_group
);
$focusBean->show_as_busy = $show_as_busy;
$focusBean->show_as_busy = $show_as_busy;*/

$seen_ids[$focusBean->id] = 1;
$act = new CalendarActivity($focusBean);

View file

@ -445,6 +445,11 @@ class DynamicField
if ($field['type'] == 'html' || $field['type'] == 'parent') {
continue;
}

if (!empty($this->bean->bean_fields_to_save) && !in_array($name, $this->bean->bean_fields_to_save, true)){
continue;
}

if (isset($this->bean->$name)) {
$quote = "'";


View file

@ -226,7 +226,7 @@
$(function(){
$('#EditView_tabs ul.nav.nav-tabs li > a[data-toggle="tab"]').click(function(e){
if(typeof $(this).parent().find('a').first().attr('id') != 'undefined') {
var tab = parseInt($(this).parent().find('a').first().attr('id').match(/^tab(.)*$/)[1]);
var tab = parseInt($(this).parent().find('a').first().attr('id').match(/^tab(?<number>(.)*)$/)[1]);
selectTab(tab);
}
});
@ -263,4 +263,4 @@
{rdelim});
</script>
{/if}
</form>
</form>

View file

@ -349,7 +349,7 @@
};


self.updateSignature = function () {
$.fn.EmailsComposeView.updateSignature = self.updateSignature = function () {
var inboundId = $('#from_addr_name').find('option:selected').attr('inboundId');
if (inboundId === undefined) {
console.warn('Unable to retrieve selected inbound id in the "From" field.');
@ -1340,6 +1340,7 @@
$.fn.EmailsComposeView.loadAttachmentDataFromAjaxResponse(response);
$(form).find('[name="name"]').val(response.data.subject);
tinymce.activeEditor.setContent(response.data.body_from_html, {format: 'html'});
$.fn.EmailsComposeView.updateSignature();
});
set_return(args);
};

View file

@ -754,6 +754,11 @@ $dictionary['Email'] = array(
'type' => 'index',
'fields' => array('category_id')
),
array(
'name' => 'idx_email_uid',
'type' => 'index',
'fields' => array('uid')
),
) // end indices
);


View file

@ -186,6 +186,11 @@ class Employee extends Person

public function create_export_query($order_by, $where, $relate_link_join = '')
{
global $current_user;
if (!is_admin($current_user)) {
throw new RuntimeException('Not authorized');
}

include('modules/Employees/field_arrays.php');

$cols = '';

View file

@ -14,14 +14,13 @@ class IconRepository
*/
private static $iconNames = [
AOS_Contracts::class => 'aos-contracts-signature',
AOR_Scheduled_Reports::class => 'aor-reports',
'EmailTemplates' => 'emails',
'Employees' => 'users',
jjwg_Address_Cache::class => 'jjwg-markers',
'ProjectTask' => 'am-tasktemplates',
AM_ProjectTemplates::class => 'am-tasktemplates',
'SurveyQuestionOptions' => self::DEFAULT_ICON,
'SurveyQuestionResponses' => self::DEFAULT_ICON,
'SurveyQuestions' => self::DEFAULT_ICON,
'SurveyQuestionResponses' => 'survey-responses',
'SurveyResponses' => 'survey-responses',
'Prospects' => 'targets'
];
@ -33,8 +32,6 @@ class IconRepository
*/
public static function getIconName($module)
{
return isset(static::$iconNames[$module])
? static::$iconNames[$module]
: strtolower(str_replace('_', '-', $module));
return static::$iconNames[$module] ?? strtolower(str_replace('_', '-', $module));
}
}

View file

@ -615,6 +615,10 @@ $mod_strings = array(

//POPUP HELP
'LBL_POPHELP_FIELD_DATA_TYPE' => 'Select the appropriate data type based on the type of data that will be entered into the field.',
'LBL_POPHELP_IMPORTABLE' => '<b>Yes</b>: The field will be included in an import operation.<br><b>No</b>: The field will not be included in an import.<br><b>Required</b>: A value for the field must be provided in any import.',
'LBL_POPHELP_IMAGE_WIDTH' => 'Enter a number for Width, as measured in pixels.<br> The uploaded image will be scaled to this Width.',
'LBL_POPHELP_IMAGE_HEIGHT' => 'Enter a number for the Height, as measured in pixels.<br> The uploaded image will be scaled to this Height.',
'LBL_POPHELP_DUPLICATE_MERGE' => '<b>Enabled</b>: The field will appear in the Merge Duplicates feature, but will not be available to use for the filter conditions in the Find Duplicates feature.<br><b>Disabled</b>: The field will not appear in the Merge Duplicates feature, and will not be available to use for the filter conditions in the Find Duplicates feature.<br><b>Filter</b>: The field will appear in the Merge Duplicates feature, and will be available to use for the filter conditions in the Find Duplicates feature.<br><b>Default selected filter</b>: The field will appear in the Merge Duplicates feature, and will be used by default for the filter conditions in the Find Duplicates feature.<br><b>Only filter</b>: The field will not appear in the Merge Duplicates feature, but will be available to use for the filter conditions in the Find Duplicates feature.',

//Revert Module labels
'LBL_RESET' => 'Reset',

View file

@ -60,6 +60,11 @@ class ParserLabel
*/
protected $moduleName;

/**
* @var LoggerManager
*/
protected static $logger;

/**
* ParserLabel constructor.
* @param string $moduleName
@ -71,6 +76,16 @@ class ParserLabel
if (!empty($packageName)) {
$this->packageName = $packageName;
}

static::setLogger();
}

/**
* @return void
*/
protected static function setLogger()
{
static::$logger = LoggerManager::getLogger();
}

/**
@ -111,7 +126,9 @@ class ParserLabel
*/
public static function removeLabel($language, $label, $labelvalue, $moduleName, $basepath = null, $forRelationshipLabel = false)
{
$GLOBALS [ 'log' ]->debug("ParserLabel::removeLabels($language, \$label, \$labelvalue, $moduleName, $basepath );");
static::setLogger();

static::$logger->debug("ParserLabel::removeLabels($language, \$label, \$labelvalue, $moduleName, $basepath );");
if (is_null($basepath)) {
$deployedModule = true;
$basepath = "custom/modules/$moduleName/language";
@ -119,7 +136,7 @@ class ParserLabel
$basepath = "custom/modules/$moduleName/Ext/Language";
}
if (!is_dir($basepath)) {
$GLOBALS ['log']->debug("$basepath is not a directory.");
static::$logger->debug("$basepath is not a directory.");

return false;
}
@ -139,12 +156,12 @@ class ParserLabel
// obtain $mod_strings
include $filename;
} else {
$GLOBALS ['log']->debug("file $filename does not exist.");
static::$logger->debug("file $filename does not exist.");

return false;
}
} else {
$GLOBALS ['log']->debug("directory $basepath does not exist.");
static::$logger->debug("directory $basepath does not exist.");

return false;
}
@ -158,11 +175,11 @@ class ParserLabel

if ($changed) {
if (!write_array_to_file('mod_strings', $mod_strings, $filename)) {
$GLOBALS [ 'log' ]->fatal("Could not write $filename");
static::$logger->fatal("Could not write $filename");
} else {
// if we have a cache to worry about, then clear it now
if ($deployedModule) {
$GLOBALS ['log']->debug('PaserLabel::addLabels: clearing language cache');
static::$logger->debug('PaserLabel::addLabels: clearing language cache');
$cache_key = 'module_language.'.$language.$moduleName;
sugar_cache_clear($cache_key);
LanguageManager::clearLanguageCache($moduleName, $language);
@ -184,25 +201,21 @@ class ParserLabel
*/
public static function addLabels($language, $labels, $moduleName, $basepath = null, $forRelationshipLabel = false)
{
$GLOBALS [ 'log' ]->debug("ParserLabel::addLabels($language, \$labels, $moduleName, $basepath );");
$GLOBALS [ 'log' ]->debug('$labels:'.print_r($labels, true));
static::setLogger();

static::$logger->debug("ParserLabel::addLabels($language, \$labels, $moduleName, $basepath );");
static::$logger->debug('$labels:' . print_r($labels, true));

$deployedModule = false;
if (null === $basepath) {
$deployedModule = true;
$basepath = "custom/modules/$moduleName/language";
if ($forRelationshipLabel) {
$basepath = "custom/modules/$moduleName/Ext/Language";
}
$basepath = "custom/Extension/modules/$moduleName/Ext/Language";
if (!is_dir($basepath)) {
mkdir_recursive($basepath);
}
}

$filename = "$basepath/$language.lang.php";
if ($forRelationshipLabel) {
$filename = "$basepath/$language.lang.ext.php";
}
$filename = "$basepath/_override_$language.lang.php";
$dir_exists = is_dir($basepath);

$mod_strings = array();
@ -231,15 +244,15 @@ class ParserLabel
}

if ($changed) {
$GLOBALS [ 'log' ]->debug("ParserLabel::addLabels: writing new mod_strings to $filename");
$GLOBALS [ 'log' ]->debug('ParserLabel::addLabels: mod_strings='.print_r($mod_strings, true));
if (!write_array_to_file('mod_strings', $mod_strings, $filename)) {
$GLOBALS [ 'log' ]->fatal("Could not write $filename");
static::$logger->debug("ParserLabel::addLabels: writing new mod_strings to $filename");
static::$logger->debug('ParserLabel::addLabels: mod_strings='.print_r($mod_strings, true));
if (!write_override_label_to_file('mod_strings', $mod_strings, $filename)) {
static::$logger->fatal("Could not write $filename");
} else {
// if we have a cache to worry about, then clear it now
if ($deployedModule) {
SugarCache::cleanOpcodes();
$GLOBALS [ 'log' ]->debug('PaserLabel::addLabels: clearing language cache');
static::$logger->debug('PaserLabel::addLabels: clearing language cache');
$cache_key = 'module_language.'.$language.$moduleName;
sugar_cache_clear($cache_key);
LanguageManager::clearLanguageCache($moduleName, $language);
@ -295,8 +308,8 @@ class ParserLabel
fwrite($file_contents, $out, strlen($out));
fclose($file_contents);
} catch (Exception $e) {
$GLOBALS ['log']->fatal("Could not write $filename");
$GLOBALS ['log']->fatal('Exception '.$e->getMessage());
static::$logger->fatal("Could not write $filename");
static::$logger->fatal('Exception '.$e->getMessage());
}

//2. Overwrite custom/Extension/modules/relationships/language/{ModuleName}.php
@ -342,8 +355,8 @@ class ParserLabel
fwrite($file_contents, $out, strlen($out));
fclose($file_contents);
} catch (Exception $e) {
$GLOBALS ['log']->fatal("Could not write $filename");
$GLOBALS ['log']->fatal('Exception '.$e->getMessage());
static::$logger->fatal("Could not write $filename");
static::$logger->fatal('Exception '.$e->getMessage());
$failed_to_write = true;
}

@ -352,7 +365,7 @@ class ParserLabel
// if we have a cache to worry about, then clear it now
if ($deployedModule) {
SugarCache::cleanOpcodes();
$GLOBALS ['log']->debug('PaserLabel::addLabels: clearing language cache');
static::$logger->debug('PaserLabel::addLabels: clearing language cache');
$cache_key = 'module_language.'.$language.$moduleName;
sugar_cache_clear($cache_key);
LanguageManager::clearLanguageCache($moduleName, $language);

View file

@ -55,11 +55,11 @@ $focus->retrieve($_POST['record']);
if (isset($_POST['isDuplicate']) && $_POST['isDuplicate'] == true) {
$focus->id='';
$focus->name=$mod_strings['LBL_COPY_PREFIX'].' '.$focus->name;

$focus->save();
$return_id=$focus->id;
//duplicate the linked items.
$query = "select * from prospect_lists_prospects where prospect_list_id = '".$_POST['record']."'";
$query = "select * from prospect_lists_prospects where prospect_list_id = '". $focus->db->quote($_POST['record']) ."'";
$result = $focus->db->query($query);
if ($result != null) {
while (($row = $focus->db->fetchByAssoc($result)) != null) {

View file

@ -148,16 +148,16 @@ class DropDownHelper
//only if the value has changed or does not exist do we want to add it this way
if (!isset($my_list_strings[$dropdown_name][$key]) || strcmp($my_list_strings[$dropdown_name][$key], $value) != 0) {
//clear out the old value
$contents = preg_replace($this->getPatternMatchGlobal($dropdown_name), "\n", $contents);
$contents = preg_replace($this->getPatternMatch($dropdown_name), "\n", $contents);
$contents = preg_replace(self::getPatternMatchGlobal($dropdown_name), "\n", $contents);
$contents = preg_replace(self::getPatternMatch($dropdown_name), "\n", $contents);
//add the new ones
$contents .= "\n\$app_list_strings['$dropdown_name']['$key']=" . var_export_helper($value) . ";";
}
}
} else {
//clear out the old value
$contents = preg_replace($this->getPatternMatchGlobal($dropdown_name), "\n", $contents);
$contents = preg_replace($this->getPatternMatch($dropdown_name), "\n", $contents);
$contents = preg_replace(self::getPatternMatchGlobal($dropdown_name), "\n", $contents);
$contents = preg_replace(self::getPatternMatch($dropdown_name), "\n", $contents);
//add the new ones
$contents .= "\n\$app_list_strings['$dropdown_name']=" . var_export_helper($dropdown) . ";";
}
@ -175,13 +175,13 @@ class DropDownHelper
// ~~~~~~~~
}

public function getPatternMatchGlobal($dropdown_name)
public static function getPatternMatchGlobal($dropdown_name)
{
return '/\s*\$GLOBALS\s*\[\s*\'app_list_strings\s*\'\s*\]\[\s*\''
. $dropdown_name.'\'\s*\]\s*=\s*array\s*\([^\)]*\)\s*;\s*/ism';
}

public function getPatternMatch($dropdown_name)
public static function getPatternMatch($dropdown_name)
{
return '/\s*\$app_list_strings\s*\[\s*\''.$dropdown_name.'\'\s*\]\s*=\s*array\s*\([^\)]*\)\s*;\s*/ism';
}

View file

@ -606,6 +606,10 @@ class User extends Person implements EmailInterface
{
global $current_user, $mod_strings;

if (!$this->hasSaveAccess()) {
throw new RuntimeException('Not authorized');
}

$msg = '';

$isUpdate = !empty($this->id) && !$this->new_with_id;
@ -1591,6 +1595,11 @@ EOQ;

public function create_export_query($order_by, $where, $relate_link_join = '')
{
global $current_user;
if (!is_admin($current_user)) {
throw new RuntimeException('Not authorized');
}

include('modules/Users/field_arrays.php');

$cols = '';
@ -2437,4 +2446,25 @@ EOQ;
}
return $subTheme;
}

/**
* Check if current user can save the current user record
* @return bool
*/
protected function hasSaveAccess(): bool
{
global $current_user;

if (empty($this->id)) {
return true;
}

if (empty($current_user->id)) {
return true;
}

$sameUser = $current_user->id === $this->id;

return $sameUser || is_admin($current_user);
}
}

View file

@ -123,7 +123,7 @@
public function create_sugar_freebusy($user_bean, $start_date_time, $end_date_time)
{
$ical_array = array();
global $DO_USER_TIME_OFFSET, $timedate, $current_user;
global $DO_USER_TIME_OFFSET, $timedate;

$DO_USER_TIME_OFFSET = true;
if (empty($GLOBALS['current_user']) || empty($GLOBALS['current_user']->id)) {
@ -138,11 +138,11 @@
// loop thru each activity, get start/end time in UTC, and return FREEBUSY strings
foreach ($acts_arr as $act) {
if (empty($act->start_time)) {
$startTime = $timedate->fromUser($act->sugar_bean->date_start, $user_bean);
$act->start_time = $timedate->fromUser($act->sugar_bean->date_start, $user_bean);
}

if (empty($act->end_time)) {
$endTime = $timedate->fromUser($act->sugar_bean->date_finish, $user_bean);
$act->end_time = $timedate->fromUser($act->sugar_bean->date_finish, $user_bean);
}

$ID = $act->sugar_bean->id;

View file

@ -4,5 +4,5 @@ if (!defined('sugarEntry') || !sugarEntry) {
}

$suitecrm_version = '8.0.3';
$suitecrm_legacy = '7.12.3';
$suitecrm_timestamp = '2022-01-28 12:00:00';
$suitecrm_legacy = '7.12.5';
$suitecrm_timestamp = '2022-03-01 12:00:00';

View file

@ -128,6 +128,8 @@ class EmployeeTest extends SuitePHPUnitFrameworkTestCase
{
$employee = BeanFactory::newBean('Employees');

global $current_user;
$current_user->is_admin = '1';
//test with empty string params
$expected = "SELECT id, user_name, first_name, last_name, description, date_entered, date_modified, modified_user_id, created_by, title, department, is_admin, phone_home, phone_mobile, phone_work, phone_other, phone_fax, address_street, address_city, address_state, address_postalcode, address_country, reports_to_id, portal_only, status, receive_notifications, employee_status, messenger_id, messenger_type, is_group FROM users WHERE users.deleted = 0 ORDER BY users.user_name";
$actual = $employee->create_export_query('', '');
@ -137,6 +139,11 @@ class EmployeeTest extends SuitePHPUnitFrameworkTestCase
$expected = "SELECT id, user_name, first_name, last_name, description, date_entered, date_modified, modified_user_id, created_by, title, department, is_admin, phone_home, phone_mobile, phone_work, phone_other, phone_fax, address_street, address_city, address_state, address_postalcode, address_country, reports_to_id, portal_only, status, receive_notifications, employee_status, messenger_id, messenger_type, is_group FROM users WHERE users.user_name=\"\" AND users.deleted = 0 ORDER BY users.id";
$actual = $employee->create_export_query('users.id', 'users.user_name=""');
self::assertSame($expected, $actual);

$current_user->is_admin = '0';
$this->expectException(RuntimeException::class);
$employee->create_export_query('', '');

}

public function testpreprocess_fields_on_save(): void

View file

@ -683,16 +683,22 @@ class UserTest extends SuitePHPUnitFrameworkTestCase
{
$user = BeanFactory::newBean('Users');

global $current_user;
$current_user->is_admin = '1';
//test with empty string params
$expected = "SELECT id, user_name, first_name, last_name, description, date_entered, date_modified, modified_user_id, created_by, title, department, is_admin, phone_home, phone_mobile, phone_work, phone_other, phone_fax, address_street, address_city, address_state, address_postalcode, address_country, reports_to_id, portal_only, status, receive_notifications, employee_status, messenger_id, messenger_type, is_group FROM users WHERE users.deleted = 0 AND users.is_admin=0 ORDER BY users.user_name";
$expected = "SELECT id, user_name, first_name, last_name, description, date_entered, date_modified, modified_user_id, created_by, title, department, is_admin, phone_home, phone_mobile, phone_work, phone_other, phone_fax, address_street, address_city, address_state, address_postalcode, address_country, reports_to_id, portal_only, status, receive_notifications, employee_status, messenger_id, messenger_type, is_group FROM users WHERE users.deleted = 0 ORDER BY users.user_name";
$actual = $user->create_export_query('', '');
self::assertSame($expected, $actual);


//test with valid string params
$expected = "SELECT id, user_name, first_name, last_name, description, date_entered, date_modified, modified_user_id, created_by, title, department, is_admin, phone_home, phone_mobile, phone_work, phone_other, phone_fax, address_street, address_city, address_state, address_postalcode, address_country, reports_to_id, portal_only, status, receive_notifications, employee_status, messenger_id, messenger_type, is_group FROM users WHERE user_name=\"\" AND users.deleted = 0 AND users.is_admin=0 ORDER BY id";
$expected = "SELECT id, user_name, first_name, last_name, description, date_entered, date_modified, modified_user_id, created_by, title, department, is_admin, phone_home, phone_mobile, phone_work, phone_other, phone_fax, address_street, address_city, address_state, address_postalcode, address_country, reports_to_id, portal_only, status, receive_notifications, employee_status, messenger_id, messenger_type, is_group FROM users WHERE user_name=\"\" AND users.deleted = 0 ORDER BY id";
$actual = $user->create_export_query('id', 'user_name=""');
self::assertSame($expected, $actual);

$current_user->is_admin = '0';
$this->expectException(RuntimeException::class);
$user->create_export_query('', '');
}



View file

@ -1863,7 +1863,7 @@ div.qtip.qtip-default {
}

.search_form .view .dateTimeRangeChoice select {
width: 90px;
width: 130px;
margin-right: 4px;
}

@ -3422,7 +3422,7 @@ ul.clickMenu > li > span.searchAppliedAlert {

.search_form.non-popup input[type="text"] {
border: none;
height: 20px;
height: 28px;
min-height: 20px;
padding: 5px;
line-height: 20px;
@ -3430,10 +3430,11 @@ ul.clickMenu > li > span.searchAppliedAlert {

.search_form.non-popup select {
border: none;
height: 20px;
height: 28px;
min-height: 20px;
padding: 5px;
line-height: 20px;
width: 150px;
}

.search_form.non-popup textarea {

View file

@ -11,13 +11,13 @@
</td>
<td style="padding-right: 0px;" nowrap="" width="1%">
<div class="dashletToolSet">
<a href="javascript:void(0)" title="{$DASHLET_BUTTON_ARIA_REFRESH}" aria-label="{$DASHLET_BUTTON_ARIA_REFRESH}" onclick="SUGAR.mySugar.retrieveCurrentPage(); return false;">
<a href="javascript:void(0)" title="{$DASHLET_BUTTON_ARIA_REFRESH}" aria-label="{$DASHLET_BUTTON_ARIA_REFRESH}" onclick="SUGAR.mySugar.retrieveDashlet('{$DASHLET_ID}'); return false;">
<span class="refresh">{sugar_getimage name="refresh"}</span>
</a>
<a href="javascript:void(0)" title="{$DASHLET_BUTTON_ARIA_EDIT}" aria-label="{$DASHLET_BUTTON_ARIA_EDIT}" onclick="SUGAR.mySugar.configureDashlet('{$DASHLET_ID}'); return false;">
<span class="settings">{sugar_getimage name="settings"}</span>
</a>
<a href="javascript:void(0)" title="{$DASHLET_BUTTON_ARIA_DELETE}" aria-label="{$DASHLET_BUTTON_ARIA_DELETE}" onclick="SUGAR.mySugar.deleteDashlet('{$DASHLET_ID}'); return false;">
</a>
<a href="javascript:void(0)" title="{$DASHLET_BUTTON_ARIA_EDIT}" aria-label="{$DASHLET_BUTTON_ARIA_EDIT}" onclick="SUGAR.mySugar.configureDashlet('{$DASHLET_ID}'); return false;">
<span class="settings">{sugar_getimage name="settings"}</span>
</a>
<a href="javascript:void(0)" title="{$DASHLET_BUTTON_ARIA_DELETE}" aria-label="{$DASHLET_BUTTON_ARIA_DELETE}" onclick="SUGAR.mySugar.deleteDashlet('{$DASHLET_ID}'); return false;">
<span class="cross">{sugar_getimage name="cross"}</span>
</a>
</div>
@ -29,4 +29,4 @@
</div>
<div class="bd">
<div class="ml"></div>
<div class="bd-center">
<div class="bd-center">

View file

@ -351,7 +351,7 @@
$(function(){
$('#content ul.nav.nav-tabs > li > a[data-toggle="tab"]').click(function(e){
if(typeof $(this).parent().find('a').first().attr('id') != 'undefined') {
var tab = parseInt($(this).parent().find('a').first().attr('id').match(/^tab(.)*$/)[1]);
var tab = parseInt($(this).parent().find('a').first().attr('id').match(/^tab(?<number>(.)*)$/)[1]);
selectTabDetailView(tab);
}
});

View file

@ -249,7 +249,7 @@ $(document).ready(function() {ldelim}
$(function(){
$('#EditView_tabs ul.nav.nav-tabs li > a[data-toggle="tab"]').click(function(e){
if(typeof $(this).parent().find('a').first().attr('id') != 'undefined') {
var tab = parseInt($(this).parent().find('a').first().attr('id').match(/^tab(.)*$/)[1]);
var tab = parseInt($(this).parent().find('a').first().attr('id').match(/^tab(?<number>(.)*)$/)[1]);
selectTab(tab);
}
});