Skip to main content

tmf622_ordering/
models.rs

1//! TMF622 Product Ordering models
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use tmf_apis_core::BaseEntity;
6use utoipa::ToSchema;
7use uuid::Uuid;
8
9/// Product Order State
10#[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/// Product Order - Represents a customer order for products
23#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
24pub struct ProductOrder {
25    #[serde(flatten)]
26    pub base: BaseEntity,
27    /// Order state
28    pub state: OrderState,
29    /// Order items
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub order_item: Option<Vec<OrderItem>>,
32    /// Related party (customer)
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub related_party: Option<Vec<RelatedParty>>,
35    /// Order date
36    #[serde(skip_serializing_if = "Option::is_none")]
37    #[schema(value_type = String, format = "date-time")]
38    pub order_date: Option<DateTime<Utc>>,
39    /// Expected completion date
40    #[serde(skip_serializing_if = "Option::is_none")]
41    #[schema(value_type = String, format = "date-time")]
42    pub expected_completion_date: Option<DateTime<Utc>>,
43    /// Priority
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub priority: Option<String>,
46}
47
48/// Order Item - Individual item within a product order
49#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
50pub struct OrderItem {
51    #[schema(value_type = String, format = "uuid")]
52    pub id: Uuid,
53    /// Item action (add, modify, delete, noChange)
54    pub action: String,
55    /// Product offering reference
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub product_offering: Option<ProductOfferingRef>,
58    /// Product specification reference
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub product_specification: Option<ProductSpecificationRef>,
61    /// Item state
62    pub state: OrderState,
63    /// Quantity
64    #[serde(skip_serializing_if = "Option::is_none")]
65    pub quantity: Option<i32>,
66}
67
68/// Product Offering Reference
69#[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/// Product Specification Reference
79#[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/// Related Party - Customer or other party related to the order
89#[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/// Request to create a product order
100#[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/// Request to create an order item
116#[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/// Request to create a related party
130#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
131pub struct CreateRelatedPartyRequest {
132    pub name: String,
133    pub role: String,
134}