use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ErrorDetail {
pub code: String,
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BatchResultItem {
pub filename: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub document_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extraction_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<DocumentStatus>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duplicate: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<ErrorDetail>,
}
crate::string_enum! {
DocumentStatus {
Pending = "pending",
Processing = "processing",
Done = "done",
Failed = "failed",
}
}
crate::string_enum! {
DocumentSource {
Api = "api",
Dashboard = "dashboard",
Email = "email",
Storage = "storage",
Sandbox = "sandbox",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Document {
pub id: String,
pub source: DocumentSource,
pub original_filename: String,
pub content_type: String,
pub byte_size: i64,
pub status: DocumentStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approval: Option<DocumentApproval>,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DocumentApproval {
pub state: DocumentApprovalState,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub submitted_by: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub submitted_by_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub submitted_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approved_by: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approved_by_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub approved_at: Option<String>,
}
crate::string_enum! {
DocumentApprovalState {
Draft = "draft",
Ready = "ready",
Approved = "approved",
ChangesRequested = "changes_requested",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DocumentListItem {
pub id: String,
pub source: DocumentSource,
pub original_filename: String,
pub content_type: String,
pub byte_size: i64,
pub status: DocumentStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub invoice_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reference_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_rate: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_rate_date: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category_name: Option<String>,
pub pending_review: i64,
pub flagged: bool,
pub created_at: String,
pub updated_at: String,
}
crate::string_enum! {
ExtractionStatus {
Pending = "pending",
Done = "done",
Failed = "failed",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Extraction {
pub id: String,
pub document_id: String,
pub engine: String,
pub status: ExtractionStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub document_kind: Option<BillKind>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub invoice_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub invoice_date: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub due_date: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub po_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reference_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor_address: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub customer_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subtotal_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tax_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_rate: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_rate_date: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confidence: Option<std::collections::BTreeMap<String, f64>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub line_items: Option<Vec<LineItem>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub details: Option<serde_json::Map<String, serde_json::Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fraud_indicators: Option<Vec<FraudIndicator>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file_metadata: Option<serde_json::Map<String, serde_json::Value>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub custom: Vec<CustomValue>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub discoveries: Vec<Discovery>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub quality: Option<Quality>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category_source: Option<ExtractionCategorySource>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_approved: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_message: Option<String>,
pub created_at: String,
pub updated_at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub edited_at: Option<String>,
}
crate::string_enum! {
ExtractionCategorySource {
Model = "model",
User = "user",
Memory = "memory",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ExtractionJob {
pub status: ExtractionJobStatus,
pub attempt_count: i64,
pub max_attempts: i64,
pub retryable: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_attempt_at: Option<String>,
}
crate::string_enum! {
ExtractionJobStatus {
Queued = "queued",
Running = "running",
Succeeded = "succeeded",
Failed = "failed",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LineItem {
pub description: String,
pub quantity: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unit: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sku: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unit_price_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unit_price_micros: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub line_total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tax_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub discount_cents: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FraudIndicator {
pub signal: String,
pub severity: FraudIndicatorSeverity,
pub description: String,
pub source: FraudIndicatorSource,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub r#box: Option<RegionBox>,
}
crate::string_enum! {
FraudIndicatorSeverity {
Low = "low",
Medium = "medium",
High = "high",
}
}
crate::string_enum! {
FraudIndicatorSource {
Model = "model",
Engine = "engine",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct RegionBox {
pub x: f64,
pub y: f64,
pub w: f64,
pub h: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct WebhookEndpoint {
pub id: String,
pub url: String,
pub description: String,
pub events: Vec<String>,
pub enabled: bool,
pub consecutive_failures: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_delivery_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_status: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_disabled_at: Option<String>,
pub created_at: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct WebhookEndpointWithSecret {
pub id: String,
pub url: String,
pub description: String,
pub events: Vec<String>,
pub enabled: bool,
pub consecutive_failures: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_delivery_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_status: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub auto_disabled_at: Option<String>,
pub created_at: String,
pub secret: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Discovery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub page: Option<i64>,
pub x: f64,
pub y: f64,
pub label: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct CustomValue {
pub key: String,
pub label: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confidence: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Quality {
pub readability: f64,
pub issues: Vec<QualityIssue>,
}
crate::string_enum! {
QualityIssue {
Blurry = "blurry",
Cropped = "cropped",
LowContrast = "low_contrast",
Rotated = "rotated",
Handwritten = "handwritten",
Partial = "partial",
}
}
crate::string_enum! {
ReviewStatus {
Pending = "pending",
Resolved = "resolved",
Dismissed = "dismissed",
}
}
crate::string_enum! {
ReviewReason {
LowConfidence = "low_confidence",
TotalMismatch = "total_mismatch",
PoorQuality = "poor_quality",
Duplicate = "duplicate",
UnusualVendor = "unusual_vendor",
BankDetailsChanged = "bank_details_changed",
AmountAnomaly = "amount_anomaly",
AmountOverLimit = "amount_over_limit",
MissingPoNumber = "missing_po_number",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ReviewQueueItem {
pub id: String,
pub document_id: String,
pub extraction_id: String,
pub reason: ReviewReason,
pub status: ReviewStatus,
pub created_at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resolved_at: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ReviewQueueListItem {
pub id: String,
pub document_id: String,
pub extraction_id: String,
pub reason: ReviewReason,
pub status: ReviewStatus,
pub created_at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resolved_at: Option<String>,
pub original_filename: String,
pub content_type: String,
pub document_status: DocumentStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub invoice_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reference_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Category {
pub id: String,
pub name: String,
pub is_default: bool,
pub created_at: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Usage {
pub period_start: String,
pub total_calls: i64,
pub total_documents: i64,
pub total_cost_cents: i64,
pub by_day: Vec<UsageByDay>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct UsageByDay {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub day: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub calls: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documents: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct StatsOverview {
pub documents_this_month: i64,
pub documents_total: i64,
pub pending_review_count: i64,
pub period_start: String,
pub plan: StatsOverviewPlan,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documents_included: Option<i64>,
}
crate::string_enum! {
StatsOverviewPlan {
Starter = "starter",
Growth = "growth",
Scale = "scale",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillRecord {
#[serde(default)]
pub paid_at: Option<String>,
#[serde(default)]
pub paid_by: Option<String>,
#[serde(default)]
pub assigned_to: Option<String>,
}
crate::string_enum! {
BillKind {
Invoice = "invoice",
Reminder = "reminder",
DebtCollection = "debt_collection",
CreditNote = "credit_note",
Receipt = "receipt",
PaymentConfirmation = "payment_confirmation",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillRelated {
#[serde(default)]
pub document_id: Option<String>,
pub link: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillLetter {
pub document_id: String,
pub kind: BillLetterKind,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub due_date: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub added_cents: Option<i64>,
pub count: i64,
}
crate::string_enum! {
BillLetterKind {
Reminder = "reminder",
DebtCollection = "debt_collection",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Bill {
pub id: String,
pub source: DocumentSource,
pub original_filename: String,
pub content_type: String,
pub byte_size: i64,
pub status: DocumentStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub invoice_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reference_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_rate: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_rate_date: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fx_source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub category_name: Option<String>,
pub pending_review: i64,
pub flagged: bool,
pub created_at: String,
pub updated_at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub due_date: Option<String>,
pub bill: BillRecord,
#[serde(default)]
pub kind: Option<BillKind>,
pub related: BillRelated,
#[serde(default)]
pub letter: Option<BillLetter>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub proof_document_id: Option<String>,
#[serde(default)]
pub logo: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillChainMember {
pub document_id: String,
#[serde(default)]
pub kind: Option<BillKind>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub link: Option<String>,
pub status: DocumentStatus,
pub original_filename: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub invoice_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reference_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_cents: Option<i64>,
pub date: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub due_date: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub paid_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fees_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub interest_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub original_amount_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub original_creditor: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor_iban: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor_bic: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub payment_account: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub warnings: Vec<BillChainMemberWarning>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillChainMemberWarning {
pub id: String,
pub reason: ReviewReason,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillDetail {
pub document: Document,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extraction: Option<Extraction>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extraction_job: Option<ExtractionJob>,
pub review_queue: Vec<ReviewQueueItem>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub period_locked: Option<bool>,
pub bill: BillRecord,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub related: Option<BillRelated>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub chain: Option<BillDetailChain>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub suggested_bill: Option<BillChainMember>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub suggested_letters: Vec<BillChainMember>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logo: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillDetailChain {
pub root_id: String,
pub members: Vec<BillChainMember>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillsDue {
pub currency: String,
pub count: i64,
pub total_cents: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillsSummary {
pub unpaid: i64,
pub overdue: i64,
pub due_soon: Vec<BillsDue>,
pub days: i64,
pub today: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillsStats {
pub month: String,
pub totals: Vec<BillsStatsTotal>,
pub trend: Vec<BillsStatsTrend>,
pub top_senders: Vec<BillsStatsTopSender>,
pub senders: Vec<BillsStatsSender>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillsStatsTotal {
pub currency: String,
pub count: i64,
pub paid_count: i64,
pub total_cents: i64,
pub paid_cents: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillsStatsTrend {
pub month: String,
pub currency: String,
pub count: i64,
pub total_cents: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillsStatsTopSender {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
pub count: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_cents: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logo: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BillsStatsSender {
pub name: String,
pub count: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct HeldEmailFile {
pub id: String,
pub filename: String,
pub content_type: String,
pub size_bytes: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct HeldEmail {
pub id: String,
pub from_email: String,
pub subject: String,
pub status: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub attachments: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documents: Option<i64>,
pub created_at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hold_reason: Option<HeldEmailHoldReason>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub held_until: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resolved_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bounced: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub forwarded_by: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub original_from: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub lookalike_of: Option<String>,
pub sender: HeldEmailSender,
pub files: Vec<HeldEmailFile>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logo: Option<String>,
}
crate::string_enum! {
HeldEmailHoldReason {
NewSender = "new_sender",
UnverifiedSender = "unverified_sender",
NoPlan = "no_plan",
QuotaUsed = "quota_used",
}
}
crate::string_enum! {
HeldEmailSender {
Verified = "verified",
Failed = "failed",
Unknown = "unknown",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ExtractResult {
pub document: Document,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extraction: Option<Extraction>,
pub duplicate: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BatchResult {
pub results: Vec<BatchResultItem>,
pub accepted: i64,
pub rejected: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DocumentDetail {
pub document: Document,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extraction: Option<Extraction>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extraction_job: Option<ExtractionJob>,
pub review_queue: Vec<ReviewQueueItem>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub period_locked: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct WebhookEndpointList {
pub endpoints: Vec<WebhookEndpoint>,
pub known_events: Vec<String>,
}