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,275 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass
7
+ from enum import Enum
8
+
9
+ from .FormType import FormType
10
+
11
+
12
+ class Ordinance(Enum):
13
+ # Source: ESE140110 Guide Attachment 4
14
+ AUDIT_CERTIFICATION = 'aud'
15
+ CORPORATE_AFFAIRS = 'crp'
16
+ IFRS = 'igp'
17
+ INTERNAL_CONTROL = 'ctl'
18
+ JAPANESE_GAAP = 'pfs'
19
+ LARGE_SHAREHOLDING = 'lvh'
20
+ SPECIFIED_SECURITIES = 'sps'
21
+ TENDER_OFFERS_FOR_SHARES_OTHER = 'too'
22
+ TENDER_OFFERS_FOR_SHARES_OWN = 'toi'
23
+
24
+ @classmethod
25
+ def parse(cls, value: str | None) -> Ordinance | None:
26
+ try:
27
+ return cls(value)
28
+ except ValueError:
29
+ return None
30
+
31
+
32
+ class DocumentType(Enum):
33
+ # Source: ESE140110 Guide Attachment 4
34
+ ANNUAL_SECURITIES_REPORT = 'asr'
35
+ AUDIT_REPORT = 'aar'
36
+ EXTRAORDINARY_REPORT = 'esr'
37
+ INTERIM_AND_INTERNAL_CONTROL_AUDIT_REPORT = 'aai'
38
+ INTERIM_AUDIT_REPORT = 'sar'
39
+ INTERNAL_CONTROL_AUDIT_REPORT = 'iar'
40
+ INTERNAL_CONTROL_REPORT = 'icr'
41
+ LARGE_SHAREHOLDING_REPORT = 'lvh'
42
+ OPINION_STATEMENT = 'pst'
43
+ QUARTERLY_REPORT = 'qsr' # Deprecated?
44
+ QUARTERLY_REVIEW_REPORT = 'qrr'
45
+ RESPONSE_TO_QUESTIONS_REPORT = 'toa'
46
+ SECURITIES_REGISTRATION_STATEMENT = 'srs'
47
+ SECURITIES_REGISTRATION_STATEMENT_DEEMED = 'drs'
48
+ SEMI_ANNUAL_REPORT = 'ssr'
49
+ SHARE_REPURCHASE_STATUS_REPORT = 'sbr'
50
+ SHELF_REGISTRATION_STATEMENT = 'rst'
51
+ SHELF_REGISTRATION_SUPPLEMENT = 'rep'
52
+ TENDER_OFFER_REPORT = 'tor'
53
+ TENDER_OFFER_STATEMENT = 'ton'
54
+ TENDER_OFFER_WITHDRAWAL_NOTICE = 'wto'
55
+
56
+ @classmethod
57
+ def parse(cls, value: str | None) -> DocumentType | None:
58
+ try:
59
+ return cls(value)
60
+ except ValueError:
61
+ return None
62
+
63
+
64
+ class Taxonomy(Enum):
65
+ # The order of the below taxonomy values is based on Table 2-3-1 in
66
+ # "Framework Design of EDINET Taxonomy" (ESE140301.pdf).The same table was used to
67
+ # determine the applicable taxonomies in the FilingFormat configurations below.
68
+ # The prefixes associated with each taxonomy were inferred from the above
69
+ # document and "(Appendix) Conventions and Rules for EDINET Taxonomy" (ESE140304.pdf)
70
+ DEI = 'jpdei' # 'DEIタクソノミ'
71
+ FINANCIAL_STATEMENT = 'jppfs' # '財務諸表本表タクソノミ'
72
+ IFRS = 'jpigp' # 国際会計基準タクソノミ
73
+ DISCLOSURE_ORDINANCE = 'jpcrp' # '開示府令タクソノミ'
74
+ EXTRAORDINARY_REPORT = 'jpcrp-esr' # '臨時報告書タクソノミ'
75
+ STATUS_OF_SHARE_BUYBACKS = 'jpsps-esr' # '自己株券買付状況報告書タクソノミ'
76
+ CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE = 'jpsps' # '特定有価証券開示府令タクソノミ'
77
+ STATUS_OF_SPECIFIC_SECURITIES_TREASURY_STOCK_PURCHASES = 'jpsps-sbr' # '特定有価証券自己株券買付状況報告書タクソノミ'
78
+ SPECIFIED_SECURITIES_EXTRAORDINARY_REPORT = 'jpsps-esr' # '特定有価証券臨時報告書タクソノミ'
79
+ TENDER_OFFER_NOTIFICATION = 'jptoo-ton' # '他社株公開買付届出書タクソノミ'
80
+ OTHER_COMPANY_OPINION_STATEMENT = 'jptoo-pst' # '他社株意見表明報告書タクソノミ'
81
+ TENDER_OFFER_WITHDRAWAL_NOTIFICATION = 'jptoo-wto' # '他社株公開買付撤回届出書タクソノミ'
82
+ TENDER_OFFER_REPORT = 'jptoo-tor' # '他社株公開買付報告書タクソノミ'
83
+ OTHER_COMPANY_STOCK_QUESTION_AND_ANSWER_REPORT = 'jptoo-toa' # '他社株対質問回答報告書タクソノミ'
84
+ TENDER_OFFER = 'jptoi' # '自社株公開買付タクソノミ'
85
+ LARGE_VOLUME_HOLDINGS = 'jplvh' # '大量保有タクソノミ'
86
+ INTERNAL_CONTROL = 'jpctl' # '内部統制タクソノミ'
87
+
88
+ @classmethod
89
+ def parse(cls, value: str) -> Taxonomy | None:
90
+ try:
91
+ return cls(value)
92
+ except ValueError:
93
+ return None
94
+
95
+ @dataclass(frozen=True)
96
+ class FilingFormat:
97
+ ordinance: Ordinance
98
+ documentType: DocumentType
99
+ formType: FormType
100
+ taxonomies: frozenset[Taxonomy]
101
+
102
+ def includesTaxonomyPrefix(self, prefix: str) -> bool:
103
+ taxonomy = Taxonomy.parse(prefix.split('_')[0])
104
+ return taxonomy is not None and (
105
+ taxonomy == Taxonomy.DEI or # DEI is always included
106
+ taxonomy in self.taxonomies
107
+ )
108
+
109
+ DEFAULT_DISCLOSURE_TAXONOMIES = frozenset({
110
+ Taxonomy.FINANCIAL_STATEMENT,
111
+ Taxonomy.IFRS,
112
+ Taxonomy.DISCLOSURE_ORDINANCE,
113
+ })
114
+ DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES = frozenset({
115
+ Taxonomy.FINANCIAL_STATEMENT,
116
+ Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE,
117
+ })
118
+ FINANCIAL_STATEMENT_TAXONOMIES = frozenset({
119
+ Taxonomy.DISCLOSURE_ORDINANCE,
120
+ Taxonomy.FINANCIAL_STATEMENT,
121
+ })
122
+
123
+ # The below values are based on Table 2-3-1 in "Framework Design of EDINET Taxonomy" (ESE140301.pdf).
124
+ # The order is preserved. The index is used to map to other data structures. EDINET documentation often
125
+ # references this same list of formats in this same order.
126
+ FILING_FORMATS = (
127
+ # 開示府令
128
+
129
+ # 有価証券届出書 第二号様式
130
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2, DEFAULT_DISCLOSURE_TAXONOMIES),
131
+ # 有価証券届出書 第二号の二様式
132
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_2, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
133
+ # 有価証券届出書 第二号の三様式
134
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_3, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
135
+ # 有価証券届出書 第二号の四様式
136
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_4, DEFAULT_DISCLOSURE_TAXONOMIES),
137
+ # 有価証券届出書 第二号の五様式
138
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_5, DEFAULT_DISCLOSURE_TAXONOMIES),
139
+ # 有価証券届出書 第二号の六様式
140
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_6, DEFAULT_DISCLOSURE_TAXONOMIES),
141
+ # 有価証券届出書 第二号の七様式
142
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_7, DEFAULT_DISCLOSURE_TAXONOMIES),
143
+ # 有価証券報告書 第三号様式
144
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_3, DEFAULT_DISCLOSURE_TAXONOMIES),
145
+ # 有価証券報告書 第三号の二様式
146
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_3_2, DEFAULT_DISCLOSURE_TAXONOMIES),
147
+ # 有価証券報告書 第四号様式
148
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_4, DEFAULT_DISCLOSURE_TAXONOMIES),
149
+ # 半期報告書 第四号の三様式
150
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_4_3, DEFAULT_DISCLOSURE_TAXONOMIES),
151
+ # 半期報告書 第五号様式
152
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_5, DEFAULT_DISCLOSURE_TAXONOMIES),
153
+ # 半期報告書 第五号の二様式
154
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_5_2, DEFAULT_DISCLOSURE_TAXONOMIES),
155
+ # 臨時報告書 第五号の三様式
156
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.EXTRAORDINARY_REPORT, FormType.FORM_5_3, frozenset({Taxonomy.EXTRAORDINARY_REPORT})),
157
+ # 有価証券届出書 第七号様式
158
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_7, FINANCIAL_STATEMENT_TAXONOMIES),
159
+ # 有価証券届出書 第七号の四様式
160
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_7_4, FINANCIAL_STATEMENT_TAXONOMIES),
161
+ # 有価証券報告書 第八号様式
162
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_8, FINANCIAL_STATEMENT_TAXONOMIES),
163
+ # 有価証券報告書 第九号様式
164
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_9, FINANCIAL_STATEMENT_TAXONOMIES),
165
+
166
+ # 半期報告書 第九号の三様式
167
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_9_3, FINANCIAL_STATEMENT_TAXONOMIES),
168
+ # 半期報告書 第十号様式
169
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_10, FINANCIAL_STATEMENT_TAXONOMIES),
170
+ # 発行登録書 第十一号様式
171
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_11, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
172
+ # 発行登録書 第十一号の二様式
173
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_11_2, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
174
+ # 発行登録書 第十一号の二の二様式
175
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_11_2_2, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
176
+ # 発行登録追補書類 第十二号様式
177
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SHELF_REGISTRATION_SUPPLEMENT, FormType.FORM_12, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
178
+ # 発行登録追補書類 第十二号の二様式
179
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SHELF_REGISTRATION_SUPPLEMENT, FormType.FORM_12_2, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
180
+ # 自己株券買付状況報 告書 第十七号様式
181
+ FilingFormat(Ordinance.CORPORATE_AFFAIRS, DocumentType.SHARE_REPURCHASE_STATUS_REPORT, FormType.FORM_17, frozenset({Taxonomy.STATUS_OF_SHARE_BUYBACKS})),
182
+
183
+ # 特定有価証券開示府令
184
+
185
+ # 有価証券届出書 第四号様式
186
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_4, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
187
+ # 有価証券届出書 第四号の三様式
188
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_4_3, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
189
+ # 有価証券届出書 第四号の三の二様式
190
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_4_3_2, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
191
+ # 有価証券届出書 第四号の三の三様式
192
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_4_3_3, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
193
+ # 有価証券届出書 第五号の二様式
194
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_5_2, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
195
+ # 有価証券届出書 第五号の四様式
196
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_5_4, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
197
+ # 有価証券届出書 第六号様式
198
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_6, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
199
+ # 有価証券届出書 第六号の五様式
200
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_6_5, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
201
+ # 有価証券報告書【みなし有価証券届出書】第六号の七及び第七号 様式 - manually switched to ANNUAL_SECURITIES_REPORT
202
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_6_7_AND_FORM_7, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
203
+ # 有価証券報告書【みなし有価証券届出書】第六号の九及び第九号 様式 - manually switched to ANNUAL_SECURITIES_REPORT
204
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_6_9_AND_FORM_9, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
205
+ # 有価証券報告書 第七号様式
206
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_7, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
207
+ # 有価証券報告書 第七号の三様式
208
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_7_3, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
209
+ # 有価証券報告書 第八号の二様式
210
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_8_2, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
211
+ # 有価証券報告書 第八号の四様式
212
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_8_4, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
213
+ # 有価証券報告書 第九号様式
214
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_9, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
215
+ # 有価証券報告書 第九号の五様式
216
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_9_5, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
217
+ # 半期報告書 第十号様式
218
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_10, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
219
+ # 半期報告書 第十号の三様式
220
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_10_3, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
221
+ # 半期報告書 第十一号の二様式
222
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_11_2, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
223
+ # 半期報告書 第十一号の四様式
224
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_11_4, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
225
+ # 半期報告書 第十二号様式
226
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_12, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
227
+ # 半期報告書 第十二号の五様式
228
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_12_5, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
229
+ # 発行登録書 第十五号様式
230
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_15, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
231
+ # 発行登録書 第十五号の三様式
232
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_15_3, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
233
+ # 発行登録追補書類 第二十一号様式
234
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SHELF_REGISTRATION_SUPPLEMENT, FormType.FORM_21, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
235
+ # 自己株券買付状況報 告書 第二十五号の三様式
236
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.SHARE_REPURCHASE_STATUS_REPORT, FormType.FORM_25_3, frozenset({Taxonomy.STATUS_OF_SPECIFIC_SECURITIES_TREASURY_STOCK_PURCHASES})),
237
+ # 臨時報告書
238
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES, DocumentType.EXTRAORDINARY_REPORT, FormType.NONE_SPECIFIED, frozenset({Taxonomy.SPECIFIED_SECURITIES_EXTRAORDINARY_REPORT})),
239
+
240
+ # 他社株買付府令
241
+
242
+ # 公開買付届出書 第二号様式
243
+ FilingFormat(Ordinance.TENDER_OFFERS_FOR_SHARES_OTHER, DocumentType.TENDER_OFFER_STATEMENT, FormType.FORM_2, frozenset({Taxonomy.TENDER_OFFER_NOTIFICATION})),
244
+ # 意見表明報告書 第四号様式
245
+ FilingFormat(Ordinance.TENDER_OFFERS_FOR_SHARES_OTHER, DocumentType.OPINION_STATEMENT, FormType.FORM_4, frozenset({Taxonomy.OTHER_COMPANY_OPINION_STATEMENT})),
246
+ # 公開買付撤回届出書 第五号様式
247
+ FilingFormat(Ordinance.TENDER_OFFERS_FOR_SHARES_OTHER, DocumentType.TENDER_OFFER_WITHDRAWAL_NOTICE, FormType.FORM_5, frozenset({Taxonomy.TENDER_OFFER_WITHDRAWAL_NOTIFICATION})),
248
+ # 公開買付報告書 第六号様式
249
+ FilingFormat(Ordinance.TENDER_OFFERS_FOR_SHARES_OTHER, DocumentType.TENDER_OFFER_REPORT, FormType.FORM_6, frozenset({Taxonomy.TENDER_OFFER_REPORT})),
250
+ # 対質問回答報告書 第八号様式
251
+ FilingFormat(Ordinance.TENDER_OFFERS_FOR_SHARES_OTHER, DocumentType.RESPONSE_TO_QUESTIONS_REPORT, FormType.FORM_8, frozenset({Taxonomy.OTHER_COMPANY_STOCK_QUESTION_AND_ANSWER_REPORT})),
252
+
253
+ # 自社株買付府令
254
+
255
+ # 公開買付届出書 第二号様式
256
+ FilingFormat(Ordinance.TENDER_OFFERS_FOR_SHARES_OWN, DocumentType.TENDER_OFFER_STATEMENT, FormType.FORM_2, frozenset({Taxonomy.TENDER_OFFER})),
257
+ # 公開買付撤回届出書 第三号様式
258
+ FilingFormat(Ordinance.TENDER_OFFERS_FOR_SHARES_OWN, DocumentType.TENDER_OFFER_WITHDRAWAL_NOTICE, FormType.FORM_3, frozenset({Taxonomy.TENDER_OFFER})),
259
+ # 公開買付報告書 第四号様式
260
+ FilingFormat(Ordinance.TENDER_OFFERS_FOR_SHARES_OWN, DocumentType.TENDER_OFFER_REPORT, FormType.FORM_4, frozenset({Taxonomy.TENDER_OFFER})),
261
+
262
+ # 大量保有府令
263
+
264
+ # 大量保有報告書 第一号様式
265
+ FilingFormat(Ordinance.LARGE_SHAREHOLDING, DocumentType.LARGE_SHAREHOLDING_REPORT, FormType.FORM_1, frozenset({Taxonomy.LARGE_VOLUME_HOLDINGS})),
266
+ # 大量保有報告書 第一号及び第二号様式
267
+ FilingFormat(Ordinance.LARGE_SHAREHOLDING, DocumentType.LARGE_SHAREHOLDING_REPORT, FormType.FORM_1_AND_2, frozenset({Taxonomy.LARGE_VOLUME_HOLDINGS})),
268
+ # 大量保有報告書 第三号様式
269
+ FilingFormat(Ordinance.LARGE_SHAREHOLDING, DocumentType.LARGE_SHAREHOLDING_REPORT, FormType.FORM_3, frozenset({Taxonomy.LARGE_VOLUME_HOLDINGS})),
270
+
271
+ # 内部統制府令
272
+
273
+ # 内部統制報告書 第一号様式
274
+ FilingFormat(Ordinance.INTERNAL_CONTROL, DocumentType.INTERNAL_CONTROL_REPORT, FormType.FORM_1, frozenset({Taxonomy.INTERNAL_CONTROL})),
275
+ )
@@ -0,0 +1,134 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from enum import Enum
7
+
8
+
9
+ class FormType(Enum):
10
+ FORM_1 = '第一号様式'
11
+ FORM_1_AND_2 = '第一号及び第二号様式'
12
+ FORM_2 = '第二号様式'
13
+ FORM_2_2 = '第二号の二様式'
14
+ FORM_2_3 = '第二号の三様式'
15
+ FORM_2_4 = '第二号の四様式'
16
+ FORM_2_5 = '第二号の五様式'
17
+ FORM_2_6 = '第二号の六様式'
18
+ FORM_2_7 = '第二号の七様式'
19
+ FORM_3 = '第三号様式'
20
+ FORM_3_2 = '第三号の二様式'
21
+ FORM_4 = '第四号様式'
22
+ FORM_4_3 = '第四号の三様式'
23
+ FORM_4_3_2 = '第四号の三の二様式'
24
+ FORM_4_3_3 = '第四号の三の三様式'
25
+ FORM_5 = '第五号様式'
26
+ FORM_5_2 = '第五号の二様式'
27
+ FORM_5_3 = '第五号の三様式'
28
+ FORM_5_4 = '第五号の四様式'
29
+ FORM_6 = '第六号様式'
30
+ FORM_6_5 = '第六号の五様式'
31
+ FORM_6_7_AND_FORM_7 = '第六号の七及び第七号様式'
32
+ FORM_6_9_AND_FORM_9 = '第六号の九及び第九号様式'
33
+ FORM_7 = '第七号様式'
34
+ FORM_7_3 = '第七号の三様式'
35
+ FORM_7_4 = '第七号の四様式'
36
+ FORM_8 = '第八号様式'
37
+ FORM_8_2 = '第八号の二様式'
38
+ FORM_8_4 = '第八号の四様式'
39
+ FORM_9 = '第九号様式'
40
+ FORM_9_3 = '第九号の三様式'
41
+ FORM_9_5 = '第九号の五様式'
42
+ FORM_10 = '第十号様式'
43
+ FORM_10_3 = '第十号の三様式'
44
+ FORM_11 = '第十一号様式'
45
+ FORM_11_2 = '第十一号の二様式'
46
+ FORM_11_2_2 = '第十一号の二の二様式'
47
+ FORM_11_4 = '第十一号の四様式'
48
+ FORM_12 = '第十二号様式'
49
+ FORM_12_2 = '第十二号の二様式'
50
+ FORM_12_5 = '第十二号の五様式'
51
+ FORM_15 = '第十五号様式'
52
+ FORM_15_3 = '第十五号の三様式'
53
+ FORM_17 = '第十七号様式'
54
+ FORM_21 = '第二十一号様式'
55
+ FORM_25_3 = '第二十五号の三様式'
56
+ NONE_SPECIFIED = '様式なし'
57
+
58
+ @classmethod
59
+ def parse(cls, value: str) -> FormType | None:
60
+ try:
61
+ return cls(value)
62
+ except ValueError:
63
+ return None
64
+
65
+ @staticmethod
66
+ def lookup(code: str | None) -> FormType | None:
67
+ return FORM_CODES.get(code)
68
+
69
+ @property
70
+ def isCorporateForm(self) -> bool:
71
+ return self in CORPORATE_FORMS
72
+
73
+ @property
74
+ def isStockReport(self) -> bool:
75
+ return self in STOCK_REPORT_FORMS
76
+
77
+ CORPORATE_FORMS =frozenset([
78
+ FormType.FORM_2_4,
79
+ FormType.FORM_2_7,
80
+ FormType.FORM_3,
81
+ ])
82
+ STOCK_REPORT_FORMS = frozenset([
83
+ FormType.FORM_3,
84
+ FormType.FORM_4,
85
+ ])
86
+
87
+ FORM_CODES: dict[str | None, FormType] = {
88
+ # Source: ESE140110 Guide Attachment 4
89
+ '010000': FormType.FORM_1,
90
+ '020000': FormType.FORM_2,
91
+ '020200': FormType.FORM_2_2,
92
+ '020300': FormType.FORM_2_3,
93
+ '020400': FormType.FORM_2_4,
94
+ '020500': FormType.FORM_2_5,
95
+ '020600': FormType.FORM_2_6,
96
+ '020700': FormType.FORM_2_7,
97
+ '030000': FormType.FORM_3,
98
+ '030200': FormType.FORM_3_2,
99
+ '040000': FormType.FORM_4,
100
+ '040300': FormType.FORM_4_3,
101
+ '040302': FormType.FORM_4_3_2,
102
+ '040303': FormType.FORM_4_3_3,
103
+ '050000': FormType.FORM_5,
104
+ '050200': FormType.FORM_5_2,
105
+ '050300': FormType.FORM_5_3,
106
+ '050400': FormType.FORM_5_4,
107
+ '060000': FormType.FORM_6,
108
+ '060500': FormType.FORM_6_5,
109
+ '060700': FormType.FORM_6_7_AND_FORM_7,
110
+ '060900': FormType.FORM_6_9_AND_FORM_9,
111
+ '070000': FormType.FORM_7,
112
+ '070300': FormType.FORM_7_3,
113
+ '070400': FormType.FORM_7_4,
114
+ '080000': FormType.FORM_8,
115
+ '080200': FormType.FORM_8_2,
116
+ '080400': FormType.FORM_8_4,
117
+ '090000': FormType.FORM_9,
118
+ '090300': FormType.FORM_9_3,
119
+ '090500': FormType.FORM_9_5,
120
+ '100000': FormType.FORM_10,
121
+ '100300': FormType.FORM_10_3,
122
+ '110000': FormType.FORM_11,
123
+ '110200': FormType.FORM_11_2,
124
+ '110202': FormType.FORM_11_2_2,
125
+ '110400': FormType.FORM_11_4,
126
+ '120000': FormType.FORM_12,
127
+ '120200': FormType.FORM_12_2,
128
+ '120500': FormType.FORM_12_5,
129
+ '150000': FormType.FORM_15,
130
+ '150300': FormType.FORM_15_3,
131
+ '170000': FormType.FORM_17,
132
+ '210000': FormType.FORM_21,
133
+ '250300': FormType.FORM_25_3,
134
+ }
@@ -7,7 +7,7 @@ import traceback
7
7
  import zipfile
