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 CHANGED
@@ -18,6 +18,7 @@ XLSX = 2
18
18
  HTML = 3
19
19
  XML = 4
20
20
  JSON = 5
21
+ TABULAR_VIEW_TYPES = {CSV, XLSX, HTML}
21
22
  TYPENAMES = ["NOOUT", "CSV", "XLSX", "HTML", "XML", "JSON"] # null means no output
22
23
  nonNameCharPattern = re.compile(r"[^\w\-\.:]")
23
24
 
@@ -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.65'
32
- __version_tuple__ = version_tuple = (2, 37, 65)
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
- PATTERN_DATE1 = r'(?P<year1>\d{4})-(?P<month1>\d{2})-(?P<day1>\d{2})'
89
- PATTERN_DATE2 = r'(?P<year2>\d{4})-(?P<month2>\d{2})-(?P<day2>\d{2})'
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}_{PATTERN_DATE1}_{PATTERN_COUNT}_{PATTERN_DATE2}'
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}\/{PATTERN_DATE1}\/{PATTERN_COUNT}\/{PATTERN_DATE2}'
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
- COMMON_GENERIC_DIMENSIONS = {
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
- "HighestPaidDirector": ("NameEntityOfficer",),
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
- "AnotherGroupMember": (1, 8, "NameOrDescriptionRelatedPartyIfNotDefinedByAnotherTag"),
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 = GENERIC_DIMENSION_VALIDATION.get(val.txmyType, EMPTYDICT).get(l)
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)]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.65
3
+ Version: 2.37.67
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License-Expression: Apache-2.0
@@ -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=Bvh50RAHDEauAmF0KPHWAZocMyA0UCduJ46e0wbSnPE,19286
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=I3U6XomCHE5bnbUN_WMq80LyYnPz0GRgYdRDm8Pu3tg,17013
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=ZuR2k0xha7THQ2bqrzNVBj__6Yw-TJ7U8vP_KjsG1Z4,708
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=6POa7ftTNQAV1td5WYGbzPGSXpWfAE9bfbXNFnTqfOI,8146
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=fSYIZOWg3Q3cDos17hNAvw1HUVdcZx7IlUFfBJnwjHo,19604
337
- arelle/plugin/validate/EDINET/rules/edinet.py,sha256=UhvTPfHxDuUitIAPY_4fgirAsjJG5Xfd-gH_4pMd3qI,25449
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=_MskyvWNvVYia_-KJMZQn-PPI9yN8IMhqpRzqiyzlt4,52887
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=GT67T_7qpOASzdmgRXFPmLxfPg3Gjubli7luQDK3zck,27462
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.65.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
692
- arelle_release-2.37.65.dist-info/METADATA,sha256=mzOF2EBs8Qc8HWaljQqI650UvHDftMw3JUL83k7QwCs,9355
693
- arelle_release-2.37.65.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
694
- arelle_release-2.37.65.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
695
- arelle_release-2.37.65.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
696
- arelle_release-2.37.65.dist-info/RECORD,,
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,,