diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 8872d4de..d42a9c95 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -109,7 +109,6 @@ function highlightRow(checkbox) {
} else {
row.removeClass('selected');
}
-
}
// Use with auto_complete to set a unique id,
diff --git a/app/assets/stylesheets/bootstrap_and_overrides.css.less b/app/assets/stylesheets/bootstrap_and_overrides.css.less
index 0dec3b9b..d73930c3 100644
--- a/app/assets/stylesheets/bootstrap_and_overrides.css.less
+++ b/app/assets/stylesheets/bootstrap_and_overrides.css.less
@@ -69,6 +69,10 @@ table {
td.odd {
background-color: @tableBackgroundAccent;
}
+
+ tr.selected td {
+ background-color: @successBackground;
+ }
}
// Tasks ..
diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb
index bb15350b..31baa680 100644
--- a/app/controllers/orders_controller.rb
+++ b/app/controllers/orders_controller.rb
@@ -64,6 +64,7 @@ class OrdersController < ApplicationController
flash[:notice] = "Die Bestellung wurde erstellt."
redirect_to @order
else
+ logger.debug "[debug] order errors: #{@order.errors.messages}"
render :action => 'new'
end
end
diff --git a/app/models/order.rb b/app/models/order.rb
index 49df9f20..28f6bfd5 100644
--- a/app/models/order.rb
+++ b/app/models/order.rb
@@ -20,7 +20,8 @@ class Order < ActiveRecord::Base
# Callbacks
after_update :update_price_of_group_orders
-
+ after_save :save_order_articles
+
# Finders
scope :open, where(state: 'open').order('ends DESC')
scope :finished, where("state = 'finished' OR state = 'closed'").order('ends DESC')
@@ -47,25 +48,13 @@ class Order < ActiveRecord::Base
end
end
- # Fetch last orders from same supplier, to generate an article selection proposal
- def templates
- if stockit?
- Order.stockit :limit => 5
- else
- supplier.orders.finished :limit => 5
- end
+ # Save ids, and create/delete order_articles after successfully saved the order
+ def article_ids=(ids)
+ @article_ids = ids
end
- # Create or destroy OrderArticle associations on create/update
- def article_ids=(ids)
- # fetch selected articles
- articles_list = Article.find(ids)
- # create new order_articles
- (articles_list - articles).each { |article| order_articles.build(:article => article) }
- # delete old order_articles
- articles.reject { |article| articles_list.include?(article) }.each do |article|
- order_articles.detect { |order_article| order_article.article_id == article.id }.destroy
- end
+ def article_ids
+ @article_ids ||= order_articles.map(&:article_id)
end
def open?
@@ -83,12 +72,12 @@ class Order < ActiveRecord::Base
def expired?
!ends.nil? && ends < Time.now
end
-
+
# search GroupOrder of given Ordergroup
def group_order(ordergroup)
group_orders.where(:ordergroup_id => ordergroup.id).first
end
-
+
# Returns OrderArticles in a nested Array, grouped by category and ordered by article name.
# The array has the following form:
# e.g: [["drugs",[teethpaste, toiletpaper]], ["fruits" => [apple, banana, lemon]]]
@@ -104,7 +93,7 @@ class Order < ActiveRecord::Base
a.article.article_category.name <=> b.article.article_category.name
end
end
-
+
# Returns the defecit/benefit for the foodcoop
# Requires a valid invoice, belonging to this order
#FIXME: Consider order.foodcoop_result
@@ -115,7 +104,7 @@ class Order < ActiveRecord::Base
groups_sum - invoice.net_amount
end
end
-
+
# Returns the all round price of a finished order
# :groups returns the sum of all GroupOrders
# :clear returns the price without tax, deposit and markup
@@ -182,7 +171,7 @@ class Order < ActiveRecord::Base
end
end
end
-
+
# Sets order.status to 'close' and updates all Ordergroup.account_balances
def close!(user)
raise "Bestellung wurde schon abgerechnet" if closed?
@@ -221,11 +210,15 @@ class Order < ActiveRecord::Base
end
def include_articles
- errors.add(:order_articles, "Es muss mindestens ein Artikel ausgewählt sein") if order_articles.empty?
+ errors.add(:articles, "Es muss mindestens ein Artikel ausgewählt sein") if article_ids.empty?
+ end
+
+ def save_order_articles
+ self.articles = Article.find(article_ids)
end
private
-
+
# Updates the "price" attribute of GroupOrders or GroupOrderResults
# This will be either the maximum value of a current order or the actual order value of a finished order.
def update_price_of_group_orders
diff --git a/app/views/orders/_form.html.haml b/app/views/orders/_form.html.haml
index 4912bcd1..fad3979d 100644
--- a/app/views/orders/_form.html.haml
+++ b/app/views/orders/_form.html.haml
@@ -1,63 +1,54 @@
= simple_form_for @order do |f|
- .single_column
- .box_title
- %h2 Bestellung für #{@order.name}
- .column_content
- = f.hidden_field :supplier_id
- = f.input :note
- = f.input :starts
- = f.input :ends
+ = f.hidden_field :supplier_id
+ = f.input :note, input_html: {rows: 8}
+ = f.input :starts, input_html: {class: 'input-small'}
+ = f.input :ends, input_html: {class: 'input-small'}
- .box_title
- %h2 Artikel
- .column_content
- - if (@template_orders && !@template_orders.empty?)
- %p
- %label{:for => 'template'} Benutze Artikelauswahl von
- %select{:name => "template_id", :onchange => "useTemplate(this[this.selectedIndex].value)"}
- %option{:value => "-1", :selected => "selected"} Bestellung auswählen...
- - i = -1
- - for order in @template_orders
- %option{:value => (i += 1)}= "#{h(order.name)} bis #{order.ends.strftime('%d. %b')}"
- %table.list
- %tr
- %th= check_box_tag 'checkall', "1", false, { 'data-check-all' => 'form.order' }
- %th Name
- %th Notiz
+ %h2 Artikel
+ - if @order.errors.has_key?(:articles)
+ .alert.alert-error
+ = @order.errors.get(:articles).join(" ")
+ %table.table.table-hover#articleList
+ %tr
+ %th= check_box_tag 'checkall', "1", false, { 'data-check-all' => '#articleList' }
+ %th Name
+ %th Notiz
+ - if @order.stockit?
+ %th Verfügbar
+ - else
+ %th Herkunft
+ %th Hersteller
+ %th Gebinde
+ %th Preis (netto/FC)
+ - for category_name, articles in @order.articles_for_ordering
+ %tr.article-category
+ %td
+ %td{:colspan => "6", :style => "text-align:left"}
+ = 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' : ''
+ %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
+ %td=h truncate article.note, :length => 25
- if @order.stockit?
- %th Verfügbar
+ %td= "#{article.quantity_available} * #{article.unit}"
- else
- %th Herkunft
- %th Hersteller
- %th Gebinde
- %th Preis (netto/FC)
- - for category_name, articles in @order.articles_for_ordering
- %tr{:style => "background-color:#EFEFEF"}
- %td
- %td{:colspan => "6", :style => "text-align:left"}
- %b=h category_name
- - for article in articles
- / check if the article is selected
- - included = @order.order_articles.detect { |order_article| order_article.article_id == article.id }
- - included_class = included ? ' selected' : ''
- %tr{:class => cycle('even', 'odd') + 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
- %td=h truncate article.note, :length => 25
- - if @order.stockit?
- %td= "#{article.quantity_available} * #{article.unit}"
- - else
- %td=h truncate article.origin, :length => 15
- %td=h truncate article.manufacturer, :length => 15
- %td= "#{article.unit_quantity} x #{article.unit}"
- %td= "#{number_to_currency(article.price)} / #{number_to_currency(article.fc_price)}"
- %tr
- %td{:colspan => "6"}
- = check_box_tag 'checkall', "1", false, { 'data-check-all' => 'form.order' }
- Alle auswählen
+ %td=h truncate article.origin, :length => 15
+ %td=h truncate article.manufacturer, :length => 15
+ %td= "#{article.unit_quantity} x #{article.unit}"
+ %td= "#{number_to_currency(article.price)} / #{number_to_currency(article.fc_price)}"
+ %tr
+ %td
+ = check_box_tag 'checkall', "1", false, { 'data-check-all' => '#articleList' }
+ %td{:colspan => "6"} Alle auswählen
- if (@template_orders && !@template_orders.empty?)
= render :partial => 'template_orders_script'
- = f.submit
- = link_to "oder abbrechen", orders_path
\ No newline at end of file
+ .form-actions
+ = f.submit class: 'btn'
+ = link_to "oder abbrechen", orders_path
diff --git a/app/views/orders/_template_orders_script.html.haml b/app/views/orders/_template_orders_script.html.haml
deleted file mode 100644
index 181b4818..00000000
--- a/app/views/orders/_template_orders_script.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-:javascript
- //
- // Preset selected order articles per template order:
- var template = new Array();
- current_article_ids = @order.supplier.articles.available.map(&:id)
- i = -1; for order in @template_orders
- template[#{i += 1}] = new Array(#{current_article_ids.collect { |id| order.article_ids.include?(id) }.join(', ')});
- // Call with index into template-array to select order articles from template.
- function useTemplate(id) {
- if (id >= 0 && id < template.length) {
- i = -1; for article_id in current_article_ids
- var status = template[id][#{i += 1}]
- $('checkbox_#{article_id}').checked = status;
- highlightRow('#{article_id}',status);
- }
- }
- //
diff --git a/app/views/orders/index.html.haml b/app/views/orders/index.html.haml
index fb8118b8..1263025c 100644
--- a/app/views/orders/index.html.haml
+++ b/app/views/orders/index.html.haml
@@ -1,13 +1,14 @@
- title "Bestellungen verwalten"
-%p
- - form_tag do
- Neue Bestellung anlegen für
- = select_tag :switch_supplier,
- options_for_suppliers_to_select,
- style: "font-size: 0.9em;margin-left:1em;",
- 'data-redirect-to' => true
.well
+ .btn-group.pull-right
+ = link_to '#', data: {toggle: 'dropdown'}, class: 'btn btn-primary dropdown-toggle' do
+ Neue Bestellung für ..
+ %span.caret
+ %ul.dropdown-menu
+ - Supplier.all.each do |supplier|
+ %li= link_to supplier.name, new_order_path(supplier_id: supplier.id), tabindex: -1
+
%h2 Laufende Bestellungen
- unless @open_orders.empty?
%table.table.table-striped
diff --git a/app/views/orders/new.html.haml b/app/views/orders/new.html.haml
index a48aac28..2055c420 100644
--- a/app/views/orders/new.html.haml
+++ b/app/views/orders/new.html.haml
@@ -1,3 +1,3 @@
- title "Neue Bestellung anlegen"
-= render :partial => 'form'
+= render 'form'