arelle-release 2.37.65__py3-none-any.whl → 2.37.67__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.
- arelle/ViewFile.py +1 -0
- arelle/ViewFileFactTable.py +2 -2
- arelle/_version.py +2 -2
- arelle/plugin/validate/EDINET/Constants.py +4 -4
- arelle/plugin/validate/EDINET/rules/contexts.py +42 -0
- arelle/plugin/validate/EDINET/rules/edinet.py +227 -1
- arelle/plugin/validate/EDINET/rules/upload.py +3 -3
- arelle/plugin/validate/UK/__init__.py +11 -31
- {arelle_release-2.37.65.dist-info → arelle_release-2.37.67.dist-info}/METADATA +1 -1
- {arelle_release-2.37.65.dist-info → arelle_release-2.37.67.dist-info}/RECORD +14 -14
- {arelle_release-2.37.65.dist-info → arelle_release-2.37.67.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.65.dist-info → arelle_release-2.37.67.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.65.dist-info → arelle_release-2.37.67.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.65.dist-info → arelle_release-2.37.67.dist-info}/top_level.txt +0 -0
arelle/ViewFile.py
CHANGED
arelle/ViewFileFactTable.py
CHANGED
|
@@ -3,7 +3,7 @@ See COPYRIGHT.md for copyright information.
|
|
|
3
3
|
'''
|
|
4
4
|
from arelle import ViewFile, ModelDtsObject, XbrlConst, XmlUtil
|
|
5
5
|
from arelle.XbrlConst import conceptNameLabelRole, standardLabel, terseLabel, documentationLabel
|
|
6
|
-
from arelle.ViewFile import CSV, XLSX, HTML, XML, JSON
|
|
6
|
+
from arelle.ViewFile import CSV, XLSX, HTML, XML, JSON, TABULAR_VIEW_TYPES
|
|
7
7
|
import datetime
|
|
8
8
|
import regex as re
|
|
9
9
|
from collections import defaultdict
|
|
@@ -324,7 +324,7 @@ class ViewFacts(ViewFile.View):
|
|
|
324
324
|
try:
|
|
325
325
|
colId = self.contextColId[fact.context.objectId()]
|
|
326
326
|
# special case of start date, pick column corresponding
|
|
327
|
-
if preferredLabel == XbrlConst.periodStartLabel:
|
|
327
|
+
if self.type in TABULAR_VIEW_TYPES and preferredLabel == XbrlConst.periodStartLabel:
|
|
328
328
|
date = fact.context.instantDatetime
|
|
329
329
|
if date:
|
|
330
330
|
if date in self.startdatetimeColId:
|
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.
|
|
32
|
-
__version_tuple__ = version_tuple = (2, 37,
|
|
31
|
+
__version__ = version = '2.37.67'
|
|
32
|
+
__version_tuple__ = version_tuple = (2, 37, 67)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -85,8 +85,8 @@ NUMERIC_LABEL_ROLES = frozenset({
|
|
|
85
85
|
PATTERN_CODE = r'(?P<code>[A-Za-z\d]*)'
|
|
86
86
|
PATTERN_CONSOLIDATED = r'(?P<consolidated>c|n)'
|
|
87
87
|
PATTERN_COUNT = r'(?P<count>\d{2})'
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
PATTERN_PERIOD_DATE = r'(?P<period_year>\d{4})-(?P<period_month>\d{2})-(?P<period_day>\d{2})'
|
|
89
|
+
PATTERN_SUBMISSION_DATE = r'(?P<submission_year>\d{4})-(?P<submission_month>\d{2})-(?P<submission_day>\d{2})'
|
|
90
90
|
PATTERN_FORM = r'(?P<form>\d{6})'
|
|
91
91
|
PATTERN_LINKBASE = r'(?P<linkbase>lab|lab-en|gla|pre|def|cal)'
|
|
92
92
|
PATTERN_MAIN = r'(?P<main>\d{7})'
|
|
@@ -99,12 +99,12 @@ PATTERN_SERIAL = r'(?P<serial>\d{3})'
|
|
|
99
99
|
|
|
100
100
|
PATTERN_AUDIT_REPORT_PREFIX = rf'jpaud-{PATTERN_REPORT}-{PATTERN_PERIOD}{PATTERN_CONSOLIDATED}'
|
|
101
101
|
PATTERN_REPORT_PREFIX = rf'jp{PATTERN_ORDINANCE}{PATTERN_FORM}-{PATTERN_REPORT}'
|
|
102
|
-
PATTERN_SUFFIX = rf'{PATTERN_REPORT_SERIAL}_{PATTERN_CODE}-{PATTERN_SERIAL}_{
|
|
102
|
+
PATTERN_SUFFIX = rf'{PATTERN_REPORT_SERIAL}_{PATTERN_CODE}-{PATTERN_SERIAL}_{PATTERN_PERIOD_DATE}_{PATTERN_COUNT}_{PATTERN_SUBMISSION_DATE}'
|
|
103
103
|
|
|
104
104
|
PATTERN_URI_HOST = r'http:\/\/disclosure\.edinet-fsa\.go\.jp'
|
|
105
105
|
PATTERN_AUDIT_URI_PREFIX = rf'jpaud\/{PATTERN_REPORT}\/{PATTERN_PERIOD}{PATTERN_CONSOLIDATED}'
|
|
106
106
|
PATTERN_REPORT_URI_PREFIX = rf'jp{PATTERN_ORDINANCE}{PATTERN_FORM}\/{PATTERN_REPORT}'
|
|
107
|
-
PATTERN_URI_SUFFIX = rf'{PATTERN_REPORT_SERIAL}\/{PATTERN_CODE}-{PATTERN_SERIAL}\/{
|
|
107
|
+
PATTERN_URI_SUFFIX = rf'{PATTERN_REPORT_SERIAL}\/{PATTERN_CODE}-{PATTERN_SERIAL}\/{PATTERN_PERIOD_DATE}\/{PATTERN_COUNT}\/{PATTERN_SUBMISSION_DATE}'
|
|
108
108
|
|
|
109
109
|
# Extension namespace URI for report
|
|
110
110
|
# Example: http://disclosure.edinet-fsa.go.jp/jpcrp030000/asr/001/X99002-000/2025-03-31/01/2025-06-28
|
|
@@ -353,6 +353,48 @@ def rule_EC8021W(
|
|
|
353
353
|
)
|
|
354
354
|
|
|
355
355
|
|
|
356
|
+
@validation(
|
|
357
|
+
hook=ValidationHook.COMPLETE,
|
|
358
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
359
|
+
)
|
|
360
|
+
def rule_EC8032E(
|
|
361
|
+
pluginData: ControllerPluginData,
|
|
362
|
+
cntlr: Cntlr,
|
|
363
|
+
fileSource: FileSource,
|
|
364
|
+
*args: Any,
|
|
365
|
+
**kwargs: Any,
|
|
366
|
+
) -> Iterable[Validation]:
|
|
367
|
+
"""
|
|
368
|
+
EDINET.EC8032E: The first six digits of each context identifier must match the "EDINET code"
|
|
369
|
+
in the DEI information (or the "fund code" in the DEI information in the case of the Cabinet
|
|
370
|
+
Office Ordinance on Specified Securities Disclosure).
|
|
371
|
+
"""
|
|
372
|
+
localNames = ('EDINETCodeDEI', 'FundCodeDEI')
|
|
373
|
+
codes = set()
|
|
374
|
+
for localName in localNames:
|
|
375
|
+
code = pluginData.getDeiValue(localName)
|
|
376
|
+
if code is None:
|
|
377
|
+
continue
|
|
378
|
+
codes.add(str(code)[:6])
|
|
379
|
+
if len(codes) == 0:
|
|
380
|
+
# If neither code is present in the DEI, it will be caught by other validation(s).
|
|
381
|
+
return
|
|
382
|
+
for modelXbrl in pluginData.loadedModelXbrls:
|
|
383
|
+
for context in modelXbrl.contexts.values():
|
|
384
|
+
__, identifier = context.entityIdentifier
|
|
385
|
+
identifier = identifier[:6]
|
|
386
|
+
if identifier not in codes:
|
|
387
|
+
yield Validation.error(
|
|
388
|
+
codes='EDINET.EC8032E',
|
|
389
|
+
msg=_("The context identifier must match the 'EDINETCodeDEI' information in the DEI. "
|
|
390
|
+
"Please set the identifier (first six digits) of the relevant context ID so "
|
|
391
|
+
"that it matches the EDINET code of the person submitting the disclosure "
|
|
392
|
+
"documents (or the fund code in the case of the Specified Securities Disclosure "
|
|
393
|
+
"Ordinance)."),
|
|
394
|
+
modelObject=context,
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
|
|
356
398
|
@validation(
|
|
357
399
|
hook=ValidationHook.XBRL_FINALLY,
|
|
358
400
|
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
@@ -3,14 +3,18 @@ See COPYRIGHT.md for copyright information.
|
|
|
3
3
|
"""
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
+
from collections import defaultdict
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
from typing import Any, Iterable
|
|
8
9
|
|
|
9
10
|
import regex
|
|
10
11
|
from jaconv import jaconv
|
|
11
12
|
|
|
12
|
-
from arelle import XbrlConst, ValidateDuplicateFacts
|
|
13
|
+
from arelle import XbrlConst, ValidateDuplicateFacts, XmlUtil
|
|
14
|
+
from arelle.Cntlr import Cntlr
|
|
15
|
+
from arelle.FileSource import FileSource
|
|
13
16
|
from arelle.LinkbaseType import LinkbaseType
|
|
17
|
+
from arelle.ModelDtsObject import ModelResource, ModelConcept
|
|
14
18
|
from arelle.ModelValue import QName
|
|
15
19
|
from arelle.ValidateDuplicateFacts import DuplicateType
|
|
16
20
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
@@ -19,6 +23,7 @@ from arelle.utils.PluginHooks import ValidationHook
|
|
|
19
23
|
from arelle.utils.validate.Decorator import validation
|
|
20
24
|
from arelle.utils.validate.Validation import Validation
|
|
21
25
|
from ..Constants import AccountingStandard
|
|
26
|
+
from ..ControllerPluginData import ControllerPluginData
|
|
22
27
|
from ..DeiRequirements import DeiItemStatus
|
|
23
28
|
from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
|
|
24
29
|
from ..PluginValidationDataExtension import PluginValidationDataExtension
|
|
@@ -548,6 +553,227 @@ def rule_EC8027W(
|
|
|
548
553
|
)
|
|
549
554
|
|
|
550
555
|
|
|
556
|
+
@validation(
|
|
557
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
558
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
559
|
+
)
|
|
560
|
+
def rule_EC8028W(
|
|
561
|
+
pluginData: PluginValidationDataExtension,
|
|
562
|
+
val: ValidateXbrl,
|
|
563
|
+
*args: Any,
|
|
564
|
+
**kwargs: Any,
|
|
565
|
+
) -> Iterable[Validation]:
|
|
566
|
+
"""
|
|
567
|
+
EDINET.EC8028W: The priority attribute must not be duplicated for the same
|
|
568
|
+
element and label role within the submitter's taxonomy.
|
|
569
|
+
|
|
570
|
+
Note: Not mentioned in documentation, but inferring from sample filings that
|
|
571
|
+
label language should also be considered.
|
|
572
|
+
"""
|
|
573
|
+
labelsRelationshipSet = val.modelXbrl.relationshipSet(XbrlConst.conceptLabel)
|
|
574
|
+
if labelsRelationshipSet is None:
|
|
575
|
+
return
|
|
576
|
+
for concept, rels in labelsRelationshipSet.fromModelObjects().items():
|
|
577
|
+
groups = defaultdict(list)
|
|
578
|
+
for rel in rels:
|
|
579
|
+
if not isinstance(rel.toModelObject, ModelResource):
|
|
580
|
+
continue
|
|
581
|
+
if not pluginData.isExtensionUri(rel.modelDocument.uri, val.modelXbrl):
|
|
582
|
+
continue
|
|
583
|
+
groups[(rel.toModelObject.xmlLang, rel.toModelObject.role, rel.priority)].append(rel)
|
|
584
|
+
for (lang, role, priority), group in groups.items():
|
|
585
|
+
if len(group) > 1:
|
|
586
|
+
yield Validation.warning(
|
|
587
|
+
codes='EDINET.EC8028W',
|
|
588
|
+
msg=_("The priority attribute must not be duplicated for the same "
|
|
589
|
+
"element and label role in the same submitter taxonomy. "
|
|
590
|
+
"File name: '%(path)s'. Concept: '%(concept)s'. "
|
|
591
|
+
"Role: '%(role)s'. Priority: %(priority)s. "
|
|
592
|
+
"Please check the element and label name of the corresponding "
|
|
593
|
+
"file. Please set the priority attribute so that the same "
|
|
594
|
+
"element and the same label role in the submitter's taxonomy "
|
|
595
|
+
"are not duplicated."),
|
|
596
|
+
path=rels[0].document.basename,
|
|
597
|
+
concept=concept.qname,
|
|
598
|
+
role=role,
|
|
599
|
+
priority=priority,
|
|
600
|
+
modelObject=group,
|
|
601
|
+
)
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
@validation(
|
|
605
|
+
hook=ValidationHook.COMPLETE,
|
|
606
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
607
|
+
)
|
|
608
|
+
def rule_EC8029W(
|
|
609
|
+
pluginData: ControllerPluginData,
|
|
610
|
+
cntlr: Cntlr,
|
|
611
|
+
fileSource: FileSource,
|
|
612
|
+
*args: Any,
|
|
613
|
+
**kwargs: Any,
|
|
614
|
+
) -> Iterable[Validation]:
|
|
615
|
+
"""
|
|
616
|
+
EDINET.EC8029W: Any non-abstract element referenced in the definition or presentation linkbase must
|
|
617
|
+
be present in an instance.
|
|
618
|
+
"""
|
|
619
|
+
linkbaseTypes = (LinkbaseType.DEFINITION, LinkbaseType.PRESENTATION)
|
|
620
|
+
arcroles = tuple(
|
|
621
|
+
arcrole
|
|
622
|
+
for linkbaseType in linkbaseTypes
|
|
623
|
+
for arcrole in linkbaseType.getArcroles()
|
|
624
|
+
)
|
|
625
|
+
referencedConcepts: set[ModelConcept] = set()
|
|
626
|
+
usedConcepts: set[ModelConcept] = set()
|
|
627
|
+
for modelXbrl in pluginData.loadedModelXbrls:
|
|
628
|
+
usedConcepts.update(fact.concept for fact in modelXbrl.facts)
|
|
629
|
+
relSet = modelXbrl.relationshipSet(arcroles)
|
|
630
|
+
if relSet is None:
|
|
631
|
+
continue
|
|
632
|
+
concepts = list(relSet.fromModelObjects().keys()) + list(relSet.toModelObjects().keys())
|
|
633
|
+
for concept in concepts:
|
|
634
|
+
if not isinstance(concept, ModelConcept):
|
|
635
|
+
continue
|
|
636
|
+
if concept.isAbstract:
|
|
637
|
+
continue
|
|
638
|
+
referencedConcepts.add(concept)
|
|
639
|
+
unusedConcepts = referencedConcepts - usedConcepts
|
|
640
|
+
for concept in unusedConcepts:
|
|
641
|
+
yield Validation.warning(
|
|
642
|
+
codes='EDINET.EC8029W',
|
|
643
|
+
msg=_("The non-abstract element present in the presentation link or definition "
|
|
644
|
+
"link is not set in an inline XBRL file. "
|
|
645
|
+
"Element: '%(concept)s'. "
|
|
646
|
+
"Please use the element in the inline XBRL file. If it is an unnecessary "
|
|
647
|
+
"element, please delete it from the presentation link and definition link."),
|
|
648
|
+
concept=concept.qname.localName,
|
|
649
|
+
modelObject=concept,
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
@validation(
|
|
654
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
655
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
656
|
+
)
|
|
657
|
+
def rule_EC8030W(
|
|
658
|
+
pluginData: PluginValidationDataExtension,
|
|
659
|
+
val: ValidateXbrl,
|
|
660
|
+
*args: Any,
|
|
661
|
+
**kwargs: Any,
|
|
662
|
+
) -> Iterable[Validation]:
|
|
663
|
+
"""
|
|
664
|
+
EDINET.EC8030W: Any concept (other than DEI concepts) used in an instance must
|
|
665
|
+
be in the presentation linkbase.
|
|
666
|
+
"""
|
|
667
|
+
usedConcepts = pluginData.getUsedConcepts(val.modelXbrl)
|
|
668
|
+
relSet = val.modelXbrl.relationshipSet(tuple(LinkbaseType.PRESENTATION.getArcroles()))
|
|
669
|
+
for concept in usedConcepts:
|
|
670
|
+
if concept.qname.namespaceURI == pluginData.jpdeiNamespace:
|
|
671
|
+
continue
|
|
672
|
+
if concept.qname.localName.endswith('DEI'):
|
|
673
|
+
# Example: jpsps_cor:SecuritiesRegistrationStatementAmendmentFlagDeemedRegistrationStatementDEI
|
|
674
|
+
continue
|
|
675
|
+
if not relSet.contains(concept):
|
|
676
|
+
yield Validation.warning(
|
|
677
|
+
codes='EDINET.EC8030W',
|
|
678
|
+
msg=_("An element (other than DEI) set in the inline XBRL file is not set in the "
|
|
679
|
+
"presentation linkbase. "
|
|
680
|
+
"Element: '%(concept)s'. "
|
|
681
|
+
"Please set the relevant element in the presentation linkbase."),
|
|
682
|
+
concept=concept.qname.localName,
|
|
683
|
+
modelObject=concept,
|
|
684
|
+
)
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
@validation(
|
|
688
|
+
hook=ValidationHook.COMPLETE,
|
|
689
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
690
|
+
)
|
|
691
|
+
def rule_EC8031W(
|
|
692
|
+
pluginData: ControllerPluginData,
|
|
693
|
+
cntlr: Cntlr,
|
|
694
|
+
fileSource: FileSource,
|
|
695
|
+
*args: Any,
|
|
696
|
+
**kwargs: Any,
|
|
697
|
+
) -> Iterable[Validation]:
|
|
698
|
+
"""
|
|
699
|
+
EDINET.EC8031W: For contexts having an ID beginning with "FilingDate", the instant
|
|
700
|
+
date value must match the report submission date set in the file name.
|
|
701
|
+
|
|
702
|
+
However, when reporting corrections, please set the following:
|
|
703
|
+
Context beginning with "FilingDate": The submission date on the cover page of the attached inline XBRL (original submission date)
|
|
704
|
+
"Report submission date" in the file name: The submission date of the correction report, etc.
|
|
705
|
+
"""
|
|
706
|
+
isAmendment = pluginData.getDeiValue('ReportAmendmentFlagDEI')
|
|
707
|
+
if isAmendment:
|
|
708
|
+
# Amendment/corrections report are not subject to this validation, but documentation does note:
|
|
709
|
+
# However, when reporting corrections, please set the following:
|
|
710
|
+
# Context beginning with "FilingDate": The submission date on the cover page of the attached inline XBRL (original submission date)
|
|
711
|
+
# "Report submission date" in the file name: The submission date of the correction report, etc.
|
|
712
|
+
return
|
|
713
|
+
uploadContents = pluginData.getUploadContents()
|
|
714
|
+
if uploadContents is None:
|
|
715
|
+
return
|
|
716
|
+
docUris = {
|
|
717
|
+
docUri
|
|
718
|
+
for modelXbrl in pluginData.loadedModelXbrls
|
|
719
|
+
for docUri in modelXbrl.urlDocs.keys()
|
|
720
|
+
}
|
|
721
|
+
actualDates = defaultdict(set)
|
|
722
|
+
for uri in docUris:
|
|
723
|
+
path = Path(uri)
|
|
724
|
+
pathInfo = uploadContents.uploadPathsByFullPath.get(path)
|
|
725
|
+
if pathInfo is None or pathInfo.reportFolderType is None:
|
|
726
|
+
continue
|
|
727
|
+
patterns = pathInfo.reportFolderType.ixbrlFilenamePatterns
|
|
728
|
+
for pattern in patterns:
|
|
729
|
+
matches = pattern.match(path.name)
|
|
730
|
+
if not matches:
|
|
731
|
+
continue
|
|
732
|
+
groups = matches.groupdict()
|
|
733
|
+
year = groups['submission_year']
|
|
734
|
+
month = groups['submission_month']
|
|
735
|
+
day = groups['submission_day']
|
|
736
|
+
actualDate = f'{year:04}-{month:02}-{day:02}'
|
|
737
|
+
actualDates[actualDate].add(path)
|
|
738
|
+
expectedDates = defaultdict(set)
|
|
739
|
+
for modelXbrl in pluginData.loadedModelXbrls:
|
|
740
|
+
for context in modelXbrl.contexts.values():
|
|
741
|
+
if context.id is None:
|
|
742
|
+
continue
|
|
743
|
+
if not context.id.startswith("FilingDate"):
|
|
744
|
+
continue
|
|
745
|
+
if not context.isInstantPeriod:
|
|
746
|
+
continue
|
|
747
|
+
expectedDate = XmlUtil.dateunionValue(context.instantDatetime, subtractOneDay=True)[:10]
|
|
748
|
+
expectedDates[expectedDate].add(context)
|
|
749
|
+
invalidDates = {k: v for k, v in actualDates.items() if k not in expectedDates}
|
|
750
|
+
if len(invalidDates) == 0:
|
|
751
|
+
return
|
|
752
|
+
paths = [
|
|
753
|
+
path
|
|
754
|
+
for paths in invalidDates.values()
|
|
755
|
+
for path in paths
|
|
756
|
+
]
|
|
757
|
+
contexts = [
|
|
758
|
+
context
|
|
759
|
+
for contexts in expectedDates.values()
|
|
760
|
+
for context in contexts
|
|
761
|
+
]
|
|
762
|
+
for path in paths:
|
|
763
|
+
for context in contexts:
|
|
764
|
+
yield Validation.warning(
|
|
765
|
+
codes='EDINET.EC8031W',
|
|
766
|
+
msg=_("The value of the instant element in context '%(context)s' "
|
|
767
|
+
"must match the report submission date set in the file name. "
|
|
768
|
+
"File name: '%(file)s'. "
|
|
769
|
+
"Please correct the report submission date in the filename or "
|
|
770
|
+
"the instant element value for the context with ID '%(context)s'."),
|
|
771
|
+
context=context.id,
|
|
772
|
+
file=path.name,
|
|
773
|
+
modelObject=context,
|
|
774
|
+
)
|
|
775
|
+
|
|
776
|
+
|
|
551
777
|
@validation(
|
|
552
778
|
hook=ValidationHook.XBRL_FINALLY,
|
|
553
779
|
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
@@ -1117,6 +1117,9 @@ def rule_EC8023W(
|
|
|
1117
1117
|
* Tagging using Japanese GAAP notes or IFRS financial statement filer-specific additional elements
|
|
1118
1118
|
may be identified as an exception and a warning displayed, even if the data content is correct.
|
|
1119
1119
|
"""
|
|
1120
|
+
nsmap = {
|
|
1121
|
+
'ix': XbrlConst.ixbrl
|
|
1122
|
+
}
|
|
1120
1123
|
negativeFactXpath = """
|
|
1121
1124
|
//ix:nonFraction[@sign="-"][
|
|
1122
1125
|
(preceding-sibling::text()[1] and normalize-space(preceding-sibling::text()[1]) != '△')
|
|
@@ -1138,9 +1141,6 @@ def rule_EC8023W(
|
|
|
1138
1141
|
continue
|
|
1139
1142
|
if not pluginData.isExtensionUri(doc.uri, val.modelXbrl):
|
|
1140
1143
|
continue
|
|
1141
|
-
nsmap = {
|
|
1142
|
-
'ix': XbrlConst.ixbrl
|
|
1143
|
-
}
|
|
1144
1144
|
for elt in doc.xmlRootElement.xpath(negativeFactXpath, namespaces=nsmap):
|
|
1145
1145
|
if elt.qname.namespaceURI == pluginData.jpigpNamespace:
|
|
1146
1146
|
continue
|
|
@@ -38,12 +38,18 @@ IMG_URL_CSS_PROPERTIES = frozenset([
|
|
|
38
38
|
EMPTYDICT = {}
|
|
39
39
|
_6_APR_2008 = dateTime("2008-04-06", type=DATE)
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
GENERIC_DIMENSION_VALIDATIONS = {
|
|
42
|
+
# "LocalName": (range of numbers if any, first item name, 2nd choice item name if any)
|
|
43
|
+
"SpecificDiscontinuedOperation": (1, 8, "DescriptionDiscontinuedOperationOrNon-currentAssetsOrDisposalGroupHeldForSale"),
|
|
44
|
+
"SpecificNon-currentAssetsDisposalGroupHeldForSale": (1, 8, "DescriptionDiscontinuedOperationOrNon-currentAssetsOrDisposalGroupHeldForSale"),
|
|
42
45
|
"Chairman": ("NameEntityOfficer",),
|
|
43
46
|
"ChiefExecutive": ("NameEntityOfficer",),
|
|
44
47
|
"ChairmanChiefExecutive": ("NameEntityOfficer",),
|
|
45
48
|
"SeniorPartnerLimitedLiabilityPartnership": ("NameEntityOfficer",),
|
|
46
|
-
"
|
|
49
|
+
"CorporateTrustee": (1, 3, "NameEntityOfficer"),
|
|
50
|
+
"DirectorOfCorporateTrustee": ("NameEntityOfficer",),
|
|
51
|
+
"CustodianTrustee": ("NameEntityOfficer",),
|
|
52
|
+
"Trustee": (1, 20, "NameEntityOfficer",),
|
|
47
53
|
"CompanySecretary": (1, 2, "NameEntityOfficer",),
|
|
48
54
|
"CompanySecretaryDirector": (1, 2, "NameEntityOfficer",),
|
|
49
55
|
"Director": (1, 40, "NameEntityOfficer",),
|
|
@@ -60,7 +66,7 @@ COMMON_GENERIC_DIMENSIONS = {
|
|
|
60
66
|
"UnconsolidatedStructuredEntity": (1, 5, "NameUnconsolidatedStructuredEntity"),
|
|
61
67
|
"IntermediateParent": (1, 5, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
62
68
|
"EntityWithJointControlOrSignificantInfluence": (1, 5, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
63
|
-
"
|
|
69
|
+
"OtherGroupMember": (1, 8, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
64
70
|
"KeyManagementIndividualGroup": (1, 5, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
65
71
|
"CloseFamilyMember": (1, 5, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
66
72
|
"EntityControlledByKeyManagementPersonnel": (1, 5, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
@@ -77,6 +83,7 @@ COMMON_GENERIC_DIMENSIONS = {
|
|
|
77
83
|
"OtherPost-employmentBenefitPlan": (1, 2, "NameDefinedContributionPlan", "NameDefinedBenefitPlan"),
|
|
78
84
|
"OtherContractType": (1, 2, "DescriptionOtherContractType"),
|
|
79
85
|
"OtherDurationType": (1, 2, "DescriptionOtherContractDurationType"),
|
|
86
|
+
"OtherChannelType": (1, 2, "DescriptionOtherSalesChannelType"),
|
|
80
87
|
"SalesChannel": (1, 2, "DescriptionOtherSalesChannelType"),
|
|
81
88
|
}
|
|
82
89
|
|
|
@@ -115,33 +122,6 @@ MUST_HAVE_ONE_ITEM = {
|
|
|
115
122
|
}
|
|
116
123
|
}
|
|
117
124
|
|
|
118
|
-
GENERIC_DIMENSION_VALIDATION = {
|
|
119
|
-
# "taxonomyType": { "LocalName": (range of numbers if any, first item name, 2nd choice item name if any)
|
|
120
|
-
"ukGAAP": COMMON_GENERIC_DIMENSIONS,
|
|
121
|
-
"ukIFRS": COMMON_GENERIC_DIMENSIONS,
|
|
122
|
-
"charities": {
|
|
123
|
-
**COMMON_GENERIC_DIMENSIONS,
|
|
124
|
-
**{
|
|
125
|
-
"Trustee": (1, 20, "NameEntityOfficer"),
|
|
126
|
-
"CorporateTrustee": (1, 3, "NameEntityOfficer"),
|
|
127
|
-
"CustodianTrustee": (1, 3, "NameEntityOfficer"),
|
|
128
|
-
"Director1CorporateTrustee": ("NameEntityOfficer",),
|
|
129
|
-
"Director2CorporateTrustee": ("NameEntityOfficer",),
|
|
130
|
-
"Director3CorporateTrustee": ("NameEntityOfficer",),
|
|
131
|
-
"TrusteeTrustees": (1, 5, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
132
|
-
"CloseFamilyMemberTrusteeTrustees": (1, 5, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
133
|
-
"EntityControlledTrustees": (1, 5, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
|
|
134
|
-
"Activity": (1, 50, "DescriptionActivity"),
|
|
135
|
-
"MaterialFund": (1, 50, "DescriptionsMaterialFund"),
|
|
136
|
-
"LinkedCharity": (1, 5, "DescriptionActivitiesLinkedCharity"),
|
|
137
|
-
"NameGrantRecipient": (1, 50, "NameSpecificInstitutionalGrantRecipient"),
|
|
138
|
-
"ConcessionaryLoan": (1, 50, "DescriptionConcessionaryLoan"),
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
"FRS": COMMON_GENERIC_DIMENSIONS,
|
|
142
|
-
"FRS-2022": COMMON_GENERIC_DIMENSIONS
|
|
143
|
-
}
|
|
144
|
-
|
|
145
125
|
ALLOWED_IMG_MIME_TYPES = (
|
|
146
126
|
"data:image/gif;base64",
|
|
147
127
|
"data:image/jpeg;base64", "data:image/jpg;base64", # note both jpg and jpeg are in use
|
|
@@ -243,7 +223,7 @@ def validateXbrlFinally(val, *args, **kwargs):
|
|
|
243
223
|
else:
|
|
244
224
|
l = _memName
|
|
245
225
|
n = None
|
|
246
|
-
gdv =
|
|
226
|
+
gdv = GENERIC_DIMENSION_VALIDATIONS.get(l)
|
|
247
227
|
if (gdv and (n is None or
|
|
248
228
|
(isinstance(gdv[0],int) and isinstance(gdv[1],int) and n >= gdv[0] and n <= gdv[1]))):
|
|
249
229
|
gdvFacts = [f for f in gdv if isinstance(f,str)]
|
|
@@ -78,11 +78,11 @@ arelle/ValidateXbrlCalcs.py,sha256=6OMjIef6ixJGkxH-hgIRbMRJ46e52KEo-8vDyM97krc,4
|
|
|
78
78
|
arelle/ValidateXbrlDTS.py,sha256=souKOWM_i52g0mNu9TMhqqdEwXm1tDO7R2n396r_7gs,103992
|
|
79
79
|
arelle/ValidateXbrlDimensions.py,sha256=Qv7_CI65SiUcpgsnEc86XuMjKz81-170wE5dmZqnvHc,38373
|
|
80
80
|
arelle/Version.py,sha256=RjbPSSiH57VzZFhhUmEmvLsL8uSb5VwEIj2zq-krhsY,934
|
|
81
|
-
arelle/ViewFile.py,sha256=
|
|
81
|
+
arelle/ViewFile.py,sha256=e68U1PnD10dw0PSKvqZkJ6ueLLZBPPGOa75xMfGifUA,19325
|
|
82
82
|
arelle/ViewFileConcepts.py,sha256=ecIGNPhFelkpHSPzbV19w7ts8RZZsD657oYLQHtAzhk,4370
|
|
83
83
|
arelle/ViewFileDTS.py,sha256=IlbBTKFT8grC4N4cWdam8UsUaVFeiy7MfL5PdyEefvA,2029
|
|
84
84
|
arelle/ViewFileFactList.py,sha256=AVYoDJnhUoIkX7fT2D-bOrKP5g1JAwVnmSr4FYhT4iI,7194
|
|
85
|
-
arelle/ViewFileFactTable.py,sha256=
|
|
85
|
+
arelle/ViewFileFactTable.py,sha256=vgUFnImoEQTztO4m6B6mCLN1LWfGct24qSQKl36ZlXM,17069
|
|
86
86
|
arelle/ViewFileFormulae.py,sha256=753p3pAZsoxx6-3b_xR_CDFReeMBgBZOCV_TIO0FuJE,4740
|
|
87
87
|
arelle/ViewFileRelationshipSet.py,sha256=beQ6vGHJgpVwB3upofuPG0Rys2yt7GxsO4BcT96_nL8,16814
|
|
88
88
|
arelle/ViewFileRenderedGrid.py,sha256=I0Q6tyhbu1vcZvWiigAGrPK2bHv_ixsZvLr3merYPJo,14112
|
|
@@ -125,7 +125,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
|
|
|
125
125
|
arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
|
|
126
126
|
arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
|
|
127
127
|
arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
|
-
arelle/_version.py,sha256=
|
|
128
|
+
arelle/_version.py,sha256=zzJ0GRozS31txK-i2TlCJPBugIJyFCd7r0-f3yOLXY0,708
|
|
129
129
|
arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
|
|
130
130
|
arelle/api/Session.py,sha256=a71ML4FOkWxeqxQBRu6WUqkUoI4C5R6znzAQcbGR5jg,7902
|
|
131
131
|
arelle/config/creationSoftwareNames.json,sha256=5MK7XUjfDJ9OpRCCHXeOErJ1SlTBZji4WEcEOdOacx0,3128
|
|
@@ -312,7 +312,7 @@ arelle/plugin/validate/DBA/rules/tm.py,sha256=ui9oKBqlAForwkQ9kk9KBiUogTJE5pv1Rb
|
|
|
312
312
|
arelle/plugin/validate/DBA/rules/tr.py,sha256=4TootFjl0HXsKZk1XNBCyj-vnjRs4lg35hfiz_b_4wU,14684
|
|
313
313
|
arelle/plugin/validate/EBA/__init__.py,sha256=x3zXNcdSDJ3kHfL7kMs0Ve0Vs9oWbzNFVf1TK4Avmy8,45924
|
|
314
314
|
arelle/plugin/validate/EBA/config.xml,sha256=37wMVUAObK-XEqakqD8zPNog20emYt4a_yfL1AKubF8,2022
|
|
315
|
-
arelle/plugin/validate/EDINET/Constants.py,sha256=
|
|
315
|
+
arelle/plugin/validate/EDINET/Constants.py,sha256=Rdwait6p9IYxTQLhfNcyg9WhbW-_Kpg7EX2223_ty3g,8242
|
|
316
316
|
arelle/plugin/validate/EDINET/ContextRequirement.py,sha256=BejN3uz6TCSzR1qfQm-PZMbkhJlgUH9NVrY2Ux-Ph78,5217
|
|
317
317
|
arelle/plugin/validate/EDINET/ControllerPluginData.py,sha256=8FVFpqh25NaxRKWn5qlK23qD6XDUOvNXRW35O6X9hTk,11599
|
|
318
318
|
arelle/plugin/validate/EDINET/CoverItemRequirements.py,sha256=1YdzlSgc5MlUGyw81Ipv37CLxsdpSw8CO90snjgqLzw,1852
|
|
@@ -333,12 +333,12 @@ arelle/plugin/validate/EDINET/resources/cover-item-requirements.json,sha256=K5j2
|
|
|
333
333
|
arelle/plugin/validate/EDINET/resources/dei-requirements.csv,sha256=8ILKNn8bXbcgG9V0lc8mxorKDKEjJQWLdBQRMvbqtkI,6518
|
|
334
334
|
arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=YXaPu-60CI2s0S-vXcLDEXCrrukEAAHyCEk0QRhrYR8,16772
|
|
335
335
|
arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
336
|
-
arelle/plugin/validate/EDINET/rules/contexts.py,sha256=
|
|
337
|
-
arelle/plugin/validate/EDINET/rules/edinet.py,sha256=
|
|
336
|
+
arelle/plugin/validate/EDINET/rules/contexts.py,sha256=wEwIBPjEgWJHJrALxOV6qB1Lj_tws9ZnBT_twewn2js,21357
|
|
337
|
+
arelle/plugin/validate/EDINET/rules/edinet.py,sha256=Q6oId50ze-mZfmusNw18nWLXVAXdPsGuwybDKvS5YZc,34856
|
|
338
338
|
arelle/plugin/validate/EDINET/rules/frta.py,sha256=wpX5zK0IfVVYZR9ELy2g_Z_F1Jzhwd9gh_KZC5ALkLg,12756
|
|
339
339
|
arelle/plugin/validate/EDINET/rules/gfm.py,sha256=l5XHOBqyorub0LaQ7lA6oISy4oSynNFz4ilW9-Br89A,92060
|
|
340
340
|
arelle/plugin/validate/EDINET/rules/manifests.py,sha256=MoT9R_a4BzuYdQVbF7RC5wz134Ve68svSdJ3NlpO_AU,4026
|
|
341
|
-
arelle/plugin/validate/EDINET/rules/upload.py,sha256=
|
|
341
|
+
arelle/plugin/validate/EDINET/rules/upload.py,sha256=kG-zihz16ow_B6lGOYEqyH84Mx9sIqSX1_m0sSQfV3Q,52875
|
|
342
342
|
arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
|
|
343
343
|
arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
|
|
344
344
|
arelle/plugin/validate/ESEF/Util.py,sha256=QH3btcGqBpr42M7WSKZLSdNXygZaZLfEiEjlxoG21jE,7950
|
|
@@ -375,7 +375,7 @@ arelle/plugin/validate/ROS/resources/config.xml,sha256=HXWume5HlrAqOx5AtiWWqgADb
|
|
|
375
375
|
arelle/plugin/validate/ROS/rules/__init__.py,sha256=wW7BUAIb7sRkOxC1Amc_ZKrz03FM-Qh1TyZe6wxYaAU,1567
|
|
376
376
|
arelle/plugin/validate/ROS/rules/ros.py,sha256=CRZkZfsKe4y1B-PDkazQ_cD5LRZBk1GJjTscCZXXYUI,21173
|
|
377
377
|
arelle/plugin/validate/UK/ValidateUK.py,sha256=UwNR3mhFzWNn6RKLSiC7j3LlMlConOx-9gWGovKamHA,61035
|
|
378
|
-
arelle/plugin/validate/UK/__init__.py,sha256=
|
|
378
|
+
arelle/plugin/validate/UK/__init__.py,sha256=tKAcsYzwopWbhY863sZE7kmOEaQbAGSABcAouhzTPcc,26589
|
|
379
379
|
arelle/plugin/validate/UK/config.xml,sha256=mUFhWDfBzGTn7v0ZSmf4HaweQTMJh_4ZcJmD9mzCHrA,1547
|
|
380
380
|
arelle/plugin/validate/UK/consistencyChecksByName.json,sha256=BgB9YAWzmcsX-_rU74RBkABwEsS75vrMlwBHsYCz2R0,25247
|
|
381
381
|
arelle/plugin/validate/UK/hmrc-taxonomies.xml,sha256=3lR-wb2sooAddQkVqqRzG_VqLuHq_MQ8kIaXAQs1KVk,9623
|
|
@@ -688,9 +688,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=hghMQoNuC3ocs6kkNtIQPhh8QwzubwHGt
|
|
|
688
688
|
arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
689
689
|
arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
690
690
|
arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
|
|
691
|
-
arelle_release-2.37.
|
|
692
|
-
arelle_release-2.37.
|
|
693
|
-
arelle_release-2.37.
|
|
694
|
-
arelle_release-2.37.
|
|
695
|
-
arelle_release-2.37.
|
|
696
|
-
arelle_release-2.37.
|
|
691
|
+
arelle_release-2.37.67.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
|
|
692
|
+
arelle_release-2.37.67.dist-info/METADATA,sha256=Ms39kpKr3yTMuK0cNyStyDodJhuc23ItmeSdHBLcQ40,9355
|
|
693
|
+
arelle_release-2.37.67.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
694
|
+
arelle_release-2.37.67.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
|
|
695
|
+
arelle_release-2.37.67.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
|
|
696
|
+
arelle_release-2.37.67.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|