automapper-validation 0.4.0

AHB condition expression parsing, evaluation, and EDIFACT validation
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
{
  "generated_at": "2026-03-12T10:18:43Z",
  "ahb_file": "INVOIC_AHB_2_5d_Fehlerkorrektur_20250623.xml",
  "format_version": "FV2504",
  "conditions": {
    "946": {
      "confidence": "high",
      "reasoning": "Format: max 11 Nachkommastellen means at most 11 decimal places. Applied to QTY value element (elements[0][1]) following standard INVOIC QTY format validation pattern.",
      "description_hash": "425779e5",
      "is_external": false
    },
    "51": {
      "confidence": "medium",
      "reasoning": "DTM+156 in SG26 (Positionsbezogener Abrechnungszeitraum Ende) uses format 303 (CCYYMMDDHHMM). January 1, 2023 at 00:00 = \"202301010000\". Without SG26-scoped group navigation, message-wide search is used; qualifier 156 in the SG26 context is distinct from the message-level 156, but without group navigation this is the best available approximation.",
      "description_hash": "d2f3560d",
      "is_external": false
    },
    "71": {
      "confidence": "medium",
      "reasoning": "DTM+155 means elements[0][0]==\"155\". Value is at elements[0][1] in 303 format (YYYYMMDDhhmm). String comparison works for chronological ordering. Timezone nuance (German legal time) ignored — medium confidence.",
      "description_hash": "5f8d5d31",
      "is_external": false
    },
    "513": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation describing the calculation (MOA+25 * PCD+3). Always returns True.",
      "description_hash": "4c166d4b",
      "is_external": false
    },
    "902": {
      "confidence": "medium",
      "reasoning": "Format condition requiring value >= 0, applied to MOA amount (DE5004 at elements[0][1]). Medium confidence because exact segment/group context is inferred from INVOIC structure — the full AHB table row would clarify which specific MOA qualifier this applies to.",
      "description_hash": "08daa39a",
      "is_external": false
    },
    "70": {
      "confidence": "high",
      "reasoning": "IMD++Z45 means elements[0] is empty and elements[1][0]==\"Z45\". Absence check: return True when no such IMD exists.",
      "description_hash": "52af55d5",
      "is_external": false
    },
    "3": {
      "confidence": "low",
      "reasoning": "Whether a line item concerns a device purchase (Kauf) is a contract-type business context attribute, the mirror of condition [2]. Like [2], it depends on external contract type classification that cannot be reliably inferred from the EDIFACT message segments alone without authoritative product-type qualifiers.",
      "description_hash": "5786b322",
      "is_external": true
    },
    "66": {
      "confidence": "high",
      "reasoning": "IMD++KON means elements[1][0]=='KON'. has_qualifier checks this directly.",
      "description_hash": "283866f7",
      "is_external": false
    },
    "933": {
      "confidence": "high",
      "reasoning": "Format condition: HHMM = 2300 checks that the time portion of a DTM value equals 2300. Uses validate_hhmm_equals helper.",
      "description_hash": "b5e9c81e",
      "is_external": false
    },
    "521": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation documenting the origin of BGM DE1004. Always returns True.",
      "description_hash": "0ce89b2d",
      "is_external": false
    },
    "908": {
      "confidence": "medium",
      "reasoning": "Format condition requiring value in range 1..n (strictly positive). Applied to QTY quantity values in INVOIC (DE6060 at elements[0][1]). Medium confidence — the exact segment context depends on the full AHB table row.",
      "description_hash": "f0e2a917",
      "is_external": false
    },
    "523": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation describing the usage of the Steuerbare Ressource ID. Always returns True.",
      "description_hash": "9dd0a791",
      "is_external": false
    },
    "14": {
      "confidence": "high",
      "reasoning": "LIN segment DE7140 (Produkt-/Leistungsnummer) at elements[2][0]. LIN is the entry segment of SG26, so checking all LIN segments is equivalent to checking all SG26 instances. The specific value '9990001000748' identifies 'Mehrmenge'.",
      "description_hash": "620d0a10",
      "is_external": false
    },
    "19": {
      "confidence": "high",
      "reasoning": "IMD++WIM notation means elements[0] is empty, elements[1][0]='WIM'. has_qualifier checks presence.",
      "description_hash": "614348d3",
      "is_external": false
    },
    "937": {
      "confidence": "high",
      "reasoning": "Format: keine Nachkommastelle means no decimal places allowed (max 0). Applied to QTY value element (elements[0][1]) following standard INVOIC QTY format validation pattern.",
      "description_hash": "e3f49bb8",
      "is_external": false
    },
    "932": {
      "confidence": "high",
      "reasoning": "Format condition: HHMM = 2200 checks that the time portion of a DTM value equals 2200. Uses validate_hhmm_equals helper.",
      "description_hash": "943b98c4",
      "is_external": false
    },
    "4": {
      "confidence": "medium",
      "reasoning": "\"Wenn Steuerschuldnerschaft des Leistungsempfängers vorliegt\" is the reverse charge mechanism. In UN/EDIFACT INVOIC, TAX category code \"AE\" (VAT Reverse Charge) signals this. The TAX segment composite C241 component 3 holds the tax category code. Medium confidence because element indices are derived from standard UN/EDIFACT TAX structure without a specific MIG segment structure reference to confirm the exact index for this INVOIC variant.",
      "description_hash": "7206c88b",
      "is_external": false
    },
    "524": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation about cardinality constraint on DE3148. Always returns True.",
      "description_hash": "b7cc061b",
      "is_external": false
    },
    "2": {
      "confidence": "low",
      "reasoning": "Whether a line item concerns a device lease/rental (Nutzungsüberlassung/Pacht) is a contract-type business context attribute. While it might be encoded in product codes (PIA/IMD), the specific qualifiers distinguishing Pacht from other transaction types in INVOIC are not determinable without the segment structure reference and would depend on external contract classification.",
      "description_hash": "3718fe38",
      "is_external": true
    },
    "26": {
      "confidence": "high",
      "reasoning": "ALC+A+:Z04: elements[0][0]='A' (Abschlag qualifier), elements[1][1]='Z04' (C552 DE5189 code). Finds ALC segments with qualifier 'A' and checks C552 component index 1 for 'Z04'.",
      "description_hash": "955e44b2",
      "is_external": false
    },
    "76": {
      "confidence": "medium",
      "reasoning": "Whether the MP-ID in NAD+MR has the market role NB (Netzbetreiber) cannot be determined from the EDIFACT message alone — it requires a business registry lookup. The NAD+MR segment only provides the party identifier, not the assigned market role.",
      "description_hash": "12bec70f",
      "is_external": true
    },
    "11": {
      "confidence": "medium",
      "reasoning": "Whether a deposit/advance payment (Abschlag) applies is business context that cannot be determined from the EDIFACT message structure alone — it depends on the contract type and billing arrangement.",
      "description_hash": "571394bc",
      "is_external": true
    },
    "518": {
      "confidence": "high",
      "reasoning": "Hinweis: informational note explaining date semantics in various cancellation/blocking scenarios — always applies unconditionally",
      "description_hash": "58711851",
      "is_external": false
    },
    "12": {
      "confidence": "high",
      "reasoning": "QTY+136 (zeitliche Mengenangaben) presence check. QTY qualifier at elements[0][0]. Message-wide check is equivalent to SG26-scoped since QTY only appears in SG26.",
      "description_hash": "e11f4176",
      "is_external": false
    },
    "6": {
      "confidence": "high",
      "reasoning": "NAD+MR segment: qualifier at elements[0][0]='MR', DE3207 (Ländername) at elements[8][0]. Check if value equals 'DE'.",
      "description_hash": "fdaa8c18",
      "is_external": false
    },
    "504": {
      "confidence": "high",
      "reasoning": "Hinweis: informational annotation describing that a positive amount is a claim of the invoice recipient. Always applies unconditionally.",
      "description_hash": "c7cceae1",
      "is_external": false
    },
    "44": {
      "confidence": "high",
      "reasoning": "Negation of IMD++ABS: True when no IMD segment has elements[1][0]=\"ABS\" (DE7081 in C272).",
      "description_hash": "9a22eb87",
      "is_external": false
    },
    "54": {
      "confidence": "high",
      "reasoning": "IMD++ABR/JVR/ZVR means elements[1][0] is one of the three codes. Iterates all IMD segments and checks element 1 component 0.",
      "description_hash": "8c9d8169",
      "is_external": false
    },
    "84": {
      "confidence": "high",
      "reasoning": "ALC+C+:Z02/Z03/Z04 means elements[0][0]==\"C\" (DE5463 qualifier) and elements[1][1] (DE5189 code) in [Z02, Z03, Z04]. Group-scoped to SG39. any_group_has_qualified_value filters by qualifier 'C' at element 0 and checks element 1 component 1.",
      "description_hash": "20fe51ca",
      "is_external": false
    },
    "50": {
      "confidence": "high",
      "reasoning": "Negation of IMD++SOR check: True when no IMD segment has elements[1][0]=\"SOR\" (DE7081 in C272).",
      "description_hash": "a6b84f4b",
      "is_external": false
    },
    "939": {
      "confidence": "high",
      "reasoning": "Format: string must contain @ and . characters — standard email validation. Applied to COM segment elements[0][0] which holds the communication value.",
      "description_hash": "05a09b9a",
      "is_external": false
    },
    "67": {
      "confidence": "low",
      "reasoning": "References an external code list in 'Kapitel 2 Codeliste der Artikelnummer' — valid Artikelnummern per PID are defined in a specification document, not derivable from the EDIFACT message content. This requires external lookup against the allowlist for the current Prüfidentifikator.",
      "description_hash": "3d841aee",
      "is_external": true
    },
    "49": {
      "confidence": "high",
      "reasoning": "True when neither IMD++Z43 nor IMD++Z44 are present anywhere in the message. Both absence checks applied with logical AND.",
      "description_hash": "75f9e09a",
      "is_external": false
    },
    "88": {
      "confidence": "high",
      "reasoning": "DTM+155 is Abrechnungszeitraum Beginn. Per segment structure, elements[0][0]=qualifier, elements[0][1]=date value. Compare first 8 chars of the date value (CCYYMMDD) against 20260101.",
      "description_hash": "ff135781",
      "is_external": false
    },
    "82": {
      "confidence": "medium",
      "reasoning": "Same pattern as condition 78. 'GEI+Z05' refers to elements[1][0]==\"Z05\".",
      "description_hash": "c69a0d8b",
      "is_external": false
    },
    "940": {
      "confidence": "high",
      "reasoning": "Format: string must start with + followed only by digits — standard phone number validation. Applied to COM segment elements[0][0] which holds the communication value.",
      "description_hash": "de8363bc",
      "is_external": false
    },
    "960": {
      "confidence": "high",
      "reasoning": "Netzlokations-ID uses the same 11-digit Luhn check digit format as Marktlokations-ID. LOC+Z18 is the qualifier for Netzlokation.",
      "description_hash": "0ce0bd80",
      "is_external": false
    },
    "912": {
      "confidence": "high",
      "reasoning": "Max 6 decimal places format check. In INVOIC, energy quantities (QTY) commonly require up to 6 decimal places for precise kWh/MWh values. Uses validate_max_decimal_places helper directly.",
      "description_hash": "8464aa40",
      "is_external": false
    },
    "58": {
      "confidence": "high",
      "reasoning": "Checks if MOA+113 (Vorausbezahlter Betrag steuersatzbezogen) is present within the current SG52 group. MOA elements[0][0]=='113'.",
      "description_hash": "575edf0a",
      "is_external": false
    },
    "13": {
      "confidence": "medium",
      "reasoning": "Whether a prepaid amount (vorausbezahlter Betrag) is present is billing business context that cannot be derived solely from the EDIFACT segments in the message.",
      "description_hash": "2e30256c",
      "is_external": true
    },
    "86": {
      "confidence": "medium",
      "reasoning": "DE6411 is the unit of measure code in QTY segments at elements[0][2] (C186 component 2). 'In diesem Segment' means within the current QTY context. Check message-wide for QTY with MON or ANN unit code.",
      "description_hash": "d3909c03",
      "is_external": false
    },
    "5": {
      "confidence": "high",
      "reasoning": "NAD+MR segment: qualifier at elements[0][0]='MR', DE3207 (Ländername) at elements[8][0]. Check if value differs from 'DE'.",
      "description_hash": "26bf9dc7",
      "is_external": false
    },
    "10": {
      "confidence": "medium",
      "reasoning": "Both DTM+155 (Abrechnungszeitraum Beginn) and DTM+156 (Ende) must be absent in the SG26. Uses group navigator; both must be absent simultaneously for the condition to be True.",
      "description_hash": "4c40aa9d",
      "is_external": false
    },
    "17": {
      "confidence": "high",
      "reasoning": "Simple qualifier existence check: DTM segment with elements[0][0] == 'Z11' (Beginn Bilanzierung).",
      "description_hash": "5ad7b867",
      "is_external": false
    },
    "27": {
      "confidence": "high",
      "reasoning": "Simple qualifier check: ALC segment with elements[0][0] == 'C' (Zuschlag). The ALC reference confirms DE5463 qualifier 'C' for Zuschlag.",
      "description_hash": "831db0d5",
      "is_external": false
    },
    "56": {
      "confidence": "medium",
      "reasoning": "DTM+137 Nachrichtendatum >= 2023-01-01. Parses the date value (format 303 = YYYYMMDDHHmm) and compares the first 8 characters against '20230101'. String comparison is valid for ISO date format.",
      "description_hash": "ac67fd9d",
      "is_external": false
    },
    "509": {
      "confidence": "high",
      "reasoning": "Hinweis: informational annotation indicating this field contains the Marktlokation ID. Always applies unconditionally.",
      "description_hash": "9727b89c",
      "is_external": false
    },
    "510": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation about using the Messlokation ID. Always returns True.",
      "description_hash": "d7954b75",
      "is_external": false
    },
    "77": {
      "confidence": "medium",
      "reasoning": "SG26 DTM+156 means elements[0][0]==\"156\". Value at elements[0][1] in 303 format. Compare <= \"202401010000\" (Jan 1 2024 00:00). Medium confidence due to timezone nuance.",
      "description_hash": "b3c72a0f",
      "is_external": false
    },
    "512": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation describing how the amount value should be calculated. Always returns True.",
      "description_hash": "9045f8f4",
      "is_external": false
    },
    "45": {
      "confidence": "medium",
      "reasoning": "\"Nur MP-ID aus Sparte Strom\" means only market-participant IDs that belong to the electricity sector are allowed. Determining which IDs are registered for Sparte Strom requires an external code list or market master data lookup and cannot be inferred from the EDIFACT message content.",
      "description_hash": "f3221dba",
      "is_external": true
    },
    "9": {
      "confidence": "medium",
      "reasoning": "Checks whether any SG26 instance lacks DTM+203 (Ausführungsdatum). Uses group navigator when available, falling back to message-wide absence check. DTM qualifier at elements[0][0].",
      "description_hash": "36e10c6e",
      "is_external": false
    },
    "47": {
      "confidence": "high",
      "reasoning": "IMD++Z43 means elements[1][0]=\"Z43\" (DE7081 in C272 Produkt/Leistung). Iterate all IMD segments and check element[1][0].",
      "description_hash": "770a1936",
      "is_external": false
    },
    "930": {
      "confidence": "high",
      "reasoning": "Max 2 decimal places format check. Standard for monetary/price quantities in INVOIC. Direct use of validate_max_decimal_places helper as shown in Example 19.",
      "description_hash": "30e8c861",
      "is_external": false
    },
    "20": {
      "confidence": "medium",
      "reasoning": "MOA+9 is fälliger Betrag (due amount): elements[0][0]='9', elements[0][1]=amount. Parses the numeric value and checks >= 0.",
      "description_hash": "036deaed",
      "is_external": false
    },
    "31": {
      "confidence": "high",
      "reasoning": "Whether the NAD+MR party holds the MGV (Messstellenbetreiber Grundversorgung) role cannot be determined from the EDIFACT message alone — requires a market participant role registry lookup.",
      "description_hash": "c1dfbcb6",
      "is_external": true
    },
    "48": {
      "confidence": "high",
      "reasoning": "IMD++Z44 means elements[1][0]=\"Z44\" (DE7081 in C272 Produkt/Leistung). Iterate all IMD segments and check element[1][0].",
      "description_hash": "85caeb66",
      "is_external": false
    },
    "73": {
      "confidence": "high",
      "reasoning": "IMD++MSB means elements[1][0]==\"MSB\". Presence check across all IMD segments.",
      "description_hash": "5207988e",
      "is_external": false
    },
    "508": {
      "confidence": "high",
      "reasoning": "Hinweis: informational annotation indicating this field contains the document number of the QUOTES. Always applies unconditionally.",
      "description_hash": "32ca2458",
      "is_external": false
    },
    "491": {
      "confidence": "high",
      "reasoning": "Checks if the CCYYMMDD part of the DTM value falls within German winter time (MEZ, UTC+1) per Tabelle Kapitel 3.6. The is_mez_utc() helper implements exactly this — complement of MESZ period.",
      "description_hash": "305e3493",
      "is_external": false
    },
    "522": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation describing the usage of the Netzlokation ID. Always returns True.",
      "description_hash": "9592f83e",
      "is_external": false
    },
    "79": {
      "confidence": "medium",
      "reasoning": "Same pattern as condition 78. 'GEI+Z09' in AHB shorthand refers to elements[1][0]==\"Z09\".",
      "description_hash": "d782362b",
      "is_external": false
    },
    "525": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation describing the usage context for reduced network fees. Always returns True.",
      "description_hash": "070cf83b",
      "is_external": false
    },
    "950": {
      "confidence": "high",
      "reasoning": "Format: Marktlokations-ID — 11-digit ID with Luhn check digit. Applied to LOC+Z16 segment elements[1][0] which holds the location ID, matching the canonical example implementation.",
      "description_hash": "a9ddfaec",
      "is_external": false
    },
    "36": {
      "confidence": "medium",
      "reasoning": "DTM+156 (Abrechnungszeitraum Ende) uses format 303 (CCYYMMDDHHMM), so lexicographic string comparison is correct. German date 01.12.2019 = December 1, 2019 = \"201912010000\".",
      "description_hash": "9c0662b6",
      "is_external": false
    },
    "30": {
      "confidence": "medium",
      "reasoning": "'Wenn MP-ID in NAD+MR nicht in der Rolle MGV oder KN' requires knowledge of which market-participant IDs correspond to the MGV (Messstellenbetreiber Gasvertrieb) or KN (Kunde/Netz) roles. Role assignment is maintained in an external registry and cannot be determined from the NAD segment alone.",
      "description_hash": "4d0e0eaf",
      "is_external": true
    },
    "68": {
      "confidence": "low",
      "reasoning": "References an external code list in 'Kapitel 3 Codeliste der Gruppenartikel-ID und Artikel-ID' — only Artikel-IDs with 'X' in the INVOIC column are allowed. This requires external lookup against the specification code list document.",
      "description_hash": "96d7b692",
      "is_external": true
    },
    "961": {
      "confidence": "high",
      "reasoning": "SR-ID (SteuerbareRessource-ID) uses the same 11-digit Luhn check digit format as Marktlokations-ID. LOC+Z19 is the qualifier for SteuerbareRessource.",
      "description_hash": "99d3e1d7",
      "is_external": false
    },
    "501": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation describing that this field contains the document number of the ORDERS message. Not a boolean predicate; always applies unconditionally.",
      "description_hash": "9c74b61f",
      "is_external": false
    },
    "503": {
      "confidence": "high",
      "reasoning": "Hinweis: informational annotation describing that a positive amount is a claim of the invoice issuer. Always applies unconditionally.",
      "description_hash": "bf3645c9",
      "is_external": false
    },
    "515": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation about the BGM document number from the INVOIC message being cancelled. Always returns True.",
      "description_hash": "338fc6af",
      "is_external": false
    },
    "931": {
      "confidence": "high",
      "reasoning": "Format condition: ZZZ = +00 means the timezone suffix of a DTM value must be UTC (+00). Uses validate_timezone_utc helper.",
      "description_hash": "825c510c",
      "is_external": false
    },
    "74": {
      "confidence": "high",
      "reasoning": "COM segment: C076 composite at elements[0], where [0][0]=DE3148 (address) and [0][1]=DE3155 (channel qualifier). Check if any COM has DE3155==\"EM\".",
      "description_hash": "eaf06e02",
      "is_external": false
    },
    "934": {
      "confidence": "high",
      "reasoning": "Format condition: HHMM = 0400 checks that the time portion of a DTM value equals 0400. Uses validate_hhmm_equals helper.",
      "description_hash": "d06a46c8",
      "is_external": false
    },
    "34": {
      "confidence": "medium",
      "reasoning": "\"Wenn in Ursprungsrechnung vorhanden\" means the condition is met when the corresponding value was present in the referenced original invoice. That original document is not available inside the current EDIFACT message, so this is an external business-context check.",
      "description_hash": "98f5aae7",
      "is_external": true
    },
    "927": {
      "confidence": "medium",
      "reasoning": "Value must be exactly -1. Used for special indicator values (e.g., a reversal or placeholder quantity). validate_numeric with == operator handles exact match. Medium confidence due to segment assumption — the -1 constraint is unusual and the exact segment context (QTY vs MOA) depends on which AHB data element references this condition.",
      "description_hash": "43d19cf7",
      "is_external": false
    },
    "21": {
      "confidence": "medium",
      "reasoning": "MOA+9 is fälliger Betrag. Parses numeric value and checks < 0. Inverse of condition 20.",
      "description_hash": "cd7aea7b",
      "is_external": false
    },
    "25": {
      "confidence": "low",
      "reasoning": "Requires computing a date that is at most 10 Werktage (working days) after DTM+137 DE2380. Working-day calculation requires a German public-holiday calendar (which varies by Bundesland) and cannot be performed with the available API helpers. Marking as low confidence / null.",
      "description_hash": "c8edcf61",
      "is_external": false
    },
    "40": {
      "confidence": "medium",
      "reasoning": "Condition requires validating that the article number/ID appears in the external \"Codeliste der Artikelnummern und Artikel-ID\" for the given Prüfidentifikator. Code-list membership cannot be verified from the EDIFACT message structure alone; it is an external reference-data check.",
      "description_hash": "861c8cfb",
      "is_external": true
    },
    "514": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation about the document number of the Lieferschein-MSCONS. Always returns True.",
      "description_hash": "7dc6dddf",
      "is_external": false
    },
    "502": {
      "confidence": "high",
      "reasoning": "Hinweis condition — informational annotation describing that this field contains the document number of the Bilanzierungs-MSCONS message. Not a boolean predicate; always applies unconditionally.",
      "description_hash": "c453e9ea",
      "is_external": false
    },
    "7": {
      "confidence": "low",
      "reasoning": "'Großkundenpostleitzahl' (large-customer postal codes in Germany) are special 5-digit codes assigned to high-volume mail recipients. Determining whether a NAD postal code (C059/d3251) is in this category requires an external reference list or classification service — it cannot be determined from the EDIFACT message structure alone.",
      "description_hash": "6cb26f7a",
      "is_external": true
    },
    "16": {
      "confidence": "medium",
      "reasoning": "Whether network usage (Netznutzung) has occurred is business context that cannot be determined solely from the EDIFACT message content.",
      "description_hash": "e13e2088",
      "is_external": true
    },
    "64": {
      "confidence": "medium",
      "reasoning": "DTM+156 (Abrechnungszeitraum Ende) <= 2024-01-01 0:00. Same pattern as condition 57 but with threshold '20240101'.",
      "description_hash": "c6f280a4",
      "is_external": false
    },
    "15": {
      "confidence": "medium",
      "reasoning": "Whether a balancing (Bilanzierung) has occurred is operational/business context external to the EDIFACT message itself.",
      "description_hash": "4ebc59b9",
      "is_external": true
    },
    "61": {
      "confidence": "high",
      "reasoning": "DTM+203 where DE2379 (elements[0][2]) == '102'. has_qualified_value finds DTM with elements[0][0]=='203' then checks elements[0][2] for '102'.",
      "description_hash": "c4ad47e4",
      "is_external": false
    },
    "492": {
      "confidence": "medium",
      "reasoning": "Checks whether the NAD+MR (message recipient) MP-ID belongs to the electricity (Strom) sector. The NAD+MR element structure is known (elements[0]=MR, elements[1][0]=MP-ID), but sector membership cannot be determined from the EDIFACT message content alone — it requires an external market participant registry. Delegated to external provider.",
      "description_hash": "7ef55690",
      "is_external": true
    },
    "8": {
      "confidence": "low",
      "reasoning": "Whether prices are time-dependent (zeitabhängige Preise) is a pricing-arrangement attribute. While it might correlate with the presence of PRI validity-period DTM segments, the definitive classification of a price as time-dependent is a business/contract context decision that cannot be reliably derived from EDIFACT segment presence alone without the authoritative segment structure reference for INVOIC pricing groups.",
      "description_hash": "fd4eefb1",
      "is_external": true
    },
    "72": {
      "confidence": "medium",
      "reasoning": "Whether the MP-ID in NAD+MR has the market role LF (Lieferant) cannot be determined from the EDIFACT message alone — it requires a business registry lookup. The NAD+MR segment only provides the party identifier, not the assigned market role.",
      "description_hash": "feeed1a1",
      "is_external": true
    },
    "906": {
      "confidence": "medium",
      "reasoning": "Format condition requiring at most 3 decimal places. Most likely applies to MOA DE5004 (Geldbetrag) in INVOIC. Medium confidence — the exact MOA qualifier or group (SG27/SG42/SG50/SG52) depends on the AHB table row context not included in the condition description alone.",
      "description_hash": "97bdb0c7",
      "is_external": false
    },
    "32": {
      "confidence": "high",
      "reasoning": "ALC+A+:Z01 maps to elements[0]=\"A\" (DE5463 Qualifier) and elements[1][1]=\"Z01\" (DE5189 in C552 Zu-/Abschlagsinformation). has_qualified_value filters ALC segments by qualifier A then checks the DE5189 component.",
      "description_hash": "a673e93a",
      "is_external": false
    },
    "24": {
      "confidence": "low",
      "reasoning": "Condition requires calculating whether a date value is at least 10 Werktage (working days) after DTM+137 DE2380. Working-day arithmetic requires a German public holiday calendar, which is not available in the EvaluationContext API. Cannot implement accurately without external calendar data.",
      "description_hash": "9d49bcae",
      "is_external": false
    },
    "493": {
      "confidence": "medium",
      "reasoning": "Checks whether the NAD+MR (message recipient) MP-ID belongs to the gas (Gas) sector. Same reasoning as 492 — sector membership cannot be determined from the EDIFACT message alone; requires external market participant registry. Delegated to external provider.",
      "description_hash": "4e00d72d",
      "is_external": true
    },
    "80": {
      "confidence": "medium",
      "reasoning": "'GEI+Z01' refers to elements[1][0]==\"Z01\" (the specification code, not the fixed qualifier at elements[0]). Absence check.",
      "description_hash": "7f9db965",
      "is_external": false
    },
    "911": {
      "confidence": "medium",
      "reasoning": "Sequential numbering validation (1 to n, ascending) — only the >= 1 integer constraint can be checked on a single value. Full sequential ordering cannot be verified without stateful iteration across all instances. Applies to LIN line item numbers in INVOIC SG26. Medium confidence due to segment assumption and inability to verify sequential ordering in isolation.",
      "description_hash": "d1f33af5",
      "is_external": false
    },
    "951": {
      "confidence": "high",
      "reasoning": "Zählpunktbezeichnung (meter point ID) is a 33-character alphanumeric identifier. validate_zahlpunkt checks exactly this format.",
      "description_hash": "f35fc481",
      "is_external": false
    },
    "85": {
      "confidence": "medium",
      "reasoning": "DE6411 is the measurement unit code, appearing in QTY segments as C186 composite: elements[0][0]=DE6063 (qualifier), elements[0][1]=DE6060 (quantity), elements[0][2]=DE6411 (unit code). 'DAY' is the unit code for daily quantities. Medium confidence as the specific segment context ('in diesem Segment') may require group scoping.",
      "description_hash": "7c165171",
      "is_external": false
    },
    "526": {
      "confidence": "high",
      "reasoning": "Hinweis condition documenting cross-reference requirement between MOA+113 (Vorausbezahlter Betrag) and the corresponding MOA+77 in the predecessor invoice referenced via SG51 RFF+AFL. Purely informational, no boolean predicate.",
      "description_hash": "79209a27",
      "is_external": false
    },
    "520": {
      "confidence": "high",
      "reasoning": "Hinweis: informational note restricting article IDs to those from the price sheet — always applies unconditionally",
      "description_hash": "4e248d7c",
      "is_external": false
    },
    "910": {
      "confidence": "medium",
      "reasoning": "Format condition accepting any numeric value (< 0 OR >= 0 is universally true). This documents that the field accepts negative values (unlike condition 902 which restricts to >= 0). Validates the value is a parseable number. Medium confidence on the exact segment — likely a MOA that can be a credit/deduction amount.",
      "description_hash": "063d57bb",
      "is_external": false
    },
    "935": {
      "confidence": "high",
      "reasoning": "Format condition: HHMM = 0500 checks that the time portion of a DTM value equals 0500. Uses validate_hhmm_equals helper.",
      "description_hash": "192bd97e",
      "is_external": false
    },
    "29": {
      "confidence": "medium",
      "reasoning": "DTM+155 is Abrechnungszeitraum Beginn with format 303 (starts YYYYMMDD). 'nicht größer 31.12.2015' means <= 31.12.2015. Lexicographic comparison of 8-char ISO prefix is correct for this date format.",
      "description_hash": "5dd951cc",
      "is_external": false
    },
    "37": {
      "confidence": "medium",
      "reasoning": "\"Wenn Lieferschein zuvor ausgetauscht wurde\" depends on whether a delivery note (Lieferschein) was exchanged in a prior business transaction. This cannot be determined from the current EDIFACT message alone; it requires external business context.",
      "description_hash": "5d7d44b3",
      "is_external": true
    },
    "57": {
      "confidence": "medium",
      "reasoning": "DTM+156 (Abrechnungszeitraum Ende) <= 2023-01-01 0:00. Compares first 8 chars of date value against '20230101'. Returns True when the end date is on or before Jan 1 2023.",
      "description_hash": "ed531486",
      "is_external": false
    },
    "59": {
      "confidence": "medium",
      "reasoning": "SG26 DTM+155 (Positionsbezogener Abrechnungszeitraum Beginn) >= 2023-01-01 0:00. Finds DTM with qualifier 155 and compares first 8 chars of the date value against '20230101'.",
      "description_hash": "8317e398",
      "is_external": false
    },
    "22": {
      "confidence": "high",
      "reasoning": "'Wenn vorhanden' is a self-referential AHB condition meaning the rule applies whenever the annotated element is present. As an evaluator it is always True — the calling validator determines whether the element itself is present.",
      "description_hash": "fae4710e",
      "is_external": false
    },
    "516": {
      "confidence": "high",
      "reasoning": "Hinweis: informational note about delivery notes for invoices — always applies unconditionally",
      "description_hash": "d85586dc",
      "is_external": false
    },
    "69": {
      "confidence": "low",
      "reasoning": "References an external code list in 'Kapitel 3 Codeliste der Gruppenartikel-ID und Artikel-ID' — only Artikel-IDs with 'SOR' in the INVOIC column are allowed. This requires external lookup against the specification code list document.",
      "description_hash": "7e037aad",
      "is_external": true
    },
    "41": {
      "confidence": "high",
      "reasoning": "IMD++SOR means elements[0] is empty (Beschreibungsformat) and elements[1][0]=\"SOR\" (DE7081 in C272 Produkt/Leistung). Iterate all IMD segments and check element[1][0].",
      "description_hash": "4ef0033a",
      "is_external": false
    },
    "42": {
      "confidence": "medium",
      "reasoning": "DTM+155 (Abrechnungszeitraum Beginn) uses format 303 (CCYYMMDDHHMM). January 1, 2023 at 00:00 = \"202301010000\". Lexicographic comparison is correct for zero-padded CCYYMMDDHHMM.",
      "description_hash": "92fa452f",
      "is_external": false
    },
    "507": {
      "confidence": "high",
      "reasoning": "Hinweis: informational annotation indicating this field contains the document number of the SSQNOT. Always applies unconditionally.",
      "description_hash": "07e90ff2",
      "is_external": false
    },
    "81": {
      "confidence": "medium",
      "reasoning": "Same pattern as condition 78. 'GEI+Z04' refers to elements[1][0]==\"Z04\".",
      "description_hash": "7dfe11c1",
      "is_external": false
    },
    "914": {
      "confidence": "high",
      "reasoning": "Value must be strictly greater than 0. Straightforward numeric range check using validate_numeric helper. Applies to QTY quantities in INVOIC which must be positive values.",
      "description_hash": "533e37f6",
      "is_external": false
    },
    "23": {
      "confidence": "medium",
      "reasoning": "DE3124 resides in C058 at elements[2][0] for all NAD variants. 'Im selben NAD' means within the same NAD instance; evaluated message-wide as: any NAD where this component is absent or empty.",
      "description_hash": "d0bec6ee",
      "is_external": false
    },
    "53": {
      "confidence": "high",
      "reasoning": "IMD++Z45 means elements[0] is empty, elements[1][0] is the type code Z45. has_qualifier checks elements[1][0]=='Z45'.",
      "description_hash": "f91215c4",
      "is_external": false
    },
    "55": {
      "confidence": "high",
      "reasoning": "IMD++ABS means elements[1][0]=='ABS'. has_qualifier checks this directly.",
      "description_hash": "b924e5b1",
      "is_external": false
    },
    "60": {
      "confidence": "high",
      "reasoning": "DTM+203 where DE2379 (elements[0][2]) == '303'. has_qualified_value finds DTM with elements[0][0]=='203' then checks elements[0][2] for '303'.",
      "description_hash": "d3e2721b",
      "is_external": false
    },
    "78": {
      "confidence": "medium",
      "reasoning": "GEI schema shows elements[0] qualifier is always Z01, while the specification code is at elements[1][0] (DE7365) with codes Z01-Z06 +3 more. 'GEI+Z08' in AHB shorthand refers to elements[1][0]==\"Z08\". Absence check returns True when not found.",
      "description_hash": "6e4f9538",
      "is_external": false
    },
    "75": {
      "confidence": "high",
      "reasoning": "Same as condition 74 but checks DE3155 for codes TE, FX, AJ, or AL (telephone, fax, or electronic messaging channel types).",
      "description_hash": "d9351e4d",
      "is_external": false
    },
    "65": {
      "confidence": "medium",
      "reasoning": "SG26 DTM+155 (Positionsbezogener Abrechnungszeitraum Beginn) >= 2024-01-01 0:00. Same pattern as condition 59 but with threshold '20240101'.",
      "description_hash": "cca1d5c7",
      "is_external": false
    },
    "519": {
      "confidence": "high",
      "reasoning": "Hinweis: informational note stating cancelled advance invoices must not be listed — always applies unconditionally",
      "description_hash": "7f163649",
      "is_external": false
    },
    "28": {
      "confidence": "medium",
      "reasoning": "'Wenn Zuschlag anfällt' (if a surcharge applies) is a business-context determination that cannot be derived from EDIFACT segment content alone. It depends on contract terms or tariff configuration held outside the message.",
      "description_hash": "3d3f61ca",
      "is_external": true
    },
    "18": {
      "confidence": "high",
      "reasoning": "IMD++WIM notation means elements[0] is empty, elements[1][0]='WIM' (item characteristic code). lacks_qualifier checks for absence of any IMD with that value.",
      "description_hash": "76ce13a0",
      "is_external": false
    },
    "517": {
      "confidence": "high",
      "reasoning": "Hinweis: informational note describing the document number field — always applies unconditionally",
      "description_hash": "d719ba07",
      "is_external": false
    },
    "1": {
      "confidence": "low",
      "reasoning": "'Wenn in zu stornierender Rechnung gefüllt' means the condition depends on whether a specific field was populated in the original invoice being cancelled. This requires knowledge of the referenced original invoice's content, which is entirely external to the current EDIFACT message and cannot be determined from its segments alone.",
      "description_hash": "a25cff5a",
      "is_external": true
    },
    "490": {
      "confidence": "high",
      "reasoning": "Checks if the CCYYMMDD part of the DTM value falls within German summer time (MESZ, UTC+2) per Tabelle Kapitel 3.5. The is_mesz_utc() helper implements exactly this — EU DST rule from last Sunday of March 01:00 UTC to last Sunday of October 01:00 UTC.",
      "description_hash": "b21c790d",
      "is_external": false
    }
  }
}