arelle-release 2.37.21__py3-none-any.whl → 2.37.22__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.

@@ -6,13 +6,16 @@ from __future__ import annotations
6
6
  from datetime import date
7
7
  import zipfile
8
8
 
9
+ from arelle.ModelDtsObject import ModelLink
9
10
  from arelle.ModelInstanceObject import ModelInlineFact
11
+ from arelle.ModelObject import ModelObject
12
+ from arelle.PrototypeDtsObject import PrototypeObject
10
13
  from arelle.ValidateDuplicateFacts import getDuplicateFactSets
11
14
  from arelle.XmlValidateConst import VALID
12
15
  from collections.abc import Iterable
13
16
  from typing import Any, cast, TYPE_CHECKING
14
17
 
15
- from arelle import XmlUtil, XbrlConst
18
+ from arelle import XmlUtil, XbrlConst, ModelDocument
16
19
  from arelle.ValidateXbrl import ValidateXbrl
17
20
  from arelle.typing import TypeGetText
18
21
  from arelle.utils.PluginHooks import ValidationHook
@@ -20,12 +23,16 @@ from arelle.utils.validate.Decorator import validation
20
23
  from arelle.utils.validate.Validation import Validation
21
24
  from arelle.ValidateDuplicateFacts import getHashEquivalentFactGroups, getAspectEqualFacts
22
25
  from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
23
- from ..DisclosureSystems import DISCLOSURE_SYSTEM_NL_INLINE_2024
26
+ from ..DisclosureSystems import (ALL_NL_INLINE_DISCLOSURE_SYSTEMS, NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
27
+ NL_INLINE_GAAP_OTHER_DISCLOSURE_SYSTEMS)
24
28
  from ..LinkbaseType import LinkbaseType
25
29
  from ..PluginValidationDataExtension import (PluginValidationDataExtension, ALLOWABLE_LANGUAGES,
26
- DISALLOWED_IXT_NAMESPACES, EFFECTIVE_KVK_GAAP_IFRS_ENTRYPOINT_FILES,
30
+ DEFAULT_MEMBER_ROLE_URI, DISALLOWED_IXT_NAMESPACES,
31
+ EFFECTIVE_KVK_GAAP_IFRS_ENTRYPOINT_FILES,
32
+ EFFECTIVE_KVK_GAAP_OTHER_ENTRYPOINT_FILES,
27
33
  MAX_REPORT_PACKAGE_SIZE_MBS, TAXONOMY_URLS_BY_YEAR,
28
- XBRLI_IDENTIFIER_PATTERN, XBRLI_IDENTIFIER_SCHEMA)
34
+ XBRLI_IDENTIFIER_PATTERN, XBRLI_IDENTIFIER_SCHEMA,
35
+ QN_DOMAIN_ITEM_TYPES)
29
36
 
30
37
  if TYPE_CHECKING:
31
38
  from arelle.ModelXbrl import ModelXbrl
@@ -45,9 +52,7 @@ def _getReportingPeriodDateValue(modelXbrl: ModelXbrl, qname: QName) -> date | N
45
52
 
46
53
  @validation(
47
54
  hook=ValidationHook.XBRL_FINALLY,
48
- disclosureSystems=[
49
- DISCLOSURE_SYSTEM_NL_INLINE_2024
50
- ],
55
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
51
56
  )
