use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StockReceived {
pub receipt_id: Uuid,
pub company_id: Uuid,
pub warehouse_id: Uuid,
pub source_po_id: Option<Uuid>,
pub total_value: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StockDelivered {
pub delivery_id: Uuid,
pub company_id: Uuid,
pub warehouse_id: Uuid,
pub source_so_id: Option<Uuid>,
pub total_cogs: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StockMoved {
pub entry_id: Uuid,
pub company_id: Uuid,
pub from_warehouse_id: Option<Uuid>,
pub to_warehouse_id: Option<Uuid>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StockReconciled {
pub reconciliation_id: Uuid,
pub company_id: Uuid,
pub warehouse_id: Uuid,
pub net_difference: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MoveConfirmed {
pub move_id: Uuid,
pub company_id: Uuid,
pub item_id: Uuid,
pub demand_qty: Decimal,
pub picking_id: Option<Uuid>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MoveAssigned {
pub move_id: Uuid,
pub company_id: Uuid,
pub picking_id: Option<Uuid>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MoveDone {
pub move_id: Uuid,
pub company_id: Uuid,
pub item_id: Uuid,
pub quantity: Decimal,
pub price_unit: Decimal,
pub is_inventory: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MoveCancelled {
pub move_id: Uuid,
pub company_id: Uuid,
pub released_qty: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TransferProjected {
pub transfer_id: Uuid,
pub company_id: Uuid,
pub state: String,
pub previous_state: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BackorderCreated {
pub backorder_id: Uuid,
pub company_id: Uuid,
pub origin_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OrderpointTriggered {
pub orderpoint_id: Uuid,
pub company_id: Uuid,
pub item_id: Uuid,
pub qty_to_order: Decimal,
pub forecast_qty: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct LandedCostValidated {
pub lc_id: Uuid,
pub company_id: Uuid,
pub target_receipt_id: Uuid,
pub amount_total: Decimal,
pub revalued_value: Decimal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum InventoryEvent {
StockReceived(StockReceived),
StockDelivered(StockDelivered),
StockMoved(StockMoved),
StockReconciled(StockReconciled),
MoveConfirmed(MoveConfirmed),
MoveAssigned(MoveAssigned),
MoveDone(MoveDone),
MoveCancelled(MoveCancelled),
TransferProjected(TransferProjected),
BackorderCreated(BackorderCreated),
OrderpointTriggered(OrderpointTriggered),
LandedCostValidated(LandedCostValidated),
}
pub trait InventoryEventSink: Send + Sync {
fn publish(&self, event: InventoryEvent);
}
pub struct LoggingSink;
impl InventoryEventSink for LoggingSink {
fn publish(&self, event: InventoryEvent) {
tracing::info!(target: "inventory.events", ?event, "inventory domain event");
}
}