Skip to main content

automapper_validation/generated/fv2510/
comdis_conditions_fv2510.rs

1// <auto-generated>
2// Generated by automapper-generator generate-conditions
3// AHB: xml-migs-and-ahbs/FV2510/COMDIS_AHB_1_0g__20250401.xml
4// Generated: 2026-03-12T10:36:14Z
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 FV2510.
12pub struct ComdisConditionEvaluatorFV2510 {
13    // External condition IDs that require runtime context.
14    external_conditions: std::collections::HashSet<u32>,
15}
16
17impl Default for ComdisConditionEvaluatorFV2510 {
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 ComdisConditionEvaluatorFV2510 {
38    fn message_type(&self) -> &str {
39        "COMDIS"
40    }
41
42    fn format_version(&self) -> &str {
43        "FV2510"
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            492 => self.evaluate_492(ctx),
79            493 => self.evaluate_493(ctx),
80            505 => self.evaluate_505(ctx),
81            506 => self.evaluate_506(ctx),
82            508 => self.evaluate_508(ctx),
83            509 => self.evaluate_509(ctx),
84            510 => self.evaluate_510(ctx),
85            930 => self.evaluate_930(ctx),
86            931 => self.evaluate_931(ctx),
87            939 => self.evaluate_939(ctx),
88            940 => self.evaluate_940(ctx),
89            _ => ConditionResult::Unknown,
90        }
91    }
92
93    fn is_external(&self, condition: u32) -> bool {
94        self.external_conditions.contains(&condition)
95    }
96    fn is_known(&self, condition: u32) -> bool {
97        matches!(
98            condition,
99            1 | 2
100                | 3
101                | 4
102                | 5
103                | 6
104                | 7
105                | 8
106                | 9
107                | 10
108                | 11
109                | 12
110                | 13
111                | 14
112                | 15
113                | 16
114                | 17
115                | 18
116                | 19
117                | 20
118                | 21
119                | 22
120                | 23
121                | 24
122                | 25
123                | 26
124                | 27
125                | 28
126                | 29
127                | 30
128                | 492
129                | 493
130                | 505
131                | 506
132                | 508
133                | 509
134                | 510
135                | 930
136                | 931
137                | 939
138                | 940
139        )
140    }
141}
142
143impl ComdisConditionEvaluatorFV2510 {
144    /// [19] wenn SG3 AJT+A99+E_0265/E_0271/E_0274/E_0516/E_0520/E_0567 vorhanden
145    fn evaluate_19(&self, ctx: &EvaluationContext) -> ConditionResult {
146        ctx.has_qualified_value(
147            "AJT",
148            0,
149            "A99",
150            1,
151            0,
152            &["E_0265", "E_0271", "E_0274", "E_0516", "E_0520", "E_0567"],
153        )
154    }
155
156    /// [1] wenn SG3 AJT+Z61+S_0109 oder SG3 AJT+Z62+S_0109 vorhanden.
157    fn evaluate_1(&self, ctx: &EvaluationContext) -> ConditionResult {
158        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
159            let q = seg
160                .elements
161                .first()
162                .and_then(|e| e.first())
163                .map(|s| s.as_str());
164            let p = seg
165                .elements
166                .get(1)
167                .and_then(|e| e.first())
168                .map(|s| s.as_str());
169            matches!(q, Some("Z61") | Some("Z62")) && p == Some("S")
170        }))
171    }
172
173    /// [2] wenn SG3 AJT+Z58+S_0109 oder SG3 AJT+Z59+S_0109 oder SG3 AJT+Z60+S_0109 vorhanden.
174    fn evaluate_2(&self, ctx: &EvaluationContext) -> ConditionResult {
175        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
176            let q = seg
177                .elements
178                .first()
179                .and_then(|e| e.first())
180                .map(|s| s.as_str());
181            let p = seg
182                .elements
183                .get(1)
184                .and_then(|e| e.first())
185                .map(|s| s.as_str());
186            matches!(q, Some("Z58") | Some("Z59") | Some("Z60")) && p == Some("S")
187        }))
188    }
189
190    /// [3] Nur MP-ID aus Sparte Strom
191    /// EXTERNAL: Requires context from outside the message.
192    fn evaluate_3(&self, ctx: &EvaluationContext) -> ConditionResult {
193        ctx.external.evaluate("mp_id_from_electricity_sector")
194    }
195
196    /// [4] wenn SG3 AJT+Z58/Z59/Z60/Z61/Z62+S_0109 vorhanden
197    fn evaluate_4(&self, ctx: &EvaluationContext) -> ConditionResult {
198        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
199            let q = seg
200                .elements
201                .first()
202                .and_then(|e| e.first())
203                .map(|s| s.as_str());
204            let p = seg
205                .elements
206                .get(1)
207                .and_then(|e| e.first())
208                .map(|s| s.as_str());
209            matches!(
210                q,
211                Some("Z58") | Some("Z59") | Some("Z60") | Some("Z61") | Some("Z62")
212            ) && p == Some("S")
213        }))
214    }
215
216    /// [5] wenn SG3 AJT+A01/A02/A03/A04/A06/A07/A09/A12/A15+E_0504 vorhanden
217    fn evaluate_5(&self, ctx: &EvaluationContext) -> ConditionResult {
218        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
219            let q = seg
220                .elements
221                .first()
222                .and_then(|e| e.first())
223                .map(|s| s.as_str());
224            let p = seg
225                .elements
226                .get(1)
227                .and_then(|e| e.first())
228                .map(|s| s.as_str());
229            matches!(
230                q,
231                Some("A01")
232                    | Some("A02")
233                    | Some("A03")
234                    | Some("A04")
235                    | Some("A06")
236                    | Some("A07")
237                    | Some("A09")
238                    | Some("A12")
239                    | Some("A15")
240            ) && p == Some("E")
241        }))
242    }
243
244    /// [6] wenn SG3 AJT+A07+E_0504 vorhanden
245    fn evaluate_6(&self, ctx: &EvaluationContext) -> ConditionResult {
246        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
247            let q = seg
248                .elements
249                .first()
250                .and_then(|e| e.first())
251                .map(|s| s.as_str());
252            let p = seg
253                .elements
254                .get(1)
255                .and_then(|e| e.first())
256                .map(|s| s.as_str());
257            q == Some("A07") && p == Some("E")
258        }))
259    }
260
261    /// [7] wenn SG3 AJT+A02+E_0504 vorhanden
262    fn evaluate_7(&self, ctx: &EvaluationContext) -> ConditionResult {
263        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
264            let q = seg
265                .elements
266                .first()
267                .and_then(|e| e.first())
268                .map(|s| s.as_str());
269            let p = seg
270                .elements
271                .get(1)
272                .and_then(|e| e.first())
273                .map(|s| s.as_str());
274            q == Some("A02") && p == Some("E")
275        }))
276    }
277
278    /// [8] wenn SG3 AJT+A01/A04/A06/A09/A12+E_0504 vorhanden
279    fn evaluate_8(&self, ctx: &EvaluationContext) -> ConditionResult {
280        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
281            let q = seg
282                .elements
283                .first()
284                .and_then(|e| e.first())
285                .map(|s| s.as_str());
286            let p = seg
287                .elements
288                .get(1)
289                .and_then(|e| e.first())
290                .map(|s| s.as_str());
291            matches!(
292                q,
293                Some("A01") | Some("A04") | Some("A06") | Some("A09") | Some("A12")
294            ) && p == Some("E")
295        }))
296    }
297
298    /// [9] wenn SG3 AJT+A05/A10/A11/A14+E_0504 vorhanden
299    fn evaluate_9(&self, ctx: &EvaluationContext) -> ConditionResult {
300        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
301            let q = seg
302                .elements
303                .first()
304                .and_then(|e| e.first())
305                .map(|s| s.as_str());
306            let p = seg
307                .elements
308                .get(1)
309                .and_then(|e| e.first())
310                .map(|s| s.as_str());
311            matches!(q, Some("A05") | Some("A10") | Some("A11") | Some("A14")) && p == Some("E")
312        }))
313    }
314
315    /// [10] wenn SG3 AJT+A03+E_0504 vorhanden
316    fn evaluate_10(&self, ctx: &EvaluationContext) -> ConditionResult {
317        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
318            let q = seg
319                .elements
320                .first()
321                .and_then(|e| e.first())
322                .map(|s| s.as_str());
323            let p = seg
324                .elements
325                .get(1)
326                .and_then(|e| e.first())
327                .map(|s| s.as_str());
328            q == Some("A03") && p == Some("E")
329        }))
330    }
331
332    /// [11] wenn SG3 AJT+A15+E_0504 vorhanden
333    fn evaluate_11(&self, ctx: &EvaluationContext) -> ConditionResult {
334        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
335            let q = seg
336                .elements
337                .first()
338                .and_then(|e| e.first())
339                .map(|s| s.as_str());
340            let p = seg
341                .elements
342                .get(1)
343                .and_then(|e| e.first())
344                .map(|s| s.as_str());
345            q == Some("A15") && p == Some("E")
346        }))
347    }
348
349    /// [12] wenn SG3 AJT+A99+S_0109 vorhanden
350    fn evaluate_12(&self, ctx: &EvaluationContext) -> ConditionResult {
351        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
352            let q = seg
353                .elements
354                .first()
355                .and_then(|e| e.first())
356                .map(|s| s.as_str());
357            let p = seg
358                .elements
359                .get(1)
360                .and_then(|e| e.first())
361                .map(|s| s.as_str());
362            q == Some("A99") && p == Some("S")
363        }))
364    }
365
366    /// [13] wenn SG3 AJT+A07+E_1008 vorhanden
367    fn evaluate_13(&self, ctx: &EvaluationContext) -> ConditionResult {
368        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
369            let q = seg
370                .elements
371                .first()
372                .and_then(|e| e.first())
373                .map(|s| s.as_str());
374            let p = seg
375                .elements
376                .get(1)
377                .and_then(|e| e.first())
378                .map(|s| s.as_str());
379            q == Some("A07") && p == Some("E")
380        }))
381    }
382
383    /// [14] wenn SG3 AJT+A02+E_1008 vorhanden
384    fn evaluate_14(&self, ctx: &EvaluationContext) -> ConditionResult {
385        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
386            let q = seg
387                .elements
388                .first()
389                .and_then(|e| e.first())
390                .map(|s| s.as_str());
391            let p = seg
392                .elements
393                .get(1)
394                .and_then(|e| e.first())
395                .map(|s| s.as_str());
396            q == Some("A02") && p == Some("E")
397        }))
398    }
399
400    /// [15] wenn SG3 AJT+A01/A04/A06/A09+E_1008 vorhanden
401    fn evaluate_15(&self, ctx: &EvaluationContext) -> ConditionResult {
402        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
403            let q = seg
404                .elements
405                .first()
406                .and_then(|e| e.first())
407                .map(|s| s.as_str());
408            let p = seg
409                .elements
410                .get(1)
411                .and_then(|e| e.first())
412                .map(|s| s.as_str());
413            matches!(q, Some("A01") | Some("A04") | Some("A06") | Some("A09")) && p == Some("E")
414        }))
415    }
416
417    /// [16] wenn SG3 AJT+A03+E_1008 vorhanden
418    fn evaluate_16(&self, ctx: &EvaluationContext) -> ConditionResult {
419        ctx.has_qualified_value("AJT", 0, "A03", 1, 0, &["E_1008"])
420    }
421
422    /// [17] wenn SG3 AJT+A15+E_1008 vorhanden
423    fn evaluate_17(&self, ctx: &EvaluationContext) -> ConditionResult {
424        ctx.has_qualified_value("AJT", 0, "A15", 1, 0, &["E_1008"])
425    }
426
427    /// [18] wenn SG3 AJT+A05/A10/A11+E_1008 vorhanden
428    fn evaluate_18(&self, ctx: &EvaluationContext) -> ConditionResult {
429        let ajt_segments = ctx.find_segments("AJT");
430        let found = ajt_segments.iter().any(|seg| {
431            let qual = seg
432                .elements
433                .first()
434                .and_then(|e| e.first())
435                .map(|s| s.as_str());
436            let pos = seg
437                .elements
438                .get(1)
439                .and_then(|e| e.first())
440                .map(|s| s.as_str());
441            matches!(qual, Some("A05") | Some("A10") | Some("A11")) && pos == Some("E_1008")
442        });
443        ConditionResult::from(found)
444    }
445
446    /// [20] wenn SG3 AJT+A01/A02/A03/A04/A06/A07/A09/A15+E_1008 vorhanden
447    fn evaluate_20(&self, ctx: &EvaluationContext) -> ConditionResult {
448        let ajt_segments = ctx.find_segments("AJT");
449        let found = ajt_segments.iter().any(|seg| {
450            let qual = seg
451                .elements
452                .first()
453                .and_then(|e| e.first())
454                .map(|s| s.as_str());
455            let pos = seg
456                .elements
457                .get(1)
458                .and_then(|e| e.first())
459                .map(|s| s.as_str());
460            matches!(
461                qual,
462                Some("A01")
463                    | Some("A02")
464                    | Some("A03")
465                    | Some("A04")
466                    | Some("A06")
467                    | Some("A07")
468                    | Some("A09")
469                    | Some("A15")
470            ) && pos == Some("E_1008")
471        });
472        ConditionResult::from(found)
473    }
474
475    /// [21] wenn im DE3155 in demselben COM der Code EM vorhanden ist
476    fn evaluate_21(&self, ctx: &EvaluationContext) -> ConditionResult {
477        let com_segments = ctx.find_segments("COM");
478        ConditionResult::from(com_segments.iter().any(|seg| {
479            seg.elements
480                .first()
481                .and_then(|e| e.get(1))
482                .map(|s| s.as_str())
483                == Some("EM")
484        }))
485    }
486
487    /// [22] wenn im DE3155 in demselben COM der Code TE / FX / AJ / AL vorhanden ist
488    fn evaluate_22(&self, ctx: &EvaluationContext) -> ConditionResult {
489        let com_segments = ctx.find_segments("COM");
490        ConditionResult::from(com_segments.iter().any(|seg| {
491            matches!(
492                seg.elements
493                    .first()
494                    .and_then(|e| e.get(1))
495                    .map(|s| s.as_str()),
496                Some("TE") | Some("FX") | Some("AJ") | Some("AL")
497            )
498        }))
499    }
500
501    /// [23] Wenn MP-ID in NAD+MS (Nachrichtensender) mit Rolle MSB vorhanden
502    /// EXTERNAL: Requires context from outside the message.
503    fn evaluate_23(&self, ctx: &EvaluationContext) -> ConditionResult {
504        ctx.external.evaluate("sender_is_msb")
505    }
506
507    /// [24] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle ESA vorhanden
508    /// EXTERNAL: Requires context from outside the message.
509    fn evaluate_24(&self, ctx: &EvaluationContext) -> ConditionResult {
510        ctx.external.evaluate("recipient_is_esa")
511    }
512
513    /// [25] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle LF vorhanden
514    /// EXTERNAL: Requires context from outside the message.
515    fn evaluate_25(&self, ctx: &EvaluationContext) -> ConditionResult {
516        ctx.external.evaluate("recipient_is_lf")
517    }
518
519    /// [26] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle NB vorhanden
520    /// EXTERNAL: Requires context from outside the message.
521    fn evaluate_26(&self, ctx: &EvaluationContext) -> ConditionResult {
522        ctx.external.evaluate("recipient_is_nb")
523    }
524
525    /// [27] Wenn MP-ID in NAD+MS (Nachrichtensender) mit Rolle NB vorhanden
526    /// EXTERNAL: Requires context from outside the message.
527    fn evaluate_27(&self, ctx: &EvaluationContext) -> ConditionResult {
528        ctx.external.evaluate("sender_is_nb")
529    }
530
531    /// [28] Angabe der Datenaustauschreferenz aus der CONTRL
532    /// EXTERNAL: Requires context from outside the message.
533    // 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)
534    fn evaluate_28(&self, ctx: &EvaluationContext) -> ConditionResult {
535        ctx.external.evaluate("responding_to_contrl")
536    }
537
538    /// [29] Angabe der Datenaustauschreferenz aus der APERAK
539    /// EXTERNAL: Requires context from outside the message.
540    // 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)
541    fn evaluate_29(&self, ctx: &EvaluationContext) -> ConditionResult {
542        ctx.external.evaluate("responding_to_aperak")
543    }
544
545    /// [30] Angabe der Nachrichtennummer aus der APERAK
546    /// EXTERNAL: Requires context from outside the message.
547    // 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)
548    fn evaluate_30(&self, ctx: &EvaluationContext) -> ConditionResult {
549        ctx.external.evaluate("responding_to_aperak")
550    }
551
552    /// [492] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) aus Sparte Strom
553    /// EXTERNAL: Requires context from outside the message.
554    // 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)
555    fn evaluate_492(&self, ctx: &EvaluationContext) -> ConditionResult {
556        ctx.external.evaluate("recipient_is_electricity_sector")
557    }
558
559    /// [493] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) aus Sparte Gas
560    /// EXTERNAL: Requires context from outside the message.
561    // 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)
562    fn evaluate_493(&self, ctx: &EvaluationContext) -> ConditionResult {
563        ctx.external.evaluate("recipient_is_gas_sector")
564    }
565
566    /// [505] Hinweis: BGM DE1004 aus der vorher per REMADV abgelehnten INVOIC-Nachricht
567    fn evaluate_505(&self, _ctx: &EvaluationContext) -> ConditionResult {
568        ConditionResult::True
569    }
570
571    /// [506] Hinweis: BGM DE1004 aus der vorher per IFTSTA abgelehnten MSCONS-Nachricht
572    fn evaluate_506(&self, _ctx: &EvaluationContext) -> ConditionResult {
573        ConditionResult::True
574    }
575
576    /// [508] Hinweis: Es darf nur eine Information im DE3148 übermittelt werden
577    fn evaluate_508(&self, _ctx: &EvaluationContext) -> ConditionResult {
578        // Hinweis: Es darf nur eine Information im DE3148 übermittelt werden — informational note, always applies
579        ConditionResult::True
580    }
581
582    /// [509] Hinweis: Wenn Eingang der zugrundeliegenden Nachricht vor dem 06.06.2025, 00:00 Uhr bestätigt wurde
583    fn evaluate_509(&self, _ctx: &EvaluationContext) -> ConditionResult {
584        // Hinweis: Wenn Eingang der zugrundeliegenden Nachricht vor dem 06.06.2025, 00:00 Uhr bestätigt wurde — informational note, always applies
585        ConditionResult::True
586    }
587
588    /// [510] Hinweis: Wenn Eingang der zugrundeliegenden Nachricht nach dem 06.06.2025, 00:00 Uhr bestätigt wurde
589    fn evaluate_510(&self, _ctx: &EvaluationContext) -> ConditionResult {
590        // Hinweis: Wenn Eingang der zugrundeliegenden Nachricht nach dem 06.06.2025, 00:00 Uhr bestätigt wurde — informational note, always applies
591        ConditionResult::True
592    }
593
594    /// [930] Format: max. 2 Nachkommastellen
595    // 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)
596    fn evaluate_930(&self, ctx: &EvaluationContext) -> ConditionResult {
597        // Format: max. 2 Nachkommastellen
598        let segs = ctx.find_segments("MOA");
599        match segs
600            .first()
601            .and_then(|s| s.elements.first())
602            .and_then(|e| e.get(1))
603        {
604            Some(val) => validate_max_decimal_places(val, 2),
605            None => ConditionResult::False, // segment absent → condition not applicable
606        }
607    }
608
609    /// [931] Format: ZZZ = +00
610    fn evaluate_931(&self, ctx: &EvaluationContext) -> ConditionResult {
611        // Format: ZZZ = +00 — timezone must be UTC
612        let dtm_segs = ctx.find_segments("DTM");
613        match dtm_segs
614            .first()
615            .and_then(|s| s.elements.first())
616            .and_then(|e| e.get(1))
617        {
618            Some(val) => validate_timezone_utc(val),
619            None => ConditionResult::False, // segment absent → condition not applicable
620        }
621    }
622
623    /// [939] Format: Die Zeichenkette muss die Zeichen @ und . enthalten
624    fn evaluate_939(&self, ctx: &EvaluationContext) -> ConditionResult {
625        let segs = ctx.find_segments("COM");
626        match segs
627            .first()
628            .and_then(|s| s.elements.first())
629            .and_then(|e| e.first())
630        {
631            Some(val) => validate_email(val),
632            None => ConditionResult::False, // segment absent → condition not applicable
633        }
634    }
635
636    /// [940] Format: Die Zeichenkette muss mit dem Zeichen + beginnen und danach dürfen nur noch Ziffern folgen
637    fn evaluate_940(&self, ctx: &EvaluationContext) -> ConditionResult {
638        let segs = ctx.find_segments("COM");
639        match segs
640            .first()
641            .and_then(|s| s.elements.first())
642            .and_then(|e| e.first())
643        {
644            Some(val) => validate_phone(val),
645            None => ConditionResult::False, // segment absent → condition not applicable
646        }
647    }
648}