arelle-release 2.37.55__py3-none-any.whl → 2.37.57__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arelle-release might be problematic. Click here for more details.

Files changed (26) hide show
  1. arelle/CntlrCmdLine.py +1 -0
  2. arelle/ErrorManager.py +3 -0
  3. arelle/ValidateDuplicateFacts.py +1 -1
  4. arelle/XbrlConst.py +1 -0
  5. arelle/_version.py +2 -2
  6. arelle/plugin/validate/EDINET/Constants.py +0 -18
  7. arelle/plugin/validate/EDINET/ControllerPluginData.py +43 -20
  8. arelle/plugin/validate/EDINET/CoverPageRequirements.py +118 -0
  9. arelle/plugin/validate/EDINET/FilingFormat.py +253 -0
  10. arelle/plugin/validate/EDINET/FormType.py +81 -0
  11. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +146 -34
  12. arelle/plugin/validate/EDINET/UploadContents.py +18 -2
  13. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +1 -0
  14. arelle/plugin/validate/EDINET/resources/cover-page-requirements.csv +27 -0
  15. arelle/plugin/validate/EDINET/rules/edinet.py +1 -1
  16. arelle/plugin/validate/EDINET/rules/gfm.py +216 -0
  17. arelle/plugin/validate/EDINET/rules/upload.py +295 -35
  18. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +2 -0
  19. arelle/plugin/validate/ROS/ValidationPluginExtension.py +1 -0
  20. arelle/plugin/validate/ROS/rules/ros.py +39 -9
  21. {arelle_release-2.37.55.dist-info → arelle_release-2.37.57.dist-info}/METADATA +1 -1
  22. {arelle_release-2.37.55.dist-info → arelle_release-2.37.57.dist-info}/RECORD +26 -22
  23. {arelle_release-2.37.55.dist-info → arelle_release-2.37.57.dist-info}/WHEEL +0 -0
  24. {arelle_release-2.37.55.dist-info → arelle_release-2.37.57.dist-info}/entry_points.txt +0 -0
  25. {arelle_release-2.37.55.dist-info → arelle_release-2.37.57.dist-info}/licenses/LICENSE.md +0 -0
  26. {arelle_release-2.37.55.dist-info → arelle_release-2.37.57.dist-info}/top_level.txt +0 -0
arelle/CntlrCmdLine.py CHANGED
@@ -950,6 +950,7 @@ class CntlrCmdLine(Cntlr.Cntlr):
950
950
  if options.testcaseFilters:
951
951
  fo.testcaseFilters = options.testcaseFilters
952
952
  if options.testcaseResultsCaptureWarnings:
953
+ self.errorManager.setErrorCaptureLevel(logging._checkLevel("WARNING"))
953
954
  fo.testcaseResultsCaptureWarnings = True
954
955
  if options.testcaseResultOptions:
955
956
  fo.testcaseResultOptions = options.testcaseResultOptions
arelle/ErrorManager.py CHANGED
@@ -313,3 +313,6 @@ class ErrorManager:
313
313
  if isinstance(argValue, dict):
314
314
  return dict((self._loggableValue(k), self._loggableValue(v)) for k, v in argValue.items())
315
315
  return str(argValue)
316
+
317
+ def setErrorCaptureLevel(self, errorCaptureLevel: int) -> None:
318
+ self._errorCaptureLevel = errorCaptureLevel
@@ -402,7 +402,7 @@ def getAspectEqualFacts(
402
402
  fact.qname,
403
403
  (
404
404
  cast(str, fact.xmlLang or "").lower()
405
- if useLang and fact.concept.type.isWgnStringFactType
405
+ if useLang and fact.concept.type.isOimTextFactType
406
406
  else None
407
407
  ),
408
408
  )
arelle/XbrlConst.py CHANGED
@@ -139,6 +139,7 @@ qnXlLocatorType = qname("{http://www.xbrl.org/2003/XLink}xl:locatorType")
139
139
  qnXlResourceType = qname("{http://www.xbrl.org/2003/XLink}xl:resourceType")
140
140
  qnXlArcType = qname("{http://www.xbrl.org/2003/XLink}xl:arcType")
141
141
  xhtml = "http://www.w3.org/1999/xhtml"
142
+ qnXhtmlMeta = qname("{http://www.w3.org/1999/xhtml}meta")
142
143
  ixbrl = "http://www.xbrl.org/2008/inlineXBRL"
143
144
  ixbrl11 = "http://www.xbrl.org/2013/inlineXBRL"
144
145
  ixbrlAll = {ixbrl, ixbrl11}
