<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://sugarclub.sugarai.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Sugar 26.1 Customization Guide</title><link>https://sugarclub.sugarai.com/dev-club/w/dev-tutorials/1023/sugar-26-1-customization-guide</link><description /><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>Sugar 26.1 Customization Guide</title><link>https://sugarclub.sugarai.com/dev-club/w/dev-tutorials/1023/sugar-26-1-customization-guide</link><pubDate>Mon, 18 May 2026 19:00:08 GMT</pubDate><guid isPermaLink="false">5c521d64-519d-47a6-9065-134618b211bf:54ddf700-96e8-467a-9183-06eecc35ea07</guid><dc:creator>Rafael Fernandes</dc:creator><comments>https://sugarclub.sugarai.com/dev-club/w/dev-tutorials/1023/sugar-26-1-customization-guide#comments</comments><description>Current Revision posted to Dev Tutorials by Rafael Fernandes on 5/18/2026 7:00:08 PM&lt;br /&gt;
&lt;p&gt;The purpose of this document is to provide insight to Sugar Developers for upgrading custom Sugar code, extensions, and integrations to the Sugar 26.1 release. This guide focuses on changes in&amp;nbsp;&lt;span&gt;Sugar 26.1&lt;/span&gt;&amp;nbsp;that could cause an immediate impact on Sugar customizations and integrations built for earlier Sugar versions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For Admin and End User release notes, please visit the&amp;nbsp;&lt;a href="https://support.sugarcrm.com/SmartLinks/Release_Notes/26.1.0_Release_Notes/"&gt;Sugar 26.1.0 Release Notes&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_rest_api"&gt;Sugar REST API Updates&lt;/h2&gt;
&lt;p&gt;This Sugar release does not introduce a new REST API version. Both 25.2.0 and 26.1.0 expose &lt;code&gt;v11_27&lt;/code&gt; as the maximum supported version. Do not update integration code to reference a new version string.&lt;/p&gt;
&lt;h3 id="mcetoc_pagination"&gt;Pagination Change in FilterApi&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;next_offset&lt;/code&gt; in FilterApi list responses now returns &lt;code&gt;-1&lt;/code&gt; when the &lt;code&gt;id_query&lt;/code&gt; code path determines there are no further pages of results. Previously &lt;code&gt;next_offset&lt;/code&gt; was always a calculated positive integer even on the last page. This change applies only to the &lt;code&gt;id_query&lt;/code&gt; code path inside &lt;code&gt;FilterApi&lt;/code&gt; &amp;mdash; queries not using &lt;code&gt;id_query&lt;/code&gt; are unaffected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Update pagination logic to treat &lt;code&gt;next_offset === -1&lt;/code&gt; as the end-of-list signal. Do not pass the returned &lt;code&gt;next_offset&lt;/code&gt; directly as the next request&amp;#39;s &lt;code&gt;offset&lt;/code&gt; without first checking for &lt;code&gt;-1&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="mcetoc_teams_filter"&gt;New Endpoint &amp;mdash; Teams Filter&lt;/h3&gt;
&lt;p&gt;A new dedicated filter endpoint for the Teams module is now available:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;GET &amp;lt;sugar instance&amp;gt;/rest/v11_27/Teams?filter=...&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The endpoint extends &lt;code&gt;FilterApi&lt;/code&gt; with a custom join to the users table. Results include teams whose associated user has &lt;code&gt;status = &amp;#39;Active&amp;#39;&lt;/code&gt;, as well as teams with &lt;code&gt;associated_user_id IS NULL&lt;/code&gt;. This is additive &amp;mdash; no existing endpoint is replaced or changed.&lt;/p&gt;
&lt;h3 id="mcetoc_relate_users"&gt;RelateRecordApi &amp;mdash; Users Relationship Field Restriction&lt;/h3&gt;
&lt;p&gt;Previously, restricted field population (&lt;code&gt;erased_fields&lt;/code&gt;, limited &lt;code&gt;$userFields&lt;/code&gt;) was applied only when traversing the &lt;code&gt;aclroles&lt;/code&gt; relationship link to the Users module. This guard has been removed. The restriction now applies to all relationship links where the related module is &lt;code&gt;Users&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affected endpoint pattern:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;GET &amp;lt;sugar instance&amp;gt;/rest/v11_27/{Module}/{id}/link/{any_users_link}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Responses for any Users-module relationship traversal now return a reduced field set with &lt;code&gt;erased_fields&lt;/code&gt; applied, matching the behavior previously only seen on &lt;code&gt;aclroles&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Audit all integration code that traverses relationship links to the Users module. Ensure your integration handles the reduced field set and respects &lt;code&gt;erased_fields&lt;/code&gt; in the response.&lt;/p&gt;
&lt;h3 id="mcetoc_users_acl"&gt;UsersApi &amp;mdash; Field-Level ACL Enforcement on Record Retrieve&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;GET /rest/v11_27/Users/{id}&lt;/code&gt; now enforces field-level ACL permissions when a &lt;code&gt;fields&lt;/code&gt; parameter is present. If the calling user lacks access to any requested field, the endpoint returns &lt;code&gt;HTTP 404 Not Found&lt;/code&gt;. Fields most commonly affected: &lt;code&gt;user_hash&lt;/code&gt;, &lt;code&gt;system_generated_password&lt;/code&gt;, &lt;code&gt;is_admin&lt;/code&gt;, &lt;code&gt;portal_user_password&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Remove sensitive password and privilege fields from &lt;code&gt;fields&lt;/code&gt; parameters in Users API calls. Only request fields the API consumer has explicit permission to access.&lt;/p&gt;
&lt;h3 id="mcetoc_duplicate_username"&gt;UsersApi &amp;mdash; Duplicate Username Error Code Change&lt;/h3&gt;
&lt;p&gt;When a duplicate username is submitted during user creation, the HTTP status code changed from &lt;code&gt;403 Forbidden&lt;/code&gt; to &lt;code&gt;422 Unprocessable Entity&lt;/code&gt;. In 25.2.0, &lt;code&gt;User.php&lt;/code&gt; threw &lt;code&gt;SugarApiExceptionNotAuthorized&lt;/code&gt; (HTTP 403). In 26.1.0, &lt;code&gt;UsersApi::createUser()&lt;/code&gt; catches that exception when the label is &lt;code&gt;ERR_USER_NAME_EXISTS&lt;/code&gt; and re-throws it as &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; (HTTP 422). The error key &lt;code&gt;ERR_USER_NAME_EXISTS&lt;/code&gt; is unchanged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Update any code that checks for HTTP 403 to detect duplicate usernames &amp;mdash; change to 422.&lt;/p&gt;
&lt;h3 id="mcetoc_cache_control"&gt;Cache-Control Headers on All API Responses&lt;/h3&gt;
&lt;p&gt;All API responses now emit the following headers by default:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Expires: 0&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Previously, only error responses carried &lt;code&gt;Cache-Control: no-store&lt;/code&gt;. Successful responses had no cache directive. CDNs, reverse proxies (Varnish, Nginx cache), browser Service Workers, and integration middleware that previously cached Sugar API responses will be affected.&lt;/p&gt;
&lt;p&gt;Custom API routes that legitimately benefit from caching must now explicitly opt in by adding &lt;code&gt;&amp;#39;cacheEtag&amp;#39; =&amp;gt; true&lt;/code&gt; to their route definition:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;$routes = [
    [
        'name'      =&amp;gt; 'MyCustomEndpoint',
        'path'      =&amp;gt; '/MyModule',
        'method'    =&amp;gt; 'GET',
        'shortcut'  =&amp;gt; false,
        'cacheEtag' =&amp;gt; true,
    ],
];&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id="mcetoc_contains_warning"&gt;FilterApi &amp;mdash; $contains Warning on Relate Fields&lt;/h3&gt;
&lt;p&gt;Using the &lt;code&gt;$contains&lt;/code&gt; filter operator on &lt;code&gt;relate&lt;/code&gt; or &lt;code&gt;assigned_user_name&lt;/code&gt; field types now triggers a PHP &lt;code&gt;E_USER_WARNING&lt;/code&gt;. The query still executes but the warning is logged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Migrate &lt;code&gt;$contains&lt;/code&gt; filters on relate fields to the &lt;code&gt;$in&lt;/code&gt; operator.&lt;/p&gt;
&lt;h3 id="mcetoc_idm_portal_users"&gt;IDM Mode &amp;mdash; Portal and Group Users Now Deletable via API&lt;/h3&gt;
&lt;p&gt;In IDM-enabled environments, portal-only users (&lt;code&gt;portal_only = true&lt;/code&gt;) and group users (&lt;code&gt;is_group = true&lt;/code&gt;) are now exempt from the IDM deletion restriction and can be deleted via the API. Regular domain users remain non-deletable via API in IDM mode and must be managed through the identity management system.&lt;/p&gt;
&lt;h2 id="mcetoc_1gj9pc6si0"&gt;Supported Platforms Update&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PHP Support
&lt;ul&gt;
&lt;li&gt;We are dropping support for PHP&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;8.3&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and adding support to PHP&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;8.5&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;There isn&amp;#39;t an upgrade path from 8.3 to 8.5, you must ensure it follows the upgrade path 8.3 -&amp;gt; 8.4 -&amp;gt; 8.5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MySQL Support
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;We are dropping support for mysql 8.0.40&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Keep&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;support for MySQL 8.4.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MSSQL Support&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Keep support for MSSQL 2022&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Oracle Support
&lt;ul&gt;
&lt;li&gt;Keep support for Oracle 19&lt;/li&gt;
&lt;li&gt;&lt;b&gt;We are dropping support for Oracle 23&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adding support for Oracle 26&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(note that Oracle 26 is Oracle 23.26)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DB2 Support
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Keep&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;support for DB2 11.5.9&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adding support for DB2 12.1&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Search
&lt;ul&gt;
&lt;li&gt;Keep support for Elasticsearch&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;8.x&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Adding support for Elasticsearch&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;9.x&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Drop support for OpenSearch 2.7&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Keep support for OpenSearch 2.19&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adding support for OpenSearch 3.x&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_php_libs"&gt;PHP Library Upgrades&lt;/h2&gt;
&lt;h3 id="mcetoc_new_deps"&gt;New Dependencies&lt;/h3&gt;
&lt;p&gt;The following packages are new direct dependencies in 26.1.0:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;webklex/php-imap             6.2.0    Email / IMAP protocol support
illuminate/collections       v12.50.0 Laravel Collections utility
illuminate/support           v12.50.0 Laravel Support helpers
illuminate/pagination        v12.50.0 Laravel Pagination
nesbot/carbon                3.11.1   Enhanced datetime handling
symfony/polyfill-php83       v1.33.0  PHP 8.3 polyfills
symfony/polyfill-php84       v1.33.0  PHP 8.4 polyfills
symfony/polyfill-php85       v1.33.0  PHP 8.5 polyfills
symfony/translation          v6.4.32  Translation component
psr/clock                    1.0.0    PSR-20 clock interface
doctrine/inflector           2.1.0    String inflection

phpseclib/phpseclib was an indirect dependency in 25.2.0 (version 3.0.43) and has been promoted to a direct dependency in 26.1.0 (version 3.0.51). A security vulnerability in this library was also resolved in this release (SUS-618).

