chore: Update copyright year from 2025 to 2026 across core files

- Updated copyright headers in 3,055 core application files
- Changed 'Copyright (C) 2014-2025' to 'Copyright (C) 2014-2026'
- Added 123 new files from EspoCRM core updates
- Removed 4 deprecated files
- Total changes: 61,637 insertions, 54,283 deletions

This is a routine maintenance update for the new year 2026.
This commit is contained in:
2026-02-07 16:05:21 +01:00
parent 6a8a4a2882
commit 127fa6503b
6468 changed files with 564781 additions and 31179 deletions

View File

@@ -0,0 +1,3 @@
{
"accessCheckerClassName": "Espo\\Classes\\Acl\\CurrencyRecordRate\\AccessChecker"
}

View File

@@ -63,7 +63,9 @@
"ImportError": "Import",
"ImportEml": "Import",
"WorkingTimeRange": "WorkingTimeCalendar",
"Stream": true
"Stream": true,
"CurrencyRecord": "boolean:Currency",
"CurrencyRecordRate": "Currency"
},
"fieldLevel": {
},
@@ -155,7 +157,11 @@
"delete": "all"
},
"Stream": true,
"ImportEml": "Import"
"ImportEml": "Import",
"CurrencyRecordRate": {
"read": "yes",
"edit": "yes"
}
}
},
"valuePermissionList": [

View File

@@ -72,7 +72,8 @@
"assignmentNotificationsIgnoreEntityTypeList": false,
"assignmentEmailNotificationsIgnoreEntityTypeList": false,
"dashletsOptions": false,
"dashboardLayout": false
"dashboardLayout": false,
"followAsCollaborator": false
},
"Call": {
"reminders": false

View File

@@ -34,7 +34,8 @@
"label": "Currency",
"iconClass": "fas fa-euro-sign",
"description": "currency",
"recordView": "views/admin/currency"
"recordView": "views/admin/currency",
"view": "views/admin/currency-main"
},
{
"url": "#Admin/notifications",

View File

@@ -7,5 +7,8 @@
},
"addressCountryData": {
"className": "Espo\\Classes\\AppParams\\AddressCountryData"
},
"currencyRates": {
"className": "Espo\\Classes\\AppParams\\CurrencyRates"
}
}

View File

@@ -1,6 +1,7 @@
{
"beforeLoginHookClassNameList": [
"Espo\\Core\\Authentication\\Hook\\Hooks\\FailedAttemptsLimit",
"Espo\\Core\\Authentication\\Hook\\Hooks\\UsernameFailedAttemptsLimit",
"Espo\\Core\\Authentication\\Hook\\Hooks\\FailedCodeAttemptsLimit"
],
"onLoginHookClassNameList": [

View File

@@ -168,6 +168,9 @@
},
"baselineRole": {
"level": "admin"
},
"currencyRates": {
"readOnly": true
}
}
}

View File

@@ -265,5 +265,36 @@
"ZAR",
"ZMW",
"ZWL"
]
],
"precisionMap": {
"BHD": 3,
"BIF": 0,
"CLP": 0,
"DJF": 0,
"GNF": 0,
"ISK": 0,
"IQD": 3,
"JOD": 3,
"JPY": 0,
"KMF": 0,
"KRW": 0,
"KWD": 3,
"LYD": 3,
"OMR": 3,
"PYG": 0,
"RWF": 0,
"TND": 3,
"UGX": 0,
"UYI": 0,
"VND": 0,
"VUV": 0,
"XAF": 0,
"XAU": 0,
"XBA": 0,
"XBB": 0,
"XBC": 0,
"XDR": 0,
"XOF": 0,
"XPF": 0
}
}

View File

@@ -4,28 +4,20 @@
"name": "My Espo",
"layout": [
{
"id": "defaultActivities",
"id": "default-activities",
"name": "Activities",
"x": 2,
"y": 2,
"width": 2,
"height": 2
"height": 4
},
{
"id": "defaultStream",
"id": "default-stream",
"name": "Stream",
"x": 0,
"y": 0,
"width": 2,
"height": 4
},
{
"id": "defaultTasks",
"name": "Tasks",
"x": 2,
"y": 4,
"width": 2,
"height": 2
}
]
}

