1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-01-31 20:52:21 +01:00

[bug] accounting periods totals are wrong for periods closed after 2019-08-01

This commit is contained in:
Sylvain 2020-05-11 10:10:52 +02:00
parent 4f43dc1407
commit 06502cde33
6 changed files with 88 additions and 16 deletions

View File

@ -8,6 +8,7 @@
- Ask for confirmation before booking a slot for a member without the required tag - Ask for confirmation before booking a slot for a member without the required tag
- Corrected the documentation about BOOK_SLOT_AT_SAME_TIME - Corrected the documentation about BOOK_SLOT_AT_SAME_TIME
- Auto-adjusts text colors based on the selected theme colors - Auto-adjusts text colors based on the selected theme colors
- Fix a bug: accounting periods totals are wrong for periods closed after 2019-08-01
- Fix a bug: unable to change group if the previous was deactivated - Fix a bug: unable to change group if the previous was deactivated
- Fix a bug: unable to create events or trainings that are not multiples of SLOT_DURATION - Fix a bug: unable to create events or trainings that are not multiples of SLOT_DURATION
- Fix a bug: unable to delete an unreserved event - Fix a bug: unable to delete an unreserved event
@ -19,6 +20,7 @@
- Fix a bug: background image of the profile is not shown and wrong menu hover color - Fix a bug: background image of the profile is not shown and wrong menu hover color
- Fix a bug: do not show disabled groups and plans during availability creation - Fix a bug: do not show disabled groups and plans during availability creation
- Fix a security issue: updated jquery to fix [CVE-2020-11023](https://nvd.nist.gov/vuln/detail/CVE-2020-11023) - Fix a security issue: updated jquery to fix [CVE-2020-11023](https://nvd.nist.gov/vuln/detail/CVE-2020-11023)
- [TODO DEPLOY] `rails db:migrate`
## v4.3.4 2020 April 14 ## v4.3.4 2020 April 14

View File

@ -30,7 +30,7 @@ class AccountingPeriod < ApplicationRecord
def invoices_with_vat(invoices) def invoices_with_vat(invoices)
vat_service = VatHistoryService.new vat_service = VatHistoryService.new
invoices.map do |i| invoices.map do |i|
{ invoice: i, vat_rate: vat_service.invoice_vat(i) } { invoice: i, vat_rate: vat_service.invoice_vat(i) / 100.0 }
end end
end end

View File

@ -11,7 +11,7 @@ class VatHistoryService
end end
end end
# return the VAT rate foe the given date # return the VAT rate for the given date
def vat_rate(date) def vat_rate(date)
@vat_rates = vat_history if @vat_rates.nil? @vat_rates = vat_history if @vat_rates.nil?

View File

@ -1,8 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
# migrate the invoices from being attached to a user to invoicing_profiles which are GDPR compliant # migrate the invoices from being attached to a user to invoicing_profiles which are GDPR compliant
# frozen_string_literal:true
class MigrateInvoiceToInvoicingProfile < ActiveRecord::Migration[4.2] class MigrateInvoiceToInvoicingProfile < ActiveRecord::Migration[4.2]
def up def up
# first, check the footprints # first, check the footprints

View File

@ -0,0 +1,72 @@
# frozen_string_literal: true
# regenerate the accounting periods affected by the current bug (period totals are wrong due to wrong VAT computation)
class FixAccountingPeriods < ActiveRecord::Migration[5.2]
def change
# first, check the footprints
check_footprints
# if everything is ok, proceed with migration
# remove periods (backup their parameters in memory)
periods = backup_and_remove_periods
# recreate periods from memory dump
restore_periods(periods)
end
def check_footprints
if AccountingPeriod.count.positive?
last_period = AccountingPeriod.order(start_at: :desc).first
puts "Checking invoices footprints from #{last_period.end_at}. This may take a while..."
Invoice.where('created_at > ?', last_period.end_at).order(:id).each do |i|
raise "Invalid footprint for invoice #{i.id}" unless i.check_footprint
end
else
puts 'Checking all invoices footprints. This may take a while...'
Invoice.order(:id).all.each do |i|
raise "Invalid footprint for invoice #{i.id}" unless i.check_footprint
end
end
end
# will return an array of hash containing the removed periods data
def backup_and_remove_periods
return [] unless AccountingPeriod.where("created_at > '2019-08-01'").count.positive?
puts 'Removing erroneous accounting archives...'
# 1. remove protection for AccountingPeriods
execute("DROP RULE IF EXISTS accounting_periods_del_protect ON #{AccountingPeriod.arel_table.name};")
# 2. backup AccountingPeriods in memory
periods = []
AccountingPeriod.where("created_at > '2019-08-01'").each do |p|
periods.push(
start_at: p.start_at,
end_at: p.end_at,
closed_at: p.closed_at,
closed_by: p.closed_by
)
end
# 3. Delete periods from database
AccountingPeriod.where("created_at > '2019-08-01'").each do |ap|
execute("DELETE FROM accounting_periods WHERE ID=#{ap.id};")
end
periods
end
def restore_periods(periods)
return unless periods.size.positive?
# 1. recreate AccountingPeriods
puts 'Recreating accounting archives. This may take a while...'
periods.each do |p|
AccountingPeriod.create!(
start_at: p[:start_at],
end_at: p[:end_at],
closed_at: p[:closed_at],
closed_by: p[:closed_by]
)
end
# 2. reset protection for AccountingPeriods
execute("CREATE RULE accounting_periods_del_protect AS ON DELETE TO #{AccountingPeriod.arel_table.name} DO INSTEAD NOTHING;")
end
end

View File

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2020_04_15_141809) do ActiveRecord::Schema.define(version: 2020_05_11_075933) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "pg_trgm" enable_extension "pg_trgm"
@ -18,8 +18,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
enable_extension "unaccent" enable_extension "unaccent"
create_table "abuses", id: :serial, force: :cascade do |t| create_table "abuses", id: :serial, force: :cascade do |t|
t.string "signaled_type"
t.integer "signaled_id" t.integer "signaled_id"
t.string "signaled_type"
t.string "first_name" t.string "first_name"
t.string "last_name" t.string "last_name"
t.string "email" t.string "email"
@ -48,8 +48,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
t.string "locality" t.string "locality"
t.string "country" t.string "country"
t.string "postal_code" t.string "postal_code"
t.string "placeable_type"
t.integer "placeable_id" t.integer "placeable_id"
t.string "placeable_type"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
end end
@ -63,8 +63,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
end end
create_table "assets", id: :serial, force: :cascade do |t| create_table "assets", id: :serial, force: :cascade do |t|
t.string "viewable_type"
t.integer "viewable_id" t.integer "viewable_id"
t.string "viewable_type"
t.string "attachment" t.string "attachment"
t.string "type" t.string "type"
t.datetime "created_at" t.datetime "created_at"
@ -132,8 +132,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
end end
create_table "credits", id: :serial, force: :cascade do |t| create_table "credits", id: :serial, force: :cascade do |t|
t.string "creditable_type"
t.integer "creditable_id" t.integer "creditable_id"
t.string "creditable_type"
t.integer "plan_id" t.integer "plan_id"
t.integer "hours" t.integer "hours"
t.datetime "created_at" t.datetime "created_at"
@ -285,8 +285,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
end end
create_table "invoices", id: :serial, force: :cascade do |t| create_table "invoices", id: :serial, force: :cascade do |t|
t.string "invoiced_type"
t.integer "invoiced_id" t.integer "invoiced_id"
t.string "invoiced_type"
t.string "stp_invoice_id" t.string "stp_invoice_id"
t.integer "total" t.integer "total"
t.datetime "created_at" t.datetime "created_at"
@ -349,15 +349,15 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
create_table "notifications", id: :serial, force: :cascade do |t| create_table "notifications", id: :serial, force: :cascade do |t|
t.integer "receiver_id" t.integer "receiver_id"
t.string "attached_object_type"
t.integer "attached_object_id" t.integer "attached_object_id"
t.string "attached_object_type"
t.integer "notification_type_id" t.integer "notification_type_id"
t.boolean "is_read", default: false t.boolean "is_read", default: false
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.string "receiver_type" t.string "receiver_type"
t.boolean "is_send", default: false t.boolean "is_send", default: false
t.jsonb "meta_data", default: "{}" t.jsonb "meta_data", default: {}
t.index ["notification_type_id"], name: "index_notifications_on_notification_type_id" t.index ["notification_type_id"], name: "index_notifications_on_notification_type_id"
t.index ["receiver_id"], name: "index_notifications_on_receiver_id" t.index ["receiver_id"], name: "index_notifications_on_receiver_id"
end end
@ -457,8 +457,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
create_table "prices", id: :serial, force: :cascade do |t| create_table "prices", id: :serial, force: :cascade do |t|
t.integer "group_id" t.integer "group_id"
t.integer "plan_id" t.integer "plan_id"
t.string "priceable_type"
t.integer "priceable_id" t.integer "priceable_id"
t.string "priceable_type"
t.integer "amount" t.integer "amount"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
@ -565,8 +565,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
t.text "message" t.text "message"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.string "reservable_type"
t.integer "reservable_id" t.integer "reservable_id"
t.string "reservable_type"
t.integer "nb_reserve_places" t.integer "nb_reserve_places"
t.integer "statistic_profile_id" t.integer "statistic_profile_id"
t.index ["reservable_type", "reservable_id"], name: "index_reservations_on_reservable_type_and_reservable_id" t.index ["reservable_type", "reservable_id"], name: "index_reservations_on_reservable_type_and_reservable_id"
@ -575,8 +575,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
create_table "roles", id: :serial, force: :cascade do |t| create_table "roles", id: :serial, force: :cascade do |t|
t.string "name" t.string "name"
t.string "resource_type"
t.integer "resource_id" t.integer "resource_id"
t.string "resource_type"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
t.index ["name", "resource_type", "resource_id"], name: "index_roles_on_name_and_resource_type_and_resource_id" t.index ["name", "resource_type", "resource_id"], name: "index_roles_on_name_and_resource_type_and_resource_id"
@ -867,8 +867,8 @@ ActiveRecord::Schema.define(version: 2020_04_15_141809) do
create_table "wallet_transactions", id: :serial, force: :cascade do |t| create_table "wallet_transactions", id: :serial, force: :cascade do |t|
t.integer "wallet_id" t.integer "wallet_id"
t.string "transactable_type"
t.integer "transactable_id" t.integer "transactable_id"
t.string "transactable_type"
t.string "transaction_type" t.string "transaction_type"
t.integer "amount" t.integer "amount"
t.datetime "created_at", null: false t.datetime "created_at", null: false