Fix service fee missing from Stripe invoices
The StripeInvoiceService was only creating line items for tickets but missing the 1€ service fee, causing a discrepancy where customers paid 26€ via Stripe checkout but the generated invoice only showed 25€. - Add service fee line item to Stripe invoices in StripeInvoiceService - Update all related tests to expect two line items (tickets + service fee) - Fix order controller test to account for service fee in total calculation Now Stripe invoices properly match the amount paid: tickets + 1€ service fee. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -147,6 +147,7 @@ class StripeInvoiceService
|
|||||||
end
|
end
|
||||||
|
|
||||||
def add_line_items_to_invoice(customer, invoice)
|
def add_line_items_to_invoice(customer, invoice)
|
||||||
|
# Add ticket line items
|
||||||
@order.tickets.group_by(&:ticket_type).each do |ticket_type, tickets|
|
@order.tickets.group_by(&:ticket_type).each do |ticket_type, tickets|
|
||||||
quantity = tickets.count
|
quantity = tickets.count
|
||||||
|
|
||||||
@@ -164,6 +165,20 @@ class StripeInvoiceService
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Add service fee line item
|
||||||
|
service_fee_cents = 100 # 1€ service fee
|
||||||
|
Stripe::InvoiceItem.create({
|
||||||
|
customer: customer.id,
|
||||||
|
invoice: invoice.id,
|
||||||
|
amount: service_fee_cents,
|
||||||
|
currency: "eur",
|
||||||
|
description: "Frais de service - Frais de traitement de la commande",
|
||||||
|
metadata: {
|
||||||
|
item_type: "service_fee",
|
||||||
|
amount_cents: service_fee_cents
|
||||||
|
}
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_line_item_description(ticket_type, tickets)
|
def build_line_item_description(ticket_type, tickets)
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ class OrdersControllerTest < ActionDispatch::IntegrationTest
|
|||||||
assert_equal "draft", new_order.status
|
assert_equal "draft", new_order.status
|
||||||
assert_equal @user, new_order.user
|
assert_equal @user, new_order.user
|
||||||
assert_equal @event, new_order.event
|
assert_equal @event, new_order.event
|
||||||
assert_equal @ticket_type.price_cents, new_order.total_amount_cents
|
assert_equal @ticket_type.price_cents + 100, new_order.total_amount_cents # includes 1€ service fee
|
||||||
|
|
||||||
assert_redirected_to checkout_order_path(new_order)
|
assert_redirected_to checkout_order_path(new_order)
|
||||||
assert_equal new_order.id, session[:draft_order_id]
|
assert_equal new_order.id, session[:draft_order_id]
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
|
|||||||
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
|
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
|
||||||
mock_invoice.expects(:pay)
|
mock_invoice.expects(:pay)
|
||||||
Stripe::Invoice.expects(:create).returns(mock_invoice)
|
Stripe::Invoice.expects(:create).returns(mock_invoice)
|
||||||
Stripe::InvoiceItem.expects(:create).once
|
Stripe::InvoiceItem.expects(:create).twice # Once for tickets, once for service fee
|
||||||
|
|
||||||
result = @service.create_post_payment_invoice
|
result = @service.create_post_payment_invoice
|
||||||
assert_not_nil result
|
assert_not_nil result
|
||||||
@@ -173,7 +173,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
|
|||||||
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
|
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
|
||||||
mock_invoice.expects(:pay)
|
mock_invoice.expects(:pay)
|
||||||
Stripe::Invoice.expects(:create).returns(mock_invoice)
|
Stripe::Invoice.expects(:create).returns(mock_invoice)
|
||||||
Stripe::InvoiceItem.expects(:create).once
|
Stripe::InvoiceItem.expects(:create).twice # Once for tickets, once for service fee
|
||||||
|
|
||||||
result = @service.create_post_payment_invoice
|
result = @service.create_post_payment_invoice
|
||||||
assert_not_nil result
|
assert_not_nil result
|
||||||
@@ -196,7 +196,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
|
|||||||
mock_customer.stubs(:id).returns("cus_test123")
|
mock_customer.stubs(:id).returns("cus_test123")
|
||||||
Stripe::Customer.expects(:create).returns(mock_customer)
|
Stripe::Customer.expects(:create).returns(mock_customer)
|
||||||
|
|
||||||
expected_line_item = {
|
expected_ticket_line_item = {
|
||||||
customer: "cus_test123",
|
customer: "cus_test123",
|
||||||
invoice: "in_test123",
|
invoice: "in_test123",
|
||||||
amount: @ticket_type.price_cents * 2, # 2 tickets
|
amount: @ticket_type.price_cents * 2, # 2 tickets
|
||||||
@@ -210,12 +210,25 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expected_service_fee_line_item = {
|
||||||
|
customer: "cus_test123",
|
||||||
|
invoice: "in_test123",
|
||||||
|
amount: 100,
|
||||||
|
currency: "eur",
|
||||||
|
description: "Frais de service - Frais de traitement de la commande",
|
||||||
|
metadata: {
|
||||||
|
item_type: "service_fee",
|
||||||
|
amount_cents: 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mock_invoice = mock("invoice")
|
mock_invoice = mock("invoice")
|
||||||
mock_invoice.stubs(:id).returns("in_test123")
|
mock_invoice.stubs(:id).returns("in_test123")
|
||||||
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
|
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
|
||||||
mock_invoice.expects(:pay)
|
mock_invoice.expects(:pay)
|
||||||
Stripe::Invoice.expects(:create).returns(mock_invoice)
|
Stripe::Invoice.expects(:create).returns(mock_invoice)
|
||||||
Stripe::InvoiceItem.expects(:create).with(expected_line_item)
|
Stripe::InvoiceItem.expects(:create).with(expected_ticket_line_item)
|
||||||
|
Stripe::InvoiceItem.expects(:create).with(expected_service_fee_line_item)
|
||||||
|
|
||||||
result = @service.create_post_payment_invoice
|
result = @service.create_post_payment_invoice
|
||||||
assert_not_nil result
|
assert_not_nil result
|
||||||
@@ -248,7 +261,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
|
|||||||
mock_invoice.expects(:pay)
|
mock_invoice.expects(:pay)
|
||||||
|
|
||||||
Stripe::Invoice.expects(:create).with(expected_invoice_data).returns(mock_invoice)
|
Stripe::Invoice.expects(:create).with(expected_invoice_data).returns(mock_invoice)
|
||||||
Stripe::InvoiceItem.expects(:create).once
|
Stripe::InvoiceItem.expects(:create).twice # Once for tickets, once for service fee
|
||||||
|
|
||||||
result = @service.create_post_payment_invoice
|
result = @service.create_post_payment_invoice
|
||||||
assert_not_nil result
|
assert_not_nil result
|
||||||
@@ -287,7 +300,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
|
|||||||
})
|
})
|
||||||
|
|
||||||
Stripe::Invoice.expects(:create).returns(mock_invoice)
|
Stripe::Invoice.expects(:create).returns(mock_invoice)
|
||||||
Stripe::InvoiceItem.expects(:create).once
|
Stripe::InvoiceItem.expects(:create).twice # Once for tickets, once for service fee
|
||||||
mock_invoice.expects(:finalize_invoice).returns(mock_finalized_invoice)
|
mock_invoice.expects(:finalize_invoice).returns(mock_finalized_invoice)
|
||||||
|
|
||||||
result = @service.create_post_payment_invoice
|
result = @service.create_post_payment_invoice
|
||||||
|
|||||||
Reference in New Issue
Block a user