View File

@@ -1,6 +1,6 @@
{
"Standard": {
"defaultStream": {
"default-stream": {
"displayRecords": 10
}
}

View File

@@ -115,9 +115,9 @@
"param": "accountLink",
"fieldDefs": {
"type": "enum",
"tooltip": true
},
"view": "views/admin/entity-manager/fields/acl-account-link"
"tooltip": true,
"view": "views/admin/entity-manager/fields/acl-account-link"
}
}
},
"@Base": {

View File

@@ -9,6 +9,7 @@
"da_DK",
"de_DE",
"es_ES",
"el_GR",
"hr_HR",
"hu_HU",
"fa_IR",
@@ -32,6 +33,7 @@
"pt_BR",
"pt_PT",
"uk_UA",
"ur_IN",
"vi_VN",
"zh_CN",
"zh_TW"

View File

@@ -51,6 +51,7 @@
"Espo\\Core\\Utils\\Metadata\\AdditionalBuilder\\Fields",
"Espo\\Core\\Utils\\Metadata\\AdditionalBuilder\\FilterFields",
"Espo\\Core\\Utils\\Metadata\\AdditionalBuilder\\DeleteIdField",
"Espo\\Core\\Utils\\Metadata\\AdditionalBuilder\\DisableAssignedUser",
"Espo\\Core\\Utils\\Metadata\\AdditionalBuilder\\StreamUpdatedAtField",
"Espo\\Core\\Utils\\Metadata\\AdditionalBuilder\\LogicDefsBc"
]

View File

@@ -2,10 +2,11 @@
"actionClassNameList": [
"Espo\\Core\\Rebuild\\Actions\\AddSystemUser",
"Espo\\Core\\Rebuild\\Actions\\AddSystemData",
"Espo\\Core\\Rebuild\\Actions\\CurrencyRates",
"Espo\\Core\\Rebuild\\Actions\\ScheduledJobs",
"Espo\\Core\\Rebuild\\Actions\\ConfigMetadataCheck",
"Espo\\Core\\Rebuild\\Actions\\GenerateInstanceId",
"Espo\\Core\\Rebuild\\Actions\\SetIntegrationDefaults"
"Espo\\Core\\Rebuild\\Actions\\SetIntegrationDefaults",
"Espo\\Core\\Rebuild\\Actions\\SyncCurrency",
"Espo\\Core\\Rebuild\\Actions\\CurrencyRates"
]
}

View File

@@ -41,6 +41,12 @@
"scheduling": "25 5 * * *",
"jobClassName": "Espo\\Classes\\Jobs\\CheckNewExtensionVersion"
},
"SyncCurrencyRates": {
"name": "Sync Currency Rates",
"jobClassName": "Espo\\Classes\\Jobs\\SyncCurrencyRates",
"scheduling": "2 0 * * *",
"isSystem": true
},
"Cleanup": {
"jobClassName": "Espo\\Classes\\Jobs\\Cleanup"
},

View File

@@ -3,5 +3,6 @@
"markdownText": "Espo\\Classes\\TemplateHelpers\\MarkdownText",
"tableTag": "Espo\\Classes\\TemplateHelpers\\TableTag",
"trTag": "Espo\\Classes\\TemplateHelpers\\TrTag",
"tdTag": "Espo\\Classes\\TemplateHelpers\\TdTag"
"tdTag": "Espo\\Classes\\TemplateHelpers\\TdTag",
"currencySymbol": "Espo\\Classes\\TemplateHelpers\\CurrencySymbol"
}

View File

