mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-16 14:17:00 +08:00
94 lines
3.1 KiB
Ruby
94 lines
3.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Repositories
|
|
class SnapshotProvisioningService
|
|
extend Service
|
|
|
|
attr_reader :repository_snapshot, :errors
|
|
|
|
def initialize(repository_snapshot:)
|
|
@repository_snapshot = repository_snapshot
|
|
@errors = {}
|
|
end
|
|
|
|
def call
|
|
return self unless valid?
|
|
|
|
ActiveRecord::Base.transaction(requires_new: true) do
|
|
repository = @repository_snapshot.original_repository
|
|
has_stock_management = repository.has_stock_management?
|
|
|
|
repository.repository_columns.each do |column|
|
|
column.snapshot!(@repository_snapshot)
|
|
end
|
|
|
|
repository_rows = repository.repository_rows
|
|
.joins(:my_module_repository_rows)
|
|
.where(my_module_repository_rows: { my_module: @repository_snapshot.my_module })
|
|
|
|
repository_rows.find_each do |original_row|
|
|
row_snapshot = original_row.snapshot!(@repository_snapshot)
|
|
create_stock_consumption_cell_snapshot!(original_row, row_snapshot) if has_stock_management
|
|
end
|
|
|
|
@repository_snapshot.ready!
|
|
rescue StandardError => e
|
|
if e.is_a?(ActiveRecord::RecordInvalid)
|
|
@errors[e.record.class.name.underscore] = e.record.errors.full_messages
|
|
else
|
|
@errors[:general] = e.message
|
|
end
|
|
Rails.logger.error e.message
|
|
raise ActiveRecord::Rollback
|
|
end
|
|
|
|
self
|
|
end
|
|
|
|
def succeed?
|
|
@errors.none?
|
|
end
|
|
|
|
private
|
|
|
|
def valid?
|
|
unless @repository_snapshot
|
|
@errors[:invalid_arguments] =
|
|
{ 'repository_snapshot': @repository_snapshot }
|
|
.map do |key, value|
|
|
if value.nil?
|
|
I18n.t('repositories.my_module_assigned_snapshot_service.invalid_arguments', key: key.capitalize)
|
|
end
|
|
end.compact
|
|
return false
|
|
end
|
|
true
|
|
end
|
|
|
|
def create_stock_consumption_cell_snapshot!(repository_row, row_snapshot)
|
|
return if repository_row.repository_stock_value.blank?
|
|
|
|
my_module_repository_row =
|
|
repository_row.my_module_repository_rows.find { |mrr| mrr.my_module_id == @repository_snapshot.my_module_id }
|
|
|
|
stock_unit_item_data =
|
|
if my_module_repository_row.repository_stock_unit_item.present?
|
|
my_module_repository_row.repository_stock_unit_item.data
|
|
else
|
|
repository_row.repository_stock_cell&.repository_stock_value&.repository_stock_unit_item&.data
|
|
end
|
|
|
|
stock_unit_item = @repository_snapshot.repository_stock_consumption_column
|
|
.repository_stock_unit_items
|
|
.find { |item| item.data == stock_unit_item_data }
|
|
RepositoryStockConsumptionValue.create!(
|
|
repository_cell_attributes: {
|
|
repository_column: @repository_snapshot.repository_stock_consumption_column,
|
|
repository_row: row_snapshot
|
|
},
|
|
amount: my_module_repository_row.stock_consumption.to_d,
|
|
repository_stock_unit_item: stock_unit_item
|
|
)
|
|
end
|
|
end
|
|
end
|