Skip to main content

chio_kernel/operator_report/
settlement_report.rs

1use super::*;
2
3#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
4#[serde(rename_all = "snake_case")]
5pub enum SettlementReconciliationState {
6    Open,
7    Reconciled,
8    Ignored,
9    RetryScheduled,
10}
11
12#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
13#[serde(rename_all = "camelCase")]
14pub struct SettlementReconciliationSummary {
15    pub matching_receipts: u64,
16    pub returned_receipts: u64,
17    pub pending_receipts: u64,
18    pub failed_receipts: u64,
19    pub actionable_receipts: u64,
20    pub reconciled_receipts: u64,
21    pub truncated: bool,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
25#[serde(rename_all = "camelCase")]
26pub struct SettlementReconciliationRow {
27    pub receipt_id: String,
28    pub timestamp: u64,
29    pub capability_id: String,
30    #[serde(default, skip_serializing_if = "Option::is_none")]
31    pub subject_key: Option<String>,
32    pub tool_server: String,
33    pub tool_name: String,
34    #[serde(default, skip_serializing_if = "Option::is_none")]
35    pub payment_reference: Option<String>,
36    pub settlement_status: SettlementStatus,
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub cost_charged: Option<u64>,
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub currency: Option<String>,
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub budget_authority: Option<FinancialBudgetAuthorityReceiptMetadata>,
43    pub reconciliation_state: SettlementReconciliationState,
44    pub action_required: bool,
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub note: Option<String>,
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub updated_at: Option<u64>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
52#[serde(rename_all = "camelCase")]
53pub struct SettlementReconciliationReport {
54    pub summary: SettlementReconciliationSummary,
55    pub receipts: Vec<SettlementReconciliationRow>,
56}
57
58#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
59#[serde(rename_all = "snake_case")]
60pub enum MeteredBillingReconciliationState {
61    Open,
62    Reconciled,
63    Ignored,
64    RetryScheduled,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
68#[serde(rename_all = "camelCase")]
69pub struct MeteredBillingEvidenceRecord {
70    pub usage_evidence: MeteredUsageEvidenceReceiptMetadata,
71    pub billed_cost: MonetaryAmount,
72    pub recorded_at: u64,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
76#[serde(rename_all = "camelCase")]
77pub struct MeteredBillingReconciliationSummary {
78    pub matching_receipts: u64,
79    pub returned_receipts: u64,
80    pub evidence_attached_receipts: u64,
81    pub missing_evidence_receipts: u64,
82    pub over_quoted_units_receipts: u64,
83    pub over_max_billed_units_receipts: u64,
84    pub over_quoted_cost_receipts: u64,
85    pub financial_mismatch_receipts: u64,
86    pub actionable_receipts: u64,
87    pub reconciled_receipts: u64,
88    pub truncated: bool,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
92#[serde(rename_all = "camelCase")]
93pub struct MeteredBillingReconciliationRow {
94    pub receipt_id: String,
95    pub timestamp: u64,
96    pub capability_id: String,
97    #[serde(default, skip_serializing_if = "Option::is_none")]
98    pub subject_key: Option<String>,
99    pub tool_server: String,
100    pub tool_name: String,
101    pub settlement_mode: MeteredSettlementMode,
102    pub provider: String,
103    pub quote_id: String,
104    pub billing_unit: String,
105    pub quoted_units: u64,
106    pub quoted_cost: MonetaryAmount,
107    #[serde(default, skip_serializing_if = "Option::is_none")]
108    pub max_billed_units: Option<u64>,
109    #[serde(default, skip_serializing_if = "Option::is_none")]
110    pub financial_cost_charged: Option<u64>,
111    #[serde(default, skip_serializing_if = "Option::is_none")]
112    pub financial_currency: Option<String>,
113    #[serde(default, skip_serializing_if = "Option::is_none")]
114    pub budget_authority: Option<FinancialBudgetAuthorityReceiptMetadata>,
115    #[serde(default, skip_serializing_if = "Option::is_none")]
116    pub evidence: Option<MeteredBillingEvidenceRecord>,
117    pub reconciliation_state: MeteredBillingReconciliationState,
118    pub action_required: bool,
119    pub evidence_missing: bool,
120    pub exceeds_quoted_units: bool,
121    pub exceeds_max_billed_units: bool,
122    pub exceeds_quoted_cost: bool,
123    pub financial_mismatch: bool,
124    #[serde(default, skip_serializing_if = "Option::is_none")]
125    pub note: Option<String>,
126    #[serde(default, skip_serializing_if = "Option::is_none")]
127    pub updated_at: Option<u64>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
131#[serde(rename_all = "camelCase")]
132pub struct MeteredBillingReconciliationReport {
133    pub summary: MeteredBillingReconciliationSummary,
134    pub receipts: Vec<MeteredBillingReconciliationRow>,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
138#[serde(rename_all = "camelCase")]
139pub struct EconomicReceiptProjectionSummary {
140    pub matching_receipts: u64,
141    pub returned_receipts: u64,
142    pub metered_receipts: u64,
143    pub pending_settlement_receipts: u64,
144    pub failed_settlement_receipts: u64,
145    pub settlement_actionable_receipts: u64,
146    pub metering_actionable_receipts: u64,
147    pub metering_evidence_missing_receipts: u64,
148    pub metering_financial_mismatch_receipts: u64,
149    pub truncated: bool,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
153#[serde(rename_all = "camelCase")]
154pub struct EconomicReceiptSettlementProjection {
155    pub settlement_status: SettlementStatus,
156    pub reconciliation_state: SettlementReconciliationState,
157    pub action_required: bool,
158    #[serde(default, skip_serializing_if = "Option::is_none")]
159    pub note: Option<String>,
160    #[serde(default, skip_serializing_if = "Option::is_none")]
161    pub updated_at: Option<u64>,
162}
163
164#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
165#[serde(rename_all = "camelCase")]
166pub struct EconomicReceiptMeteringProjection {
167    pub reconciliation_state: MeteredBillingReconciliationState,
168    pub action_required: bool,
169    pub evidence_missing: bool,
170    pub exceeds_quoted_units: bool,
171    pub exceeds_max_billed_units: bool,
172    pub exceeds_quoted_cost: bool,
173    pub financial_mismatch: bool,
174    #[serde(default, skip_serializing_if = "Option::is_none")]
175    pub evidence: Option<MeteredBillingEvidenceRecord>,
176    #[serde(default, skip_serializing_if = "Option::is_none")]
177    pub note: Option<String>,
178    #[serde(default, skip_serializing_if = "Option::is_none")]
179    pub updated_at: Option<u64>,
180}
181
182#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
183#[serde(rename_all = "camelCase")]
184pub struct EconomicReceiptProjectionRow {
185    pub receipt_id: String,
186    pub timestamp: u64,
187    pub capability_id: String,
188    #[serde(default, skip_serializing_if = "Option::is_none")]
189    pub subject_key: Option<String>,
190    pub tool_server: String,
191    pub tool_name: String,
192    pub economic_authorization: EconomicAuthorizationReceiptMetadata,
193    #[serde(default, skip_serializing_if = "Option::is_none")]
194    pub budget_authority: Option<FinancialBudgetAuthorityReceiptMetadata>,
195    pub settlement: EconomicReceiptSettlementProjection,
196    #[serde(default, skip_serializing_if = "Option::is_none")]
197    pub metering: Option<EconomicReceiptMeteringProjection>,
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
201#[serde(rename_all = "camelCase")]
202pub struct EconomicReceiptProjectionReport {
203    pub summary: EconomicReceiptProjectionSummary,
204    pub receipts: Vec<EconomicReceiptProjectionRow>,
205}
206
207#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
208#[serde(rename_all = "camelCase")]
209pub struct EconomicCompletionFlowSummary {
210    pub matching_receipts: u64,
211    pub returned_receipts: u64,
212    pub matching_underwriting_decisions: u64,
213    pub returned_underwriting_decisions: u64,
214    pub matching_credit_facilities: u64,
215    pub returned_credit_facilities: u64,
216    pub matching_credit_bonds: u64,
217    pub returned_credit_bonds: u64,
218    pub pending_settlement_receipts: u64,
219    pub failed_settlement_receipts: u64,
220    pub metering_actionable_receipts: u64,
221    #[serde(default, skip_serializing_if = "Option::is_none")]
222    pub latest_underwriting_decision_id: Option<String>,
223    #[serde(default, skip_serializing_if = "Option::is_none")]
224    pub latest_underwriting_outcome: Option<UnderwritingDecisionOutcome>,
225    #[serde(default, skip_serializing_if = "Option::is_none")]
226    pub latest_credit_facility_id: Option<String>,
227    #[serde(default, skip_serializing_if = "Option::is_none")]
228    pub latest_credit_facility_disposition: Option<CreditFacilityDisposition>,
229    #[serde(default, skip_serializing_if = "Option::is_none")]
230    pub latest_credit_bond_id: Option<String>,
231    #[serde(default, skip_serializing_if = "Option::is_none")]
232    pub latest_credit_bond_disposition: Option<CreditBondDisposition>,
233}
234
235#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
236#[serde(rename_all = "camelCase")]
237pub struct EconomicCompletionFlowReport {
238    pub schema: String,
239    pub generated_at: u64,
240    pub filters: ExposureLedgerQuery,
241    pub summary: EconomicCompletionFlowSummary,
242    pub economic_receipts: EconomicReceiptProjectionReport,
243    pub underwriting_decisions: UnderwritingDecisionListReport,
244    pub credit_facilities: CreditFacilityListReport,
245    pub credit_bonds: CreditBondListReport,
246}