mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
60 lines
1.9 KiB
Ruby
60 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Invoice
|
|
module DataPresenterAttributes
|
|
extend ActiveSupport::Concern
|
|
|
|
def attributes(*attributes, prefix: nil)
|
|
attributes.each do |attribute|
|
|
define_method([prefix, attribute].compact_blank.join("_")) do
|
|
data&.[](attribute)
|
|
end
|
|
end
|
|
end
|
|
|
|
def attributes_with_presenter(*attributes, class_name: nil)
|
|
attributes.each do |attribute|
|
|
define_method(attribute) do
|
|
instance_variable = instance_variable_get("@#{attribute}")
|
|
return instance_variable if instance_variable
|
|
|
|
instance_variable_set("@#{attribute}",
|
|
Invoice::DataPresenter.const_get(
|
|
class_name.presence || attribute.to_s.classify
|
|
).new(data&.[](attribute)))
|
|
end
|
|
end
|
|
end
|
|
|
|
def array_attribute(attribute_name, class_name: nil)
|
|
define_method(attribute_name) do
|
|
instance_variable = instance_variable_get("@#{attribute_name}")
|
|
return instance_variable if instance_variable
|
|
|
|
instance_variable_set("@#{attribute_name}",
|
|
data&.[](attribute_name)&.map { |item|
|
|
Invoice::DataPresenter.const_get(class_name).new(item)
|
|
})
|
|
end
|
|
end
|
|
|
|
# if one of the list attributes is updated, the invoice needs to be regenerated
|
|
def invoice_generation_attributes(*attributes)
|
|
define_method(:invoice_generation_values) do
|
|
attributes.map do |attribute|
|
|
public_send(attribute)
|
|
end
|
|
end
|
|
end
|
|
|
|
# if one of the list attributes is updated, the invoice needs to be updated
|
|
def invoice_update_attributes(*attributes)
|
|
define_method(:invoice_update_values) do
|
|
attributes.map do |attribute|
|
|
public_send(attribute)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|