arelle-release 2.37.46__py3-none-any.whl → 2.38.0__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.
Files changed (204) hide show
  1. arelle/BetaFeatures.py +0 -21
  2. arelle/Cntlr.py +15 -8
  3. arelle/CntlrCmdLine.py +121 -56
  4. arelle/CntlrWinMain.py +143 -70
  5. arelle/DialogFind.py +1 -1
  6. arelle/DialogPluginManager.py +6 -4
  7. arelle/DisclosureSystem.py +7 -0
  8. arelle/ErrorManager.py +21 -6
  9. arelle/FileSource.py +11 -4
  10. arelle/FunctionIxt.py +16 -11
  11. arelle/HtmlUtil.py +5 -4
  12. arelle/LeiUtil.py +63 -43
  13. arelle/ModelDocument.py +20 -15
  14. arelle/ModelDtsObject.py +8 -0
  15. arelle/ModelInstanceObject.py +1 -1
  16. arelle/ModelObject.py +16 -18
  17. arelle/ModelObjectFactory.py +35 -17
  18. arelle/ModelXbrl.py +28 -11
  19. arelle/PluginManager.py +130 -105
  20. arelle/RuntimeOptions.py +1 -0
  21. arelle/UrlUtil.py +14 -0
  22. arelle/Validate.py +17 -12
  23. arelle/ValidateDuplicateFacts.py +3 -1
  24. arelle/ValidateFileSource.py +38 -0
  25. arelle/ValidateFilingText.py +3 -3
  26. arelle/ValidateXbrl.py +5 -2
  27. arelle/ValidateXbrlCalcs.py +210 -186
  28. arelle/ValidateXbrlDTS.py +1 -1
  29. arelle/ViewFile.py +1 -0
  30. arelle/ViewFileFactTable.py +2 -2
  31. arelle/ViewWinDTS.py +4 -1
  32. arelle/WebCache.py +28 -24
  33. arelle/XbrlConst.py +22 -0
  34. arelle/XmlUtil.py +16 -21
  35. arelle/XmlValidate.py +6 -9
  36. arelle/_version.py +16 -3
  37. arelle/api/Session.py +11 -2
  38. arelle/config/disclosuresystems.xsd +2 -0
  39. arelle/config/rosettaEntitlements.plist +8 -0
  40. arelle/conformance/CSVTestcaseLoader.py +1 -1
  41. arelle/formula/XPathContext.py +3 -3
  42. arelle/logging/formatters/LogFormatter.py +3 -1
  43. arelle/packages/report/ReportPackage.py +26 -13
  44. arelle/packages/report/ReportPackageConst.py +0 -1
  45. arelle/plugin/inlineXbrlDocumentSet.py +19 -5
  46. arelle/plugin/validate/DBA/DisclosureSystems.py +19 -1
  47. arelle/plugin/validate/DBA/PluginValidationDataExtension.py +2 -4
  48. arelle/plugin/validate/DBA/ValidationPluginExtension.py +2 -1
  49. arelle/plugin/validate/DBA/resources/config.xml +5 -0
  50. arelle/plugin/validate/DBA/rules/__init__.py +2 -2
  51. arelle/plugin/validate/DBA/rules/fr.py +19 -2
  52. arelle/plugin/validate/DBA/rules/tc.py +2 -0
  53. arelle/plugin/validate/DBA/rules/th.py +6 -0
  54. arelle/plugin/validate/DBA/rules/tm.py +18 -5
  55. arelle/plugin/validate/DBA/rules/tr.py +11 -5
  56. arelle/plugin/validate/EDINET/Constants.py +193 -9
  57. arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
  58. arelle/plugin/validate/EDINET/ControllerPluginData.py +220 -1
  59. arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
  60. arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
  61. arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
  62. arelle/plugin/validate/EDINET/FormType.py +134 -0
  63. arelle/plugin/validate/EDINET/ManifestInstance.py +72 -5
  64. arelle/plugin/validate/EDINET/NamespaceConfig.py +50 -0
  65. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +493 -132
  66. arelle/plugin/validate/EDINET/{InstanceType.py → ReportFolderType.py} +72 -15
  67. arelle/plugin/validate/EDINET/Statement.py +139 -0
  68. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +595 -0
  69. arelle/plugin/validate/EDINET/UploadContents.py +48 -0
  70. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +20 -2
  71. arelle/plugin/validate/EDINET/__init__.py +31 -6
  72. arelle/plugin/validate/EDINET/resources/config.xml +8 -1
  73. arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
  74. arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
  75. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +2 -0
  76. arelle/plugin/validate/EDINET/rules/contexts.py +375 -14
  77. arelle/plugin/validate/EDINET/rules/edinet.py +1934 -45
  78. arelle/plugin/validate/EDINET/rules/frta.py +122 -3
  79. arelle/plugin/validate/EDINET/rules/gfm.py +1907 -11
  80. arelle/plugin/validate/EDINET/rules/upload.py +989 -141
  81. arelle/plugin/validate/ESEF/Const.py +3 -1
  82. arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +5 -0
  83. arelle/plugin/validate/ESEF/ESEF_2021/Image.py +2 -2
  84. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +23 -20
  85. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +47 -14
  86. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +100 -25
  87. arelle/plugin/validate/ESEF/__init__.py +20 -6
  88. arelle/plugin/validate/ESEF/resources/authority-validations.json +76 -9
  89. arelle/plugin/validate/ESEF/resources/config.xml +20 -0
  90. arelle/plugin/validate/NL/DisclosureSystems.py +22 -0
  91. arelle/plugin/validate/NL/PluginValidationDataExtension.py +27 -9
  92. arelle/plugin/validate/NL/ValidationPluginExtension.py +51 -7
  93. arelle/plugin/validate/NL/resources/config.xml +18 -0
  94. arelle/plugin/validate/NL/rules/br_kvk.py +17 -61
  95. arelle/plugin/validate/NL/rules/fg_nl.py +7 -38
  96. arelle/plugin/validate/NL/rules/fr_kvk.py +7 -42
  97. arelle/plugin/validate/NL/rules/fr_nl.py +31 -147
  98. arelle/plugin/validate/NL/rules/nl_kvk.py +142 -28
  99. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +2 -0
  100. arelle/plugin/validate/ROS/ValidationPluginExtension.py +4 -1
  101. arelle/plugin/validate/ROS/rules/ros.py +41 -9
  102. arelle/plugin/validate/UK/ValidateUK.py +130 -66
  103. arelle/plugin/validate/UK/__init__.py +89 -103
  104. arelle/utils/EntryPointDetection.py +79 -13
  105. arelle/utils/PluginHooks.py +125 -0
  106. arelle/utils/validate/ESEFImage.py +6 -6
  107. arelle/utils/validate/Validation.py +18 -0
  108. arelle/utils/validate/ValidationPlugin.py +76 -11
  109. arelle/utils/validate/ValidationUtil.py +35 -3
  110. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/METADATA +30 -20
  111. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/RECORD +115 -191
  112. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/licenses/LICENSE.md +0 -3
  113. arelle/archive/CustomLogger.py +0 -43
  114. arelle/archive/LoadEFMvalidate.py +0 -32
  115. arelle/archive/LoadSavePreLbCsv.py +0 -26
  116. arelle/archive/LoadValidate.cs +0 -31
  117. arelle/archive/LoadValidate.py +0 -36
  118. arelle/archive/LoadValidateCmdLine.java +0 -69
  119. arelle/archive/LoadValidatePostedZip.java +0 -57
  120. arelle/archive/LoadValidateWebService.java +0 -34
  121. arelle/archive/SaveTableToExelle.py +0 -140
  122. arelle/archive/TR3toTR4.py +0 -88
  123. arelle/archive/plugin/ESEF_2022/__init__.py +0 -47
  124. arelle/archive/plugin/bigInstance.py +0 -394
  125. arelle/archive/plugin/cmdWebServerExtension.py +0 -43
  126. arelle/archive/plugin/crashTest.py +0 -38
  127. arelle/archive/plugin/functionsXmlCreation.py +0 -106
  128. arelle/archive/plugin/hello_i18n.pot +0 -26
  129. arelle/archive/plugin/hello_i18n.py +0 -32
  130. arelle/archive/plugin/importTestChild1.py +0 -21
  131. arelle/archive/plugin/importTestChild2.py +0 -22
  132. arelle/archive/plugin/importTestGrandchild1.py +0 -21
  133. arelle/archive/plugin/importTestGrandchild2.py +0 -21
  134. arelle/archive/plugin/importTestImported1.py +0 -23
  135. arelle/archive/plugin/importTestImported11.py +0 -22
  136. arelle/archive/plugin/importTestParent.py +0 -48
  137. arelle/archive/plugin/instanceInfo.py +0 -306
  138. arelle/archive/plugin/loadFromOIM-2018.py +0 -1282
  139. arelle/archive/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  140. arelle/archive/plugin/objectmaker.py +0 -285
  141. arelle/archive/plugin/packagedImportTest/__init__.py +0 -47
  142. arelle/archive/plugin/packagedImportTest/importTestChild1.py +0 -21
  143. arelle/archive/plugin/packagedImportTest/importTestChild2.py +0 -22
  144. arelle/archive/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  145. arelle/archive/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  146. arelle/archive/plugin/packagedImportTest/importTestImported1.py +0 -24
  147. arelle/archive/plugin/packagedImportTest/importTestImported11.py +0 -21
  148. arelle/archive/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  149. arelle/archive/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  150. arelle/archive/plugin/sakaCalendar.py +0 -215
  151. arelle/archive/plugin/saveInstanceInfoset.py +0 -121
  152. arelle/archive/plugin/sphinx/FormulaGenerator.py +0 -823
  153. arelle/archive/plugin/sphinx/SphinxContext.py +0 -404
  154. arelle/archive/plugin/sphinx/SphinxEvaluator.py +0 -783
  155. arelle/archive/plugin/sphinx/SphinxMethods.py +0 -1287
  156. arelle/archive/plugin/sphinx/SphinxParser.py +0 -1093
  157. arelle/archive/plugin/sphinx/SphinxValidator.py +0 -163
  158. arelle/archive/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  159. arelle/archive/plugin/sphinx/__init__.py +0 -285
  160. arelle/archive/plugin/streamingExtensions.py +0 -335
  161. arelle/archive/plugin/updateTableLB.py +0 -242
  162. arelle/archive/plugin/validate/SBRnl/CustomLoader.py +0 -19
  163. arelle/archive/plugin/validate/SBRnl/DTS.py +0 -305
  164. arelle/archive/plugin/validate/SBRnl/Dimensions.py +0 -357
  165. arelle/archive/plugin/validate/SBRnl/Document.py +0 -799
  166. arelle/archive/plugin/validate/SBRnl/Filing.py +0 -467
  167. arelle/archive/plugin/validate/SBRnl/__init__.py +0 -75
  168. arelle/archive/plugin/validate/SBRnl/config.xml +0 -26
  169. arelle/archive/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  170. arelle/archive/plugin/validate/USBestPractices.py +0 -570
  171. arelle/archive/plugin/validate/USCorpAction.py +0 -557
  172. arelle/archive/plugin/validate/USSecTagging.py +0 -337
  173. arelle/archive/plugin/validate/XDC/__init__.py +0 -77
  174. arelle/archive/plugin/validate/XDC/config.xml +0 -20
  175. arelle/archive/plugin/validate/XFsyntax/__init__.py +0 -64
  176. arelle/archive/plugin/validate/XFsyntax/xf.py +0 -2227
  177. arelle/archive/plugin/validate/calc2.py +0 -536
  178. arelle/archive/plugin/validateSchemaLxml.py +0 -156
  179. arelle/archive/plugin/validateTableInfoset.py +0 -52
  180. arelle/archive/us-gaap-dei-docType-extraction-frm.xml +0 -90
  181. arelle/archive/us-gaap-dei-ratio-cash-frm.xml +0 -150
  182. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  183. arelle/examples/plugin/functionsCustom.py +0 -59
  184. arelle/examples/plugin/hello_dolly.py +0 -64
  185. arelle/examples/plugin/multi.py +0 -58
  186. arelle/examples/plugin/rssSaveOim.py +0 -96
  187. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  188. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  189. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  190. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  191. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  192. arelle/examples/plugin/validate/XYZ/rules/__init__.py +0 -0
  193. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -110
  194. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -59
  195. arelle/model/CommentBase.py +0 -9
  196. arelle/model/ElementBase.py +0 -11
  197. arelle/model/PIBase.py +0 -10
  198. arelle/model/__init__.py +0 -15
  199. arelle/scripts-macOS/startWebServer.command +0 -3
  200. arelle/scripts-unix/startWebServer.sh +0 -1
  201. arelle/scripts-windows/startWebServer.bat +0 -5
  202. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/WHEEL +0 -0
  203. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/entry_points.txt +0 -0
  204. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/top_level.txt +0 -0
