#![deny(missing_docs)]
pub mod geraeteubernahme;
pub mod geraetewechsel;
pub mod preisanfrage;
pub mod preisliste;
pub mod rechnung;
pub mod stammdaten;
pub mod steuerungsauftrag;
pub mod stornierung;
pub use geraeteubernahme::{
ANFRAGE_PIDS, BESTELLUNG_PIDS, GeraeteubernahmeCommand, GeraeteubernahmeData,
GeraeteubernahmeEvent, GeraeteubernahmeProjection, GeraeteubernahmeRecord,
GeraeteubernahmeRecordData, GeraeteubernahmeState,
ORDRSP_DEADLINE_LABEL as GERAETEUBERNAHME_ORDRSP_DEADLINE_LABEL,
STORNIERUNG_PIDS as GERAETEUBERNAHME_STORNIERUNG_PIDS, WimGeraeteubernahmeWorkflow,
};
pub use geraetewechsel::{
APERAK_WINDOW_LABEL as GERAETEWECHSEL_APERAK_WINDOW_LABEL, DeviceChangeCommand,
DeviceChangeData, DeviceChangeEvent, DeviceChangeProjection, DeviceChangeRecord,
DeviceChangeState, WORKFLOW_NAME, WimDeviceChangeWorkflow,
};
pub use preisanfrage::{
PREISANFRAGE_DEADLINE_LABEL, PreisanfrageCommand, PreisanfrageData, PreisanfrageEvent,
PreisanfrageState, QUOTES_PIDS, REQOTE_PIDS, WimPreisanfrageWorkflow,
};
pub use preisliste::{
PRICAT_PIDS, PreislisteCommand, PreislisteData, PreislisteEvent, PreislisteState,
WimPreislisteWorkflow,
};
pub use rechnung::{
WIM_INVOIC_PIDS, WIM_RECHNUNG_WINDOW_LABEL, WORKFLOW_NAME as RECHNUNG_WORKFLOW_NAME,
WimRechnungCommand, WimRechnungEvent, WimRechnungState, WimRechnungWorkflow,
};
pub use stammdaten::{
ANFORDERUNG_PID, STAMMDATEN_DEADLINE_LABEL, StammdatenCommand, StammdatenData, StammdatenEvent,
StammdatenProjection, StammdatenRecord, StammdatenRecordData, StammdatenState,
UEBERMITTLUNG_PIDS, WimStammdatenWorkflow,
};
pub use steuerungsauftrag::{
STEUERUNGSAUFTRAG_DEADLINE_LABEL, SteuerungsCommandType, SteuerungsauftragCommand,
SteuerungsauftragData, SteuerungsauftragEvent, SteuerungsauftragState,
WORKFLOW_NAME as STEUERUNGSAUFTRAG_WORKFLOW_NAME, WimSteuerungsauftragWorkflow,
};
pub use stornierung::{
ABLEHNUNG_PID, BESTAETIGUNG_PID, STORNIERUNG_DEADLINE_LABEL, STORNIERUNG_PID,
StornierungCommand, StornierungData, StornierungEvent, StornierungProjection,
StornierungRecord, StornierungRecordData, StornierungState, WimStornierungWorkflow,
};
pub struct WimModule;
impl mako_engine::builder::EngineModule for WimModule {
fn name(&self) -> &'static str {
"wim"
}
fn workflow_names(&self) -> &'static [&'static str] {
&[
"wim-device-change",
"wim-geraeteubernahme",
"wim-stammdaten",
"wim-stornierung",
"wim-steuerungsauftrag",
"wim-preisanfrage",
"wim-preisliste",
"wim-rechnung",
]
}
fn register_pids_with_roles(
&self,
router: &mut mako_engine::pid_router::PidRouter,
roles: &mako_engine::marktrolle::DeploymentRoles,
) {
for pid in [11_001_u32, 11_002, 11_003] {
router.register(pid, "wim-device-change");
}
for &pid in geraeteubernahme::ANFRAGE_PIDS
.iter()
.chain(geraeteubernahme::BESTELLUNG_PIDS)
.chain(geraeteubernahme::STORNIERUNG_PIDS)
{
router.register(pid, "wim-geraeteubernahme");
}
if !roles.is_all() && roles.contains(mako_engine::marktrolle::Marktrolle::Nmsb) {
for pid in [19_001_u32, 19_002, 19_015, 19_016] {
router.register(pid, "wim-geraeteubernahme");
}
}
router.register(stammdaten::ANFORDERUNG_PID, "wim-stammdaten");
if !roles.is_all() && roles.contains(mako_engine::marktrolle::Marktrolle::Nb) {
for pid in stammdaten::UEBERMITTLUNG_PIDS {
router.register(pid, "wim-stammdaten");
}
}
for &pid in preisanfrage::REQOTE_PIDS
.iter()
.chain(preisanfrage::QUOTES_PIDS)
{
router.register(pid, "wim-preisanfrage");
}
for &pid in preisliste::PRICAT_PIDS {
router.register(pid, "wim-preisliste");
}
router.register(stornierung::STORNIERUNG_PID, "wim-stornierung");
for &pid in rechnung::WIM_INVOIC_PIDS {
router.register(pid, "wim-rechnung");
}
for &pid in geraetewechsel::IFTSTA_PIDS {
router.register(pid, "wim-device-change");
}
}
fn profile_requirements(&self) -> &'static [mako_engine::profile::ProfileRequirement] {
use mako_engine::profile::ProfileRequirement;
&[
ProfileRequirement {
message_type: "UTILMD",
label: "UTILMD Strom (WiM Gerätewechsel)",
},
ProfileRequirement {
message_type: "APERAK",
label: "APERAK (WiM)",
},
ProfileRequirement {
message_type: "ORDERS",
label: "ORDERS (WiM Geräteübernahme/Stammdaten)",
},
ProfileRequirement {
message_type: "ORDRSP",
label: "ORDRSP (WiM Geräteübernahme Bestätigung 19001/19002/19015/19016)",
},
ProfileRequirement {
message_type: "ORDCHG",
label: "ORDCHG (WiM Stornierung)",
},
ProfileRequirement {
message_type: "IFTSTA",
label: "IFTSTA Statusmeldung (WiM 21009–21018)",
},
ProfileRequirement {
message_type: "INVOIC",
label: "INVOIC WiM-Rechnung/MSB-Rechnung (31003, 31009)",
},
]
}
fn configure(&self) -> Result<(), String> {
let named: &[(&str, &[u32])] = &[
(
"geraeteubernahme::ANFRAGE_PIDS",
geraeteubernahme::ANFRAGE_PIDS,
),
(
"geraeteubernahme::BESTELLUNG_PIDS",
geraeteubernahme::BESTELLUNG_PIDS,
),
(
"geraeteubernahme::STORNIERUNG_PIDS",
geraeteubernahme::STORNIERUNG_PIDS,
),
("geraetewechsel::IFTSTA_PIDS", geraetewechsel::IFTSTA_PIDS),
];
for (name, pids) in named {
if pids.is_empty() {
return Err(format!(
"wim: PID slice '{name}' is empty — \
at least one PID must be registered for each workflow group",
));
}
}
if stammdaten::UEBERMITTLUNG_PIDS.is_empty() {
return Err("wim: stammdaten::UEBERMITTLUNG_PIDS is empty — \
at least one PID must be registered for the Stammdaten workflow"
.to_owned());
}
Ok(())
}
}