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