From 1c9fad0a7b8de75e56f93d429bf52cb8ee991497 Mon Sep 17 00:00:00 2001 From: Robert Waltemath Date: Tue, 3 Sep 2013 12:09:33 +0200 Subject: [PATCH 1/4] Added validation for removed but ordered articles. --- app/models/order.rb | 25 ++++++++++++++----------- app/views/orders/_form.html.haml | 11 ++++++++--- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 7910dfc3..35224856 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -17,6 +17,7 @@ class Order < ActiveRecord::Base # Validations validates_presence_of :starts validate :starts_before_ends, :include_articles + validate :keep_ordered_articles # Callbacks after_save :save_order_articles, :update_price_of_group_orders @@ -55,7 +56,7 @@ class Order < ActiveRecord::Base end def article_ids - @article_ids ||= order_articles.map(&:article_id) + @article_ids ||= order_articles.map { |a| a.article_id.to_s } end def open? @@ -206,6 +207,12 @@ class Order < ActiveRecord::Base update_attributes! state: 'closed', updated_by: user end + def articles_to_be_removed_and_ordered + chosen_order_articles = order_articles.find_all_by_article_id(article_ids) + to_be_removed = order_articles - chosen_order_articles + to_be_removed.select { |a| a.quantity > 0 or a.tolerance > 0 } + end + protected def starts_before_ends @@ -216,17 +223,13 @@ class Order < ActiveRecord::Base errors.add(:articles, I18n.t('articles.model.error_nosel')) if article_ids.empty? end + def keep_ordered_articles + unless articles_to_be_removed_and_ordered.empty? + errors.add(:articles, "Die markierten Artikel wurden in der laufenden Bestellung bereits bestellt. Wenn Du sie hier abwählst, werden alle bestehenden Bestellungen dieses Artikels gelöscht. Bei Lagerbestellungen kann dies je nach Verwendung bedeuten, dass bereits gekaufte Artikel nicht abgerechnet werden!") + end + end + def save_order_articles - #self.articles = Article.find(article_ids) # This doesn't deletes the group_order_articles, belonging to order_articles, - # # see http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many - # - ## Ensure to delete also the group_order_articles, belonging to order_articles - ## This case is relevant, when removing articles from a running order - #goa_ids = GroupOrderArticle.where(group_order_id: group_order_ids).includes(:order_article). - # select { |goa| goa.order_article.nil? }.map(&:id) - #GroupOrderArticle.delete_all(id: goa_ids) unless goa_ids.empty? - - # fetch selected articles articles_list = Article.find(article_ids) # create new order_articles diff --git a/app/views/orders/_form.html.haml b/app/views/orders/_form.html.haml index 78cd3ca8..cb138d4b 100644 --- a/app/views/orders/_form.html.haml +++ b/app/views/orders/_form.html.haml @@ -27,9 +27,14 @@ = category_name %i.icon-tag - for article in articles - / check if the article is selected - - included = @order.article_ids.include?(article.id) - - included_class = included ? ' selected' : '' + / check if the article is selected or has an error + - included = @order.article_ids.include?(article.id.to_s) + - if included + - included_class = 'selected' + - elsif @order.errors.has_key?(:articles) and @order.articles_to_be_removed_and_ordered.map{|a| a.article_id}.include?(article.id) + - included_class = 'error' + - else + - included_class = '' %tr{:class => included_class, :id => article.id.to_s } %td= check_box_tag "order[article_ids][]", article.id, included, :id => "checkbox_#{article.id}" %td.click-me{'data-check-this' => "#checkbox_#{article.id}"}= article.name From bb25bdc6eb0a376387a862f2011daffc2047b574 Mon Sep 17 00:00:00 2001 From: Robert Waltemath Date: Tue, 3 Sep 2013 17:37:49 +0200 Subject: [PATCH 2/4] Improved error data passing. --- app/models/order.rb | 17 ++++++++++------- app/views/orders/_form.html.haml | 11 +++++------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 35224856..b7fdf1d5 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -59,6 +59,11 @@ class Order < ActiveRecord::Base @article_ids ||= order_articles.map { |a| a.article_id.to_s } end + # Returns an array of article ids that lead to a validation error. + def erroneous_article_ids + @erroneous_article_ids ||= [] + end + def open? state == "open" end @@ -207,12 +212,6 @@ class Order < ActiveRecord::Base update_attributes! state: 'closed', updated_by: user end - def articles_to_be_removed_and_ordered - chosen_order_articles = order_articles.find_all_by_article_id(article_ids) - to_be_removed = order_articles - chosen_order_articles - to_be_removed.select { |a| a.quantity > 0 or a.tolerance > 0 } - end - protected def starts_before_ends @@ -224,8 +223,12 @@ class Order < ActiveRecord::Base end def keep_ordered_articles - unless articles_to_be_removed_and_ordered.empty? + chosen_order_articles = order_articles.find_all_by_article_id(article_ids) + to_be_removed = order_articles - chosen_order_articles + to_be_removed_but_ordered = to_be_removed.select { |a| a.quantity > 0 or a.tolerance > 0 } + unless to_be_removed_but_ordered.empty? errors.add(:articles, "Die markierten Artikel wurden in der laufenden Bestellung bereits bestellt. Wenn Du sie hier abwählst, werden alle bestehenden Bestellungen dieses Artikels gelöscht. Bei Lagerbestellungen kann dies je nach Verwendung bedeuten, dass bereits gekaufte Artikel nicht abgerechnet werden!") + @erroneous_article_ids = to_be_removed_but_ordered.map { |a| a.article_id } end end diff --git a/app/views/orders/_form.html.haml b/app/views/orders/_form.html.haml index cb138d4b..e5bdf07e 100644 --- a/app/views/orders/_form.html.haml +++ b/app/views/orders/_form.html.haml @@ -29,13 +29,12 @@ - for article in articles / check if the article is selected or has an error - included = @order.article_ids.include?(article.id.to_s) + - row_class = '' - if included - - included_class = 'selected' - - elsif @order.errors.has_key?(:articles) and @order.articles_to_be_removed_and_ordered.map{|a| a.article_id}.include?(article.id) - - included_class = 'error' - - else - - included_class = '' - %tr{:class => included_class, :id => article.id.to_s } + - row_class = 'selected' + - elsif @order.erroneous_article_ids.include?(article.id) + - row_class = 'error' + %tr{class: row_class, id: article.id} %td= check_box_tag "order[article_ids][]", article.id, included, :id => "checkbox_#{article.id}" %td.click-me{'data-check-this' => "#checkbox_#{article.id}"}= article.name %td=h truncate article.note, :length => 25 From 805071f3fb1494420f552a5d818a7ae4d43b23a2 Mon Sep 17 00:00:00 2001 From: Robert Waltemath Date: Wed, 4 Sep 2013 10:52:14 +0200 Subject: [PATCH 3/4] Added checkbox to ignore warnings. Added translations. --- app/models/order.rb | 10 ++++++---- app/views/orders/_form.html.haml | 4 ++++ config/locales/de.yml | 2 ++ config/locales/en.yml | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index b7fdf1d5..9d67214a 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,6 +2,8 @@ # class Order < ActiveRecord::Base + attr_accessor :ignore_warnings + # Associations has_many :order_articles, :dependent => :destroy has_many :articles, :through => :order_articles @@ -215,19 +217,19 @@ class Order < ActiveRecord::Base protected def starts_before_ends - errors.add(:ends, I18n.t('articles.model.error_starts_before_ends')) if (ends && starts && ends <= starts) + errors.add(:ends, I18n.t('orders.model.error_starts_before_ends')) if (ends && starts && ends <= starts) end def include_articles - errors.add(:articles, I18n.t('articles.model.error_nosel')) if article_ids.empty? + errors.add(:articles, I18n.t('orders.model.error_nosel')) if article_ids.empty? end def keep_ordered_articles chosen_order_articles = order_articles.find_all_by_article_id(article_ids) to_be_removed = order_articles - chosen_order_articles to_be_removed_but_ordered = to_be_removed.select { |a| a.quantity > 0 or a.tolerance > 0 } - unless to_be_removed_but_ordered.empty? - errors.add(:articles, "Die markierten Artikel wurden in der laufenden Bestellung bereits bestellt. Wenn Du sie hier abwählst, werden alle bestehenden Bestellungen dieses Artikels gelöscht. Bei Lagerbestellungen kann dies je nach Verwendung bedeuten, dass bereits gekaufte Artikel nicht abgerechnet werden!") + unless to_be_removed_but_ordered.empty? or ignore_warnings + errors.add(:articles, I18n.t('orders.model.warning_ordered')) @erroneous_article_ids = to_be_removed_but_ordered.map { |a| a.article_id } end end diff --git a/app/views/orders/_form.html.haml b/app/views/orders/_form.html.haml index e5bdf07e..86d24106 100644 --- a/app/views/orders/_form.html.haml +++ b/app/views/orders/_form.html.haml @@ -56,3 +56,7 @@ .form-actions = f.submit class: 'btn' = link_to t('ui.or_cancel'), orders_path + - unless @order.erroneous_article_ids.empty? +   + = check_box_tag 'order[ignore_warnings]' + = t '.ignore_warnings' diff --git a/config/locales/de.yml b/config/locales/de.yml index 11abe693..90d47e37 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1297,6 +1297,7 @@ de: finish: notice: Die Bestellung wurde beendet. form: + ignore_warnings: Warnungen ignorieren name: Name note: Notiz origin: Herkunft @@ -1324,6 +1325,7 @@ de: error_starts_before_ends: muss nach dem Bestellstart liegen (oder leer bleiben) notice_close: ! 'Bestellung: %{name}, bis %{ends}' stock: Lager + warning_ordered: 'Warnung: Die rot markierten Artikel wurden in der laufenden Bestellung bereits bestellt. Wenn Du sie hier abwählst, werden alle bestehenden Bestellungen dieses Artikels gelöscht. Bei Lagerbestellungen kann dies je nach Verwendung bedeuten, dass bereits gekaufte Artikel nicht abgerechnet werden!' new: title: Neue Bestellung anlegen orders: diff --git a/config/locales/en.yml b/config/locales/en.yml index c9eecb77..e6014639 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1299,6 +1299,7 @@ en: finish: notice: The order has been closed. form: + ignore_warnings: Ignore warnings name: Name note: Note origin: Origin @@ -1326,6 +1327,7 @@ en: error_starts_before_ends: must be after the start date (or remain empty) notice_close: ! 'Order: %{name}, until %{ends}' stock: Stock + warning_ordered: 'Warning: Articles marked red have already been ordered within this open order. If you uncheck them here, all existing orders of these articles will be deleted. In case of stock orders this might mean that already bought articles will not be accounted for!' new: title: Create new order orders: From 142de28adef1bdd714b67202c0c34ca62f1f9e0b Mon Sep 17 00:00:00 2001 From: Robert Waltemath Date: Wed, 18 Sep 2013 10:50:56 +0200 Subject: [PATCH 4/4] Split up messages for stock/ supplier orders. --- app/models/order.rb | 2 +- config/locales/de.yml | 3 ++- config/locales/en.yml | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 9d67214a..f4545d02 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -229,7 +229,7 @@ class Order < ActiveRecord::Base to_be_removed = order_articles - chosen_order_articles to_be_removed_but_ordered = to_be_removed.select { |a| a.quantity > 0 or a.tolerance > 0 } unless to_be_removed_but_ordered.empty? or ignore_warnings - errors.add(:articles, I18n.t('orders.model.warning_ordered')) + errors.add(:articles, I18n.t(stockit? ? 'orders.model.warning_ordered_stock' : 'orders.model.warning_ordered')) @erroneous_article_ids = to_be_removed_but_ordered.map { |a| a.article_id } end end diff --git a/config/locales/de.yml b/config/locales/de.yml index b603d28f..c11305ae 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1327,7 +1327,8 @@ de: error_starts_before_ends: muss nach dem Bestellstart liegen (oder leer bleiben) notice_close: ! 'Bestellung: %{name}, bis %{ends}' stock: Lager - warning_ordered: 'Warnung: Die rot markierten Artikel wurden in der laufenden Bestellung bereits bestellt. Wenn Du sie hier abwählst, werden alle bestehenden Bestellungen dieses Artikels gelöscht. Bei Lagerbestellungen kann dies je nach Verwendung bedeuten, dass bereits gekaufte Artikel nicht abgerechnet werden!' + warning_ordered: 'Warnung: Die rot markierten Artikel wurden in der laufenden Bestellung bereits bestellt. Wenn Du sie hier abwählst, werden alle bestehenden Bestellungen dieses Artikels gelöscht.' + warning_ordered_stock: 'Warnung: Die rot markierten Artikel wurden in der laufenden Lagerbestellung bereits bestellt bzw. gekauft. Wenn Du sie hier abwählst, werden alle bestehenden Bestellungen bzw. Käufe dieses Artikels gelöscht und nicht abgerechnet!' new: title: Neue Bestellung anlegen orders: diff --git a/config/locales/en.yml b/config/locales/en.yml index 5c507ac3..ecc41870 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1332,7 +1332,8 @@ en: error_starts_before_ends: must be after the start date (or remain empty) notice_close: ! 'Order: %{name}, until %{ends}' stock: Stock - warning_ordered: 'Warning: Articles marked red have already been ordered within this open order. If you uncheck them here, all existing orders of these articles will be deleted. In case of stock orders this might mean that already bought articles will not be accounted for!' + warning_ordered: 'Warning: Articles marked red have already been ordered within this open order. If you uncheck them here, all existing orders of these articles will be deleted.' + warning_ordered_stock: 'Warning: Articles marked red have already been ordered/ purchased within this open stock order. If you uncheck them here, all existing orders/ purchases of these articles will be deleted and it will not be accounted for them.' new: title: Create new order orders: