Skip to main content

stateset_embedded/
vendor_returns.rs

1//! Vendor return operations (return-to-supplier).
2
3use stateset_core::{CreateVendorReturn, Result, VendorReturn, VendorReturnFilter, VendorReturnId};
4use stateset_db::{Database, DatabaseCapability};
5use std::sync::Arc;
6
7/// Vendor return operations.
8pub struct VendorReturns {
9    db: Arc<dyn Database>,
10}
11
12impl std::fmt::Debug for VendorReturns {
13    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14        f.debug_struct("VendorReturns").finish_non_exhaustive()
15    }
16}
17
18impl VendorReturns {
19    pub(crate) fn new(db: Arc<dyn Database>) -> Self {
20        Self { db }
21    }
22
23    /// Whether vendor returns are supported by the active backend.
24    #[must_use]
25    pub fn is_supported(&self) -> bool {
26        self.db.supports_capability(DatabaseCapability::VendorReturns)
27    }
28
29    fn ensure(&self) -> Result<()> {
30        self.db.ensure_capability(DatabaseCapability::VendorReturns)
31    }
32
33    /// Create a new vendor return.
34    pub fn create(&self, input: CreateVendorReturn) -> Result<VendorReturn> {
35        self.ensure()?;
36        self.db.vendor_returns().create(input)
37    }
38
39    /// Get a vendor return by ID.
40    pub fn get(&self, id: VendorReturnId) -> Result<Option<VendorReturn>> {
41        self.ensure()?;
42        self.db.vendor_returns().get(id)
43    }
44
45    /// List vendor returns with optional filtering.
46    pub fn list(&self, filter: VendorReturnFilter) -> Result<Vec<VendorReturn>> {
47        self.ensure()?;
48        self.db.vendor_returns().list(filter)
49    }
50
51    /// Submit a draft vendor return to the supplier.
52    pub fn submit(&self, id: VendorReturnId) -> Result<VendorReturn> {
53        self.ensure()?;
54        self.db.vendor_returns().submit(id)
55    }
56
57    /// Process a vendor return, optionally generating a vendor credit.
58    pub fn process(&self, id: VendorReturnId, generate_credit: bool) -> Result<VendorReturn> {
59        self.ensure()?;
60        self.db.vendor_returns().process(id, generate_credit)
61    }
62
63    /// Cancel a vendor return.
64    pub fn cancel(&self, id: VendorReturnId) -> Result<VendorReturn> {
65        self.ensure()?;
66        self.db.vendor_returns().cancel(id)
67    }
68}