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 UsageState {
13 Pending,
14 Completed,
15 Failed,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
20pub struct CustomerUsage {
21 #[serde(flatten)]
22 pub base: BaseEntity,
23 pub state: UsageState,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 #[schema(value_type = String, format = "date-time")]
28 pub usage_date: Option<DateTime<Utc>>,
29 #[serde(skip_serializing_if = "Option::is_none")]
31 #[schema(value_type = String, format = "date-time")]
32 pub start_date: Option<DateTime<Utc>>,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 #[schema(value_type = String, format = "date-time")]
36 pub end_date: Option<DateTime<Utc>>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub usage_type: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub amount: Option<f64>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub unit: Option<String>,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub product_offering: Option<ProductOfferingRef>,
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub related_party: Option<Vec<RelatedParty>>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
56pub struct ProductOfferingRef {
57 #[schema(value_type = String, format = "uuid")]
58 pub id: Uuid,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub href: Option<String>,
61 pub name: String,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
66pub struct RelatedParty {
67 #[schema(value_type = String, format = "uuid")]
68 pub id: Uuid,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub href: Option<String>,
71 pub name: String,
72 pub role: String,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
77pub struct CreateCustomerUsageRequest {
78 pub name: String,
79 #[serde(skip_serializing_if = "Option::is_none")]
80 pub description: Option<String>,
81 #[serde(skip_serializing_if = "Option::is_none")]
82 pub version: Option<String>,
83 #[serde(skip_serializing_if = "Option::is_none")]
84 #[schema(value_type = String, format = "date-time")]
85 pub usage_date: Option<DateTime<Utc>>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 #[schema(value_type = String, format = "date-time")]
88 pub start_date: Option<DateTime<Utc>>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 #[schema(value_type = String, format = "date-time")]
91 pub end_date: Option<DateTime<Utc>>,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub usage_type: Option<String>,
94 #[serde(skip_serializing_if = "Option::is_none")]
95 pub amount: Option<f64>,
96 #[serde(skip_serializing_if = "Option::is_none")]
97 pub unit: Option<String>,
98 #[serde(skip_serializing_if = "Option::is_none")]
99 #[schema(value_type = String, format = "uuid")]
100 pub product_offering_id: Option<Uuid>,
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub related_party: Option<Vec<CreateRelatedPartyRequest>>,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
107pub struct CreateRelatedPartyRequest {
108 pub name: String,
109 pub role: String,
110}