arelle-release 2.37.42__py3-none-any.whl → 2.37.44__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.42'
21
- __version_tuple__ = version_tuple = (2, 37, 42)
20
+ __version__ = version = '2.37.44'
21
+ __version_tuple__ = version_tuple = (2, 37, 44)
@@ -1,8 +1,20 @@
1
1
  """
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
+ from enum import Enum
5
+
4
6
  from arelle.ModelValue import qname
5
7
 
8
+ class DeiFormType(Enum):
9
+ FORM_2_4 = '第二号の四様式'
10
+ FORM_2_7 = '第二号の七様式'
11
+ FORM_3 = '第三号様式'
12
+
13
+ CORPORATE_FORMS =frozenset([
14
+ DeiFormType.FORM_2_4,
15
+ DeiFormType.FORM_2_7,
16
+ DeiFormType.FORM_3,
17
+ ])
6
18
  qnEdinetManifestInsert = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}insert")
7
19
  qnEdinetManifestInstance = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}instance")
8
20
  qnEdinetManifestItem = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}item")
@@ -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,9 +19,11 @@ 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
26
+ from .Constants import CORPORATE_FORMS
23
27
 
24
28
  _: TypeGetText
25
29
 
@@ -35,20 +39,48 @@ class UploadContents:
35
39
  @dataclass
36
40
  class PluginValidationDataExtension(PluginData):
37
41
  assetsIfrsQn: QName
42
+ documentTypeDeiQn: QName
43
+ jpcrpEsrFilingDateCoverPageQn: QName
44
+ jpcrpFilingDateCoverPageQn: QName
45
+ jpspsFilingDateCoverPageQn: QName
38
46
  liabilitiesAndEquityIfrsQn: QName
47
+ nonConsolidatedMemberQn: QName
48
+ ratioOfFemaleDirectorsAndOtherOfficersQn: QName
49
+
50
+ contextIdPattern: regex.Pattern[str]
39
51
 
40
52
  _primaryModelXbrl: ModelXbrl | None = None
41
53
 
42
54
  def __init__(self, name: str):
43
55
  super().__init__(name)
56
+ jpcrpEsrNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/jpcrp-esr_cor"
57
+ jpcrpNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/jpcrp_cor'
58
+ jpdeiNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor'
44
59
  jpigpNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_cor"
60
+ jppfsNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_cor"
61
+ jpspsNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_cor'
45
62
  self.assetsIfrsQn = qname(jpigpNamespace, 'AssetsIFRS')
63
+ self.documentTypeDeiQn = qname(jpdeiNamespace, 'DocumentTypeDEI')
64
+ self.jpcrpEsrFilingDateCoverPageQn = qname(jpcrpEsrNamespace, 'FilingDateCoverPage')
65
+ self.jpcrpFilingDateCoverPageQn = qname(jpcrpNamespace, 'FilingDateCoverPage')
66
+ self.jpspsFilingDateCoverPageQn = qname(jpspsNamespace, 'FilingDateCoverPage')
46
67
  self.liabilitiesAndEquityIfrsQn = qname(jpigpNamespace, "LiabilitiesAndEquityIFRS")
68
+ self.nonConsolidatedMemberQn = qname(jppfsNamespace, "NonConsolidatedMember")
69
+ self.ratioOfFemaleDirectorsAndOtherOfficersQn = qname(jpcrpNamespace, "RatioOfFemaleDirectorsAndOtherOfficers")
70
+
71
+ self.contextIdPattern = regex.compile(r'(Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Interim)(Duration|Instant)')
47
72
 
48
73
  # Identity hash for caching.
49
74
  def __hash__(self) -> int:
50
75
  return id(self)
51
76
 
77
+ @lru_cache(1)
78
+ def isCorporateForm(self, modelXbrl: ModelXbrl) -> bool:
79
+ documentTypes = self.getDocumentTypes(modelXbrl)
80
+ if any(documentType == form.value for form in CORPORATE_FORMS for documentType in documentTypes):
81
+ return True
82
+ return False
83
+
52
84
  @lru_cache(1)
53
85
  def shouldValidateUpload(self, val: ValidateXbrl) -> bool:
54
86
  """
