diff --git a/app/models/budget/phase.rb b/app/models/budget/phase.rb index 462d64ef6..903c698aa 100644 --- a/app/models/budget/phase.rb +++ b/app/models/budget/phase.rb @@ -12,7 +12,7 @@ class Budget validates :budget, presence: true validates :kind, presence: true, uniqueness: { scope: :budget }, inclusion: { in: PHASE_KINDS } validates :description, length: { maximum: DESCRIPTION_MAX_LENGTH } - validate :dates_range_valid? + validate :invalid_dates_range? validate :prev_phase_dates_valid? validate :next_phase_dates_valid? @@ -48,7 +48,7 @@ class Budget end end - def dates_range_valid? + def invalid_dates_range? if starts_at.present? && ends_at.present? && starts_at >= ends_at errors.add(:starts_at, I18n.t('budgets.phases.errors.dates_range_invalid')) end @@ -59,7 +59,7 @@ class Budget def prev_phase_dates_valid? if enabled? && starts_at.present? && prev_enabled_phase.present? prev_enabled_phase.assign_attributes(ends_at: starts_at) - if prev_enabled_phase.dates_range_valid? + if prev_enabled_phase.invalid_dates_range? phase_name = I18n.t("budgets.phase.#{prev_enabled_phase.kind}") error = I18n.t('budgets.phases.errors.prev_phase_dates_invalid', phase_name: phase_name) errors.add(:starts_at, error) @@ -70,7 +70,7 @@ class Budget def next_phase_dates_valid? if enabled? && ends_at.present? && next_enabled_phase.present? next_enabled_phase.assign_attributes(starts_at: ends_at) - if next_enabled_phase.dates_range_valid? + if next_enabled_phase.invalid_dates_range? phase_name = I18n.t("budgets.phase.#{next_enabled_phase.kind}") error = I18n.t('budgets.phases.errors.next_phase_dates_invalid', phase_name: phase_name) errors.add(:ends_at, error) diff --git a/lib/tasks/budgets.rake b/lib/tasks/budgets.rake index f9810ac1c..738649538 100644 --- a/lib/tasks/budgets.rake +++ b/lib/tasks/budgets.rake @@ -13,4 +13,22 @@ namespace :budgets do end -end \ No newline at end of file + namespace :phases do + desc "Generates Phases for existing Budgets without them & migrates description_* attributes" + task generate_missing: :environment do + Budget.where.not(id: Budget::Phase.all.pluck(:budget_id).uniq.compact).each do |budget| + Budget::Phase::PHASE_KINDS.each do |phase| + Budget::Phase.create( + budget: budget, + kind: phase, + description: budget.send("description_#{phase}"), + prev_phase: phases&.last, + starts_at: phases&.last&.ends_at || Date.current, + ends_at: (phases&.last&.ends_at || Date.current) + 1.month + ) + end + end + end + end + +end