use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Product {
pub sku: String,
pub name: String,
pub category: String,
pub list_price: f64,
pub cost: f64,
pub currency: String,
pub tags: Vec<String>,
pub attributes: Value,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PricingRule {
pub id: String,
pub version: u32,
pub name: String,
pub description: String,
pub priority: i32,
pub condition: String, pub actions: Vec<PricingAction>,
pub segments: Option<Vec<String>>,
pub channels: Option<Vec<String>>,
pub tags: Vec<String>,
pub active: bool,
pub schedule_from: Option<String>,
pub schedule_until: Option<String>,
pub created_at: String,
pub updated_at: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RuleVersion {
pub rule_id: String,
pub version: u32,
pub snapshot: PricingRule,
pub changed_at: String,
pub reason: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PricingAction {
#[serde(rename = "type")]
pub action_type: String, pub value: f64,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Segment {
pub id: String,
pub name: String,
pub condition: String, pub priority: i32,
pub discount_pct: f64,
pub metadata: Value,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Promotion {
pub id: String,
pub name: String,
pub promo_type: String, pub code: Option<String>,
pub discount_type: String, pub discount_value: f64,
pub condition: String, pub max_uses: Option<u32>,
pub uses: u32,
pub valid_from: String,
pub valid_until: String,
pub stackable: bool,
pub active: bool,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Quote {
pub id: String,
pub customer_id: String,
pub status: String, pub lines: Vec<QuoteLine>,
pub currency: String,
pub total_list: f64,
pub total_net: f64,
pub total_discount: f64,
pub total_tax: f64,
pub valid_until: String,
pub notes: String,
pub created_at: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct QuoteLine {
pub sku: String,
pub quantity: f64,
pub list_price: f64,
pub net_price: f64,
pub discount: f64,
pub tax: f64,
pub applied_rules: Vec<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct WaterfallStep {
pub step: String,
pub rule_id: Option<String>,
pub rule_name: Option<String>,
pub price_before: f64,
pub price_after: f64,
pub delta: f64,
pub reason: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AuditEntry {
pub id: String,
pub timestamp: String,
pub entity_type: String, pub entity_id: String,
pub action: String, pub actor: String,
pub details: Value,
}