@@ -79,6 +111,15 @@ class PluginValidationDataExtension(PluginData):
79
111
  def getDeduplicatedFacts(self, modelXbrl: ModelXbrl) -> list[ModelFact]:
80
112
  return getDeduplicatedFacts(modelXbrl, DeduplicationType.CONSISTENT_PAIRS)
81
113
 
114
+ @lru_cache(1)
115
+ def getDocumentTypes(self, modelXbrl: ModelXbrl) -> set[str]:
116
+ documentFacts = modelXbrl.factsByQname.get(self.documentTypeDeiQn, set())
117
+ documentTypes = set()
118
+ for fact in documentFacts:
119
+ if fact.xValid >= VALID:
120
+ documentTypes.add(fact.textValue)
121
+ return documentTypes
122
+
82
123
  @lru_cache(1)
83
124
  def getFootnoteLinkElements(self, modelXbrl: ModelXbrl) -> list[ModelObject | LinkPrototype]:
84
125
  # TODO: Consolidate with similar implementations in EDGAR and FERC
@@ -163,6 +204,10 @@ class PluginValidationDataExtension(PluginData):
163
204
  paths.update(path.parents)
164
205
  return sorted(paths)
165
206
 
207
+ def hasValidNonNilFact(self, modelXbrl: ModelXbrl, qname: QName) -> bool:
208
+ requiredFacts = modelXbrl.factsByQname.get(qname, set())
209
+ return any(fact.xValid >= VALID and not fact.isNil for fact in requiredFacts)
210
+
166
211
  @lru_cache(1)
167
212
  def isUpload(self, modelXbrl: ModelXbrl) -> bool:
168
213
  if not modelXbrl.fileSource.fs or \
@@ -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,9 +7,8 @@ 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
10
  from arelle import XbrlConst, ValidateDuplicateFacts
11
+ from arelle.LinkbaseType import LinkbaseType
13
12
  from arelle.ValidateDuplicateFacts import DuplicateType
14
13
  from arelle.ValidateXbrl import ValidateXbrl
15
14
  from arelle.typing import TypeGetText
@@ -22,6 +21,32 @@ from ..PluginValidationDataExtension import PluginValidationDataExtension
22
21
  _: TypeGetText
23
22
 
24
23
 
