diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 04098d88..820d682c 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -10,6 +10,34 @@
//= require_self
//= require ordering
+// function for sorting DOM elements
+$.fn.sorter = (function(){
+ // Thanks to James Padolsey and Avi Deitcher
+ // http://james.padolsey.com/javascript/sorting-elements-with-jquery/#comment-29400
+ var sort = [].sort;
+
+ return function(comparator, getSortable) {
+ getSortable = getSortable || function(){return this;};
+
+ var sorted = sort.call(this, comparator); // sort all elements in memory
+ var prevElmt = null;
+ for(i=sorted.length-1; i>=0; --i) { // loop starting from last
+ var criterionElmt = sorted[i];
+ var curElmt = ( 'function' === typeof getSortable ) ? ( getSortable.call(criterionElmt) ) : ( criterionElmt );
+ var parent = curElmt.parentNode;
+ if (!prevElmt) {
+ parent.appendChild(curElmt); // place last element to the end
+ } else {
+ parent.insertBefore(curElmt, prevElmt); // move each element before the previous one
+ }
+ prevElmt = curElmt;
+ }
+ return sorted;
+
+ };
+
+})();
+
// Load following statements, when DOM is ready
$(function() {
@@ -100,17 +128,74 @@ $(function() {
// Use bootstrap datepicker for dateinput
$('.datepicker').datepicker({format: 'yyyy-mm-dd', weekStart: 1, language: 'de'});
+
+ // Init table sorting
+ var myBars = $('span.sorter-bar');
+ myBars.html('');
+ $('button:nth-child(1)', myBars).click(function(e) {sortTable(e, false);}).attr('title', 'Sortiere aufsteigend');
+ $('button:nth-child(2)', myBars).click(function(e) {sortTable(e, true);}).attr('title', 'Sortiere absteigend (umgekehrt)');
+
+ $('span.sorter-bar.default-sort-asc button:nth-child(1)').trigger('click');
+ $('span.sorter-bar.default-sort-desc button:nth-child(2)').trigger('click');
});
+// parse a string to a float
+function myFloatParse(input) {
+ var number = input.trim();
+ number = number.split(' ')[0];
+ number = number.replace(',', '.');
+ number = parseFloat(number, 10);
+ return number;
+}
+
+// compare two elements interpreted as text
+function compareText(a, b) {
+ return $.trim(a.textContent).toLowerCase() < $.trim(b.textContent).toLowerCase() ? -1 : 1;
+}
+
+// compare two elements interpreted as float
+function compareFloat(a, b) {
+ a = myFloatParse( $(a).text() );
+ b = myFloatParse( $(b).text() );
+ return ( a 'delivered_on DESC'
-
- respond_to do |format|
- format.html # index.html.erb
- format.xml { render :xml => @deliveries }
- end
end
def show
@delivery = Delivery.find(params[:id])
-
- respond_to do |format|
- format.html # show.html.erb
- format.xml { render :xml => @delivery }
- end
end
def new
@delivery = @supplier.deliveries.build
-
- respond_to do |format|
- format.html # new.html.erb
- format.xml { render :xml => @delivery }
- end
end
def create
@delivery = Delivery.new(params[:delivery])
-
- respond_to do |format|
- if @delivery.save
- flash[:notice] = I18n.t('deliveries.create.notice')
- format.html { redirect_to([@supplier,@delivery]) }
- format.xml { render :xml => @delivery, :status => :created, :location => @delivery }
- else
- format.html { render :action => "new" }
- format.xml { render :xml => @delivery.errors, :status => :unprocessable_entity }
- end
+
+ if @delivery.save
+ flash[:notice] = I18n.t('deliveries.create.notice')
+ redirect_to [@supplier, @delivery]
+ else
+ render :action => "new"
end
end
@@ -52,15 +33,11 @@ class DeliveriesController < ApplicationController
def update
@delivery = Delivery.find(params[:id])
- respond_to do |format|
- if @delivery.update_attributes(params[:delivery])
- flash[:notice] = I18n.t('deliveries.update.notice')
- format.html { redirect_to([@supplier,@delivery]) }
- format.xml { head :ok }
- else
- format.html { render :action => "edit" }
- format.xml { render :xml => @delivery.errors, :status => :unprocessable_entity }
- end
+ if @delivery.update_attributes(params[:delivery])
+ flash[:notice] = I18n.t('deliveries.update.notice')
+ redirect_to [@supplier,@delivery]
+ else
+ render :action => "edit"
end
end
@@ -69,19 +46,23 @@ class DeliveriesController < ApplicationController
@delivery.destroy
flash[:notice] = I18n.t('deliveries.destroy.notice')
- respond_to do |format|
- format.html { redirect_to(supplier_deliveries_url(@supplier)) }
- format.xml { head :ok }
- end
+ redirect_to supplier_deliveries_url(@supplier)
end
def new_stock_article
- @stock_article = @supplier.stock_articles.build
+ @old_stock_article = StockArticle.find_by_id(params[:old_stock_article_id])
+
+ unless @old_stock_article.nil?
+ @stock_article = @old_stock_article.dup
+ else
+ @stock_article = @supplier.stock_articles.build
+ end
render :layout => false
end
def add_stock_article
@stock_article = StockArticle.new(params[:stock_article])
+
if @stock_article.valid? and @stock_article.save
render :layout => false
else
@@ -89,17 +70,25 @@ class DeliveriesController < ApplicationController
end
end
- def add_stock_change
+ def edit_stock_article
+ @stock_article = StockArticle.find(params[:stock_article_id])
render :layout => false
end
- def fill_new_stock_article_form
- article = Article.find(params[:article_id])
- @supplier = article.supplier
- stock_article = @supplier.stock_articles.build(
- article.attributes.reject { |attr| attr == ('id' || 'type')}
- )
-
- render :partial => 'stock_article_form', :locals => {:stock_article => stock_article}
+ def update_stock_article
+ @stock_article = StockArticle.find(params[:stock_article][:id])
+
+ if @stock_article.update_attributes(params[:stock_article])
+ render :layout => false
+ else
+ render :action => 'edit_stock_article', :layout => false
+ end
end
+
+ def add_stock_change
+ @stock_change = StockChange.new
+ @stock_change.stock_article = StockArticle.find(params[:stock_article_id])
+ render :layout => false
+ end
+
end
diff --git a/app/helpers/deliveries_helper.rb b/app/helpers/deliveries_helper.rb
index 6780479b..868bf11a 100644
--- a/app/helpers/deliveries_helper.rb
+++ b/app/helpers/deliveries_helper.rb
@@ -14,4 +14,8 @@ module DeliveriesHelper
supplier.stock_articles.undeleted.reorder('articles.name ASC').map {|a| ["#{a.name} (#{number_to_currency a.price}/#{a.unit})", a.id] }
end
+ def stock_articles_for_table(supplier)
+ supplier.stock_articles.undeleted.reorder('articles.name COLLATE NOCASE ASC')
+ end
+
end
diff --git a/app/models/delivery.rb b/app/models/delivery.rb
index 3add6fdf..efa4a8a4 100644
--- a/app/models/delivery.rb
+++ b/app/models/delivery.rb
@@ -2,7 +2,10 @@ class Delivery < ActiveRecord::Base
belongs_to :supplier
has_one :invoice
- has_many :stock_changes, :dependent => :destroy
+ has_many :stock_changes,
+ :dependent => :destroy,
+ :include => 'stock_article',
+ :order => 'articles.name COLLATE NOCASE ASC'
scope :recent, :order => 'created_at DESC', :limit => 10
@@ -15,6 +18,10 @@ class Delivery < ActiveRecord::Base
stock_changes.build(attributes) unless attributes[:quantity].to_i == 0
end
end
+
+ def includes_article?(article)
+ self.stock_changes.map{|stock_change| stock_change.stock_article.id}.include? article.id
+ end
end
diff --git a/app/views/deliveries/_form.html.haml b/app/views/deliveries/_form.html.haml
index 1fb6a5ce..a60c5d2c 100644
--- a/app/views/deliveries/_form.html.haml
+++ b/app/views/deliveries/_form.html.haml
@@ -2,42 +2,94 @@
:javascript
$(function() {
$('.destroy_stock_change').live('click', function() {
- $(this).prev('input').val('1').parent().hide();
+ $(this).prev('input').val('1'); // check for destruction
+
+ var stock_change = $(this).closest('tr');
+ stock_change.hide(); // do not remove (to ensure destruction)
+ unmark_article_unavailable_for_delivery( stock_change.data('id') );
return false;
});
$('.remove_new_stock_change').live('click', function() {
- $(this).parent().remove();
+ var stock_change = $(this).closest('tr');
+ stock_change.remove();
+ unmark_article_unavailable_for_delivery( stock_change.data('id') );
return false;
})
});
+ function mark_article_unavailable_for_delivery(stock_article_id) {
+ var articleTr = $('#stock_article_' + stock_article_id);
+ articleTr.addClass('unavailable');
+ $('.button-add-stock-change', articleTr).attr('disabled', 'disabled');
+ }
+ function unmark_article_unavailable_for_delivery(stock_article_id) {
+ var articleTr = $('#stock_article_' + stock_article_id);
+ articleTr.removeClass('unavailable');
+ $('.button-add-stock-change', articleTr).removeAttr('disabled');
+ }
+ function is_article_unavailable_for_delivery(stock_article_id) {
+ var articleTr = $('#stock_article_' + stock_article_id);
+ return articleTr.hasClass('unavailable');
+ }
-- content_for :javascript do
- :javascript
- $(function() {
- $('#add-stock-change').click();
- });
-
-.well.well-small
- .btn-toolbar
- .btn-group
- = link_to t('.new_stock_article'), new_stock_article_supplier_deliveries_path(@supplier), remote: true, class: 'btn'
-
-= simple_form_for [@supplier, @delivery], validate: true do |f|
+-# remove validate true for the form, because it disabled html5 validation
+-# is there anything broken with the simple_form validation? (bootstrap issue?)
+= simple_form_for [@supplier, @delivery] do |f|
= f.hidden_field :supplier_id
- #stock_changes
- = f.fields_for :stock_changes do |stock_change_form|
- %p
- = stock_change_form.select :stock_article_id, stock_articles_for_select(@supplier)
- Menge
- = stock_change_form.text_field :quantity, size: 5, autocomplete: 'off'
- = stock_change_form.hidden_field :_destroy
- = link_to t('.remove_article'), "#", class: 'destroy_stock_change'
- %p
- = link_to t('.add_article'), {action: 'add_stock_change', supplier_id: @supplier.id}, :id => 'add-stock-change', remote: true, class: 'btn btn-small btn-primary'
- %hr/
- = f.input :delivered_on, as: :date_picker
- = f.input :note, input_html: {size: '35x4'}
- .form-actions
- = f.submit class: 'btn btn-primary'
- = link_to t('ui.or_cancel'), supplier_deliveries_path(@supplier)
+ .row-fluid
+
+ .span6
+ %h2 #{t '.title_select_stock_articles'}
+ .well.well-small
+ .btn-toolbar
+ .btn-group
+ = link_to t('.new_stock_article'), new_stock_article_supplier_deliveries_path(@supplier), remote: true, class: 'btn'
+ %table.table.table-condensed.table-hover#stock_articles_for_adding
+ %thead
+ %tr
+ %th
+ = t '.article'
+ %span.sorter-bar.default-sort-asc{:data => {'compare-function' => 'compareText', 'sort-criterion' => 'sort-by-name'}}
+ %th= t '.unit'
+ %th
+ = t '.price'
+ %span.sorter-bar{:data => {'compare-function' => 'compareFloat', 'sort-criterion' => 'sort-by-price'}}
+ %th= t '.vat'
+ %th
+ = t '.category'
+ %span.sorter-bar{:data => {'compare-function' => 'compareText', 'sort-criterion' => 'sort-by-category'}}
+ %th= t '.actions'
+ %tbody
+ - for article in stock_articles_for_table(@supplier)
+ = render :partial => 'stock_article_for_adding', :locals => {:article => article}
+
+ .span6
+ %h2 #{t '.title_fill_quantities'}
+ %table.table.table-condensed#stock_changes
+ %thead
+ %tr
+ %th
+ = t '.article'
+ %span.sorter-bar.default-sort-asc{:data => {'compare-function' => 'compareText', 'sort-criterion' => 'sort-by-name'}}
+ %th= t '.price_per_unit'
+ %th= t '.quantity'
+ %th= t '.actions'
+ %tbody
+ = f.fields_for :stock_changes do |stock_change_form|
+ - stock_change = stock_change_form.object
+ %tr{:id => "stock_change_stock_article_#{stock_change.stock_article.id}", :data => {:id => stock_change.stock_article.id}}
+ %td.sort-by-name
+ = stock_change_form.hidden_field :stock_article_id
+ %span.stock_article_name= stock_change.stock_article.name
+ %td.numeric.price-per-unit #{number_to_currency stock_change.stock_article.price}/#{stock_change.stock_article.unit}
+ %td= stock_change_form.text_field :quantity, :size => 5, :autocomplete => 'off'
+ %td
+ = stock_change_form.hidden_field :_destroy
+ = link_to t('.remove_article'), "#", :class => 'destroy_stock_change btn btn-small'
+
+ %h2 #{t '.title_finish_delivery'}
+ = f.input :delivered_on, as: :date_picker
+ = f.input :note, input_html: {size: '35x4'}
+ .form-actions
+ = f.submit class: 'btn btn-primary'
+ = link_to t('ui.or_cancel'), supplier_deliveries_path(@supplier)
diff --git a/app/views/deliveries/_stock_article_for_adding.html.haml b/app/views/deliveries/_stock_article_for_adding.html.haml
new file mode 100644
index 00000000..5aba3245
--- /dev/null
+++ b/app/views/deliveries/_stock_article_for_adding.html.haml
@@ -0,0 +1,16 @@
+- css_class = ( @delivery and @delivery.includes_article? article ) ? ( 'unavailable' ) : ( false )
+%tr{:id => "stock_article_#{article.id}", :class => css_class}
+ %td.sort-by-name
+ = article.name
+ %td.numeric= article.unit
+ %td.numeric= number_to_currency article.price
+ %td.numeric= number_to_percentage article.tax
+ %td.sort-by-category= article.article_category.name
+ %td
+ .btn-group
+ = link_to t('.action_edit'), edit_stock_article_supplier_deliveries_path(@supplier, :stock_article_id => article.id), remote: true, class: 'btn btn-mini'
+ = link_to t('.action_other_price'), new_stock_article_supplier_deliveries_path(@supplier, :old_stock_article_id => article.id), remote: true, class: 'btn btn-mini'
+ - if @delivery and @delivery.includes_article? article
+ = link_to t('.action_add_to_delivery'), add_stock_change_supplier_deliveries_path(@supplier, :stock_article_id => article.id), :method => :post, remote: true, class: 'button-add-stock-change btn btn-mini', disabled: 'disabled'
+ - else
+ = link_to t('.action_add_to_delivery'), add_stock_change_supplier_deliveries_path(@supplier, :stock_article_id => article.id), :method => :post, remote: true, class: 'button-add-stock-change btn btn-mini'
diff --git a/app/views/deliveries/_stock_article_form.html.haml b/app/views/deliveries/_stock_article_form.html.haml
index 2d3b0906..4bfc15e0 100644
--- a/app/views/deliveries/_stock_article_form.html.haml
+++ b/app/views/deliveries/_stock_article_form.html.haml
@@ -1,5 +1,8 @@
-= simple_form_for stock_article, url: add_stock_article_supplier_deliveries_path(supplier), remote: true, validate: true do |f|
+- url = ( stock_article.new_record? ) ? ( add_stock_article_supplier_deliveries_path(@supplier) ) : ( update_stock_article_supplier_deliveries_path(@supplier) )
+= simple_form_for stock_article, url: url, remote: true, validate: true do |f|
= f.hidden_field :supplier_id
+ - unless stock_article.new_record?
+ = f.hidden_field :id
.modal-header
= link_to t('ui.marks.close').html_safe, '#', class: 'close', data: {dismiss: 'modal'}
%h3= t 'activerecord.models.stock_article'
@@ -12,7 +15,7 @@
= f.input :tax
= f.input :deposit
- else
- = f.input :price, :input_html => {:disabled => 'disabled'}, :hint => t('.form.price_hint')
+ = f.input :price, :input_html => {:disabled => 'disabled'}, :hint => t('stockit.form.price_hint')
= f.association :article_category
.modal-footer
= link_to t('ui.close'), '#', class: 'btn', data: {dismiss: 'modal'}
diff --git a/app/views/deliveries/_stock_change.html.haml b/app/views/deliveries/_stock_change.html.haml
index 97151ecc..b03d131e 100644
--- a/app/views/deliveries/_stock_change.html.haml
+++ b/app/views/deliveries/_stock_change.html.haml
@@ -1,6 +1,9 @@
-%p
- = fields_for "delivery[new_stock_changes][]", stock_change do |form|
- = form.select :stock_article_id, stock_articles_for_select(supplier)
- Menge
- = form.text_field :quantity, :size => 5, :autocomplete => 'off'
- = link_to t('.remove_article'), "#", :class => 'remove_new_stock_change btn btn-small'
+= fields_for "delivery[new_stock_changes][]", stock_change, validate: true do |f|
+ - f.object.quantity = '' if 0 == f.object.quantity
+ %tr{:id => "stock_change_stock_article_#{stock_change.stock_article.id}", :data => {:id => stock_change.stock_article.id}}
+ %td.sort-by-name
+ = f.hidden_field :stock_article_id
+ %span.stock_article_name= stock_change.stock_article.name
+ %td.numeric.price-per-unit #{number_to_currency stock_change.stock_article.price}/#{stock_change.stock_article.unit}
+ %td= f.text_field :quantity, :size => 4, :autocomplete => 'off', :required => true, :class => 'stock-change-quantity'
+ %td= link_to t('.remove_article'), "#", :class => 'remove_new_stock_change btn btn-small'
diff --git a/app/views/deliveries/add_stock_article.js.erb b/app/views/deliveries/add_stock_article.js.erb
new file mode 100644
index 00000000..73eff4ac
--- /dev/null
+++ b/app/views/deliveries/add_stock_article.js.erb
@@ -0,0 +1,14 @@
+$('div.container-fluid').prepend(
+ '<%= j(render(:partial => 'shared/alert_success', :locals => {:alert_message => t('.notice', :name => @stock_article.name)})) %>'
+);
+
+$('#stock_articles_for_adding tr').removeClass('success');
+
+$('#stock_articles_for_adding tbody').append(
+ $(
+ '<%= j(render(:partial => 'stock_article_for_adding', :locals => {:article => @stock_article})) %>'
+ ).addClass('success')
+);
+updateSort('#stock_articles_for_adding');
+
+$('#modalContainer').modal('hide');
diff --git a/app/views/deliveries/add_stock_article.js.haml b/app/views/deliveries/add_stock_article.js.haml
deleted file mode 100644
index 9155f970..00000000
--- a/app/views/deliveries/add_stock_article.js.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-$('div.container-fluid').prepend('#{j(render(:partial => 'shared/alert_success', :locals => {:alert_message => t('.notice', :name => @stock_article.name)}))}');
-
-$('#modalContainer').modal('hide');
diff --git a/app/views/deliveries/add_stock_change.js.erb b/app/views/deliveries/add_stock_change.js.erb
new file mode 100644
index 00000000..dd9efcf5
--- /dev/null
+++ b/app/views/deliveries/add_stock_change.js.erb
@@ -0,0 +1,20 @@
+if(!is_article_unavailable_for_delivery(<%= @stock_change.stock_article.id %>)) {
+ <%# would be easier to return in the opposite case, but how? %>
+
+ mark_article_unavailable_for_delivery(<%= @stock_change.stock_article.id %>);
+
+ (function(w) {
+ $('#stock_changes tr').removeClass('success');
+
+ var stock_change = $(
+ '<%= j(render(:partial => 'stock_change', :locals => {:stock_change => @stock_change})) %>'
+ ).addClass('success');
+
+ $('#stock_changes').append(stock_change);
+ updateSort('#stock_changes');
+
+ var quantity = w.prompt('<%= j(t('.how_many_units', :unit => @stock_change.stock_article.unit, :name => @stock_change.stock_article.name)) %>'); <%# how to properly escape here? %>
+ $('input.stock-change-quantity', stock_change).val(quantity);
+ })(window);
+
+}
diff --git a/app/views/deliveries/add_stock_change.js.haml b/app/views/deliveries/add_stock_change.js.haml
deleted file mode 100644
index 43659e20..00000000
--- a/app/views/deliveries/add_stock_change.js.haml
+++ /dev/null
@@ -1 +0,0 @@
-$('#stock_changes').append('#{escape_javascript(render(:partial => 'stock_change', :locals => {:stock_change => StockChange.new, :supplier => @supplier}))}');
diff --git a/app/views/deliveries/edit_stock_article.js.erb b/app/views/deliveries/edit_stock_article.js.erb
new file mode 100644
index 00000000..de5d260e
--- /dev/null
+++ b/app/views/deliveries/edit_stock_article.js.erb
@@ -0,0 +1,5 @@
+$('#modalContainer').html(
+ '<%= j(render(:partial => "stock_article_form", :locals => {:stock_article => @stock_article})) %>'
+);
+
+$('#modalContainer').modal();
diff --git a/app/views/deliveries/new_stock_article.js.erb b/app/views/deliveries/new_stock_article.js.erb
new file mode 100644
index 00000000..de5d260e
--- /dev/null
+++ b/app/views/deliveries/new_stock_article.js.erb
@@ -0,0 +1,5 @@
+$('#modalContainer').html(
+ '<%= j(render(:partial => "stock_article_form", :locals => {:stock_article => @stock_article})) %>'
+);
+
+$('#modalContainer').modal();
diff --git a/app/views/deliveries/new_stock_article.js.haml b/app/views/deliveries/new_stock_article.js.haml
deleted file mode 100644
index 92cddccd..00000000
--- a/app/views/deliveries/new_stock_article.js.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-$('#modalContainer').html('#{j(render(:partial => "stock_article_form", :locals => {:stock_article => @stock_article, :supplier => @supplier}))}');
-$('#modalContainer').modal();
diff --git a/app/views/deliveries/update_stock_article.js.erb b/app/views/deliveries/update_stock_article.js.erb
new file mode 100644
index 00000000..81fde972
--- /dev/null
+++ b/app/views/deliveries/update_stock_article.js.erb
@@ -0,0 +1,35 @@
+$('div.container-fluid').prepend(
+ '<%= j(render(:partial => 'shared/alert_success', :locals => {:alert_message => t('.notice', :name => @stock_article.name)})) %>'
+);
+
+(function() {
+ $('#stock_articles_for_adding tr').removeClass('success');
+
+ var old_entry = $('#stock_article_<%= @stock_article.id %>');
+ var unavailable = old_entry.hasClass('unavailable');
+ var stock_article_for_adding = $(
+ '<%= j(render(:partial => 'stock_article_for_adding', :locals => {:article => @stock_article, :delivery => @delivery})) %>'
+ ).addClass('success');
+
+ if(unavailable) {
+ stock_article_for_adding.addClass('unavailable');
+ $('.button-add-stock-change', stock_article_for_adding).attr('disabled', 'disabled');
+ }
+
+ old_entry.replaceWith(stock_article_for_adding);
+ updateSort('#stock_articles_for_adding');
+
+ $('#stock_changes tr').removeClass('success');
+
+ var stock_change_entry = $('#stock_change_stock_article_<%= @stock_article.id %>');
+ $('.stock_article_name', stock_change_entry).text('<%= j(@stock_article.name) %>');
+ $('.price-per-unit', stock_change_entry).text(
+ '<%= "#{j(number_to_currency(@stock_article.price))}/#{j(number_to_currency(@stock_article.unit))}" %>'
+ );
+
+ stock_change_entry.addClass('success');
+
+ updateSort('#stock_changes');
+})();
+
+$('#modalContainer').modal('hide');
diff --git a/config/locales/de.yml b/config/locales/de.yml
index ccd58e76..dfcce4ac 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -416,8 +416,10 @@ de:
second: Sekunden
year: Jahr
deliveries:
+ add_stock_change:
+ how_many_units: Wie viele Einheiten (%{unit}) des Artikels »%{name}« liefern?
add_stock_article:
- notice: Neuer Lagerartikel »%{name}« gespeichert. Zum Auswählen bitte erneut einen Lagerartikel der Lieferung hinzufügen.
+ notice: Neuer Lagerartikel »%{name}« gespeichert.
create:
notice: Lieferung wurde erstellt. Bitte nicht vergessen die Rechnung anzulegen!
destroy:
@@ -425,14 +427,22 @@ de:
edit:
title: Lieferung bearbeiten
form:
+ actions: Optionen
add_article: Lagerartikel der Lieferung hinzufügen
+ article: Artikel
+ category: Kategorie
new_stock_article: Neuen Lagerartikel anlegen
- new_article:
- search: Suche nach Artikeln aus dem %{supplier} Katalog
- title: Neuen Lagerartikel anlegen
note_new_article: Ist ein Artikel noch nicht in der Lagerverwaltung, muss er erst %{new_link} werden.
note_new_article_link: neu angelegt
+ price: Preis (netto)
+ price_per_unit: Preis/Einheit
+ quantity: Menge
remove_article: Artikel aus Lieferung entfernen
+ title_fill_quantities: 2. Liefermenge angeben
+ title_finish_delivery: 3. Lieferung abschließen
+ title_select_stock_articles: 1. Lagerartikel auswählen
+ unit: Einheit
+ vat: MwSt
index:
confirm_delete: Bist Du sicher?
new_delivery: Neue Lieferung für %{supplier} anlegen
@@ -452,11 +462,17 @@ de:
title: Lieferung anzeigen
title_articles: Artikel
unit: Einheit
+ stock_article_for_adding:
+ action_add_to_delivery: 'Liefern'
+ action_edit: 'Bearbeiten'
+ action_other_price: 'Anderer Preis'
stock_change:
remove_article: Artikel aus Lieferung entfernen
suppliers_overview: Lieferantenübersicht
update:
notice: Lieferung wurde aktualisiert.
+ update_stock_article:
+ notice: Lagerartikel »%{name}« aktualisiert.
documents:
order_by_articles:
filename: Bestellung %{name}-%{date} - Artikelsortierung
diff --git a/config/routes.rb b/config/routes.rb
index 391f317b..5719d4ce 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -102,9 +102,13 @@ Foodsoft::Application.routes.draw do
get :shared_suppliers, :on => :collection
resources :deliveries do
- post :drop_stock_change, :on => :member
+ post :add_stock_change, :on => :collection
+
get :new_stock_article, :on => :collection
post :add_stock_article, :on => :collection
+
+ get :edit_stock_article, :on => :collection
+ put :update_stock_article, :on => :collection
end
resources :articles do