doctrine/cache 2.2.0 has been removed and replaced by the cache abstraction layer.&lt;/pre&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;&lt;/div&gt;
&lt;h3 id="mcetoc_major_bumps"&gt;Major Version Bumps&lt;/h3&gt;
&lt;p&gt;The following packages received major version bumps. Review any custom code that interacts with these libraries directly:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;firebase/php-jwt      7.0.0 (aliased as 6.11.0 in composer.json — low risk)
doctrine/lexer        3.0.1 (may affect custom query/annotation parsing)
ezimuel/guzzlestreams 4.1.0 (verify custom HTTP stream usage)&lt;/pre&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;&lt;/div&gt;
&lt;h3 id="mcetoc_notable_updates"&gt;Notable Version Updates&lt;/h3&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;microsoft/microsoft-graph    v2.56.0
onelogin/php-saml            3.8.1
google/apiclient             v2.19.0
aws/aws-sdk-php              3.374.2
guzzlehttp/guzzle            7.10.0
monolog/monolog              3.10.0
onelogin/php-saml            3.8.1
&lt;/pre&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_js_libs"&gt;JS Library Upgrades&lt;/h2&gt;
&lt;p&gt;No JavaScript library changes were made in this release.&lt;/p&gt;
&lt;h2 id="mcetoc_platforms"&gt;Supported Platforms Update&lt;/h2&gt;
&lt;h3 id="mcetoc_php85"&gt;PHP 8.5 Support Added&lt;/h3&gt;
&lt;p&gt;Sugar 26.1 adds support for PHP 8.5.x. The minimum supported version (PHP 8.2.0) is unchanged.&lt;/p&gt;
&lt;p&gt;PHP 8.5 support is enabled by the new &lt;code&gt;symfony/polyfill-php83&lt;/code&gt;, &lt;code&gt;symfony/polyfill-php84&lt;/code&gt;, and &lt;code&gt;symfony/polyfill-php85&lt;/code&gt; packages included in this release.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25.2.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26.1.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.2.x&lt;/td&gt;
&lt;td&gt;Supported (minimum)&lt;/td&gt;
&lt;td&gt;Supported (minimum)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.3.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.5.x&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Developers running PHP 8.4+ should audit custom code for PHP 8.4 deprecations, including implicitly nullable parameters and &lt;code&gt;null&lt;/code&gt; passed to non-nullable parameters in internal functions.&lt;/p&gt;
&lt;h3 id="mcetoc_oauth_exchange"&gt;Support for OAuth 2.0 Token-Based Authorization with Exchange Online&lt;/h3&gt;
&lt;p&gt;Sugar now supports sending emails via Microsoft Exchange Online using OAuth 2.0, in alignment with Microsoft&amp;#39;s announcement to permanently disable Basic Authentication for SMTP AUTH. When an outbound email account is configured using Microsoft OAuth 2.0, Sugar sends emails through the Microsoft Graph API instead of SMTP.&lt;/p&gt;
&lt;p&gt;A new token provider class &lt;code&gt;CustomGraphPhpLeagueAccessTokenProvider.php&lt;/code&gt; in &lt;code&gt;include/externalAPI/MicrosoftEmail/&lt;/code&gt; handles refresh-token persistence and EAPM record cleanup on error. Custom Microsoft integrations can leverage the callback-based token update lifecycle in this provider.&lt;/p&gt;
&lt;p&gt;To enable this functionality, administrators must register an application in Azure with the necessary API permissions (&lt;code&gt;Mail.Send&lt;/code&gt;, &lt;code&gt;Mail.Read&lt;/code&gt;, &lt;code&gt;IMAP.AccessAsUser.All&lt;/code&gt;, &lt;code&gt;offline_access&lt;/code&gt;) and configure the Microsoft connector in Sugar. This transition will occur automatically for existing Exchange Online OAuth accounts, but users will need to re-authorize their email accounts in Sugar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This improvement has been backported to Sugar 25.1.x.&lt;/p&gt;
&lt;h2 id="mcetoc_config"&gt;Configurability Updates&lt;/h2&gt;
&lt;h3 id="mcetoc_config_settings"&gt;New Sugar Config Settings&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Setting Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Override Example&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enable_sql_distinct_for_collections&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['enable_sql_distinct_for_collections'] = true;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enables SQL DISTINCT to prevent duplicate counting in list views and reports that filter on many-to-many collection fields (tags, email recipients). May impact query performance on large datasets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;db_archiver_persist_first_update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['db_archiver_persist_first_update'] = true;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserves one record in &lt;code&gt;pmse_bpm_flow&lt;/code&gt; (where &lt;code&gt;cas_index = 1&lt;/code&gt;) during DataArchiver hard-delete or archive operations on &lt;code&gt;pmse_Inbox&lt;/code&gt;, preventing the PMSE &amp;quot;First Update&amp;quot; logic from re-triggering on subsequent record updates. Must be explicitly enabled in &lt;code&gt;config_override.php&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job_batch_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job_batch_size'] = 250;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Records per delete batch for the Prune Database scheduler job.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.max_duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1200&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.max_duration'] = 600;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Max seconds per Prune Database scheduler run.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.max_table_retry_count&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.max_table_retry_count'] = 5;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skip a table after N consecutive failures.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.failure_reset_days&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.failure_reset_days'] = 14;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reset failure count after N days.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.deadlock_retry_attempts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.deadlock_retry_attempts'] = 5;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retry attempts on deadlock.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.deadlock_retry_delay_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;[100, 500, 2000]&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;Exponential backoff delays in milliseconds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.enable_failure_tracking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.enable_failure_tracking'] = false;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Track failed tables across Prune Database runs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All Prune Database keys are optional &amp;mdash; existing deployments do not need to set them.&lt;/p&gt;
&lt;h2 id="mcetoc_removed"&gt;Removed Functions / Libraries / Features&lt;/h2&gt;
&lt;h3 id="mcetoc_removed_js"&gt;Removed JavaScript Files&lt;/h3&gt;
&lt;p&gt;Two JavaScript files present in 25.2.0 are completely absent in 26.1.0:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;include/javascript/phaser/phaser-sugar.min.js&lt;/code&gt;&lt;/strong&gt; &amp;mdash; The Phaser game engine has been removed. Any custom module, dashlet, or Sugar7 plugin referencing the Phaser global will throw a JavaScript error at page load.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;include/javascript/sugar7/plugins/CanvasDataRenderer.js&lt;/code&gt;&lt;/strong&gt; &amp;mdash; The canvas-based data chart rendering plugin has been removed. Any custom code calling &lt;code&gt;App.plugins.load(&amp;#39;CanvasDataRenderer&amp;#39;)&lt;/code&gt; will fail at load time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Remove all Phaser and CanvasDataRenderer references from custom code. For charting, migrate to Sugar&amp;#39;s native &lt;code&gt;Charts&lt;/code&gt; plugin or bundle an alternative charting library within your customization package.&lt;/p&gt;
&lt;h3 id="mcetoc_deprecated_funcs"&gt;Deprecated Functions and Methods&lt;/h3&gt;
&lt;p&gt;The following functions and methods carry &lt;code&gt;@deprecated&lt;/code&gt; annotations and are scheduled for removal in a future release. They were deprecated prior to 26.1 and continue to function in 26.1 but should be migrated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Superglobal sanitization helpers&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/utils.php&lt;/code&gt;. In-code message: &lt;em&gt;&amp;quot;Superglobal sanitizing will be completely abandoned. Use the new InputValidation service instead.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_POST()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_GET()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_COOKIE()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_REQUEST()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_SERVER()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_FILES()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;General utility functions&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/utils.php&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_guid()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sugarcrm\Sugarcrm\Util\Uuid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_guid_section()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sugarcrm\Sugarcrm\Util\Uuid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_theme_name()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarThemeRegistry::get($theme)-&amp;gt;name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_available_themes()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarThemeRegistry::availableThemes()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Database audit methods&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/database/DBManager.php&lt;/code&gt;. The audit API is moving from the DB layer to &lt;code&gt;SugarBean&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::auditSQL()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::auditSQL()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::saveAuditRecords()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::saveAuditRecords()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::getAuditDataChanges()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::getAuditDataChanges()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::generateInsertSQL()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use parameterized queries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Deprecated REST endpoint actions:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deprecated element&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Use instead&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clients/base/api/RelatedActivitiesApi.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;recordListView&lt;/code&gt; action&lt;/td&gt;
&lt;td&gt;&lt;code&gt;activitiesList&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clients/base/api/PersonFilterApi.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;useOnlyActiveUsers()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;mdash; (deprecated since 13.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="mcetoc_data_changes"&gt;Data Changes&lt;/h2&gt;
&lt;h3 id="mcetoc_email_denorm"&gt;Email Denormalization Upgrade Script&lt;/h3&gt;
&lt;p&gt;A new upgrade script &lt;code&gt;upgrade/scripts/post/9_DenormalizeEmailsFields.php&lt;/code&gt; runs on upgrade and adds four columns to &lt;code&gt;emails_email_addr_rel&lt;/code&gt;, backfilled from the &lt;code&gt;emails&lt;/code&gt; table:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;date_sent&lt;/code&gt; (datetime)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;team_set_id&lt;/code&gt; (id)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;state&lt;/code&gt; (varchar(100))&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assigned_user_id&lt;/code&gt; (id)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A new index &lt;code&gt;idx_eearl_email_sent&lt;/code&gt; is also created on &lt;code&gt;[email_address_id, deleted, team_set_id, date_sent DESC, email_id]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; On instances with large archived email volumes, the &lt;code&gt;UPDATE ... JOIN&lt;/code&gt; backfill and index creation can take 10&amp;ndash;45+ minutes and hold row-level locks. A mid-run failure leaves partially denormalized data. Pre-upgrade recommendation for large instances: run the Prune Database scheduler job to completion before upgrading to reduce email table size.&lt;/p&gt;
&lt;h3 id="mcetoc_vardef_changes"&gt;New Indexes and Vardef Changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;int&lt;/code&gt; field &lt;code&gt;job_run_order&lt;/code&gt; (default &lt;code&gt;1&lt;/code&gt;) added to the &lt;code&gt;Schedulers&lt;/code&gt; module. A Repair/Rebuild is required post-upgrade.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DynamicFields.default_value&lt;/code&gt; type changed from &lt;code&gt;varchar(255)&lt;/code&gt; to &lt;code&gt;text&lt;/code&gt;. Any custom code that reads &lt;code&gt;default_value&lt;/code&gt; and enforces a 255-character maximum must be updated &amp;mdash; the field is now unbounded.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Documents.name.sort_on&lt;/code&gt; changed from &lt;code&gt;name&lt;/code&gt; to &lt;code&gt;document_name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;validateModel: true&lt;/code&gt; added to the Assign, Claim, and Close action button definitions in the Cases module vardefs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template_supported =&amp;gt; true&lt;/code&gt; added to the &lt;code&gt;Dashboards&lt;/code&gt; and &lt;code&gt;Reports&lt;/code&gt; module metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_platform_updates"&gt;Platform Updates&lt;/h2&gt;
&lt;h3 id="mcetoc_logic_hook"&gt;Logic Hook Resilience &amp;mdash; Exception Handling&lt;/h3&gt;
&lt;p&gt;Both static and instance hook invocations in &lt;code&gt;include/utils/LogicHook.php&lt;/code&gt; are now wrapped in individual try-catch blocks. &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; exceptions are re-thrown (correct for API validation contexts); all other &lt;code&gt;Throwable&lt;/code&gt; errors are caught, logged as fatal, and surfaced as a system notification to admins via a new &lt;code&gt;saveNotification()&lt;/code&gt; method. A static cache ensures at most one notification per user-module pair per session. A failing custom hook no longer crashes the entire bean operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Custom hooks that previously failed silently will now emit a system notification. Monitor logs for &lt;code&gt;&amp;quot;Error executing hook&amp;quot;&lt;/code&gt; entries. Hooks used in API contexts should throw &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; to return proper HTTP 422 responses.&lt;/p&gt;
&lt;h3 id="mcetoc_referrer_policy"&gt;&lt;/h3&gt;
&lt;h3 id="mcetoc_pdf_logo"&gt;PDF Manager Logo Format Validation&lt;/h3&gt;
&lt;p&gt;PDF template header logos are now validated at save time. Supported formats: &lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.jpeg&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt;, &lt;code&gt;.gif&lt;/code&gt;, &lt;code&gt;.bmp&lt;/code&gt;. Unsupported formats (&lt;code&gt;.webp&lt;/code&gt;, &lt;code&gt;.svg&lt;/code&gt;, &lt;code&gt;.tiff&lt;/code&gt;, &lt;code&gt;.tif&lt;/code&gt;, &lt;code&gt;.heic&lt;/code&gt;) are rejected with &lt;code&gt;HTTP 422 SugarApiExceptionInvalidParameter&lt;/code&gt; via the REST API, or an error message via the BWC UI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Convert all PDF template header logos to JPEG or PNG before upgrading. Update any integration that programmatically sets the &lt;code&gt;header_logo&lt;/code&gt; field to validate format before submission.&lt;/p&gt;
&lt;h3 id="mcetoc_timezone_util"&gt;&lt;/h3&gt;
&lt;h3 id="mcetoc_prune_rewrite"&gt;PruneDatabase Scheduler Rewrite&lt;/h3&gt;
&lt;p&gt;The Prune Database scheduler job has been rewritten in &lt;code&gt;src/Schedulers/Jobs/PruneDatabaseService.php&lt;/code&gt; with deadlock resilience (exponential backoff retry), audit table orphan cleanup, and per-table failure tracking across runs. See the Configurability Updates section for the new optional config keys.&lt;/p&gt;
&lt;h3 id="mcetoc_bug_fixes"&gt;Bug Fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a fatal error that occurred during upgrade from 25.1.x to 25.2.0 (BR-13007).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the 26.1 install wizard failed with a 500 error on MySQL (SUS-571).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar failed to load properly after upgrade on Windows (SUS-126).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors on the Repair &amp;amp; Rebuild step during upgrade from 14.0.4 to 25.1.3 in multi-tenant setups (SUS-448).&lt;/li&gt;
&lt;li&gt;Fixed an issue where upgrading to 26.1.0 caused failures on instances with API customizations (SUS-548).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Show Changes feature in Opportunities returned a fatal error after upgrading to 25.2.0 (CSI 98647).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sales stage and dropdown colors were lost after module install/uninstall on upgraded or cloned instances (CSI 98237).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the upgrade script for the &lt;code&gt;job_run_order&lt;/code&gt; field was incorrectly included; the script has been removed (SUS-476).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Module Loader upload failed with &amp;quot;Could not find package file&amp;quot; when &lt;code&gt;upload_dir&lt;/code&gt; was configured outside the Sugar root directory (CSI 99111).&lt;/li&gt;
&lt;li&gt;Fixed an issue where package installation failures occurred due to missing core classes related to PHP opcache corruption (CSI 98229).&lt;/li&gt;
&lt;li&gt;Fixed an issue where modifying an out-of-the-box dropdown caused the Package Scanner to fail installation of customizations exported via Studio (CSI 96552).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Package Builder and Deployer did not include all files when exporting custom subpanels (CSI 97739).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Cloud Insights link on the Administration page failed to load due to a CSP violation (CSI 98233).&lt;/li&gt;
&lt;li&gt;Fixed a PHP Fatal error: &lt;code&gt;Uncaught Error: Class &amp;quot;Nonce&amp;quot; not found&lt;/code&gt; (BR-13243).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors being hidden by &lt;code&gt;Uncaught DomainException: The given security subject is not active&lt;/code&gt; (SI 89298).&lt;/li&gt;
&lt;li&gt;Fixed a &lt;code&gt;Class &amp;quot;Module&amp;quot; Not Found&lt;/code&gt; fatal error when &lt;code&gt;class_map.php&lt;/code&gt; contained a &lt;code&gt;false&lt;/code&gt; entry for a custom module (CSI 98855).&lt;/li&gt;
&lt;li&gt;Fixed a PHP Fatal Error in &lt;code&gt;ForecastMetricsApi.php&lt;/code&gt; during Forecast calculation caused by an &lt;code&gt;array_merge&lt;/code&gt; type mismatch (CSI 98542).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; when switching between tabs in Forecasts (SUS-122).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Filter API returned an incorrect results count (BR-13041).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Filter API returned wrong record count, incorrect offset, and missing records in JSON results (CSI 95384).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the FilterAPI response field order did not match the request body after field modifications (CSI 97467).&lt;/li&gt;
&lt;li&gt;Fixed an issue with the &lt;code&gt;/Reports/:record/records&lt;/code&gt; endpoint in API version v11_25 (SUS-123).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;SugarACLActivities&lt;/code&gt; triggered a 500 error when the activity&amp;#39;s parent bean was no longer accessible to the user (CSI 98342).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a query failure in a report incorrectly returned a permission error message (CSI 95685).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an improperly formatted date filter value threw an unhelpful server error on reports (CSI 94709).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;Contains&lt;/code&gt; filter on &lt;code&gt;Assigned To&lt;/code&gt; and other relationship fields forced a full selection, causing timeouts on list views and dashlets at high record volumes (CSI 98159).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Global Search failed to index when a comment log entry exceeded 32,000 characters (CSI 97481).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Global Search could exceed the &lt;code&gt;maxClauseCount&lt;/code&gt; threshold when executing queries with multiple hyphen-separated tokens (CSI 97570).&lt;/li&gt;
&lt;li&gt;Fixed an issue where SugarBPM being an application hook forced execution order relative to module-level logic hooks (SI 83796).&lt;/li&gt;
&lt;li&gt;Fixed an issue where SugarBPM Send Message events after a Wait step did not respect User Locale, Language, or Timezone settings when field variables were included in a Process Email Template (SUS-9).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a SugarBPM Receive Message Event was set to &lt;code&gt;COMPLETED&lt;/code&gt; instead of &lt;code&gt;CLOSED&lt;/code&gt; in &lt;code&gt;pmse_bpm_flow&lt;/code&gt;, causing records to become stuck in a process (SI 82401).&lt;/li&gt;
&lt;li&gt;Fixed a PHP 500 fatal error in the SugarBPM validator when processing older process definitions (CSI 95495).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Process Management failed to load or became progressively slower when hundreds of thousands of Process records existed (SI 89542).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Quick Repair and Rebuild caused API-triggered BPM document generation via DocMerge to fail (CSI 96056).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an HTTP 500 error occurred when saving a new Revenue Line Item with a custom field and a BPM Process Definition using Relationship Change Criteria (CSI 92792).&lt;/li&gt;
&lt;li&gt;Fixed an issue where hard-deleting data in &lt;code&gt;pmse_inbox&lt;/code&gt; caused a process to retrigger again (CSI 93985).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an Unauthorized Creation of Process Definition was possible when a user had Developer Access to at least one module (SUS-124).&lt;/li&gt;
&lt;li&gt;Fixed an issue where adding a column to a Case subpanel in Studio caused fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; (SUS-152).&lt;/li&gt;
&lt;li&gt;Fixed a severe CPU spike and instance unresponsiveness triggered by a Studio configuration change (CSI 98411).&lt;/li&gt;
&lt;li&gt;Fixed an issue where fields could not be added to a subpanel layout if the layout had no existing fields (SI 86285).&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting a relationship left orphaned files in the Vardefs directory causing an &lt;code&gt;Error: Invalid link&lt;/code&gt; (SI 89679).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Dropdown Styles Extension files were not rebuilt during Quick Repair and Rebuild (CSI 95294).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a missing Expression caused &lt;code&gt;MetadataManager&lt;/code&gt; to fail, making the site inaccessible with a 500 error (SI 82950).&lt;/li&gt;
&lt;li&gt;Fixed an issue where invalid formulas could be saved in Studio, resulting in a crashed instance (SI 81905).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Prune Database run on the 1st of the month orphaned audit records when parent records were deleted (SI 86770).&lt;/li&gt;
&lt;li&gt;Fixed an issue where OAuth 2.0 authentication with Exchange Online only sent one campaign email (CSI 98254).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Microsoft OAuth2 email authentication token expired after 90 days rather than refreshing (SUS-93).&lt;/li&gt;
&lt;li&gt;Fixed an issue where email accounts configured via Exchange Online did not allow users to send as other approved email addresses (BR-13300).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Email &amp;quot;From Name&amp;quot; was not being calculated correctly when sending via Microsoft Exchange (BR-13288).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Inbound Email Scheduler failed to archive all emails and prematurely removed them from the inbox (CSI 95509).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Inbound Email Scheduler logged a &lt;code&gt;stat(): failed&lt;/code&gt; error in the job queue when downloading emails with attachments (SI 67377).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; during execution of the &lt;code&gt;pollMonitoredInboxesForBouncedCampaignEmails&lt;/code&gt; and &lt;code&gt;pollMonitoredInboxes&lt;/code&gt; scheduler jobs (SUS-251).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; during mail account setup (SUS-471).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;email_mailer_timelimit&lt;/code&gt; and &lt;code&gt;email_mailer_timeout&lt;/code&gt; config options resulted in delays when sending a test email (CSI 92799).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an imported email from a sender with a non-UTF-8 encoding caused the email record view to fail to load (CSI 95960).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a DB500 error could occur in the Emails Subpanel and Timeline Dashlet when loading archived emails indirectly related to a contact (CSI 97607).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sorting certain Emails subpanel columns caused a database error (CSI 98525).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sorting columns in the Emails subpanel in Cases resulted in the error &lt;code&gt;Error: Unknown field&lt;/code&gt; (CSI 98344).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Report Grouping on a datetime field used UTC/GMT time instead of the user&amp;#39;s timezone (CSI 96346).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a report showed single-digit day/month dates when a UK/EU date format was set in the user profile (CSI 97195).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a database error occurred on reports when sorting by deleted fields (CSI 95763).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;SUM&lt;/code&gt;, &lt;code&gt;MIN&lt;/code&gt;, &lt;code&gt;MAX&lt;/code&gt;, and &lt;code&gt;AVG&lt;/code&gt; summary options for the &lt;code&gt;Duration Minutes&lt;/code&gt; field were missing in Summation Reports for Calls and Meetings (SI 79984).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Advanced Reports Custom Query builder returned a 404 instead of an invalid query screen (SI 86985).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the incorrect export delimiter was used when exporting Advanced Reports to CSV (SI 77564).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Report Chart did not sort based on the Display Summaries sort order (SI 80778).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Advanced Reports could not be scheduled due to a CSP violation (BR-13388).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar Logic was not calculated until after Save for formulas using the &lt;code&gt;relate&lt;/code&gt; function against Activities Flex relationships (SI 73566).&lt;/li&gt;
&lt;li&gt;Fixed an issue where formula validation of Calculation fields did not work properly (SI 77548).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Assigned User fields were not evaluated properly by a &lt;code&gt;Required if&lt;/code&gt; formula in another module (CSI 92022).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a &lt;code&gt;Required If&lt;/code&gt; formula containing a related link caused the Focus Drawer Record View Dashlet to break (CSI 92769).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;Listview Actions&lt;/code&gt; dropdown menu disappeared when certain &lt;code&gt;Read Only If&lt;/code&gt; formulas were applied (CSI 92089).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a dependent &lt;code&gt;related&lt;/code&gt; formula did not display data in a subpanel (SI 80275).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar did not reconnect to the database after a query was killed by the Slow Query Killer or a timeout (BR-12110).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Prune Database stalled on large tables (SI 80852).&lt;/li&gt;
&lt;li&gt;Fixed an issue where before_save hook changes were not audited (CSI 96102).&lt;/li&gt;
&lt;li&gt;Fixed a DB syntax error appearing in &lt;code&gt;sugarcrm.log&lt;/code&gt; (BR-13260).&lt;/li&gt;
&lt;li&gt;Fixed an issue where PDF templates could not render images stored within the Sugar instance (BR-13091).&lt;/li&gt;
&lt;li&gt;Fixed an issue where editing a PDF template broke it (CSI 98492).&lt;/li&gt;
&lt;li&gt;Fixed an issue where TCPDF PDF templates no longer converted spaces in image file names (CSI 94322).&lt;/li&gt;
&lt;li&gt;Fixed an issue where DocMerge produced documents failed to open if a &lt;code&gt;related()&lt;/code&gt; formula value contained the special symbol &lt;code&gt;&amp;amp;&lt;/code&gt; (CSI 94295).&lt;/li&gt;
&lt;li&gt;Fixed login failures including erroneous STS Auth errors, unauthorized access, and return-to-login loops associated with Identity Management (CSI 95337).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Refresh Token in an IDM-enabled instance did not live longer than 24 hours (BR-13036).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a regular user with &lt;code&gt;external_auth_only = 1&lt;/code&gt; did not appear in the Shared Calendar list (SI 89482).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the FilterAPI incorrectly returned extra fields in the response even when the &lt;code&gt;fields&lt;/code&gt; argument was specified (BR-13048).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Group Users could not be deleted (CSI 95066).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;LBL_SHOW_MORE&lt;/code&gt; label on Text Area fields could display &amp;quot;Show More Cases&amp;quot; instead of &amp;quot;Show More&amp;quot; (CSI 97216).&lt;/li&gt;
&lt;li&gt;Fixed an issue where currency field sorting triggered a DB error in custom modules with &lt;code&gt;base_rate&lt;/code&gt; in the &lt;code&gt;_cstm&lt;/code&gt; table after upgrading to 25.2 (CSI 98412).&lt;/li&gt;
&lt;li&gt;Fixed an issue where List View Count was inaccurate when filtering on multiple Tags for records related to multiple tags (SI 83020).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &amp;quot;Claim&amp;quot; Action Button did not respect &amp;quot;Required If&amp;quot; field validation (CSI 94987).&lt;/li&gt;
&lt;li&gt;Fixed an issue where PHP opcache corruption caused &lt;code&gt;Call to undefined method&lt;/code&gt; fatal errors (SUS-315).&lt;/li&gt;
&lt;li&gt;Fixed an issue where regular users triggered redundant rebuilds after an admin QRR due to &lt;code&gt;SystemProcessLock&lt;/code&gt;, causing server overload (SUS-304).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Scheduler UI displayed job run times in an unexpected timezone (BR-13130).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the email &amp;quot;From&amp;quot; filter behavior was inconsistent when raw email addresses were used as primary addresses on records (CSI 91283).&lt;/li&gt;
&lt;li&gt;Fixed an issue where installing Sugar locally under certain offline conditions failed (CSI 97111).&lt;/li&gt;
&lt;li&gt;Fixed an issue where using the &lt;code&gt;email_addresses_primary&lt;/code&gt; field in a template for a custom URL field resulted in a 500 error when opening any record in the module (SUS-288).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Sugar Market Integration used a deprecated API call (SE-9850).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a &amp;quot;Page does not exist&amp;quot; error appeared when creating a new Case with an attachment (CSI 94268).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Emails subpanel used an inefficient search query, resulting in slow performance with large record counts (CSI 98123).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an error occurred during MLP uninstallation (SUS-441).&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting relationships could break list views (SI 87737).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Product Catalog Dashlet displayed duplicated and inaccessible entries under specific Product Category and Template configurations (CSI 95867).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_security_updates"&gt;Sugar Core Security Updates&lt;/h2&gt;
&lt;p&gt;As part of our ongoing efforts to keep Sugar clean, fast, reliable, and most importantly secure, we have updated Sugar Core code in different areas of the application such as Package Scanner, Studio, Module Installer, UI rendering, API endpoints, Legacy SOAP API, File Uploads, Portal, PII Fields, ACL rules, Legacy Workflows, HTTP Headers (Referrer-Policy Header), SVG File Upload Sanitization, and BWC modules. We have also cleaned up and improved our logging messages around deprecations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some of those security improvements were backported to Sugar 25.1.x.&lt;/p&gt;
&lt;h2 id="mcetoc_healthcheck"&gt;Healthcheck Updates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Built a healthcheck to detect and reclassify &lt;code&gt;badVardefsMultienum&lt;/code&gt; issues from bucket &lt;code&gt;MANUAL&lt;/code&gt; to bucket &lt;code&gt;CUSTOM&lt;/code&gt;. The rule ID also changed from 526 (25.2.0) to 452 (26.1.0). Update any CI scripts or monitoring dashboards filtering on this rule&amp;#39;s ID or bucket.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Sugar 26.1 Customization Guide</title><link>https://sugarclub.sugarai.com/dev-club/w/dev-tutorials/1023/sugar-26-1-customization-guide/revision/2</link><pubDate>Fri, 15 May 2026 15:54:44 GMT</pubDate><guid isPermaLink="false">5c521d64-519d-47a6-9065-134618b211bf:54ddf700-96e8-467a-9183-06eecc35ea07</guid><dc:creator>Rafael Fernandes</dc:creator><comments>https://sugarclub.sugarai.com/dev-club/w/dev-tutorials/1023/sugar-26-1-customization-guide#comments</comments><description>Revision 2 posted to Dev Tutorials by Rafael Fernandes on 5/15/2026 3:54:44 PM&lt;br /&gt;
&lt;p&gt;The purpose of this document is to provide insight to Sugar Developers for upgrading custom Sugar code, extensions, and integrations to the Sugar 26.1 release. This guide focuses on changes in&amp;nbsp;&lt;span&gt;Sugar 26.1&lt;/span&gt;&amp;nbsp;that could cause an immediate impact on Sugar customizations and integrations built for earlier Sugar versions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For Admin and End User release notes, please visit the&amp;nbsp;&lt;a href="https://support.sugarcrm.com/SmartLinks/Release_Notes/26.1.0_Release_Notes/"&gt;Sugar 26.1.0 Release Notes&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_rest_api"&gt;Sugar REST API Updates&lt;/h2&gt;
&lt;p&gt;This Sugar release does not introduce a new REST API version. Both 25.2.0 and 26.1.0 expose &lt;code&gt;v11_27&lt;/code&gt; as the maximum supported version. Do not update integration code to reference a new version string.&lt;/p&gt;
&lt;h3 id="mcetoc_pagination"&gt;Pagination Change in FilterApi&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;next_offset&lt;/code&gt; in FilterApi list responses now returns &lt;code&gt;-1&lt;/code&gt; when the &lt;code&gt;id_query&lt;/code&gt; code path determines there are no further pages of results. Previously &lt;code&gt;next_offset&lt;/code&gt; was always a calculated positive integer even on the last page. This change applies only to the &lt;code&gt;id_query&lt;/code&gt; code path inside &lt;code&gt;FilterApi&lt;/code&gt; &amp;mdash; queries not using &lt;code&gt;id_query&lt;/code&gt; are unaffected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Update pagination logic to treat &lt;code&gt;next_offset === -1&lt;/code&gt; as the end-of-list signal. Do not pass the returned &lt;code&gt;next_offset&lt;/code&gt; directly as the next request&amp;#39;s &lt;code&gt;offset&lt;/code&gt; without first checking for &lt;code&gt;-1&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="mcetoc_teams_filter"&gt;New Endpoint &amp;mdash; Teams Filter&lt;/h3&gt;
&lt;p&gt;A new dedicated filter endpoint for the Teams module is now available:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;GET &amp;lt;sugar instance&amp;gt;/rest/v11_27/Teams?filter=...&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The endpoint extends &lt;code&gt;FilterApi&lt;/code&gt; with a custom join to the users table. Results include teams whose associated user has &lt;code&gt;status = &amp;#39;Active&amp;#39;&lt;/code&gt;, as well as teams with &lt;code&gt;associated_user_id IS NULL&lt;/code&gt;. This is additive &amp;mdash; no existing endpoint is replaced or changed.&lt;/p&gt;
&lt;h3 id="mcetoc_relate_users"&gt;RelateRecordApi &amp;mdash; Users Relationship Field Restriction&lt;/h3&gt;
&lt;p&gt;Previously, restricted field population (&lt;code&gt;erased_fields&lt;/code&gt;, limited &lt;code&gt;$userFields&lt;/code&gt;) was applied only when traversing the &lt;code&gt;aclroles&lt;/code&gt; relationship link to the Users module. This guard has been removed. The restriction now applies to all relationship links where the related module is &lt;code&gt;Users&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affected endpoint pattern:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;GET &amp;lt;sugar instance&amp;gt;/rest/v11_27/{Module}/{id}/link/{any_users_link}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Responses for any Users-module relationship traversal now return a reduced field set with &lt;code&gt;erased_fields&lt;/code&gt; applied, matching the behavior previously only seen on &lt;code&gt;aclroles&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Audit all integration code that traverses relationship links to the Users module. Ensure your integration handles the reduced field set and respects &lt;code&gt;erased_fields&lt;/code&gt; in the response.&lt;/p&gt;
&lt;h3 id="mcetoc_users_acl"&gt;UsersApi &amp;mdash; Field-Level ACL Enforcement on Record Retrieve&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;GET /rest/v11_27/Users/{id}&lt;/code&gt; now enforces field-level ACL permissions when a &lt;code&gt;fields&lt;/code&gt; parameter is present. If the calling user lacks access to any requested field, the endpoint returns &lt;code&gt;HTTP 404 Not Found&lt;/code&gt;. Fields most commonly affected: &lt;code&gt;user_hash&lt;/code&gt;, &lt;code&gt;system_generated_password&lt;/code&gt;, &lt;code&gt;is_admin&lt;/code&gt;, &lt;code&gt;portal_user_password&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Remove sensitive password and privilege fields from &lt;code&gt;fields&lt;/code&gt; parameters in Users API calls. Only request fields the API consumer has explicit permission to access.&lt;/p&gt;
&lt;h3 id="mcetoc_duplicate_username"&gt;UsersApi &amp;mdash; Duplicate Username Error Code Change&lt;/h3&gt;
&lt;p&gt;When a duplicate username is submitted during user creation, the HTTP status code changed from &lt;code&gt;403 Forbidden&lt;/code&gt; to &lt;code&gt;422 Unprocessable Entity&lt;/code&gt;. In 25.2.0, &lt;code&gt;User.php&lt;/code&gt; threw &lt;code&gt;SugarApiExceptionNotAuthorized&lt;/code&gt; (HTTP 403). In 26.1.0, &lt;code&gt;UsersApi::createUser()&lt;/code&gt; catches that exception when the label is &lt;code&gt;ERR_USER_NAME_EXISTS&lt;/code&gt; and re-throws it as &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; (HTTP 422). The error key &lt;code&gt;ERR_USER_NAME_EXISTS&lt;/code&gt; is unchanged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Update any code that checks for HTTP 403 to detect duplicate usernames &amp;mdash; change to 422.&lt;/p&gt;
&lt;h3 id="mcetoc_cache_control"&gt;Cache-Control Headers on All API Responses&lt;/h3&gt;
&lt;p&gt;All API responses now emit the following headers by default:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Expires: 0&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Previously, only error responses carried &lt;code&gt;Cache-Control: no-store&lt;/code&gt;. Successful responses had no cache directive. CDNs, reverse proxies (Varnish, Nginx cache), browser Service Workers, and integration middleware that previously cached Sugar API responses will be affected.&lt;/p&gt;
&lt;p&gt;Custom API routes that legitimately benefit from caching must now explicitly opt in by adding &lt;code&gt;&amp;#39;cacheEtag&amp;#39; =&amp;gt; true&lt;/code&gt; to their route definition:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;$routes = [
    [
        'name'      =&amp;gt; 'MyCustomEndpoint',
        'path'      =&amp;gt; '/MyModule',
        'method'    =&amp;gt; 'GET',
        'shortcut'  =&amp;gt; false,
        'cacheEtag' =&amp;gt; true,
    ],
];&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id="mcetoc_contains_warning"&gt;FilterApi &amp;mdash; $contains Warning on Relate Fields&lt;/h3&gt;
&lt;p&gt;Using the &lt;code&gt;$contains&lt;/code&gt; filter operator on &lt;code&gt;relate&lt;/code&gt; or &lt;code&gt;assigned_user_name&lt;/code&gt; field types now triggers a PHP &lt;code&gt;E_USER_WARNING&lt;/code&gt;. The query still executes but the warning is logged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Migrate &lt;code&gt;$contains&lt;/code&gt; filters on relate fields to the &lt;code&gt;$in&lt;/code&gt; operator.&lt;/p&gt;
&lt;h3 id="mcetoc_idm_portal_users"&gt;IDM Mode &amp;mdash; Portal and Group Users Now Deletable via API&lt;/h3&gt;
&lt;p&gt;In IDM-enabled environments, portal-only users (&lt;code&gt;portal_only = true&lt;/code&gt;) and group users (&lt;code&gt;is_group = true&lt;/code&gt;) are now exempt from the IDM deletion restriction and can be deleted via the API. Regular domain users remain non-deletable via API in IDM mode and must be managed through the identity management system.&lt;/p&gt;
&lt;h2 id="mcetoc_1gj9pc6si0"&gt;Supported Platforms Update&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PHP Support
&lt;ul&gt;
&lt;li&gt;We are dropping support for PHP&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;8.3&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and adding support to PHP&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;8.5&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;There isn&amp;#39;t an upgrade path from 8.3 to 8.5, you must ensure it follows the upgrade path 8.3 -&amp;gt; 8.4 -&amp;gt; 8.5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MySQL Support
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;We are dropping support for mysql 8.0.40&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Keep&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;support for MySQL 8.4.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MSSQL Support&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Keep support for MSSQL 2022&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Oracle Support
&lt;ul&gt;
&lt;li&gt;Keep support for Oracle 19&lt;/li&gt;
&lt;li&gt;&lt;b&gt;We are dropping support for Oracle 23&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adding support for Oracle 26&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(note that Oracle 26 is Oracle 23.26)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DB2 Support
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Keep&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;support for DB2 11.5.9&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adding support for DB2 12.1&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Search
&lt;ul&gt;
&lt;li&gt;Keep support for Elasticsearch&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;8.x&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Adding support for Elasticsearch&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;9.x&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Drop support for OpenSearch 2.7&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Keep support for OpenSearch 2.19&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Adding support for OpenSearch 3.x&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_php_libs"&gt;PHP Library Upgrades&lt;/h2&gt;
&lt;h3 id="mcetoc_new_deps"&gt;New Dependencies&lt;/h3&gt;
&lt;p&gt;The following packages are new direct dependencies in 26.1.0:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;webklex/php-imap             6.2.0    Email / IMAP protocol support
illuminate/collections       v12.50.0 Laravel Collections utility
illuminate/support           v12.50.0 Laravel Support helpers
illuminate/pagination        v12.50.0 Laravel Pagination
nesbot/carbon                3.11.1   Enhanced datetime handling
symfony/polyfill-php83       v1.33.0  PHP 8.3 polyfills
symfony/polyfill-php84       v1.33.0  PHP 8.4 polyfills
symfony/polyfill-php85       v1.33.0  PHP 8.5 polyfills
symfony/translation          v6.4.32  Translation component
psr/clock                    1.0.0    PSR-20 clock interface
doctrine/inflector           2.1.0    String inflection

phpseclib/phpseclib was an indirect dependency in 25.2.0 (version 3.0.43) and has been promoted to a direct dependency in 26.1.0 (version 3.0.51). A security vulnerability in this library was also resolved in this release (SUS-618).

doctrine/cache 2.2.0 has been removed and replaced by the cache abstraction layer.&lt;/pre&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;&lt;/div&gt;
&lt;h3 id="mcetoc_major_bumps"&gt;Major Version Bumps&lt;/h3&gt;
&lt;p&gt;The following packages received major version bumps. Review any custom code that interacts with these libraries directly:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;firebase/php-jwt      7.0.0 (aliased as 6.11.0 in composer.json — low risk)
doctrine/lexer        3.0.1 (may affect custom query/annotation parsing)
ezimuel/guzzlestreams 4.1.0 (verify custom HTTP stream usage)&lt;/pre&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;&lt;/div&gt;
&lt;h3 id="mcetoc_notable_updates"&gt;Notable Version Updates&lt;/h3&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;microsoft/microsoft-graph    v2.56.0
onelogin/php-saml            3.8.1
google/apiclient             v2.19.0
aws/aws-sdk-php              3.374.2
guzzlehttp/guzzle            7.10.0
monolog/monolog              3.10.0
onelogin/php-saml            3.8.1
&lt;/pre&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_js_libs"&gt;JS Library Upgrades&lt;/h2&gt;
&lt;p&gt;No JavaScript library changes were made in this release.&lt;/p&gt;
&lt;h2 id="mcetoc_platforms"&gt;Supported Platforms Update&lt;/h2&gt;
&lt;h3 id="mcetoc_php85"&gt;PHP 8.5 Support Added&lt;/h3&gt;
&lt;p&gt;Sugar 26.1 adds support for PHP 8.5.x. The minimum supported version (PHP 8.2.0) is unchanged.&lt;/p&gt;
&lt;p&gt;PHP 8.5 support is enabled by the new &lt;code&gt;symfony/polyfill-php83&lt;/code&gt;, &lt;code&gt;symfony/polyfill-php84&lt;/code&gt;, and &lt;code&gt;symfony/polyfill-php85&lt;/code&gt; packages included in this release.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25.2.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26.1.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.2.x&lt;/td&gt;
&lt;td&gt;Supported (minimum)&lt;/td&gt;
&lt;td&gt;Supported (minimum)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.3.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.5.x&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Developers running PHP 8.4+ should audit custom code for PHP 8.4 deprecations, including implicitly nullable parameters and &lt;code&gt;null&lt;/code&gt; passed to non-nullable parameters in internal functions.&lt;/p&gt;
&lt;h3 id="mcetoc_oauth_exchange"&gt;Support for OAuth 2.0 Token-Based Authorization with Exchange Online&lt;/h3&gt;
&lt;p&gt;Sugar now supports sending emails via Microsoft Exchange Online using OAuth 2.0, in alignment with Microsoft&amp;#39;s announcement to permanently disable Basic Authentication for SMTP AUTH. When an outbound email account is configured using Microsoft OAuth 2.0, Sugar sends emails through the Microsoft Graph API instead of SMTP.&lt;/p&gt;
&lt;p&gt;A new token provider class &lt;code&gt;CustomGraphPhpLeagueAccessTokenProvider.php&lt;/code&gt; in &lt;code&gt;include/externalAPI/MicrosoftEmail/&lt;/code&gt; handles refresh-token persistence and EAPM record cleanup on error. Custom Microsoft integrations can leverage the callback-based token update lifecycle in this provider.&lt;/p&gt;
&lt;p&gt;To enable this functionality, administrators must register an application in Azure with the necessary API permissions (&lt;code&gt;Mail.Send&lt;/code&gt;, &lt;code&gt;Mail.Read&lt;/code&gt;, &lt;code&gt;IMAP.AccessAsUser.All&lt;/code&gt;, &lt;code&gt;offline_access&lt;/code&gt;) and configure the Microsoft connector in Sugar. This transition will occur automatically for existing Exchange Online OAuth accounts, but users will need to re-authorize their email accounts in Sugar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This improvement has been backported to Sugar 25.1.x.&lt;/p&gt;
&lt;h2 id="mcetoc_config"&gt;Configurability Updates&lt;/h2&gt;
&lt;h3 id="mcetoc_config_settings"&gt;New Sugar Config Settings&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Setting Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Override Example&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enable_sql_distinct_for_collections&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['enable_sql_distinct_for_collections'] = true;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enables SQL DISTINCT to prevent duplicate counting in list views and reports that filter on many-to-many collection fields (tags, email recipients). May impact query performance on large datasets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;db_archiver_persist_first_update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['db_archiver_persist_first_update'] = true;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserves one record in &lt;code&gt;pmse_bpm_flow&lt;/code&gt; (where &lt;code&gt;cas_index = 1&lt;/code&gt;) during DataArchiver hard-delete or archive operations on &lt;code&gt;pmse_Inbox&lt;/code&gt;, preventing the PMSE &amp;quot;First Update&amp;quot; logic from re-triggering on subsequent record updates. Must be explicitly enabled in &lt;code&gt;config_override.php&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job_batch_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job_batch_size'] = 250;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Records per delete batch for the Prune Database scheduler job.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.max_duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1200&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.max_duration'] = 600;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Max seconds per Prune Database scheduler run.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.max_table_retry_count&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.max_table_retry_count'] = 5;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skip a table after N consecutive failures.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.failure_reset_days&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.failure_reset_days'] = 14;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reset failure count after N days.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.deadlock_retry_attempts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.deadlock_retry_attempts'] = 5;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retry attempts on deadlock.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.deadlock_retry_delay_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;[100, 500, 2000]&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;Exponential backoff delays in milliseconds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.enable_failure_tracking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.enable_failure_tracking'] = false;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Track failed tables across Prune Database runs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All Prune Database keys are optional &amp;mdash; existing deployments do not need to set them.&lt;/p&gt;
&lt;h2 id="mcetoc_removed"&gt;Removed Functions / Libraries / Features&lt;/h2&gt;
&lt;h3 id="mcetoc_removed_js"&gt;Removed JavaScript Files&lt;/h3&gt;
&lt;p&gt;Two JavaScript files present in 25.2.0 are completely absent in 26.1.0:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;include/javascript/phaser/phaser-sugar.min.js&lt;/code&gt;&lt;/strong&gt; &amp;mdash; The Phaser game engine has been removed. Any custom module, dashlet, or Sugar7 plugin referencing the Phaser global will throw a JavaScript error at page load.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;include/javascript/sugar7/plugins/CanvasDataRenderer.js&lt;/code&gt;&lt;/strong&gt; &amp;mdash; The canvas-based data chart rendering plugin has been removed. Any custom code calling &lt;code&gt;App.plugins.load(&amp;#39;CanvasDataRenderer&amp;#39;)&lt;/code&gt; will fail at load time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Remove all Phaser and CanvasDataRenderer references from custom code. For charting, migrate to Sugar&amp;#39;s native &lt;code&gt;Charts&lt;/code&gt; plugin or bundle an alternative charting library within your customization package.&lt;/p&gt;
&lt;h3 id="mcetoc_deprecated_funcs"&gt;Deprecated Functions and Methods&lt;/h3&gt;
&lt;p&gt;The following functions and methods carry &lt;code&gt;@deprecated&lt;/code&gt; annotations and are scheduled for removal in a future release. They were deprecated prior to 26.1 and continue to function in 26.1 but should be migrated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Superglobal sanitization helpers&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/utils.php&lt;/code&gt;. In-code message: &lt;em&gt;&amp;quot;Superglobal sanitizing will be completely abandoned. Use the new InputValidation service instead.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_POST()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_GET()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_COOKIE()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_REQUEST()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_SERVER()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_FILES()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;General utility functions&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/utils.php&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_guid()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sugarcrm\Sugarcrm\Util\Uuid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_guid_section()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sugarcrm\Sugarcrm\Util\Uuid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_theme_name()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarThemeRegistry::get($theme)-&amp;gt;name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_available_themes()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarThemeRegistry::availableThemes()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Database audit methods&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/database/DBManager.php&lt;/code&gt;. The audit API is moving from the DB layer to &lt;code&gt;SugarBean&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::auditSQL()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::auditSQL()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::saveAuditRecords()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::saveAuditRecords()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::getAuditDataChanges()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::getAuditDataChanges()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::generateInsertSQL()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use parameterized queries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Deprecated REST endpoint actions:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deprecated element&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Use instead&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clients/base/api/RelatedActivitiesApi.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;recordListView&lt;/code&gt; action&lt;/td&gt;
&lt;td&gt;&lt;code&gt;activitiesList&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clients/base/api/PersonFilterApi.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;useOnlyActiveUsers()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;mdash; (deprecated since 13.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="mcetoc_data_changes"&gt;Data Changes&lt;/h2&gt;
&lt;h3 id="mcetoc_email_denorm"&gt;Email Denormalization Upgrade Script&lt;/h3&gt;
&lt;p&gt;A new upgrade script &lt;code&gt;upgrade/scripts/post/9_DenormalizeEmailsFields.php&lt;/code&gt; runs on upgrade and adds four columns to &lt;code&gt;emails_email_addr_rel&lt;/code&gt;, backfilled from the &lt;code&gt;emails&lt;/code&gt; table:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;date_sent&lt;/code&gt; (datetime)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;team_set_id&lt;/code&gt; (id)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;state&lt;/code&gt; (varchar(100))&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assigned_user_id&lt;/code&gt; (id)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A new index &lt;code&gt;idx_eearl_email_sent&lt;/code&gt; is also created on &lt;code&gt;[email_address_id, deleted, team_set_id, date_sent DESC, email_id]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; On instances with large archived email volumes, the &lt;code&gt;UPDATE ... JOIN&lt;/code&gt; backfill and index creation can take 10&amp;ndash;45+ minutes and hold row-level locks. A mid-run failure leaves partially denormalized data. Pre-upgrade recommendation for large instances: run the Prune Database scheduler job to completion before upgrading to reduce email table size.&lt;/p&gt;
&lt;h3 id="mcetoc_vardef_changes"&gt;New Indexes and Vardef Changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;int&lt;/code&gt; field &lt;code&gt;job_run_order&lt;/code&gt; (default &lt;code&gt;1&lt;/code&gt;) added to the &lt;code&gt;Schedulers&lt;/code&gt; module. A Repair/Rebuild is required post-upgrade.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DynamicFields.default_value&lt;/code&gt; type changed from &lt;code&gt;varchar(255)&lt;/code&gt; to &lt;code&gt;text&lt;/code&gt;. Any custom code that reads &lt;code&gt;default_value&lt;/code&gt; and enforces a 255-character maximum must be updated &amp;mdash; the field is now unbounded.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Documents.name.sort_on&lt;/code&gt; changed from &lt;code&gt;name&lt;/code&gt; to &lt;code&gt;document_name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;validateModel: true&lt;/code&gt; added to the Assign, Claim, and Close action button definitions in the Cases module vardefs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template_supported =&amp;gt; true&lt;/code&gt; added to the &lt;code&gt;Dashboards&lt;/code&gt; and &lt;code&gt;Reports&lt;/code&gt; module metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_platform_updates"&gt;Platform Updates&lt;/h2&gt;
&lt;h3 id="mcetoc_logic_hook"&gt;Logic Hook Resilience &amp;mdash; Exception Handling&lt;/h3&gt;
&lt;p&gt;Both static and instance hook invocations in &lt;code&gt;include/utils/LogicHook.php&lt;/code&gt; are now wrapped in individual try-catch blocks. &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; exceptions are re-thrown (correct for API validation contexts); all other &lt;code&gt;Throwable&lt;/code&gt; errors are caught, logged as fatal, and surfaced as a system notification to admins via a new &lt;code&gt;saveNotification()&lt;/code&gt; method. A static cache ensures at most one notification per user-module pair per session. A failing custom hook no longer crashes the entire bean operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Custom hooks that previously failed silently will now emit a system notification. Monitor logs for &lt;code&gt;&amp;quot;Error executing hook&amp;quot;&lt;/code&gt; entries. Hooks used in API contexts should throw &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; to return proper HTTP 422 responses.&lt;/p&gt;
&lt;h3 id="mcetoc_referrer_policy"&gt;&lt;/h3&gt;
&lt;h3 id="mcetoc_pdf_logo"&gt;PDF Manager Logo Format Validation&lt;/h3&gt;
&lt;p&gt;PDF template header logos are now validated at save time. Supported formats: &lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.jpeg&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt;, &lt;code&gt;.gif&lt;/code&gt;, &lt;code&gt;.bmp&lt;/code&gt;. Unsupported formats (&lt;code&gt;.webp&lt;/code&gt;, &lt;code&gt;.svg&lt;/code&gt;, &lt;code&gt;.tiff&lt;/code&gt;, &lt;code&gt;.tif&lt;/code&gt;, &lt;code&gt;.heic&lt;/code&gt;) are rejected with &lt;code&gt;HTTP 422 SugarApiExceptionInvalidParameter&lt;/code&gt; via the REST API, or an error message via the BWC UI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Convert all PDF template header logos to JPEG or PNG before upgrading. Update any integration that programmatically sets the &lt;code&gt;header_logo&lt;/code&gt; field to validate format before submission.&lt;/p&gt;
&lt;h3 id="mcetoc_timezone_util"&gt;&lt;/h3&gt;
&lt;h3 id="mcetoc_prune_rewrite"&gt;PruneDatabase Scheduler Rewrite&lt;/h3&gt;
&lt;p&gt;The Prune Database scheduler job has been rewritten in &lt;code&gt;src/Schedulers/Jobs/PruneDatabaseService.php&lt;/code&gt; with deadlock resilience (exponential backoff retry), audit table orphan cleanup, and per-table failure tracking across runs. See the Configurability Updates section for the new optional config keys.&lt;/p&gt;
&lt;h3 id="mcetoc_bug_fixes"&gt;Bug Fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a fatal error that occurred during upgrade from 25.1.x to 25.2.0 (BR-13007).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the 26.1 install wizard failed with a 500 error on MySQL (SUS-571).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar failed to load properly after upgrade on Windows (SUS-126).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors on the Repair &amp;amp; Rebuild step during upgrade from 14.0.4 to 25.1.3 in multi-tenant setups (SUS-448).&lt;/li&gt;
&lt;li&gt;Fixed an issue where upgrading to 26.1.0 caused failures on instances with API customizations (SUS-548).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Show Changes feature in Opportunities returned a fatal error after upgrading to 25.2.0 (CSI 98647).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sales stage and dropdown colors were lost after module install/uninstall on upgraded or cloned instances (CSI 98237).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the upgrade script for the &lt;code&gt;job_run_order&lt;/code&gt; field was incorrectly included; the script has been removed (SUS-476).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Module Loader upload failed with &amp;quot;Could not find package file&amp;quot; when &lt;code&gt;upload_dir&lt;/code&gt; was configured outside the Sugar root directory (CSI 99111).&lt;/li&gt;
&lt;li&gt;Fixed an issue where package installation failures occurred due to missing core classes related to PHP opcache corruption (CSI 98229).&lt;/li&gt;
&lt;li&gt;Fixed an issue where modifying an out-of-the-box dropdown caused the Package Scanner to fail installation of customizations exported via Studio (CSI 96552).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Package Builder and Deployer did not include all files when exporting custom subpanels (CSI 97739).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Cloud Insights link on the Administration page failed to load due to a CSP violation (CSI 98233).&lt;/li&gt;
&lt;li&gt;Fixed a PHP Fatal error: &lt;code&gt;Uncaught Error: Class &amp;quot;Nonce&amp;quot; not found&lt;/code&gt; (BR-13243).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors being hidden by &lt;code&gt;Uncaught DomainException: The given security subject is not active&lt;/code&gt; (SI 89298).&lt;/li&gt;
&lt;li&gt;Fixed a &lt;code&gt;Class &amp;quot;Module&amp;quot; Not Found&lt;/code&gt; fatal error when &lt;code&gt;class_map.php&lt;/code&gt; contained a &lt;code&gt;false&lt;/code&gt; entry for a custom module (CSI 98855).&lt;/li&gt;
&lt;li&gt;Fixed a PHP Fatal Error in &lt;code&gt;ForecastMetricsApi.php&lt;/code&gt; during Forecast calculation caused by an &lt;code&gt;array_merge&lt;/code&gt; type mismatch (CSI 98542).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; when switching between tabs in Forecasts (SUS-122).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Filter API returned an incorrect results count (BR-13041).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Filter API returned wrong record count, incorrect offset, and missing records in JSON results (CSI 95384).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the FilterAPI response field order did not match the request body after field modifications (CSI 97467).&lt;/li&gt;
&lt;li&gt;Fixed an issue with the &lt;code&gt;/Reports/:record/records&lt;/code&gt; endpoint in API version v11_25 (SUS-123).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;SugarACLActivities&lt;/code&gt; triggered a 500 error when the activity&amp;#39;s parent bean was no longer accessible to the user (CSI 98342).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a query failure in a report incorrectly returned a permission error message (CSI 95685).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an improperly formatted date filter value threw an unhelpful server error on reports (CSI 94709).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;Contains&lt;/code&gt; filter on &lt;code&gt;Assigned To&lt;/code&gt; and other relationship fields forced a full selection, causing timeouts on list views and dashlets at high record volumes (CSI 98159).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Global Search failed to index when a comment log entry exceeded 32,000 characters (CSI 97481).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Global Search could exceed the &lt;code&gt;maxClauseCount&lt;/code&gt; threshold when executing queries with multiple hyphen-separated tokens (CSI 97570).&lt;/li&gt;
&lt;li&gt;Fixed an issue where SugarBPM being an application hook forced execution order relative to module-level logic hooks (SI 83796).&lt;/li&gt;
&lt;li&gt;Fixed an issue where SugarBPM Send Message events after a Wait step did not respect User Locale, Language, or Timezone settings when field variables were included in a Process Email Template (SUS-9).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a SugarBPM Receive Message Event was set to &lt;code&gt;COMPLETED&lt;/code&gt; instead of &lt;code&gt;CLOSED&lt;/code&gt; in &lt;code&gt;pmse_bpm_flow&lt;/code&gt;, causing records to become stuck in a process (SI 82401).&lt;/li&gt;
&lt;li&gt;Fixed a PHP 500 fatal error in the SugarBPM validator when processing older process definitions (CSI 95495).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Process Management failed to load or became progressively slower when hundreds of thousands of Process records existed (SI 89542).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Quick Repair and Rebuild caused API-triggered BPM document generation via DocMerge to fail (CSI 96056).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an HTTP 500 error occurred when saving a new Revenue Line Item with a custom field and a BPM Process Definition using Relationship Change Criteria (CSI 92792).&lt;/li&gt;
&lt;li&gt;Fixed an issue where hard-deleting data in &lt;code&gt;pmse_inbox&lt;/code&gt; caused a process to retrigger again (CSI 93985).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an Unauthorized Creation of Process Definition was possible when a user had Developer Access to at least one module (SUS-124).&lt;/li&gt;
&lt;li&gt;Fixed an issue where adding a column to a Case subpanel in Studio caused fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; (SUS-152).&lt;/li&gt;
&lt;li&gt;Fixed a severe CPU spike and instance unresponsiveness triggered by a Studio configuration change (CSI 98411).&lt;/li&gt;
&lt;li&gt;Fixed an issue where fields could not be added to a subpanel layout if the layout had no existing fields (SI 86285).&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting a relationship left orphaned files in the Vardefs directory causing an &lt;code&gt;Error: Invalid link&lt;/code&gt; (SI 89679).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Dropdown Styles Extension files were not rebuilt during Quick Repair and Rebuild (CSI 95294).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a missing Expression caused &lt;code&gt;MetadataManager&lt;/code&gt; to fail, making the site inaccessible with a 500 error (SI 82950).&lt;/li&gt;
&lt;li&gt;Fixed an issue where invalid formulas could be saved in Studio, resulting in a crashed instance (SI 81905).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Prune Database run on the 1st of the month orphaned audit records when parent records were deleted (SI 86770).&lt;/li&gt;
&lt;li&gt;Fixed an issue where OAuth 2.0 authentication with Exchange Online only sent one campaign email (CSI 98254).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Microsoft OAuth2 email authentication token expired after 90 days rather than refreshing (SUS-93).&lt;/li&gt;
&lt;li&gt;Fixed an issue where email accounts configured via Exchange Online did not allow users to send as other approved email addresses (BR-13300).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Email &amp;quot;From Name&amp;quot; was not being calculated correctly when sending via Microsoft Exchange (BR-13288).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Inbound Email Scheduler failed to archive all emails and prematurely removed them from the inbox (CSI 95509).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Inbound Email Scheduler logged a &lt;code&gt;stat(): failed&lt;/code&gt; error in the job queue when downloading emails with attachments (SI 67377).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; during execution of the &lt;code&gt;pollMonitoredInboxesForBouncedCampaignEmails&lt;/code&gt; and &lt;code&gt;pollMonitoredInboxes&lt;/code&gt; scheduler jobs (SUS-251).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; during mail account setup (SUS-471).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;email_mailer_timelimit&lt;/code&gt; and &lt;code&gt;email_mailer_timeout&lt;/code&gt; config options resulted in delays when sending a test email (CSI 92799).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an imported email from a sender with a non-UTF-8 encoding caused the email record view to fail to load (CSI 95960).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a DB500 error could occur in the Emails Subpanel and Timeline Dashlet when loading archived emails indirectly related to a contact (CSI 97607).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sorting certain Emails subpanel columns caused a database error (CSI 98525).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sorting columns in the Emails subpanel in Cases resulted in the error &lt;code&gt;Error: Unknown field&lt;/code&gt; (CSI 98344).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Report Grouping on a datetime field used UTC/GMT time instead of the user&amp;#39;s timezone (CSI 96346).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a report showed single-digit day/month dates when a UK/EU date format was set in the user profile (CSI 97195).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a database error occurred on reports when sorting by deleted fields (CSI 95763).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;SUM&lt;/code&gt;, &lt;code&gt;MIN&lt;/code&gt;, &lt;code&gt;MAX&lt;/code&gt;, and &lt;code&gt;AVG&lt;/code&gt; summary options for the &lt;code&gt;Duration Minutes&lt;/code&gt; field were missing in Summation Reports for Calls and Meetings (SI 79984).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Advanced Reports Custom Query builder returned a 404 instead of an invalid query screen (SI 86985).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the incorrect export delimiter was used when exporting Advanced Reports to CSV (SI 77564).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Report Chart did not sort based on the Display Summaries sort order (SI 80778).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Advanced Reports could not be scheduled due to a CSP violation (BR-13388).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar Logic was not calculated until after Save for formulas using the &lt;code&gt;relate&lt;/code&gt; function against Activities Flex relationships (SI 73566).&lt;/li&gt;
&lt;li&gt;Fixed an issue where formula validation of Calculation fields did not work properly (SI 77548).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Assigned User fields were not evaluated properly by a &lt;code&gt;Required if&lt;/code&gt; formula in another module (CSI 92022).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a &lt;code&gt;Required If&lt;/code&gt; formula containing a related link caused the Focus Drawer Record View Dashlet to break (CSI 92769).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;Listview Actions&lt;/code&gt; dropdown menu disappeared when certain &lt;code&gt;Read Only If&lt;/code&gt; formulas were applied (CSI 92089).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a dependent &lt;code&gt;related&lt;/code&gt; formula did not display data in a subpanel (SI 80275).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar did not reconnect to the database after a query was killed by the Slow Query Killer or a timeout (BR-12110).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Prune Database stalled on large tables (SI 80852).&lt;/li&gt;
&lt;li&gt;Fixed an issue where before_save hook changes were not audited (CSI 96102).&lt;/li&gt;
&lt;li&gt;Fixed a DB syntax error appearing in &lt;code&gt;sugarcrm.log&lt;/code&gt; (BR-13260).&lt;/li&gt;
&lt;li&gt;Fixed an issue where PDF templates could not render images stored within the Sugar instance (BR-13091).&lt;/li&gt;
&lt;li&gt;Fixed an issue where editing a PDF template broke it (CSI 98492).&lt;/li&gt;
&lt;li&gt;Fixed an issue where TCPDF PDF templates no longer converted spaces in image file names (CSI 94322).&lt;/li&gt;
&lt;li&gt;Fixed an issue where DocMerge produced documents failed to open if a &lt;code&gt;related()&lt;/code&gt; formula value contained the special symbol &lt;code&gt;&amp;amp;&lt;/code&gt; (CSI 94295).&lt;/li&gt;
&lt;li&gt;Fixed login failures including erroneous STS Auth errors, unauthorized access, and return-to-login loops associated with Identity Management (CSI 95337).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Refresh Token in an IDM-enabled instance did not live longer than 24 hours (BR-13036).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a regular user with &lt;code&gt;external_auth_only = 1&lt;/code&gt; did not appear in the Shared Calendar list (SI 89482).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the FilterAPI incorrectly returned extra fields in the response even when the &lt;code&gt;fields&lt;/code&gt; argument was specified (BR-13048).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Group Users could not be deleted (CSI 95066).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;LBL_SHOW_MORE&lt;/code&gt; label on Text Area fields could display &amp;quot;Show More Cases&amp;quot; instead of &amp;quot;Show More&amp;quot; (CSI 97216).&lt;/li&gt;
&lt;li&gt;Fixed an issue where currency field sorting triggered a DB error in custom modules with &lt;code&gt;base_rate&lt;/code&gt; in the &lt;code&gt;_cstm&lt;/code&gt; table after upgrading to 25.2 (CSI 98412).&lt;/li&gt;
&lt;li&gt;Fixed an issue where List View Count was inaccurate when filtering on multiple Tags for records related to multiple tags (SI 83020).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &amp;quot;Claim&amp;quot; Action Button did not respect &amp;quot;Required If&amp;quot; field validation (CSI 94987).&lt;/li&gt;
&lt;li&gt;Fixed an issue where PHP opcache corruption caused &lt;code&gt;Call to undefined method&lt;/code&gt; fatal errors (SUS-315).&lt;/li&gt;
&lt;li&gt;Fixed an issue where regular users triggered redundant rebuilds after an admin QRR due to &lt;code&gt;SystemProcessLock&lt;/code&gt;, causing server overload (SUS-304).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Scheduler UI displayed job run times in an unexpected timezone (BR-13130).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the email &amp;quot;From&amp;quot; filter behavior was inconsistent when raw email addresses were used as primary addresses on records (CSI 91283).&lt;/li&gt;
&lt;li&gt;Fixed an issue where installing Sugar locally under certain offline conditions failed (CSI 97111).&lt;/li&gt;
&lt;li&gt;Fixed an issue where using the &lt;code&gt;email_addresses_primary&lt;/code&gt; field in a template for a custom URL field resulted in a 500 error when opening any record in the module (SUS-288).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Sugar Market Integration used a deprecated API call (SE-9850).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a &amp;quot;Page does not exist&amp;quot; error appeared when creating a new Case with an attachment (CSI 94268).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Emails subpanel used an inefficient search query, resulting in slow performance with large record counts (CSI 98123).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an error occurred during MLP uninstallation (SUS-441).&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting relationships could break list views (SI 87737).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Product Catalog Dashlet displayed duplicated and inaccessible entries under specific Product Category and Template configurations (CSI 95867).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_security_updates"&gt;Sugar Core Security Updates&lt;/h2&gt;
&lt;p&gt;As part of our ongoing efforts to keep Sugar clean, fast, reliable, and most importantly secure, we have updated Sugar Core code in different areas of the application such as Package Scanner, Studio, Module Installer, UI rendering, API endpoints, Legacy SOAP API, File Uploads, Portal, PII Fields, ACL rules, Legacy Workflows, HTTP Headers (Referrer-Policy Header), SVG File Upload Sanitization, and BWC modules. We have also cleaned up and improved our logging messages around deprecations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some of those security improvements were backported to Sugar 25.1.x.&lt;/p&gt;
&lt;h2 id="mcetoc_healthcheck"&gt;Healthcheck Updates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Built a healthcheck to detect and reclassify &lt;code&gt;badVardefsMultienum&lt;/code&gt; issues from bucket &lt;code&gt;MANUAL&lt;/code&gt; to bucket &lt;code&gt;CUSTOM&lt;/code&gt;. The rule ID also changed from 526 (25.2.0) to 452 (26.1.0). Update any CI scripts or monitoring dashboards filtering on this rule&amp;#39;s ID or bucket.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Sugar 26.1 Customization Guide</title><link>https://sugarclub.sugarai.com/dev-club/w/dev-tutorials/1023/sugar-26-1-customization-guide/revision/1</link><pubDate>Fri, 15 May 2026 15:23:37 GMT</pubDate><guid isPermaLink="false">5c521d64-519d-47a6-9065-134618b211bf:54ddf700-96e8-467a-9183-06eecc35ea07</guid><dc:creator>Rafael Fernandes</dc:creator><comments>https://sugarclub.sugarai.com/dev-club/w/dev-tutorials/1023/sugar-26-1-customization-guide#comments</comments><description>Revision 1 posted to Dev Tutorials by Rafael Fernandes on 5/15/2026 3:23:37 PM&lt;br /&gt;
&lt;p&gt;The purpose of this document is to provide insight to Sugar Developers for upgrading custom Sugar code, extensions, and integrations to the Sugar 26.1 release. This guide focuses on changes in&amp;nbsp;&lt;span&gt;Sugar 26.1&lt;/span&gt;&amp;nbsp;that could cause an immediate impact on Sugar customizations and integrations built for earlier Sugar versions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For Admin and End User release notes, please visit the&amp;nbsp;&lt;a href="https://support.sugarcrm.com/SmartLinks/Release_Notes/26.1.0_Release_Notes/"&gt;Sugar 26.1.0 Release Notes&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_rest_api"&gt;Sugar REST API Updates&lt;/h2&gt;
&lt;p&gt;This Sugar release does not introduce a new REST API version. Both 25.2.0 and 26.1.0 expose &lt;code&gt;v11_27&lt;/code&gt; as the maximum supported version. Do not update integration code to reference a new version string.&lt;/p&gt;
&lt;h3 id="mcetoc_pagination"&gt;Pagination Change in FilterApi&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;next_offset&lt;/code&gt; in FilterApi list responses now returns &lt;code&gt;-1&lt;/code&gt; when the &lt;code&gt;id_query&lt;/code&gt; code path determines there are no further pages of results. Previously &lt;code&gt;next_offset&lt;/code&gt; was always a calculated positive integer even on the last page. This change applies only to the &lt;code&gt;id_query&lt;/code&gt; code path inside &lt;code&gt;FilterApi&lt;/code&gt; &amp;mdash; queries not using &lt;code&gt;id_query&lt;/code&gt; are unaffected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Update pagination logic to treat &lt;code&gt;next_offset === -1&lt;/code&gt; as the end-of-list signal. Do not pass the returned &lt;code&gt;next_offset&lt;/code&gt; directly as the next request&amp;#39;s &lt;code&gt;offset&lt;/code&gt; without first checking for &lt;code&gt;-1&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="mcetoc_teams_filter"&gt;New Endpoint &amp;mdash; Teams Filter&lt;/h3&gt;
&lt;p&gt;A new dedicated filter endpoint for the Teams module is now available:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;GET &amp;lt;sugar instance&amp;gt;/rest/v11_27/Teams?filter=...&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The endpoint extends &lt;code&gt;FilterApi&lt;/code&gt; with a custom join to the users table. Results include teams whose associated user has &lt;code&gt;status = &amp;#39;Active&amp;#39;&lt;/code&gt;, as well as teams with &lt;code&gt;associated_user_id IS NULL&lt;/code&gt;. This is additive &amp;mdash; no existing endpoint is replaced or changed.&lt;/p&gt;
&lt;h3 id="mcetoc_relate_users"&gt;RelateRecordApi &amp;mdash; Users Relationship Field Restriction&lt;/h3&gt;
&lt;p&gt;Previously, restricted field population (&lt;code&gt;erased_fields&lt;/code&gt;, limited &lt;code&gt;$userFields&lt;/code&gt;) was applied only when traversing the &lt;code&gt;aclroles&lt;/code&gt; relationship link to the Users module. This guard has been removed. The restriction now applies to all relationship links where the related module is &lt;code&gt;Users&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affected endpoint pattern:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;GET &amp;lt;sugar instance&amp;gt;/rest/v11_27/{Module}/{id}/link/{any_users_link}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Responses for any Users-module relationship traversal now return a reduced field set with &lt;code&gt;erased_fields&lt;/code&gt; applied, matching the behavior previously only seen on &lt;code&gt;aclroles&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Audit all integration code that traverses relationship links to the Users module. Ensure your integration handles the reduced field set and respects &lt;code&gt;erased_fields&lt;/code&gt; in the response.&lt;/p&gt;
&lt;h3 id="mcetoc_users_acl"&gt;UsersApi &amp;mdash; Field-Level ACL Enforcement on Record Retrieve&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;GET /rest/v11_27/Users/{id}&lt;/code&gt; now enforces field-level ACL permissions when a &lt;code&gt;fields&lt;/code&gt; parameter is present. If the calling user lacks access to any requested field, the endpoint returns &lt;code&gt;HTTP 404 Not Found&lt;/code&gt;. Fields most commonly affected: &lt;code&gt;user_hash&lt;/code&gt;, &lt;code&gt;system_generated_password&lt;/code&gt;, &lt;code&gt;is_admin&lt;/code&gt;, &lt;code&gt;portal_user_password&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Remove sensitive password and privilege fields from &lt;code&gt;fields&lt;/code&gt; parameters in Users API calls. Only request fields the API consumer has explicit permission to access.&lt;/p&gt;
&lt;h3 id="mcetoc_duplicate_username"&gt;UsersApi &amp;mdash; Duplicate Username Error Code Change&lt;/h3&gt;
&lt;p&gt;When a duplicate username is submitted during user creation, the HTTP status code changed from &lt;code&gt;403 Forbidden&lt;/code&gt; to &lt;code&gt;422 Unprocessable Entity&lt;/code&gt;. In 25.2.0, &lt;code&gt;User.php&lt;/code&gt; threw &lt;code&gt;SugarApiExceptionNotAuthorized&lt;/code&gt; (HTTP 403). In 26.1.0, &lt;code&gt;UsersApi::createUser()&lt;/code&gt; catches that exception when the label is &lt;code&gt;ERR_USER_NAME_EXISTS&lt;/code&gt; and re-throws it as &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; (HTTP 422). The error key &lt;code&gt;ERR_USER_NAME_EXISTS&lt;/code&gt; is unchanged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Update any code that checks for HTTP 403 to detect duplicate usernames &amp;mdash; change to 422.&lt;/p&gt;
&lt;h3 id="mcetoc_cache_control"&gt;Cache-Control Headers on All API Responses&lt;/h3&gt;
&lt;p&gt;All API responses now emit the following headers by default:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Expires: 0&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Previously, only error responses carried &lt;code&gt;Cache-Control: no-store&lt;/code&gt;. Successful responses had no cache directive. CDNs, reverse proxies (Varnish, Nginx cache), browser Service Workers, and integration middleware that previously cached Sugar API responses will be affected.&lt;/p&gt;
&lt;p&gt;Custom API routes that legitimately benefit from caching must now explicitly opt in by adding &lt;code&gt;&amp;#39;cacheEtag&amp;#39; =&amp;gt; true&lt;/code&gt; to their route definition:&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;
&lt;pre&gt;$routes = [
    [
        'name'      =&amp;gt; 'MyCustomEndpoint',
        'path'      =&amp;gt; '/MyModule',
        'method'    =&amp;gt; 'GET',
        'shortcut'  =&amp;gt; false,
        'cacheEtag' =&amp;gt; true,
    ],
];&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 id="mcetoc_contains_warning"&gt;FilterApi &amp;mdash; $contains Warning on Relate Fields&lt;/h3&gt;
&lt;p&gt;Using the &lt;code&gt;$contains&lt;/code&gt; filter operator on &lt;code&gt;relate&lt;/code&gt; or &lt;code&gt;assigned_user_name&lt;/code&gt; field types now triggers a PHP &lt;code&gt;E_USER_WARNING&lt;/code&gt;. The query still executes but the warning is logged.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Migrate &lt;code&gt;$contains&lt;/code&gt; filters on relate fields to the &lt;code&gt;$in&lt;/code&gt; operator.&lt;/p&gt;
&lt;h3 id="mcetoc_idm_portal_users"&gt;IDM Mode &amp;mdash; Portal and Group Users Now Deletable via API&lt;/h3&gt;
&lt;p&gt;In IDM-enabled environments, portal-only users (&lt;code&gt;portal_only = true&lt;/code&gt;) and group users (&lt;code&gt;is_group = true&lt;/code&gt;) are now exempt from the IDM deletion restriction and can be deleted via the API. Regular domain users remain non-deletable via API in IDM mode and must be managed through the identity management system.&lt;/p&gt;
&lt;h2 id="mcetoc_php_libs"&gt;PHP Library Upgrades&lt;/h2&gt;
&lt;h3 id="mcetoc_new_deps"&gt;New Dependencies&lt;/h3&gt;
&lt;p&gt;The following packages are new direct dependencies in 26.1.0:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;webklex/php-imap             6.2.0    Email / IMAP protocol support
illuminate/collections       v12.50.0 Laravel Collections utility
illuminate/support           v12.50.0 Laravel Support helpers
illuminate/pagination        v12.50.0 Laravel Pagination
nesbot/carbon                3.11.1   Enhanced datetime handling
symfony/polyfill-php83       v1.33.0  PHP 8.3 polyfills
symfony/polyfill-php84       v1.33.0  PHP 8.4 polyfills
symfony/polyfill-php85       v1.33.0  PHP 8.5 polyfills
symfony/translation          v6.4.32  Translation component
psr/clock                    1.0.0    PSR-20 clock interface
doctrine/inflector           2.1.0    String inflection

phpseclib/phpseclib was an indirect dependency in 25.2.0 (version 3.0.43) and has been promoted to a direct dependency in 26.1.0 (version 3.0.51). A security vulnerability in this library was also resolved in this release (SUS-618).

doctrine/cache 2.2.0 has been removed and replaced by the cache abstraction layer.&lt;/pre&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;&lt;/div&gt;
&lt;h3 id="mcetoc_major_bumps"&gt;Major Version Bumps&lt;/h3&gt;
&lt;p&gt;The following packages received major version bumps. Review any custom code that interacts with these libraries directly:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;firebase/php-jwt      7.0.0 (aliased as 6.11.0 in composer.json — low risk)
doctrine/lexer        3.0.1 (may affect custom query/annotation parsing)
ezimuel/guzzlestreams 4.1.0 (verify custom HTTP stream usage)&lt;/pre&gt;&lt;/p&gt;
&lt;div class="content-scrollable-wrapper"&gt;&lt;/div&gt;
&lt;h3 id="mcetoc_notable_updates"&gt;Notable Version Updates&lt;/h3&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;microsoft/microsoft-graph    v2.56.0
onelogin/php-saml            3.8.1
google/apiclient             v2.19.0
aws/aws-sdk-php              3.374.2
guzzlehttp/guzzle            7.10.0
monolog/monolog              3.10.0
onelogin/php-saml            3.8.1
&lt;/pre&gt;&lt;/p&gt;
&lt;h2 id="mcetoc_js_libs"&gt;JS Library Upgrades&lt;/h2&gt;
&lt;p&gt;No JavaScript library changes were made in this release.&lt;/p&gt;
&lt;h2 id="mcetoc_platforms"&gt;Supported Platforms Update&lt;/h2&gt;
&lt;h3 id="mcetoc_php85"&gt;PHP 8.5 Support Added&lt;/h3&gt;
&lt;p&gt;Sugar 26.1 adds support for PHP 8.5.x. The minimum supported version (PHP 8.2.0) is unchanged.&lt;/p&gt;
&lt;p&gt;PHP 8.5 support is enabled by the new &lt;code&gt;symfony/polyfill-php83&lt;/code&gt;, &lt;code&gt;symfony/polyfill-php84&lt;/code&gt;, and &lt;code&gt;symfony/polyfill-php85&lt;/code&gt; packages included in this release.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP Version&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25.2.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26.1.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.2.x&lt;/td&gt;
&lt;td&gt;Supported (minimum)&lt;/td&gt;
&lt;td&gt;Supported (minimum)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.3.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4.x&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.5.x&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Developers running PHP 8.4+ should audit custom code for PHP 8.4 deprecations, including implicitly nullable parameters and &lt;code&gt;null&lt;/code&gt; passed to non-nullable parameters in internal functions.&lt;/p&gt;
&lt;h3 id="mcetoc_oauth_exchange"&gt;Support for OAuth 2.0 Token-Based Authorization with Exchange Online&lt;/h3&gt;
&lt;p&gt;Sugar now supports sending emails via Microsoft Exchange Online using OAuth 2.0, in alignment with Microsoft&amp;#39;s announcement to permanently disable Basic Authentication for SMTP AUTH. When an outbound email account is configured using Microsoft OAuth 2.0, Sugar sends emails through the Microsoft Graph API instead of SMTP.&lt;/p&gt;
&lt;p&gt;A new token provider class &lt;code&gt;CustomGraphPhpLeagueAccessTokenProvider.php&lt;/code&gt; in &lt;code&gt;include/externalAPI/MicrosoftEmail/&lt;/code&gt; handles refresh-token persistence and EAPM record cleanup on error. Custom Microsoft integrations can leverage the callback-based token update lifecycle in this provider.&lt;/p&gt;
&lt;p&gt;To enable this functionality, administrators must register an application in Azure with the necessary API permissions (&lt;code&gt;Mail.Send&lt;/code&gt;, &lt;code&gt;Mail.Read&lt;/code&gt;, &lt;code&gt;IMAP.AccessAsUser.All&lt;/code&gt;, &lt;code&gt;offline_access&lt;/code&gt;) and configure the Microsoft connector in Sugar. This transition will occur automatically for existing Exchange Online OAuth accounts, but users will need to re-authorize their email accounts in Sugar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This improvement has been backported to Sugar 25.1.x.&lt;/p&gt;
&lt;h2 id="mcetoc_config"&gt;Configurability Updates&lt;/h2&gt;
&lt;h3 id="mcetoc_config_settings"&gt;New Sugar Config Settings&lt;/h3&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Setting Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Override Example&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enable_sql_distinct_for_collections&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['enable_sql_distinct_for_collections'] = true;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enables SQL DISTINCT to prevent duplicate counting in list views and reports that filter on many-to-many collection fields (tags, email recipients). May impact query performance on large datasets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;db_archiver_persist_first_update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['db_archiver_persist_first_update'] = true;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserves one record in &lt;code&gt;pmse_bpm_flow&lt;/code&gt; (where &lt;code&gt;cas_index = 1&lt;/code&gt;) during DataArchiver hard-delete or archive operations on &lt;code&gt;pmse_Inbox&lt;/code&gt;, preventing the PMSE &amp;quot;First Update&amp;quot; logic from re-triggering on subsequent record updates. Must be explicitly enabled in &lt;code&gt;config_override.php&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job_batch_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job_batch_size'] = 250;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Records per delete batch for the Prune Database scheduler job.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.max_duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1200&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.max_duration'] = 600;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Max seconds per Prune Database scheduler run.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.max_table_retry_count&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.max_table_retry_count'] = 5;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skip a table after N consecutive failures.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.failure_reset_days&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.failure_reset_days'] = 14;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reset failure count after N days.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.deadlock_retry_attempts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.deadlock_retry_attempts'] = 5;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retry attempts on deadlock.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.deadlock_retry_delay_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;[100, 500, 2000]&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;td&gt;Exponential backoff delays in milliseconds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prune_job.enable_failure_tracking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$sugar_config['prune_job.enable_failure_tracking'] = false;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Track failed tables across Prune Database runs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All Prune Database keys are optional &amp;mdash; existing deployments do not need to set them.&lt;/p&gt;
&lt;h2 id="mcetoc_removed"&gt;Removed Functions / Libraries / Features&lt;/h2&gt;
&lt;h3 id="mcetoc_removed_js"&gt;Removed JavaScript Files&lt;/h3&gt;
&lt;p&gt;Two JavaScript files present in 25.2.0 are completely absent in 26.1.0:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;include/javascript/phaser/phaser-sugar.min.js&lt;/code&gt;&lt;/strong&gt; &amp;mdash; The Phaser game engine has been removed. Any custom module, dashlet, or Sugar7 plugin referencing the Phaser global will throw a JavaScript error at page load.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;include/javascript/sugar7/plugins/CanvasDataRenderer.js&lt;/code&gt;&lt;/strong&gt; &amp;mdash; The canvas-based data chart rendering plugin has been removed. Any custom code calling &lt;code&gt;App.plugins.load(&amp;#39;CanvasDataRenderer&amp;#39;)&lt;/code&gt; will fail at load time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Remove all Phaser and CanvasDataRenderer references from custom code. For charting, migrate to Sugar&amp;#39;s native &lt;code&gt;Charts&lt;/code&gt; plugin or bundle an alternative charting library within your customization package.&lt;/p&gt;
&lt;h3 id="mcetoc_deprecated_funcs"&gt;Deprecated Functions and Methods&lt;/h3&gt;
&lt;p&gt;The following functions and methods carry &lt;code&gt;@deprecated&lt;/code&gt; annotations and are scheduled for removal in a future release. They were deprecated prior to 26.1 and continue to function in 26.1 but should be migrated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Superglobal sanitization helpers&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/utils.php&lt;/code&gt;. In-code message: &lt;em&gt;&amp;quot;Superglobal sanitizing will be completely abandoned. Use the new InputValidation service instead.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_POST()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_GET()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_COOKIE()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_REQUEST()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_SERVER()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitize_FILES()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;InputValidation&lt;/code&gt; service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;General utility functions&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/utils.php&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated function&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_guid()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sugarcrm\Sugarcrm\Util\Uuid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_guid_section()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Sugarcrm\Sugarcrm\Util\Uuid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_theme_name()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarThemeRegistry::get($theme)-&amp;gt;name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_available_themes()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarThemeRegistry::availableThemes()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Database audit methods&lt;/strong&gt; &amp;mdash; &lt;code&gt;include/database/DBManager.php&lt;/code&gt;. The audit API is moving from the DB layer to &lt;code&gt;SugarBean&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecated method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replacement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::auditSQL()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::auditSQL()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::saveAuditRecords()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::saveAuditRecords()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::getAuditDataChanges()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SugarBean::getAuditDataChanges()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBManager::generateInsertSQL()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use parameterized queries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Deprecated REST endpoint actions:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Deprecated element&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Use instead&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clients/base/api/RelatedActivitiesApi.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;recordListView&lt;/code&gt; action&lt;/td&gt;
&lt;td&gt;&lt;code&gt;activitiesList&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clients/base/api/PersonFilterApi.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;useOnlyActiveUsers()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;mdash; (deprecated since 13.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="mcetoc_data_changes"&gt;Data Changes&lt;/h2&gt;
&lt;h3 id="mcetoc_email_denorm"&gt;Email Denormalization Upgrade Script&lt;/h3&gt;
&lt;p&gt;A new upgrade script &lt;code&gt;upgrade/scripts/post/9_DenormalizeEmailsFields.php&lt;/code&gt; runs on upgrade and adds four columns to &lt;code&gt;emails_email_addr_rel&lt;/code&gt;, backfilled from the &lt;code&gt;emails&lt;/code&gt; table:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;date_sent&lt;/code&gt; (datetime)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;team_set_id&lt;/code&gt; (id)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;state&lt;/code&gt; (varchar(100))&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assigned_user_id&lt;/code&gt; (id)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A new index &lt;code&gt;idx_eearl_email_sent&lt;/code&gt; is also created on &lt;code&gt;[email_address_id, deleted, team_set_id, date_sent DESC, email_id]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; On instances with large archived email volumes, the &lt;code&gt;UPDATE ... JOIN&lt;/code&gt; backfill and index creation can take 10&amp;ndash;45+ minutes and hold row-level locks. A mid-run failure leaves partially denormalized data. Pre-upgrade recommendation for large instances: run the Prune Database scheduler job to completion before upgrading to reduce email table size.&lt;/p&gt;
&lt;h3 id="mcetoc_vardef_changes"&gt;New Indexes and Vardef Changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;int&lt;/code&gt; field &lt;code&gt;job_run_order&lt;/code&gt; (default &lt;code&gt;1&lt;/code&gt;) added to the &lt;code&gt;Schedulers&lt;/code&gt; module. A Repair/Rebuild is required post-upgrade.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DynamicFields.default_value&lt;/code&gt; type changed from &lt;code&gt;varchar(255)&lt;/code&gt; to &lt;code&gt;text&lt;/code&gt;. Any custom code that reads &lt;code&gt;default_value&lt;/code&gt; and enforces a 255-character maximum must be updated &amp;mdash; the field is now unbounded.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Documents.name.sort_on&lt;/code&gt; changed from &lt;code&gt;name&lt;/code&gt; to &lt;code&gt;document_name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;validateModel: true&lt;/code&gt; added to the Assign, Claim, and Close action button definitions in the Cases module vardefs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template_supported =&amp;gt; true&lt;/code&gt; added to the &lt;code&gt;Dashboards&lt;/code&gt; and &lt;code&gt;Reports&lt;/code&gt; module metadata.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_platform_updates"&gt;Platform Updates&lt;/h2&gt;
&lt;h3 id="mcetoc_logic_hook"&gt;Logic Hook Resilience &amp;mdash; Exception Handling&lt;/h3&gt;
&lt;p&gt;Both static and instance hook invocations in &lt;code&gt;include/utils/LogicHook.php&lt;/code&gt; are now wrapped in individual try-catch blocks. &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; exceptions are re-thrown (correct for API validation contexts); all other &lt;code&gt;Throwable&lt;/code&gt; errors are caught, logged as fatal, and surfaced as a system notification to admins via a new &lt;code&gt;saveNotification()&lt;/code&gt; method. A static cache ensures at most one notification per user-module pair per session. A failing custom hook no longer crashes the entire bean operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Custom hooks that previously failed silently will now emit a system notification. Monitor logs for &lt;code&gt;&amp;quot;Error executing hook&amp;quot;&lt;/code&gt; entries. Hooks used in API contexts should throw &lt;code&gt;SugarApiExceptionInvalidParameter&lt;/code&gt; to return proper HTTP 422 responses.&lt;/p&gt;
&lt;h3 id="mcetoc_referrer_policy"&gt;&lt;/h3&gt;
&lt;h3 id="mcetoc_pdf_logo"&gt;PDF Manager Logo Format Validation&lt;/h3&gt;
&lt;p&gt;PDF template header logos are now validated at save time. Supported formats: &lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.jpeg&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt;, &lt;code&gt;.gif&lt;/code&gt;, &lt;code&gt;.bmp&lt;/code&gt;. Unsupported formats (&lt;code&gt;.webp&lt;/code&gt;, &lt;code&gt;.svg&lt;/code&gt;, &lt;code&gt;.tiff&lt;/code&gt;, &lt;code&gt;.tif&lt;/code&gt;, &lt;code&gt;.heic&lt;/code&gt;) are rejected with &lt;code&gt;HTTP 422 SugarApiExceptionInvalidParameter&lt;/code&gt; via the REST API, or an error message via the BWC UI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Convert all PDF template header logos to JPEG or PNG before upgrading. Update any integration that programmatically sets the &lt;code&gt;header_logo&lt;/code&gt; field to validate format before submission.&lt;/p&gt;
&lt;h3 id="mcetoc_timezone_util"&gt;&lt;/h3&gt;
&lt;h3 id="mcetoc_prune_rewrite"&gt;PruneDatabase Scheduler Rewrite&lt;/h3&gt;
&lt;p&gt;The Prune Database scheduler job has been rewritten in &lt;code&gt;src/Schedulers/Jobs/PruneDatabaseService.php&lt;/code&gt; with deadlock resilience (exponential backoff retry), audit table orphan cleanup, and per-table failure tracking across runs. See the Configurability Updates section for the new optional config keys.&lt;/p&gt;
&lt;h3 id="mcetoc_bug_fixes"&gt;Bug Fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a fatal error that occurred during upgrade from 25.1.x to 25.2.0 (BR-13007).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the 26.1 install wizard failed with a 500 error on MySQL (SUS-571).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar failed to load properly after upgrade on Windows (SUS-126).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors on the Repair &amp;amp; Rebuild step during upgrade from 14.0.4 to 25.1.3 in multi-tenant setups (SUS-448).&lt;/li&gt;
&lt;li&gt;Fixed an issue where upgrading to 26.1.0 caused failures on instances with API customizations (SUS-548).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Show Changes feature in Opportunities returned a fatal error after upgrading to 25.2.0 (CSI 98647).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sales stage and dropdown colors were lost after module install/uninstall on upgraded or cloned instances (CSI 98237).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the upgrade script for the &lt;code&gt;job_run_order&lt;/code&gt; field was incorrectly included; the script has been removed (SUS-476).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Module Loader upload failed with &amp;quot;Could not find package file&amp;quot; when &lt;code&gt;upload_dir&lt;/code&gt; was configured outside the Sugar root directory (CSI 99111).&lt;/li&gt;
&lt;li&gt;Fixed an issue where package installation failures occurred due to missing core classes related to PHP opcache corruption (CSI 98229).&lt;/li&gt;
&lt;li&gt;Fixed an issue where modifying an out-of-the-box dropdown caused the Package Scanner to fail installation of customizations exported via Studio (CSI 96552).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Package Builder and Deployer did not include all files when exporting custom subpanels (CSI 97739).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Cloud Insights link on the Administration page failed to load due to a CSP violation (CSI 98233).&lt;/li&gt;
&lt;li&gt;Fixed a PHP Fatal error: &lt;code&gt;Uncaught Error: Class &amp;quot;Nonce&amp;quot; not found&lt;/code&gt; (BR-13243).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors being hidden by &lt;code&gt;Uncaught DomainException: The given security subject is not active&lt;/code&gt; (SI 89298).&lt;/li&gt;
&lt;li&gt;Fixed a &lt;code&gt;Class &amp;quot;Module&amp;quot; Not Found&lt;/code&gt; fatal error when &lt;code&gt;class_map.php&lt;/code&gt; contained a &lt;code&gt;false&lt;/code&gt; entry for a custom module (CSI 98855).&lt;/li&gt;
&lt;li&gt;Fixed a PHP Fatal Error in &lt;code&gt;ForecastMetricsApi.php&lt;/code&gt; during Forecast calculation caused by an &lt;code&gt;array_merge&lt;/code&gt; type mismatch (CSI 98542).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; when switching between tabs in Forecasts (SUS-122).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Filter API returned an incorrect results count (BR-13041).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Filter API returned wrong record count, incorrect offset, and missing records in JSON results (CSI 95384).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the FilterAPI response field order did not match the request body after field modifications (CSI 97467).&lt;/li&gt;
&lt;li&gt;Fixed an issue with the &lt;code&gt;/Reports/:record/records&lt;/code&gt; endpoint in API version v11_25 (SUS-123).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;SugarACLActivities&lt;/code&gt; triggered a 500 error when the activity&amp;#39;s parent bean was no longer accessible to the user (CSI 98342).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a query failure in a report incorrectly returned a permission error message (CSI 95685).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an improperly formatted date filter value threw an unhelpful server error on reports (CSI 94709).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;Contains&lt;/code&gt; filter on &lt;code&gt;Assigned To&lt;/code&gt; and other relationship fields forced a full selection, causing timeouts on list views and dashlets at high record volumes (CSI 98159).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Global Search failed to index when a comment log entry exceeded 32,000 characters (CSI 97481).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Global Search could exceed the &lt;code&gt;maxClauseCount&lt;/code&gt; threshold when executing queries with multiple hyphen-separated tokens (CSI 97570).&lt;/li&gt;
&lt;li&gt;Fixed an issue where SugarBPM being an application hook forced execution order relative to module-level logic hooks (SI 83796).&lt;/li&gt;
&lt;li&gt;Fixed an issue where SugarBPM Send Message events after a Wait step did not respect User Locale, Language, or Timezone settings when field variables were included in a Process Email Template (SUS-9).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a SugarBPM Receive Message Event was set to &lt;code&gt;COMPLETED&lt;/code&gt; instead of &lt;code&gt;CLOSED&lt;/code&gt; in &lt;code&gt;pmse_bpm_flow&lt;/code&gt;, causing records to become stuck in a process (SI 82401).&lt;/li&gt;
&lt;li&gt;Fixed a PHP 500 fatal error in the SugarBPM validator when processing older process definitions (CSI 95495).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Process Management failed to load or became progressively slower when hundreds of thousands of Process records existed (SI 89542).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Quick Repair and Rebuild caused API-triggered BPM document generation via DocMerge to fail (CSI 96056).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an HTTP 500 error occurred when saving a new Revenue Line Item with a custom field and a BPM Process Definition using Relationship Change Criteria (CSI 92792).&lt;/li&gt;
&lt;li&gt;Fixed an issue where hard-deleting data in &lt;code&gt;pmse_inbox&lt;/code&gt; caused a process to retrigger again (CSI 93985).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an Unauthorized Creation of Process Definition was possible when a user had Developer Access to at least one module (SUS-124).&lt;/li&gt;
&lt;li&gt;Fixed an issue where adding a column to a Case subpanel in Studio caused fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; (SUS-152).&lt;/li&gt;
&lt;li&gt;Fixed a severe CPU spike and instance unresponsiveness triggered by a Studio configuration change (CSI 98411).&lt;/li&gt;
&lt;li&gt;Fixed an issue where fields could not be added to a subpanel layout if the layout had no existing fields (SI 86285).&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting a relationship left orphaned files in the Vardefs directory causing an &lt;code&gt;Error: Invalid link&lt;/code&gt; (SI 89679).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Dropdown Styles Extension files were not rebuilt during Quick Repair and Rebuild (CSI 95294).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a missing Expression caused &lt;code&gt;MetadataManager&lt;/code&gt; to fail, making the site inaccessible with a 500 error (SI 82950).&lt;/li&gt;
&lt;li&gt;Fixed an issue where invalid formulas could be saved in Studio, resulting in a crashed instance (SI 81905).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Prune Database run on the 1st of the month orphaned audit records when parent records were deleted (SI 86770).&lt;/li&gt;
&lt;li&gt;Fixed an issue where OAuth 2.0 authentication with Exchange Online only sent one campaign email (CSI 98254).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Microsoft OAuth2 email authentication token expired after 90 days rather than refreshing (SUS-93).&lt;/li&gt;
&lt;li&gt;Fixed an issue where email accounts configured via Exchange Online did not allow users to send as other approved email addresses (BR-13300).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Email &amp;quot;From Name&amp;quot; was not being calculated correctly when sending via Microsoft Exchange (BR-13288).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Inbound Email Scheduler failed to archive all emails and prematurely removed them from the inbox (CSI 95509).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Inbound Email Scheduler logged a &lt;code&gt;stat(): failed&lt;/code&gt; error in the job queue when downloading emails with attachments (SI 67377).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; during execution of the &lt;code&gt;pollMonitoredInboxesForBouncedCampaignEmails&lt;/code&gt; and &lt;code&gt;pollMonitoredInboxes&lt;/code&gt; scheduler jobs (SUS-251).&lt;/li&gt;
&lt;li&gt;Fixed fatal errors in &lt;code&gt;sugarcrm.log&lt;/code&gt; during mail account setup (SUS-471).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;email_mailer_timelimit&lt;/code&gt; and &lt;code&gt;email_mailer_timeout&lt;/code&gt; config options resulted in delays when sending a test email (CSI 92799).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an imported email from a sender with a non-UTF-8 encoding caused the email record view to fail to load (CSI 95960).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a DB500 error could occur in the Emails Subpanel and Timeline Dashlet when loading archived emails indirectly related to a contact (CSI 97607).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sorting certain Emails subpanel columns caused a database error (CSI 98525).&lt;/li&gt;
&lt;li&gt;Fixed an issue where sorting columns in the Emails subpanel in Cases resulted in the error &lt;code&gt;Error: Unknown field&lt;/code&gt; (CSI 98344).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Report Grouping on a datetime field used UTC/GMT time instead of the user&amp;#39;s timezone (CSI 96346).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a report showed single-digit day/month dates when a UK/EU date format was set in the user profile (CSI 97195).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a database error occurred on reports when sorting by deleted fields (CSI 95763).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;SUM&lt;/code&gt;, &lt;code&gt;MIN&lt;/code&gt;, &lt;code&gt;MAX&lt;/code&gt;, and &lt;code&gt;AVG&lt;/code&gt; summary options for the &lt;code&gt;Duration Minutes&lt;/code&gt; field were missing in Summation Reports for Calls and Meetings (SI 79984).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Advanced Reports Custom Query builder returned a 404 instead of an invalid query screen (SI 86985).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the incorrect export delimiter was used when exporting Advanced Reports to CSV (SI 77564).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Report Chart did not sort based on the Display Summaries sort order (SI 80778).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Advanced Reports could not be scheduled due to a CSP violation (BR-13388).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar Logic was not calculated until after Save for formulas using the &lt;code&gt;relate&lt;/code&gt; function against Activities Flex relationships (SI 73566).&lt;/li&gt;
&lt;li&gt;Fixed an issue where formula validation of Calculation fields did not work properly (SI 77548).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Assigned User fields were not evaluated properly by a &lt;code&gt;Required if&lt;/code&gt; formula in another module (CSI 92022).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a &lt;code&gt;Required If&lt;/code&gt; formula containing a related link caused the Focus Drawer Record View Dashlet to break (CSI 92769).&lt;/li&gt;
&lt;li&gt;Fixed an issue where &lt;code&gt;Listview Actions&lt;/code&gt; dropdown menu disappeared when certain &lt;code&gt;Read Only If&lt;/code&gt; formulas were applied (CSI 92089).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a dependent &lt;code&gt;related&lt;/code&gt; formula did not display data in a subpanel (SI 80275).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Sugar did not reconnect to the database after a query was killed by the Slow Query Killer or a timeout (BR-12110).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Prune Database stalled on large tables (SI 80852).&lt;/li&gt;
&lt;li&gt;Fixed an issue where before_save hook changes were not audited (CSI 96102).&lt;/li&gt;
&lt;li&gt;Fixed a DB syntax error appearing in &lt;code&gt;sugarcrm.log&lt;/code&gt; (BR-13260).&lt;/li&gt;
&lt;li&gt;Fixed an issue where PDF templates could not render images stored within the Sugar instance (BR-13091).&lt;/li&gt;
&lt;li&gt;Fixed an issue where editing a PDF template broke it (CSI 98492).&lt;/li&gt;
&lt;li&gt;Fixed an issue where TCPDF PDF templates no longer converted spaces in image file names (CSI 94322).&lt;/li&gt;
&lt;li&gt;Fixed an issue where DocMerge produced documents failed to open if a &lt;code&gt;related()&lt;/code&gt; formula value contained the special symbol &lt;code&gt;&amp;amp;&lt;/code&gt; (CSI 94295).&lt;/li&gt;
&lt;li&gt;Fixed login failures including erroneous STS Auth errors, unauthorized access, and return-to-login loops associated with Identity Management (CSI 95337).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Refresh Token in an IDM-enabled instance did not live longer than 24 hours (BR-13036).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a regular user with &lt;code&gt;external_auth_only = 1&lt;/code&gt; did not appear in the Shared Calendar list (SI 89482).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the FilterAPI incorrectly returned extra fields in the response even when the &lt;code&gt;fields&lt;/code&gt; argument was specified (BR-13048).&lt;/li&gt;
&lt;li&gt;Fixed an issue where Group Users could not be deleted (CSI 95066).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &lt;code&gt;LBL_SHOW_MORE&lt;/code&gt; label on Text Area fields could display &amp;quot;Show More Cases&amp;quot; instead of &amp;quot;Show More&amp;quot; (CSI 97216).&lt;/li&gt;
&lt;li&gt;Fixed an issue where currency field sorting triggered a DB error in custom modules with &lt;code&gt;base_rate&lt;/code&gt; in the &lt;code&gt;_cstm&lt;/code&gt; table after upgrading to 25.2 (CSI 98412).&lt;/li&gt;
&lt;li&gt;Fixed an issue where List View Count was inaccurate when filtering on multiple Tags for records related to multiple tags (SI 83020).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the &amp;quot;Claim&amp;quot; Action Button did not respect &amp;quot;Required If&amp;quot; field validation (CSI 94987).&lt;/li&gt;
&lt;li&gt;Fixed an issue where PHP opcache corruption caused &lt;code&gt;Call to undefined method&lt;/code&gt; fatal errors (SUS-315).&lt;/li&gt;
&lt;li&gt;Fixed an issue where regular users triggered redundant rebuilds after an admin QRR due to &lt;code&gt;SystemProcessLock&lt;/code&gt;, causing server overload (SUS-304).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Scheduler UI displayed job run times in an unexpected timezone (BR-13130).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the email &amp;quot;From&amp;quot; filter behavior was inconsistent when raw email addresses were used as primary addresses on records (CSI 91283).&lt;/li&gt;
&lt;li&gt;Fixed an issue where installing Sugar locally under certain offline conditions failed (CSI 97111).&lt;/li&gt;
&lt;li&gt;Fixed an issue where using the &lt;code&gt;email_addresses_primary&lt;/code&gt; field in a template for a custom URL field resulted in a 500 error when opening any record in the module (SUS-288).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Sugar Market Integration used a deprecated API call (SE-9850).&lt;/li&gt;
&lt;li&gt;Fixed an issue where a &amp;quot;Page does not exist&amp;quot; error appeared when creating a new Case with an attachment (CSI 94268).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Emails subpanel used an inefficient search query, resulting in slow performance with large record counts (CSI 98123).&lt;/li&gt;
&lt;li&gt;Fixed an issue where an error occurred during MLP uninstallation (SUS-441).&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting relationships could break list views (SI 87737).&lt;/li&gt;
&lt;li&gt;Fixed an issue where the Product Catalog Dashlet displayed duplicated and inaccessible entries under specific Product Category and Template configurations (CSI 95867).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcetoc_security_updates"&gt;Sugar Core Security Updates&lt;/h2&gt;
&lt;p&gt;As part of our ongoing efforts to keep Sugar clean, fast, reliable, and most importantly secure, we have updated Sugar Core code in different areas of the application such as Package Scanner, Studio, Module Installer, UI rendering, API endpoints, Legacy SOAP API, File Uploads, Portal, PII Fields, ACL rules, Legacy Workflows, HTTP Headers (Referrer-Policy Header), SVG File Upload Sanitization, and BWC modules. We have also cleaned up and improved our logging messages around deprecations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some of those security improvements were backported to Sugar 25.1.x.&lt;/p&gt;
&lt;h2 id="mcetoc_healthcheck"&gt;Healthcheck Updates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Built a healthcheck to detect and reclassify &lt;code&gt;badVardefsMultienum&lt;/code&gt; issues from bucket &lt;code&gt;MANUAL&lt;/code&gt; to bucket &lt;code&gt;CUSTOM&lt;/code&gt;. The rule ID also changed from 526 (25.2.0) to 452 (26.1.0). Update any CI scripts or monitoring dashboards filtering on this rule&amp;#39;s ID or bucket.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item></channel></rss>