mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
Merge pull request #6836 from coopdevs/customer-balance-reports
Customer balance reports
This commit is contained in:
@@ -3,7 +3,9 @@ require 'open_food_network/user_balance_calculator'
|
||||
module OpenFoodNetwork
|
||||
class OrderCycleManagementReport
|
||||
DEFAULT_DATE_INTERVAL = { from: -1.month, to: 1.day }.freeze
|
||||
|
||||
attr_reader :params
|
||||
|
||||
def initialize(user, params = {}, render_table = false)
|
||||
@params = sanitize_params(params)
|
||||
@user = user
|
||||
@@ -44,11 +46,34 @@ module OpenFoodNetwork
|
||||
end
|
||||
|
||||
def search
|
||||
Spree::Order.complete.where("spree_orders.state != ?", :canceled).distributed_by_user(@user).managed_by(@user).search(params[:q])
|
||||
if FeatureToggle.enabled?(:customer_balance, @user)
|
||||
Spree::Order.
|
||||
finalized.
|
||||
where.not(spree_orders: { state: :canceled }).
|
||||
distributed_by_user(@user).
|
||||
managed_by(@user).
|
||||
search(params[:q])
|
||||
else
|
||||
Spree::Order.
|
||||
complete.
|
||||
where("spree_orders.state != ?", :canceled).
|
||||
distributed_by_user(@user).
|
||||
managed_by(@user).
|
||||
search(params[:q])
|
||||
end
|
||||
end
|
||||
|
||||
def orders
|
||||
filter search.result
|
||||
if FeatureToggle.enabled?(:customer_balance, @user)
|
||||
search_result = search.result.order(:completed_at)
|
||||
orders_with_balance = OutstandingBalance.new(search_result).
|
||||
query.
|
||||
select('spree_orders.*')
|
||||
|
||||
filter(orders_with_balance)
|
||||
else
|
||||
filter search.result
|
||||
end
|
||||
end
|
||||
|
||||
def table_items
|
||||
@@ -67,6 +92,14 @@ module OpenFoodNetwork
|
||||
|
||||
private
|
||||
|
||||
def balance(order)
|
||||
if FeatureToggle.enabled?(:customer_balance, @user)
|
||||
order.balance_value
|
||||
else
|
||||
UserBalanceCalculator.new(order.email, order.distributor).balance
|
||||
end
|
||||
end
|
||||
|
||||
def payment_method_row(order)
|
||||
ba = order.billing_address
|
||||
[ba.andand.firstname,
|
||||
@@ -78,7 +111,7 @@ module OpenFoodNetwork
|
||||
order.shipping_method.andand.name,
|
||||
order.payments.first.andand.payment_method.andand.name,
|
||||
order.payments.first.andand.amount,
|
||||
OpenFoodNetwork::UserBalanceCalculator.new(order.email, order.distributor).balance]
|
||||
balance(order)]
|
||||
end
|
||||
|
||||
def delivery_row(order)
|
||||
@@ -93,7 +126,7 @@ module OpenFoodNetwork
|
||||
order.shipping_method.andand.name,
|
||||
order.payments.first.andand.payment_method.andand.name,
|
||||
order.payments.first.andand.amount,
|
||||
OpenFoodNetwork::UserBalanceCalculator.new(order.email, order.distributor).balance,
|
||||
balance(order),
|
||||
has_temperature_controlled_items?(order),
|
||||
order.special_instructions]
|
||||
end
|
||||
|
||||
@@ -6,30 +6,60 @@ require 'open_food_network/order_cycle_management_report'
|
||||
module OpenFoodNetwork
|
||||
describe OrderCycleManagementReport do
|
||||
context "as a site admin" do
|
||||
subject { OrderCycleManagementReport.new(user, params, true) }
|
||||
let(:params) { {} }
|
||||
|
||||
let(:user) do
|
||||
user = create(:user)
|
||||
user.spree_roles << Spree::Role.find_or_create_by!(name: "admin")
|
||||
user
|
||||
end
|
||||
subject { OrderCycleManagementReport.new user, {}, true }
|
||||
|
||||
describe "fetching orders" do
|
||||
it "fetches completed orders" do
|
||||
o1 = create(:order)
|
||||
o2 = create(:order, completed_at: 1.day.ago)
|
||||
o2 = create(:order, completed_at: 1.day.ago, state: 'complete')
|
||||
expect(subject.orders).to eq([o2])
|
||||
end
|
||||
|
||||
it 'fetches resumed orders' do
|
||||
order = create(:order, state: 'resumed', completed_at: 1.day.ago)
|
||||
expect(subject.orders).to eq([order])
|
||||
end
|
||||
|
||||
context 'when the customer_balance feature is enabled' do
|
||||
let(:customers_with_balance) { instance_double(CustomersWithBalance) }
|
||||
|
||||
before do
|
||||
allow(OpenFoodNetwork::FeatureToggle)
|
||||
.to receive(:enabled?).with(:customer_balance, anything) { true }
|
||||
end
|
||||
|
||||
it 'calls OutstandingBalance query object' do
|
||||
outstanding_balance = instance_double(OutstandingBalance, query: Spree::Order.none)
|
||||
expect(OutstandingBalance).to receive(:new).and_return(outstanding_balance)
|
||||
|
||||
subject.orders
|
||||
end
|
||||
|
||||
it 'orders them by id' do
|
||||
order1 = create(:order, completed_at: 1.day.ago, state: 'complete')
|
||||
order2 = create(:order, completed_at: 2.days.ago, state: 'complete')
|
||||
|
||||
expect(subject.orders.pluck(:id)).to eq([order2.id, order1.id])
|
||||
end
|
||||
end
|
||||
|
||||
it "does not show cancelled orders" do
|
||||
o1 = create(:order, state: "canceled", completed_at: 1.day.ago)
|
||||
o2 = create(:order, completed_at: 1.day.ago)
|
||||
o1 = create(:order, state: 'canceled', completed_at: 1.day.ago)
|
||||
o2 = create(:order, state: 'complete', completed_at: 1.day.ago)
|
||||
expect(subject.orders).to eq([o2])
|
||||
end
|
||||
|
||||
context "default date range" do
|
||||
it "fetches orders completed in the past month" do
|
||||
o1 = create(:order, completed_at: 1.month.ago - 1.day)
|
||||
o2 = create(:order, completed_at: 1.month.ago + 1.day)
|
||||
o1 = create(:order, state: 'complete', completed_at: 1.month.ago - 1.day)
|
||||
o2 = create(:order, state: 'complete', completed_at: 1.month.ago + 1.day)
|
||||
expect(subject.orders).to eq([o2])
|
||||
end
|
||||
end
|
||||
@@ -52,8 +82,8 @@ module OpenFoodNetwork
|
||||
d2 = create(:distributor_enterprise)
|
||||
d2.enterprise_roles.create!(user: create(:user))
|
||||
|
||||
o1 = create(:order, distributor: d1, completed_at: 1.day.ago)
|
||||
o2 = create(:order, distributor: d2, completed_at: 1.day.ago)
|
||||
o1 = create(:order, distributor: d1, state: 'complete', completed_at: 1.day.ago)
|
||||
o2 = create(:order, distributor: d2, state: 'complete', completed_at: 1.day.ago)
|
||||
|
||||
expect(subject).to receive(:filter).with([o1]).and_return([o1])
|
||||
expect(subject.orders).to eq([o1])
|
||||
@@ -122,6 +152,84 @@ module OpenFoodNetwork
|
||||
expect(subject.filter(orders)).to eq([order1])
|
||||
end
|
||||
end
|
||||
|
||||
describe '#table_items' do
|
||||
subject { OrderCycleManagementReport.new(user, params, true) }
|
||||
|
||||
let(:distributor) { create(:distributor_enterprise) }
|
||||
before { distributor.enterprise_roles.create!(user: user) }
|
||||
|
||||
context 'when the report type is payment_methods' do
|
||||
let(:params) { { report_type: 'payment_methods' } }
|
||||
|
||||
let!(:order) do
|
||||
create(
|
||||
:order,
|
||||
distributor: distributor,
|
||||
completed_at: 1.day.ago,
|
||||
state: 'complete',
|
||||
total: 10.0
|
||||
)
|
||||
end
|
||||
|
||||
it 'returns rows with payment information' do
|
||||
expect(subject.table_items).to eq([[
|
||||
order.billing_address.firstname,
|
||||
order.billing_address.lastname,
|
||||
order.distributor.name,
|
||||
'',
|
||||
order.email,
|
||||
order.billing_address.phone,
|
||||
nil,
|
||||
nil,
|
||||
nil,
|
||||
-10.0
|
||||
]])
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the report type is not payment_methods' do
|
||||
let(:params) { {} }
|
||||
|
||||
let(:shipping_method) { create(:shipping_method) }
|
||||
let(:shipment) { create(:shipment_with, :shipping_method, shipping_method: shipping_method) }
|
||||
|
||||
let!(:order) do
|
||||
create(
|
||||
:order,
|
||||
distributor: distributor,
|
||||
completed_at: 1.day.ago,
|
||||
shipments: [shipment]
|
||||
)
|
||||
end
|
||||
|
||||
before do
|
||||
line_item = create(:line_item, order: order, price: 10.0, quantity: 1)
|
||||
|
||||
order.state = 'complete'
|
||||
order.ship_address = order.address_from_distributor
|
||||
order.save!
|
||||
end
|
||||
|
||||
it 'returns rows with delivery information' do
|
||||
expect(subject.table_items).to eq([[
|
||||
order.ship_address.firstname,
|
||||
order.ship_address.lastname,
|
||||
order.distributor.name,
|
||||
nil,
|
||||
"#{order.ship_address.address1} #{order.ship_address.address2} #{order.ship_address.city}",
|
||||
order.ship_address.zipcode,
|
||||
order.ship_address.phone,
|
||||
shipping_method.name,
|
||||
nil,
|
||||
nil,
|
||||
-10.0,
|
||||
false,
|
||||
order.special_instructions
|
||||
]])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user