arelle/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.37.55'
32
- __version_tuple__ = version_tuple = (2, 37, 55)
31
+ __version__ = version = '2.37.57'
32
+ __version_tuple__ = version_tuple = (2, 37, 57)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -10,25 +10,7 @@ class AccountingStandard(Enum):
10
10
  JAPAN_GAAP = 'Japan GAAP'
11
11
  US_GAAP = 'US GAAP'
12
12
 
13
- class FormType(Enum):
14
- FORM_2_4 = '第二号の四様式'
15
- FORM_2_7 = '第二号の七様式'
16
- FORM_3 = '第三号様式'
17
- FORM_4 = '第四号様式'
18
13
 
19
- @property
20
- def isStockReport(self) -> bool:
21
- return self in STOCK_REPORT_FORMS
22
-
23
- CORPORATE_FORMS =frozenset([
24
- FormType.FORM_2_4,
25
- FormType.FORM_2_7,
26
- FormType.FORM_3,
27
- ])
28
- STOCK_REPORT_FORMS = frozenset([
29
- FormType.FORM_3,
30
- FormType.FORM_4,
31
- ])
32
14
  qnEdinetManifestInsert = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}insert")
33
15
  qnEdinetManifestInstance = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}instance")
34
16
  qnEdinetManifestItem = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}item")
@@ -12,9 +12,12 @@ from typing import TYPE_CHECKING
12
12
 
13
13
  from arelle.Cntlr import Cntlr
14
14
  from arelle.FileSource import FileSource
15
+ from arelle.ModelValue import QName
15
16
  from arelle.typing import TypeGetText
16
17
  from arelle.utils.PluginData import PluginData
17
18
  from . import Constants
19
+ from .CoverPageRequirements import CoverPageRequirements
20
+ from .FilingFormat import FilingFormat
18
21
  from .ReportFolderType import ReportFolderType
19
22
  from .UploadContents import UploadContents, UploadPathInfo
20
23
 
@@ -27,12 +30,14 @@ _: TypeGetText
27
30
  @dataclass
28
31
  class ControllerPluginData(PluginData):
29
32
  _manifestInstancesById: dict[str, ManifestInstance]
33
+ _uploadContents: UploadContents | None
30
34
  _usedFilepaths: set[Path]
31
35
 
32
36
  def __init__(self, name: str):
33
37
  super().__init__(name)
34
38
  self._manifestInstancesById = {}
35
39
  self._usedFilepaths = set()
40
+ self._uploadContents = None
36
41
 
37
42
  def __hash__(self) -> int:
38
43
  return id(self)
@@ -43,24 +48,31 @@ class ControllerPluginData(PluginData):
43
48
  """
44
49
  self._manifestInstancesById[manifestInstance.id] = manifestInstance
45
50
 
51
+ @lru_cache(1)
52
+ def getCoverPageRequirements(self, csvPath: Path, coverPageItems: tuple[QName, ...], filingFormats: tuple[FilingFormat, ...]) -> CoverPageRequirements:
53
+ return CoverPageRequirements(csvPath, coverPageItems, filingFormats)
54
+
46
55
  def getManifestInstances(self) -> list[ManifestInstance]:
47
56
  """
48
57
  Retrieve all loaded manifest instances.
