Skip to main content

redispatch_xml/documents/
planned_resource_schedule.rs

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