mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
71 lines
1.8 KiB
Ruby
71 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class InvoiceDataGenerator
|
|
attr_reader :order
|
|
|
|
def initialize(order)
|
|
@order = order
|
|
end
|
|
|
|
# Give the latest invoice's data and the currect order data
|
|
# we want to generate a new invoice data that:
|
|
# 1. keeps the immutable attributes
|
|
# 2. include the update details from the order
|
|
def generate
|
|
return new_data if old_data.nil?
|
|
|
|
# keep the immutable attributes
|
|
update_order_attributes
|
|
update_line_items
|
|
update_payment_methods
|
|
|
|
new_data
|
|
end
|
|
|
|
def serialize_for_invoice
|
|
Invoice::OrderSerializer.new(order).serializable_hash
|
|
end
|
|
|
|
private
|
|
|
|
def update_order_attributes
|
|
[:distributor, :order_cycle, :customer].each do |attribute|
|
|
new_data[attribute] = old_data[attribute]
|
|
end
|
|
|
|
return unless new_data[:shipping_method_id] == old_data[:shipping_method_id]
|
|
|
|
new_data[:shipping_method] = old_data[:shipping_method]
|
|
end
|
|
|
|
# if the variant, product or supplier details are updated
|
|
# we want to keep the old details in the invoice
|
|
def update_line_items
|
|
new_data[:sorted_line_items].each do |new_line_item|
|
|
old_line_item = old_data[:sorted_line_items].find { |li| li[:id] == new_line_item[:id] }
|
|
next if old_line_item.nil?
|
|
|
|
new_line_item[:variant] = old_line_item[:variant]
|
|
end
|
|
end
|
|
|
|
# if the payment method is updated,
|
|
# we want to keep the old payment method in the invoice
|
|
def update_payment_methods
|
|
new_data[:payments].each do |new_payment|
|
|
old_payment = old_data[:payments].find { |p| p[:id] == new_payment[:id] }
|
|
next if old_payment.nil?
|
|
|
|
new_payment[:payment_method] = old_payment[:payment_method]
|
|
end
|
|
end
|
|
|
|
def new_data
|
|
@new_data ||= serialize_for_invoice
|
|
end
|
|
|
|
def old_data
|
|
@old_data ||= order.invoices&.last&.data
|
|
end
|
|
end
|