@@ -1,6 +1,7 @@
{
"categories": {
"newNotification": {},
"appParamsUpdate": {},
"recordUpdate": {
"paramList": ["scope", "id"],
"accessCheckCommand": "AclCheck --userId=:userId --scope=:scope --id=:id --action=read"

View File

@@ -0,0 +1,44 @@
{
"controller": "controllers/record",
"createDisabled": true,
"editDisabled": true,
"removeDisabled": true,
"nameAttribute": "code",
"defaultFilterData": {
"primary": "active"
},
"filterList": [
"active"
],
"views": {
"list": "views/currency-record/list"
},
"viewSetupHandlers": {
"record/detail": [
"handlers/currency-record/record-detail"
]
},
"relationshipPanels": {
"rates": {
"layout": "listForRecord",
"createAttributeMap": {
"code": "recordName"
},
"view": "views/currency-record/record/panels/rates",
"unlinkDisabled": true
}
},
"menu": {
"list": {
"buttons": [
{
"name": "settings",
"labelTranslation": "Global.scopeNames.Settings",
"link": "#Admin/currency",
"handler": "handlers/currency-record/menu-action-settings",
"checkVisibilityFunction": "isVisible"
}
]
}
}
}

View File

@@ -0,0 +1,6 @@
{
"controller": "controllers/record",
"modelDefaultsPreparator": "handlers/currency-record-rate/default-preparator",
"acl": "acl/currency-record-rate",
"textFilterDisabled": true
}

View File

@@ -179,6 +179,17 @@
"lessThanOrEquals"
]
},
"decimal": {
"view": "views/admin/dynamic-logic/conditions/field-types/base",
"typeList": [
"isEmpty",
"isNotEmpty",
"greaterThan",
"lessThan",
"greaterThanOrEquals",
"lessThanOrEquals"
]
},
"currency": {
"view": "views/admin/dynamic-logic/conditions/field-types/base",
"typeList": [

View File

@@ -6,7 +6,8 @@
"required": true,
"pattern": "[a-zA-Z]{1}[a-zA-Z0-9_]+",
"index": true,
"tooltip": true
"tooltip": true,
"copyToClipboard": true
},
"value": {
"type": "text",

View File

@@ -105,6 +105,9 @@
},
"requestTime": {
"columns": ["requestTime"]
},
"usernameIpAddress": {
"columns": ["username", "ipAddress"]
}
},
"hooksDisabled": true

View File

@@ -0,0 +1,87 @@
{
"fields": {
"code": {
"type": "varchar",
"maxLength": 3,
"required": true,
"readOnly": true,
"index": true
},
"status": {
"type": "enum",
"options": [
"Active",
"Inactive"
],
"default": "Active",
"maxLength": 8,
"style": {
"Inactive": "info"
}
},
"label": {
"type": "varchar",
"notStorable": true,
"readOnly": true,
"orderDisabled": true,
"loaderClassName": "Espo\\Classes\\FieldProcessing\\CurrencyRecord\\Label"
},
"symbol": {
"type": "varchar",
"notStorable": true,
"readOnly": true,
"orderDisabled": true,
"loaderClassName": "Espo\\Classes\\FieldProcessing\\CurrencyRecord\\Symbol"
},
"rateDate": {
"type": "date",
"readOnly": true,
"notStorable": true,
"orderDisabled": true,
"loaderClassName": "Espo\\Classes\\FieldProcessing\\CurrencyRecord\\RateDate"
},
"rate": {
"type": "decimal",
"readOnly": true,
"notStorable": true,
"orderDisabled": true,
"decimalPlaces": 6,
"loaderClassName": "Espo\\Classes\\FieldProcessing\\CurrencyRecord\\Rate",
"view": "views/currency-record-rate/fields/rate"
},
"isBase": {
"type": "bool",
"readOnly": true,
"notStorable": true,
"orderDisabled": true,
"loaderClassName": "Espo\\Classes\\FieldProcessing\\CurrencyRecord\\IsBase"
}
},
"links": {
"rates": {
"type": "hasMany",
"entity": "CurrencyRecordRate",
"foreign": "record",
"readOnly": true,
"orderBy": "date",
"order": "desc"
}
},
"indexes": {
"codeDeleteId": {
"type": "unique",
"columns": [
"code",
"deleteId"
]
}
},
"deleteId": true,
"collection": {
"textFilterFields": [
"code"
],
"orderBy": "code",
"order": "asc"
}
}

View File

@@ -0,0 +1,84 @@
{
"fields": {
"record": {
"type": "link",
"required": true,
"readOnlyAfterCreate": true,
"validatorClassNameList": [
"Espo\\Classes\\FieldValidators\\CurrencyRecordRate\\Record\\NonBase"
]
},
"baseCode": {
"type": "varchar",
"readOnly": true,
"maxLength": 3
},
"date": {
"type": "date",
"required": true,
"readOnlyAfterCreate": true,
"default": "javascript: return this.dateTime.getToday();"
},
"rate": {
"type": "decimal",
"decimalPlaces": 6,
"min": 0.0001,
"precision": 15,
"scale": 8,
"required": true,
"audited": true,
"view": "views/currency-record-rate/fields/rate"
},
"createdAt": {
"type": "datetime",
"readOnly": true
},
"modifiedAt": {
"type": "datetime",
"readOnly": true
},
"createdBy": {
"type": "link",
"readOnly": true,
"view": "views/fields/user",
"fieldManagerParamList": []
},
"modifiedBy": {
"type": "link",
"readOnly": true,
"view": "views/fields/user",
"fieldManagerParamList": []
}
},
"links": {
"record": {
"type": "belongsTo",
"entity": "CurrencyRecord",
"foreignName": "code"
},
"createdBy": {
"type": "belongsTo",
"entity": "User"
},
"modifiedBy": {
"type": "belongsTo",
"entity": "User"
}
},
"indexes": {
"recordIdBaseCodeDate": {
"type": "unique",
"columns": [
"recordId",
"baseCode",
"date",
"deleteId"
]
}
},
"deleteId": true,
"collection": {
"orderBy": "date",
"order": "desc"
}
}

View File

@@ -13,7 +13,7 @@
},
"dashletsOptions": {
"type": "jsonObject",
"disabled": true
"utility": true
},
"createdAt": {
"type": "datetime",

View File

@@ -47,13 +47,21 @@
"view": "views/email-account/fields/folders",
"displayAsList": true,
"noEmptyString": true,
"duplicateIgnore": true
"duplicateIgnore": true,
"tooltip": true,
"fullNameAdditionalAttributeList": ["folderMap"]
},
"sentFolder": {
"type": "varchar",
"view": "views/email-account/fields/folder",
"duplicateIgnore": true
},
"folderMap": {
"type": "jsonObject",
"validatorClassNameList": [
"Espo\\Classes\\FieldValidators\\EmailAccount\\FolderMap\\Valid"
]
},
"storeSentEmails": {
"type": "bool",
"tooltip": true

View File

@@ -56,6 +56,9 @@
"type": "linkMultiple",
"audited": true
},
"description": {
"type": "text"
},
"createdAt": {
"type": "datetime",
"readOnly": true

View File

@@ -215,6 +215,9 @@
"view": "views/lead-capture/fields/phone-number-country",
"maxLength": 2
},
"description": {
"type": "text"
},
"createdAt": {
"type": "datetime",
"readOnly": true

View File

@@ -117,6 +117,9 @@
"min": 0,
"tooltip": "Settings.authTokenMaxIdleTime"
},
"description": {
"type": "text"
},
"modifiedAt": {
"type": "datetime",
"readOnly": true

View File

@@ -111,6 +111,10 @@
"type": "bool",
"default": true
},
"reactionNotificationsNotFollowed": {
"type": "bool",
"default": false
},
"autoFollowEntityTypeList": {
"type": "multiEnum",
"view": "views/preferences/fields/auto-follow-entity-type-list",
@@ -207,6 +211,10 @@
"default": [],
"tooltip": true
},
"followAsCollaborator": {
"type": "bool",
"default": true
},
"emailUseExternalClient": {
"type": "bool",
"default": false

View File

@@ -191,8 +191,7 @@
"view": "views/settings/fields/default-currency"
},
"currencyRates": {
"type": "base",
"view": "views/settings/fields/currency-rates"
"type": "base"
},
"outboundEmailIsShared": {
"type": "bool",

View File

@@ -32,6 +32,9 @@
"tooltip": true,
"audited": true
},
"description": {
"type": "text"
},
"createdAt": {
"type": "datetime",
"readOnly": true
@@ -48,7 +51,8 @@
"foreign": "teams",
"columnAttributeMap": {
"role": "userRole"
}
},
"apiSpecDisabled": true
},
"roles": {
"type": "hasMany",

View File

@@ -75,6 +75,9 @@
"teams": {
"type": "linkMultiple"
},
"description": {
"type": "text"
},
"createdAt": {
"type": "datetime",
"readOnly": true
@@ -120,6 +123,11 @@
},
"title": {
"type": "varchar"
},
"filename": {
"type": "varchar",
"maxLength": 150,
"tooltip": true
}
},
"links": {

View File

@@ -292,13 +292,17 @@
"type": "link",
"layoutDetailDisabled": true,
"tooltip": true,
"customizationAuditedDisabled": true,
"customizationAutocompleteOnEmptyDisabled": true,
"validatorClassNameList": [
"Espo\\Classes\\FieldValidators\\User\\DefaultTeam\\IsUserTeam"
],
"view": "views/user/fields/default-team",
"dynamicLogicVisibleDisabled": true
"dynamicLogicVisibleDisabled": true,
"fieldManagerParamList": [
"audited",
"tooltipText",
"readOnly",
"autocompleteOnEmpty"
]
},
"acceptanceStatus": {
"type": "varchar",
@@ -350,7 +354,14 @@
"additionalAttributeList": ["columns"],
"layoutDetailDisabled": true,
"view": "views/user/fields/teams",
"audited": true
"audited": true,
"fieldManagerParamList": [
"audited",
"tooltipText",
"readOnly",
"autocompleteOnEmpty",
"maxCount"
]
},
"roles": {
"type": "linkMultiple",

View File

@@ -51,6 +51,9 @@
"type": "bool",
"tooltip": true
},
"description": {
"type": "text"
},
"createdAt": {
"type": "datetime",
"readOnly": true

View File

@@ -79,7 +79,8 @@
"customizationInlineEditDisabledDisabled": true,
"customizationDefaultView": "views/admin/field-manager/fields/currency-default",
"customizationTooltipTextDisabled": true,
"maxLength": 3
"maxLength": 3,
"apiSpecDisabled": true
},
"converted": {
"type": "currencyConverted",

View File

@@ -22,6 +22,7 @@
"javascript: return this.dateTime.getDateShiftedFromToday(8, 'days');",
"javascript: return this.dateTime.getDateShiftedFromToday(9, 'days');",
"javascript: return this.dateTime.getDateShiftedFromToday(10, 'days');",
"javascript: return this.dateTime.getDateShiftedFromToday(30, 'days');",
"javascript: return this.dateTime.getDateShiftedFromToday(1, 'weeks');",
"javascript: return this.dateTime.getDateShiftedFromToday(2, 'weeks');",
"javascript: return this.dateTime.getDateShiftedFromToday(3, 'weeks');",

View File

@@ -83,7 +83,7 @@
"fields": {
"date": {
"type": "date",
"disabled": true
"utility": true
}
},
"validationList": [

View File

@@ -0,0 +1,60 @@
{
"params": [
{
"name": "required",
"type": "bool",
"default": false
},
{
"name": "default",
"type": "decimal"
},
{
"name": "min",
"type": "decimal"
},
{
"name": "max",
"type": "decimal"
},
{
"name": "decimalPlaces",
"type": "int"
},
{
"name": "audited",
"type": "bool"
},
{
"name": "readOnly",
"type": "bool"
},
{
"name": "readOnlyAfterCreate",
"type": "bool"
},
{
"name": "precision",
"type": "int",
"hidden": true
},
{
"name": "scale",
"type": "int",
"hidden": true
}
],
"filter": true,
"validationList": [
"required",
"min",
"max"
],
"mandatoryValidationList": [
"valid"
],
"sanitizerClassNameList": [
"Espo\\Classes\\FieldSanitizers\\Decimal"
],
"converterClassName": "Espo\\Core\\Utils\\Database\\Orm\\FieldConverters\\Decimal"
}

View File

@@ -25,6 +25,11 @@
"name": "copyToClipboard",
"type": "bool",
"default": false
},
{
"name": "suppressHook",
"type": "bool",
"default": false
}
],
"filter": true,

