arelle-release 2.37.41__py3-none-any.whl → 2.37.43__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arelle-release might be problematic. Click here for more details.

arelle/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '2.37.41'
21
- __version_tuple__ = version_tuple = (2, 37, 41)
20
+ __version__ = version = '2.37.43'
21
+ __version_tuple__ = version_tuple = (2, 37, 43)
@@ -9,6 +9,8 @@ from dataclasses import dataclass
9
9
  from functools import lru_cache
10
10
  from pathlib import Path
11
11
 
12
+ import regex
13
+
12
14
  from arelle.ModelDocument import Type as ModelDocumentType
13
15
  from arelle.ModelInstanceObject import ModelFact
14
16
  from arelle.ModelObject import ModelObject
@@ -17,6 +19,7 @@ from arelle.ModelXbrl import ModelXbrl
17
19
  from arelle.PrototypeDtsObject import LinkPrototype
18
20
  from arelle.ValidateDuplicateFacts import getDeduplicatedFacts, DeduplicationType
19
21
  from arelle.ValidateXbrl import ValidateXbrl
22
+ from arelle.XmlValidate import VALID
20
23
  from arelle.typing import TypeGetText
21
24
  from arelle.utils.PluginData import PluginData
22
25
  from .FormType import FormType
@@ -35,15 +38,34 @@ class UploadContents:
35
38
  @dataclass
36
39
  class PluginValidationDataExtension(PluginData):
37
40
  assetsIfrsQn: QName
41
+ documentTypeDeiQn: QName
42
+ jpcrpEsrFilingDateCoverPageQn: QName
43
+ jpcrpFilingDateCoverPageQn: QName
44
+ jpspsFilingDateCoverPageQn: QName
38
45
  liabilitiesAndEquityIfrsQn: QName
46
+ nonConsolidatedMemberQn: QName
47
+
48
+ contextIdPattern: regex.Pattern[str]
39
49
 
40
50
  _primaryModelXbrl: ModelXbrl | None = None
41
51
 
42
52
  def __init__(self, name: str):
43
53
  super().__init__(name)
54
+ jpcrpEsrNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/jpcrp-esr_cor"
55
+ jpcrpNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/jpcrp_cor'
56
+ jpdeiNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor'
44
57
  jpigpNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_cor"
58
+ jppfsNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_cor"
59
+ jpspsNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_cor'
45
60
  self.assetsIfrsQn = qname(jpigpNamespace, 'AssetsIFRS')
61
+ self.documentTypeDeiQn = qname(jpdeiNamespace, 'DocumentTypeDEI')
62
+ self.jpcrpEsrFilingDateCoverPageQn = qname(jpcrpEsrNamespace, 'FilingDateCoverPage')
63
+ self.jpcrpFilingDateCoverPageQn = qname(jpcrpNamespace, 'FilingDateCoverPage')
64
+ self.jpspsFilingDateCoverPageQn = qname(jpspsNamespace, 'FilingDateCoverPage')
46
65
  self.liabilitiesAndEquityIfrsQn = qname(jpigpNamespace, "LiabilitiesAndEquityIFRS")
66
+ self.nonConsolidatedMemberQn = qname(jppfsNamespace, "NonConsolidatedMember")
67
+
68
+ self.contextIdPattern = regex.compile(r'(Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Interim)(Duration|Instant)')
47
69
 
48
70
  # Identity hash for caching.
49
71
  def __hash__(self) -> int:
@@ -79,6 +101,15 @@ class PluginValidationDataExtension(PluginData):
79
101
  def getDeduplicatedFacts(self, modelXbrl: ModelXbrl) -> list[ModelFact]:
80
102
  return getDeduplicatedFacts(modelXbrl, DeduplicationType.CONSISTENT_PAIRS)
81
103
 
104
+ @lru_cache(1)
105
+ def getDocumentTypes(self, modelXbrl: ModelXbrl) -> set[str]:
106
+ documentFacts = modelXbrl.factsByQname.get(self.documentTypeDeiQn, set())
107
+ documentTypes = set()
108
+ for fact in documentFacts:
109
+ if fact.xValid >= VALID:
110
+ documentTypes.add(fact.textValue)
111
+ return documentTypes
112
+
82
113
  @lru_cache(1)
83
114
  def getFootnoteLinkElements(self, modelXbrl: ModelXbrl) -> list[ModelObject | LinkPrototype]:
84
115
  # TODO: Consolidate with similar implementations in EDGAR and FERC
@@ -15,7 +15,7 @@ from arelle.Version import authorLabel, copyrightLabel
15
15
  from . import Constants
16
16
  from .Manifest import Manifest, ManifestInstance, parseManifests
17
17
  from .ValidationPluginExtension import ValidationPluginExtension
18
- from .rules import edinet, frta, gfm, upload
18
+ from .rules import contexts, edinet, frta, gfm, upload
19
19
 
20
20
  PLUGIN_NAME = "Validate EDINET"
