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 QuoteState {
InProgress,
Ready,
Cancelled,
Accepted,
Rejected,
Expired,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct Quote {
#[serde(flatten)]
pub base: BaseEntity,
pub state: QuoteState,
#[serde(skip_serializing_if = "Option::is_none")]
pub quote_item: Option<Vec<QuoteItem>>,
#[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 quote_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub valid_until: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_price: Option<Money>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub expected_order_date: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct QuoteItem {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub product_offering: Option<ProductOfferingRef>,
#[serde(skip_serializing_if = "Option::is_none")]
pub product_specification: Option<ProductSpecificationRef>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit_price: Option<Money>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_price: Option<Money>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct Money {
pub value: f64,
pub unit: String,
}
#[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 CreateQuoteRequest {
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 quote_item: Option<Vec<CreateQuoteItemRequest>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub related_party: Option<Vec<CreateRelatedPartyRequest>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub valid_until: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub expected_order_date: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateQuoteItemRequest {
#[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>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unit_price: Option<Money>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CreateRelatedPartyRequest {
pub name: String,
pub role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct UpdateQuoteRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<QuoteState>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub valid_until: Option<DateTime<Utc>>,
}