Skip to main content

redispatch_xml/documents/
planned_resource_schedule.rs

1use serde::{Deserialize, Serialize};
2
3use crate::documents::activation::{ControlZoneRef, EicCodingScheme};
4use crate::types::{
5    AttrV, AttrVWithScheme, Direction, DocumentId, DocumentVersion, MarketParticipantId,
6    MarketRoleType, MeasureUnit, Period, TimeInterval, UtcDateTime,
7};
8
9// ── DocumentType ──────────────────────────────────────────────────────────────
10
11/// `DocumentType` codes for `PlannedResourceScheduleDocument`.
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
13pub enum PrsDocType {
14    /// Day-ahead plan.
15    #[serde(rename = "A14")]
16    DayAheadPlan,
17    /// Intraday plan (Planungsdaten).
18    #[serde(rename = "Z08")]
19    IntradayPlan,
20    /// Stammdaten-based plan.
21    #[serde(rename = "Z09")]
22    StammdatenPlan,
23    /// Aggregate plan.
24    #[serde(rename = "Z11")]
25    AggregatePlan,
26    /// Corrected plan.
27    #[serde(rename = "Z12")]
28    CorrectedPlan,
29}
30
31/// `ProcessType` for `PlannedResourceScheduleDocument` (always forecast).
32#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
33pub enum PrsProcessType {
34    /// Forecast (day-ahead / intraday).
35    #[serde(rename = "A14")]
36    Forecast,
37}
38
39/// `BusinessType` codes for `PlannedResourceTimeSeries`.
40#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
41pub enum PrsBusinessType {
42    #[serde(rename = "A01")]
43    Production,
44    #[serde(rename = "A04")]
45    Consumption,
46    #[serde(rename = "A10")]
47    GenerationForecast,
48    #[serde(rename = "A11")]
49    ConsumptionForecast,
50    #[serde(rename = "A12")]
51    GenerationSchedule,
52    #[serde(rename = "A46")]
53    SystemOperatorRedispatching,
54    #[serde(rename = "A60")]
55    TransmissionCapacity,
56    #[serde(rename = "A61")]
57    ExchangeSchedule,
58    #[serde(rename = "A77")]
59    ProductionDispatchable,
60    #[serde(rename = "A79")]
61    ConsumptionDispatchable,
62    #[serde(rename = "A85")]
63    InternalRedispatch,
64    #[serde(rename = "A93")]
65    ControllableGeneration,
66    #[serde(rename = "A94")]
67    ControllableConsumption,
68    #[serde(rename = "B59")]
69    NetworkElement,
70    #[serde(rename = "Z05")]
71    Flexibility,
72}
73
74/// `Status` codes for `PlannedResourceTimeSeries`.
75#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
76pub enum PrsTimeSeriesStatus {
77    /// Activated.
78    #[serde(rename = "A07")]
79    Activated,
80    /// Planned.
81    #[serde(rename = "A36")]
82    Planned,
83    /// Bedarf (demand / requested).
84    #[serde(rename = "Z06")]
85    Demand,
86}
87
88/// Product code (always `"8716867000016"` — active power).
89#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
90pub enum Product {
91    /// Active power.
92    #[serde(rename = "8716867000016")]
93    ActivePower,
94}
95
96/// Coding scheme for grid element identifiers.
97#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
98pub enum GridElementCodingScheme {
99    /// EIC.
100    #[serde(rename = "A01")]
101    Eic,
102    /// National resource code.
103    #[serde(rename = "A02")]
104    NationalResource,
105    /// Other national scheme.
106    #[serde(rename = "Z01")]
107    Other,
108}
109
110// ── PlannedResourceTimeSeries ─────────────────────────────────────────────────
111
112/// A single planned resource time series within a
113/// `PlannedResourceScheduleDocument`.
114#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
115pub struct PlannedResourceTimeSeries {
116    /// Unique time-series identifier within this document (max 35 chars).
117    #[serde(rename = "TimeSeriesIdentification")]
118    pub time_series_identification: AttrV<DocumentId>,
119    /// Business type.
120    #[serde(rename = "BusinessType")]
121    pub business_type: AttrV<PrsBusinessType>,
122    /// Redispatch direction (optional — absent for non-directional series).
123    #[serde(rename = "Direction", default, skip_serializing_if = "Option::is_none")]
124    pub direction: Option<AttrV<Direction>>,
125    /// Control zone where the resource is connected (optional).
126    #[serde(
127        rename = "ConnectingArea",
128        default,
129        skip_serializing_if = "Option::is_none"
130    )]
131    pub connecting_area: Option<ControlZoneRef>,
132    /// Resource object identifier (optional).
133    #[serde(
134        rename = "ResourceObject",
135        default,
136        skip_serializing_if = "Option::is_none"
137    )]
138    pub resource_object: Option<AttrVWithScheme<String, GridElementCodingScheme>>,
139    /// Product code (always active power `8716867000016`).
140    #[serde(rename = "Product")]
141    pub product: AttrV<Product>,
142    /// German TSO control block reference (optional).
143    #[serde(
144        rename = "AcquiringArea",
145        default,
146        skip_serializing_if = "Option::is_none"
147    )]
148    pub acquiring_area: Option<AttrVWithScheme<String, EicCodingScheme>>,
149    /// Grid element EIC or resource code (optional).
150    #[serde(
151        rename = "GridElement",
152        default,
153        skip_serializing_if = "Option::is_none"
154    )]
155    pub grid_element: Option<AttrVWithScheme<String, GridElementCodingScheme>>,
156    /// Physical unit of quantity values.
157    #[serde(rename = "MeasureUnit")]
158    pub measure_unit: AttrV<MeasureUnit>,
159    /// Time series status (optional).
160    #[serde(rename = "Status", default, skip_serializing_if = "Option::is_none")]
161    pub status: Option<AttrV<PrsTimeSeriesStatus>>,
162    /// Resource provider (optional).
163    #[serde(
164        rename = "ResourceProvider",
165        default,
166        skip_serializing_if = "Option::is_none"
167    )]
168    pub resource_provider: Option<AttrVWithScheme<MarketParticipantId>>,
169    /// Quarter-hour power plan for the delivery day.
170    #[serde(rename = "Period")]
171    pub period: Period,
172}
173
174// ── PlannedResourceScheduleDocument ──────────────────────────────────────────
175
176/// `PlannedResourceScheduleDocument` — day-ahead and intraday resource
177/// planning data submitted by resource providers and DSOs.
178///
179/// XSD version: 1.0f (Fehlerkorrektur 2026-02-19)  
180/// No XML namespace (no `targetNamespace` in XSD).
181#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
182#[serde(rename = "PlannedResourceScheduleDocument")]
183pub struct PlannedResourceScheduleDocument {
184    /// Unique document identifier (max 35 chars).
185    #[serde(rename = "DocumentIdentification")]
186    pub document_identification: AttrV<DocumentId>,
187    /// Document version number (1–999).
188    #[serde(rename = "DocumentVersion")]
189    pub document_version: AttrV<DocumentVersion>,
190    /// Document type.
191    #[serde(rename = "DocumentType")]
192    pub document_type: AttrV<PrsDocType>,
193    /// Process type (always forecast).
194    #[serde(rename = "ProcessType")]
195    pub process_type: AttrV<PrsProcessType>,
196    /// Sender's market participant identifier.
197    #[serde(rename = "SenderIdentification")]
198    pub sender_identification: AttrVWithScheme<MarketParticipantId>,
199    /// Sender's market role.
200    #[serde(rename = "SenderRole")]
201    pub sender_role: AttrV<MarketRoleType>,
202    /// Receiver's market participant identifier.
203    #[serde(rename = "ReceiverIdentification")]
204    pub receiver_identification: AttrVWithScheme<MarketParticipantId>,
205    /// Receiver's market role.
206    #[serde(rename = "ReceiverRole")]
207    pub receiver_role: AttrV<MarketRoleType>,
208    /// Document creation timestamp (UTC, second precision).
209    #[serde(rename = "DocumentDateTime")]
210    pub document_date_time: AttrV<UtcDateTime>,
211    /// Delivery period covered by this document (UTC interval).
212    #[serde(rename = "TimePeriodCovered")]
213    pub time_period_covered: AttrV<TimeInterval>,
214    /// Planned resource time series (one or more).
215    #[serde(rename = "PlannedResourceTimeSeries", default)]
216    pub time_series: Vec<PlannedResourceTimeSeries>,
217}