@@ -92,14 +92,21 @@
92
92
  "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_cor.xsd",
93
93
  "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_cor.xsd",
94
94
  "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
95
- "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd"
95
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
96
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
97
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
98
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
99
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd"
96
100
  ],
97
101
  "effectiveTaxonomyURLs": [
98
102
  "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
99
103
  "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
100
104
  "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
101
105
  "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd"
102
- ]
106
+ ],
107
+ "earliestTransformationRegistryVersion": 4,
108
+ "styleIxHiddenProperty": "-esef-ix-hidden",
109
+ "disallowedHiddenStyle": "-ix-hidden"
103
110
  },
104
111
  "ESEF-2022": {
105
112
  "outdatedTaxonomyURLs": [
@@ -108,14 +115,23 @@
108
115
  "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
109
116
  "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
110
117
  "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
111
- "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd"
118
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
119
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
120
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
121
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
122
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
123
+ "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd",
124
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd"
112
125
  ],
113
126
  "effectiveTaxonomyURLs": [
114
127
  "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
115
128
  "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
116
129
  "http://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd",
117
130
  "https://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd"
118
- ]
131
+ ],
132
+ "earliestTransformationRegistryVersion": 4,
133
+ "styleIxHiddenProperty": "-esef-ix-hidden",
134
+ "disallowedHiddenStyle": "-ix-hidden"
119
135
  },
