Skip to main content

automapper_validation/generated/fv2604/
comdis_conditions_fv2604.rs

1// <auto-generated>
2// Generated by automapper-generator generate-conditions
3// AHB: xml-migs-and-ahbs/FV2604/COMDIS_AHB_1_0h_20251001.xml
4// Generated: 2026-03-12T11:30:28Z
5// </auto-generated>
6
7#[allow(unused_imports)]
8use crate::eval::format_validators::*;
9use crate::eval::{ConditionEvaluator, ConditionResult, EvaluationContext};
10
11/// Generated condition evaluator for COMDIS FV2604.
12pub struct ComdisConditionEvaluatorFV2604 {
13    // External condition IDs that require runtime context.
14    external_conditions: std::collections::HashSet<u32>,
15}
16
17impl Default for ComdisConditionEvaluatorFV2604 {
18    fn default() -> Self {
19        let mut external_conditions = std::collections::HashSet::new();
20        external_conditions.insert(3);
21        external_conditions.insert(23);
22        external_conditions.insert(24);
23        external_conditions.insert(25);
24        external_conditions.insert(26);
25        external_conditions.insert(27);
26        external_conditions.insert(28);
27        external_conditions.insert(29);
28        external_conditions.insert(30);
29        external_conditions.insert(492);
30        external_conditions.insert(493);
31        Self {
32            external_conditions,
33        }
34    }
35}
36
37impl ConditionEvaluator for ComdisConditionEvaluatorFV2604 {
38    fn message_type(&self) -> &str {
39        "COMDIS"
40    }
41
42    fn format_version(&self) -> &str {
43        "FV2604"
44    }
45
46    fn evaluate(&self, condition: u32, ctx: &EvaluationContext) -> ConditionResult {
47        match condition {
48            1 => self.evaluate_1(ctx),
49            2 => self.evaluate_2(ctx),
50            3 => self.evaluate_3(ctx),
51            4 => self.evaluate_4(ctx),
52            5 => self.evaluate_5(ctx),
53            6 => self.evaluate_6(ctx),
54            7 => self.evaluate_7(ctx),
55            8 => self.evaluate_8(ctx),
56            9 => self.evaluate_9(ctx),
57            10 => self.evaluate_10(ctx),
58            11 => self.evaluate_11(ctx),
59            12 => self.evaluate_12(ctx),
60            13 => self.evaluate_13(ctx),
61            14 => self.evaluate_14(ctx),
62            15 => self.evaluate_15(ctx),
63            16 => self.evaluate_16(ctx),
64            17 => self.evaluate_17(ctx),
65            18 => self.evaluate_18(ctx),
66            19 => self.evaluate_19(ctx),
67            20 => self.evaluate_20(ctx),
68            21 => self.evaluate_21(ctx),
69            22 => self.evaluate_22(ctx),
70            23 => self.evaluate_23(ctx),
71            24 => self.evaluate_24(ctx),
72            25 => self.evaluate_25(ctx),
73            26 => self.evaluate_26(ctx),
74            27 => self.evaluate_27(ctx),
75            28 => self.evaluate_28(ctx),
76            29 => self.evaluate_29(ctx),
77            30 => self.evaluate_30(ctx),
78            31 => self.evaluate_31(ctx),
79            32 => self.evaluate_32(ctx),
80            33 => self.evaluate_33(ctx),
81            34 => self.evaluate_34(ctx),
82            492 => self.evaluate_492(ctx),
83            493 => self.evaluate_493(ctx),
84            505 => self.evaluate_505(ctx),
85            506 => self.evaluate_506(ctx),
86            508 => self.evaluate_508(ctx),
87            509 => self.evaluate_509(ctx),
88            510 => self.evaluate_510(ctx),
89            930 => self.evaluate_930(ctx),
90            931 => self.evaluate_931(ctx),
91            939 => self.evaluate_939(ctx),
92            940 => self.evaluate_940(ctx),
93            _ => ConditionResult::Unknown,
94        }
95    }
96
97    fn is_external(&self, condition: u32) -> bool {
98        self.external_conditions.contains(&condition)
99    }
100    fn is_known(&self, condition: u32) -> bool {
101        matches!(
102            condition,
103            1 | 2
104                | 3
105                | 4
106                | 5
107                | 6
108                | 7
109                | 8
110                | 9
111                | 10
112                | 11
113                | 12
114                | 13
115                | 14
116                | 15
117                | 16
118                | 17
119                | 18
120                | 19
121                | 20
122                | 21
123                | 22
124                | 23
125                | 24
126                | 25
127                | 26
128                | 27
129                | 28
130                | 29
131                | 30
132                | 31
133                | 32
134                | 33
135                | 34
136                | 492
137                | 493
138                | 505
139                | 506
140                | 508
141                | 509
142                | 510
143                | 930
144                | 931
145                | 939
146                | 940
147        )
148    }
149}
150
151impl ComdisConditionEvaluatorFV2604 {
152    /// [1] wenn SG3 AJT+Z61+S_0109 oder SG3 AJT+Z62+S_0109 vorhanden
153    fn evaluate_1(&self, ctx: &EvaluationContext) -> ConditionResult {
154        let ajt_segs = ctx.find_segments("AJT");
155        if ajt_segs.is_empty() {
156            return ConditionResult::Unknown;
157        }
158        for seg in &ajt_segs {
159            let q = seg
160                .elements
161                .first()
162                .and_then(|e| e.first())
163                .map(|s| s.as_str())
164                .unwrap_or("");
165            let v = seg
166                .elements
167                .get(1)
168                .and_then(|e| e.first())
169                .map(|s| s.as_str())
170                .unwrap_or("");
171            if (q == "Z61" || q == "Z62") && v == "S" {
172                return ConditionResult::True;
173            }
174        }
175        ConditionResult::False
176    }
177
178    /// [2] wenn SG3 AJT+Z58+S_0109 oder SG3 AJT+Z59+S_0109 oder SG3 AJT+Z60+S_0109 vorhanden
179    fn evaluate_2(&self, ctx: &EvaluationContext) -> ConditionResult {
180        let ajt_segs = ctx.find_segments("AJT");
181        if ajt_segs.is_empty() {
182            return ConditionResult::Unknown;
183        }
184        for seg in &ajt_segs {
185            let q = seg
186                .elements
187                .first()
188                .and_then(|e| e.first())
189                .map(|s| s.as_str())
190                .unwrap_or("");
191            let v = seg
192                .elements
193                .get(1)
194                .and_then(|e| e.first())
195                .map(|s| s.as_str())
196                .unwrap_or("");
197            if (q == "Z58" || q == "Z59" || q == "Z60") && v == "S" {
198                return ConditionResult::True;
199            }
200        }
201        ConditionResult::False
202    }
203
204    /// [31] wenn SG3 AJT+Z61+G_0089 oder SG3 AJT+Z62+G_0089 vorhanden
205    fn evaluate_31(&self, ctx: &EvaluationContext) -> ConditionResult {
206        let ajt_segs = ctx.find_segments("AJT");
207        if ajt_segs.is_empty() {
208            return ConditionResult::Unknown;
209        }
210        for seg in &ajt_segs {
211            let q = seg
212                .elements
213                .first()
214                .and_then(|e| e.first())
215                .map(|s| s.as_str())
216                .unwrap_or("");
217            let v = seg
218                .elements
219                .get(1)
220                .and_then(|e| e.first())
221                .map(|s| s.as_str())
222                .unwrap_or("");
223            if (q == "Z61" || q == "Z62") && v == "G" {
224                return ConditionResult::True;
225            }
226        }
227        ConditionResult::False
228    }
229
230    /// [32] wenn SG3 AJT+Z58+G_0089 oder SG3 AJT+Z59+G_0089 oder SG3 AJT+Z60+G_0089 vorhanden
231    fn evaluate_32(&self, ctx: &EvaluationContext) -> ConditionResult {
232        let ajt_segs = ctx.find_segments("AJT");
233        if ajt_segs.is_empty() {
234            return ConditionResult::Unknown;
235        }
236        for seg in &ajt_segs {
237            let q = seg
238                .elements
239                .first()
240                .and_then(|e| e.first())
241                .map(|s| s.as_str())
242                .unwrap_or("");
243            let v = seg
244                .elements
245                .get(1)
246                .and_then(|e| e.first())
247                .map(|s| s.as_str())
248                .unwrap_or("");
249            if (q == "Z58" || q == "Z59" || q == "Z60") && v == "G" {
250                return ConditionResult::True;
251            }
252        }
253        ConditionResult::False
254    }
255
256    /// [33] wenn SG3 AJT+Z58/Z59/Z60/Z61/Z62+G_0089 vorhanden
257    fn evaluate_33(&self, ctx: &EvaluationContext) -> ConditionResult {
258        let qualifiers = ["Z58", "Z59", "Z60", "Z61", "Z62"];
259        let ajt_segs = ctx.find_segments("AJT");
260        if ajt_segs.is_empty() {
261            return ConditionResult::Unknown;
262        }
263        for seg in &ajt_segs {
264            let q = seg
265                .elements
266                .first()
267                .and_then(|e| e.first())
268                .map(|s| s.as_str())
269                .unwrap_or("");
270            let v = seg
271                .elements
272                .get(1)
273                .and_then(|e| e.first())
274                .map(|s| s.as_str())
275                .unwrap_or("");
276            if qualifiers.contains(&q) && v == "G" {
277                return ConditionResult::True;
278            }
279        }
280        ConditionResult::False
281    }
282
283    /// [34] wenn SG3 AJT+A99+G_0089 vorhanden
284    fn evaluate_34(&self, ctx: &EvaluationContext) -> ConditionResult {
285        ctx.has_segment_matching("AJT", &[(0, 0, "A99"), (1, 0, "G")])
286    }
287
288    /// [3] Nur MP-ID aus Sparte Strom
289    /// EXTERNAL: Requires context from outside the message.
290    fn evaluate_3(&self, ctx: &EvaluationContext) -> ConditionResult {
291        ctx.external.evaluate("mp_id_from_electricity_sector")
292    }
293
294    /// [4] wenn SG3 AJT+Z58/Z59/Z60/Z61/Z62+S_0109 vorhanden
295    fn evaluate_4(&self, ctx: &EvaluationContext) -> ConditionResult {
296        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
297            let q = seg
298                .elements
299                .first()
300                .and_then(|e| e.first())
301                .map(|s| s.as_str());
302            let p = seg
303                .elements
304                .get(1)
305                .and_then(|e| e.first())
306                .map(|s| s.as_str());
307            matches!(
308                q,
309                Some("Z58") | Some("Z59") | Some("Z60") | Some("Z61") | Some("Z62")
310            ) && p == Some("S")
311        }))
312    }
313
314    /// [5] wenn SG3 AJT+A01/A02/A03/A04/A06/A07/A09/A12/A15+E_0504 vorhanden
315    fn evaluate_5(&self, ctx: &EvaluationContext) -> ConditionResult {
316        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
317            let q = seg
318                .elements
319                .first()
320                .and_then(|e| e.first())
321                .map(|s| s.as_str());
322            let p = seg
323                .elements
324                .get(1)
325                .and_then(|e| e.first())
326                .map(|s| s.as_str());
327            matches!(
328                q,
329                Some("A01")
330                    | Some("A02")
331                    | Some("A03")
332                    | Some("A04")
333                    | Some("A06")
334                    | Some("A07")
335                    | Some("A09")
336                    | Some("A12")
337                    | Some("A15")
338            ) && p == Some("E")
339        }))
340    }
341
342    /// [6] wenn SG3 AJT+A07+E_0504 vorhanden
343    fn evaluate_6(&self, ctx: &EvaluationContext) -> ConditionResult {
344        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
345            let q = seg
346                .elements
347                .first()
348                .and_then(|e| e.first())
349                .map(|s| s.as_str());
350            let p = seg
351                .elements
352                .get(1)
353                .and_then(|e| e.first())
354                .map(|s| s.as_str());
355            q == Some("A07") && p == Some("E")
356        }))
357    }
358
359    /// [7] wenn SG3 AJT+A02+E_0504 vorhanden
360    fn evaluate_7(&self, ctx: &EvaluationContext) -> ConditionResult {
361        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
362            let q = seg
363                .elements
364                .first()
365                .and_then(|e| e.first())
366                .map(|s| s.as_str());
367            let p = seg
368                .elements
369                .get(1)
370                .and_then(|e| e.first())
371                .map(|s| s.as_str());
372            q == Some("A02") && p == Some("E")
373        }))
374    }
375
376    /// [8] wenn SG3 AJT+A01/A04/A06/A09/A12+E_0504 vorhanden
377    fn evaluate_8(&self, ctx: &EvaluationContext) -> ConditionResult {
378        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
379            let q = seg
380                .elements
381                .first()
382                .and_then(|e| e.first())
383                .map(|s| s.as_str());
384            let p = seg
385                .elements
386                .get(1)
387                .and_then(|e| e.first())
388                .map(|s| s.as_str());
389            matches!(
390                q,
391                Some("A01") | Some("A04") | Some("A06") | Some("A09") | Some("A12")
392            ) && p == Some("E")
393        }))
394    }
395
396    /// [9] wenn SG3 AJT+A05/A10/A11/A14+E_0504 vorhanden
397    fn evaluate_9(&self, ctx: &EvaluationContext) -> ConditionResult {
398        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
399            let q = seg
400                .elements
401                .first()
402                .and_then(|e| e.first())
403                .map(|s| s.as_str());
404            let p = seg
405                .elements
406                .get(1)
407                .and_then(|e| e.first())
408                .map(|s| s.as_str());
409            matches!(q, Some("A05") | Some("A10") | Some("A11") | Some("A14")) && p == Some("E")
410        }))
411    }
412
413    /// [10] wenn SG3 AJT+A03+E_0504 vorhanden
414    fn evaluate_10(&self, ctx: &EvaluationContext) -> ConditionResult {
415        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
416            let q = seg
417                .elements
418                .first()
419                .and_then(|e| e.first())
420                .map(|s| s.as_str());
421            let p = seg
422                .elements
423                .get(1)
424                .and_then(|e| e.first())
425                .map(|s| s.as_str());
426            q == Some("A03") && p == Some("E")
427        }))
428    }
429
430    /// [11] wenn SG3 AJT+A15+E_0504 vorhanden
431    fn evaluate_11(&self, ctx: &EvaluationContext) -> ConditionResult {
432        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
433            let q = seg
434                .elements
435                .first()
436                .and_then(|e| e.first())
437                .map(|s| s.as_str());
438            let p = seg
439                .elements
440                .get(1)
441                .and_then(|e| e.first())
442                .map(|s| s.as_str());
443            q == Some("A15") && p == Some("E")
444        }))
445    }
446
447    /// [12] wenn SG3 AJT+A99+S_0109 vorhanden
448    fn evaluate_12(&self, ctx: &EvaluationContext) -> ConditionResult {
449        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
450            let q = seg
451                .elements
452                .first()
453                .and_then(|e| e.first())
454                .map(|s| s.as_str());
455            let p = seg
456                .elements
457                .get(1)
458                .and_then(|e| e.first())
459                .map(|s| s.as_str());
460            q == Some("A99") && p == Some("S")
461        }))
462    }
463
464    /// [13] wenn SG3 AJT+A07+E_1008 vorhanden
465    fn evaluate_13(&self, ctx: &EvaluationContext) -> ConditionResult {
466        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
467            let q = seg
468                .elements
469                .first()
470                .and_then(|e| e.first())
471                .map(|s| s.as_str());
472            let p = seg
473                .elements
474                .get(1)
475                .and_then(|e| e.first())
476                .map(|s| s.as_str());
477            q == Some("A07") && p == Some("E")
478        }))
479    }
480
481    /// [14] wenn SG3 AJT+A02+E_1008 vorhanden
482    fn evaluate_14(&self, ctx: &EvaluationContext) -> ConditionResult {
483        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
484            let q = seg
485                .elements
486                .first()
487                .and_then(|e| e.first())
488                .map(|s| s.as_str());
489            let p = seg
490                .elements
491                .get(1)
492                .and_then(|e| e.first())
493                .map(|s| s.as_str());
494            q == Some("A02") && p == Some("E")
495        }))
496    }
497
498    /// [15] wenn SG3 AJT+A01/A04/A06/A09+E_1008 vorhanden
499    fn evaluate_15(&self, ctx: &EvaluationContext) -> ConditionResult {
500        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
501            let q = seg
502                .elements
503                .first()
504                .and_then(|e| e.first())
505                .map(|s| s.as_str());
506            let p = seg
507                .elements
508                .get(1)
509                .and_then(|e| e.first())
510                .map(|s| s.as_str());
511            matches!(q, Some("A01") | Some("A04") | Some("A06") | Some("A09")) && p == Some("E")
512        }))
513    }
514
515    /// [16] wenn SG3 AJT+A03+E_1008 vorhanden
516    fn evaluate_16(&self, ctx: &EvaluationContext) -> ConditionResult {
517        ctx.has_qualified_value("AJT", 0, "A03", 1, 0, &["E_1008"])
518    }
519
520    /// [17] wenn SG3 AJT+A15+E_1008 vorhanden
521    fn evaluate_17(&self, ctx: &EvaluationContext) -> ConditionResult {
522        ctx.has_qualified_value("AJT", 0, "A15", 1, 0, &["E_1008"])
523    }
524
525    /// [18] wenn SG3 AJT+A05/A10/A11+E_1008 vorhanden
526    fn evaluate_18(&self, ctx: &EvaluationContext) -> ConditionResult {
527        let ajt_segments = ctx.find_segments("AJT");
528        let found = ajt_segments.iter().any(|seg| {
529            let qual = seg
530                .elements
531                .first()
532                .and_then(|e| e.first())
533                .map(|s| s.as_str());
534            let pos = seg
535                .elements
536                .get(1)
537                .and_then(|e| e.first())
538                .map(|s| s.as_str());
539            matches!(qual, Some("A05") | Some("A10") | Some("A11")) && pos == Some("E_1008")
540        });
541        ConditionResult::from(found)
542    }
543
544    /// [19] wenn SG3 AJT+A99+E_0265/E_0271/E_0274/E_0516/E_0520/E_0567 vorhanden
545    fn evaluate_19(&self, ctx: &EvaluationContext) -> ConditionResult {
546        ctx.has_qualified_value(
547            "AJT",
548            0,
549            "A99",
550            1,
551            0,
552            &["E_0265", "E_0271", "E_0274", "E_0516", "E_0520", "E_0567"],
553        )
554    }
555
556    /// [20] wenn SG3 AJT+A01/A02/A03/A04/A06/A07/A09/A15+E_1008 vorhanden
557    fn evaluate_20(&self, ctx: &EvaluationContext) -> ConditionResult {
558        let ajt_segments = ctx.find_segments("AJT");
559        let found = ajt_segments.iter().any(|seg| {
560            let qual = seg
561                .elements
562                .first()
563                .and_then(|e| e.first())
564                .map(|s| s.as_str());
565            let pos = seg
566                .elements
567                .get(1)
568                .and_then(|e| e.first())
569                .map(|s| s.as_str());
570            matches!(
571                qual,
572                Some("A01")
573                    | Some("A02")
574                    | Some("A03")
575                    | Some("A04")
576                    | Some("A06")
577                    | Some("A07")
578                    | Some("A09")
579                    | Some("A15")
580            ) && pos == Some("E_1008")
581        });
582        ConditionResult::from(found)
583    }
584
585    /// [21] wenn im DE3155 in demselben COM der Code EM vorhanden ist
586    fn evaluate_21(&self, ctx: &EvaluationContext) -> ConditionResult {
587        let com_segments = ctx.find_segments("COM");
588        ConditionResult::from(com_segments.iter().any(|seg| {
589            seg.elements
590                .first()
591                .and_then(|e| e.get(1))
592                .map(|s| s.as_str())
593                == Some("EM")
594        }))
595    }
596
597    /// [22] wenn im DE3155 in demselben COM der Code TE / FX / AJ / AL vorhanden ist
598    fn evaluate_22(&self, ctx: &EvaluationContext) -> ConditionResult {
599        let com_segments = ctx.find_segments("COM");
600        ConditionResult::from(com_segments.iter().any(|seg| {
601            matches!(
602                seg.elements
603                    .first()
604                    .and_then(|e| e.get(1))
605                    .map(|s| s.as_str()),
606                Some("TE") | Some("FX") | Some("AJ") | Some("AL")
607            )
608        }))
609    }
610
611    /// [23] Wenn MP-ID in NAD+MS (Nachrichtensender) mit Rolle MSB vorhanden
612    /// EXTERNAL: Requires context from outside the message.
613    fn evaluate_23(&self, ctx: &EvaluationContext) -> ConditionResult {
614        ctx.external.evaluate("sender_is_msb")
615    }
616
617    /// [24] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle ESA vorhanden
618    /// EXTERNAL: Requires context from outside the message.
619    fn evaluate_24(&self, ctx: &EvaluationContext) -> ConditionResult {
620        ctx.external.evaluate("recipient_is_esa")
621    }
622
623    /// [25] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle LF vorhanden
624    /// EXTERNAL: Requires context from outside the message.
625    fn evaluate_25(&self, ctx: &EvaluationContext) -> ConditionResult {
626        ctx.external.evaluate("recipient_is_lf")
627    }
628
629    /// [26] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle NB vorhanden
630    /// EXTERNAL: Requires context from outside the message.
631    fn evaluate_26(&self, ctx: &EvaluationContext) -> ConditionResult {
632        ctx.external.evaluate("recipient_is_nb")
633    }
634
635    /// [27] Wenn MP-ID in NAD+MS (Nachrichtensender) mit Rolle NB vorhanden
636    /// EXTERNAL: Requires context from outside the message.
637    fn evaluate_27(&self, ctx: &EvaluationContext) -> ConditionResult {
638        ctx.external.evaluate("sender_is_nb")
639    }
640
641    /// [28] Angabe der Datenaustauschreferenz aus der CONTRL
642    /// EXTERNAL: Requires context from outside the message.
643    // REVIEW: Condition states the field contains the data exchange reference from a prior CONTRL message. Whether the COMDIS is responding to a CONTRL cannot be determined from the EDIFACT message content alone — it depends on external business context about which prior message triggered this dispute. (medium confidence)
644    fn evaluate_28(&self, ctx: &EvaluationContext) -> ConditionResult {
645        ctx.external.evaluate("responding_to_contrl")
646    }
647
648    /// [29] Angabe der Datenaustauschreferenz aus der APERAK
649    /// EXTERNAL: Requires context from outside the message.
650    // REVIEW: Condition states the field contains the data exchange reference from a prior APERAK message. Whether the COMDIS is responding to an APERAK cannot be determined from the EDIFACT message content alone — it depends on external business context about which prior message triggered this dispute. (medium confidence)
651    fn evaluate_29(&self, ctx: &EvaluationContext) -> ConditionResult {
652        ctx.external.evaluate("responding_to_aperak")
653    }
654
655    /// [30] Angabe der Nachrichtennummer aus der APERAK
656    /// EXTERNAL: Requires context from outside the message.
657    // REVIEW: Condition states the field contains the message number from a prior APERAK. Like condition 29, whether the COMDIS is responding to an APERAK is external business context, not determinable from message content. Shares the same external predicate as condition 29. (medium confidence)
658    fn evaluate_30(&self, ctx: &EvaluationContext) -> ConditionResult {
659        ctx.external.evaluate("responding_to_aperak")
660    }
661
662    /// [492] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) aus Sparte Strom
663    /// EXTERNAL: Requires context from outside the message.
664    // REVIEW: Whether NAD+MR MP-ID belongs to Sparte Strom cannot be determined from the EDIFACT message content alone — it requires external business context (market participant registry or configuration). (medium confidence)
665    fn evaluate_492(&self, ctx: &EvaluationContext) -> ConditionResult {
666        ctx.external.evaluate("recipient_is_electricity_sector")
667    }
668
669    /// [493] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) aus Sparte Gas
670    /// EXTERNAL: Requires context from outside the message.
671    // REVIEW: Whether NAD+MR MP-ID belongs to Sparte Gas cannot be determined from the EDIFACT message content alone — it requires external business context (market participant registry or configuration). (medium confidence)
672    fn evaluate_493(&self, ctx: &EvaluationContext) -> ConditionResult {
673        ctx.external.evaluate("recipient_is_gas_sector")
674    }
675
676    /// [505] Hinweis: BGM DE1004 aus der vorher per REMADV abgelehnten INVOIC-Nachricht
677    fn evaluate_505(&self, _ctx: &EvaluationContext) -> ConditionResult {
678        ConditionResult::True
679    }
680
681    /// [506] Hinweis: BGM DE1004 aus der vorher per IFTSTA abgelehnten MSCONS-Nachricht
682    fn evaluate_506(&self, _ctx: &EvaluationContext) -> ConditionResult {
683        ConditionResult::True
684    }
685
686    /// [508] Hinweis: Es darf nur eine Information im DE3148 übermittelt werden
687    fn evaluate_508(&self, _ctx: &EvaluationContext) -> ConditionResult {
688        // Hinweis: Es darf nur eine Information im DE3148 übermittelt werden — informational note, always applies
689        ConditionResult::True
690    }
691
692    /// [509] Hinweis: Wenn Eingang der zugrundeliegenden Nachricht vor dem 06.06.2025, 00:00 Uhr bestätigt wurde
693    fn evaluate_509(&self, _ctx: &EvaluationContext) -> ConditionResult {
694        // Hinweis: Wenn Eingang der zugrundeliegenden Nachricht vor dem 06.06.2025, 00:00 Uhr bestätigt wurde — informational note, always applies
695        ConditionResult::True
696    }
697
698    /// [510] Hinweis: Wenn Eingang der zugrundeliegenden Nachricht nach dem 06.06.2025, 00:00 Uhr bestätigt wurde
699    fn evaluate_510(&self, _ctx: &EvaluationContext) -> ConditionResult {
700        // Hinweis: Wenn Eingang der zugrundeliegenden Nachricht nach dem 06.06.2025, 00:00 Uhr bestätigt wurde — informational note, always applies
701        ConditionResult::True
702    }
703
704    /// [930] Format: max. 2 Nachkommastellen
705    // REVIEW: Format condition for max 2 decimal places. COMDIS carries monetary amounts (MOA) as the primary numeric value segment. Using MOA elements[0][1] for the amount value. (medium confidence)
706    fn evaluate_930(&self, ctx: &EvaluationContext) -> ConditionResult {
707        // Format: max. 2 Nachkommastellen
708        let segs = ctx.find_segments("MOA");
709        match segs
710            .first()
711            .and_then(|s| s.elements.first())
712            .and_then(|e| e.get(1))
713        {
714            Some(val) => validate_max_decimal_places(val, 2),
715            None => ConditionResult::False, // segment absent → condition not applicable
716        }
717    }
718
719    /// [931] Format: ZZZ = +00
720    fn evaluate_931(&self, ctx: &EvaluationContext) -> ConditionResult {
721        // Format: ZZZ = +00 — timezone must be UTC
722        let dtm_segs = ctx.find_segments("DTM");
723        match dtm_segs
724            .first()
725            .and_then(|s| s.elements.first())
726            .and_then(|e| e.get(1))
727        {
728            Some(val) => validate_timezone_utc(val),
729            None => ConditionResult::False, // segment absent → condition not applicable
730        }
731    }
732
733    /// [939] Format: Die Zeichenkette muss die Zeichen @ und . enthalten
734    fn evaluate_939(&self, ctx: &EvaluationContext) -> ConditionResult {
735        let segs = ctx.find_segments("COM");
736        match segs
737            .first()
738            .and_then(|s| s.elements.first())
739            .and_then(|e| e.first())
740        {
741            Some(val) => validate_email(val),
742            None => ConditionResult::False, // segment absent → condition not applicable
743        }
744    }
745
746    /// [940] Format: Die Zeichenkette muss mit dem Zeichen + beginnen und danach dürfen nur noch Ziffern folgen
747    fn evaluate_940(&self, ctx: &EvaluationContext) -> ConditionResult {
748        let segs = ctx.find_segments("COM");
749        match segs
750            .first()
751            .and_then(|s| s.elements.first())
752            .and_then(|e| e.first())
753        {
754            Some(val) => validate_phone(val),
755            None => ConditionResult::False, // segment absent → condition not applicable
756        }
757    }
758}