use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CartPriceLine {
pub line_ref: Uuid,
pub item_id: Uuid,
pub item_group_id: Option<Uuid>,
pub brand_id: Option<Uuid>,
pub list_price: Decimal,
pub quantity: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CartPriceRequest {
pub customer_id: Option<Uuid>,
pub customer_group_id: Option<Uuid>,
pub coupon_code: Option<String>,
pub lines: Vec<CartPriceLine>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PricedCartLine {
pub line_ref: Uuid,
pub unit_price: Decimal,
pub net_line_total: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PricedRewardLine {
pub item_id: Uuid,
pub quantity: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PricedCart {
pub lines: Vec<PricedCartLine>,
pub reward_lines: Vec<PricedRewardLine>,
pub total: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CartPricingError {
pub code: String,
pub message: String,
}
#[async_trait::async_trait]
pub trait CartPricingPort: Send + Sync {
async fn price_cart(&self, req: &CartPriceRequest) -> Result<PricedCart, CartPricingError>;
}