Skip to main content

StockAdjustmentRepository

Struct StockAdjustmentRepository 

Source
pub struct StockAdjustmentRepository;
Expand description

The quant staging/apply SQL. Stateless; every method takes the caller’s connection.

Implementations§

Source§

impl StockAdjustmentRepository

Source

pub fn new() -> Self

Source

pub async fn lock_quant( &self, conn: &mut PgConnection, selector: QuantSelector, ) -> Result<Option<QuantCountRow>, Error>

Lock the addressed quant FOR UPDATE (the reservation-apex row — every count stage/apply serializes here). None when no quant matches; the service then either errors (apply) or initializes one (stage).

Source

pub async fn init_quant( &self, conn: &mut PgConnection, item_id: Uuid, location_id: Uuid, ) -> Result<Uuid, Error>

The quant for (item, location) with no lot, package or owner, created zeroed when there is none yet — the count surface exists even before any stock does. Returns its id; the caller has already verified the location is internal (R13). Created through the quant repository’s creation lock, so two counts that both found no quant still make one.

Source

pub async fn stage_count( &self, conn: &mut PgConnection, quant_id: Uuid, counted: Decimal, diff: Decimal, ) -> Result<(), Error>

Stage a counted quantity on a quant (T4): record the count and its stored compute (inventory_diff_quantity = counted - quantity), and raise the inventory_quantity_set gate that Apply demands. The pending-count partial index (WHERE inventory_quantity_set = true) is the worklist this feeds.

Source

pub async fn consume_staged_count( &self, conn: &mut PgConnection, quant_id: Uuid, ) -> Result<(), Error>

Consume the staged count: clear the count fields and drop the inventory_quantity_set gate. This deliberately does NOT write quantity — the is_inventory move the apply minted through the engine pipeline is the one writer that reconciled the quant to the count (its two-step sync maintains quantity, reserved_quantity, and the T2 stored compute together). Consuming the staging is what makes re-application a no-op: a second apply finds the gate down and mints nothing.

Source

pub async fn staged_counts_at_location( &self, conn: &mut PgConnection, location_id: Uuid, ) -> Result<Vec<StagedCountRow>, Error>

All quants at a location with a staged-but-unapplied count (the pending-count worklist the partial index WHERE inventory_quantity_set = true serves).

Trait Implementations§

Source§

impl Default for StockAdjustmentRepository

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more