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
@@ -0,0 +1,27 @@
1
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
2
+ ×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×
3
+ ○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○
4
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
5
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,△,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
6
+ ×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×
7
+ ×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,×,×,×,×,×,×,×,×,×,×,×,×
8
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
9
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
10
+ ○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,×,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,○,○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
11
+ ○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,×,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,○,○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
12
+ ○,×,×,○,○,○,○,○,○,○,○,○,○,×,○,○,○,○,○,○,×,×,×,×,×,×,○,○,×,×,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
13
+ ○,×,×,○,○,○,○,◎,◎,◎,○,◎,◎,×,◎,◎,◎,◎,○,◎,×,×,×,×,×,×,○,○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
14
+ ○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,×,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,○,○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
15
+ ○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,×,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,○,○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
16
+ ○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,×,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,○,○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
17
+ ○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,×,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,○,○,×,×,○,○,○,○,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
18
+ ○,×,×,○,○,○,○,○,○,○,○,○,○,×,○,○,○,○,○,○,×,×,×,×,×,×,○,○,×,×,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
19
+ ○,×,×,○,○,○,○,○,○,○,○,○,○,×,○,○,○,○,○,○,×,×,×,×,×,×,○,○,×,×,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
20
+ ○,×,×,○,○,○,○,○,○,○,○,○,○,×,○,○,○,○,○,○,×,×,×,×,×,×,○,○,×,×,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
21
+ ○,×,×,○,○,○,○,×,×,×,×,×,×,×,○,○,×,×,×,×,×,×,×,×,×,×,○,○,×,×,○,○,○,○,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
22
+ ○,×,×,○,○,○,○,×,×,×,×,×,×,×,○,○,×,×,×,×,×,×,×,×,×,×,○,○,×,×,○,○,○,○,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×,×
23
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
24
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
25
+ ○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○,○
26
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
27
+ ◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎,◎
@@ -26,6 +26,8 @@
26
26
  <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor_2013-08-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor</Namespace><Prefix>jpdei</Prefix></Loc>
27
27
  <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_rt_2013-08-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Entry Point</FileTypeName><Elements>0</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_rt</Namespace><Prefix>jpdei</Prefix></Loc>
28
28
  <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2013-08-31_gla.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
29
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2013-08-31_lab-en.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
30
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2013-08-31_lab.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
29
31
  <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2024-11-01_lab-en.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
30
32
  <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2024-11-01_lab.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
31
33
  <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/r/jpdei_000100-000_2013-08-31_def.xml</Href><AttType>DEF</AttType><FileTypeName>Definition, Dimensions</FileTypeName><Elements>0</Elements></Loc>
@@ -3,20 +3,32 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
+ import datetime
6
7
  from collections import defaultdict
7
- from typing import Any, Iterable
8
8
 
9
- import regex
9
+ from dateutil.relativedelta import relativedelta
10
+ from itertools import chain
11
+ from typing import Any, Iterable, cast
10
12
 
11
13
  from arelle import XbrlConst
14
+ from arelle.Cntlr import Cntlr
15
+ from arelle.FileSource import FileSource
16
+ from arelle.LinkbaseType import LinkbaseType
12
17
  from arelle.ModelDtsObject import ModelConcept
13
18
  from arelle.ValidateXbrl import ValidateXbrl
19
+ from arelle.XmlValidateConst import VALID
14
20
  from arelle.typing import TypeGetText
15
21
  from arelle.utils.PluginHooks import ValidationHook
16
22
  from arelle.utils.validate.Decorator import validation
17
- from arelle.utils.validate.Validation import Validation
23
+ from arelle.utils.validate.Validation import Level, Validation
24
+ from ..Constants import FINANCIAL_STATEMENT_CONTEXT_ID_PATTERN, CONTEXT_ID_PATTERN, INDIVIDUAL_CONTEXT_ID_PATTERN
25
+ from ..ContextRequirement import CONTEXT_REQUIREMENTS
26
+ from ..ControllerPluginData import ControllerPluginData
18
27
  from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
