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.
- arelle/BetaFeatures.py +0 -21
- arelle/Cntlr.py +15 -8
- arelle/CntlrCmdLine.py +121 -56
- arelle/CntlrWinMain.py +143 -70
- arelle/DialogFind.py +1 -1
- arelle/DialogPluginManager.py +6 -4
- arelle/DisclosureSystem.py +7 -0
- arelle/ErrorManager.py +21 -6
- arelle/FileSource.py +11 -4
- arelle/FunctionIxt.py +16 -11
- arelle/HtmlUtil.py +5 -4
- arelle/LeiUtil.py +63 -43
- arelle/ModelDocument.py +20 -15
- arelle/ModelDtsObject.py +8 -0
- arelle/ModelInstanceObject.py +1 -1
- arelle/ModelObject.py +16 -18
- arelle/ModelObjectFactory.py +35 -17
- arelle/ModelXbrl.py +28 -11
- arelle/PluginManager.py +130 -105
- arelle/RuntimeOptions.py +1 -0
- arelle/UrlUtil.py +14 -0
- arelle/Validate.py +17 -12
- arelle/ValidateDuplicateFacts.py +3 -1
- arelle/ValidateFileSource.py +38 -0
- arelle/ValidateFilingText.py +3 -3
- arelle/ValidateXbrl.py +5 -2
- arelle/ValidateXbrlCalcs.py +210 -186
- arelle/ValidateXbrlDTS.py +1 -1
- arelle/ViewFile.py +1 -0
- arelle/ViewFileFactTable.py +2 -2
- arelle/ViewWinDTS.py +4 -1
- arelle/WebCache.py +28 -24
- arelle/XbrlConst.py +22 -0
- arelle/XmlUtil.py +16 -21
- arelle/XmlValidate.py +6 -9
- arelle/_version.py +16 -3
- arelle/api/Session.py +11 -2
- arelle/config/disclosuresystems.xsd +2 -0
- arelle/config/rosettaEntitlements.plist +8 -0
- arelle/conformance/CSVTestcaseLoader.py +1 -1
- arelle/formula/XPathContext.py +3 -3
- arelle/logging/formatters/LogFormatter.py +3 -1
- arelle/packages/report/ReportPackage.py +26 -13
- arelle/packages/report/ReportPackageConst.py +0 -1
- arelle/plugin/inlineXbrlDocumentSet.py +19 -5
- arelle/plugin/validate/DBA/DisclosureSystems.py +19 -1
- arelle/plugin/validate/DBA/PluginValidationDataExtension.py +2 -4
- arelle/plugin/validate/DBA/ValidationPluginExtension.py +2 -1
- arelle/plugin/validate/DBA/resources/config.xml +5 -0
- arelle/plugin/validate/DBA/rules/__init__.py +2 -2
- arelle/plugin/validate/DBA/rules/fr.py +19 -2
- arelle/plugin/validate/DBA/rules/tc.py +2 -0
- arelle/plugin/validate/DBA/rules/th.py +6 -0
- arelle/plugin/validate/DBA/rules/tm.py +18 -5
- arelle/plugin/validate/DBA/rules/tr.py +11 -5
- arelle/plugin/validate/EDINET/Constants.py +193 -9
- arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
- arelle/plugin/validate/EDINET/ControllerPluginData.py +220 -1
- arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
- arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
- arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
- arelle/plugin/validate/EDINET/FormType.py +134 -0
- arelle/plugin/validate/EDINET/ManifestInstance.py +72 -5
- arelle/plugin/validate/EDINET/NamespaceConfig.py +50 -0
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +493 -132
- arelle/plugin/validate/EDINET/{InstanceType.py → ReportFolderType.py} +72 -15
- arelle/plugin/validate/EDINET/Statement.py +139 -0
- arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +595 -0
- arelle/plugin/validate/EDINET/UploadContents.py +48 -0
- arelle/plugin/validate/EDINET/ValidationPluginExtension.py +20 -2
- arelle/plugin/validate/EDINET/__init__.py +31 -6
- arelle/plugin/validate/EDINET/resources/config.xml +8 -1
- arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
- arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
- arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +2 -0
- arelle/plugin/validate/EDINET/rules/contexts.py +375 -14
- arelle/plugin/validate/EDINET/rules/edinet.py +1934 -45
- arelle/plugin/validate/EDINET/rules/frta.py +122 -3
- arelle/plugin/validate/EDINET/rules/gfm.py +1907 -11
- arelle/plugin/validate/EDINET/rules/upload.py +989 -141
- arelle/plugin/validate/ESEF/Const.py +3 -1
- arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +5 -0
- arelle/plugin/validate/ESEF/ESEF_2021/Image.py +2 -2
- arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +23 -20
- arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +47 -14
- arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +100 -25
- arelle/plugin/validate/ESEF/__init__.py +20 -6
- arelle/plugin/validate/ESEF/resources/authority-validations.json +76 -9
- arelle/plugin/validate/ESEF/resources/config.xml +20 -0
- arelle/plugin/validate/NL/DisclosureSystems.py +22 -0
- arelle/plugin/validate/NL/PluginValidationDataExtension.py +27 -9
- arelle/plugin/validate/NL/ValidationPluginExtension.py +51 -7
- arelle/plugin/validate/NL/resources/config.xml +18 -0
- arelle/plugin/validate/NL/rules/br_kvk.py +17 -61
- arelle/plugin/validate/NL/rules/fg_nl.py +7 -38
- arelle/plugin/validate/NL/rules/fr_kvk.py +7 -42
- arelle/plugin/validate/NL/rules/fr_nl.py +31 -147
- arelle/plugin/validate/NL/rules/nl_kvk.py +142 -28
- arelle/plugin/validate/ROS/PluginValidationDataExtension.py +2 -0
- arelle/plugin/validate/ROS/ValidationPluginExtension.py +4 -1
- arelle/plugin/validate/ROS/rules/ros.py +41 -9
- arelle/plugin/validate/UK/ValidateUK.py +130 -66
- arelle/plugin/validate/UK/__init__.py +89 -103
- arelle/utils/EntryPointDetection.py +79 -13
- arelle/utils/PluginHooks.py +125 -0
- arelle/utils/validate/ESEFImage.py +6 -6
- arelle/utils/validate/Validation.py +18 -0
- arelle/utils/validate/ValidationPlugin.py +76 -11
- arelle/utils/validate/ValidationUtil.py +35 -3
- {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/METADATA +30 -20
- {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/RECORD +115 -191
- {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/licenses/LICENSE.md +0 -3
- arelle/archive/CustomLogger.py +0 -43
- arelle/archive/LoadEFMvalidate.py +0 -32
- arelle/archive/LoadSavePreLbCsv.py +0 -26
- arelle/archive/LoadValidate.cs +0 -31
- arelle/archive/LoadValidate.py +0 -36
- arelle/archive/LoadValidateCmdLine.java +0 -69
- arelle/archive/LoadValidatePostedZip.java +0 -57
- arelle/archive/LoadValidateWebService.java +0 -34
- arelle/archive/SaveTableToExelle.py +0 -140
- arelle/archive/TR3toTR4.py +0 -88
- arelle/archive/plugin/ESEF_2022/__init__.py +0 -47
- arelle/archive/plugin/bigInstance.py +0 -394
- arelle/archive/plugin/cmdWebServerExtension.py +0 -43
- arelle/archive/plugin/crashTest.py +0 -38
- arelle/archive/plugin/functionsXmlCreation.py +0 -106
- arelle/archive/plugin/hello_i18n.pot +0 -26
- arelle/archive/plugin/hello_i18n.py +0 -32
- arelle/archive/plugin/importTestChild1.py +0 -21
- arelle/archive/plugin/importTestChild2.py +0 -22
- arelle/archive/plugin/importTestGrandchild1.py +0 -21
- arelle/archive/plugin/importTestGrandchild2.py +0 -21
- arelle/archive/plugin/importTestImported1.py +0 -23
- arelle/archive/plugin/importTestImported11.py +0 -22
- arelle/archive/plugin/importTestParent.py +0 -48
- arelle/archive/plugin/instanceInfo.py +0 -306
- arelle/archive/plugin/loadFromOIM-2018.py +0 -1282
- arelle/archive/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
- arelle/archive/plugin/objectmaker.py +0 -285
- arelle/archive/plugin/packagedImportTest/__init__.py +0 -47
- arelle/archive/plugin/packagedImportTest/importTestChild1.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestChild2.py +0 -22
- arelle/archive/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestImported1.py +0 -24
- arelle/archive/plugin/packagedImportTest/importTestImported11.py +0 -21
- arelle/archive/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
- arelle/archive/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
- arelle/archive/plugin/sakaCalendar.py +0 -215
- arelle/archive/plugin/saveInstanceInfoset.py +0 -121
- arelle/archive/plugin/sphinx/FormulaGenerator.py +0 -823
- arelle/archive/plugin/sphinx/SphinxContext.py +0 -404
- arelle/archive/plugin/sphinx/SphinxEvaluator.py +0 -783
- arelle/archive/plugin/sphinx/SphinxMethods.py +0 -1287
- arelle/archive/plugin/sphinx/SphinxParser.py +0 -1093
- arelle/archive/plugin/sphinx/SphinxValidator.py +0 -163
- arelle/archive/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
- arelle/archive/plugin/sphinx/__init__.py +0 -285
- arelle/archive/plugin/streamingExtensions.py +0 -335
- arelle/archive/plugin/updateTableLB.py +0 -242
- arelle/archive/plugin/validate/SBRnl/CustomLoader.py +0 -19
- arelle/archive/plugin/validate/SBRnl/DTS.py +0 -305
- arelle/archive/plugin/validate/SBRnl/Dimensions.py +0 -357
- arelle/archive/plugin/validate/SBRnl/Document.py +0 -799
- arelle/archive/plugin/validate/SBRnl/Filing.py +0 -467
- arelle/archive/plugin/validate/SBRnl/__init__.py +0 -75
- arelle/archive/plugin/validate/SBRnl/config.xml +0 -26
- arelle/archive/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
- arelle/archive/plugin/validate/USBestPractices.py +0 -570
- arelle/archive/plugin/validate/USCorpAction.py +0 -557
- arelle/archive/plugin/validate/USSecTagging.py +0 -337
- arelle/archive/plugin/validate/XDC/__init__.py +0 -77
- arelle/archive/plugin/validate/XDC/config.xml +0 -20
- arelle/archive/plugin/validate/XFsyntax/__init__.py +0 -64
- arelle/archive/plugin/validate/XFsyntax/xf.py +0 -2227
- arelle/archive/plugin/validate/calc2.py +0 -536
- arelle/archive/plugin/validateSchemaLxml.py +0 -156
- arelle/archive/plugin/validateTableInfoset.py +0 -52
- arelle/archive/us-gaap-dei-docType-extraction-frm.xml +0 -90
- arelle/archive/us-gaap-dei-ratio-cash-frm.xml +0 -150
- arelle/examples/plugin/formulaSuiteConverter.py +0 -212
- arelle/examples/plugin/functionsCustom.py +0 -59
- arelle/examples/plugin/hello_dolly.py +0 -64
- arelle/examples/plugin/multi.py +0 -58
- arelle/examples/plugin/rssSaveOim.py +0 -96
- arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
- arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
- arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
- arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
- arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
- arelle/examples/plugin/validate/XYZ/rules/__init__.py +0 -0
- arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -110
- arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -59
- arelle/model/CommentBase.py +0 -9
- arelle/model/ElementBase.py +0 -11
- arelle/model/PIBase.py +0 -10
- arelle/model/__init__.py +0 -15
- arelle/scripts-macOS/startWebServer.command +0 -3
- arelle/scripts-unix/startWebServer.sh +0 -1
- arelle/scripts-windows/startWebServer.bat +0 -5
- {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/entry_points.txt +0 -0
- {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
|
|
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
|
|
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
|
-
|
|
167
|
-
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
+
)
|