From ff8e4eb45fcc008e1e888a1b160f71ce3df7481f Mon Sep 17 00:00:00 2001 From: Florian Lentsch Date: Sat, 21 Nov 2020 10:51:47 +0100 Subject: [PATCH 1/3] Closes #779 --- app/controllers/finance/invoices_controller.rb | 2 +- app/controllers/orders_controller.rb | 8 ++++++-- app/models/order.rb | 10 +++++++--- app/models/stock_article.rb | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/controllers/finance/invoices_controller.rb b/app/controllers/finance/invoices_controller.rb index 131a69884..cfdfa2db6 100644 --- a/app/controllers/finance/invoices_controller.rb +++ b/app/controllers/finance/invoices_controller.rb @@ -33,7 +33,7 @@ def form_on_supplier_id_change def fill_deliveries_and_orders_collection(invoice_id, supplier_id) @deliveries_collection = Delivery.where('invoice_id = ? OR (invoice_id IS NULL AND supplier_id = ?)', invoice_id, supplier_id).order(:date) - @orders_collection = Order.where('invoice_id = ? OR (invoice_id IS NULL AND supplier_id = ? AND state = ?)', invoice_id, supplier_id, 'finished').order(:ends) + @orders_collection = Order.where('invoice_id = ? OR (invoice_id IS NULL AND supplier_id = ? AND state IN (?))', invoice_id, supplier_id, %w[finished received]).order(:ends) end def create diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 0e417610b..df238a37b 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -132,8 +132,12 @@ def receive unless request.post? @order_articles = @order.order_articles.ordered_or_member.includes(:article).order('articles.order_number, articles.name') else - s = update_order_amounts - flash[:notice] = (s ? I18n.t('orders.receive.notice', :msg => s) : I18n.t('orders.receive.notice_none')) + Order.transaction do + s = update_order_amounts + @order.update_attribute(:state, 'received') if @order.state != 'received' + + flash[:notice] = (s ? I18n.t('orders.receive.notice', :msg => s) : I18n.t('orders.receive.notice_none')) + end if current_user.role_orders? || current_user.role_finance? redirect_to @order elsif current_user.role_pickup? diff --git a/app/models/order.rb b/app/models/order.rb index fb8c1d690..70a5603aa 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -31,8 +31,8 @@ class Order < ApplicationRecord # Finders scope :started, -> { where('starts <= ?', Time.now) } scope :open, -> { where(state: 'open').order('ends DESC') } - scope :finished, -> { where("orders.state = 'finished' OR orders.state = 'closed'").order('ends DESC') } - scope :finished_not_closed, -> { where(state: 'finished').order('ends DESC') } + scope :finished, -> { where(state: %w[finished received closed]).order('ends DESC') } + scope :finished_not_closed, -> { where(state: %w[finished received]).order('ends DESC') } scope :closed, -> { where(state: 'closed').order('ends DESC') } scope :stockit, -> { where(supplier_id: nil).order('ends DESC') } scope :recent, -> { order('starts DESC').limit(10) } @@ -92,7 +92,11 @@ def open? end def finished? - state == "finished" + state == "finished" || state == "received" + end + + def received? + state == "received" end def closed? diff --git a/app/models/stock_article.rb b/app/models/stock_article.rb index 7837f7c5d..52b363bb2 100644 --- a/app/models/stock_article.rb +++ b/app/models/stock_article.rb @@ -21,7 +21,7 @@ def quantity_available def quantity_ordered OrderArticle.where(article_id: id). - joins(:order).where(orders: {state: ['open', 'finished']}).sum(:units_to_order) + joins(:order).where(orders: {state: %w[open finished received]}).sum(:units_to_order) end def quantity_history From 8a6cd77d7bd7e5640786ff56a9aee95f5f6b7212 Mon Sep 17 00:00:00 2001 From: Florian Lentsch Date: Sun, 31 Jan 2021 10:56:16 +0100 Subject: [PATCH 2/3] On #799: added code documentation for `received` state --- app/models/order.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/models/order.rb b/app/models/order.rb index 70a5603aa..402ed1de8 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -39,6 +39,16 @@ class Order < ApplicationRecord scope :stock_group_order, -> { group_orders.where(ordergroup_id: nil).first } scope :with_invoice, -> { where.not(invoice: nil) } + # State related finders + # diagram for `Order.state` looks like this: + # * -> open -> finished (-> received) -> closed + # So orders can + # 1. ...only transition in one direction (e.g. an order that has been `finished` currently cannot be reopened) + # 2. ...be set to `closed` when having the `finished` state. (`received` is optional) + scope :open, -> { where(state: 'open').order('ends DESC') } + scope :finished, -> { where(state: %w[finished received closed]).order('ends DESC') } + scope :finished_not_closed, -> { where(state: %w[finished received]).order('ends DESC') } + # Allow separate inputs for date and time # with workaround for https://github.com/einzige/date_time_attribute/issues/14 include DateTimeAttributeValidate From efb33da4ceeb865ecf770f81c031775f25abf8c5 Mon Sep 17 00:00:00 2001 From: Florian Lentsch Date: Sun, 31 Jan 2021 11:40:20 +0100 Subject: [PATCH 3/3] Fixes duplicate finders --- app/models/order.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 402ed1de8..20db85cef 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -30,9 +30,6 @@ class Order < ApplicationRecord # Finders scope :started, -> { where('starts <= ?', Time.now) } - scope :open, -> { where(state: 'open').order('ends DESC') } - scope :finished, -> { where(state: %w[finished received closed]).order('ends DESC') } - scope :finished_not_closed, -> { where(state: %w[finished received]).order('ends DESC') } scope :closed, -> { where(state: 'closed').order('ends DESC') } scope :stockit, -> { where(supplier_id: nil).order('ends DESC') } scope :recent, -> { order('starts DESC').limit(10) } @@ -40,7 +37,7 @@ class Order < ApplicationRecord scope :with_invoice, -> { where.not(invoice: nil) } # State related finders - # diagram for `Order.state` looks like this: + # Diagram for `Order.state` looks like this: # * -> open -> finished (-> received) -> closed # So orders can # 1. ...only transition in one direction (e.g. an order that has been `finished` currently cannot be reopened)