Skip to main content

automapper_validation/generated/fv2604/
comdis_conditions_fv2604.rs

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