21
21
  DISCLOSURE_SYSTEM_VALIDATION_TYPE = "EDINET"
@@ -34,6 +34,7 @@ validationPlugin = ValidationPluginExtension(
34
34
  disclosureSystemConfigUrl=Path(__file__).parent / "resources" / "config.xml",
35
35
  validationTypes=[DISCLOSURE_SYSTEM_VALIDATION_TYPE],
36
36
  validationRuleModules=[
37
+ contexts,
37
38
  edinet,
38
39
  frta,
39
40
  gfm,
@@ -0,0 +1,186 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from collections import defaultdict
7
+ from typing import Any, Iterable
8
+
9
+ import regex
10
+
11
+ from arelle import XbrlConst
12
+ from arelle.ModelDtsObject import ModelConcept
13
+ from arelle.ValidateXbrl import ValidateXbrl
14
+ from arelle.typing import TypeGetText
15
+ from arelle.utils.PluginHooks import ValidationHook
16
+ from arelle.utils.validate.Decorator import validation
17
+ from arelle.utils.validate.Validation import Validation
18
+ from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
19
+ from ..PluginValidationDataExtension import PluginValidationDataExtension
20
+
21
+ _: TypeGetText
22
+
23
+
24
+ # Per "Framework Design of EDINET Taxonomy", ELR definitions contain a 6-digit
25
+ # can be used to categorize the ELR.
26
+ FINANCIAL_STATEMENT_ELR_PREFIXES = (
27
+ '3', # Codes starting with 3 indicate "Japanese GAAP Financial Statement"
28
+ '5', # Codes starting with 5 indicate "IFRS Financial Statement"
29
+ )
30
+
31
+
32
+ @validation(
33
+ hook=ValidationHook.XBRL_FINALLY,
34
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
35
+ )
36
+ def rule_EC8013W(
37
+ pluginData: PluginValidationDataExtension,
38
+ val: ValidateXbrl,
39
+ *args: Any,
40
+ **kwargs: Any,
41
+ ) -> Iterable[Validation]:
42
+ """
43
+ EDINET.EC8013W: The context ID of the element associated with the financial statement
44
+ extended link role begins with one of the following strings:
45
+ Prior?YearDuration
46
+ CurrentYearDuration
47
+ Prior?YearInstant
48
+ CurrentYearInstant
49
+ InterimDuration
50
+ InterimInstant
51
+ Prior?InterimDuration
52
+ Prior?InterimInstant
53
+ Where ? is a digit from 1 to 9.
54
+ """
55
+ financialStatementRoleTypes = set()
56
+ for roleUri, roleTypes in val.modelXbrl.roleTypes.items():
57
+ for roleType in roleTypes:
58
+ definition = roleType.definition
59
+ roleTypeCode = roleType.definition.split(' ')[0] if definition else None
60
+ if roleTypeCode is None:
61
+ continue
62
+ if any(roleTypeCode.startswith(prefix) for prefix in FINANCIAL_STATEMENT_ELR_PREFIXES):
63
+ financialStatementRoleTypes.add(roleType)
64
+
65
+ financialStatementConcepts: set[ModelConcept] = set()
66
+ labelsRelationshipSet = val.modelXbrl.relationshipSet(
67
+ XbrlConst.parentChild,
68
+ tuple(roleType.roleURI for roleType in financialStatementRoleTypes)
69
+ )
70
+ financialStatementConcepts.update(labelsRelationshipSet.fromModelObjects().keys())
71
+ financialStatementConcepts.update(labelsRelationshipSet.toModelObjects().keys())
72
+
73
+ invalidContextIdMap = defaultdict(list)
74
+ for fact in val.modelXbrl.facts:
75
+ if fact.concept not in financialStatementConcepts:
76
+ continue
77
+ if fact.contextID is None:
78
+ continue
79
+ if not pluginData.contextIdPattern.match(fact.contextID):
80
+ invalidContextIdMap[fact.contextID].append(fact)
81
+ for contextId, facts in invalidContextIdMap.items():
82
+ yield Validation.warning(
83
+ codes='EDINET.EC8013W',
84
+ msg=_("The context ID (id=%(contextId)s) for the element related to the extended link role "
85
+ "in Financial Statement is not per convention. Please set the context ID of the element "
86
+ "related to the extended link role of financial statements according to the rules. For "
87
+ "the financial statements, please refer to \"3-4-2 Setting the Context\" in the "
88
+ "\"Validation Guidelines\"."),
89
+ contextId=contextId,
90
+ modelObject=facts,
91
+ )
92
+
93
+
94
+ @validation(
95
+ hook=ValidationHook.XBRL_FINALLY,
96
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
97
+ )
98
+ def rule_EC8033W(
99
+ pluginData: PluginValidationDataExtension,
100
+ val: ValidateXbrl,
101
+ *args: Any,
102
+ **kwargs: Any,
103
+ ) -> Iterable[Validation]:
104
+ """
105
+ EDINET.EC8033W: The startDate of a context whose context ID starts with
106
+ "CurrentYear" is not set to a date earlier than the endDate of a context
107
+ whose context ID starts with "Prior1Year".
108
+ """
109
+ priorYearContexts = [
110
+ context
111
+ for contextId, context in val.modelXbrl.contexts.items()
112
+ if contextId.startswith('Prior1Year')
113
+ and context.endDatetime is not None
114
+ and context.isStartEndPeriod
115
+ ]
116
+ latestPriorYearContext = None
117
+ for priorYearContext in priorYearContexts:
118
+ if latestPriorYearContext is None or \
119
+ priorYearContext.endDatetime > latestPriorYearContext.endDatetime:
120
+ latestPriorYearContext = priorYearContext
121
+ if latestPriorYearContext is None:
122
+ return
123
+ currentYearContexts = [
124
+ context
125
+ for contextId, context in val.modelXbrl.contexts.items()
126
+ if contextId.startswith('CurrentYear')
127
+ and context.startDatetime is not None
128
+ and context.isStartEndPeriod
129
+ ]
130
+ earliestCurrentYearContext = None
131
+ for currentYearContext in currentYearContexts:
132
+ if earliestCurrentYearContext is None or \
133
+ currentYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
134
+ earliestCurrentYearContext = currentYearContext
135
+ if earliestCurrentYearContext is None:
136
+ return
137
+ if latestPriorYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
138
+ yield Validation.warning(
139
+ codes='EDINET.EC8033W',
140
+ msg=_("The startDate element of the current year context (id=%(currentYearContextId)s) is "
141
+ "set to a date that is earlier than the endDate element of the prior year context "
142
+ "(id=%(priorYearContextId)s). Please check the corresponding context ID "
143
+ "%(currentYearContextId)s and %(priorYearContextId)s. Set the startDate element of "
144
+ "context ID %(currentYearContextId)s to a date that is later than or equal to the "
145
+ "endDate element of context ID %(priorYearContextId)s."),
146
+ currentYearContextId=earliestCurrentYearContext.id,
147
+ priorYearContextId=latestPriorYearContext.id,
148
+ modelObject=priorYearContexts + currentYearContexts,
149
+ )
150
+
151
+
152
+ @validation(
153
+ hook=ValidationHook.XBRL_FINALLY,
154
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
155
+ )
156
+ def rule_EC8054W(
157
+ pluginData: PluginValidationDataExtension,
158
+ val: ValidateXbrl,
159
+ *args: Any,
160
+ **kwargs: Any,
161
+ ) -> Iterable[Validation]:
162
+ """
163
+ EDINET.EC8054W: For any context with ID containing "NonConsolidatedMember",
164
+ the scenario element within must be set to "NonConsolidatedMember".
165
+ """
166
+ for context in val.modelXbrl.contexts.values():
167
+ if pluginData.nonConsolidatedMemberQn.localName not in context.id:
168
+ continue
169
+ memberQnames = set()
170
+ for scenarioElt in context.iterdescendants(XbrlConst.qnXbrlScenario.clarkNotation):
171
+ for memberElt in scenarioElt.iterdescendants(
172
+ XbrlConst.qnXbrldiExplicitMember.clarkNotation,
173
+ XbrlConst.qnXbrldiTypedMember.clarkNotation
174
+ ):
175
+ memberQnames.add(memberElt.xValue)
176
+ if pluginData.nonConsolidatedMemberQn not in memberQnames:
177
+ yield Validation.warning(
178
+ codes='EDINET.EC8054W',
179
+ msg=_("For the context ID (%(contextId)s), \"NonConsolidatedMember\" "
180
+ "is not set in the scenario element. Please correct the relevant "
181
+ "context ID and scenario element. For naming rules for context IDs, "
182
+ "refer to \"5-4-1 Naming Rules for Context IDs\" in the \"Guidelines "
183
+ "for Creating Report Instances.\""),
184
+ contextId=context.id,
185
+ modelObject=context,
186
+ )
@@ -7,10 +7,11 @@ from collections import defaultdict
7
7
  from decimal import Decimal
8
8
  from typing import Any, Iterable, cast
9
9
 
10
- import regex
11
-
12
- from arelle import XbrlConst
10
+ from arelle import XbrlConst, ValidateDuplicateFacts
11
+ from arelle.LinkbaseType import LinkbaseType
12
+ from arelle.ValidateDuplicateFacts import DuplicateType
13
13
  from arelle.ValidateXbrl import ValidateXbrl
14
+ from arelle.XmlValidateConst import VALID
14
15
  from arelle.typing import TypeGetText
15
16
  from arelle.utils.PluginHooks import ValidationHook
16
17
  from arelle.utils.validate.Decorator import validation
@@ -21,6 +22,34 @@ from ..PluginValidationDataExtension import PluginValidationDataExtension
21
22
  _: TypeGetText
22
23
 
23
24
 
25
+ @validation(
26
+ hook=ValidationHook.XBRL_FINALLY,
27
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
28
+ )
29
+ def rule_EC1057E(
30
+ pluginData: PluginValidationDataExtension,
31
+ val: ValidateXbrl,
32
+ *args: Any,
33
+ **kwargs: Any,
34
+ ) -> Iterable[Validation]:
35
+ """
36
+ EDINET.EC1057E: The submission date on the cover page has not been filled in.
37
+ Ensure that there is a nonnil value disclosed for FilingDateCoverPage
38
+ Note: This rule is only applicable to the public documents.
39
+ """
40
+ dei = pluginData.getDocumentTypes(val.modelXbrl)
41
+ if len(dei) > 0:
42
+ jpcrpEsrFacts = val.modelXbrl.factsByQname.get(pluginData.jpcrpEsrFilingDateCoverPageQn, set())
43
+ jpcrpFacts = val.modelXbrl.factsByQname.get(pluginData.jpcrpFilingDateCoverPageQn, set())
44
+ jpspsFacts = val.modelXbrl.factsByQname.get(pluginData.jpspsFilingDateCoverPageQn, set())
45
+ requiredFacts = jpcrpFacts.union(jpspsFacts, jpcrpEsrFacts)
46
+ if not any(fact.xValid >= VALID and not fact.isNil for fact in requiredFacts):
47
+ yield Validation.error(
48
+ codes='EDINET.EC1057E',
49
+ msg=_("The [Submission Date] on the cover page has not been filled in."),
50
+ )
51
+
52
+
24
53
  @validation(
25
54
  hook=ValidationHook.XBRL_FINALLY,
26
55
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -42,7 +71,7 @@ def rule_EC5002E(
42
71
  errorFacts = []
43
72
  for fact in val.modelXbrl.facts:
44
73
  concept = fact.concept
45
- if not concept.isShares:
74
+ if concept is None or not concept.isShares:
46
75
  continue
47
76
  unit = fact.unit
48
77
  measures = unit.measures
@@ -68,60 +97,87 @@ def rule_EC5002E(
68
97
  hook=ValidationHook.XBRL_FINALLY,
69
98
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
70
99
  )
71
- def rule_EC8033W(
100
+ def rule_EC8024E(
72
101
  pluginData: PluginValidationDataExtension,
73
102
  val: ValidateXbrl,
74
103
  *args: Any,
75
104
  **kwargs: Any,
76
105
  ) -> Iterable[Validation]:
77
106
  """
78
- EDINET.EC8033W: The startDate of a context whose context ID starts with
79
- "CurrentYear" is not set to a date earlier than the endDate of a context
80
- whose context ID starts with "Prior1Year".
107
+ EDINET.EC8024E: Instance values of the same element, context, and unit may not
108
+ have different values or different decimals attributes.
109
+ Correct the element with the relevant context ID. For elements in an inline XBRL file that have
110
+ duplicate elements, context IDs, and unit IDs, set the same values for the value and
111
+ decimals attribute.
81
112
  """
82
- priorYearContexts = [
83
- context
84
- for contextId, context in val.modelXbrl.contexts.items()
85
- if contextId.startswith('Prior1Year')
86
- and context.endDatetime is not None
87
- and context.isStartEndPeriod
88
- ]
89
- latestPriorYearContext = None
90
- for priorYearContext in priorYearContexts:
91
- if latestPriorYearContext is None or \
92
- priorYearContext.endDatetime > latestPriorYearContext.endDatetime:
93
- latestPriorYearContext = priorYearContext
94
- if latestPriorYearContext is None:
95
- return
96
- currentYearContexts = [
97
- context
98
- for contextId, context in val.modelXbrl.contexts.items()
99
- if contextId.startswith('CurrentYear')
100
- and context.startDatetime is not None
101
- and context.isStartEndPeriod
102
- ]
103
- earliestCurrentYearContext = None
104
- for currentYearContext in currentYearContexts:
105
- if earliestCurrentYearContext is None or \
106
- currentYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
107
- earliestCurrentYearContext = currentYearContext
108
- if earliestCurrentYearContext is None:
109
- return
110
- if latestPriorYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
111
- yield Validation.warning(
112
- codes='EDINET.EC8033W',
113
- msg=_("The startDate element of the current year context (id=%(currentYearContextId)s) is "
114
- "set to a date that is earlier than the endDate element of the prior year context "
115
- "(id=%(priorYearContextId)s). Please check the corresponding context ID "
116
- "%(currentYearContextId)s and %(priorYearContextId)s. Set the startDate element of "
117
- "context ID %(currentYearContextId)s to a date that is later than or equal to the "
118
- "endDate element of context ID %(priorYearContextId)s."),
119
- currentYearContextId=earliestCurrentYearContext.id,
120
- priorYearContextId=latestPriorYearContext.id,
121
- modelObject=priorYearContexts + currentYearContexts,
113
+ duplicateFactSets = ValidateDuplicateFacts.getDuplicateFactSetsWithType(val.modelXbrl.facts, DuplicateType.INCOMPLETE)
114
+ for duplicateFactSet in duplicateFactSets:
115
+ fact = duplicateFactSet.facts[0]
116
+ yield Validation.error(
117
+ codes='EDINET.EC8024E',
118
+ msg=_("Instance values of the same element, context, and unit may not "
119
+ "have different values or different decimals attributes. <element=%(concept)s> "
120
+ "<contextID=%(context)s> <unit=%(unit)s>. Correct the element with the relevant "
121
+ "context ID. For elements in an inline XBRL file that have duplicate "
122
+ "elements, context IDs, and unit IDs, set the same values for the value and "
123
+ "decimals attribute."),
124
+ concept=fact.qname,
125
+ context=fact.contextID,
126
+ unit=fact.unitID,
127
+ modelObject=duplicateFactSet.facts,
122
128
  )
123
129
 
124
130
 
131
+ @validation(
132
+ hook=ValidationHook.XBRL_FINALLY,
133
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
134
+ )
135
+ def rule_EC8027W(
136
+ pluginData: PluginValidationDataExtension,
137
+ val: ValidateXbrl,
138
+ *args: Any,
139
+ **kwargs: Any,
140
+ ) -> Iterable[Validation]:
141
+ """
142
+ EDINET.EC8027W: For presentation links and definition links, there must be
143
+ only one root element.
144
+ File name: xxx <Extended link role = yyy>
145
+ Please correct the extended link role of the relevant file. Please set only one
146
+ root element of the extended link role in the presentation link and definition link.
147
+ """
148
+ linkbaseTypes = (LinkbaseType.PRESENTATION, LinkbaseType.DEFINITION)
149
+ roleTypes = [
150
+ roleType
151
+ for roleTypes in val.modelXbrl.roleTypes.values()
152
+ for roleType in roleTypes
153
+ ]
154
+ for roleType in roleTypes:
155
+ for linkbaseType in linkbaseTypes:
156
+ if linkbaseType.getLinkQn() not in roleType.usedOns:
157
+ continue
158
+ arcroles = linkbaseType.getArcroles()
159
+ relSet = val.modelXbrl.relationshipSet(tuple(arcroles), roleType.roleURI)
160
+ relSetFrom = relSet.loadModelRelationshipsFrom()
161
+ rootConcepts = relSet.rootConcepts
162
+ if len(rootConcepts) < 2:
163
+ continue
164
+ rels = [
165
+ rel
166
+ for rootConcept in rootConcepts
167
+ for rel in relSetFrom[rootConcept]
168
+ ]
169
+ yield Validation.warning(
170
+ codes='EDINET.EC8027W',
171
+ msg=_("For presentation links and definition links, there must be only one root element. "
172
+ "File name: %(filename)s <Extended link role = %(roleUri)s> "
173
+ "Please correct the extended link role of the relevant file. Please set only one "
174
+ "root element of the extended link role in the presentation link and definition link."),
175
+ filename=rels[0].modelDocument.basename,
176
+ roleUri=roleType.roleURI,
177
+ modelObject=rels,
178
+ )
179
+
180
+
125
181
  @validation(
126
182
  hook=ValidationHook.XBRL_FINALLY,
127
183
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -136,13 +192,12 @@ def rule_EC8062W(
136
192
  EDINET.EC8062W: The sum of all liabilities and equity must equal the sum of all assets.
137
193
  """
138
194
  deduplicatedFacts = pluginData.getDeduplicatedFacts(val.modelXbrl)
139
- contextIdPattern = regex.compile(r'^(Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Interim)(Duration|Instant)$')
140
195
 
141
196
  factsByContextId = defaultdict(list)
142
197
  for fact in deduplicatedFacts:
143
198
  if fact.qname not in (pluginData.assetsIfrsQn, pluginData.liabilitiesAndEquityIfrsQn):
144
199
  continue
145
- if fact.contextID is None or not contextIdPattern.match(fact.contextID):
200
+ if fact.contextID is None or not pluginData.contextIdPattern.fullmatch(fact.contextID):
146
201
  continue
147
202
  factsByContextId[fact.contextID].append(fact)
148
203
 
@@ -347,7 +347,7 @@
347
347
  "name": "United Kingdom Multiple Targets",
348
348
  "authorityName": "FRC",
349
349
  "comment": "This is a deprecated authority that will be removed. Use UKFRC instead.",
350
- "reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-_FRC_Taxonomies_2024_On9jOuS.pdf",
350
+ "reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-_FRC_Taxonomies_2025.pdf",
351
351
  "reportPackageMaxMB": "150",
352
352
  "reportPackageMeasurement": "zipped",
353
353
  "ixTargetUsage": "allowed"
@@ -357,7 +357,7 @@
357
357
  "authorityName": "FRC",
358
358
  "comment": "Pertains to multi target UKSEF Guidance",
359
359
  "comment2": "See UKFRC-2022 for reports prior to 2023 which did not use separate targets for FRC and ESEF",
360
- "reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-_FRC_Taxonomies_2024_On9jOuS.pdf",
360
+ "reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-_FRC_Taxonomies_2025.pdf",
361
361
  "reportPackageMaxMB": "150",
362
362
  "reportPackageMeasurement": "zipped",
363
363
  "ixTargetUsage": "allowed"
@@ -14,6 +14,7 @@ from lxml.etree import _Comment, _ElementTree, _Entity, _ProcessingInstruction,
14
14
 
15
15
  from arelle import XbrlConst
16
16
  from arelle.FunctionIxt import ixtNamespaces
17
+ from arelle.LinkbaseType import LinkbaseType
17
18
  from arelle.ModelDocument import ModelDocument, Type as ModelDocumentType
18
19
  from arelle.ModelDtsObject import ModelConcept, ModelRelationship
19
20
  from arelle.ModelInstanceObject import ModelContext, ModelFact, ModelInlineFootnote, ModelUnit, ModelInlineFact
@@ -27,7 +28,6 @@ from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
27
28
  from arelle.XbrlConst import ixbrl11, xhtmlBaseIdentifier, xmlBaseIdentifier
28
29
  from arelle.XmlValidate import lexicalPatterns
29
30
  from arelle.XmlValidateConst import VALID
30
- from .LinkbaseType import LinkbaseType
31
31
 
32
32
  DEFAULT_MEMBER_ROLE_URI = 'https://www.nltaxonomie.nl/kvk/role/axis-defaults'
33
33
  XBRLI_IDENTIFIER_PATTERN = re.compile(r"^(?!00)\d{8}$")
@@ -11,6 +11,7 @@ from typing import Any, cast, TYPE_CHECKING
11
11
 
12
12
  from lxml.etree import Element
13
13
 
14
+ from arelle.LinkbaseType import LinkbaseType
14
15
  from arelle.ModelDtsObject import ModelConcept, ModelLink, ModelResource, ModelType
15
16
  from arelle.ModelInstanceObject import ModelInlineFact
16
17
  from arelle.ModelObject import ModelObject
@@ -31,7 +32,6 @@ from arelle.ValidateDuplicateFacts import getHashEquivalentFactGroups, getAspect
31
32
  from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
32
33
  from ..DisclosureSystems import (ALL_NL_INLINE_DISCLOSURE_SYSTEMS, NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
33
34
  NL_INLINE_GAAP_OTHER_DISCLOSURE_SYSTEMS)
34
- from ..LinkbaseType import LinkbaseType
35
35
  from ..PluginValidationDataExtension import (
36
36
  PluginValidationDataExtension,
37
37
  ALLOWABLE_LANGUAGES,
@@ -315,7 +315,7 @@ def rule_ros19(
315
315
 
316
316
  if (largest_equity_fact is not None and
317
317
  largest_turnover_fact is not None and
318
- convertToDecimal(largest_turnover_fact.xValue)) > (10 * abs(convertToDecimal(largest_equity_fact.xValue))):
318
+ convertToDecimal(largest_turnover_fact.xValue) > (10 * abs(convertToDecimal(largest_equity_fact.xValue)))):
319
319
  yield Validation.error(
320
320
  "ROS.19",
321
321
  _("Turnover / Revenue (DPLTurnoverRevenue) may exceed the maximum expected value. Please review the submission and, if correct, test your submission with Revenue Online's iXBRL test facility."),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.41
3
+ Version: 2.37.43
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License-Expression: Apache-2.0
@@ -32,6 +32,7 @@ arelle/HashUtil.py,sha256=dS11q9UUUFzP7MgiuNdxFfvF3IpeyZUiOFxVFArEEWE,2963
32
32
  arelle/HtmlUtil.py,sha256=eXa6yF5xBCOODCuBMY7g8ePZHPOSu6X0gDsW3z9N50A,761
33
33
  arelle/InstanceAspectsEvaluator.py,sha256=TePNIs_m0vCIbN5N4PXEyJm529T2WBFi2zmv-72r3Zk,1805
34
34
  arelle/LeiUtil.py,sha256=tSPrbQrXEeH5pXgGA_6MAdgMZp20NaW5izJglIXyEQk,5095
35
+ arelle/LinkbaseType.py,sha256=BwRQl4XZFFCopufC2FEMLhYENNTk2JUWVQvnIUsaqtI,3108
35
36
  arelle/LocalViewer.py,sha256=WVrfek_bLeFFxgWITi1EQb6xCQN8O9Ks-ZL16vRncSk,3080
36
37
  arelle/Locale.py,sha256=07IDxv8nIfvhyRRllFdEAKRI3yo1D2v781cTrjb_RoQ,33193
37
38
  arelle/ModelDocument.py,sha256=Sq6umEdn-aNHjxIpEsXTT7A4V25nGY0JiylSnhr9zSI,130749
@@ -123,7 +124,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
123
124
  arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
124
125
  arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
125
126
  arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
- arelle/_version.py,sha256=U62S37dJhYrPn2KWdnBMMwXbtf-OhmJZIBOKZhfOI58,515
127
+ arelle/_version.py,sha256=_yeUbYff5hFRJ7TaTKvPkSogzmTAov8fO5hCxibhlH4,515
127
128
  arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
128
129
  arelle/api/Session.py,sha256=27HVuK3Bz1_21l4_RLn1IQg6v0MNsUEYrHajymyWwxI,7429
129
130
  arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
@@ -396,13 +397,14 @@ arelle/plugin/validate/EDINET/Constants.py,sha256=QG69rWdpIrpQzZQkRcDWk2i3rlBVoh
396
397
  arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
397
398
  arelle/plugin/validate/EDINET/FormType.py,sha256=pJfKjdjqFcRLFgH6xbEixvpwatZBBHI8uI3xjjhaPI0,3175
398
399
  arelle/plugin/validate/EDINET/Manifest.py,sha256=VWenzA1ndOp802zpTELSLREbCrzrA-nM1UCRpRf1Q3M,4849
399
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=8w0C-H4hskBN9rho0M6wGgQfkTZMgM3aot6L0sYLVwc,7084
400
+ arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=3bGTdUI0bddAAQq4Du1sKyQobJlfCc3ZVCRSA2lfAsk,8758
400
401
  arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SEh573M3IzdouRdEuNIBkdumieZi8r0,959
401
- arelle/plugin/validate/EDINET/__init__.py,sha256=ew9Rc2qJe5d3XvOOFzhX6MfzxNUtxIYfxRGX-wkfR1c,3555
402
+ arelle/plugin/validate/EDINET/__init__.py,sha256=K3vsgWeLw8BBj5MJ_CUzHgSZQ6jg26VzL2Adr-mTkhc,3583
402
403
  arelle/plugin/validate/EDINET/resources/config.xml,sha256=7uT4GcRgk5veMLpFhPPQJxbGKiQvM52P8EMrjn0qd0g,646
403
404
  arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=997I3RGTLg5OY3vn5hQxVFAAxOmDSOYpuyQe6VnWSY0,16285
404
405
  arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
405
- arelle/plugin/validate/EDINET/rules/edinet.py,sha256=_qrGBV667MfExFpeIygrfWbBuLFw2zrMZGNyzQNRjqA,6826
406
+ arelle/plugin/validate/EDINET/rules/contexts.py,sha256=feNqSFhfOxPeV0jpSdmwULtY-__eimHtclVKtCyrLZg,7715
407
+ arelle/plugin/validate/EDINET/rules/edinet.py,sha256=yl5kRFAsc9BKYw5TW05ghDOl2ubJROUnTIKfEQ-o1W0,9192
406
408
  arelle/plugin/validate/EDINET/rules/frta.py,sha256=N0YglHYZuLD2IuwE26viR2ViwUYjneBuMFU9vlrS0aQ,7616
407
409
  arelle/plugin/validate/EDINET/rules/gfm.py,sha256=4EKMho6eX-Ygl8yMBVabHQpbC-wxMvi067ubN9mp27U,21982
408
410
  arelle/plugin/validate/EDINET/rules/upload.py,sha256=HZ-9Gk6WtIichTGcSsSGIrMXNgsgJYQYwfUKeLs1XWU,20369
@@ -417,14 +419,13 @@ arelle/plugin/validate/ESEF/ESEF_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
417
419
  arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=epp-PBh1NJzQqgxUE6C468HmoDc2w3j54rMwfiOAry4,29334
418
420
  arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=J9hJcLlE6FA84Ppgthiu4ju0KHJ-JdmVub2qKAKm3as,74985
419
421
  arelle/plugin/validate/ESEF/ESEF_Current/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
420
- arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=bR0ZMpiQL9LqiyzrjhAGMDLEHBHimsDuDu9SQY5xofA,15503
422
+ arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=_Xnqaj0pdw2QM3LhOguBHnEqbo1eutm643_SO18UJls,15487
421
423
  arelle/plugin/validate/ESEF/resources/config.xml,sha256=t3STU_-QYM7Ay8YwZRPapnohiWVWhjfr4L2Rjx9xN9U,3902
422
424
  arelle/plugin/validate/FERC/__init__.py,sha256=rC1OYNBWnoXowEohiR9yagHtAi_NPAlmaahRSQhSdS4,11325
423
425
  arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmnIUQZyerjo,1919
424
426
  arelle/plugin/validate/FERC/resources/ferc-utr.xml,sha256=OCRj9IUpdXATCBXKbB71apYx9kxcNtZW-Hq4s-avsRY,2663
425
427
  arelle/plugin/validate/NL/DisclosureSystems.py,sha256=urRmYJ8RnGPlTgSVKW7zGN4_4CtL3OVKlcI3LwTpBz4,561
426
- arelle/plugin/validate/NL/LinkbaseType.py,sha256=BwRQl4XZFFCopufC2FEMLhYENNTk2JUWVQvnIUsaqtI,3108
427
- arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=4yO0UlShSFk_iWxLbCZ9SHB1wuJQMcKcDGmVkHcltIY,33672
428
+ arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=OswvJzy5AdvIDw1N_IeWDehKbUHdOFnipy0qhjAaImw,33678
428
429
  arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=h6CjGJJkE8YqrzPiA8uNaCzn_P6HspH-6ja89tLCXxY,17978
429
430
  arelle/plugin/validate/NL/__init__.py,sha256=W-SHohiAWM7Yi77gAbt-D3vvZNAB5s1j16mHCTFta6w,3158
430
431
  arelle/plugin/validate/NL/resources/config.xml,sha256=qBE6zywFSmemBSWonuTII5iuOCUlNb1nvkpMbsZb5PM,1853
@@ -433,7 +434,7 @@ arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9Cz
433
434
  arelle/plugin/validate/NL/rules/fg_nl.py,sha256=OJF2EYx4KDTdNggHiw5Trq5S5g7WGpbb7YvO6_IrrGU,10704
434
435
  arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=kYqXt45S6eM32Yg9ii7pUhOMfJaHurgYqQ73FyQALs8,8171
435
436
  arelle/plugin/validate/NL/rules/fr_nl.py,sha256=vwzk6_P6jhszpeboTM09uOHtm-Lijzz7Iqu7NsYKyaE,31444
436
- arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=KE2bOX1eQWxW1cVzMGR-HLgJ36zUq77D9DpA9-GvwNk,90165
437
+ arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=bPD5lfr6dxdVGPZ2D_bEZtbz02tzsX_BZ5kC-CZJNwc,90170
437
438
  arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
438
439
  arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
439
440
  arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=HrLoJWHMFjou3j7ro6Ajrcab1JOgi505ZFPEM5a3QOY,776
@@ -441,7 +442,7 @@ arelle/plugin/validate/ROS/__init__.py,sha256=KuWg1MHVzA2S6eaHFptvP3Vu_5gQWf3OUY
441
442
  arelle/plugin/validate/ROS/config.xml,sha256=ZCpCFgr1ZAjoUuhb1eRpDnmKrae-sXA9yl6SOWnrfm8,654
442
443
  arelle/plugin/validate/ROS/resources/config.xml,sha256=HXWume5HlrAqOx5AtiWWqgADbRatA8YSfm_JvZGwdgQ,657
443
444
  arelle/plugin/validate/ROS/rules/__init__.py,sha256=wW7BUAIb7sRkOxC1Amc_ZKrz03FM-Qh1TyZe6wxYaAU,1567
444
- arelle/plugin/validate/ROS/rules/ros.py,sha256=EcPY2tQTFICNtTSR_95pdFoBRg0K7yGLlZNVYoHGpn4,19870
445
+ arelle/plugin/validate/ROS/rules/ros.py,sha256=Dk5BkfKQYItImdx5FcFvkMWT5BlJ1r_L7Vn-EsCG85A,19870
445
446
  arelle/plugin/validate/UK/ValidateUK.py,sha256=0UhSwsY1lrY-EAEBJJR9QY38YXGBZ6PEgmuC5gQfBlI,57813
446
447
  arelle/plugin/validate/UK/__init__.py,sha256=KE6s_B-EvrHDCtWQz2N_wQwyx_ZbWhYNV2GfQnluxMw,30655
447
448
  arelle/plugin/validate/UK/config.xml,sha256=mUFhWDfBzGTn7v0ZSmf4HaweQTMJh_4ZcJmD9mzCHrA,1547
@@ -759,9 +760,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
759
760
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
760
761
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
761
762
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
762
- arelle_release-2.37.41.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
763
- arelle_release-2.37.41.dist-info/METADATA,sha256=35ud-2G1jCFZ1rgVkMj7AQIZ8CcLkQ5z4mNH49402-E,9137
764
- arelle_release-2.37.41.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
765
- arelle_release-2.37.41.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
766
- arelle_release-2.37.41.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
767
- arelle_release-2.37.41.dist-info/RECORD,,
763
+ arelle_release-2.37.43.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
764
+ arelle_release-2.37.43.dist-info/METADATA,sha256=j1T8fS8zCMEJTSh6kRSHFfV5XRPqmNEPKsbOGVj6qoY,9137
765
+ arelle_release-2.37.43.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
766
+ arelle_release-2.37.43.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
767
+ arelle_release-2.37.43.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
768
+ arelle_release-2.37.43.dist-info/RECORD,,