View File

@@ -0,0 +1,14 @@
{
"fields": {
"baseCode": {
"visible": {
"conditionGroup": [
{
"type": "isNotEmpty",
"attribute": "id"
}
]
}
}
}
}

View File

@@ -1,5 +1,25 @@
{
"fields": {
"tabList": {
"visible": {
"conditionGroup": [
{
"type": "isTrue",
"attribute": "useCustomTabList"
}
]
}
},
"addCustomTabs": {
"visible": {
"conditionGroup": [
{
"type": "isTrue",
"attribute": "useCustomTabList"
}
]
}
},
"assignmentEmailNotificationsIgnoreEntityTypeList": {
"visible": {
"conditionGroup": [
@@ -9,6 +29,16 @@
}
]
}
},
"reactionNotificationsNotFollowed": {
"visible": {
"conditionGroup": [
{
"type": "isTrue",
"attribute": "reactionNotifications"
}
]
}
}
}
}

View File

@@ -0,0 +1,17 @@
{
"beforeCreateHookClassNameList": [
"Espo\\Classes\\RecordHooks\\CurrencyRecordRate\\BeforeSaveValidation"
],
"beforeUpdateHookClassNameList": [
"Espo\\Classes\\RecordHooks\\CurrencyRecordRate\\BeforeSaveValidation"
],
"afterCreateHookClassNameList": [
"Espo\\Classes\\RecordHooks\\CurrencyRecordRate\\AfterSave"
],
"afterUpdateHookClassNameList": [
"Espo\\Classes\\RecordHooks\\CurrencyRecordRate\\AfterSave"
],
"afterDeleteHookClassNameList": [
"Espo\\Classes\\RecordHooks\\CurrencyRecordRate\\AfterDelete"
]
}

