Skip to main content

redispatch_xml/documents/
network_constraint.rs

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