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