scinote-web/app/models/my_module_repository_row.rb

71 lines
2.1 KiB
Ruby

class MyModuleRepositoryRow < ApplicationRecord
include ActionView::Helpers::NumberHelper
attribute :last_modified_by, :integer
attribute :comment, :text
belongs_to :assigned_by,
foreign_key: 'assigned_by_id',
class_name: 'User',
optional: true
belongs_to :repository_row,
inverse_of: :my_module_repository_rows
belongs_to :my_module,
touch: true,
inverse_of: :my_module_repository_rows
belongs_to :repository_stock_unit_item, optional: true
has_many :repository_ledger_records, as: :reference
validates :repository_row, uniqueness: { scope: :my_module }
before_save :nulify_stock_consumption, if: :stock_consumption_changed?
around_save :deduct_stock_balance, if: :stock_consumption_changed?
def consume_stock(user, stock_consumption, comment = nil)
ActiveRecord::Base.transaction(requires_new: true) do
lock!
assign_attributes(
stock_consumption: stock_consumption,
repository_stock_unit_item_id:
repository_row.repository_stock_value.repository_stock_unit_item_id,
last_modified_by: user,
comment: comment
)
save!
end
end
def formated_stock_consumption
if stock_consumption
number_with_precision(
stock_consumption,
precision: (repository_row.repository.repository_stock_column.metadata['decimals'].to_i || 0),
strip_insignificant_zeros: true
)
end
end
private
def nulify_stock_consumption
self.stock_consumption = nil if stock_consumption.zero?
end
def deduct_stock_balance
stock_value = repository_row.repository_stock_value
stock_value.lock!
delta = stock_consumption.to_d - stock_consumption_was.to_d
stock_value.amount = stock_value.amount - delta
yield
stock_value.repository_ledger_records.create!(
reference: self,
user: last_modified_by || assigned_by,
amount: delta,
balance: stock_value.amount,
comment: comment,
unit: stock_value.repository_stock_unit_item&.data
)
stock_value.save!
save!
end
end