Skip to main content

concur_api/
models.rs

1//! Shared data models used across SAP Concur APIs.
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6/// A monetary amount with currency.
7#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
8pub struct Money {
9    pub value: f64,
10    #[serde(rename = "currencyCode")]
11    pub currency_code: String,
12}
13
14/// A monetary amount with currency (alternate naming used by some APIs).
15#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
16pub struct Amount {
17    pub amount: Option<String>,
18    pub currency: Option<String>,
19}
20
21/// A generic link relation.
22#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
23pub struct Link {
24    pub rel: String,
25    pub href: String,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub method: Option<String>,
28    #[serde(rename = "isTemplated", skip_serializing_if = "Option::is_none")]
29    pub is_templated: Option<bool>,
30}
31
32/// Pagination metadata returned by list endpoints.
33#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
34pub struct Page {
35    pub size: u32,
36    #[serde(rename = "totalElements")]
37    pub total_elements: u64,
38    #[serde(rename = "totalPages")]
39    pub total_pages: u32,
40    pub number: u32,
41}
42
43/// A named reference (id + name).
44#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
45pub struct NamedRef {
46    pub id: String,
47    pub name: String,
48}
49
50/// A generic paged response wrapper.
51#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
52pub struct PagedResponse<T> {
53    pub links: Vec<Link>,
54    pub content: Vec<T>,
55    pub page: Page,
56}
57
58/// A custom data field value.
59#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
60pub struct CustomData {
61    pub id: String,
62    pub value: String,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub is_valid: Option<bool>,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub list_item_url: Option<String>,
67}
68
69/// Location reference.
70#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
71pub struct Location {
72    pub id: String,
73    pub name: String,
74    pub city: Option<String>,
75    #[serde(rename = "countrySubDivisionCode")]
76    pub country_sub_division_code: Option<String>,
77    #[serde(rename = "countryCode")]
78    pub country_code: Option<String>,
79}
80
81/// Expense type reference.
82#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
83pub struct ExpenseType {
84    pub id: String,
85    pub name: String,
86    pub code: Option<String>,
87    #[serde(rename = "isDeleted")]
88    pub is_deleted: Option<bool>,
89}
90
91/// Payment type reference.
92#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
93pub struct PaymentType {
94    pub id: String,
95    pub name: String,
96    pub code: String,
97}
98
99/// Vendor reference.
100#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
101pub struct Vendor {
102    pub id: Option<String>,
103    pub name: Option<String>,
104    pub description: Option<String>,
105}
106
107/// Status reference with code and name.
108#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
109pub struct StatusRef {
110    pub code: String,
111    pub name: String,
112}
113
114/// Owner / user reference.
115#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
116pub struct OwnerRef {
117    pub id: String,
118    #[serde(skip_serializing_if = "Option::is_none")]
119    pub first_name: Option<String>,
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub last_name: Option<String>,
122}
123
124/// Exchange rate information.
125#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
126pub struct ExchangeRate {
127    pub value: f64,
128    pub operation: String,
129}
130
131/// A SCIM-style user name.
132#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
133pub struct UserName {
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub formatted: Option<String>,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub family_name: Option<String>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub given_name: Option<String>,
140}
141
142/// A SCIM email entry.
143#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
144pub struct Email {
145    pub value: String,
146    #[serde(skip_serializing_if = "Option::is_none")]
147    pub type_: Option<String>,
148    #[serde(skip_serializing_if = "Option::is_none")]
149    pub verified: Option<bool>,
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub notifications: Option<bool>,
152}
153
154/// A SCIM address entry.
155#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
156pub struct Address {
157    #[serde(skip_serializing_if = "Option::is_none")]
158    pub type_: Option<String>,
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub street_address: Option<String>,
161    #[serde(skip_serializing_if = "Option::is_none")]
162    pub locality: Option<String>,
163    #[serde(skip_serializing_if = "Option::is_none")]
164    pub region: Option<String>,
165    #[serde(skip_serializing_if = "Option::is_none")]
166    pub postal_code: Option<String>,
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub country: Option<String>,
169}
170
171/// A SCIM meta object.
172#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
173pub struct Meta {
174    #[serde(rename = "resourceType")]
175    pub resource_type: String,
176    pub created: Option<DateTime<Utc>>,
177    #[serde(rename = "lastModified")]
178    pub last_modified: Option<DateTime<Utc>>,
179    pub version: Option<i64>,
180    pub location: Option<String>,
181}