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 Captured,
14 Rated,
15 Billed,
16 Rejected,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
21pub struct Usage {
22 #[serde(flatten)]
23 pub base: BaseEntity,
24 pub state: UsageState,
26 #[serde(skip_serializing_if = "Option::is_none")]
28 pub usage_type: Option<String>,
29 #[serde(skip_serializing_if = "Option::is_none")]
31 #[schema(value_type = String, format = "date-time")]
32 pub usage_date: Option<DateTime<Utc>>,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 #[schema(value_type = String, format = "date-time")]
36 pub start_date: Option<DateTime<Utc>>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 #[schema(value_type = String, format = "date-time")]
40 pub end_date: Option<DateTime<Utc>>,
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub amount: Option<f64>,
44 #[serde(skip_serializing_if = "Option::is_none")]
46 pub unit: Option<String>,
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub product_offering: Option<ProductOfferingRef>,
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub related_party: Option<Vec<RelatedParty>>,
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub rating: Option<RatingRef>,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
60pub struct ProductOfferingRef {
61 #[schema(value_type = String, format = "uuid")]
62 pub id: Uuid,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 pub href: Option<String>,
65 pub name: String,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
70pub struct RatingRef {
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 #[serde(skip_serializing_if = "Option::is_none")]
76 pub rating_amount: Option<f64>,
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
81pub struct RelatedParty {
82 #[schema(value_type = String, format = "uuid")]
83 pub id: Uuid,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub href: Option<String>,
86 pub name: String,
87 pub role: String,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
92pub struct CreateUsageRequest {
93 pub name: String,
94 #[serde(skip_serializing_if = "Option::is_none")]
95 pub description: Option<String>,
96 #[serde(skip_serializing_if = "Option::is_none")]
97 pub version: Option<String>,
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub usage_type: Option<String>,
100 #[serde(skip_serializing_if = "Option::is_none")]
101 #[schema(value_type = String, format = "date-time")]
102 pub usage_date: Option<DateTime<Utc>>,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 #[schema(value_type = String, format = "date-time")]
105 pub start_date: Option<DateTime<Utc>>,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 #[schema(value_type = String, format = "date-time")]
108 pub end_date: Option<DateTime<Utc>>,
109 #[serde(skip_serializing_if = "Option::is_none")]
110 pub amount: Option<f64>,
111 #[serde(skip_serializing_if = "Option::is_none")]
112 pub unit: Option<String>,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 #[schema(value_type = String, format = "uuid")]
115 pub product_offering_id: Option<Uuid>,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub related_party: Option<Vec<CreateRelatedPartyRequest>>,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 #[schema(value_type = String, format = "uuid")]
120 pub rating_id: Option<Uuid>,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
125pub struct CreateRelatedPartyRequest {
126 pub name: String,
127 pub role: String,
128}