backbone_inventory/domain/entity/
mod.rs1pub mod picking_batch;
6pub mod delivery_note;
7pub mod delivery_note_item;
8pub mod inventory_company_setting;
9pub mod landed_cost;
10pub mod landed_cost_line;
11pub mod landed_cost_adjustment_line;
12pub mod location;
13pub mod stock_move;
14pub mod stock_move_line;
15pub mod operation_type;
16pub mod transfer;
17pub mod route;
18pub mod route_rule;
19pub mod reordering_rule;
20pub mod purchase_receipt;
21pub mod purchase_receipt_item;
22pub mod quant;
23pub mod scrap;
24pub mod scrap_reason_tag;
25pub mod stock_entry;
26pub mod stock_entry_item;
27pub mod stock_ledger_entry;
28pub mod bin;
29pub mod stock_reconciliation;
30pub mod stock_reconciliation_item;
31pub mod package_type;
32pub mod storage_category;
33pub mod storage_category_capacity;
34pub mod putaway_rule;
35pub mod lot;
36pub mod package;
37pub mod warehouse;
38pub mod stock_item;
39pub mod picking_batch_state;
40pub mod inventory_cost_method;
41pub mod valuation_policy;
42pub mod landed_cost_state;
43pub mod landed_cost_split_method;
44pub mod location_usage;
45pub mod move_state;
46pub mod procure_method;
47pub mod picking_code;
48pub mod reservation_method;
49pub mod move_type;
50pub mod create_backorder;
51pub mod transfer_state;
52pub mod priority;
53pub mod rule_action;
54pub mod rule_auto;
55pub mod orderpoint_trigger;
56pub mod doc_status;
57pub mod gl_posting_state;
58pub mod scrap_state;
59pub mod stock_entry_type;
60pub mod voucher_type;
61pub mod stock_ledger_status;
62pub mod package_use;
63pub mod storage_allow_new_product;
64pub mod putaway_sublocation;
65pub mod warehouse_type;
66pub mod valuation_method;
67pub mod service_tracking_type;
68
69pub use picking_batch::PickingBatch;
71pub use picking_batch::PickingBatchBuilder;
72pub use picking_batch::PickingBatchId;
73pub use delivery_note::DeliveryNote;
74pub use delivery_note::DeliveryNoteBuilder;
75pub use delivery_note::DeliveryNoteId;
76pub use delivery_note_item::DeliveryNoteItem;
77pub use delivery_note_item::DeliveryNoteItemBuilder;
78pub use delivery_note_item::DeliveryNoteItemId;
79pub use inventory_company_setting::InventoryCompanySetting;
80pub use inventory_company_setting::InventoryCompanySettingBuilder;
81pub use inventory_company_setting::InventoryCompanySettingId;
82pub use landed_cost::LandedCost;
83pub use landed_cost::LandedCostBuilder;
84pub use landed_cost::LandedCostId;
85pub use landed_cost_line::LandedCostLine;
86pub use landed_cost_line::LandedCostLineBuilder;
87pub use landed_cost_line::LandedCostLineId;
88pub use landed_cost_adjustment_line::LandedCostAdjustmentLine;
89pub use landed_cost_adjustment_line::LandedCostAdjustmentLineBuilder;
90pub use landed_cost_adjustment_line::LandedCostAdjustmentLineId;
91pub use location::Location;
92pub use location::LocationBuilder;
93pub use location::LocationId;
94pub use stock_move::StockMove;
95pub use stock_move::StockMoveBuilder;
96pub use stock_move::StockMoveId;
97pub use stock_move_line::StockMoveLine;
98pub use stock_move_line::StockMoveLineBuilder;
99pub use stock_move_line::StockMoveLineId;
100pub use operation_type::OperationType;
101pub use operation_type::OperationTypeBuilder;
102pub use operation_type::OperationTypeId;
103pub use transfer::Transfer;
104pub use transfer::TransferBuilder;
105pub use transfer::TransferId;
106pub use route::Route;
107pub use route::RouteBuilder;
108pub use route::RouteId;
109pub use route_rule::RouteRule;
110pub use route_rule::RouteRuleBuilder;
111pub use route_rule::RouteRuleId;
112pub use reordering_rule::ReorderingRule;
113pub use reordering_rule::ReorderingRuleBuilder;
114pub use reordering_rule::ReorderingRuleId;
115pub use purchase_receipt::PurchaseReceipt;
116pub use purchase_receipt::PurchaseReceiptBuilder;
117pub use purchase_receipt::PurchaseReceiptId;
118pub use purchase_receipt_item::PurchaseReceiptItem;
119pub use purchase_receipt_item::PurchaseReceiptItemBuilder;
120pub use purchase_receipt_item::PurchaseReceiptItemId;
121pub use quant::Quant;
122pub use quant::QuantBuilder;
123pub use quant::QuantId;
124pub use scrap::Scrap;
125pub use scrap::ScrapBuilder;
126pub use scrap::ScrapId;
127pub use scrap_reason_tag::ScrapReasonTag;
128pub use scrap_reason_tag::ScrapReasonTagBuilder;
129pub use scrap_reason_tag::ScrapReasonTagId;
130pub use stock_entry::StockEntry;
131pub use stock_entry::StockEntryBuilder;
132pub use stock_entry::StockEntryId;
133pub use stock_entry_item::StockEntryItem;
134pub use stock_entry_item::StockEntryItemBuilder;
135pub use stock_entry_item::StockEntryItemId;
136pub use stock_ledger_entry::StockLedgerEntry;
137pub use stock_ledger_entry::StockLedgerEntryBuilder;
138pub use stock_ledger_entry::StockLedgerEntryId;
139pub use bin::Bin;
140pub use bin::BinBuilder;
141pub use bin::BinId;
142pub use stock_reconciliation::StockReconciliation;
143pub use stock_reconciliation::StockReconciliationBuilder;
144pub use stock_reconciliation::StockReconciliationId;
145pub use stock_reconciliation_item::StockReconciliationItem;
146pub use stock_reconciliation_item::StockReconciliationItemBuilder;
147pub use stock_reconciliation_item::StockReconciliationItemId;
148pub use package_type::PackageType;
149pub use package_type::PackageTypeBuilder;
150pub use package_type::PackageTypeId;
151pub use storage_category::StorageCategory;
152pub use storage_category::StorageCategoryBuilder;
153pub use storage_category::StorageCategoryId;
154pub use storage_category_capacity::StorageCategoryCapacity;
155pub use storage_category_capacity::StorageCategoryCapacityBuilder;
156pub use storage_category_capacity::StorageCategoryCapacityId;
157pub use putaway_rule::PutawayRule;
158pub use putaway_rule::PutawayRuleBuilder;
159pub use putaway_rule::PutawayRuleId;
160pub use lot::Lot;
161pub use lot::LotBuilder;
162pub use lot::LotId;
163pub use package::Package;
164pub use package::PackageBuilder;
165pub use package::PackageId;
166pub use warehouse::Warehouse;
167pub use warehouse::WarehouseBuilder;
168pub use warehouse::WarehouseId;
169pub use stock_item::StockItem;
170pub use stock_item::StockItemBuilder;
171pub use stock_item::StockItemId;
172pub use picking_batch_state::PickingBatchState;
173pub use inventory_cost_method::InventoryCostMethod;
174pub use valuation_policy::ValuationPolicy;
175pub use landed_cost_state::LandedCostState;
176pub use landed_cost_split_method::LandedCostSplitMethod;
177pub use location_usage::LocationUsage;
178pub use move_state::MoveState;
179pub use procure_method::ProcureMethod;
180pub use picking_code::PickingCode;
181pub use reservation_method::ReservationMethod;
182pub use move_type::MoveType;
183pub use create_backorder::CreateBackorder;
184pub use transfer_state::TransferState;
185pub use priority::Priority;
186pub use rule_action::RuleAction;
187pub use rule_auto::RuleAuto;
188pub use orderpoint_trigger::OrderpointTrigger;
189pub use doc_status::DocStatus;
190pub use gl_posting_state::GlPostingState;
191pub use scrap_state::ScrapState;
192pub use stock_entry_type::StockEntryType;
193pub use voucher_type::VoucherType;
194pub use stock_ledger_status::StockLedgerStatus;
195pub use package_use::PackageUse;
196pub use storage_allow_new_product::StorageAllowNewProduct;
197pub use putaway_sublocation::PutawaySublocation;
198pub use warehouse_type::WarehouseType;
199pub use valuation_method::ValuationMethod;
200pub use service_tracking_type::ServiceTrackingType;
201
202use std::fmt::Debug;
207
208pub trait Entity: Debug + Clone {
213 type Id: Debug + Clone + PartialEq;
215
216 fn entity_id(&self) -> &Self::Id;
218
219 fn entity_type() -> &'static str;
221}
222
223use chrono::{DateTime, Utc};
228use serde::{Deserialize, Serialize};
229use uuid::Uuid;
230#[cfg(feature = "openapi")]
231use utoipa::ToSchema;
232
233#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
238#[cfg_attr(feature = "openapi", derive(ToSchema))]
239pub struct AuditMetadata {
240 #[serde(skip_serializing_if = "Option::is_none")]
242 pub created_at: Option<DateTime<Utc>>,
243
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub updated_at: Option<DateTime<Utc>>,
247
248 #[serde(skip_serializing_if = "Option::is_none")]
250 pub deleted_at: Option<DateTime<Utc>>,
251
252 #[serde(skip_serializing_if = "Option::is_none")]
254 pub created_by: Option<Uuid>,
255
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub updated_by: Option<Uuid>,
259
260 #[serde(skip_serializing_if = "Option::is_none")]
262 pub deleted_by: Option<Uuid>,
263}
264
265impl AuditMetadata {
266 pub fn new() -> Self {
268 Self {
269 created_at: Some(Utc::now()),
270 ..Default::default()
271 }
272 }
273
274 pub fn with_creator(creator_id: Uuid) -> Self {
276 Self {
277 created_at: Some(Utc::now()),
278 created_by: Some(creator_id),
279 ..Default::default()
280 }
281 }
282
283 pub fn touch(&mut self) {
285 self.updated_at = Some(Utc::now());
286 }
287
288 pub fn touch_by(&mut self, updater_id: Uuid) {
290 self.updated_at = Some(Utc::now());
291 self.updated_by = Some(updater_id);
292 }
293
294 pub fn soft_delete(&mut self) {
296 self.deleted_at = Some(Utc::now());
297 }
298
299 pub fn soft_delete_by(&mut self, deleter_id: Uuid) {
301 self.deleted_at = Some(Utc::now());
302 self.deleted_by = Some(deleter_id);
303 }
304
305 pub fn restore(&mut self) {
307 self.deleted_at = None;
308 self.deleted_by = None;
309 }
310
311 pub fn is_deleted(&self) -> bool {
313 self.deleted_at.is_some()
314 }
315
316 pub fn is_active(&self) -> bool {
318 self.deleted_at.is_none()
319 }
320}