use edifact_rs::{OwnedSegment, ProfileRulePack, ValidationIssue, ValidationSeverity};
use crate::{
MessageType,
messages::{
core::MessageCore,
segments::{Bgm, Dtm, Nad, collect_dtm, find_bgm, find_nad},
},
};
#[derive(Debug, Clone)]
pub struct RemadvMessage {
pub(crate) core: MessageCore,
bgm: Option<Bgm>,
dtm: Vec<Dtm>,
sender: Option<Nad>,
receiver: Option<Nad>,
}
impl RemadvMessage {
#[must_use]
pub(crate) fn from_parts(
segments: Vec<OwnedSegment>,
message_ref: impl Into<Box<str>>,
assoc_code: impl Into<Box<str>>,
pruefidentifikator: Option<u32>,
) -> Self {
let (bgm, dtm, sender, receiver) = {
let borrowed: Vec<edifact_rs::Segment<'_>> =
segments.iter().map(|s| s.as_borrowed()).collect();
(
find_bgm(&borrowed),
collect_dtm(&borrowed),
find_nad(&borrowed, "MS"),
find_nad(&borrowed, "MR"),
)
};
Self {
core: MessageCore::new(
segments,
message_ref,
assoc_code,
pruefidentifikator,
MessageType::Remadv,
),
bgm,
dtm,
sender,
receiver,
}
}
#[must_use]
pub fn assoc_code(&self) -> &str {
&self.core.assoc_code
}
#[must_use]
pub fn segments(&self) -> &[OwnedSegment] {
&self.core.segments
}
#[must_use]
pub fn bgm(&self) -> Option<&Bgm> {
self.bgm.as_ref()
}
#[must_use]
pub fn dtm(&self) -> &[Dtm] {
&self.dtm
}
#[must_use]
pub fn sender(&self) -> Option<&Nad> {
self.sender.as_ref()
}
#[must_use]
pub fn receiver(&self) -> Option<&Nad> {
self.receiver.as_ref()
}
}
impl_edi_energy_message!(RemadvMessage, sem = remadv_semantic_pack());
fn remadv_semantic_pack() -> ProfileRulePack {
ProfileRulePack::new("REMADV-SEM")
.for_message_type("REMADV")
.with_stateless_rule_fn(
|segs: &[edifact_rs::Segment<'_>], issues: &mut Vec<ValidationIssue>| {
if !segs
.iter()
.any(|s| s.tag == "DTM" && s.component_str(0, 0) == Some("137"))
{
issues.push(
ValidationIssue::new(
ValidationSeverity::Error,
"DTM+137 (Zahlungsdatum / payment date) is missing",
)
.with_rule_id("SEM-REMADV-DTM-137-REQUIRED")
.with_segment("DTM")
.with_suggestion(
"Add DTM+137:<YYYYMMDD>:102' to specify the payment \
date (format 102 = CCYYMMDD per UN/EDIFACT)",
),
);
}
super::common::check_period_order(segs, "SEM-REMADV-PERIOD-ORDER", issues);
},
)
}