52
57
  def rule_nl_kvk_3_1_1_1(
53
58
  pluginData: PluginValidationDataExtension,
@@ -73,9 +78,7 @@ def rule_nl_kvk_3_1_1_1(
73
78
 
74
79
  @validation(
75
80
  hook=ValidationHook.XBRL_FINALLY,
76
- disclosureSystems=[
77
- DISCLOSURE_SYSTEM_NL_INLINE_2024
78
- ],
81
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
79
82
  )
80
83
  def rule_nl_kvk_3_1_1_2(
81
84
  pluginData: PluginValidationDataExtension,
@@ -100,9 +103,7 @@ def rule_nl_kvk_3_1_1_2(
100
103
 
101
104
  @validation(
102
105
  hook=ValidationHook.XBRL_FINALLY,
103
- disclosureSystems=[
104
- DISCLOSURE_SYSTEM_NL_INLINE_2024
105
- ],
106
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
106
107
  )
107
108
  def rule_nl_kvk_3_1_2_1(
108
109
  pluginData: PluginValidationDataExtension,
@@ -124,9 +125,7 @@ def rule_nl_kvk_3_1_2_1(
124
125
 
125
126
  @validation(
126
127
  hook=ValidationHook.XBRL_FINALLY,
127
- disclosureSystems=[
128
- DISCLOSURE_SYSTEM_NL_INLINE_2024
129
- ],
128
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
130
129
  )
131
130
  def rule_nl_kvk_3_1_2_2(
132
131
  pluginData: PluginValidationDataExtension,
@@ -148,9 +147,7 @@ def rule_nl_kvk_3_1_2_2(
148
147
 
149
148
  @validation(
150
149
  hook=ValidationHook.XBRL_FINALLY,
151
- disclosureSystems=[
152
- DISCLOSURE_SYSTEM_NL_INLINE_2024
153
- ],
150
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
154
151
  )
155
152
  def rule_nl_kvk_3_1_3_1 (
156
153
  pluginData: PluginValidationDataExtension,
@@ -172,9 +169,7 @@ def rule_nl_kvk_3_1_3_1 (
172
169
 
173
170
  @validation(
174
171
  hook=ValidationHook.XBRL_FINALLY,
175
- disclosureSystems=[
176
- DISCLOSURE_SYSTEM_NL_INLINE_2024
177
- ],
172
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
178
173
  )
179
174
  def rule_nl_kvk_3_1_3_2 (
180
175
  pluginData: PluginValidationDataExtension,
@@ -196,9 +191,7 @@ def rule_nl_kvk_3_1_3_2 (
196
191
 
197
192
  @validation(
198
193
  hook=ValidationHook.XBRL_FINALLY,
199
- disclosureSystems=[
200
- DISCLOSURE_SYSTEM_NL_INLINE_2024
201
- ],
194
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
202
195
  )
203
196
  def rule_nl_kvk_3_1_4_1 (
204
197
  pluginData: PluginValidationDataExtension,
@@ -221,9 +214,7 @@ def rule_nl_kvk_3_1_4_1 (
221
214
 
222
215
  @validation(
223
216
  hook=ValidationHook.XBRL_FINALLY,
224
- disclosureSystems=[
225
- DISCLOSURE_SYSTEM_NL_INLINE_2024
226
- ],
217
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
227
218
  )
228
219
  def rule_nl_kvk_3_1_4_2 (
229
220
  pluginData: PluginValidationDataExtension,
@@ -250,9 +241,7 @@ def rule_nl_kvk_3_1_4_2 (
250
241
 
251
242
  @validation(
252
243
  hook=ValidationHook.XBRL_FINALLY,
253
- disclosureSystems=[
254
- DISCLOSURE_SYSTEM_NL_INLINE_2024
255
- ],
244
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
256
245
  )
257
246
  def rule_nl_kvk_3_2_1_1 (
258
247
  pluginData: PluginValidationDataExtension,
@@ -277,9 +266,7 @@ def rule_nl_kvk_3_2_1_1 (
277
266
 
278
267
  @validation(
279
268
  hook=ValidationHook.XBRL_FINALLY,
280
- disclosureSystems=[
281
- DISCLOSURE_SYSTEM_NL_INLINE_2024
282
- ],
269
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
283
270
  )
284
271
  def rule_nl_kvk_3_2_3_1 (
285
272
  pluginData: PluginValidationDataExtension,
@@ -305,9 +292,7 @@ def rule_nl_kvk_3_2_3_1 (
305
292
 
306
293
  @validation(
307
294
  hook=ValidationHook.XBRL_FINALLY,
308
- disclosureSystems=[
309
- DISCLOSURE_SYSTEM_NL_INLINE_2024
310
- ],
295
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
311
296
  )
312
297
  def rule_nl_kvk_3_2_4_1 (
313
298
  pluginData: PluginValidationDataExtension,
@@ -335,9 +320,7 @@ def rule_nl_kvk_3_2_4_1 (
335
320
 
336
321
  @validation(
337
322
  hook=ValidationHook.XBRL_FINALLY,
338
- disclosureSystems=[
339
- DISCLOSURE_SYSTEM_NL_INLINE_2024
340
- ],
323
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
341
324
  )
342
325
  def rule_nl_kvk_3_2_4_2 (
343
326
  pluginData: PluginValidationDataExtension,
@@ -365,9 +348,7 @@ def rule_nl_kvk_3_2_4_2 (
365
348
 
366
349
  @validation(
367
350
  hook=ValidationHook.XBRL_FINALLY,
368
- disclosureSystems=[
369
- DISCLOSURE_SYSTEM_NL_INLINE_2024
370
- ],
351
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
371
352
  )
372
353
  def rule_nl_kvk_3_2_7_1 (
373
354
  pluginData: PluginValidationDataExtension,
@@ -394,9 +375,7 @@ def rule_nl_kvk_3_2_7_1 (
394
375
 
395
376
  @validation(
396
377
  hook=ValidationHook.XBRL_FINALLY,
397
- disclosureSystems=[
398
- DISCLOSURE_SYSTEM_NL_INLINE_2024
399
- ],
378
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
400
379
  )
401
380
  def rule_nl_kvk_3_3_1_1 (
402
381
  pluginData: PluginValidationDataExtension,
@@ -417,9 +396,7 @@ def rule_nl_kvk_3_3_1_1 (
417
396
 
418
397
  @validation(
419
398
  hook=ValidationHook.XBRL_FINALLY,
420
- disclosureSystems=[
421
- DISCLOSURE_SYSTEM_NL_INLINE_2024
422
- ],
399
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
423
400
  )
424
401
  def rule_nl_kvk_3_3_1_2 (
425
402
  pluginData: PluginValidationDataExtension,
@@ -441,9 +418,7 @@ def rule_nl_kvk_3_3_1_2 (
441
418
 
442
419
  @validation(
443
420
  hook=ValidationHook.XBRL_FINALLY,
444
- disclosureSystems=[
445
- DISCLOSURE_SYSTEM_NL_INLINE_2024
446
- ],
421
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
447
422
  )
448
423
  def rule_nl_kvk_3_3_1_3 (
449
424
  pluginData: PluginValidationDataExtension,
@@ -467,9 +442,7 @@ def rule_nl_kvk_3_3_1_3 (
467
442
 
468
443
  @validation(
469
444
  hook=ValidationHook.XBRL_FINALLY,
470
- disclosureSystems=[
471
- DISCLOSURE_SYSTEM_NL_INLINE_2024
472
- ],
445
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
473
446
  )
474
447
  def rule_nl_kvk_3_4_1_1 (
475
448
  pluginData: PluginValidationDataExtension,
@@ -491,9 +464,7 @@ def rule_nl_kvk_3_4_1_1 (
491
464
 
492
465
  @validation(
493
466
  hook=ValidationHook.XBRL_FINALLY,
494
- disclosureSystems=[
495
- DISCLOSURE_SYSTEM_NL_INLINE_2024
496
- ],
467
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
497
468
  )
498
469
  def rule_nl_kvk_3_4_1_2 (
499
470
  pluginData: PluginValidationDataExtension,
@@ -515,9 +486,7 @@ def rule_nl_kvk_3_4_1_2 (
515
486
 
516
487
  @validation(
517
488
  hook=ValidationHook.XBRL_FINALLY,
518
- disclosureSystems=[
519
- DISCLOSURE_SYSTEM_NL_INLINE_2024
520
- ],
489
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
521
490
  )
522
491
  def rule_nl_kvk_3_4_1_3 (
523
492
  pluginData: PluginValidationDataExtension,
@@ -541,9 +510,7 @@ def rule_nl_kvk_3_4_1_3 (
541
510
 
542
511
  @validation(
543
512
  hook=ValidationHook.XBRL_FINALLY,
544
- disclosureSystems=[
545
- DISCLOSURE_SYSTEM_NL_INLINE_2024
546
- ],
513
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
547
514
  )
548
515
  def rule_nl_kvk_3_4_1_4 (
549
516
  pluginData: PluginValidationDataExtension,
@@ -565,9 +532,7 @@ def rule_nl_kvk_3_4_1_4 (
565
532
 
566
533
  @validation(
567
534
  hook=ValidationHook.XBRL_FINALLY,
568
- disclosureSystems=[
569
- DISCLOSURE_SYSTEM_NL_INLINE_2024
570
- ],
535
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
571
536
  )
572
537
  def rule_nl_kvk_3_4_1_5 (
573
538
  pluginData: PluginValidationDataExtension,
@@ -589,9 +554,7 @@ def rule_nl_kvk_3_4_1_5 (
589
554
 
590
555
  @validation(
591
556
  hook=ValidationHook.XBRL_FINALLY,
592
- disclosureSystems=[
593
- DISCLOSURE_SYSTEM_NL_INLINE_2024
594
- ],
557
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
595
558
  )
596
559
  def rule_nl_kvk_3_4_2_1 (
597
560
  pluginData: PluginValidationDataExtension,
@@ -613,9 +576,7 @@ def rule_nl_kvk_3_4_2_1 (
613
576
 
614
577
  @validation(
615
578
  hook=ValidationHook.XBRL_FINALLY,
616
- disclosureSystems=[
617
- DISCLOSURE_SYSTEM_NL_INLINE_2024
618
- ],
579
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
619
580
  )
620
581
  def rule_nl_kvk_3_5_2_1(
621
582
  pluginData: PluginValidationDataExtension,
@@ -644,9 +605,7 @@ def rule_nl_kvk_3_5_2_1(
644
605
 
645
606
  @validation(
646
607
  hook=ValidationHook.XBRL_FINALLY,
647
- disclosureSystems=[
648
- DISCLOSURE_SYSTEM_NL_INLINE_2024
649
- ],
608
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
650
609
  )
651
610
  def rule_nl_kvk_3_5_2_2(
652
611
  pluginData: PluginValidationDataExtension,
@@ -675,9 +634,7 @@ def rule_nl_kvk_3_5_2_2(
675
634
 
676
635
  @validation(
677
636
  hook=ValidationHook.XBRL_FINALLY,
678
- disclosureSystems=[
679
- DISCLOSURE_SYSTEM_NL_INLINE_2024
680
- ],
637
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
681
638
  )
682
639
  def rule_nl_kvk_3_5_2_3(
683
640
  pluginData: PluginValidationDataExtension,
@@ -706,9 +663,7 @@ def rule_nl_kvk_3_5_2_3(
706
663
 
707
664
  @validation(
708
665
  hook=ValidationHook.XBRL_FINALLY,
709
- disclosureSystems=[
710
- DISCLOSURE_SYSTEM_NL_INLINE_2024
711
- ],
666
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
712
667
  )
713
668
  def rule_nl_kvk_3_5_3_1(
714
669
  pluginData: PluginValidationDataExtension,
@@ -730,9 +685,7 @@ def rule_nl_kvk_3_5_3_1(
730
685
 
731
686
  @validation(
732
687
  hook=ValidationHook.XBRL_FINALLY,
733
- disclosureSystems=[
734
- DISCLOSURE_SYSTEM_NL_INLINE_2024
735
- ],
688
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
736
689
  )
737
690
  def rule_nl_kvk_3_5_4_1 (
738
691
  pluginData: PluginValidationDataExtension,
@@ -755,9 +708,7 @@ def rule_nl_kvk_3_5_4_1 (
755
708
 
756
709
  @validation(
757
710
  hook=ValidationHook.XBRL_FINALLY,
758
- disclosureSystems=[
759
- DISCLOSURE_SYSTEM_NL_INLINE_2024
760
- ],
711
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
761
712
  )
762
713
  def rule_nl_kvk_3_6_3_1(
763
714
  pluginData: PluginValidationDataExtension,
@@ -788,9 +739,7 @@ def rule_nl_kvk_3_6_3_1(
788
739
 
789
740
  @validation(
790
741
  hook=ValidationHook.XBRL_FINALLY,
791
- disclosureSystems=[
792
- DISCLOSURE_SYSTEM_NL_INLINE_2024
793
- ],
742
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
794
743
  )
795
744
  def rule_nl_kvk_3_6_3_2(
796
745
  pluginData: PluginValidationDataExtension,
@@ -820,9 +769,7 @@ def rule_nl_kvk_3_6_3_2(
820
769
 
821
770
  @validation(
822
771
  hook=ValidationHook.XBRL_FINALLY,
823
- disclosureSystems=[
824
- DISCLOSURE_SYSTEM_NL_INLINE_2024
825
- ],
772
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
826
773
  )
827
774
  def rule_nl_kvk_3_6_3_3(
828
775
  pluginData: PluginValidationDataExtension,
@@ -850,9 +797,7 @@ def rule_nl_kvk_3_6_3_3(
850
797
 
851
798
  @validation(
852
799
  hook=ValidationHook.FINALLY,
853
- disclosureSystems=[
854
- DISCLOSURE_SYSTEM_NL_INLINE_2024
855
- ],
800
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
856
801
  )
857
802
  def rule_nl_kvk_3_7_1_1(
858
803
  pluginData: PluginValidationDataExtension,
@@ -880,9 +825,7 @@ def rule_nl_kvk_3_7_1_1(
880
825
 
881
826
  @validation(
882
827
  hook=ValidationHook.FINALLY,
883
- disclosureSystems=[
884
- DISCLOSURE_SYSTEM_NL_INLINE_2024
885
- ],
828
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
886
829
  )
887
830
  def rule_nl_kvk_3_7_1_2(
888
831
  pluginData: PluginValidationDataExtension,
@@ -910,9 +853,7 @@ def rule_nl_kvk_3_7_1_2(
910
853
 
911
854
  @validation(
912
855
  hook=ValidationHook.XBRL_FINALLY,
913
- disclosureSystems=[
914
- DISCLOSURE_SYSTEM_NL_INLINE_2024
915
- ],
856
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
916
857
  )
917
858
  def rule_nl_kvk_4_1_1_1(
918
859
  pluginData: PluginValidationDataExtension,
@@ -963,9 +904,7 @@ def rule_nl_kvk_4_1_1_1(
963
904
 
964
905
  @validation(
965
906
  hook=ValidationHook.XBRL_FINALLY,
966
- disclosureSystems=[
967
- DISCLOSURE_SYSTEM_NL_INLINE_2024
968
- ],
907
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
969
908
  )
970
909
  def rule_nl_kvk_4_1_1_2(
971
910
  pluginData: PluginValidationDataExtension,
@@ -1000,9 +939,7 @@ def rule_nl_kvk_4_1_1_2(
1000
939
 
1001
940
  @validation(
1002
941
  hook=ValidationHook.XBRL_FINALLY,
1003
- disclosureSystems=[
1004
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1005
- ],
942
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1006
943
  )
1007
944
  def rule_nl_kvk_4_1_2_1(
1008
945
  pluginData: PluginValidationDataExtension,
@@ -1027,9 +964,7 @@ def rule_nl_kvk_4_1_2_1(
1027
964
 
1028
965
  @validation(
1029
966
  hook=ValidationHook.XBRL_FINALLY,
1030
- disclosureSystems=[
1031
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1032
- ],
967
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1033
968
  )
1034
969
  def rule_nl_kvk_4_1_2_2(
1035
970
  pluginData: PluginValidationDataExtension,
@@ -1048,16 +983,15 @@ def rule_nl_kvk_4_1_2_2(
1048
983
  yield Validation.error(
1049
984
  codes='NL.NL-KVK.4.1.2.2.incorrectKvkTaxonomyVersionUsed',
1050
985
  msg=_('The extension taxonomy MUST import the applicable version of the taxonomy files prepared by KVK '
1051
- 'for the reported financial reporting period of %(reportingPeriod)s.'),
986
+ 'for the reported financial reporting period. Verify the taxonomy version and make sure '
987
+ 'that FinancialReportingPeriod are tagged correctly.'),
1052
988
  modelObject=val.modelXbrl.modelDocument
1053
989
  )
1054
990
 
1055
991
 
1056
992
  @validation(
1057
993
  hook=ValidationHook.XBRL_FINALLY,
1058
- disclosureSystems=[
1059
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1060
- ],
994
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1061
995
  )
1062
996
  def rule_nl_kvk_4_1_5_1(
1063
997
  pluginData: PluginValidationDataExtension,
@@ -1089,9 +1023,7 @@ def rule_nl_kvk_4_1_5_1(
1089
1023
 
1090
1024
  @validation(
1091
1025
  hook=ValidationHook.XBRL_FINALLY,
1092
- disclosureSystems=[
1093
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1094
- ],
1026
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1095
1027
  )
1096
1028
  def rule_nl_kvk_4_1_5_2(
1097
1029
  pluginData: PluginValidationDataExtension,
@@ -1122,9 +1054,7 @@ def rule_nl_kvk_4_1_5_2(
1122
1054
 
1123
1055
  @validation(
1124
1056
  hook=ValidationHook.XBRL_FINALLY,
1125
- disclosureSystems=[
1126
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1127
- ],
1057
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1128
1058
  )
1129
1059
  def rule_nl_kvk_4_2_0_1(
1130
1060
  pluginData: PluginValidationDataExtension,
@@ -1148,9 +1078,7 @@ def rule_nl_kvk_4_2_0_1(
1148
1078
 
1149
1079
  @validation(
1150
1080
  hook=ValidationHook.XBRL_FINALLY,
1151
- disclosureSystems=[
1152
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1153
- ],
1081
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1154
1082
  )
1155
1083
  def rule_nl_kvk_4_2_0_2(
1156
1084
  pluginData: PluginValidationDataExtension,
@@ -1174,9 +1102,7 @@ def rule_nl_kvk_4_2_0_2(
1174
1102
 
1175
1103
  @validation(
1176
1104
  hook=ValidationHook.XBRL_FINALLY,
1177
- disclosureSystems=[
1178
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1179
- ],
1105
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1180
1106
  )
1181
1107
  def rule_nl_kvk_4_2_1_1(
1182
1108
  pluginData: PluginValidationDataExtension,
@@ -1205,9 +1131,59 @@ def rule_nl_kvk_4_2_1_1(
1205
1131
 
1206
1132
  @validation(
1207
1133
  hook=ValidationHook.XBRL_FINALLY,
1208
- disclosureSystems=[
1209
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1210
- ],
1134
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1135
+ )
1136
+ def rule_nl_kvk_4_2_2_2(
1137
+ pluginData: PluginValidationDataExtension,
1138
+ val: ValidateXbrl,
1139
+ *args: Any,
1140
+ **kwargs: Any,
1141
+ ) -> Iterable[Validation]:
1142
+ """
1143
+ NL-KVK.4.2.2.2: Domain members MUST have domainItemType data type as defined in https://www.xbrl.org/dtr/type/2022-03-31/types.xsd.
1144
+ """
1145
+ domainMembersWrongType = []
1146
+ domainMembers = pluginData.getDomainMembers(val.modelXbrl)
1147
+ extensionData = pluginData.getExtensionData(val.modelXbrl)
1148
+ for concept in extensionData.extensionConcepts:
1149
+ if concept.isDomainMember and concept in domainMembers and concept.typeQname not in QN_DOMAIN_ITEM_TYPES:
1150
+ domainMembersWrongType.append(concept)
1151
+ if len(domainMembersWrongType) > 0:
1152
+ yield Validation.error(
1153
+ codes='NL.NL-KVK.4.2.2.2.domainMemberWrongDataType',
1154
+ modelObject=domainMembersWrongType,
1155
+ msg=_('Domain members must have domainItemType data type as defined in "https://www.xbrl.org/dtr/type/2022-03-31/types.xsd".'
1156
+ 'Update to follow appropriate Data Type Registry. '))
1157
+
1158
+
1159
+ @validation(
1160
+ hook=ValidationHook.XBRL_FINALLY,
1161
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1162
+ )
1163
+ def rule_nl_kvk_4_2_3_1(
1164
+ pluginData: PluginValidationDataExtension,
1165
+ val: ValidateXbrl,
1166
+ *args: Any,
1167
+ **kwargs: Any,
1168
+ ) -> Iterable[Validation]:
1169
+ """
1170
+ NL-KVK.4.2.3.1: Extension taxonomy MUST NOT define typed dimensions.
1171
+ """
1172
+ typedDims = []
1173
+ extensionData = pluginData.getExtensionData(val.modelXbrl)
1174
+ for concept in extensionData.extensionConcepts:
1175
+ if concept.isTypedDimension:
1176
+ typedDims.append(concept)
1177
+ if len(typedDims) > 0:
1178
+ yield Validation.error(
1179
+ codes='NL.NL-KVK.4.3.2.1.typedDimensionDefinitionInExtensionTaxonomy',
1180
+ modelObject=typedDims,
1181
+ msg=_('Typed dimensions are not allowed in the extension taxonomy. Update to remove the typed dimension.'))
1182
+
1183
+
1184
+ @validation(
1185
+ hook=ValidationHook.XBRL_FINALLY,
1186
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1211
1187
  )
1212
1188
  def rule_nl_kvk_4_4_1_1(
1213
1189
  pluginData: PluginValidationDataExtension,
@@ -1235,9 +1211,7 @@ def rule_nl_kvk_4_4_1_1(
1235
1211
 
1236
1212
  @validation(
1237
1213
  hook=ValidationHook.XBRL_FINALLY,
1238
- disclosureSystems=[
1239
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1240
- ],
1214
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1241
1215
  )
1242
1216
  def rule_nl_kvk_4_4_2_1(
1243
1217
  pluginData: PluginValidationDataExtension,
@@ -1264,9 +1238,7 @@ def rule_nl_kvk_4_4_2_1(
1264
1238
 
1265
1239
  @validation(
1266
1240
  hook=ValidationHook.XBRL_FINALLY,
1267
- disclosureSystems=[
1268
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1269
- ],
1241
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1270
1242
  )
1271
1243
  def rule_nl_kvk_4_4_2_2(
1272
1244
  pluginData: PluginValidationDataExtension,
@@ -1294,9 +1266,7 @@ def rule_nl_kvk_4_4_2_2(
1294
1266
 
1295
1267
  @validation(
1296
1268
  hook=ValidationHook.XBRL_FINALLY,
1297
- disclosureSystems=[
1298
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1299
- ],
1269
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1300
1270
  )
1301
1271
  def rule_nl_kvk_4_4_2_3(
1302
1272
  pluginData: PluginValidationDataExtension,
@@ -1324,9 +1294,129 @@ def rule_nl_kvk_4_4_2_3(
1324
1294
 
1325
1295
  @validation(
1326
1296
  hook=ValidationHook.XBRL_FINALLY,
1327
- disclosureSystems=[
1328
- DISCLOSURE_SYSTEM_NL_INLINE_2024
1329
- ],
1297
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1298
+ )
1299
+ def rule_nl_kvk_4_4_3_1(
1300
+ pluginData: PluginValidationDataExtension,
1301
+ val: ValidateXbrl,
1302
+ *args: Any,
1303
+ **kwargs: Any,
1304
+ ) -> Iterable[Validation]:
1305
+ """
1306
+ NL-KVK.4.4.3.1: The extension taxonomy MUST not modify (prohibit and/or override) default members assigned to dimensions by the KVK taxonomy
1307
+ """
1308
+ for modelLink in cast(list[ModelLink], val.modelXbrl.baseSets[XbrlConst.dimensionDefault, None, None, None]):
1309
+ if not pluginData.isExtensionUri(modelLink.modelDocument.uri, val.modelXbrl):
1310
+ continue
1311
+ for linkChild in modelLink:
1312
+ if (
1313
+ isinstance(linkChild,(ModelObject,PrototypeObject))
1314
+ and linkChild.get(XbrlConst.qnXlinkType.clarkNotation) == "arc"
1315
+ and linkChild.get(XbrlConst.qnXlinkArcRole.clarkNotation) == XbrlConst.dimensionDefault
1316
+ ):
1317
+ fromLabel = linkChild.get(XbrlConst.qnXlinkFrom.clarkNotation)
1318
+ for fromResource in modelLink.labeledResources[fromLabel]:
1319
+ if not pluginData.isExtensionUri(fromResource.modelDocument.uri, val.modelXbrl):
1320
+ yield Validation.error(
1321
+ codes='NL.NL-KVK.4.4.3.1.extensionTaxonomyOverridesDefaultMembers',
1322
+ msg=_('A default member does not match the default member settings of the taxonomy. '
1323
+ 'Update the default member to taxonomy defaults.'
1324
+ ),
1325
+ modelObject=linkChild
1326
+ )
1327
+ extensionData = pluginData.getExtensionData(val.modelXbrl)
1328
+ for modelDocument, extensionDocumentData in extensionData.extensionDocuments.items():
1329
+ for arc in extensionDocumentData.iterArcsByType(LinkbaseType.DEFINITION, includeArcroles={XbrlConst.dimensionDefault}):
1330
+ if arc.get("use") == "prohibited":
1331
+ yield Validation.error(
1332
+ codes='NL.NL-KVK.4.4.3.1.extensionTaxonomyOverridesDefaultMembers',
1333
+ msg=_('A default member is forbidden in the extension taxonomy. '
1334
+ 'Update the default member to taxonomy defaults.'
1335
+ ),
1336
+ modelObject=arc
1337
+ )
1338
+
1339
+
1340
+ @validation(
1341
+ hook=ValidationHook.XBRL_FINALLY,
1342
+ disclosureSystems=NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
1343
+ )
1344
+ def rule_nl_kvk_4_4_3_2(
1345
+ pluginData: PluginValidationDataExtension,
1346
+ val: ValidateXbrl,
1347
+ *args: Any,
1348
+ **kwargs: Any,
1349
+ ) -> Iterable[Validation]:
1350
+ """
1351
+ NL-KVK.4.4.3.2: Each dimension in an extension taxonomy MUST be assigned to a default member in the ELR with role URI https://www.nltaxonomie.nl/kvk/role/axis-defaults.
1352
+ """
1353
+ dimensionDefaults =val.modelXbrl.relationshipSet(XbrlConst.dimensionDefault, DEFAULT_MEMBER_ROLE_URI)
1354
+ extensionData = pluginData.getExtensionData(val.modelXbrl)
1355
+ for modelConcept in extensionData.extensionConcepts:
1356
+ if modelConcept.isExplicitDimension and not dimensionDefaults.fromModelObject(modelConcept):
1357
+ yield Validation.error(
1358
+ codes='NL.NL-KVK.4.4.2.3.extensionTaxonomyDimensionNotAssignedDefaultMemberInDedicatedPlaceholder',
1359
+ modelObject=modelConcept,
1360
+ msg=_('Axis is missing a default member or the default member does not match the taxonomy defaults. '
1361
+ 'Update to set default member based on taxonomy defaults.'
1362
+ ),
1363
+ )
1364
+
1365
+
1366
+ @validation(
1367
+ hook=ValidationHook.XBRL_FINALLY,
1368
+ disclosureSystems=NL_INLINE_GAAP_OTHER_DISCLOSURE_SYSTEMS,
1369
+ )
1370
+ def rule_nl_kvk_5_1_3_1(
1371
+ pluginData: PluginValidationDataExtension,
1372
+ val: ValidateXbrl,
1373
+ *args: Any,
1374
+ **kwargs: Any,
1375
+ ) -> Iterable[Validation]:
1376
+ """
1377
+ NL-KVK.5.1.3.1: Validate that the imported taxonomy matches the KVK-specified entry point.
1378
+ - https://www.nltaxonomie.nl/kvk/2024-12-31/kvk-annual-report-other-gaap.xsd
1379
+ """
1380
+ uris = {doc[0].uri for doc in val.modelXbrl.namespaceDocs.values()}
1381
+ matches = uris & EFFECTIVE_KVK_GAAP_OTHER_ENTRYPOINT_FILES
1382
+ if not matches:
1383
+ yield Validation.error(
1384
+ codes='NL.NL-KVK.5.1.3.1.requiredEntryPointOtherGaapNotReferenced',
1385
+ msg=_('The extension taxonomy must import the entry point of the taxonomy files prepared by KVK.'),
1386
+ modelObject=val.modelXbrl.modelDocument
1387
+ )
1388
+
1389
+
1390
+ @validation(
1391
+ hook=ValidationHook.XBRL_FINALLY,
1392
+ disclosureSystems=NL_INLINE_GAAP_OTHER_DISCLOSURE_SYSTEMS,
1393
+ )
1394
+ def rule_nl_kvk_5_1_3_2(
1395
+ pluginData: PluginValidationDataExtension,
1396
+ val: ValidateXbrl,
1397
+ *args: Any,
1398
+ **kwargs: Any,
1399
+ ) -> Iterable[Validation]:
1400
+ """
1401
+ NL-KVK.5.1.3.2: The legal entity’s report MUST import the applicable version of
1402
+ the taxonomy files prepared by KVK.
1403
+ """
1404
+ reportingPeriod = pluginData.getReportingPeriod(val.modelXbrl)
1405
+ uris = {doc[0].uri for doc in val.modelXbrl.namespaceDocs.values()}
1406
+ matches = uris & TAXONOMY_URLS_BY_YEAR.get(reportingPeriod or '', set())
1407
+ if not reportingPeriod or not matches:
1408
+ yield Validation.error(
1409
+ codes='NL.NL-KVK.5.1.3.2.incorrectVersionEntryPointOtherGaapReferenced',
1410
+ msg=_('The report MUST import the applicable version of the taxonomy files prepared by KVK '
1411
+ 'for the reported financial reporting period. Verify the taxonomy version and make sure '
1412
+ 'that FinancialReportingPeriod are tagged correctly.'),
1413
+ modelObject=val.modelXbrl.modelDocument
1414
+ )
1415
+
1416
+
1417
+ @validation(
1418
+ hook=ValidationHook.XBRL_FINALLY,
1419
+ disclosureSystems=ALL_NL_INLINE_DISCLOSURE_SYSTEMS,
1330
1420
  )
1331
1421
  def rule_nl_kvk_6_1_1_1(
1332
1422
  pluginData: PluginValidationDataExtension,