1use serde::{Deserialize, Serialize};
2
3use crate::documents::activation::EicCodingScheme;
4use crate::types::{Decimal3, Mrid, RevisionNumber, SimpleContent, UtcDateTime, UtcMinuteDateTime};
5
6pub const NAMESPACE: &str = "urn:iec62325.351:tc57wg16:451-6:outagedocument:3:0";
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
15pub enum KaskadeStatus {
16 #[serde(rename = "A07")]
18 Activated,
19 #[serde(rename = "A10")]
21 Ordered,
22 #[serde(rename = "A16")]
24 Deactivation,
25 #[serde(rename = "A35")]
27 Preliminary,
28}
29
30#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
32pub enum KaskadeType {
33 #[serde(rename = "Z16")]
35 EmergencyMeasures,
36 #[serde(rename = "Z17")]
38 TestMessage,
39}
40
41#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
43pub enum KaskadeRoleType {
44 #[serde(rename = "A18")]
46 GridOperator,
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
51pub enum KaskadeBusinessType {
52 #[serde(rename = "A01")]
54 Production,
55 #[serde(rename = "A04")]
57 Consumption,
58}
59
60#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
62pub enum CurveType {
63 #[serde(rename = "A03")]
65 VariableSizedBlock,
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
70pub enum KaskadeMeasureUnit {
71 #[serde(rename = "MAW")]
73 Megawatt,
74}
75
76#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
78pub enum KaskadeReasonCode {
79 #[serde(rename = "Z19")]
81 LocalGridProblem,
82 #[serde(rename = "Z20")]
84 SystemBalanceProblem,
85}
86
87pub type ParticipantMrid = SimpleContent<String>;
91
92#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
94pub struct KaskadeMarketRole {
95 #[serde(rename = "type")]
97 pub role_type: KaskadeRoleType,
98}
99
100#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
102pub struct KaskadeParticipant {
103 #[serde(rename = "mRID")]
105 pub m_rid: ParticipantMrid,
106 #[serde(rename = "marketRole")]
108 pub market_role: KaskadeMarketRole,
109}
110
111#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
115pub struct StatusElement {
116 pub value: KaskadeStatus,
118}
119
120#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
124pub struct KaskadeTimeInterval {
125 #[serde(rename = "start", default, skip_serializing_if = "Option::is_none")]
127 pub start: Option<UtcMinuteDateTime>,
128 pub end: UtcMinuteDateTime,
130}
131
132#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
135pub struct AvailablePeriod {
136 #[serde(rename = "timeInterval")]
138 pub time_interval: KaskadeTimeInterval,
139 #[serde(
141 rename = "resolution",
142 default,
143 skip_serializing_if = "Option::is_none"
144 )]
145 pub resolution: Option<String>,
146 #[serde(rename = "Point", default, skip_serializing_if = "Vec::is_empty")]
148 pub points: Vec<KaskadePoint>,
149}
150
151#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
153pub struct KaskadePoint {
154 pub position: u32,
156 pub quantity: Decimal3,
158}
159
160#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
164pub struct KaskadeReason {
165 pub code: KaskadeReasonCode,
167 #[serde(
169 rename = "ReasonText",
170 default,
171 skip_serializing_if = "Option::is_none"
172 )]
173 pub reason_text: Option<String>,
174}
175
176#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
180pub enum ResourceObjScheme {
181 #[serde(rename = "A01")]
182 Eic,
183 #[serde(rename = "A02")]
184 NationalResource,
185 #[serde(rename = "NDE")]
186 Nde,
187 #[serde(rename = "Z01")]
188 Other,
189}
190
191pub type ResourceObjectRef = SimpleContent<String, ResourceObjScheme>;
193
194pub type BiddingZoneMrid = SimpleContent<String, EicCodingScheme>;
198
199#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
201pub struct BiddingZoneDomain {
202 #[serde(rename = "mRID")]
204 pub m_rid: BiddingZoneMrid,
205}
206
207#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
211pub struct QuantityMeasureUnit {
212 pub name: KaskadeMeasureUnit,
214}
215
216#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
220pub struct KaskadeTimeSeries {
221 #[serde(rename = "mRID")]
223 pub m_rid: Mrid,
224 #[serde(
226 rename = "senders_document_mRID",
227 default,
228 skip_serializing_if = "Option::is_none"
229 )]
230 pub senders_document_m_rid: Option<Mrid>,
231 #[serde(
233 rename = "senders_revisionNumber",
234 default,
235 skip_serializing_if = "Option::is_none"
236 )]
237 pub senders_revision_number: Option<RevisionNumber>,
238 #[serde(
240 rename = "senders_createdDateTime",
241 default,
242 skip_serializing_if = "Option::is_none"
243 )]
244 pub senders_created_date_time: Option<UtcDateTime>,
245 #[serde(rename = "businessType")]
247 pub business_type: KaskadeBusinessType,
248 #[serde(
250 rename = "ResourceObject",
251 default,
252 skip_serializing_if = "Vec::is_empty"
253 )]
254 pub resource_objects: Vec<ResourceObjectRef>,
255 #[serde(rename = "biddingZone_Domain")]
257 pub bidding_zone_domain: BiddingZoneDomain,
258 #[serde(rename = "quantity_Measure_Unit")]
260 pub quantity_measure_unit: QuantityMeasureUnit,
261 #[serde(rename = "curveType")]
263 pub curve_type: CurveType,
264 #[serde(rename = "Available_Period")]
266 pub available_period: AvailablePeriod,
267 #[serde(rename = "Reason")]
269 pub reason: KaskadeReason,
270}
271
272#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
283#[serde(rename = "Kaskade")]
284pub struct Kaskade {
285 #[serde(rename = "createdDateTime")]
287 pub created_date_time: UtcDateTime,
288 #[serde(rename = "mRID")]
290 pub m_rid: Mrid,
291 #[serde(rename = "revisionNumber")]
293 pub revision_number: RevisionNumber,
294 pub status: StatusElement,
296 #[serde(rename = "type")]
298 pub doc_type: KaskadeType,
299 #[serde(rename = "sender_MarketParticipant")]
301 pub sender_market_participant: KaskadeParticipant,
302 #[serde(rename = "receiver_MarketParticipant")]
304 pub receiver_market_participant: KaskadeParticipant,
305 #[serde(rename = "TimeSeries")]
307 pub time_series: KaskadeTimeSeries,
308}