49
58
  """
50
59
  return list(self._manifestInstancesById.values())
51
60
 
52
- @lru_cache(1)
53
- def getUploadContents(self, fileSource: FileSource) -> UploadContents:
54
- uploadFilepaths = self.getUploadFilepaths(fileSource)
61
+ def getUploadContents(self) -> UploadContents | None:
62
+ return self._uploadContents
63
+
64
+ def setUploadContents(self, fileSource: FileSource) -> UploadContents:
55
65
  reports = defaultdict(list)
56
66
  uploadPaths = {}
57
- for path in uploadFilepaths:
67
+ for path, zipPath in self.getUploadFilepaths(fileSource).items():
58
68
  if len(path.parts) == 0:
59
69
  continue
70
+ assert isinstance(fileSource.basefile, str)
71
+ fullPath = Path(fileSource.basefile) / path
60
72
  parents = list(reversed([p.name for p in path.parents if len(p.name) > 0]))
61
73
  reportFolderType = None
62
74
  isCorrection = True
63
- isDirectory = len(path.suffix) == 0
75
+ isDirectory = zipPath.is_dir()
64
76
  isInSubdirectory = False
65
77
  reportPath = None
66
78
  if len(parents) > 0:
@@ -79,32 +91,43 @@ class ControllerPluginData(PluginData):
79
91
  if not isCorrection:
80
92
  reports[reportFolderType].append(path)
81
93
  uploadPaths[path] = UploadPathInfo(
94
+ fullPath=fullPath,
82
95
  isAttachment=reportFolderType is not None and reportFolderType.isAttachment,
83
96
  isCorrection=isCorrection,
84
97
  isCoverPage=not isDirectory and path.stem.startswith(Constants.COVER_PAGE_FILENAME_PREFIX),
85
- isDirectory=len(path.suffix) == 0,
98
+ isDirectory=isDirectory,
86
99
  isRoot=len(path.parts) == 1,
87
100
  isSubdirectory=isInSubdirectory or (isDirectory and reportFolderType is not None),
88
101
  path=path,
89
102
  reportFolderType=reportFolderType,
90
103
  reportPath=reportPath,
91
104
  )
92
- return UploadContents(
105
+ self._uploadContents = UploadContents(
93
106
  reports={k: frozenset(v) for k, v in reports.items() if len(v) > 0},
94
- uploadPaths=uploadPaths
107
+ uploadPaths=list(uploadPaths.values())
95
108
  )
109
+ return self._uploadContents
96
110
 
97
111
  @lru_cache(1)
98
- def getUploadFilepaths(self, fileSource: FileSource) -> list[Path]:
112
+ def getUploadFilepaths(self, fileSource: FileSource) -> dict[Path, zipfile.Path]:
99
113
  if not self.isUpload(fileSource):
100
- return []
101
- paths = set()
114
+ return {}
115
+ paths = {}
102
116
  assert isinstance(fileSource.fs, zipfile.ZipFile)
103
- for name in fileSource.fs.namelist():
104
- path = Path(name)
105
- paths.add(path)
106
- paths.update(path.parents)
107
- return sorted(paths)
117
+ # First, fill in paths from zip file list
118
+ for file in fileSource.fs.filelist:
119
+ zipPath = zipfile.Path(fileSource.fs, file.filename)
120
+ paths[Path(file.filename)] = zipPath
121
+ # Then, fill in any parent directories that weren't in file list
122
+ for path in list(paths):
123
+ for parent in path.parents:
124
+ if parent in paths:
125
+ continue
126
+ paths[parent] = zipfile.Path(fileSource.fs, parent.as_posix() + '/')
127
+ return {
128
+ path: paths[path]
129
+ for path in sorted(paths)
130
+ }
108
131
 
109
132
  @lru_cache(1)
110
133
  def getUploadFileSizes(self, fileSource: FileSource) -> dict[Path, int]:
@@ -131,10 +154,10 @@ class ControllerPluginData(PluginData):
131
154
  if (fileSource.fs is None or
132
155
  not isinstance(fileSource.fs, zipfile.ZipFile)):
133
156
  if fileSource.cntlr is not None:
134
- fileSource.cntlr.error(
135
- level="WARNING",
136
- codes="EDINET.uploadNotValidated",
137
- msg=_("The target file is not a zip file, so upload validation could not be performed.")
157
+ fileSource.cntlr.addToLog(
158
+ _("The target file is not a zip file, so upload validation was not performed."),
159
+ messageCode="EDINET.uploadNotValidated",
160
+ file=str(fileSource.url)
138
161
  )
139
162
  return False
140
163
  return True
@@ -0,0 +1,118 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from enum import Enum
7
+ from pathlib import Path
8
+
9
+ from arelle.ModelValue import QName
10
+ from .FilingFormat import FilingFormat
11
+
12
+
13
+ # Cover page requirements parsing is designed so that the contents of Attachment #5
14
+ # in "(Appendix) Taxonomy Extension Guideline" (ESE140111.zip), or future versions,
15
+ # can be easily exported to a CSV file where the rows correspond to Cover Page items
16
+ # andt the columns correspond to different formats.
17
+ class CoverPageRequirements:
18
+ _coverPageItems: tuple[QName, ...]
19
+ _csvPath: Path
20
+ _data: dict[QName, dict[FilingFormat, CoverPageItemStatus | None]] | None
21
+ _filingFormats: tuple[FilingFormat, ...]
22
+
23
+ def __init__(self, csvPath: Path, coverPageItems: tuple[QName, ...], filingFormats: tuple[FilingFormat, ...]):
24
+ self._coverPageItems = coverPageItems
25
+ self._csvPath = csvPath
26
+ self._data = None
27
+ self._filingFormats = filingFormats
28
+
29
+ def _load(self) -> dict[QName, dict[FilingFormat, CoverPageItemStatus | None]]:
30
+ if self._data is None:
31
+ with open(self._csvPath, encoding='utf-8') as f:
32
+ data = [
33
+ [
34
+ CoverPageItemStatus.parse(cell) for cell in line.strip().split(',')
35
+ ]
36
+ for line in f.readlines()
37
+ ]
38
+ self._data = {}
39
+ assert len(data) == len(self._coverPageItems), \
40
+ "Unexpected number of rows in cover page requirements CSV."
41
+ for rowIndex, row in enumerate(data):
42
+ assert len(row) == len(self._filingFormats), \
43
+ f"Unexpected number of columns in cover page requirements CSV at row {rowIndex}."
44
+ coverPageItem = self._coverPageItems[rowIndex]
45
+ self._data[coverPageItem] = {}
46
+ for colIndex, cell in enumerate(row):
47
+ filingFormat = self._filingFormats[colIndex]
48
+ self._data[coverPageItem][filingFormat] = cell
49
+ return self._data
50
+
51
+
52
+ def get(self, coverPageItem: QName, filingFormat: FilingFormat) -> CoverPageItemStatus | None:
53
+ data = self._load()
54
+ if coverPageItem not in data:
55
+ return None
56
+ if filingFormat not in data[coverPageItem]:
57
+ return None
58
+ return data[coverPageItem][filingFormat]
59
+
60
+
61
+ class CoverPageItemStatus(Enum):
62
+ # The values of the enum correspond to the symbols used in the spreadsheet.
63
+ PROHIBITED = '×'
64
+ OPTIONAL = '△'
65
+ CONDITIONAL = '○'
66
+ REQUIRED = '◎'
67
+
68
+ @classmethod
69
+ def parse(cls, value: str) -> CoverPageItemStatus | None:
70
+ try:
71
+ return cls(value)
72
+ except ValueError:
73
+ return None
74
+
75
+ # The below values are based on Attachment #5 in "(Appendix) Taxonomy Extension Guideline" (ESE140111.zip).
76
+ # Column D lists the elements of the cover page. Rows purely for grouping are omitted.
77
+ # The order is preserved. The index is used to map to other data structures.
78
+ COVER_PAGE_ITEM_LOCAL_NAMES = (
79
+ # Submitter Information (提出者情報)
80
+ 'EDINETCodeDEI',
81
+ 'FundCodeDEI',
82
+ 'SecurityCodeDEI',
83
+ 'FilerNameInJapaneseDEI',
84
+ 'FilerNameInEnglishDEI',
85
+ 'FundNameInJapaneseDEI',
86
+ 'FundNameInEnglishDEI',
87
+
88
+ # Document Submission Information (提出書類情報)
89
+ 'CabinetOfficeOrdinanceDEI',
90
+ 'DocumentTypeDEI',
91
+ 'AccountingStandardsDEI',
92
+ 'WhetherConsolidatedFinancialStatementsArePreparedDEI',
93
+ 'IndustryCodeWhenConsolidatedFinancialStatementsArePreparedInAccordanceWithIndustrySpecificRegulationsDEI',
94
+ 'IndustryCodeWhenFinancialStatementsArePreparedInAccordanceWithIndustrySpecificRegulationsDEI',
95
+
96
+ # Current Fiscal Year (当会計期間)
97
+ 'CurrentFiscalYearStartDateDEI',
98
+ 'CurrentPeriodEndDateDEI',
99
+ 'TypeOfCurrentPeriodDEI',
100
+ 'CurrentFiscalYearEndDateDEI',
101
+
102
+ # Previous Fiscal Year (比較対象会計期間)
103
+ 'PreviousFiscalYearStartDateDEI',
104
+ 'ComparativePeriodEndDateDEI',
105
+ 'PreviousFiscalYearEndDateDEI',
106
+
107
+ # Next Fiscal Year (次の中間期の会計期間)
108
+ 'NextFiscalYearStartDateDEI',
109
+ 'EndDateOfQuarterlyOrSemiAnnualPeriodOfNextFiscalYearDEI',
110
+
111
+ 'NumberOfSubmissionDEI',
112
+ 'AmendmentFlagDEI',
113
+ 'IdentificationOfDocumentSubjectToAmendmentDEI',
114
+
115
+ # Type of Correction (訂正の種類)
116
+ 'ReportAmendmentFlagDEI',
117
+ 'XBRLAmendmentFlagDEI',
118
+ )
@@ -0,0 +1,253 @@
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
+ # The below values are based on the "府令" ("Ordinance") column
14
+ # of Table 2-3-1 in "Framework Design of EDINET Taxonomy" (ESE140301.pdf).
15
+ DISCLOSURE = '開示府令'
16
+ SPECIFIED_SECURITIES_DISCLOSURE = '特定有価証券開示府令'
17
+ OTHER_SHARE_PURCHASE_TENDER_OFFER = '他社株買付府令'
18
+ OWN_SHARE_PURCHASE_TENDER_OFFER = '自社株買付府令'
19
+ LARGE_SHAREHOLDING = '大量保有府令'
20
+ INTERNAL_CONTROL = '内部統制府令'
21
+
22
+
23
+ class DocumentType(Enum):
24
+ # The below values are based on the "書類種別" ("Document Type") column
25
+ # of Table 2-3-1 in "Framework Design of EDINET Taxonomy" (ESE140301.pdf).
26
+ ANNUAL_SECURITIES_REPORT = '有価証券報告書'
27
+ EXTRAORDINARY_REPORT = '臨時報告書'
28
+ INTERNAL_CONTROL_REPORT = '内部統制報告書'
29
+ LARGE_SHAREHOLDING_REPORT = '大量保有報告書'
30
+ OPINION_STATEMENT = '意見表明報告書'
31
+ REPORT_ON_STATUS_OF_OWN_SHARE_REPURCHASE = '自己株券買付状況報告書'
32
+ RESPONSE_TO_QUESTIONS_REPORT = '対質問回答報告書'
33
+ SECURITIES_REGISTRATION_STATEMENT = '有価証券届出書'
34
+ SEMI_ANNUAL_REPORT = '半期報告書'
35
+ SHELF_REGISTRATION_STATEMENT = '発行登録書'
36
+ SHELF_REGISTRATION_SUPPLEMENT = '発行登録追補書類'
37
+ TENDER_OFFER_REPORT = '公開買付報告書'
38
+ TENDER_OFFER_STATEMENT = '公開買付届出書'
39
+ WITHDRAWAL_OF_TENDER_OFFER_STATEMENT = '公開買付撤回届出書'
40
+
41
+
42
+ class Taxonomy(Enum):
43
+ # The order of the below taxonomy values is based on Table 2-3-1 in
44
+ # "Framework Design of EDINET Taxonomy" (ESE140301.pdf).The same table was used to
45
+ # determine the applicable taxonomies in the FilingFormat configurations below.
46
+ # The prefixes associated with each taxonomy were inferred from the above
47
+ # document and "(Appendix) Conventions and Rules for EDINET Taxonomy" (ESE140304.pdf)
48
+ DEI = 'jpdei' # 'DEIタクソノミ'
49
+ FINANCIAL_STATEMENT = 'jppfs' # '財務諸表本表タクソノミ'
50
+ IFRS = 'jpigp' # 国際会計基準タクソノミ
51
+ DISCLOSURE_ORDINANCE = 'jpcrp' # '開示府令タクソノミ'
52
+ EXTRAORDINARY_REPORT = 'jpcrp-esr' # '臨時報告書タクソノミ'
53
+ STATUS_OF_SHARE_BUYBACKS = 'jpsps-esr' # '自己株券買付状況報告書タクソノミ'
54
+ CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE = 'jpsps' # '特定有価証券開示府令タクソノミ'
55
+ STATUS_OF_SPECIFIC_SECURITIES_TREASURY_STOCK_PURCHASES = 'jpsps-sbr' # '特定有価証券自己株券買付状況報告書タクソノミ'
56
+ SPECIFIED_SECURITIES_EXTRAORDINARY_REPORT = 'jpsps-esr' # '特定有価証券臨時報告書タクソノミ'
57
+ TENDER_OFFER_NOTIFICATION = 'jptoo-ton' # '他社株公開買付届出書タクソノミ'
58
+ OTHER_COMPANY_OPINION_STATEMENT = 'jptoo-pst' # '他社株意見表明報告書タクソノミ'
59
+ TENDER_OFFER_WITHDRAWAL_NOTIFICATION = 'jptoo-wto' # '他社株公開買付撤回届出書タクソノミ'
60
+ TENDER_OFFER_REPORT = 'jptoo-tor' # '他社株公開買付報告書タクソノミ'
61
+ OTHER_COMPANY_STOCK_QUESTION_AND_ANSWER_REPORT = 'jptoo-toa' # '他社株対質問回答報告書タクソノミ'
62
+ TENDER_OFFER = 'jptoi' # '自社株公開買付タクソノミ'
63
+ LARGE_VOLUME_HOLDINGS = 'jplvh' # '大量保有タクソノミ'
64
+ INTERNAL_CONTROL = 'jpctl' # '内部統制タクソノミ'
65
+
66
+ @classmethod
67
+ def parse(cls, value: str) -> Taxonomy | None:
68
+ try:
69
+ return cls(value)
70
+ except ValueError:
71
+ return None
72
+
73
+ @dataclass(frozen=True)
74
+ class FilingFormat:
75
+ ordinance: Ordinance
76
+ documentType: DocumentType
77
+ formType: FormType
78
+ taxonomies: frozenset[Taxonomy]
79
+
80
+ def includesTaxonomyPrefix(self, prefix: str) -> bool:
81
+ taxonomy = Taxonomy.parse(prefix.split('_')[0])
82
+ return taxonomy is not None and (
83
+ taxonomy == Taxonomy.DEI or # DEI is always included
84
+ taxonomy in self.taxonomies
85
+ )
86
+
87
+ DEFAULT_DISCLOSURE_TAXONOMIES = frozenset({
88
+ Taxonomy.FINANCIAL_STATEMENT,
89
+ Taxonomy.IFRS,
90
+ Taxonomy.DISCLOSURE_ORDINANCE,
91
+ })
92
+ DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES = frozenset({
93
+ Taxonomy.FINANCIAL_STATEMENT,
94
+ Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE,
95
+ })
96
+ FINANCIAL_STATEMENT_TAXONOMIES = frozenset({
97
+ Taxonomy.DISCLOSURE_ORDINANCE,
98
+ Taxonomy.FINANCIAL_STATEMENT,
99
+ })
100
+
101
+ # The below values are based on Table 2-3-1 in "Framework Design of EDINET Taxonomy" (ESE140301.pdf).
102
+ # The order is preserved. The index is used to map to other data structures. EDINET documentation often
103
+ # references this same list of formats in this same order.
104
+ FILING_FORMATS = (
105
+ # 開示府令
106
+
107
+ # 有価証券届出書 第二号様式
108
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2, DEFAULT_DISCLOSURE_TAXONOMIES),
109
+ # 有価証券届出書 第二号の二様式
110
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_2, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
111
+ # 有価証券届出書 第二号の三様式
112
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_3, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
113
+ # 有価証券届出書 第二号の四様式
114
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_4, DEFAULT_DISCLOSURE_TAXONOMIES),
115
+ # 有価証券届出書 第二号の五様式
116
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_5, DEFAULT_DISCLOSURE_TAXONOMIES),
117
+ # 有価証券届出書 第二号の六様式
118
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_6, DEFAULT_DISCLOSURE_TAXONOMIES),
119
+ # 有価証券届出書 第二号の七様式
120
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_2_7, DEFAULT_DISCLOSURE_TAXONOMIES),
121
+ # 有価証券報告書 第三号様式
122
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_3, DEFAULT_DISCLOSURE_TAXONOMIES),
123
+ # 有価証券報告書 第三号の二様式
124
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_3_2, DEFAULT_DISCLOSURE_TAXONOMIES),
125
+ # 有価証券報告書 第四号様式
126
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_4, DEFAULT_DISCLOSURE_TAXONOMIES),
127
+ # 半期報告書 第四号の三様式
128
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_4_3, DEFAULT_DISCLOSURE_TAXONOMIES),
129
+ # 半期報告書 第五号様式
130
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_5, DEFAULT_DISCLOSURE_TAXONOMIES),
131
+ # 半期報告書 第五号の二様式
132
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_5_2, DEFAULT_DISCLOSURE_TAXONOMIES),
133
+ # 臨時報告書 第五号の三様式
134
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.EXTRAORDINARY_REPORT, FormType.FORM_5_3, frozenset({Taxonomy.EXTRAORDINARY_REPORT})),
135
+ # 有価証券届出書 第七号様式
136
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_7, FINANCIAL_STATEMENT_TAXONOMIES),
137
+ # 有価証券届出書 第七号の四様式
138
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_7_4, FINANCIAL_STATEMENT_TAXONOMIES),
139
+ # 有価証券報告書 第八号様式
140
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_8, FINANCIAL_STATEMENT_TAXONOMIES),
141
+ # 有価証券報告書 第九号様式
142
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_9, FINANCIAL_STATEMENT_TAXONOMIES),
143
+
144
+ # 半期報告書 第九号の三様式
145
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_9_3, FINANCIAL_STATEMENT_TAXONOMIES),
146
+ # 半期報告書 第十号様式
147
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_10, FINANCIAL_STATEMENT_TAXONOMIES),
148
+ # 発行登録書 第十一号様式
149
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_11, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
150
+ # 発行登録書 第十一号の二様式
151
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_11_2, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
152
+ # 発行登録書 第十一号の二の二様式
153
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_11_2_2, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
154
+ # 発行登録追補書類 第十二号様式
155
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SHELF_REGISTRATION_SUPPLEMENT, FormType.FORM_12, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
156
+ # 発行登録追補書類 第十二号の二様式
157
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.SHELF_REGISTRATION_SUPPLEMENT, FormType.FORM_12_2, frozenset({Taxonomy.DISCLOSURE_ORDINANCE})),
158
+ # 自己株券買付状況報 告書 第十七号様式
159
+ FilingFormat(Ordinance.DISCLOSURE, DocumentType.REPORT_ON_STATUS_OF_OWN_SHARE_REPURCHASE, FormType.FORM_17, frozenset({Taxonomy.STATUS_OF_SHARE_BUYBACKS})),
160
+
161
+ # 特定有価証券開示府令
162
+
163
+ # 有価証券届出書 第四号様式
164
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_4, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
165
+ # 有価証券届出書 第四号の三様式
166
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_4_3, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
167
+ # 有価証券届出書 第四号の三の二様式
168
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_4_3_2, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
169
+ # 有価証券届出書 第四号の三の三様式
170
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_4_3_3, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
171
+ # 有価証券届出書 第五号の二様式
172
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_5_2, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
173
+ # 有価証券届出書 第五号の四様式
174
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_5_4, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
175
+ # 有価証券届出書 第六号様式
176
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_6, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
177
+ # 有価証券届出書 第六号の五様式
178
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SECURITIES_REGISTRATION_STATEMENT, FormType.FORM_6_5, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
179
+ # 有価証券報告書【みなし有価証券届出書】第六号の七及び第七号 様式 - manually switched to ANNUAL_SECURITIES_REPORT
180
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_6_7_AND_FORM_7, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
181
+ # 有価証券報告書【みなし有価証券届出書】第六号の九及び第九号 様式 - manually switched to ANNUAL_SECURITIES_REPORT
182
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_6_9_AND_FORM_9, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
183
+ # 有価証券報告書 第七号様式
184
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_7, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
185
+ # 有価証券報告書 第七号の三様式
186
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_7_3, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
187
+ # 有価証券報告書 第八号の二様式
188
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_8_2, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
189
+ # 有価証券報告書 第八号の四様式
190
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_8_4, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
191
+ # 有価証券報告書 第九号様式
192
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_9, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
193
+ # 有価証券報告書 第九号の五様式
194
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.ANNUAL_SECURITIES_REPORT, FormType.FORM_9_5, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
195
+ # 半期報告書 第十号様式
196
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_10, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
197
+ # 半期報告書 第十号の三様式
198
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_10_3, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
199
+ # 半期報告書 第十一号の二様式
200
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_11_2, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
201
+ # 半期報告書 第十一号の四様式
202
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_11_4, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
203
+ # 半期報告書 第十二号様式
204
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_12, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
205
+ # 半期報告書 第十二号の五様式
206
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SEMI_ANNUAL_REPORT, FormType.FORM_12_5, DEFAULT_SPECIFIED_SECURITIES_DISCLOSURE_TAXONOMIES),
207
+ # 発行登録書 第十五号様式
208
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_15, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
209
+ # 発行登録書 第十五号の三様式
210
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SHELF_REGISTRATION_STATEMENT, FormType.FORM_15_3, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
211
+ # 発行登録追補書類 第二十一号様式
212
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.SHELF_REGISTRATION_SUPPLEMENT, FormType.FORM_21, frozenset({Taxonomy.CABINET_OFFICE_ORDINANCE_ON_SPECIFIED_SECURITIES_DISCLOSURE})),
213
+ # 自己株券買付状況報 告書 第二十五号の三様式
214
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.REPORT_ON_STATUS_OF_OWN_SHARE_REPURCHASE, FormType.FORM_25_3, frozenset({Taxonomy.STATUS_OF_SPECIFIC_SECURITIES_TREASURY_STOCK_PURCHASES})),
215
+ # 臨時報告書
216
+ FilingFormat(Ordinance.SPECIFIED_SECURITIES_DISCLOSURE, DocumentType.EXTRAORDINARY_REPORT, FormType.NONE_SPECIFIED, frozenset({Taxonomy.SPECIFIED_SECURITIES_EXTRAORDINARY_REPORT})),
217
+
218
+ # 他社株買付府令
219
+
220
+ # 公開買付届出書 第二号様式
221
+ FilingFormat(Ordinance.OTHER_SHARE_PURCHASE_TENDER_OFFER, DocumentType.TENDER_OFFER_STATEMENT, FormType.FORM_2, frozenset({Taxonomy.TENDER_OFFER_NOTIFICATION})),
222
+ # 意見表明報告書 第四号様式
223
+ FilingFormat(Ordinance.OTHER_SHARE_PURCHASE_TENDER_OFFER, DocumentType.OPINION_STATEMENT, FormType.FORM_4, frozenset({Taxonomy.OTHER_COMPANY_OPINION_STATEMENT})),
224
+ # 公開買付撤回届出書 第五号様式
225
+ FilingFormat(Ordinance.OTHER_SHARE_PURCHASE_TENDER_OFFER, DocumentType.WITHDRAWAL_OF_TENDER_OFFER_STATEMENT, FormType.FORM_5, frozenset({Taxonomy.TENDER_OFFER_WITHDRAWAL_NOTIFICATION})),
226
+ # 公開買付報告書 第六号様式
227
+ FilingFormat(Ordinance.OTHER_SHARE_PURCHASE_TENDER_OFFER, DocumentType.TENDER_OFFER_REPORT, FormType.FORM_6, frozenset({Taxonomy.TENDER_OFFER_REPORT})),
228
+ # 対質問回答報告書 第八号様式
229
+ FilingFormat(Ordinance.OTHER_SHARE_PURCHASE_TENDER_OFFER, DocumentType.RESPONSE_TO_QUESTIONS_REPORT, FormType.FORM_8, frozenset({Taxonomy.OTHER_COMPANY_STOCK_QUESTION_AND_ANSWER_REPORT})),
230
+
231
+ # 自社株買付府令
232
+
233
+ # 公開買付届出書 第二号様式
234
+ FilingFormat(Ordinance.OWN_SHARE_PURCHASE_TENDER_OFFER, DocumentType.TENDER_OFFER_STATEMENT, FormType.FORM_2, frozenset({Taxonomy.TENDER_OFFER})),
235
+ # 公開買付撤回届出書 第三号様式
236
+ FilingFormat(Ordinance.OWN_SHARE_PURCHASE_TENDER_OFFER, DocumentType.WITHDRAWAL_OF_TENDER_OFFER_STATEMENT, FormType.FORM_3, frozenset({Taxonomy.TENDER_OFFER})),
237
+ # 公開買付報告書 第四号様式
238
+ FilingFormat(Ordinance.OWN_SHARE_PURCHASE_TENDER_OFFER, DocumentType.TENDER_OFFER_REPORT, FormType.FORM_4, frozenset({Taxonomy.TENDER_OFFER})),
239
+
240
+ # 大量保有府令
241
+
242
+ # 大量保有報告書 第一号様式
243
+ FilingFormat(Ordinance.LARGE_SHAREHOLDING, DocumentType.LARGE_SHAREHOLDING_REPORT, FormType.FORM_1, frozenset({Taxonomy.LARGE_VOLUME_HOLDINGS})),
244
+ # 大量保有報告書 第一号及び第二号様式
245
+ FilingFormat(Ordinance.LARGE_SHAREHOLDING, DocumentType.LARGE_SHAREHOLDING_REPORT, FormType.FORM_1_AND_2, frozenset({Taxonomy.LARGE_VOLUME_HOLDINGS})),
246
+ # 大量保有報告書 第三号様式
247
+ FilingFormat(Ordinance.LARGE_SHAREHOLDING, DocumentType.LARGE_SHAREHOLDING_REPORT, FormType.FORM_3, frozenset({Taxonomy.LARGE_VOLUME_HOLDINGS})),
248
+
249
+ # 内部統制府令
250
+
251
+ # 内部統制報告書 第一号様式
252
+ FilingFormat(Ordinance.INTERNAL_CONTROL, DocumentType.INTERNAL_CONTROL_REPORT, FormType.FORM_1, frozenset({Taxonomy.INTERNAL_CONTROL})),
253
+ )
@@ -0,0 +1,81 @@
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
+ @property
66
+ def isCorporateForm(self) -> bool:
67
+ return self in CORPORATE_FORMS
68
+
69
+ @property
70
+ def isStockReport(self) -> bool:
71
+ return self in STOCK_REPORT_FORMS
72
+
73
+ CORPORATE_FORMS =frozenset([
74
+ FormType.FORM_2_4,
75
+ FormType.FORM_2_7,
76
+ FormType.FORM_3,
77
+ ])
78
+ STOCK_REPORT_FORMS = frozenset([
79
+ FormType.FORM_3,
80
+ FormType.FORM_4,
81
+ ])