tmf635_usage/
models.rs

1//! TMF635 Usage Management models
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use tmf_apis_core::BaseEntity;
6use utoipa::ToSchema;
7use uuid::Uuid;
8
9/// Usage State
10#[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/// Usage - Represents usage records (CDRs, event consumption)
20#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
21pub struct Usage {
22    #[serde(flatten)]
23    pub base: BaseEntity,
24    /// Usage state
25    pub state: UsageState,
26    /// Usage type (voice, data, sms, etc.)
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub usage_type: Option<String>,
29    /// Usage date/time
30    #[serde(skip_serializing_if = "Option::is_none")]
31    #[schema(value_type = String, format = "date-time")]
32    pub usage_date: Option<DateTime<Utc>>,
33    /// Start date/time
34    #[serde(skip_serializing_if = "Option::is_none")]
35    #[schema(value_type = String, format = "date-time")]
36    pub start_date: Option<DateTime<Utc>>,
37    /// End date/time
38    #[serde(skip_serializing_if = "Option::is_none")]
39    #[schema(value_type = String, format = "date-time")]
40    pub end_date: Option<DateTime<Utc>>,
41    /// Amount (quantity consumed)
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub amount: Option<f64>,
44    /// Unit (MB, minutes, messages, etc.)
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub unit: Option<String>,
47    /// Product offering reference
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub product_offering: Option<ProductOfferingRef>,
50    /// Related party (customer, subscriber)
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub related_party: Option<Vec<RelatedParty>>,
53    /// Rating reference
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub rating: Option<RatingRef>,
56}
57
58/// Product Offering Reference
59#[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/// Rating Reference
69#[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/// Related Party
80#[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/// Request to create a usage record
91#[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/// Request to create a related party
124#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
125pub struct CreateRelatedPartyRequest {
126    pub name: String,
127    pub role: String,
128}