8
8
  from collections import defaultdict
9
9
  from dataclasses import dataclass
10
- from functools import lru_cache
10
+ from functools import lru_cache, cached_property
11
11
  from pathlib import Path
12
12
  from typing import cast
13
13
 
@@ -20,16 +20,21 @@ from arelle.FileSource import FileSource
20
20
  from arelle.ModelValue import QName, qname
21
21
  from arelle.typing import TypeGetText
22
22
  from . import Constants
23
+ from .FilingFormat import Ordinance, DocumentType, FilingFormat, FILING_FORMATS
24
+ from .FormType import FormType
25
+ from .ReportFolderType import ReportFolderType
23
26
 
24
27
  _: TypeGetText
25
28
 
26
29
 
27
30
  @dataclass(frozen=True)
28
31
  class ManifestInstance:
32
+ filingFormat: FilingFormat | None
29
33
  id: str
30
34
  ixbrlFiles: list[Path]
31
35
  path: Path
32
36
  preferredFilename: str
37
+ reportFolderType: ReportFolderType | None
33
38
  titlesByLang: dict[str, str]
34
39
  tocItems: list[ManifestTocItem]
35
40
  type: str
@@ -47,6 +52,62 @@ class ManifestTocItem:
47
52
  end: QName | None
48
53
 
