mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
63 lines
1.8 KiB
Ruby
63 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Spree
|
|
class InventoryUnit < ApplicationRecord
|
|
self.belongs_to_required_by_default = false
|
|
|
|
belongs_to :variant, -> { with_deleted }, class_name: "Spree::Variant",
|
|
inverse_of: :inventory_units
|
|
belongs_to :order, class_name: "Spree::Order"
|
|
belongs_to :shipment, class_name: "Spree::Shipment"
|
|
belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization",
|
|
inverse_of: :inventory_units
|
|
|
|
scope :backordered, -> { where state: 'backordered' }
|
|
scope :shipped, -> { where state: 'shipped' }
|
|
scope :backordered_per_variant, ->(stock_item) do
|
|
includes(:shipment)
|
|
.where("spree_shipments.state != 'canceled'").references(:shipment)
|
|
.where(variant_id: stock_item.variant_id)
|
|
.backordered.order("#{table_name}.created_at ASC")
|
|
end
|
|
|
|
# state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
|
|
state_machine initial: :on_hand do
|
|
event :fill_backorder do
|
|
transition to: :on_hand, from: :backordered
|
|
end
|
|
after_transition on: :fill_backorder, do: :update_order
|
|
|
|
event :ship do
|
|
transition to: :shipped, if: :allow_ship?
|
|
end
|
|
|
|
event :return do
|
|
transition to: :returned, from: :shipped
|
|
end
|
|
end
|
|
|
|
def self.finalize_units!(inventory_units)
|
|
inventory_units.map do |iu|
|
|
iu.update_columns(
|
|
pending: false,
|
|
updated_at: Time.zone.now
|
|
)
|
|
end
|
|
end
|
|
|
|
def find_stock_item
|
|
Spree::StockItem.find_by(variant_id:)
|
|
end
|
|
|
|
private
|
|
|
|
def allow_ship?
|
|
Spree::Config[:allow_backorder_shipping] || on_hand?
|
|
end
|
|
|
|
def update_order
|
|
order.update_order!
|
|
end
|
|
end
|
|
end
|