Skip to main content

automapper_validation/generated/fv2504/
comdis_conditions_fv2504.rs

1// <auto-generated>
2// Generated by automapper-generator generate-conditions
3// AHB: xml-migs-and-ahbs/FV2504/COMDIS_AHB_1_0f_außerordentliche_20250131.xml
4// Generated: 2026-03-12T07:43:10Z
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 FV2504.
12pub struct ComdisConditionEvaluatorFV2504 {
13    // External condition IDs that require runtime context.
14    external_conditions: std::collections::HashSet<u32>,
15}
16
17impl Default for ComdisConditionEvaluatorFV2504 {
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 ComdisConditionEvaluatorFV2504 {
38    fn message_type(&self) -> &str {
39        "COMDIS"
40    }
41
42    fn format_version(&self) -> &str {
43        "FV2504"
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 ComdisConditionEvaluatorFV2504 {
144    /// [23] Wenn MP-ID in NAD+MS (Nachrichtensender) mit Rolle MSB vorhanden
145    /// EXTERNAL: Requires context from outside the message.
146    fn evaluate_23(&self, ctx: &EvaluationContext) -> ConditionResult {
147        ctx.external.evaluate("sender_is_msb")
148    }
149
150    /// [24] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle ESA vorhanden
151    /// EXTERNAL: Requires context from outside the message.
152    fn evaluate_24(&self, ctx: &EvaluationContext) -> ConditionResult {
153        ctx.external.evaluate("recipient_is_esa")
154    }
155
156    /// [25] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle LF vorhanden
157    /// EXTERNAL: Requires context from outside the message.
158    fn evaluate_25(&self, ctx: &EvaluationContext) -> ConditionResult {
159        ctx.external.evaluate("recipient_is_lf")
160    }
161
162    /// [26] Wenn MP-ID in NAD+MR (Nachrichtenempfänger) mit Rolle NB vorhanden
163    /// EXTERNAL: Requires context from outside the message.
164    fn evaluate_26(&self, ctx: &EvaluationContext) -> ConditionResult {
165        ctx.external.evaluate("recipient_is_nb")
166    }
167
168    /// [27] Wenn MP-ID in NAD+MS (Nachrichtensender) mit Rolle NB vorhanden
169    /// EXTERNAL: Requires context from outside the message.
170    fn evaluate_27(&self, ctx: &EvaluationContext) -> ConditionResult {
171        ctx.external.evaluate("sender_is_nb")
172    }
173
174    /// [1] wenn SG3 AJT+Z61+S_0109 oder SG3 AJT+Z62+S_0109 vorhanden.
175    fn evaluate_1(&self, ctx: &EvaluationContext) -> ConditionResult {
176        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
177            let q = seg
178                .elements
179                .first()
180                .and_then(|e| e.first())
181                .map(|s| s.as_str());
182            let p = seg
183                .elements
184                .get(1)
185                .and_then(|e| e.first())
186                .map(|s| s.as_str());
187            matches!(q, Some("Z61") | Some("Z62")) && p == Some("S")
188        }))
189    }
190
191    /// [2] wenn SG3 AJT+Z58+S_0109 oder SG3 AJT+Z59+S_0109 oder SG3 AJT+Z60+S_0109 vorhanden.
192    fn evaluate_2(&self, ctx: &EvaluationContext) -> ConditionResult {
193        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
194            let q = seg
195                .elements
196                .first()
197                .and_then(|e| e.first())
198                .map(|s| s.as_str());
199            let p = seg
200                .elements
201                .get(1)
202                .and_then(|e| e.first())
203                .map(|s| s.as_str());
204            matches!(q, Some("Z58") | Some("Z59") | Some("Z60")) && p == Some("S")
205        }))
206    }
207
208    /// [3] Nur MP-ID aus Sparte Strom
209    /// EXTERNAL: Requires context from outside the message.
210    fn evaluate_3(&self, ctx: &EvaluationContext) -> ConditionResult {
211        ctx.external.evaluate("mp_id_from_electricity_sector")
212    }
213
214    /// [4] wenn SG3 AJT+Z58/Z59/Z60/Z61/Z62+S_0109 vorhanden
215    fn evaluate_4(&self, ctx: &EvaluationContext) -> ConditionResult {
216        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
217            let q = seg
218                .elements
219                .first()
220                .and_then(|e| e.first())
221                .map(|s| s.as_str());
222            let p = seg
223                .elements
224                .get(1)
225                .and_then(|e| e.first())
226                .map(|s| s.as_str());
227            matches!(
228                q,
229                Some("Z58") | Some("Z59") | Some("Z60") | Some("Z61") | Some("Z62")
230            ) && p == Some("S")
231        }))
232    }
233
234    /// [5] wenn SG3 AJT+A01/A02/A03/A04/A06/A07/A09/A12/A15+E_0504 vorhanden
235    fn evaluate_5(&self, ctx: &EvaluationContext) -> ConditionResult {
236        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
237            let q = seg
238                .elements
239                .first()
240                .and_then(|e| e.first())
241                .map(|s| s.as_str());
242            let p = seg
243                .elements
244                .get(1)
245                .and_then(|e| e.first())
246                .map(|s| s.as_str());
247            matches!(
248                q,
249                Some("A01")
250                    | Some("A02")
251                    | Some("A03")
252                    | Some("A04")
253                    | Some("A06")
254                    | Some("A07")
255                    | Some("A09")
256                    | Some("A12")
257                    | Some("A15")
258            ) && p == Some("E")
259        }))
260    }
261
262    /// [6] wenn SG3 AJT+A07+E_0504 vorhanden
263    fn evaluate_6(&self, ctx: &EvaluationContext) -> ConditionResult {
264        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
265            let q = seg
266                .elements
267                .first()
268                .and_then(|e| e.first())
269                .map(|s| s.as_str());
270            let p = seg
271                .elements
272                .get(1)
273                .and_then(|e| e.first())
274                .map(|s| s.as_str());
275            q == Some("A07") && p == Some("E")
276        }))
277    }
278
279    /// [7] wenn SG3 AJT+A02+E_0504 vorhanden
280    fn evaluate_7(&self, ctx: &EvaluationContext) -> ConditionResult {
281        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
282            let q = seg
283                .elements
284                .first()
285                .and_then(|e| e.first())
286                .map(|s| s.as_str());
287            let p = seg
288                .elements
289                .get(1)
290                .and_then(|e| e.first())
291                .map(|s| s.as_str());
292            q == Some("A02") && p == Some("E")
293        }))
294    }
295
296    /// [8] wenn SG3 AJT+A01/A04/A06/A09/A12+E_0504 vorhanden
297    fn evaluate_8(&self, ctx: &EvaluationContext) -> ConditionResult {
298        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
299            let q = seg
300                .elements
301                .first()
302                .and_then(|e| e.first())
303                .map(|s| s.as_str());
304            let p = seg
305                .elements
306                .get(1)
307                .and_then(|e| e.first())
308                .map(|s| s.as_str());
309            matches!(
310                q,
311                Some("A01") | Some("A04") | Some("A06") | Some("A09") | Some("A12")
312            ) && p == Some("E")
313        }))
314    }
315
316    /// [9] wenn SG3 AJT+A05/A10/A11/A14+E_0504 vorhanden
317    fn evaluate_9(&self, ctx: &EvaluationContext) -> ConditionResult {
318        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
319            let q = seg
320                .elements
321                .first()
322                .and_then(|e| e.first())
323                .map(|s| s.as_str());
324            let p = seg
325                .elements
326                .get(1)
327                .and_then(|e| e.first())
328                .map(|s| s.as_str());
329            matches!(q, Some("A05") | Some("A10") | Some("A11") | Some("A14")) && p == Some("E")
330        }))
331    }
332
333    /// [10] wenn SG3 AJT+A03+E_0504 vorhanden
334    fn evaluate_10(&self, ctx: &EvaluationContext) -> ConditionResult {
335        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
336            let q = seg
337                .elements
338                .first()
339                .and_then(|e| e.first())
340                .map(|s| s.as_str());
341            let p = seg
342                .elements
343                .get(1)
344                .and_then(|e| e.first())
345                .map(|s| s.as_str());
346            q == Some("A03") && p == Some("E")
347        }))
348    }
349
350    /// [11] wenn SG3 AJT+A15+E_0504 vorhanden
351    fn evaluate_11(&self, ctx: &EvaluationContext) -> ConditionResult {
352        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
353            let q = seg
354                .elements
355                .first()
356                .and_then(|e| e.first())
357                .map(|s| s.as_str());
358            let p = seg
359                .elements
360                .get(1)
361                .and_then(|e| e.first())
362                .map(|s| s.as_str());
363            q == Some("A15") && p == Some("E")
364        }))
365    }
366
367    /// [12] wenn SG3 AJT+A99+S_0109 vorhanden
368    fn evaluate_12(&self, ctx: &EvaluationContext) -> ConditionResult {
369        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
370            let q = seg
371                .elements
372                .first()
373                .and_then(|e| e.first())
374                .map(|s| s.as_str());
375            let p = seg
376                .elements
377                .get(1)
378                .and_then(|e| e.first())
379                .map(|s| s.as_str());
380            q == Some("A99") && p == Some("S")
381        }))
382    }
383
384    /// [13] wenn SG3 AJT+A07+E_1008 vorhanden
385    fn evaluate_13(&self, ctx: &EvaluationContext) -> ConditionResult {
386        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
387            let q = seg
388                .elements
389                .first()
390                .and_then(|e| e.first())
391                .map(|s| s.as_str());
392            let p = seg
393                .elements
394                .get(1)
395                .and_then(|e| e.first())
396                .map(|s| s.as_str());
397            q == Some("A07") && p == Some("E")
398        }))
399    }
400
401    /// [14] wenn SG3 AJT+A02+E_1008 vorhanden
402    fn evaluate_14(&self, ctx: &EvaluationContext) -> ConditionResult {
403        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
404            let q = seg
405                .elements
406                .first()
407                .and_then(|e| e.first())
408                .map(|s| s.as_str());
409            let p = seg
410                .elements
411                .get(1)
412                .and_then(|e| e.first())
413                .map(|s| s.as_str());
414            q == Some("A02") && p == Some("E")
415        }))
416    }
417
418    /// [15] wenn SG3 AJT+A01/A04/A06/A09+E_1008 vorhanden
419    fn evaluate_15(&self, ctx: &EvaluationContext) -> ConditionResult {
420        ConditionResult::from(ctx.find_segments("AJT").iter().any(|seg| {
421            let q = seg
422                .elements
423                .first()
424                .and_then(|e| e.first())
425                .map(|s| s.as_str());
426            let p = seg
427                .elements
428                .get(1)
429                .and_then(|e| e.first())
430                .map(|s| s.as_str());
431            matches!(q, Some("A01") | Some("A04") | Some("A06") | Some("A09")) && p == Some("E")
432        }))
433    }
434
435    /// [16] wenn SG3 AJT+A03+E_1008 vorhanden
436    fn evaluate_16(&self, ctx: &EvaluationContext) -> ConditionResult {
437        ctx.has_qualified_value("AJT", 0, "A03", 1, 0, &["E_1008"])
438    }
439
440    /// [17] wenn SG3 AJT+A15+E_1008 vorhanden
441    fn evaluate_17(&self, ctx: &EvaluationContext) -> ConditionResult {
442        ctx.has_qualified_value("AJT", 0, "A15", 1, 0, &["E_1008"])
443    }
444
445    /// [18] wenn SG3 AJT+A05/A10/A11+E_1008 vorhanden
446    fn evaluate_18(&self, ctx: &EvaluationContext) -> ConditionResult {
447        let ajt_segments = ctx.find_segments("AJT");
448        let found = ajt_segments.iter().any(|seg| {
449            let qual = seg
450                .elements
451                .first()
452                .and_then(|e| e.first())
453                .map(|s| s.as_str());
454            let pos = seg
455                .elements
456                .get(1)
457                .and_then(|e| e.first())
458                .map(|s| s.as_str());
459            matches!(qual, Some("A05") | Some("A10") | Some("A11")) && pos == Some("E_1008")
460        });
461        ConditionResult::from(found)
462    }
463
464    /// [19] wenn SG3 AJT+A99+E_0265/E_0516/E_0520/E_0567 vorhanden
465    fn evaluate_19(&self, ctx: &EvaluationContext) -> ConditionResult {
466        ctx.has_qualified_value(
467            "AJT",
468            0,
469            "A99",
470            1,
471            0,
472            &["E_0265", "E_0516", "E_0520", "E_0567"],
473        )
474    }
475
476    /// [20] wenn SG3 AJT+A01/A02/A03/A04/A06/A07/A09/A15+E_1008 vorhanden
477    fn evaluate_20(&self, ctx: &EvaluationContext) -> ConditionResult {
478        let ajt_segments = ctx.find_segments("AJT");
479        let found = ajt_segments.iter().any(|seg| {
480            let qual = seg
481                .elements
482                .first()
483                .and_then(|e| e.first())
484                .map(|s| s.as_str());
485            let pos = seg
486                .elements
487                .get(1)
488                .and_then(|e| e.first())
489                .map(|s| s.as_str());
490            matches!(
491                qual,
492                Some("A01")
493                    | Some("A02")
494                    | Some("A03")
495                    | Some("A04")
496                    | Some("A06")
497                    | Some("A07")
498                    | Some("A09")
499                    | Some("A15")
500            ) && pos == Some("E_1008")
501        });
502        ConditionResult::from(found)
503    }
504
505    /// [21] wenn im DE3155 in demselben COM der Code EM vorhanden ist
506    fn evaluate_21(&self, ctx: &EvaluationContext) -> ConditionResult {
507        let com_segments = ctx.find_segments("COM");
508        ConditionResult::from(com_segments.iter().any(|seg| {
509            seg.elements
510                .first()
511                .and_then(|e| e.get(1))
512                .map(|s| s.as_str())
513                == Some("EM")
514        }))
515    }
516
517    /// [22] wenn im DE3155 in demselben COM der Code TE / FX / AJ / AL vorhanden ist
518    fn evaluate_22(&self, ctx: &EvaluationContext) -> ConditionResult {
519        let com_segments = ctx.find_segments("COM");
520        ConditionResult::from(com_segments.iter().any(|seg| {
521            matches!(
522                seg.elements
523                    .first()
524                    .and_then(|e| e.get(1))
525                    .map(|s| s.as_str()),
526                Some("TE") | Some("FX") | Some("AJ") | Some("AL")
527            )
528        }))
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}