backbone_inventory/application/service/
inventory_events.rs1use rust_decimal::Decimal;
12use serde::{Deserialize, Serialize};
13use uuid::Uuid;
14
15#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
17pub struct StockReceived {
18 pub receipt_id: Uuid,
19 pub company_id: Uuid,
20 pub warehouse_id: Uuid,
21 pub source_po_id: Option<Uuid>,
22 pub total_value: Decimal,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
28pub struct StockDelivered {
29 pub delivery_id: Uuid,
30 pub company_id: Uuid,
31 pub warehouse_id: Uuid,
32 pub source_so_id: Option<Uuid>,
33 pub total_cogs: Decimal,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
38pub struct StockMoved {
39 pub entry_id: Uuid,
40 pub company_id: Uuid,
41 pub from_warehouse_id: Option<Uuid>,
42 pub to_warehouse_id: Option<Uuid>,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
47pub struct StockReconciled {
48 pub reconciliation_id: Uuid,
49 pub company_id: Uuid,
50 pub warehouse_id: Uuid,
51 pub net_difference: Decimal,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
58pub struct MoveConfirmed {
59 pub move_id: Uuid,
60 pub company_id: Uuid,
61 pub item_id: Uuid,
62 pub demand_qty: Decimal,
63 pub picking_id: Option<Uuid>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
68pub struct MoveAssigned {
69 pub move_id: Uuid,
70 pub company_id: Uuid,
71 pub picking_id: Option<Uuid>,
72}
73
74#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
76pub struct MoveDone {
77 pub move_id: Uuid,
78 pub company_id: Uuid,
79 pub item_id: Uuid,
80 pub quantity: Decimal,
81 pub price_unit: Decimal,
82 pub is_inventory: bool,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
87pub struct MoveCancelled {
88 pub move_id: Uuid,
89 pub company_id: Uuid,
90 pub released_qty: Decimal,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
96pub struct TransferProjected {
97 pub transfer_id: Uuid,
98 pub company_id: Uuid,
99 pub state: String,
100 pub previous_state: String,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
105pub struct BackorderCreated {
106 pub backorder_id: Uuid,
107 pub company_id: Uuid,
108 pub origin_id: Uuid,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
114pub struct OrderpointTriggered {
115 pub orderpoint_id: Uuid,
116 pub company_id: Uuid,
117 pub item_id: Uuid,
118 pub qty_to_order: Decimal,
119 pub forecast_qty: Decimal,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
126pub struct LandedCostValidated {
127 pub lc_id: Uuid,
128 pub company_id: Uuid,
129 pub target_receipt_id: Uuid,
130 pub amount_total: Decimal,
132 pub revalued_value: Decimal,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
140#[serde(tag = "type")]
141pub enum InventoryEvent {
142 StockReceived(StockReceived),
143 StockDelivered(StockDelivered),
144 StockMoved(StockMoved),
145 StockReconciled(StockReconciled),
146 MoveConfirmed(MoveConfirmed),
147 MoveAssigned(MoveAssigned),
148 MoveDone(MoveDone),
149 MoveCancelled(MoveCancelled),
150 TransferProjected(TransferProjected),
151 BackorderCreated(BackorderCreated),
152 OrderpointTriggered(OrderpointTriggered),
153 LandedCostValidated(LandedCostValidated),
154}
155
156pub trait InventoryEventSink: Send + Sync {
158 fn publish(&self, event: InventoryEvent);
159}
160
161pub struct LoggingSink;
163
164impl InventoryEventSink for LoggingSink {
165 fn publish(&self, event: InventoryEvent) {
166 tracing::info!(target: "inventory.events", ?event, "inventory domain event");
167 }
168}