mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-27 01:43:22 +00:00
extract methods related to invoices from the order model to the OrderInvoiceComparator
This commit is contained in:
committed by
Konrad
parent
61d58df56f
commit
0ed7599267
@@ -19,13 +19,14 @@ module Spree
|
||||
|
||||
def generate
|
||||
@order = Order.find_by(number: params[:order_id])
|
||||
if @order.can_generate_new_invoice?
|
||||
@comparator = OrderInvoiceComparator.new(@order)
|
||||
if @comparator.can_generate_new_invoice?
|
||||
@order.invoices.create!(
|
||||
date: Time.zone.today,
|
||||
number: @order.next_invoice_number,
|
||||
data: invoice_data
|
||||
)
|
||||
elsif @order.can_update_latest_invoice?
|
||||
elsif @comparator.can_update_latest_invoice?
|
||||
@order.invoices.last.update!(
|
||||
date: Time.zone.today,
|
||||
data: invoice_data
|
||||
|
||||
@@ -10,7 +10,12 @@ module OrderHelper
|
||||
end
|
||||
|
||||
def show_generate_invoice_button?(order)
|
||||
order.can_generate_new_invoice? ||
|
||||
order.can_update_latest_invoice?
|
||||
comparator = order_comparator(order)
|
||||
comparator.can_generate_new_invoice? ||
|
||||
comparator.can_update_latest_invoice?
|
||||
end
|
||||
|
||||
def order_comparator(order)
|
||||
OrderInvoiceComparator.new(order)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -575,39 +575,10 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
def can_generate_new_invoice?
|
||||
return true if invoices.empty?
|
||||
|
||||
invoice_comparator.can_generate_new_invoice? current_state_invoice, invoices.last
|
||||
end
|
||||
|
||||
def can_update_latest_invoice?
|
||||
return false if invoices.empty?
|
||||
|
||||
invoice_comparator.can_update_latest_invoice? current_state_invoice, invoices.last
|
||||
end
|
||||
|
||||
def next_invoice_number
|
||||
invoices.count + 1
|
||||
end
|
||||
|
||||
def invoice_comparator
|
||||
@invoice_comparator ||= OrderInvoiceComparator.new
|
||||
end
|
||||
|
||||
def current_state_invoice
|
||||
Invoice.new(
|
||||
order: self,
|
||||
data: serialize_for_invoice,
|
||||
date: Time.zone.today,
|
||||
number: invoices.count + 1
|
||||
)
|
||||
end
|
||||
|
||||
def serialize_for_invoice
|
||||
Invoice::OrderSerializer.new(self).serializable_hash
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def deliver_order_confirmation_email
|
||||
|
||||
@@ -22,6 +22,10 @@ class InvoiceDataGenerator
|
||||
new_data
|
||||
end
|
||||
|
||||
def serialize_for_invoice
|
||||
Invoice::OrderSerializer.new(order).serializable_hash
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def update_order_attributes
|
||||
@@ -57,7 +61,7 @@ class InvoiceDataGenerator
|
||||
end
|
||||
|
||||
def new_data
|
||||
@new_data ||= order.serialize_for_invoice
|
||||
@new_data ||= serialize_for_invoice
|
||||
end
|
||||
|
||||
def old_data
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class OrderInvoiceComparator
|
||||
def can_generate_new_invoice?(current_state_invoice, latest_invoice)
|
||||
attr :order
|
||||
|
||||
def initialize(order)
|
||||
@order = order
|
||||
end
|
||||
|
||||
def can_generate_new_invoice?
|
||||
return true if invoices.empty?
|
||||
|
||||
# We'll use a recursive BFS algorithm to find if the invoice is outdated
|
||||
# the root will be the order
|
||||
# On each node, we'll a list of relevant attributes that will be used on the comparison
|
||||
@@ -9,7 +17,9 @@ class OrderInvoiceComparator
|
||||
invoice_generation_selector)
|
||||
end
|
||||
|
||||
def can_update_latest_invoice?(current_state_invoice, latest_invoice)
|
||||
def can_update_latest_invoice?
|
||||
return false if invoices.empty?
|
||||
|
||||
different?(current_state_invoice.presenter, latest_invoice.presenter, invoice_update_selector)
|
||||
end
|
||||
|
||||
@@ -51,4 +61,27 @@ class OrderInvoiceComparator
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def current_state_invoice
|
||||
Invoice.new(
|
||||
order: order,
|
||||
data: serialize_for_invoice,
|
||||
date: Time.zone.today,
|
||||
number: invoices.count + 1
|
||||
)
|
||||
end
|
||||
|
||||
def invoices
|
||||
order.invoices
|
||||
end
|
||||
|
||||
def latest_invoice
|
||||
invoices.last
|
||||
end
|
||||
|
||||
def serialize_for_invoice
|
||||
InvoiceDataGenerator.new(order).serialize_for_invoice
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,7 +5,12 @@ require 'spec_helper'
|
||||
describe InvoiceDataGenerator do
|
||||
describe '#generate' do
|
||||
let!(:order) { create(:completed_order_with_fees) }
|
||||
let!(:latest_invoice){ create(:invoice, order: order, data: order.serialize_for_invoice) }
|
||||
let!(:invoice_data_generator){ InvoiceDataGenerator.new(order) }
|
||||
let!(:latest_invoice){
|
||||
create(:invoice,
|
||||
order: order,
|
||||
data: invoice_data_generator.serialize_for_invoice)
|
||||
}
|
||||
let(:new_invoice_data) {
|
||||
InvoiceDataGenerator.new(order).generate
|
||||
}
|
||||
@@ -74,7 +79,7 @@ describe InvoiceDataGenerator do
|
||||
}
|
||||
|
||||
it "should generate a new invoice" do
|
||||
expect(new_invoice_data).to eql order.serialize_for_invoice
|
||||
expect(new_invoice_data).to eql InvoiceDataGenerator.new(order).serialize_for_invoice
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,10 +5,14 @@ require 'spec_helper'
|
||||
describe OrderInvoiceComparator do
|
||||
describe '#can_generate_new_invoice?' do
|
||||
let!(:order) { create(:completed_order_with_fees) }
|
||||
let!(:invoice){ create(:invoice, order: order, data: order.serialize_for_invoice) }
|
||||
let(:current_state_invoice){ order.current_state_invoice }
|
||||
let!(:invoice_data_generator){ InvoiceDataGenerator.new(order) }
|
||||
let!(:invoice){
|
||||
create(:invoice,
|
||||
order: order,
|
||||
data: invoice_data_generator.serialize_for_invoice)
|
||||
}
|
||||
let(:subject) {
|
||||
OrderInvoiceComparator.new.can_generate_new_invoice?(current_state_invoice, invoice)
|
||||
OrderInvoiceComparator.new(order).can_generate_new_invoice?
|
||||
}
|
||||
|
||||
context "changes on the order object" do
|
||||
@@ -47,10 +51,14 @@ describe OrderInvoiceComparator do
|
||||
|
||||
describe '#can_update_latest_invoice?' do
|
||||
let!(:order) { create(:completed_order_with_fees) }
|
||||
let!(:invoice){ create(:invoice, order: order, data: order.serialize_for_invoice) }
|
||||
let(:current_state_invoice){ order.current_state_invoice }
|
||||
let!(:invoice_data_generator){ InvoiceDataGenerator.new(order) }
|
||||
let!(:invoice){
|
||||
create(:invoice,
|
||||
order: order,
|
||||
data: invoice_data_generator.serialize_for_invoice)
|
||||
}
|
||||
let(:subject) {
|
||||
OrderInvoiceComparator.new.can_update_latest_invoice?(current_state_invoice, invoice)
|
||||
OrderInvoiceComparator.new(order).can_update_latest_invoice?
|
||||
}
|
||||
|
||||
context "changes on the order object" do
|
||||
|
||||
Reference in New Issue
Block a user