49
54
 
55
+ def _getFilenameValues(reportFolderType: ReportFolderType, preferredFilename: str) -> dict[str, str]:
56
+ for pattern in reportFolderType.xbrlFilenamePatterns:
57
+ matchResult = pattern.match(preferredFilename)
58
+ if matchResult is not None:
59
+ return matchResult.groupdict()
60
+ return {}
61
+
62
+
63
+ def _identifyFilingFormat(cntlr: Cntlr, reportFolderType: ReportFolderType | None, preferredFilename: str) -> FilingFormat | None:
64
+ if reportFolderType is None or reportFolderType == ReportFolderType.AUDIT_DOC:
65
+ return None
66
+ filenameValues = _getFilenameValues(reportFolderType, preferredFilename)
67
+ documentType = DocumentType.parse(filenameValues.get('report'))
68
+ formType = FormType.lookup(filenameValues.get('form'))
69
+ ordinance = Ordinance.parse(filenameValues.get('ordinance'))
70
+ if documentType == DocumentType.SECURITIES_REGISTRATION_STATEMENT_DEEMED:
71
+ documentType = DocumentType.ANNUAL_SECURITIES_REPORT
72
+
73
+ filingFormats = []
74
+ for filingFormatIndex, filingFormat in enumerate(FILING_FORMATS):
75
+ if filingFormat.formType != formType:
76
+ continue
77
+ if filingFormat.documentType != documentType:
78
+ continue
79
+ if filingFormat.ordinance != ordinance:
80
+ continue
81
+ filingFormats.append((filingFormat, filingFormatIndex))
82
+ if len(filingFormats) == 0:
83
+ cntlr.error(
84
+ "NoMatchingEdinetFormat",
85
+ _("No matching EDINET filing formats could be identified based on form "
86
+ "type (%(formType)s) and document type (%(documentType)s)."),
87
+ formType=formType.value if formType is not None else "None",
88
+ documentType=documentType.value if documentType is not None else "None",
89
+ )
90
+ return None
91
+ if len(filingFormats) > 1:
92
+ cntlr.error(
93
+ "MultipleMatchingEdinetFormats",
94
+ _("Multiple EDINET filing formats (%(formatIndexes)s) matched based on form "
95
+ "type (%(formType)s) and document type (%(documentType)s)."),
96
+ formType=formType.value if formType is not None else "None",
97
+ documentType=documentType.value if documentType is not None else "None",
98
+ )
99
+ return None
100
+ filingFormat, filingFormatIndex = filingFormats[0]
101
+ cntlr.addToLog("Identified filing format: #{}, {}, {}, {}, {}".format(
102
+ filingFormatIndex + 1,
103
+ filingFormat.ordinance.value,
104
+ filingFormat.documentType.value,
105
+ filingFormat.formType.value,
106
+ ', '.join(taxonomy.value for taxonomy in filingFormat.taxonomies)
107
+ ), messageCode="info")
108
+ return filingFormat
109
+
110
+
50
111
  def _invalidManifestError(cntlr: Cntlr, file: str, message: str | None = None) -> None:
