diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index 3fdef6286..b42255721 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -104,6 +104,7 @@ class Budget scope :for_render, -> { includes(:heading) } + before_create :set_original_heading_id before_save :calculate_confidence_score after_save :recalculate_heading_winners before_validation :set_responsible_name @@ -400,6 +401,10 @@ class Budget self.budget_id ||= heading&.group&.budget_id end + def set_original_heading_id + self.original_heading_id = heading_id + end + def change_log self.changed.each do |field| unless field == "updated_at" diff --git a/db/migrate/20190531173316_add_original_heading_id_to_investments.rb b/db/migrate/20190531173316_add_original_heading_id_to_investments.rb new file mode 100644 index 000000000..1fc659559 --- /dev/null +++ b/db/migrate/20190531173316_add_original_heading_id_to_investments.rb @@ -0,0 +1,5 @@ +class AddOriginalHeadingIdToInvestments < ActiveRecord::Migration[5.0] + def change + add_column :budget_investments, :original_heading_id, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index c6d9a6f88..505403c8d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -294,6 +294,7 @@ ActiveRecord::Schema.define(version: 20190607160900) do t.datetime "ignored_flag_at" t.integer "flags_count", default: 0 t.integer "tracker_assignments_count" + t.integer "original_heading_id" t.index ["administrator_id"], name: "index_budget_investments_on_administrator_id", using: :btree t.index ["author_id"], name: "index_budget_investments_on_author_id", using: :btree t.index ["community_id"], name: "index_budget_investments_on_community_id", using: :btree diff --git a/lib/tasks/budgets.rake b/lib/tasks/budgets.rake index d9fc8f50f..2059bca4b 100644 --- a/lib/tasks/budgets.rake +++ b/lib/tasks/budgets.rake @@ -23,4 +23,14 @@ namespace :budgets do end + desc "Update investments original_heading_id with current heading_id" + task set_original_heading_id: :environment do + puts "Starting" + Budget::Investment.find_each do |investment| + investment.update_column(:original_heading_id, investment.heading_id) + print "." + end + puts "Finished" + end + end diff --git a/spec/lib/tasks/budgets_spec.rb b/spec/lib/tasks/budgets_spec.rb new file mode 100644 index 000000000..67ec3e63c --- /dev/null +++ b/spec/lib/tasks/budgets_spec.rb @@ -0,0 +1,22 @@ +require "rails_helper" + +describe Budget do + + let(:run_rake_task) do + Rake.application.invoke_task("budgets:set_original_heading_id") + end + + it "sets attribute original_heading_id for existing investments" do + heading = create(:budget_heading) + investment = create(:budget_investment, heading: heading) + investment.update(original_heading_id: nil) + + expect(investment.original_heading_id).to equal(nil) + + run_rake_task + investment.reload + + expect(investment.original_heading_id).to equal(heading.id) + end + +end diff --git a/spec/models/budget/investment_spec.rb b/spec/models/budget/investment_spec.rb index 145689bba..76bedfc24 100644 --- a/spec/models/budget/investment_spec.rb +++ b/spec/models/budget/investment_spec.rb @@ -56,6 +56,29 @@ describe Budget::Investment do expect(investment.group_id).to eq group_2.id end + it "logs previous heading value if it is changed" do + budget = create(:budget, phase: "balloting") + + group = create(:budget_group, budget: budget) + + heading_1 = create(:budget_heading, group: group) + heading_2 = create(:budget_heading, group: group) + + investment = create(:budget_investment, heading: heading_1) + + expect(investment.previous_heading_id).to eq nil + + investment.update(heading: heading_2) + + expect(investment.previous_heading_id).to eq heading_1.id + end + + it "stores original heading id" do + investment = create(:budget_investment) + + expect(investment.original_heading_id).to eq investment.heading_id + end + describe "#unfeasibility_explanation blank" do it "is valid if valuation not finished" do investment.unfeasibility_explanation = ""