Skip to main content

redispatch_xml/documents/
network_constraint.rs

1use serde::{Deserialize, Serialize};
2
3use crate::documents::activation::{ControlZoneRef, ResourceObjectRef};
4use crate::documents::planned_resource_schedule::GridElementCodingScheme;
5use crate::types::{
6    AttrV, AttrVWithScheme, Direction, DocumentId, DocumentVersion, MarketParticipantId,
7    MarketRoleType, MeasureUnit, Period, TimeInterval, UtcDateTime,
8};
9
10// ── DocumentType ──────────────────────────────────────────────────────────────
11
12/// `DocumentType` for `NetworkConstraintDocument` (always `B15`).
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
14pub enum NcdDocType {
15    /// Network constraint document.
16    #[serde(rename = "B15")]
17    NetworkConstraint,
18}
19
20/// `ProcessType` for `NetworkConstraintDocument` (always `A14`).
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
22pub enum NcdProcessType {
23    /// Forecast.
24    #[serde(rename = "A14")]
25    Forecast,
26}
27
28/// `BusinessType` for `NetworkConstraintTimeSeries`.
29#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
30pub enum NcdBusinessType {
31    /// Dispatchable production (eligible resource).
32    #[serde(rename = "A77")]
33    ProductionDispatchable,
34    /// Network element constraint.
35    #[serde(rename = "B59")]
36    NetworkElement,
37}
38
39/// Status codes for `NetworkConstraintTimeSeries`.
40#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
41pub enum NcdStatus {
42    /// Activated.
43    #[serde(rename = "A07")]
44    Activated,
45    /// Planned.
46    #[serde(rename = "A36")]
47    Planned,
48    /// Demand.
49    #[serde(rename = "Z06")]
50    Demand,
51}
52
53/// Optional document withdrawal status.
54#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
55pub struct NcdDocStatus {
56    /// Withdrawal code (only `"A13"` used).
57    #[serde(rename = "@v")]
58    pub v: String,
59}
60
61// ── NetworkConstraintTimeSeries ───────────────────────────────────────────────
62
63/// A single constraint time series within a `NetworkConstraintDocument`.
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
65pub struct NetworkConstraintTimeSeries {
66    /// Unique time-series identifier (max 35 chars).
67    #[serde(rename = "TimeSeriesIdentification")]
68    pub time_series_identification: AttrV<DocumentId>,
69    /// Business type: dispatchable production (`A77`) or network element (`B59`).
70    #[serde(rename = "BusinessType")]
71    pub business_type: AttrV<NcdBusinessType>,
72    /// Direction: up (`A01`) or down (`A02`).
73    #[serde(rename = "Direction")]
74    pub direction: AttrV<Direction>,
75    /// Control zone where the resource / element is located.
76    #[serde(rename = "ConnectingArea")]
77    pub connecting_area: ControlZoneRef,
78    /// Resource object identifier (BDEW resource code, NDE scheme).
79    #[serde(rename = "ResourceObject")]
80    pub resource_object: ResourceObjectRef,
81    /// Grid element EIC or resource code.
82    #[serde(rename = "GridElement")]
83    pub grid_element: AttrVWithScheme<String, GridElementCodingScheme>,
84    /// Physical unit of quantity values.
85    #[serde(rename = "MeasurementUnit")]
86    pub measurement_unit: AttrV<MeasureUnit>,
87    /// Optional activation status.
88    #[serde(rename = "Status", default, skip_serializing_if = "Option::is_none")]
89    pub status: Option<AttrV<NcdStatus>>,
90    /// Quarter-hour constraint data for the delivery day.
91    #[serde(rename = "Period")]
92    pub period: Period,
93}
94
95// ── NetworkConstraintDocument ─────────────────────────────────────────────────
96
97/// `NetworkConstraintDocument` — grid congestion constraint data submitted
98/// by TSOs to resource providers' NB.
99///
100/// XSD version: 1.1b (2025-04-01)  
101/// No XML namespace.
102#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
103#[serde(rename = "NetworkConstraintDocument")]
104pub struct NetworkConstraintDocument {
105    /// Unique document identifier (max 35 chars).
106    #[serde(rename = "DocumentIdentification")]
107    pub document_identification: AttrV<DocumentId>,
108    /// Document version number (1–999).
109    #[serde(rename = "DocumentVersion")]
110    pub document_version: AttrV<DocumentVersion>,
111    /// Document type (always `B15`).
112    #[serde(rename = "DocumentType")]
113    pub document_type: AttrV<NcdDocType>,
114    /// Process type (always `A14`).
115    #[serde(rename = "ProcessType")]
116    pub process_type: AttrV<NcdProcessType>,
117    /// Sender's market participant identifier.
118    #[serde(rename = "SenderIdentification")]
119    pub sender_identification: AttrVWithScheme<MarketParticipantId>,
120    /// Sender's market role.
121    #[serde(rename = "SenderRole")]
122    pub sender_role: AttrV<MarketRoleType>,
123    /// Receiver's market participant identifier.
124    #[serde(rename = "ReceiverIdentification")]
125    pub receiver_identification: AttrVWithScheme<MarketParticipantId>,
126    /// Receiver's market role.
127    #[serde(rename = "ReceiverRole")]
128    pub receiver_role: AttrV<MarketRoleType>,
129    /// Document creation timestamp (UTC, second precision).
130    #[serde(rename = "DocumentDateTime")]
131    pub document_date_time: AttrV<UtcDateTime>,
132    /// Delivery period covered (UTC interval).
133    #[serde(rename = "TimePeriodCovered")]
134    pub time_period_covered: AttrV<TimeInterval>,
135    /// Optional withdrawal status.
136    #[serde(rename = "DocStatus", default, skip_serializing_if = "Option::is_none")]
137    pub doc_status: Option<NcdDocStatus>,
138    /// Network constraint time series (0+; absent when `doc_status` is set).
139    #[serde(
140        rename = "NetworkConstraintTimeSeries",
141        default,
142        skip_serializing_if = "Vec::is_empty"
143    )]
144    pub time_series: Vec<NetworkConstraintTimeSeries>,
145}