Skip to main content

tmf677_usage/
models.rs

1//! TMF677 Customer 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    Pending,
14    Completed,
15    Failed,
16}
17
18/// Customer Usage - Represents a customer usage record (CDR)
19#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
20pub struct CustomerUsage {
21    #[serde(flatten)]
22    pub base: BaseEntity,
23    /// Usage state
24    pub state: UsageState,
25    /// Usage date
26    #[serde(skip_serializing_if = "Option::is_none")]
27    #[schema(value_type = String, format = "date-time")]
28    pub usage_date: Option<DateTime<Utc>>,
29    /// Start date/time
30    #[serde(skip_serializing_if = "Option::is_none")]
31    #[schema(value_type = String, format = "date-time")]
32    pub start_date: Option<DateTime<Utc>>,
33    /// End date/time
34    #[serde(skip_serializing_if = "Option::is_none")]
35    #[schema(value_type = String, format = "date-time")]
36    pub end_date: Option<DateTime<Utc>>,
37    /// Usage type (voice, data, sms, etc.)
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub usage_type: Option<String>,
40    /// Usage amount (bytes, minutes, etc.)
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub amount: Option<f64>,
43    /// Usage unit
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub unit: Option<String>,
46    /// Product offering reference
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub product_offering: Option<ProductOfferingRef>,
49    /// Related party (customer)
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub related_party: Option<Vec<RelatedParty>>,
52}
53
54/// Product Offering Reference
55#[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/// Related Party - Customer or other party related to the usage
65#[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/// Request to create a customer usage record
76#[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/// Request to create a related party
106#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
107pub struct CreateRelatedPartyRequest {
108    pub name: String,
109    pub role: String,
110}