diff --git a/app/services/stripe_invoice_service.rb b/app/services/stripe_invoice_service.rb index 71db2a3..9cf05b0 100644 --- a/app/services/stripe_invoice_service.rb +++ b/app/services/stripe_invoice_service.rb @@ -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) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index a09a80a..f743b1e 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -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] diff --git a/test/services/stripe_invoice_service_test.rb b/test/services/stripe_invoice_service_test.rb index baea13d..c89f6eb 100644 --- a/test/services/stripe_invoice_service_test.rb +++ b/test/services/stripe_invoice_service_test.rb @@ -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