use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use tmf_apis_core::BaseEntity;
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderState {
Acknowledged,
InProgress,
Completed,
Cancelled,
Rejected,
Held,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct ProductOrder {
#[serde(flatten)]
pub base: BaseEntity,
pub state: OrderState,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_item: Option<Vec<OrderItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<RelatedParty>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub order_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub expected_completion_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct OrderItem {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
pub action: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub product_offering: Option<ProductOfferingRef>,
#[serde(skip_serializing_if = "Option::is_none")]
pub product_specification: Option<ProductSpecificationRef>,
pub state: OrderState,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct ProductOfferingRef {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct ProductSpecificationRef {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct RelatedParty {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
pub name: String,
pub role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateProductOrderRequest {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_item: Option<Vec<CreateOrderItemRequest>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<CreateRelatedPartyRequest>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateOrderItemRequest {
pub action: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "uuid")]
pub product_offering_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "uuid")]
pub product_specification_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateRelatedPartyRequest {
pub name: String,
pub role: String,
}