24
+ @validation(
25
+ hook=ValidationHook.XBRL_FINALLY,
26
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
27
+ )
28
+ def rule_EC1057E(
29
+ pluginData: PluginValidationDataExtension,
30
+ val: ValidateXbrl,
31
+ *args: Any,
32
+ **kwargs: Any,
33
+ ) -> Iterable[Validation]:
34
+ """
35
+ EDINET.EC1057E: The submission date on the cover page has not been filled in.
36
+ Ensure that there is a nonnil value disclosed for FilingDateCoverPage
37
+ Note: This rule is only applicable to the public documents.
38
+ """
39
+ dei = pluginData.getDocumentTypes(val.modelXbrl)
40
+ if len(dei) > 0:
41
+ if not (pluginData.hasValidNonNilFact(val.modelXbrl, pluginData.jpcrpEsrFilingDateCoverPageQn)
42
+ or pluginData.hasValidNonNilFact(val.modelXbrl, pluginData.jpcrpFilingDateCoverPageQn)
43
+ or pluginData.hasValidNonNilFact(val.modelXbrl, pluginData.jpspsFilingDateCoverPageQn)):
44
+ yield Validation.error(
45
+ codes='EDINET.EC1057E',
46
+ msg=_("The [Submission Date] on the cover page has not been filled in."),
47
+ )
48
+
49
+
25
50
  @validation(
26
51
  hook=ValidationHook.XBRL_FINALLY,
27
52
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -43,7 +68,7 @@ def rule_EC5002E(
43
68
  errorFacts = []
44
69
  for fact in val.modelXbrl.facts:
45
70
  concept = fact.concept
46
- if not concept.isShares:
71
+ if concept is None or not concept.isShares:
47
72
  continue
48
73
  unit = fact.unit
49
74
  measures = unit.measures
@@ -104,58 +129,50 @@ def rule_EC8024E(
104
129
  hook=ValidationHook.XBRL_FINALLY,
105
130
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
106
131
  )
107
- def rule_EC8033W(
132
+ def rule_EC8027W(
108
133
  pluginData: PluginValidationDataExtension,
109
134
  val: ValidateXbrl,
110
135
  *args: Any,
111
136
  **kwargs: Any,
112
137
  ) -> Iterable[Validation]:
113
138
  """
114
- EDINET.EC8033W: The startDate of a context whose context ID starts with
115
- "CurrentYear" is not set to a date earlier than the endDate of a context
116
- whose context ID starts with "Prior1Year".
139
+ EDINET.EC8027W: For presentation links and definition links, there must be
140
+ only one root element.
141
+ File name: xxx <Extended link role = yyy>
142
+ Please correct the extended link role of the relevant file. Please set only one
143
+ root element of the extended link role in the presentation link and definition link.
117
144
  """
118
- priorYearContexts = [
119
- context
120
- for contextId, context in val.modelXbrl.contexts.items()
121
- if contextId.startswith('Prior1Year')
122
- and context.endDatetime is not None
123
- and context.isStartEndPeriod
145
+ linkbaseTypes = (LinkbaseType.PRESENTATION, LinkbaseType.DEFINITION)
146
+ roleTypes = [
147
+ roleType
148
+ for roleTypes in val.modelXbrl.roleTypes.values()
149
+ for roleType in roleTypes
124
150
  ]
125
- latestPriorYearContext = None
126
- for priorYearContext in priorYearContexts:
127
- if latestPriorYearContext is None or \
128
- priorYearContext.endDatetime > latestPriorYearContext.endDatetime:
129
- latestPriorYearContext = priorYearContext
130
- if latestPriorYearContext is None:
131
- return
132
- currentYearContexts = [
133
- context
134
- for contextId, context in val.modelXbrl.contexts.items()
135
- if contextId.startswith('CurrentYear')
136
- and context.startDatetime is not None
137
- and context.isStartEndPeriod
138
- ]
139
- earliestCurrentYearContext = None
140
- for currentYearContext in currentYearContexts:
141
- if earliestCurrentYearContext is None or \
142
- currentYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
143
- earliestCurrentYearContext = currentYearContext
144
- if earliestCurrentYearContext is None:
145
- return
146
- if latestPriorYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
147
- yield Validation.warning(
148
- codes='EDINET.EC8033W',
149
- msg=_("The startDate element of the current year context (id=%(currentYearContextId)s) is "
150
- "set to a date that is earlier than the endDate element of the prior year context "
151
- "(id=%(priorYearContextId)s). Please check the corresponding context ID "
152
- "%(currentYearContextId)s and %(priorYearContextId)s. Set the startDate element of "
153
- "context ID %(currentYearContextId)s to a date that is later than or equal to the "
154
- "endDate element of context ID %(priorYearContextId)s."),
155
- currentYearContextId=earliestCurrentYearContext.id,
156
- priorYearContextId=latestPriorYearContext.id,
157
- modelObject=priorYearContexts + currentYearContexts,
158
- )
151
+ for roleType in roleTypes:
152
+ for linkbaseType in linkbaseTypes:
153
+ if linkbaseType.getLinkQn() not in roleType.usedOns:
154
+ continue
155
+ arcroles = linkbaseType.getArcroles()
156
+ relSet = val.modelXbrl.relationshipSet(tuple(arcroles), roleType.roleURI)
157
+ relSetFrom = relSet.loadModelRelationshipsFrom()
158
+ rootConcepts = relSet.rootConcepts
159
+ if len(rootConcepts) < 2:
160
+ continue
161
+ rels = [
162
+ rel
163
+ for rootConcept in rootConcepts
164
+ for rel in relSetFrom[rootConcept]
165
+ ]
166
+ yield Validation.warning(
167
+ codes='EDINET.EC8027W',
168
+ msg=_("For presentation links and definition links, there must be only one root element. "
169
+ "File name: %(filename)s <Extended link role = %(roleUri)s> "
170
+ "Please correct the extended link role of the relevant file. Please set only one "
171
+ "root element of the extended link role in the presentation link and definition link."),
172
+ filename=rels[0].modelDocument.basename,
173
+ roleUri=roleType.roleURI,
174
+ modelObject=rels,
175
+ )
159
176
 
160
177
 
161
178
  @validation(
@@ -172,13 +189,12 @@ def rule_EC8062W(
172
189
  EDINET.EC8062W: The sum of all liabilities and equity must equal the sum of all assets.
173
190
  """
174
191
  deduplicatedFacts = pluginData.getDeduplicatedFacts(val.modelXbrl)
175
- contextIdPattern = regex.compile(r'^(Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Interim)(Duration|Instant)$')
176
192
 
177
193
  factsByContextId = defaultdict(list)
178
194
  for fact in deduplicatedFacts:
179
195
  if fact.qname not in (pluginData.assetsIfrsQn, pluginData.liabilitiesAndEquityIfrsQn):
180
196
  continue
181
- if fact.contextID is None or not contextIdPattern.match(fact.contextID):
197
+ if fact.contextID is None or not pluginData.contextIdPattern.fullmatch(fact.contextID):
182
198
  continue
183
199
  factsByContextId[fact.contextID].append(fact)
184
200
 
@@ -205,3 +221,25 @@ def rule_EC8062W(
205
221
  assetSum=f"{assetSum:,}",
206
222
  modelObject=facts,
207
223
  )
224
+
225
+
226
+ @validation(
227
+ hook=ValidationHook.XBRL_FINALLY,
228
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
229
+ )
230
+ def rule_EC8075W(
231
+ pluginData: PluginValidationDataExtension,
232
+ val: ValidateXbrl,
233
+ *args: Any,
234
+ **kwargs: Any,
235
+ ) -> Iterable[Validation]:
236
+ """
237
+ EDINET.EC8075W: The percentage of female executives has not been tagged in detail. Ensure that there is
238
+ a nonnil value disclosed for jpcrp_cor:RatioOfFemaleDirectorsAndOtherOfficers.
239
+ """
240
+ if pluginData.isCorporateForm(val.modelXbrl):
241
+ if not pluginData.hasValidNonNilFact(val.modelXbrl, pluginData.ratioOfFemaleDirectorsAndOtherOfficersQn):
242
+ yield Validation.warning(
243
+ codes='EDINET.EC8075W',
244
+ msg=_("The percentage of female executives has not been tagged in detail."),
245
+ )
@@ -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,
@@ -13,12 +13,18 @@ TAXONOMY_REFERENCES = [
13
13
  "https://xbrl.frc.org.uk/ireland/FRS-101/2019-01-01/ie-FRS-101-2019-01-01.xsd",
14
14
  "https://xbrl.frc.org.uk/ireland/FRS-101/2022-01-01/ie-FRS-101-2022-01-01.xsd",
15
15
  "https://xbrl.frc.org.uk/ireland/FRS-101/2023-01-01/ie-FRS-101-2023-01-01.xsd",
16
+ "https://xbrl.frc.org.uk/ireland/FRS-101/2025-01-01/ie-FRS-101-2025-01-01.xsd",
17
+
16
18
  "https://xbrl.frc.org.uk/ireland/FRS-102/2019-01-01/ie-FRS-102-2019-01-01.xsd",
17
19
  "https://xbrl.frc.org.uk/ireland/FRS-102/2022-01-01/ie-FRS-102-2022-01-01.xsd",
18
20
  "https://xbrl.frc.org.uk/ireland/FRS-102/2023-01-01/ie-FRS-102-2023-01-01.xsd",
21
+ "https://xbrl.frc.org.uk/ireland/FRS-102/2025-01-01/ie-FRS-102-2025-01-01.xsd",
22
+
19
23
  "https://xbrl.frc.org.uk/ireland/IFRS/2019-01-01/ie-IFRS-2019-01-01.xsd",
20
24
  "https://xbrl.frc.org.uk/ireland/IFRS/2022-01-01/ie-IFRS-2022-01-01.xsd",
21
25
  "https://xbrl.frc.org.uk/ireland/IFRS/2023-01-01/ie-IFRS-2023-01-01.xsd",
26
+ "https://xbrl.frc.org.uk/ireland/IFRS/2025-01-01/ie-IFRS-2025-01-01.xsd",
27
+
22
28
  "https://raw.githubusercontent.com/revenue-ie/dpl/master/schemas/ct/combined/2017-09-01/IE-FRS-101-IE-DPL-2017-09-01.xsd",
23
29
  "https://raw.githubusercontent.com/revenue-ie/dpl/master/schemas/ct/combined/2017-09-01/IE-FRS-102-IE-DPL-2017-09-01.xsd",
24
30
  "https://raw.githubusercontent.com/revenue-ie/dpl/master/schemas/ct/combined/2017-09-01/IE-EU-IFRS-IE-DPL-2017-09-01.xsd",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.42
3
+ Version: 2.37.44
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=ksGS-4a5qZTGFbhhxaUO_PlhVGdAJc3Vdh01X5jVPGA,515
127
+ arelle/_version.py,sha256=mKPFgUQyLBnC_IacXBGYCi1A9bK9yXHMOniKMbX2WAw,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
@@ -392,17 +393,18 @@ arelle/plugin/validate/DBA/rules/tm.py,sha256=ui9oKBqlAForwkQ9kk9KBiUogTJE5pv1Rb
392
393
  arelle/plugin/validate/DBA/rules/tr.py,sha256=4TootFjl0HXsKZk1XNBCyj-vnjRs4lg35hfiz_b_4wU,14684
393
394
  arelle/plugin/validate/EBA/__init__.py,sha256=x3zXNcdSDJ3kHfL7kMs0Ve0Vs9oWbzNFVf1TK4Avmy8,45924
394
395
  arelle/plugin/validate/EBA/config.xml,sha256=37wMVUAObK-XEqakqD8zPNog20emYt4a_yfL1AKubF8,2022
395
- arelle/plugin/validate/EDINET/Constants.py,sha256=QG69rWdpIrpQzZQkRcDWk2i3rlBVohr4VtSdW-IS5_w,734
396
+ arelle/plugin/validate/EDINET/Constants.py,sha256=_mwJxiGw4uE3krc5DF8Lg9zWe6D1PsnGImekDpBdpH4,1000
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=qh8JaR0268E_ULNm5CeLrSYUuurvXD6XcoQQNNkM81E,9487
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=DTSQY1iEeJ6TTgLFRwi99Pxu8hUdZd51M398RILhf8c,8494
406
+ arelle/plugin/validate/EDINET/rules/contexts.py,sha256=feNqSFhfOxPeV0jpSdmwULtY-__eimHtclVKtCyrLZg,7715
407
+ arelle/plugin/validate/EDINET/rules/edinet.py,sha256=7nCqPlpzj2hOU09h0SYjmWbvUgMJmjHTNPwGyJssWm0,9837
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,9 +434,9 @@ 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
- arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
439
+ arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=nCZoGWNX4aUN5oQBJqa8UrG9tElPW906xkfzRlbjBB8,4285
439
440
  arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=HrLoJWHMFjou3j7ro6Ajrcab1JOgi505ZFPEM5a3QOY,776
440
441
  arelle/plugin/validate/ROS/__init__.py,sha256=KuWg1MHVzA2S6eaHFptvP3Vu_5gQWf3OUYC97clB7zI,2075
441
442
  arelle/plugin/validate/ROS/config.xml,sha256=ZCpCFgr1ZAjoUuhb1eRpDnmKrae-sXA9yl6SOWnrfm8,654
@@ -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.42.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
763
- arelle_release-2.37.42.dist-info/METADATA,sha256=y-aLY_rzUkLN5s8wSNwDLgALr5YnSDDGAqVHrP1lRnI,9137
764
- arelle_release-2.37.42.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
765
- arelle_release-2.37.42.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
766
- arelle_release-2.37.42.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
767
- arelle_release-2.37.42.dist-info/RECORD,,
763
+ arelle_release-2.37.44.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
764
+ arelle_release-2.37.44.dist-info/METADATA,sha256=-tNggDJbddiKoT1AxjIRIH7S1PVl1ETPhTLD-zjw2Fc,9137
765
+ arelle_release-2.37.44.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
766
+ arelle_release-2.37.44.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
767
+ arelle_release-2.37.44.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
768
+ arelle_release-2.37.44.dist-info/RECORD,,