Skip to content

Commit

Permalink
Article model before_save versioning logic
Browse files Browse the repository at this point in the history
  • Loading branch information
lentschi committed Nov 18, 2022
1 parent edc199b commit 117bca3
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 12 deletions.
2 changes: 1 addition & 1 deletion app/controllers/articles_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def edit

# Updates one Article and highlights the line if succeded
def update
if @article.update_attributes(latest_article_version_attributes: params[:article_version])
if @article.update_attributes(created_at: Time.now - 1.day, latest_article_version_attributes: params[:article_version])
render :layout => false
else
Rails.logger.info @article.errors.to_yaml.to_s
Expand Down
35 changes: 24 additions & 11 deletions app/models/article.rb
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ class Article < ApplicationRecord

# Callbacks
before_save :update_or_create_article_version

before_destroy :check_article_in_use
after_save :reload_article_on_version_change

def self.ransackable_attributes(auth_object = nil)
# TODO-article-version
Expand Down Expand Up @@ -230,22 +230,35 @@ def check_article_in_use

# Create an ArticleVersion, when the price-attr are changed.
def update_or_create_article_version
if version_dup_required?
duplicate = latest_article_version.dup
self.article_versions << duplicate

duplicate.article_unit_ratios.each do |ratio|
ratio = ratio.dup
ratio.article_version_id = nil
duplicate.article_unit_ratios << ratio
end
@version_changed_before_save = false
return unless self.version_dup_required?

old_version = self.latest_article_version
new_version = old_version.dup
self.article_versions << new_version

self.article_unit_ratios.each do |ratio|
ratio = ratio.dup
ratio.article_version_id = nil
new_version.article_unit_ratios << ratio
end
OrderArticle.belonging_to_open_order.where(article_version_id: self.id).update_all(article_version_id: new_version.id)

# reload old version to avoid updating it too (would automatically happen after before_save):
old_version.reload

@version_changed_before_save = true
end

def reload_article_on_version_change
self.reload if @version_changed_before_save
@version_changed_before_save = false
end

def version_dup_required?
return false if latest_article_version.nil?
return false unless latest_article_version.self_or_ratios_changed?

OrderArticle.exists?(article_version_id: latest_article_version.id)
OrderArticle.belonging_to_finished_order.exists?(article_version_id: latest_article_version.id)
end
end
2 changes: 2 additions & 0 deletions app/models/order_article.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ class OrderArticle < ApplicationRecord
_ordered_sql = "order_articles.units_to_order > 0 OR order_articles.units_billed > 0 OR order_articles.units_received > 0"
scope :ordered, -> { where(_ordered_sql) }
scope :ordered_or_member, -> { includes(:group_order_articles).where("#{_ordered_sql} OR order_articles.quantity > 0 OR group_order_articles.result > 0") }
scope :belonging_to_open_order, -> { joins(:order).merge(Order.open) }
scope :belonging_to_finished_order, -> { joins(:order).merge(Order.finished) }

before_create :init_from_balancing
after_destroy :update_ordergroup_prices
Expand Down

0 comments on commit 117bca3

Please sign in to comment.