1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use tmf_apis_core::BaseEntity;
6use utoipa::ToSchema;
7use uuid::Uuid;
8
9#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
11#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
12pub enum OrderState {
13 Acknowledged,
14 InProgress,
15 Completed,
16 Cancelled,
17 Rejected,
18 Held,
19 Failed,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
24pub struct ProductOrder {
25 #[serde(flatten)]
26 pub base: BaseEntity,
27 pub state: OrderState,
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub order_item: Option<Vec<OrderItem>>,
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub related_party: Option<Vec<RelatedParty>>,
35 #[serde(skip_serializing_if = "Option::is_none")]
37 #[schema(value_type = String, format = "date-time")]
38 pub order_date: Option<DateTime<Utc>>,
39 #[serde(skip_serializing_if = "Option::is_none")]
41 #[schema(value_type = String, format = "date-time")]
42 pub expected_completion_date: Option<DateTime<Utc>>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub priority: Option<String>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
50pub struct OrderItem {
51 #[schema(value_type = String, format = "uuid")]
52 pub id: Uuid,
53 pub action: String,
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub product_offering: Option<ProductOfferingRef>,
58 #[serde(skip_serializing_if = "Option::is_none")]
60 pub product_specification: Option<ProductSpecificationRef>,
61 pub state: OrderState,
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub quantity: Option<i32>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
70pub struct ProductOfferingRef {
71 #[schema(value_type = String, format = "uuid")]
72 pub id: Uuid,
73 #[serde(skip_serializing_if = "Option::is_none")]
74 pub href: Option<String>,
75 pub name: String,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
80pub struct ProductSpecificationRef {
81 #[schema(value_type = String, format = "uuid")]
82 pub id: Uuid,
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub href: Option<String>,
85 pub name: String,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
90pub struct RelatedParty {
91 #[schema(value_type = String, format = "uuid")]
92 pub id: Uuid,
93 #[serde(skip_serializing_if = "Option::is_none")]
94 pub href: Option<String>,
95 pub name: String,
96 pub role: String,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
101pub struct CreateProductOrderRequest {
102 pub name: String,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub description: Option<String>,
105 #[serde(skip_serializing_if = "Option::is_none")]
106 pub version: Option<String>,
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub priority: Option<String>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub order_item: Option<Vec<CreateOrderItemRequest>>,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub related_party: Option<Vec<CreateRelatedPartyRequest>>,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
117pub struct CreateOrderItemRequest {
118 pub action: String,
119 #[serde(skip_serializing_if = "Option::is_none")]
120 #[schema(value_type = String, format = "uuid")]
121 pub product_offering_id: Option<Uuid>,
122 #[serde(skip_serializing_if = "Option::is_none")]
123 #[schema(value_type = String, format = "uuid")]
124 pub product_specification_id: Option<Uuid>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub quantity: Option<i32>,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
131pub struct CreateRelatedPartyRequest {
132 pub name: String,
133 pub role: String,
134}