28
+ from ..FilingFormat import DocumentType
29
+ from ..FormType import FormType
19
30
  from ..PluginValidationDataExtension import PluginValidationDataExtension
31
+ from ..ReportFolderType import ReportFolderType
20
32
 
21
33
  _: TypeGetText
22
34
 
@@ -29,6 +41,64 @@ FINANCIAL_STATEMENT_ELR_PREFIXES = (
29
41
  )
30
42
 
31
43
 
44
+ @validation(
45
+ hook=ValidationHook.XBRL_FINALLY,
46
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
47
+ )
48
+ def rule_EC8011W(
49
+ pluginData: PluginValidationDataExtension,
50
+ val: ValidateXbrl,
51
+ *args: Any,
52
+ **kwargs: Any,
53
+ ) -> Iterable[Validation]:
54
+ """
55
+ EDINET.EC8011W: The context ID must conform to the naming rules.
56
+ """
57
+ for contextId, context in val.modelXbrl.contexts.items():
58
+ if not CONTEXT_ID_PATTERN.fullmatch(contextId):
59
+ yield Validation.warning(
60
+ codes='EDINET.EC8011W',
61
+ msg=_("The context ID does not conform to the naming rules. "
62
+ "Context ID: '%(contextId)s'. "
63
+ "Please correct the relevant context ID in accordance with the naming rules. "
64
+ "* No action is required for warnings caused by setting \"FutureDate\" "
65
+ "for first portion of context ID. "
66
+ "* No action is required for warnings caused by tagging for disclosure beyond "
67
+ "the period specified in the naming convention for \"total greenhouse gas emissions.\""),
68
+ contextId=contextId,
69
+ modelObject=context,
70
+ )
71
+
72
+
73
+ @validation(
74
+ hook=ValidationHook.XBRL_FINALLY,
75
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
76
+ )
77
+ def rule_EC8012W(
78
+ pluginData: PluginValidationDataExtension,
79
+ val: ValidateXbrl,
80
+ *args: Any,
81
+ **kwargs: Any,
82
+ ) -> Iterable[Validation]:
83
+ """
84
+ EDINET.EC8012W: If a main financial statement element is present, a calculation linkbase file must be present.
85
+ """
86
+ if not any(
87
+ fact.qname.namespaceURI == pluginData.namespaces.jppfs
88
+ for fact in val.modelXbrl.facts
89
+ ):
90
+ return
91
+ relSet = val.modelXbrl.relationshipSet(tuple(LinkbaseType.CALCULATION.getArcroles()))
92
+ if relSet is None or len(relSet.modelRelationships) == 0:
93
+ yield Validation.warning(
94
+ codes='EDINET.EC8012W',
95
+ msg=_("If a main financial statement element is present, a calculation linkbase "
96
+ "file must be present. "
97
+ "If you wish to tag the financial statements, please submit a "
98
+ "calculation linkbase file."),
99
+ )
100
+
101
+
32
102
  @validation(
33
103
  hook=ValidationHook.XBRL_FINALLY,
34
104
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -76,7 +146,7 @@ def rule_EC8013W(
76
146
  continue
77
147
  if fact.contextID is None:
78
148
  continue
79
- if not pluginData.contextIdPattern.match(fact.contextID):
149
+ if not FINANCIAL_STATEMENT_CONTEXT_ID_PATTERN.fullmatch(fact.contextID):
80
150
  invalidContextIdMap[fact.contextID].append(fact)
81
151
  for contextId, facts in invalidContextIdMap.items():
82
152
  yield Validation.warning(
@@ -91,6 +161,242 @@ def rule_EC8013W(
91
161
  )
92
162
 
93
163
 
164
+ @validation(
165
+ hook=ValidationHook.COMPLETE,
166
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
167
+ )
168
+ def rule_EC8014W(
169
+ pluginData: ControllerPluginData,
170
+ cntlr: Cntlr,
171
+ fileSource: FileSource,
172
+ *args: Any,
173
+ **kwargs: Any,
174
+ ) -> Iterable[Validation]:
175
+ """
176
+ EDINET.EC8014W: For individual (non-consolidated) reports, there must be a context that represents an individual.
177
+
178
+ Individual reports identified by presence of WhetherConsolidatedFinancialStatementsArePreparedDEI with False value.
179
+ Individual context identified by context ID matching pattern with "_NonConsolidatedMember".
180
+ """
181
+ if pluginData.isConsolidated() != False:
182
+ return
183
+ if not any(
184
+ INDIVIDUAL_CONTEXT_ID_PATTERN.fullmatch(contextID)
185
+ for modelXbrl in pluginData.loadedModelXbrls
186
+ for contextID in modelXbrl.contexts
187
+ ):
188
+ yield Validation.warning(
189
+ codes='EDINET.EC8014W',
190
+ msg=_("There is no context ID in the inline XBRL file that represents an individual. "
191
+ "Please set a context ID that indicates individual financial "
192
+ "statements in the inline XBRL file. "
193
+ "If you are not including individual financial statements, "
194
+ "please check the \"WhetherConsolidatedFinancialStatementsArePreparedDEI\" "
195
+ "value of the DEI information."),
196
+ )
197
+
198
+
199
+ @validation(
200
+ hook=ValidationHook.COMPLETE,
201
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
202
+ )
203
+ def rule_EC8015W(
204
+ pluginData: ControllerPluginData,
205
+ cntlr: Cntlr,
206
+ fileSource: FileSource,
207
+ *args: Any,
208
+ **kwargs: Any,
209
+ ) -> Iterable[Validation]:
210
+ """
211
+ EDINET.EC8015W: For consolidated reports, there must not be a context that represents an individual.
212
+
213
+ Consolidated reports identified by presence of WhetherConsolidatedFinancialStatementsArePreparedDEI with True value.
214
+ Individual context identified by context ID matching pattern with "_NonConsolidatedMember".
215
+ """
216
+ if pluginData.isConsolidated() != True:
217
+ return
218
+ individualContexts = [
219
+ context
220
+ for modelXbrl in pluginData.loadedModelXbrls
221
+ for contextId, context in modelXbrl.contexts.items()
222
+ if INDIVIDUAL_CONTEXT_ID_PATTERN.fullmatch(contextId)
223
+ ]
224
+ if len(individualContexts) > 0:
225
+ yield Validation.warning(
226
+ codes='EDINET.EC8015W',
227
+ msg=_("There is a context ID in the inline XBRL file that represents an individual. "
228
+ "If you do not want to enter information related to individual financial statements, "
229
+ "delete the context ID that indicates individual. "
230
+ "If you want to enter individual financial statements, "
231
+ "check the \"WhetherConsolidatedFinancialStatementsArePreparedDEI\" status in the DEI "
232
+ "information. "
233
+ "* If there is a change from non-consolidated to consolidated, even if the data content "
234
+ "is normal, it may be recognized as an exception and a warning may be displayed."),
235
+ modelObject=individualContexts,
236
+ )
237
+
238
+
239
+ @validation(
240
+ hook=ValidationHook.COMPLETE,
241
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
242
+ )
243
+ def rule_contextDeiRequirements(
244
+ pluginData: ControllerPluginData,
245
+ cntlr: Cntlr,
246
+ fileSource: FileSource,
247
+ *args: Any,
248
+ **kwargs: Any,
249
+ ) -> Iterable[Validation]:
250
+ """
251
+ EDINET.EC8018W, EDINET.EC8019W, and EDINET.EC8020W assert that context instant, startDate, and endDate values
252
+ (respectively) match certain DEI values based on the presence of DEI values and patterns in the context ID.
253
+ See section 3-4-2 in the Validation Guidelines.
254
+ """
255
+ for modelXbrl in pluginData.loadedModelXbrls:
256
+ for contextId, context in modelXbrl.contexts.items():
257
+ for contextDeiRequirement in CONTEXT_REQUIREMENTS:
258
+ if not contextId.startswith(contextDeiRequirement.contextId):
259
+ continue
260
+ if contextDeiRequirement.elementDoesNotExist is not None:
261
+ if pluginData.getDeiValue(contextDeiRequirement.elementDoesNotExist) is not None:
262
+ continue
263
+ if contextDeiRequirement.elementExists is not None:
264
+ if pluginData.getDeiValue(contextDeiRequirement.elementExists) is None:
265
+ continue
266
+
267
+ if contextDeiRequirement.element == 'startDate':
268
+ contextValue = context.startDatetime
269
+ code = "EDINET.EC8019W"
270
+ elif contextDeiRequirement.element == 'endDate':
271
+ contextValue = context.endDatetime
272
+ code = "EDINET.EC8020W"
273
+ else:
274
+ assert contextDeiRequirement.element == 'instant'
275
+ contextValue = context.instantDatetime
276
+ code = "EDINET.EC8018W"
277
+
278
+ deiValue = pluginData.getDeiValue(contextDeiRequirement.elementMatch)
279
+ if deiValue is None:
280
+ continue
281
+ deiValue = cast(datetime.datetime, deiValue)
282
+
283
+ if contextDeiRequirement.element in ('instant', 'endDate'):
284
+ # Instant and end dates are parsed as the beginning of the day after the date specified by the value
285
+ # DEI values need to be adjusted by 1 day to match this.
286
+ deiValue = cast(datetime.datetime, deiValue) + datetime.timedelta(1)
287
+ if contextDeiRequirement.dayAdjustment:
288
+ deiValue = cast(datetime.datetime, deiValue) + datetime.timedelta(contextDeiRequirement.dayAdjustment)
289
+
290
+ if contextValue != deiValue:
291
+ yield Validation.warning(
292
+ codes=code,
293
+ msg=_("The context %(element)s element does not match the information in DEI "
294
+ "\"%(elementMatch)s\". "
295
+ "Context ID: '%(contextId)s'. "
296
+ "DEI value: '%(deiValue)s'. "
297
+ "Context value: '%(contextValue)s'. "
298
+ "Please set the same value for the %(element)s element value of the corresponding "
299
+ "context ID and the DEI information value."),
300
+ element=contextDeiRequirement.element,
301
+ elementMatch=contextDeiRequirement.elementMatch,
302
+ contextId=contextId,
303
+ deiValue=deiValue.date().isoformat(),
304
+ contextValue=contextValue.date().isoformat(),
305
+ )
306
+
307
+
308
+ @validation(
309
+ hook=ValidationHook.COMPLETE,
310
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
311
+ )
312
+ def rule_EC8021W(
313
+ pluginData: ControllerPluginData,
314
+ cntlr: Cntlr,
315
+ fileSource: FileSource,
316
+ *args: Any,
317
+ **kwargs: Any,
318
+ ) -> Iterable[Validation]:
319
+ """
320
+ EDINET.EC8021W: "EndDateOfQuarterlyOrSemiAnnualPeriodOfNextFiscalYearDEI" or "CurrentPeriodEndDateDEI"
321
+ must not be more than one year earlier than "FilingDateCoverPage".
322
+
323
+
324
+ If the "EndDateOfQuarterlyOrSemiAnnualPeriodOfNextFiscalYearDEI" of the DEI information is present,
325
+ then its value must not be more than one year earlier than "FilingDateCoverPage".
326
+ If "EndDateOfQuarterlyOrSemiAnnualPeriodOfNextFiscalYearDEI" is not present, but "CurrentPeriodEndDateDEI"
327
+ is present, then its value must not be more than one year earlier than "FilingDateCoverPage".
328
+ """
329
+ localName = 'EndDateOfQuarterlyOrSemiAnnualPeriodOfNextFiscalYearDEI'
330
+ targetDate = pluginData.getDeiValue(localName)
331
+ if not isinstance(targetDate, datetime.datetime):
332
+ localName = 'CurrentPeriodEndDateDEI'
333
+ targetDate = pluginData.getDeiValue(localName)
334
+ if not isinstance(targetDate, datetime.datetime):
335
+ return
336
+ compareDate = cast(datetime.datetime, targetDate + relativedelta(years=1))
337
+ for modelXbrl in pluginData.loadedModelXbrls:
338
+ for fact in modelXbrl.factsByLocalName.get('FilingDateCoverPage', set()):
339
+ if fact.isNil or fact.xValid < VALID:
340
+ continue
341
+ submissionDate = cast(datetime.datetime, fact.xValue)
342
+ if compareDate < submissionDate:
343
+ yield Validation.warning(
344
+ codes='EDINET.EC8021W',
345
+ msg=_("The DEI '%(localName)s' information is set to a date that is "
346
+ "more than one year earlier than 'FilingDateCoverPage'. "
347
+ "Please set the '%(localName)s' value to a value that is less "
348
+ "than one year earlier than the value of 'FilingDateCoverPage'. "
349
+ "%(localName)s: '%(targetDate)s'. "
350
+ "FilingDateCoverPage: '%(submissionDate)s'. "),
351
+ localName=localName,
352
+ targetDate=targetDate.date().isoformat(),
353
+ submissionDate=submissionDate.date().isoformat(),
354
+ modelObject=fact,
355
+ )
356
+
357
+
358
+ @validation(
359
+ hook=ValidationHook.COMPLETE,
360
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
361
+ )
362
+ def rule_EC8032E(
363
+ pluginData: ControllerPluginData,
364
+ cntlr: Cntlr,
365
+ fileSource: FileSource,
366
+ *args: Any,
367
+ **kwargs: Any,
368
+ ) -> Iterable[Validation]:
369
+ """
370
+ EDINET.EC8032E: The first six digits of each context identifier must match the "EDINET code"
371
+ in the DEI information (or the "fund code" in the DEI information in the case of the Cabinet
372
+ Office Ordinance on Specified Securities Disclosure).
373
+ """
374
+ localNames = ('EDINETCodeDEI', 'FundCodeDEI')
375
+ codes = set()
376
+ for localName in localNames:
377
+ code = pluginData.getDeiValue(localName)
378
+ if code is None:
379
+ continue
380
+ codes.add(str(code)[:6])
381
+ if len(codes) == 0:
382
+ # If neither code is present in the DEI, it will be caught by other validation(s).
383
+ return
384
+ for modelXbrl in pluginData.loadedModelXbrls:
385
+ for context in modelXbrl.contexts.values():
386
+ __, identifier = context.entityIdentifier
387
+ identifier = identifier[:6]
388
+ if identifier not in codes:
389
+ yield Validation.error(
390
+ codes='EDINET.EC8032E',
391
+ msg=_("The context identifier must match the 'EDINETCodeDEI' information in the DEI. "
392
+ "Please set the identifier (first six digits) of the relevant context ID so "
393
+ "that it matches the EDINET code of the person submitting the disclosure "
394
+ "documents (or the fund code in the case of the Specified Securities Disclosure "
395
+ "Ordinance)."),
396
+ modelObject=context,
397
+ )
398
+
399
+
94
400
  @validation(
95
401
  hook=ValidationHook.XBRL_FINALLY,
96
402
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -163,17 +469,15 @@ def rule_EC8054W(
163
469
  EDINET.EC8054W: For any context with ID containing "NonConsolidatedMember",
164
470
  the scenario element within must be set to "NonConsolidatedMember".
165
471
  """
166
- for context in val.modelXbrl.contexts.values():
167
- if pluginData.nonConsolidatedMemberQn.localName not in context.id:
472
+ allContexts = chain(val.modelXbrl.contexts.values(), val.modelXbrl.ixdsUnmappedContexts.values())
473
+ for context in allContexts:
474
+ if context.id is None or pluginData.nonConsolidatedMemberQn.localName not in context.id:
168
475
  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:
476
+ member = context.dimMemberQname(
477
+ pluginData.consolidatedOrNonConsolidatedAxisQn,
478
+ includeDefaults=True
479
+ )
480
+ if member != pluginData.nonConsolidatedMemberQn:
177
481
  yield Validation.warning(
178
482
  codes='EDINET.EC8054W',
179
483
  msg=_("For the context ID (%(contextId)s), \"NonConsolidatedMember\" "
@@ -184,3 +488,60 @@ def rule_EC8054W(
184
488
  contextId=context.id,
185
489
  modelObject=context,
186
490
  )
491
+
492
+
493
+ @validation(
494
+ hook=ValidationHook.XBRL_FINALLY,
495
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
496
+ )
497
+ def rule_EC8060E(
498
+ pluginData: PluginValidationDataExtension,
499
+ val: ValidateXbrl,
500
+ *args: Any,
501
+ **kwargs: Any,
502
+ ) -> Iterable[Validation]:
503
+ """
504
+ EDINET.EC8060E: A context's scenario element must not have an explicit default member.
505
+ """
506
+ # The error gets downgraded to a warning in the following scenarios:
507
+ warningScenarios = {
508
+ (FormType.FORM_2, DocumentType.SECURITIES_REGISTRATION_STATEMENT),
509
+ (FormType.FORM_2_4, DocumentType.SECURITIES_REGISTRATION_STATEMENT),
510
+ (FormType.FORM_2_5, DocumentType.SECURITIES_REGISTRATION_STATEMENT),
511
+ (FormType.FORM_2_6, DocumentType.SECURITIES_REGISTRATION_STATEMENT),
512
+ (FormType.FORM_2_7, DocumentType.SECURITIES_REGISTRATION_STATEMENT),
513
+ (FormType.FORM_3, DocumentType.ANNUAL_SECURITIES_REPORT),
514
+ (FormType.FORM_3_2, DocumentType.ANNUAL_SECURITIES_REPORT),
515
+ (FormType.FORM_4, DocumentType.ANNUAL_SECURITIES_REPORT),
516
+ (FormType.FORM_4_3, DocumentType.SEMI_ANNUAL_REPORT),
517
+ (FormType.FORM_5, DocumentType.SEMI_ANNUAL_REPORT),
518
+ (FormType.FORM_5_2, DocumentType.SEMI_ANNUAL_REPORT),
519
+ }
520
+ level = Level.ERROR
521
+ code = 'EDINET.EC8060E'
522
+ if (pluginData.getFormType(val.modelXbrl), pluginData.getDocumentType(val.modelXbrl)) in warningScenarios:
523
+ level = Level.WARNING
524
+ code = 'EDINET.EC8060W'
525
+ allContexts = chain(val.modelXbrl.contexts.values(), val.modelXbrl.ixdsUnmappedContexts.values())
526
+ for context in allContexts:
527
+ for qname, dimensionValue in context.qnameDims.items():
528
+ if dimensionValue.contextElement != 'scenario':
529
+ continue
530
+ if dimensionValue.xValid < VALID:
531
+ continue
532
+ explicitValue = dimensionValue.xValue
533
+ dimensionQname = dimensionValue.dimensionQname
534
+ defaultValue = val.modelXbrl.qnameDimensionDefaults.get(dimensionQname)
535
+ if explicitValue == defaultValue:
536
+ yield Validation.build(
537
+ level=level,
538
+ codes=code,
539
+ msg=_("The default member element is explicitly set in the scenario element of the context. "
540
+ "Context: '%(contextId)s'. "
541
+ "Please delete the default member (the element with the dimension default "
542
+ "arc role set) from the scenario element of the context. If deleting it "
543
+ "violates GFM 1.2.7, the context is unnecessary and cannot be set. "
544
+ "For details of GFM 1.2.7, please refer to 'Attachment 3 GFM Validation Item List'."),
545
+ contextId=context.id,
546
+ modelObject=context,
547
+ )