View File

@@ -14,6 +14,10 @@
"Espo\\Classes\\Record\\InboundEmail\\PasswordsInputFilter"
],
"beforeCreateHookClassNameList": [
"Espo\\Classes\\RecordHooks\\EmailAccount\\BeforeCreate"
"Espo\\Classes\\RecordHooks\\EmailAccount\\BeforeCreate",
"Espo\\Classes\\RecordHooks\\EmailAccount\\BeforeSave"
],
"beforeUpdateHookClassNameList": [
"Espo\\Classes\\RecordHooks\\EmailAccount\\BeforeSave"
]
}

View File

@@ -0,0 +1,7 @@
{
"massActions": {
"delete": {
"allowed": true
}
}
}

View File

@@ -0,0 +1,4 @@
{
"entity": true,
"tab": true
}

View File

@@ -0,0 +1,4 @@
{
"entity": true,
"preserveAuditLog": true
}

View File

@@ -0,0 +1,3 @@
{
"acl": "boolean"
}

View File

@@ -0,0 +1,11 @@
{
"primaryFilterClassNameMap": {
"active": "Espo\\Classes\\Select\\CurrencyRecord\\PrimaryFilters\\Active"
},
"selectAttributesDependencyMap": {
"id": [
"code"
]
},
"accessControlFilterResolverClassName": "Espo\\Core\\Select\\AccessControl\\FilterResolvers\\Boolean"
}

View File

@@ -0,0 +1,10 @@
{
"selectAttributesDependencyMap": {
"id": [
"recordId",
"recordName",
"baseCode"
]
},
"accessControlFilterResolverClassName": "Espo\\Core\\Select\\AccessControl\\FilterResolvers\\Boolean"
}