120
136
  "ESEF-2023": {
121
137
  "outdatedTaxonomyURLs": [
@@ -124,14 +140,23 @@
124
140
  "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
125
141
  "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
126
142
  "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
127
- "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd"
143
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
144
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
145
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
146
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
147
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
148
+ "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd",
149
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd"
128
150
  ],
129
151
  "effectiveTaxonomyURLs": [
130
152
  "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
131
153
  "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
132
154
  "http://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd",
133
155
  "https://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd"
134
- ]
156
+ ],
157
+ "earliestTransformationRegistryVersion": 4,
158
+ "styleIxHiddenProperty": "-esef-ix-hidden",
159
+ "disallowedHiddenStyle": "-ix-hidden"
135
160
  },
136
161
  "ESEF-2024": {
137
162
  "outdatedTaxonomyURLs": [
@@ -142,15 +167,57 @@
142
167
  "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
143
168
  "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
144
169
  "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
145
- "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd"
170
+ "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
171
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
172
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
173
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
174
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
175
+ "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd",
176
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd",
177
+ "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_all.xsd",
178
+ "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_all.xsd"
146
179
  ],
147
180
  "effectiveTaxonomyURLs": [
148
181
  "http://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd",
149
182
  "https://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd",
150
183
  "http://www.esma.europa.eu/taxonomy/2024-03-27/esef_cor.xsd",
151
184
  "https://www.esma.europa.eu/taxonomy/2024-03-27/esef_cor.xsd"
152
- ]
153
- },
185
+ ],
186
+ "earliestTransformationRegistryVersion": 4,
187
+ "styleIxHiddenProperty": "-esef-ix-hidden",
188
+ "disallowedHiddenStyle": "-ix-hidden"
189
+ },
190
+ "ESEF-2025-DRAFT": {
191
+ "outdatedTaxonomyURLs": [
192
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_cor.xsd",
193
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_cor.xsd",
194
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
195
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
196
+ "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
197
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
198
+ "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
199
+ "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
200
+ "http://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd",
201
+ "https://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd"
202
+ ],
203
+ "effectiveTaxonomyURLs": [
204
+ "http://www.esma.europa.eu/taxonomy/2025-03-27/esef_cor.xsd",
205
+ "https://www.esma.europa.eu/taxonomy/2025-03-27/esef_cor.xsd",
206
+ "http://www.esma.europa.eu/taxonomy/2024-03-27/esef_cor.xsd",
207
+ "https://www.esma.europa.eu/taxonomy/2024-03-27/esef_cor.xsd"
208
+ ],
209
+ "expiringTaxonomyURLs": [
210
+ {"lastReportableDate": "2025-12-31",
211
+ "URLs": [
212
+ "http://www.esma.europa.eu/taxonomy/2024-03-27/esef_cor.xsd",
213
+ "https://www.esma.europa.eu/taxonomy/2024-03-27/esef_cor.xsd"
214
+ ]
215
+ }
216
+ ],
217
+ "earliestTransformationRegistryVersion": 5,
218
+ "styleIxHiddenProperty": "-ix-hidden",
219
+ "disallowedHiddenStyle": "-esef-ix-hidden"
220
+ },
154
221
  "AT": {
155
222
  "name": "Austria",
156
223
  "reportPackageMaxMB": "100",
@@ -4,6 +4,26 @@
4
4
  xsi:noNamespaceSchemaLocation="../../../../config/disclosuresystems.xsd">
5
5
  <!-- see ../../../../config/disclosuresystem.xml for full comments -->
6
6
 
7
+ <DisclosureSystem
8
+ names="Draft ESMA RTS on ESEF-2025|ESEF-2025-DRAFT|esef-2025-draft"
9
+ description="ESMA RTS on ESEF-2025 Validation Checks for Consolidated Financial Statements (DRAFT)"
10
+ validationType="ESEF"
11
+ exclusiveTypesPattern="EFM|GFM|FERC|HMRC|SBR.NL|EBA|EIOPA|ESEF"
12
+ blockDisallowedReferences="false"
13
+ validateFileText="false"
14
+ contextElement="scenario"
15
+ />
16
+
17
+ <DisclosureSystem
18
+ names="Draft ESMA RTS on ESEF-2025 Unconsolidated|ESEF-Unconsolidated-2025-DRAFT|esef-unconsolidated-2025-draft"
19
+ description="ESMA RTS on ESEF-2025 Validation Checks for Unconsolidated Financial Statements (DRAFT)"
20
+ validationType="ESEF"
21
+ exclusiveTypesPattern="EFM|GFM|FERC|HMRC|SBR.NL|EBA|EIOPA|ESEF"
22
+ blockDisallowedReferences="false"
23
+ validateFileText="false"
24
+ contextElement="scenario"
25
+ />
26
+
7
27
  <DisclosureSystem
8
28
  names="ESMA RTS on ESEF-2024|ESEF-2024-DRAFT|esef-2024-draft|ESEF-2024|esef-2024|ESEF|esef"
9
29
  description="ESMA RTS on ESEF-2024 Validation Checks for Consolidated Financial Statements"
@@ -2,18 +2,40 @@ DISCLOSURE_SYSTEM_NT16 = 'NT16'
2
2
  DISCLOSURE_SYSTEM_NT17 = 'NT17'
3
3
  DISCLOSURE_SYSTEM_NT18 = 'NT18'
4
4
  DISCLOSURE_SYSTEM_NT19 = 'NT19'
5
+ DISCLOSURE_SYSTEM_NT20 = 'NT20'
5
6
  DISCLOSURE_SYSTEM_NL_INLINE_2024 = 'NL-INLINE-2024'
7
+ DISCLOSURE_SYSTEM_NL_INLINE_2025 = 'NL-INLINE-2025'
6
8
  DISCLOSURE_SYSTEM_NL_INLINE_2024_GAAP_OTHER = 'NL-INLINE-2024-GAAP-OTHER'
9
+ DISCLOSURE_SYSTEM_NL_INLINE_MULTI_TARGET = 'NL-INLINE-MULTI-TARGET'
7
10
 
8
11
  ALL_NL_INLINE_DISCLOSURE_SYSTEMS = [
9
12
  DISCLOSURE_SYSTEM_NL_INLINE_2024,
13
+ DISCLOSURE_SYSTEM_NL_INLINE_2025,
10
14
  DISCLOSURE_SYSTEM_NL_INLINE_2024_GAAP_OTHER,
11
15
  ]
12
16
 
13
17
  NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS = [
14
18
  DISCLOSURE_SYSTEM_NL_INLINE_2024,
19
+ DISCLOSURE_SYSTEM_NL_INLINE_2025
15
20
  ]
16
21
 
17
22
  NL_INLINE_GAAP_OTHER_DISCLOSURE_SYSTEMS = [
18
23
  DISCLOSURE_SYSTEM_NL_INLINE_2024_GAAP_OTHER,
19
24
  ]
25
+
26
+ NL_INLINE_MULTI_TARGET_DISCLOSURE_SYSTEMS = [
27
+ DISCLOSURE_SYSTEM_NL_INLINE_MULTI_TARGET,
28
+ ]
29
+
30
+ NL_INLINE_OTHER_DISCLOSURE_SYSTEMS = [
31
+ DISCLOSURE_SYSTEM_NL_INLINE_2024_GAAP_OTHER,
32
+ DISCLOSURE_SYSTEM_NL_INLINE_MULTI_TARGET,
33
+ ]
34
+
35
+ NT_DISCLOSURE_SYSTEMS = [
36
+ DISCLOSURE_SYSTEM_NT16,
37
+ DISCLOSURE_SYSTEM_NT17,
38
+ DISCLOSURE_SYSTEM_NT18,
39
+ DISCLOSURE_SYSTEM_NT19,
40
+ DISCLOSURE_SYSTEM_NT20,
41
+ ]
@@ -63,10 +63,13 @@ ALLOWABLE_LANGUAGES = frozenset((
63
63
  EFFECTIVE_KVK_GAAP_IFRS_ENTRYPOINT_FILES = frozenset((
64
64
  'https://www.nltaxonomie.nl/kvk/2024-12-31/kvk-annual-report-nlgaap-ext.xsd',
65
65
  'https://www.nltaxonomie.nl/kvk/2024-12-31/kvk-annual-report-ifrs-ext.xsd',
66
+ 'https://www.nltaxonomie.nl/kvk/2025-12-31/kvk-annual-report-nlgaap-ext.xsd',
67
+ 'https://www.nltaxonomie.nl/kvk/2025-12-31/kvk-annual-report-ifrs-ext.xsd',
66
68
  ))
67
69
 
68
70
  EFFECTIVE_KVK_GAAP_OTHER_ENTRYPOINT_FILES = frozenset((
69
71
  'https://www.nltaxonomie.nl/kvk/2024-12-31/kvk-annual-report-other-gaap.xsd',
72
+ 'https://www.nltaxonomie.nl/kvk/2025-12-31/kvk-annual-report-other.xsd'
70
73
  ))
71
74
 
72
75
  NON_DIMENSIONALIZED_LINE_ITEM_LINKROLES = frozenset((
@@ -78,6 +81,11 @@ TAXONOMY_URLS_BY_YEAR = {
78
81
  'https://www.nltaxonomie.nl/kvk/2024-12-31/kvk-annual-report-nlgaap-ext.xsd',
79
82
  'https://www.nltaxonomie.nl/kvk/2024-12-31/kvk-annual-report-ifrs-ext.xsd',
80
83
  'https://www.nltaxonomie.nl/kvk/2024-12-31/kvk-annual-report-other-gaap.xsd',
84
+ },
85
+ '2025': {
86
+ 'https://www.nltaxonomie.nl/kvk/2025-12-31/kvk-annual-report-nlgaap-ext.xsd',
87
+ 'https://www.nltaxonomie.nl/kvk/2025-12-31/kvk-annual-report-ifrs-ext.xsd',
88
+ 'https://www.nltaxonomie.nl/kvk/2025-12-31/kvk-annual-report-other.xsd',
81
89
  }
82
90
  }
83
91
 
@@ -106,6 +114,7 @@ STANDARD_TAXONOMY_URLS = frozenset((
106
114
 
107
115
  QN_DOMAIN_ITEM_TYPES = frozenset((
108
116
  qname("{http://www.xbrl.org/dtr/type/2022-03-31}nonnum:domainItemType"),
117
+ qname("{http://www.xbrl.org/dtr/type/2024-01-31}nonnum:domainItemType")
109
118
  ))
110
119
 
111
120
  SUPPORTED_IMAGE_TYPES_BY_IS_FILE = {
@@ -122,6 +131,7 @@ class AnchorData:
122
131
  anchorsWithDomainItem: frozenset[ModelRelationship]
123
132
  extLineItemsNotAnchored: frozenset[ModelConcept]
124
133
  extLineItemsWronglyAnchored: frozenset[ModelConcept]
134
+ extConceptsNotAnchoredToSameDerivedType: frozenset[ModelConcept]
125
135
 
126
136
 
127
137
  @dataclass(frozen=True)
@@ -214,6 +224,8 @@ class LinkbaseData:
214
224
 
215
225
  @dataclass
216
226
  class PluginValidationDataExtension(PluginData):
227
+ AnnualReportOfForeignGroupHeadForExemptionUnderArticle403Qn: QName
228
+ AnnualReportOfForeignGroupHeadForExemptionUnderArticle408Qn: QName
217
229
  chamberOfCommerceRegistrationNumberQn: QName
218
230
  documentAdoptionDateQn: QName
219
231
  documentAdoptionStatusQn: QName
@@ -265,7 +277,7 @@ class PluginValidationDataExtension(PluginData):
265
277
  contextsWithPeriodTimeZone.append(context)
266
278
  if context.hasSegment:
267
279
  contextsWithSegments.append(context)
268
- if context.nonDimValues("scenario"): # type: ignore[no-untyped-call]
280
+ if context.nonDimValues("scenario"):
269
281
  contextsWithImproperContent.append(context)
270
282
  return ContextData(
271
283
  contextsWithImproperContent=contextsWithImproperContent,
@@ -372,7 +384,7 @@ class PluginValidationDataExtension(PluginData):
372
384
  tupleElements.add(elt)
373
385
  if elt.tag == ixFractionTag:
374
386
  fractionElements.add(elt)
375
- for elt, depth in etreeIterWithDepth(ixdsHtmlRootElt):
387
+ for elt in ixdsHtmlRootElt.iter():
376
388
  if elt.get(xmlBaseIdentifier) is not None:
377
389
  baseElements.add(elt)
378
390
  if elt.tag == xhtmlBaseIdentifier:
@@ -433,6 +445,7 @@ class PluginValidationDataExtension(PluginData):
433
445
  anchorsWithDomainItem = set()
434
446
  anchorsWithDimensionItem = set()
435
447
  anchorsInDimensionalElrs = defaultdict(set)
448
+ extConceptsNotAnchoredToSameDerivedType = set()
436
449
  for anchoringRel in widerNarrowerRelSet.modelRelationships:
437
450
  elr = anchoringRel.linkrole
438
451
  fromObj = anchoringRel.fromModelObject
@@ -440,6 +453,7 @@ class PluginValidationDataExtension(PluginData):
440
453
  if fromObj is not None and toObj is not None and fromObj.type is not None and toObj.type is not None:
441
454
  if not ((not self.isExtensionUri(fromObj.modelDocument.uri, modelXbrl)) ^ (not self.isExtensionUri(toObj.modelDocument.uri, modelXbrl))):
442
455
  anchorsNotInBase.add(anchoringRel)
456
+
443
457
  if fromObj.type.isDomainItemType or toObj.type.isDomainItemType:
444
458
  anchorsWithDomainItem.add(anchoringRel)
445
459
  elif fromObj.isDimensionItem or toObj.isDimensionItem:
@@ -447,6 +461,11 @@ class PluginValidationDataExtension(PluginData):
447
461
  else:
448
462
  if elr in elrsContainingDimensionalRelationships:
449
463
  anchorsInDimensionalElrs[elr].add(anchoringRel)
464
+
465
+ if (fromObj.type != toObj.type and
466
+ (not fromObj.type.isDerivedFrom(toObj.type.qname) or
467
+ not toObj.type.isDerivedFrom(fromObj.type.qname))):
468
+ extConceptsNotAnchoredToSameDerivedType.add(toObj)
450
469
  return AnchorData(
451
470
  anchorsInDimensionalElrs={x: frozenset(y) for x, y in anchorsInDimensionalElrs.items()},
452
471
  anchorsNotInBase=frozenset(anchorsNotInBase),
@@ -454,6 +473,7 @@ class PluginValidationDataExtension(PluginData):
454
473
  anchorsWithDomainItem=frozenset(anchorsWithDomainItem),
455
474
  extLineItemsNotAnchored=frozenset(extLineItemsNotAnchored),
456
475
  extLineItemsWronglyAnchored=frozenset(extLineItemsWronglyAnchored),
476
+ extConceptsNotAnchoredToSameDerivedType=frozenset(extConceptsNotAnchoredToSameDerivedType),
457
477
  )
458
478
 
459
479
 
@@ -696,22 +716,20 @@ class PluginValidationDataExtension(PluginData):
696
716
  return reportXmlLang
697
717
 
698
718
  @lru_cache(1)
699
- def getTargetElements(self, modelXbrl: ModelXbrl) -> list[Any]:
719
+ def getTargetElements(self, modelXbrl: ModelXbrl) -> list[ModelObject]:
700
720
  targetElements = []
701
721
  for ixdsHtmlRootElt in modelXbrl.ixdsHtmlElements:
702
722
  ixNStag = str(getattr(ixdsHtmlRootElt.modelDocument, "ixNStag", ixbrl11))
703
- ixTags = set(ixNStag + ln for ln in ("nonNumeric", "nonFraction", "references", "relationship"))
704
- for elt, depth in etreeIterWithDepth(ixdsHtmlRootElt):
705
- if elt.tag in ixTags and elt.get("target"):
723
+ ixTags = (ixNStag + ln for ln in ("nonNumeric", "nonFraction", "references", "relationship"))
724
+ for elt in ixdsHtmlRootElt.iter(*ixTags):
725
+ if elt.get("target"):
706
726
  targetElements.append(elt)
707
727
  return targetElements
708
728
 
709
729
  def isExtensionUri(self, uri: str, modelXbrl: ModelXbrl) -> bool:
710
730
  if uri.startswith(modelXbrl.uriDir):
711
731
  return True
712
- if not any(uri.startswith(taxonomyUri) for taxonomyUri in STANDARD_TAXONOMY_URLS):
713
- return True
714
- return False
732
+ return not any(uri.startswith(taxonomyUri) for taxonomyUri in STANDARD_TAXONOMY_URLS)
715
733
 
716
734
  @lru_cache(1)
717
735
  def isFilenameValidCharacters(self, filename: str) -> bool:
@@ -4,22 +4,31 @@ See COPYRIGHT.md for copyright information.
4
4
  from __future__ import annotations
5
5
  from typing import Any
6
6
 
7
+ from arelle.Cntlr import Cntlr
7
8
  from arelle.ModelDocument import LoadingException, ModelDocument
8
9
  from arelle.ModelValue import qname
9
10
  from arelle.ModelXbrl import ModelXbrl
10
11
  from arelle.ValidateXbrl import ValidateXbrl
11
12
  from arelle.typing import TypeGetText
12
13
  from arelle.utils.validate.ValidationPlugin import ValidationPlugin
13
- from .DisclosureSystems import (DISCLOSURE_SYSTEM_NT16, DISCLOSURE_SYSTEM_NT17, DISCLOSURE_SYSTEM_NT18,
14
- DISCLOSURE_SYSTEM_NT19, DISCLOSURE_SYSTEM_NL_INLINE_2024,
15
- DISCLOSURE_SYSTEM_NL_INLINE_2024_GAAP_OTHER)
14
+ from .DisclosureSystems import (
15
+ DISCLOSURE_SYSTEM_NT16,
16
+ DISCLOSURE_SYSTEM_NT17,
17
+ DISCLOSURE_SYSTEM_NT18,
18
+ DISCLOSURE_SYSTEM_NT19,
19
+ DISCLOSURE_SYSTEM_NT20,
20
+
21
+ DISCLOSURE_SYSTEM_NL_INLINE_2024,
22
+ DISCLOSURE_SYSTEM_NL_INLINE_2024_GAAP_OTHER,
23
+ )
16
24
  from .PluginValidationDataExtension import PluginValidationDataExtension
17
25
 
18
26
  _: TypeGetText
19
27
 
20
28
 
21
29
  class ValidationPluginExtension(ValidationPlugin):
22
- def newPluginData(self, validateXbrl: ValidateXbrl) -> PluginValidationDataExtension:
30
+ def newPluginData(self, cntlr: Cntlr, validateXbrl: ValidateXbrl | None) -> PluginValidationDataExtension:
31
+ assert validateXbrl is not None
23
32
  disclosureSystem = validateXbrl.disclosureSystem.name
24
33
  if disclosureSystem == DISCLOSURE_SYSTEM_NT16:
25
34
  ifrsNamespace = None
@@ -145,9 +154,6 @@ class ValidationPluginExtension(ValidationPlugin):
145
154
  rjNamespace = None
146
155
  entrypointRoot = 'http://www.nltaxonomie.nl/nt19/kvk/20241211/entrypoints/'
147
156
  entrypoints = {entrypointRoot + e for e in [
148
- 'kvk-rpt-jaarverantwoording-2024-ifrs-full.xsd',
149
- 'kvk-rpt-jaarverantwoording-2024-ifrs-geconsolideerd-nlgaap-enkelvoudig.xsd',
150
- 'kvk-rpt-jaarverantwoording-2024-ifrs-smes.xsd',
151
157
  'kvk-rpt-jaarverantwoording-2024-nlgaap-banken.xsd',
152
158
  'kvk-rpt-jaarverantwoording-2024-nlgaap-beleggingsentiteiten.xsd',
153
159
  'kvk-rpt-jaarverantwoording-2024-nlgaap-cooperaties.xsd',
@@ -176,6 +182,42 @@ class ValidationPluginExtension(ValidationPlugin):
176
182
  'kvk-rpt-jaarverantwoording-2024-nlgaap-verzekeringsmaatschappijen.xsd',
177
183
  'kvk-rpt-jaarverantwoording-2024-nlgaap-zorginstellingen.xsd',
178
184
  ]}
185
+ elif disclosureSystem == DISCLOSURE_SYSTEM_NT20:
186
+ ifrsNamespace = None
187
+ jenvNamespace = 'http://www.nltaxonomie.nl/nt20/jenv/20251210/dictionary/jenv-bw2-data'
188
+ kvkINamespace = 'http://www.nltaxonomie.nl/nt20/kvk/20251210/dictionary/kvk-data'
189
+ nlTypesNamespace = 'http://www.nltaxonomie.nl/nt20/sbr/20250301/dictionary/nl-types'
190
+ rjNamespace = None
191
+ entrypointRoot = 'http://www.nltaxonomie.nl/nt20/kvk/20251210/entrypoints/'
192
+ entrypoints = {entrypointRoot + e for e in [
193
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-banken.xsd',
194
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-beleggingsentiteiten.xsd',
195
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-cooperaties.xsd',
196
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-cv-vof.xsd',
197
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-fondsenwervende-organisaties-klein.xsd',
198
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-fondsenwervende-organisaties.xsd',
199
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-groot-verticaal.xsd',
200
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-groot.xsd',
201
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-klein-publicatiestukken.xsd',
202
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-klein-verticaal-publicatiestukken.xsd',
203
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-klein-verticaal.xsd',
204
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-klein.xsd',
205
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-micro-publicatiestukken.xsd',
206
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-micro.xsd',
207
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-middelgroot-plus.xsd',
208
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-middelgroot-publicatiestukken.xsd',
209
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-middelgroot-verticaal-publicatiestukken.xsd',
210
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-middelgroot-verticaal.xsd',
211
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-middelgroot.xsd',
212
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-organisaties-zonder-winststreven-klein.xsd',
213
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-organisaties-zonder-winststreven.xsd',
214
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-pensioenfondsen.xsd',
215
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-premiepensioeninstellingen.xsd',
216
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-stichtingen.xsd',
217
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-toegelaten-instellingen-volkshuisvesting.xsd',
218
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-verzekeringsmaatschappijen.xsd',
219
+ 'kvk-rpt-jaarverantwoording-2025-nlgaap-zorginstellingen.xsd',
220
+ ]}
179
221
  elif disclosureSystem == DISCLOSURE_SYSTEM_NL_INLINE_2024:
180
222
  ifrsNamespace = 'https://xbrl.ifrs.org/taxonomy/2024-03-27/ifrs-full'
181
223
  jenvNamespace = 'https://www.nltaxonomie.nl/bw2-titel9/2024-12-31/bw2-titel9-cor'
@@ -204,6 +246,8 @@ class ValidationPluginExtension(ValidationPlugin):
204
246
  ]) if kvkINamespace else frozenset()
205
247
  return PluginValidationDataExtension(
206
248
  self.name,
249
+ AnnualReportOfForeignGroupHeadForExemptionUnderArticle403Qn=qname(kvkINamespace, 'AnnualReportOfForeignGroupHeadForExemptionUnderArticle403'),
250
+ AnnualReportOfForeignGroupHeadForExemptionUnderArticle408Qn=qname(kvkINamespace, 'AnnualReportOfForeignGroupHeadForExemptionUnderArticle408'),
207
251
  chamberOfCommerceRegistrationNumberQn=qname(jenvNamespace, 'ChamberOfCommerceRegistrationNumber'),
208
252
  documentAdoptionDateQn=qname(jenvNamespace, 'DocumentAdoptionDate'),
209
253
  documentAdoptionStatusQn=qname(jenvNamespace, 'DocumentAdoptionStatus'),
@@ -3,6 +3,12 @@
3
3
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
4
  xsi:noNamespaceSchemaLocation="../../../../config/disclosuresystems.xsd">
5
5
  <!-- see arelle/config/disclosuresystems.xml for full comments -->
6
+ <DisclosureSystem
7
+ names="NL-INLINE-2025|nl-inline-2025|kvk-inline-2025-preview"
8
+ description="Checks for NL INLINE 2025. For use with NL GAAP and NL IFRS"
9
+ validationType="NL"
10
+ exclusiveTypesPattern="EFM|GFM|FERC|HMRC|SBR.NL|EBA|EIOPA|ESEF"
11
+ />
6
12
  <DisclosureSystem
7
13
  names="NL-INLINE-2024|nl-inline-2024|kvk-inline-2024-preview"
8
14
  description="Checks for NL INLINE 2024. For use with NL GAAP and NL IFRS"
@@ -15,6 +21,18 @@
15
21
  validationType="NL"
16
22
  exclusiveTypesPattern="EFM|GFM|FERC|HMRC|SBR.NL|EBA|EIOPA|ESEF"
17
23
  />
24
+ <DisclosureSystem
25
+ names="NL-INLINE-MULTI-TARGET|nl-inline-multi-target|kvk-inline-multi-target-preview"
26
+ description="Checks for NL INLINE. For use with other GAAP."
27
+ validationType="NL"
28
+ exclusiveTypesPattern="EFM|GFM|FERC|HMRC|SBR.NL|EBA|EIOPA|ESEF"
29
+ />
30
+ <DisclosureSystem
31
+ names="NT20|nt20|NT20-preview|nt20-preview"
32
+ description="Checks for NT20"
33
+ validationType="NL"
34
+ exclusiveTypesPattern="EFM|GFM|FERC|HMRC|SBR.NL|EBA|EIOPA|ESEF"
35
+ />
18
36
  <DisclosureSystem
19
37
  names="NT19|nt19|NT19-preview|nt19-preview"
20
38
  description="Checks for NT19"
@@ -3,27 +3,23 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
- from datetime import date, timedelta
7
- from dateutil import relativedelta
8
6
  from collections.abc import Iterable
9
- from typing import Any, cast, TYPE_CHECKING
7
+ from datetime import date, timedelta
8
+ from typing import TYPE_CHECKING, Any, cast
10
9
 
11
- from regex import regex
10
+ import regex
11
+ from dateutil import relativedelta
12
12
 
13
- from arelle import XmlUtil, XbrlConst
13
+ from arelle import XbrlConst, XmlUtil
14
14
  from arelle.ModelObject import ModelObject
15
- from arelle.ValidateXbrl import ValidateXbrl
16
- from arelle.XmlValidate import INVALID
17
15
  from arelle.typing import TypeGetText
18
16
  from arelle.utils.PluginHooks import ValidationHook
19
17
  from arelle.utils.validate.Decorator import validation
20
18
  from arelle.utils.validate.Validation import Validation
21
- from ..DisclosureSystems import (
22
- DISCLOSURE_SYSTEM_NT16,
23
- DISCLOSURE_SYSTEM_NT17,
24
- DISCLOSURE_SYSTEM_NT18,
25
- DISCLOSURE_SYSTEM_NT19,
26
- )
19
+ from arelle.ValidateXbrl import ValidateXbrl
20
+ from arelle.XmlValidate import INVALID
21
+
22
+ from ..DisclosureSystems import NT_DISCLOSURE_SYSTEMS
27
23
  from ..PluginValidationDataExtension import PluginValidationDataExtension
28
24
 
29
25
  if TYPE_CHECKING:
@@ -44,12 +40,7 @@ def _getReportingPeriodDateValue(modelXbrl: ModelXbrl, qname: QName) -> date | N
44
40
 
45
41
  @validation(
46
42
  hook=ValidationHook.XBRL_FINALLY,
47
- disclosureSystems=[
48
- DISCLOSURE_SYSTEM_NT16,
49
- DISCLOSURE_SYSTEM_NT17,
50
- DISCLOSURE_SYSTEM_NT18,
51
- DISCLOSURE_SYSTEM_NT19,
52
- ],
43
+ disclosureSystems=NT_DISCLOSURE_SYSTEMS,
53
44
  )
54
45
  def rule_br_kvk_2_04(
55
46
  pluginData: PluginValidationDataExtension,
@@ -122,12 +113,7 @@ def rule_br_kvk_2_04(
122
113
 
123
114
  @validation(
124
115
  hook=ValidationHook.XBRL_FINALLY,
125
- disclosureSystems=[
126
- DISCLOSURE_SYSTEM_NT16,
127
- DISCLOSURE_SYSTEM_NT17,
128
- DISCLOSURE_SYSTEM_NT18,
129
- DISCLOSURE_SYSTEM_NT19,
130
- ],
116
+ disclosureSystems=NT_DISCLOSURE_SYSTEMS,
131
117
  )
132
118
  def rule_br_kvk_3_01(
133
119
  pluginData: PluginValidationDataExtension,
@@ -163,12 +149,7 @@ def rule_br_kvk_3_01(
163
149
 
164
150
  @validation(
165
151
  hook=ValidationHook.XBRL_FINALLY,
166
- disclosureSystems=[
167
- DISCLOSURE_SYSTEM_NT16,
168
- DISCLOSURE_SYSTEM_NT17,
169
- DISCLOSURE_SYSTEM_NT18,
170
- DISCLOSURE_SYSTEM_NT19,
171
- ],
152
+ disclosureSystems=NT_DISCLOSURE_SYSTEMS,
172
153
  )
173
154
  def rule_br_kvk_4_07(
174
155
  pluginData: PluginValidationDataExtension,
@@ -196,12 +177,7 @@ def rule_br_kvk_4_07(
196
177
 
197
178
  @validation(
198
179
  hook=ValidationHook.XBRL_FINALLY,
199
- disclosureSystems=[
200
- DISCLOSURE_SYSTEM_NT16,
201
- DISCLOSURE_SYSTEM_NT17,
202
- DISCLOSURE_SYSTEM_NT18,
203
- DISCLOSURE_SYSTEM_NT19,
204
- ],
180
+ disclosureSystems=NT_DISCLOSURE_SYSTEMS,
205
181
  )
206
182
  def rule_br_kvk_4_10(
207
183
  pluginData: PluginValidationDataExtension,
@@ -229,12 +205,7 @@ def rule_br_kvk_4_10(
229
205
 
230
206
  @validation(
231
207
  hook=ValidationHook.XBRL_FINALLY,
232
- disclosureSystems=[
233
- DISCLOSURE_SYSTEM_NT16,
234
- DISCLOSURE_SYSTEM_NT17,
235
- DISCLOSURE_SYSTEM_NT18,
236
- DISCLOSURE_SYSTEM_NT19,
237
- ],
208
+ disclosureSystems=NT_DISCLOSURE_SYSTEMS,
238
209
  )
239
210
  def rule_br_kvk_4_12(
240
211
  pluginData: PluginValidationDataExtension,
@@ -267,12 +238,7 @@ def rule_br_kvk_4_12(
267
238
 
268
239
  @validation(
269
240
  hook=ValidationHook.XBRL_FINALLY,
270
- disclosureSystems=[
271
- DISCLOSURE_SYSTEM_NT16,
272
- DISCLOSURE_SYSTEM_NT17,
273
- DISCLOSURE_SYSTEM_NT18,
274
- DISCLOSURE_SYSTEM_NT19,
275
- ],
241
+ disclosureSystems=NT_DISCLOSURE_SYSTEMS,
276
242
  )
277
243
  def rule_br_kvk_4_16(
278
244
  pluginData: PluginValidationDataExtension,
@@ -309,12 +275,7 @@ def rule_br_kvk_4_16(
309
275
 
310
276
  @validation(
311
277
  hook=ValidationHook.XBRL_FINALLY,
312
- disclosureSystems=[
313
- DISCLOSURE_SYSTEM_NT16,
314
- DISCLOSURE_SYSTEM_NT17,
315
- DISCLOSURE_SYSTEM_NT18,
316
- DISCLOSURE_SYSTEM_NT19,
317
- ],
278
+ disclosureSystems=NT_DISCLOSURE_SYSTEMS,
318
279
  )
319
280
  def rule_br_kvk_4_17(
320
281
  pluginData: PluginValidationDataExtension,
@@ -342,12 +303,7 @@ def rule_br_kvk_4_17(
342
303
 
343
304
  @validation(
344
305
  hook=ValidationHook.XBRL_FINALLY,
345
- disclosureSystems=[
346
- DISCLOSURE_SYSTEM_NT16,
347
- DISCLOSURE_SYSTEM_NT17,
348
- DISCLOSURE_SYSTEM_NT18,
349
- DISCLOSURE_SYSTEM_NT19,
350
- ],
306
+ disclosureSystems=NT_DISCLOSURE_SYSTEMS,
351
307
  )
352
308
  def rule_br_kvk_4_20(
353
309
  pluginData: PluginValidationDataExtension,