From fc2b52c2ca52da6d94b92bc090be7ca301ec17f9 Mon Sep 17 00:00:00 2001 From: Sylvain Date: Wed, 26 Oct 2022 14:32:19 +0200 Subject: [PATCH] (bug) invalid accounting export for store orders --- app/models/setting.rb | 2 +- app/services/accounting_export_service.rb | 141 ++---------- config/locales/en.yml | 1 + test/fixtures/coupons.yml | 12 ++ test/fixtures/history_values.yml | 48 ++++- test/fixtures/payment_gateway_objects.yml | 29 +++ test/fixtures/settings.yml | 24 +++ .../exports/accounting_export_test.rb | 201 +++++++++++------- 8 files changed, 249 insertions(+), 209 deletions(-) diff --git a/app/models/setting.rb b/app/models/setting.rb index f3453a8af..29e6ab7c4 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -204,7 +204,7 @@ class Setting < ApplicationRecord # @return {String|Boolean} ## def self.get(name) - res = find_by(name: name)&.value + res = find_by('LOWER(name) = ? ', name.downcase)&.value # handle boolean values return true if res == 'true' diff --git a/app/services/accounting_export_service.rb b/app/services/accounting_export_service.rb index 54d103c38..bdc1033f8 100644 --- a/app/services/accounting_export_service.rb +++ b/app/services/accounting_export_service.rb @@ -61,28 +61,21 @@ class AccountingExportService # Generate the "subscription" and "reservation" rows associated with the provided invoice def items_rows(invoice) - rows = invoice.subscription_invoice? ? "#{subscription_row(invoice)}\n" : '' - case invoice.main_item.object_type - when 'Reservation' - items = invoice.invoice_items.reject { |ii| ii.object_type == 'Subscription' } + rows = '' + { + subscription: 'Subscription', reservation: 'Reservation', wallet: 'WalletTransaction', + pack: 'StatisticProfilePrepaidPack', product: 'OrderItem', error: 'Error' + }.each do |type, object_type| + items = invoice.invoice_items.filter { |ii| ii.object_type == object_type } items.each do |item| - rows << "#{reservation_row(invoice, item)}\n" + rows << "#{row( + invoice, + account(invoice, type), + account(invoice, type, type: :label), + item.net_amount / 100.00, + line_label: label(invoice) + )}\n" end - when 'WalletTransaction' - rows << "#{wallet_row(invoice)}\n" - when 'StatisticProfilePrepaidPack' - rows << "#{pack_row(invoice)}\n" - when 'OrderItem' - rows << "#{product_row(invoice)}\n" - when 'Error' - items = invoice.invoice_items.reject { |ii| ii.object_type == 'Subscription' } - items.each do |item| - rows << "#{error_row(invoice, item)}\n" - end - when 'Subscription' - # do nothing, subscription was already handled by subscription_row - else - Rails.logger.warn { "Unknown main object type #{invoice.main_item.object_type}" } end rows end @@ -93,8 +86,8 @@ class AccountingExportService invoice.payment_means.each do |details| rows << row( invoice, - account(invoice, :projets, means: details[:means]), - account(invoice, :projets, means: details[:means], type: :label), + account(invoice, :client, means: details[:means]), + account(invoice, :client, means: details[:means], type: :label), details[:amount] / 100.00, line_label: label(invoice), debit_method: :debit_client, @@ -105,61 +98,6 @@ class AccountingExportService rows end - # Generate the "reservation" row, which contains the credit to the reservation account, all taxes excluded - def reservation_row(invoice, item) - row( - invoice, - account(invoice, :reservation), - account(invoice, :reservation, type: :label), - item.net_amount / 100.00, - line_label: label(invoice) - ) - end - - # Generate the "subscription" row, which contains the credit to the subscription account, all taxes excluded - def subscription_row(invoice) - subscription_item = invoice.invoice_items.select { |ii| ii.object_type == 'Subscription' }.first - row( - invoice, - account(invoice, :subscription), - account(invoice, :subscription, type: :label), - subscription_item.net_amount / 100.00, - line_label: label(invoice) - ) - end - - # Generate the "wallet" row, which contains the credit to the wallet account, all taxes excluded - # This applies to wallet crediting, when an Avoir is generated at this time - def wallet_row(invoice) - row( - invoice, - account(invoice, :wallet), - account(invoice, :wallet, type: :label), - invoice.invoice_items.first.net_amount / 100.00, - line_label: label(invoice) - ) - end - - def pack_row(invoice) - row( - invoice, - account(invoice, :pack), - account(invoice, :pack, type: :label), - invoice.invoice_items.first.net_amount / 100.00, - line_label: label(invoice) - ) - end - - def product_row(invoice) - row( - invoice, - account(invoice, :product), - account(invoice, :product, type: :label), - invoice.invoice_items.first.net_amount / 100.00, - line_label: label(invoice) - ) - end - # Generate the "VAT" row, which contains the credit to the VAT account, with VAT amount only def vat_row(invoice) total = invoice.invoice_items.map(&:net_amount).sum @@ -175,16 +113,6 @@ class AccountingExportService ) end - def error_row(invoice, item) - row( - invoice, - account(invoice, :error), - account(invoice, :error, type: :label), - item.net_amount / 100.00, - line_label: label(invoice) - ) - end - # Generate a row of the export, filling the configured columns with the provided values def row(invoice, account_code, account_label, amount, line_label: '', debit_method: :debit, credit_method: :credit) row = '' @@ -219,44 +147,12 @@ class AccountingExportService # Get the account code (or label) for the given invoice and the specified line type (client, vat, subscription or reservation) def account(invoice, account, type: :code, means: :other) case account - when :projets + when :client Setting.get("accounting_#{means}_client_#{type}") - when :vat - Setting.get("accounting_VAT_#{type}") - when :subscription - if invoice.subscription_invoice? - Setting.get("accounting_subscription_#{type}") - else - Rails.logger.debug { "WARN: Invoice #{invoice.id} has no subscription" } - end when :reservation - if invoice.main_item.object_type == 'Reservation' - Setting.get("accounting_#{invoice.main_item.object.reservable_type}_#{type}") - else - Rails.logger.debug { "WARN: Invoice #{invoice.id} has no reservation" } - end - when :wallet - if invoice.main_item.object_type == 'WalletTransaction' - Setting.get("accounting_wallet_#{type}") - else - Rails.logger.debug { "WARN: Invoice #{invoice.id} is not a wallet credit" } - end - when :pack - if invoice.main_item.object_type == 'StatisticProfilePrepaidPack' - Setting.get("accounting_Pack_#{type}") - else - Rails.logger.debug { "WARN: Invoice #{invoice.id} has no prepaid-pack" } - end - when :product - if invoice.main_item.object_type == 'OrderItem' - Setting.get("accounting_Product_#{type}") - else - Rails.logger.debug { "WARN: Invoice #{invoice.id} has no prepaid-pack" } - end - when :error - Setting.get("accounting_Error_#{type}") + Setting.get("accounting_#{invoice.main_item.object.reservable_type}_#{type}") if invoice.main_item.object_type == 'Reservation' else - Rails.logger.debug { "Unsupported account #{account}" } + Setting.get("accounting_#{account}_#{type}") end || '' end @@ -297,6 +193,7 @@ class AccountingExportService items.push I18n.t("accounting_export.#{invoice.main_item.object.reservable_type}_reservation") end items.push I18n.t('accounting_export.wallet') if invoice.main_item.object_type == 'WalletTransaction' + items.push I18n.t('accounting_export.shop_order') if invoice.main_item.object_type == 'OrderItem' summary = items.join(' + ') res = "#{reference}, #{summary}" diff --git a/config/locales/en.yml b/config/locales/en.yml index 22d8e6909..18f76841f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -164,6 +164,7 @@ en: Event_reservation: "event reserv." Space_reservation: "space reserv." wallet: "wallet" + shop_order: "shop order" vat_export: start_date: "Start date" end_date: "End date" diff --git a/test/fixtures/coupons.yml b/test/fixtures/coupons.yml index 2bf8adab7..a483c2fb5 100644 --- a/test/fixtures/coupons.yml +++ b/test/fixtures/coupons.yml @@ -35,3 +35,15 @@ cash2: max_usages: active: true validity_per_user: once +twentyp: + id: 30 + name: 20% test + code: REDUC20 + percent_off: 20 + valid_until: + max_usages: + active: true + created_at: '2021-06-18 14:53:54.770895' + updated_at: '2021-06-18 14:53:54.770895' + validity_per_user: forever + amount_off: diff --git a/test/fixtures/history_values.yml b/test/fixtures/history_values.yml index a6099c563..b1913dafd 100644 --- a/test/fixtures/history_values.yml +++ b/test/fixtures/history_values.yml @@ -494,7 +494,7 @@ history_value_51: history_value_52: id: 52 setting_id: 52 - value: '7062' + value: Machine reservation created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.872288' footprint: 0ee671e962f92a3af95538fdd65a64ff410b208ab790c4e6f7b0a9f5a13dc1a2 @@ -503,7 +503,7 @@ history_value_52: history_value_53: id: 53 setting_id: 53 - value: Machine reservation + value: '7062' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.904414' footprint: ad09bac8c58754444a9970108d613aefaeceed540609688f5668c68ca5c03531 @@ -512,7 +512,7 @@ history_value_53: history_value_54: id: 54 setting_id: 54 - value: '7063' + value: Training reservation created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.930713' footprint: 89f17add783f9977c4b13bc22f5776d0427c3d9af8c83206af57de7c72c153b0 @@ -521,7 +521,7 @@ history_value_54: history_value_55: id: 55 setting_id: 55 - value: Training reservation + value: '7063' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.955492' footprint: f2e20f936e3fc917bc82e97adb321f957c2cd6ac992f3223ffe2be529ea1649f @@ -530,7 +530,7 @@ history_value_55: history_value_56: id: 56 setting_id: 56 - value: '7064' + value: Event reservation created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.977369' footprint: 5ce909aa92740dbd65647ff3a5d5fdc75ad6c2a02b5fa9bbeea1aa27f907416a @@ -539,7 +539,7 @@ history_value_56: history_value_57: id: 57 setting_id: 57 - value: Event reservation + value: '7064' created_at: '2019-09-20 11:02:32.125400' updated_at: '2021-05-31 15:00:36.993279' footprint: ed7ecf389b9560728ce43257bef442a2404f463ebbc0fbaeaad05f113cca21df @@ -824,3 +824,39 @@ history_value_86: updated_at: '2021-06-15 12:05:21.513651' footprint: 350ca0033f3e65b6e8186dbb0545b55ecb3768e1a08501549b81d95e34809440 invoicing_profile_id: 1 + +history_value_87: + id: 87 + setting_id: 86 + value: Prepaid pack + created_at: '2022-10-26 12:46:16.125400000 Z' + updated_at: '2022-10-26 12:46:16.125400000 Z' + footprint: + invoicing_profile_id: 1 + +history_value_88: + id: 88 + setting_id: 87 + value: '7066' + created_at: '2022-10-26 12:46:16.125400000 Z' + updated_at: '2022-10-26 12:46:16.125400000 Z' + footprint: + invoicing_profile_id: 1 + +history_value_89: + id: 89 + setting_id: 88 + value: Shop order + created_at: '2022-10-26 12:46:16.125400000 Z' + updated_at: '2022-10-26 12:46:16.125400000 Z' + footprint: + invoicing_profile_id: 1 + +history_value_90: + id: 90 + setting_id: 89 + value: '7067' + created_at: '2022-10-26 12:46:16.125400000 Z' + updated_at: '2022-10-26 12:46:16.125400000 Z' + footprint: + invoicing_profile_id: 1 diff --git a/test/fixtures/payment_gateway_objects.yml b/test/fixtures/payment_gateway_objects.yml index ec20d0d44..9546629a2 100644 --- a/test/fixtures/payment_gateway_objects.yml +++ b/test/fixtures/payment_gateway_objects.yml @@ -244,3 +244,32 @@ pgo35: item_id: 10 gateway_object_type: 'Stripe::Customer' gateway_object_id: 'cus_IhIynmoJbzLpwX' +pgo36: + id: 36 + gateway_object_id: pi_3LpALs2sOmf47Nz91QyFI7nO + gateway_object_type: Stripe::PaymentIntent + item_type: Invoice + item_id: 5816 + payment_gateway_object_id: +pgo37: + id: 37 + gateway_object_id: pi_3LpBa12sOmf47Nz91QFYVXVf + gateway_object_type: Stripe::PaymentIntent + item_type: Invoice + item_id: 5817 + payment_gateway_object_id: +pgo38: + id: 38 + gateway_object_id: pi_3LpBjD2sOmf47Nz90bOsclbx + gateway_object_type: Stripe::PaymentIntent + item_type: Invoice + item_id: 5818 + payment_gateway_object_id: +pgo39: + id: 39 + gateway_object_id: pi_3LpBwR2sOmf47Nz90EILNKvi + gateway_object_type: Stripe::PaymentIntent + item_type: Invoice + item_id: 5819 + payment_gateway_object_id: + diff --git a/test/fixtures/settings.yml b/test/fixtures/settings.yml index ff21c31e7..9ee963d75 100644 --- a/test/fixtures/settings.yml +++ b/test/fixtures/settings.yml @@ -502,3 +502,27 @@ setting_85: name: public_agenda_module created_at: 2020-04-15 14:38:40.000421500 Z updated_at: 2020-04-15 14:38:40.000421500 Z + +setting_86: + id: 86 + name: accounting_Pack_label + created_at: 2022-10-26 12:46:16.125400000 Z + updated_at: 2022-10-26 12:46:16.125400000 Z + +setting_87: + id: 87 + name: accounting_Pack_code + created_at: 2022-10-26 12:46:16.125400000 Z + updated_at: 2022-10-26 12:46:16.125400000 Z + +setting_88: + id: 88 + name: accounting_Product_label + created_at: 2022-10-26 12:46:16.125400000 Z + updated_at: 2022-10-26 12:46:16.125400000 Z + +setting_89: + id: 89 + name: accounting_Product_code + created_at: 2022-10-26 12:46:16.125400000 Z + updated_at: 2022-10-26 12:46:16.125400000 Z diff --git a/test/integration/exports/accounting_export_test.rb b/test/integration/exports/accounting_export_test.rb index aff483e14..edb9d06e1 100644 --- a/test/integration/exports/accounting_export_test.rb +++ b/test/integration/exports/accounting_export_test.rb @@ -36,7 +36,7 @@ class Exports::AccountingExportTest < ActionDispatch::IntegrationTest # Check the export was created correctly res = json_response(response.body) - e = Export.where(id: res[:export_id]).first + e = Export.find(res[:export_id]) assert_not_nil e, 'Export was not created in database' # Run the worker @@ -52,94 +52,135 @@ class Exports::AccountingExportTest < ActionDispatch::IntegrationTest data = CSV.read(e.file, headers: true, col_sep: e.key) # test values - # first line = client line - journal_code = Setting.get('accounting_journal_code') - assert_equal journal_code, data[0][I18n.t('accounting_export.journal_code')], 'Wrong journal code' - first_invoice = Invoice.first - entry_date = first_invoice.created_at.to_date - assert_equal entry_date, DateTime.parse(data[0][I18n.t('accounting_export.date')]), 'Wrong date' - - if first_invoice.paid_by_card? - card_client_code = Setting.get('accounting_card_client_code') - assert_equal card_client_code, data[0][I18n.t('accounting_export.account_code')], 'Account code for card client is wrong' - - card_client_label = Setting.get('accounting_card_client_label') - assert_equal card_client_label, data[0][I18n.t('accounting_export.account_label')], 'Account label for card client is wrong' - else - warn "WARNING: unable to test accurately accounting export: invoice #{first_invoice.id} was not paid by card" - end - - assert_equal first_invoice.reference, data[0][I18n.t('accounting_export.piece')], 'Piece (invoice reference) is wrong' - - if first_invoice.subscription_invoice? - assert_match I18n.t('accounting_export.subscription'), - data[0][I18n.t('accounting_export.line_label')], - 'Line label does not contains the reference to the invoiced item' - else - warn "WARNING: unable to test accurately accounting export: invoice #{first_invoice.id} does not have a subscription" - end - - if first_invoice.wallet_transaction_id.nil? - assert_equal first_invoice.total / 100.00, data[0][I18n.t('accounting_export.debit_origin')].to_f, - 'Origin debit amount does not match' - assert_equal first_invoice.total / 100.00, data[0][I18n.t('accounting_export.debit_euro')].to_f, 'Euro debit amount does not match' - else - warn "WARNING: unable to test accurately accounting export: invoice #{first_invoice.id} is using wallet" - end - - assert_equal 0, data[0][I18n.t('accounting_export.credit_origin')].to_f, 'Credit origin amount does not match' - assert_equal 0, data[0][I18n.t('accounting_export.credit_euro')].to_f, 'Credit euro amount does not match' - + # first line = client line + check_client_line(first_invoice, data[0]) # second line = sold item line - assert_equal journal_code, data[1][I18n.t('accounting_export.journal_code')], 'Wrong journal code' - assert_equal entry_date, DateTime.parse(data[1][I18n.t('accounting_export.date')]), 'Wrong date' + check_item_line(first_invoice, first_invoice.invoice_items.first, data[1]) - if first_invoice.subscription_invoice? - subscription_code = Setting.get('accounting_subscription_code') - assert_equal subscription_code, data[1][I18n.t('accounting_export.account_code')], 'Account code for subscription is wrong' + # ensure invoice 4 is not exported (0€ invoice) + zero_invoice = Invoice.find(4) + assert_nil(data.map { |line| line[I18n.t('accounting_export.piece')] }.find { |document| document == zero_invoice.reference }, + 'Invoice at 0 should not be exported') - subscription_label = Setting.get('accounting_subscription_label') - assert_equal subscription_label, data[1][I18n.t('accounting_export.account_label')], 'Account label for subscription is wrong' - end - - assert_equal first_invoice.reference, data[1][I18n.t('accounting_export.piece')], 'Piece (invoice reference) is wrong' - assert_match I18n.t('accounting_export.subscription'), - data[1][I18n.t('accounting_export.line_label')], - 'Line label should be empty for non client lines' - - item = first_invoice.invoice_items.first - assert_equal item.amount / 100.00, data[1][I18n.t('accounting_export.credit_origin')].to_f, 'Origin credit amount does not match' - assert_equal item.amount / 100.00, data[1][I18n.t('accounting_export.credit_euro')].to_f, 'Euro credit amount does not match' - - assert_equal 0, data[1][I18n.t('accounting_export.debit_origin')].to_f, 'Debit origin amount does not match' - assert_equal 0, data[1][I18n.t('accounting_export.debit_euro')].to_f, 'Debit euro amount does not match' - - # test with another invoice + # test with a reservation invoice machine_invoice = Invoice.find(5) - client_row = data[data.length - 4] - item_row = data[data.length - 3] + check_client_line(machine_invoice, data[6]) + check_item_line(machine_invoice, machine_invoice.invoice_items.first, data[7]) - data.each do |a| - p a - end - if machine_invoice.main_item.object_type == 'Reservation' && machine_invoice.main_item.object.reservable_type == 'Machine' - assert_match I18n.t('accounting_export.Machine_reservation'), - client_row[I18n.t('accounting_export.line_label')], - 'Line label does not contains the reference to the invoiced item' - - machine_code = Setting.get('accounting_Machine_code') - assert_equal machine_code, item_row[I18n.t('accounting_export.account_code')], 'Account code for machine reservation is wrong' - - machine_label = Setting.get('accounting_Machine_label') - assert_equal machine_label, item_row[I18n.t('accounting_export.account_label')], 'Account label for machine reservation is wrong' - - else - warn "WARNING: unable to test accurately accounting export: invoice #{machine_invoice.id} is not a Machine reservation" - end + # test with a shop order invoice (local payment) + shop_invoice = Invoice.find(5811) + check_client_line(shop_invoice, data[10]) + check_item_line(shop_invoice, shop_invoice.invoice_items.first, data[11]) + check_item_line(shop_invoice, shop_invoice.invoice_items.last, data[12]) # Clean CSV file require 'fileutils' FileUtils.rm(e.file) end + + def check_client_line(invoice, client_line) + check_journal_code(client_line) + check_entry_date(invoice, client_line) + check_client_accounts(invoice, client_line) + check_entry_label(invoice, client_line) + check_document(invoice, client_line) + + if invoice.wallet_transaction_id.nil? + assert_equal invoice.total / 100.00, client_line[I18n.t('accounting_export.debit_origin')].to_f, + 'Origin debit amount does not match' + assert_equal invoice.total / 100.00, client_line[I18n.t('accounting_export.debit_euro')].to_f, 'Euro debit amount does not match' + else + warn "WARNING: unable to test accurately accounting export: invoice #{invoice.id} is using wallet" + end + + assert_equal 0, client_line[I18n.t('accounting_export.credit_origin')].to_f, 'Credit origin amount does not match' + assert_equal 0, client_line[I18n.t('accounting_export.credit_euro')].to_f, 'Credit euro amount does not match' + end + + def check_item_line(invoice, invoice_item, item_line) + check_journal_code(item_line) + check_entry_date(invoice, item_line) + + check_subscription_accounts(invoice, item_line) + check_reservation_accounts(invoice, item_line) + check_document(invoice, item_line) + check_entry_label(invoice, item_line) + + assert_equal invoice_item.amount / 100.00, item_line[I18n.t('accounting_export.credit_origin')].to_f, + 'Origin credit amount does not match' + assert_equal invoice_item.amount / 100.00, item_line[I18n.t('accounting_export.credit_euro')].to_f, 'Euro credit amount does not match' + + assert_equal 0, item_line[I18n.t('accounting_export.debit_origin')].to_f, 'Debit origin amount does not match' + assert_equal 0, item_line[I18n.t('accounting_export.debit_euro')].to_f, 'Debit euro amount does not match' + end + + def check_journal_code(line) + journal_code = Setting.get('accounting_journal_code') + assert_equal journal_code, line[I18n.t('accounting_export.journal_code')], 'Wrong journal code' + end + + def check_entry_date(invoice, line) + entry_date = invoice.created_at.to_date + assert_equal entry_date, DateTime.parse(line[I18n.t('accounting_export.date')]), 'Wrong date' + end + + def check_client_accounts(invoice, client_line) + if invoice.wallet_transaction && invoice.wallet_amount.positive? + wallet_client_code = Setting.get('accounting_wallet_client_code') + assert_equal wallet_client_code, client_line[I18n.t('accounting_export.account_code')], 'Account code for wallet client is wrong' + + wallet_client_label = Setting.get('accounting_wallet_client_label') + assert_equal wallet_client_label, client_line[I18n.t('accounting_export.account_label')], 'Account label for wallet client is wrong' + end + mean = invoice.paid_by_card? ? 'card' : 'other' + + client_code = Setting.get("accounting_#{mean}_client_code") + assert_equal client_code, client_line[I18n.t('accounting_export.account_code')], 'Account code for client is wrong' + + client_label = Setting.get("accounting_#{mean}_client_label") + assert_equal client_label, client_line[I18n.t('accounting_export.account_label')], 'Account label for client is wrong' + end + + def check_subscription_accounts(invoice, item_line) + return unless invoice.subscription_invoice? + + subscription_code = Setting.get('accounting_subscription_code') + assert_equal subscription_code, item_line[I18n.t('accounting_export.account_code')], 'Account code for subscription is wrong' + + subscription_label = Setting.get('accounting_subscription_label') + assert_equal subscription_label, item_line[I18n.t('accounting_export.account_label')], 'Account label for subscription is wrong' + end + + def check_reservation_accounts(invoice, item_line) + return unless invoice.main_item.object_type == 'Reservation' + + code = Setting.get("accounting_#{invoice.main_item.object.reservable_type}_code") + assert_equal code, item_line[I18n.t('accounting_export.account_code')], 'Account code for reservation is wrong' + + label = Setting.get("accounting_#{invoice.main_item.object.reservable_type}_label") + assert_equal label, item_line[I18n.t('accounting_export.account_label')], 'Account label for reservation is wrong' + end + + def check_document(invoice, line) + assert_equal(invoice.reference, line[I18n.t('accounting_export.piece')], 'Document (invoice reference) is wrong') + end + + def check_entry_label(invoice, line) + if invoice.subscription_invoice? + assert_match I18n.t('accounting_export.subscription'), + line[I18n.t('accounting_export.line_label')], + 'Entry label does not contains the reference to the subscription' + end + if invoice.main_item.object_type == 'Reservation' + assert_match I18n.t("accounting_export.#{invoice.main_item.object.reservable_type}_reservation"), + line[I18n.t('accounting_export.line_label')], + 'Entry label does not contains the reference to the reservation' + end + return unless invoice.main_item.object_type == 'WalletTransaction' + + assert_match I18n.t('accounting_export.wallet'), + line[I18n.t('accounting_export.line_label')], + 'Entry label does not contains the reference to the wallet' + end end