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:
kbe
2025-09-08 11:15:36 +02:00
parent bc214867b0
commit 67d3bcde5b
3 changed files with 35 additions and 7 deletions

View File

@@ -147,6 +147,7 @@ class StripeInvoiceService
end
def add_line_items_to_invoice(customer, invoice)
# Add ticket line items
@order.tickets.group_by(&:ticket_type).each do |ticket_type, tickets|
quantity = tickets.count
@@ -164,6 +165,20 @@ class StripeInvoiceService
}
})
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
def build_line_item_description(ticket_type, tickets)

View File

@@ -122,7 +122,7 @@ class OrdersControllerTest < ActionDispatch::IntegrationTest
assert_equal "draft", new_order.status
assert_equal @user, new_order.user
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_equal new_order.id, session[:draft_order_id]

View File

@@ -151,7 +151,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
mock_invoice.expects(:pay)
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
assert_not_nil result
@@ -173,7 +173,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
mock_invoice.expects(:pay)
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
assert_not_nil result
@@ -196,7 +196,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
mock_customer.stubs(:id).returns("cus_test123")
Stripe::Customer.expects(:create).returns(mock_customer)
expected_line_item = {
expected_ticket_line_item = {
customer: "cus_test123",
invoice: "in_test123",
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.stubs(:id).returns("in_test123")
mock_invoice.stubs(:finalize_invoice).returns(mock_invoice)
mock_invoice.expects(:pay)
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
assert_not_nil result
@@ -248,7 +261,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
mock_invoice.expects(:pay)
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
assert_not_nil result
@@ -287,7 +300,7 @@ class StripeInvoiceServiceTest < ActiveSupport::TestCase
})
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)
result = @service.create_post_payment_invoice