51
112
  if message is None:
52
113
  message = _("Please correct the content.")
@@ -78,7 +139,7 @@ def _parseManifestTocItems(parentElt: _Element, parentQName: QName | None) -> li
78
139
  return tocItems
79
140
 
80
141
 
81
- def _parseManifestDoc(xmlRootElement: _Element, path: Path) -> list[ManifestInstance]:
142
+ def _parseManifestDoc(cntlr: Cntlr, xmlRootElement: _Element, path: Path) -> list[ManifestInstance]:
82
143
  instances = []
83
144
  titlesByLang = {}
84
145
  base = path.parent
@@ -102,11 +163,17 @@ def _parseManifestDoc(xmlRootElement: _Element, path: Path) -> list[ManifestInst
102
163
  uri = ixbrlElt.text.strip() if ixbrlElt.text is not None else None
103
164
  if uri is not None and len(uri) > 0:
104
165
  ixbrlFiles.append(base / uri)
166
+
167
+ reportFolderType = ReportFolderType.parse(base.name)
168
+ filingFormat = _identifyFilingFormat(cntlr, reportFolderType, preferredFilename)
169
+
105
170
  instances.append(ManifestInstance(
171
+ filingFormat=filingFormat,
106
172
  id=instanceId,
107
173
  ixbrlFiles=ixbrlFiles,
108
174
  path=path,
109
175
  preferredFilename=preferredFilename,
176
+ reportFolderType=reportFolderType,
110
177
  titlesByLang=titlesByLang,
111
178
  tocItems=tocItemsByRef.get(instanceId, []),
112
179
  type=instanceType,
@@ -137,7 +204,7 @@ def parseManifests(filesource: FileSource) -> list[ManifestInstance]:
137
204
  try:
138
205
  with filesource.fs.open(_archiveFile) as manifestDoc:
139
206
  xmlRootElement = etree.fromstring(manifestDoc.read())
140
- instances.extend(_parseManifestDoc(xmlRootElement, Path(_archiveFile)))
207
+ instances.extend(_parseManifestDoc(cntlr, xmlRootElement, Path(_archiveFile)))
141
208
  except AssertionError as err:
142
209
  _invalidManifestError(cntlr, str(_archiveFile), str(err))
143
210
  except Exception as err:
@@ -156,7 +223,7 @@ def parseManifests(filesource: FileSource) -> list[ManifestInstance]:
156
223
  try:
157
224
  with open(file, 'rb') as manifestDoc:
158
225
  xmlRootElement = etree.fromstring(manifestDoc.read())
159
- instances.extend(_parseManifestDoc(xmlRootElement, file))
226
+ instances.extend(_parseManifestDoc(cntlr, xmlRootElement, file))
160
227
  except AssertionError as err:
161
228
  _invalidManifestError(cntlr, str(file), str(err))
162
229
  except Exception as err:
@@ -166,4 +233,4 @@ def parseManifests(filesource: FileSource) -> list[ManifestInstance]:
166
233
  err,
167
234
  traceback.format_exc()
168
235
  ))
169
- return instances
236
+ return sorted(instances, key=lambda i: i.id)
@@ -0,0 +1,50 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+
8
+ class NamespaceConfig:
9
+ def __init__(self) -> None:
10
+ self.jpcrpEsr = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/jpcrp-esr_cor"
11
+ self.jpcrp = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/jpcrp_cor"
12
+ self.jpcrpSbr = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-sbr/2024-11-01/jpcrp-sbr_cor"
13
+ self.jpctl = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpctl/2024-11-01/jpctl_cor"
14
+ self.jpdei = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor"
15
+ self.jpigp = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_cor"
16
+ self.jplvh = "http://disclosure.edinet-fsa.go.jp/taxonomy/jplvh/2024-11-01/jplvh_cor"
17
+ self.jppfs = "http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_cor"
18
+ self.jpspsEsr = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps-esr/2024-11-01/jpsps-esr_cor"
19
+ self.jpspsSbr = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps-sbr/2024-11-01/jpsps-sbr_cor"
20
+ self.jpsps = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_cor"
21
+ self.jptoi = "http://disclosure.edinet-fsa.go.jp/taxonomy/jptoi/2024-11-01/jptoi_cor"
22
+ self.jptooPst = "http://disclosure.edinet-fsa.go.jp/taxonomy/jptoo-pst/2024-11-01/jptoo-pst_cor"
23
+ self.jptooToa = "http://disclosure.edinet-fsa.go.jp/taxonomy/jptoo-toa/2024-11-01/jptoo-toa_cor"
24
+ self.jptooTon = "http://disclosure.edinet-fsa.go.jp/taxonomy/jptoo-ton/2024-11-01/jptoo-ton_cor"
25
+ self.jptooTor = "http://disclosure.edinet-fsa.go.jp/taxonomy/jptoo-tor/2024-11-01/jptoo-tor_cor"
26
+ self.jptooWto = "http://disclosure.edinet-fsa.go.jp/taxonomy/jptoo-wto/2024-11-01/jptoo-wto_cor"
27
+
28
+ self._namespaceMap = {
29
+ "jpcrp-esr_cor": self.jpcrpEsr,
30
+ "jpcrp-sbr_cor": self.jpcrpSbr,
31
+ "jpcrp_cor": self.jpcrp,
32
+ "jpctl_cor": self.jpctl,
33
+ "jpdei_cor": self.jpdei,
34
+ "jpigp_cor": self.jpigp,
35
+ "jplvh_cor": self.jplvh,
36
+ "jppfs_cor": self.jppfs,
37
+ "jpsps_cor": self.jpsps,
38
+ "jpsps-esr_cor": self.jpspsEsr,
39
+ "jpsps-sbr_cor": self.jpspsSbr,
40
+ "jptoi_cor": self.jptoi,
41
+ "jptoo-pst_cor": self.jptooPst,
42
+ "jptoo-toa_cor": self.jptooToa,
43
+ "jptoo-ton_cor": self.jptooTon,
44
+ "jptoo-tor_cor": self.jptooTor,
45
+ "jptoo-wto_cor": self.jptooWto,
46
+ }
47
+
48
+ def get(self, prefix: str) -> str | None:
49
+ """get namespace URI for prefix"""
50
+ return self._namespaceMap.get(prefix)