mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2025-02-22 16:54:15 +01:00
(bug) invalid accounting export for store orders
This commit is contained in:
parent
6d448e0af2
commit
fc2b52c2ca
@ -204,7 +204,7 @@ class Setting < ApplicationRecord
|
|||||||
# @return {String|Boolean}
|
# @return {String|Boolean}
|
||||||
##
|
##
|
||||||
def self.get(name)
|
def self.get(name)
|
||||||
res = find_by(name: name)&.value
|
res = find_by('LOWER(name) = ? ', name.downcase)&.value
|
||||||
|
|
||||||
# handle boolean values
|
# handle boolean values
|
||||||
return true if res == 'true'
|
return true if res == 'true'
|
||||||
|
@ -61,28 +61,21 @@ class AccountingExportService
|
|||||||
|
|
||||||
# Generate the "subscription" and "reservation" rows associated with the provided invoice
|
# Generate the "subscription" and "reservation" rows associated with the provided invoice
|
||||||
def items_rows(invoice)
|
def items_rows(invoice)
|
||||||
rows = invoice.subscription_invoice? ? "#{subscription_row(invoice)}\n" : ''
|
rows = ''
|
||||||
case invoice.main_item.object_type
|
{
|
||||||
when 'Reservation'
|
subscription: 'Subscription', reservation: 'Reservation', wallet: 'WalletTransaction',
|
||||||
items = invoice.invoice_items.reject { |ii| ii.object_type == 'Subscription' }
|
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|
|
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
|
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
|
end
|
||||||
rows
|
rows
|
||||||
end
|
end
|
||||||
@ -93,8 +86,8 @@ class AccountingExportService
|
|||||||
invoice.payment_means.each do |details|
|
invoice.payment_means.each do |details|
|
||||||
rows << row(
|
rows << row(
|
||||||
invoice,
|
invoice,
|
||||||
account(invoice, :projets, means: details[:means]),
|
account(invoice, :client, means: details[:means]),
|
||||||
account(invoice, :projets, means: details[:means], type: :label),
|
account(invoice, :client, means: details[:means], type: :label),
|
||||||
details[:amount] / 100.00,
|
details[:amount] / 100.00,
|
||||||
line_label: label(invoice),
|
line_label: label(invoice),
|
||||||
debit_method: :debit_client,
|
debit_method: :debit_client,
|
||||||
@ -105,61 +98,6 @@ class AccountingExportService
|
|||||||
rows
|
rows
|
||||||
end
|
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
|
# Generate the "VAT" row, which contains the credit to the VAT account, with VAT amount only
|
||||||
def vat_row(invoice)
|
def vat_row(invoice)
|
||||||
total = invoice.invoice_items.map(&:net_amount).sum
|
total = invoice.invoice_items.map(&:net_amount).sum
|
||||||
@ -175,16 +113,6 @@ class AccountingExportService
|
|||||||
)
|
)
|
||||||
end
|
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
|
# 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)
|
def row(invoice, account_code, account_label, amount, line_label: '', debit_method: :debit, credit_method: :credit)
|
||||||
row = ''
|
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)
|
# 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)
|
def account(invoice, account, type: :code, means: :other)
|
||||||
case account
|
case account
|
||||||
when :projets
|
when :client
|
||||||
Setting.get("accounting_#{means}_client_#{type}")
|
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
|
when :reservation
|
||||||
if invoice.main_item.object_type == 'Reservation'
|
Setting.get("accounting_#{invoice.main_item.object.reservable_type}_#{type}") if invoice.main_item.object_type == 'Reservation'
|
||||||
Setting.get("accounting_#{invoice.main_item.object.reservable_type}_#{type}")
|
|
||||||
else
|
else
|
||||||
Rails.logger.debug { "WARN: Invoice #{invoice.id} has no reservation" }
|
Setting.get("accounting_#{account}_#{type}")
|
||||||
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}")
|
|
||||||
else
|
|
||||||
Rails.logger.debug { "Unsupported account #{account}" }
|
|
||||||
end || ''
|
end || ''
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -297,6 +193,7 @@ class AccountingExportService
|
|||||||
items.push I18n.t("accounting_export.#{invoice.main_item.object.reservable_type}_reservation")
|
items.push I18n.t("accounting_export.#{invoice.main_item.object.reservable_type}_reservation")
|
||||||
end
|
end
|
||||||
items.push I18n.t('accounting_export.wallet') if invoice.main_item.object_type == 'WalletTransaction'
|
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(' + ')
|
summary = items.join(' + ')
|
||||||
res = "#{reference}, #{summary}"
|
res = "#{reference}, #{summary}"
|
||||||
|
@ -164,6 +164,7 @@ en:
|
|||||||
Event_reservation: "event reserv."
|
Event_reservation: "event reserv."
|
||||||
Space_reservation: "space reserv."
|
Space_reservation: "space reserv."
|
||||||
wallet: "wallet"
|
wallet: "wallet"
|
||||||
|
shop_order: "shop order"
|
||||||
vat_export:
|
vat_export:
|
||||||
start_date: "Start date"
|
start_date: "Start date"
|
||||||
end_date: "End date"
|
end_date: "End date"
|
||||||
|
12
test/fixtures/coupons.yml
vendored
12
test/fixtures/coupons.yml
vendored
@ -35,3 +35,15 @@ cash2:
|
|||||||
max_usages:
|
max_usages:
|
||||||
active: true
|
active: true
|
||||||
validity_per_user: once
|
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:
|
||||||
|
48
test/fixtures/history_values.yml
vendored
48
test/fixtures/history_values.yml
vendored
@ -494,7 +494,7 @@ history_value_51:
|
|||||||
history_value_52:
|
history_value_52:
|
||||||
id: 52
|
id: 52
|
||||||
setting_id: 52
|
setting_id: 52
|
||||||
value: '7062'
|
value: Machine reservation
|
||||||
created_at: '2019-09-20 11:02:32.125400'
|
created_at: '2019-09-20 11:02:32.125400'
|
||||||
updated_at: '2021-05-31 15:00:36.872288'
|
updated_at: '2021-05-31 15:00:36.872288'
|
||||||
footprint: 0ee671e962f92a3af95538fdd65a64ff410b208ab790c4e6f7b0a9f5a13dc1a2
|
footprint: 0ee671e962f92a3af95538fdd65a64ff410b208ab790c4e6f7b0a9f5a13dc1a2
|
||||||
@ -503,7 +503,7 @@ history_value_52:
|
|||||||
history_value_53:
|
history_value_53:
|
||||||
id: 53
|
id: 53
|
||||||
setting_id: 53
|
setting_id: 53
|
||||||
value: Machine reservation
|
value: '7062'
|
||||||
created_at: '2019-09-20 11:02:32.125400'
|
created_at: '2019-09-20 11:02:32.125400'
|
||||||
updated_at: '2021-05-31 15:00:36.904414'
|
updated_at: '2021-05-31 15:00:36.904414'
|
||||||
footprint: ad09bac8c58754444a9970108d613aefaeceed540609688f5668c68ca5c03531
|
footprint: ad09bac8c58754444a9970108d613aefaeceed540609688f5668c68ca5c03531
|
||||||
@ -512,7 +512,7 @@ history_value_53:
|
|||||||
history_value_54:
|
history_value_54:
|
||||||
id: 54
|
id: 54
|
||||||
setting_id: 54
|
setting_id: 54
|
||||||
value: '7063'
|
value: Training reservation
|
||||||
created_at: '2019-09-20 11:02:32.125400'
|
created_at: '2019-09-20 11:02:32.125400'
|
||||||
updated_at: '2021-05-31 15:00:36.930713'
|
updated_at: '2021-05-31 15:00:36.930713'
|
||||||
footprint: 89f17add783f9977c4b13bc22f5776d0427c3d9af8c83206af57de7c72c153b0
|
footprint: 89f17add783f9977c4b13bc22f5776d0427c3d9af8c83206af57de7c72c153b0
|
||||||
@ -521,7 +521,7 @@ history_value_54:
|
|||||||
history_value_55:
|
history_value_55:
|
||||||
id: 55
|
id: 55
|
||||||
setting_id: 55
|
setting_id: 55
|
||||||
value: Training reservation
|
value: '7063'
|
||||||
created_at: '2019-09-20 11:02:32.125400'
|
created_at: '2019-09-20 11:02:32.125400'
|
||||||
updated_at: '2021-05-31 15:00:36.955492'
|
updated_at: '2021-05-31 15:00:36.955492'
|
||||||
footprint: f2e20f936e3fc917bc82e97adb321f957c2cd6ac992f3223ffe2be529ea1649f
|
footprint: f2e20f936e3fc917bc82e97adb321f957c2cd6ac992f3223ffe2be529ea1649f
|
||||||
@ -530,7 +530,7 @@ history_value_55:
|
|||||||
history_value_56:
|
history_value_56:
|
||||||
id: 56
|
id: 56
|
||||||
setting_id: 56
|
setting_id: 56
|
||||||
value: '7064'
|
value: Event reservation
|
||||||
created_at: '2019-09-20 11:02:32.125400'
|
created_at: '2019-09-20 11:02:32.125400'
|
||||||
updated_at: '2021-05-31 15:00:36.977369'
|
updated_at: '2021-05-31 15:00:36.977369'
|
||||||
footprint: 5ce909aa92740dbd65647ff3a5d5fdc75ad6c2a02b5fa9bbeea1aa27f907416a
|
footprint: 5ce909aa92740dbd65647ff3a5d5fdc75ad6c2a02b5fa9bbeea1aa27f907416a
|
||||||
@ -539,7 +539,7 @@ history_value_56:
|
|||||||
history_value_57:
|
history_value_57:
|
||||||
id: 57
|
id: 57
|
||||||
setting_id: 57
|
setting_id: 57
|
||||||
value: Event reservation
|
value: '7064'
|
||||||
created_at: '2019-09-20 11:02:32.125400'
|
created_at: '2019-09-20 11:02:32.125400'
|
||||||
updated_at: '2021-05-31 15:00:36.993279'
|
updated_at: '2021-05-31 15:00:36.993279'
|
||||||
footprint: ed7ecf389b9560728ce43257bef442a2404f463ebbc0fbaeaad05f113cca21df
|
footprint: ed7ecf389b9560728ce43257bef442a2404f463ebbc0fbaeaad05f113cca21df
|
||||||
@ -824,3 +824,39 @@ history_value_86:
|
|||||||
updated_at: '2021-06-15 12:05:21.513651'
|
updated_at: '2021-06-15 12:05:21.513651'
|
||||||
footprint: 350ca0033f3e65b6e8186dbb0545b55ecb3768e1a08501549b81d95e34809440
|
footprint: 350ca0033f3e65b6e8186dbb0545b55ecb3768e1a08501549b81d95e34809440
|
||||||
invoicing_profile_id: 1
|
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
|
||||||
|
29
test/fixtures/payment_gateway_objects.yml
vendored
29
test/fixtures/payment_gateway_objects.yml
vendored
@ -244,3 +244,32 @@ pgo35:
|
|||||||
item_id: 10
|
item_id: 10
|
||||||
gateway_object_type: 'Stripe::Customer'
|
gateway_object_type: 'Stripe::Customer'
|
||||||
gateway_object_id: 'cus_IhIynmoJbzLpwX'
|
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:
|
||||||
|
|
||||||
|
24
test/fixtures/settings.yml
vendored
24
test/fixtures/settings.yml
vendored
@ -502,3 +502,27 @@ setting_85:
|
|||||||
name: public_agenda_module
|
name: public_agenda_module
|
||||||
created_at: 2020-04-15 14:38:40.000421500 Z
|
created_at: 2020-04-15 14:38:40.000421500 Z
|
||||||
updated_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
|
||||||
|
@ -36,7 +36,7 @@ class Exports::AccountingExportTest < ActionDispatch::IntegrationTest
|
|||||||
|
|
||||||
# Check the export was created correctly
|
# Check the export was created correctly
|
||||||
res = json_response(response.body)
|
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'
|
assert_not_nil e, 'Export was not created in database'
|
||||||
|
|
||||||
# Run the worker
|
# Run the worker
|
||||||
@ -52,94 +52,135 @@ class Exports::AccountingExportTest < ActionDispatch::IntegrationTest
|
|||||||
data = CSV.read(e.file, headers: true, col_sep: e.key)
|
data = CSV.read(e.file, headers: true, col_sep: e.key)
|
||||||
|
|
||||||
# test values
|
# 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
|
first_invoice = Invoice.first
|
||||||
entry_date = first_invoice.created_at.to_date
|
# first line = client line
|
||||||
assert_equal entry_date, DateTime.parse(data[0][I18n.t('accounting_export.date')]), 'Wrong date'
|
check_client_line(first_invoice, data[0])
|
||||||
|
|
||||||
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'
|
|
||||||
|
|
||||||
# second line = sold item line
|
# second line = sold item line
|
||||||
assert_equal journal_code, data[1][I18n.t('accounting_export.journal_code')], 'Wrong journal code'
|
check_item_line(first_invoice, first_invoice.invoice_items.first, data[1])
|
||||||
assert_equal entry_date, DateTime.parse(data[1][I18n.t('accounting_export.date')]), 'Wrong date'
|
|
||||||
|
|
||||||
if first_invoice.subscription_invoice?
|
# ensure invoice 4 is not exported (0€ invoice)
|
||||||
subscription_code = Setting.get('accounting_subscription_code')
|
zero_invoice = Invoice.find(4)
|
||||||
assert_equal subscription_code, data[1][I18n.t('accounting_export.account_code')], 'Account code for subscription is wrong'
|
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')
|
# test with a reservation invoice
|
||||||
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
|
|
||||||
machine_invoice = Invoice.find(5)
|
machine_invoice = Invoice.find(5)
|
||||||
client_row = data[data.length - 4]
|
check_client_line(machine_invoice, data[6])
|
||||||
item_row = data[data.length - 3]
|
check_item_line(machine_invoice, machine_invoice.invoice_items.first, data[7])
|
||||||
|
|
||||||
data.each do |a|
|
# test with a shop order invoice (local payment)
|
||||||
p a
|
shop_invoice = Invoice.find(5811)
|
||||||
end
|
check_client_line(shop_invoice, data[10])
|
||||||
if machine_invoice.main_item.object_type == 'Reservation' && machine_invoice.main_item.object.reservable_type == 'Machine'
|
check_item_line(shop_invoice, shop_invoice.invoice_items.first, data[11])
|
||||||
assert_match I18n.t('accounting_export.Machine_reservation'),
|
check_item_line(shop_invoice, shop_invoice.invoice_items.last, data[12])
|
||||||
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
|
|
||||||
|
|
||||||
# Clean CSV file
|
# Clean CSV file
|
||||||
require 'fileutils'
|
require 'fileutils'
|
||||||
FileUtils.rm(e.file)
|
FileUtils.rm(e.file)
|
||||||
end
|
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
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user