scinote-web/app/services/repositories/snapshot_provisioning_service.rb
2022-05-10 10:19:37 +02:00

95 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