Second part of stock-integration.
Introduced StockArticle and a special page for ordering from stock. StockChanges will be created and the StockArticle.quantity updated in 'order.close!'.
This commit is contained in:
parent
1912a3fd80
commit
c17b63b192
37 changed files with 616 additions and 340 deletions
|
@ -22,17 +22,14 @@ class DeliveriesController < ApplicationController
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@delivery = @supplier.deliveries.build
|
@delivery = @supplier.deliveries.build
|
||||||
3.times { @delivery.stock_changes.build }
|
@supplier.stock_articles.each { |article| @delivery.stock_changes.build(:stock_article => article) }
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html # new.html.erb
|
format.html # new.html.erb
|
||||||
format.xml { render :xml => @delivery }
|
format.xml { render :xml => @delivery }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
|
||||||
@delivery = Delivery.find(params[:id])
|
|
||||||
end
|
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@delivery = Delivery.new(params[:delivery])
|
@delivery = Delivery.new(params[:delivery])
|
||||||
|
|
||||||
|
@ -48,8 +45,10 @@ class DeliveriesController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# PUT /deliveries/1
|
def edit
|
||||||
# PUT /deliveries/1.xml
|
@delivery = Delivery.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@delivery = Delivery.find(params[:id])
|
@delivery = Delivery.find(params[:id])
|
||||||
|
|
||||||
|
@ -75,12 +74,29 @@ class DeliveriesController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def add_stock_article
|
||||||
|
article = @supplier.stock_articles.build(params[:stock_article])
|
||||||
|
render :update do |page|
|
||||||
|
if article.save
|
||||||
|
logger.debug "new StockArticle: #{article.id}"
|
||||||
|
page.insert_html :top, 'stock_changes', :partial => 'stock_change',
|
||||||
|
:locals => {:stock_change => article.stock_changes.build}
|
||||||
|
|
||||||
|
page.replace_html 'new_stock_article', :partial => 'new_stock_article',
|
||||||
|
:locals => {:stock_article => @supplier.stock_articles.build}
|
||||||
|
else
|
||||||
|
page.replace_html 'new_stock_article', :partial => 'new_stock_article',
|
||||||
|
:locals => {:stock_article => article}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def drop_stock_change
|
def drop_stock_change
|
||||||
stock_change = StockChange.find(params[:stock_change_id])
|
stock_change = StockChange.find(params[:stock_change_id])
|
||||||
stock_change.destroy
|
stock_change.destroy
|
||||||
|
|
||||||
render :update do |page|
|
render :update do |page|
|
||||||
page.visual_effect(:DropOut, "stock_change_#{stock_change.id}")
|
page.visual_effect :DropOut, "stock_change_#{stock_change.id}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -136,7 +136,8 @@ class Finance::BalancingController < ApplicationController
|
||||||
|
|
||||||
render :update do |page|
|
render :update do |page|
|
||||||
if goa.save
|
if goa.save
|
||||||
goa.group_order.update_price! # Updates the price attribute of new GroupOrder
|
goa.group_order.update_price! # Update the price attribute of new GroupOrder
|
||||||
|
order_article.update_results! if order_article.article.is_a?(StockArticle) # Update units_to_order of order_article
|
||||||
page["edit_box"].hide
|
page["edit_box"].hide
|
||||||
|
|
||||||
page["group_order_articles_#{order_article.id}"].replace_html :partial => 'group_order_articles',
|
page["group_order_articles_#{order_article.id}"].replace_html :partial => 'group_order_articles',
|
||||||
|
@ -163,7 +164,8 @@ class Finance::BalancingController < ApplicationController
|
||||||
|
|
||||||
render :update do |page|
|
render :update do |page|
|
||||||
if goa.update_attributes(params[:group_order_article])
|
if goa.update_attributes(params[:group_order_article])
|
||||||
goa.group_order.update_price! # Updates the price attribute of new GroupOrder
|
goa.group_order.update_price! # Update the price attribute of new GroupOrder
|
||||||
|
goa.order_article.update_results! if goa.order_article.article.is_a?(StockArticle) # Update units_to_order of order_article
|
||||||
|
|
||||||
page["edit_box"].hide
|
page["edit_box"].hide
|
||||||
page["group_order_articles_#{goa.order_article.id}"].replace_html :partial => 'group_order_articles',
|
page["group_order_articles_#{goa.order_article.id}"].replace_html :partial => 'group_order_articles',
|
||||||
|
@ -180,6 +182,7 @@ class Finance::BalancingController < ApplicationController
|
||||||
goa = GroupOrderArticle.find(params[:id])
|
goa = GroupOrderArticle.find(params[:id])
|
||||||
goa.destroy
|
goa.destroy
|
||||||
goa.group_order.update_price! # Updates the price attribute of new GroupOrder
|
goa.group_order.update_price! # Updates the price attribute of new GroupOrder
|
||||||
|
goa.order_article.update_results! if goa.order_article.article.is_a?(StockArticle) # Update units_to_order of order_article
|
||||||
|
|
||||||
render :update do |page|
|
render :update do |page|
|
||||||
page["edit_box"].hide
|
page["edit_box"].hide
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
class OrderingController < ApplicationController
|
class OrderingController < ApplicationController
|
||||||
# Security
|
# Security
|
||||||
before_filter :ensure_ordergroup_member
|
before_filter :ensure_ordergroup_member
|
||||||
before_filter :ensure_open_order, :only => [:order, :saveOrder]
|
before_filter :ensure_open_order, :only => [:order, :stock_order, :saveOrder]
|
||||||
|
|
||||||
verify :method => :post, :only => [:saveOrder], :redirect_to => {:action => :index}
|
verify :method => :post, :only => [:saveOrder], :redirect_to => {:action => :index}
|
||||||
|
|
||||||
|
@ -13,8 +13,8 @@ class OrderingController < ApplicationController
|
||||||
|
|
||||||
# Edit a current order.
|
# Edit a current order.
|
||||||
def order
|
def order
|
||||||
@open_orders = Order.open
|
redirect_to :action => 'stock_order', :id => @order if @order.stockit?
|
||||||
@other_orders = @open_orders.reject{|order| order == @order}
|
|
||||||
# Load order article data...
|
# Load order article data...
|
||||||
@articles_grouped_by_category = @order.articles_grouped_by_category
|
@articles_grouped_by_category = @order.articles_grouped_by_category
|
||||||
# save results of earlier orders in array
|
# save results of earlier orders in array
|
||||||
|
@ -60,6 +60,47 @@ class OrderingController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def stock_order
|
||||||
|
# Load order article data...
|
||||||
|
@articles_grouped_by_category = @order.articles_grouped_by_category
|
||||||
|
# save results of earlier orders in array
|
||||||
|
ordered_articles = Array.new
|
||||||
|
@group_order = @order.group_orders.find(:first,
|
||||||
|
:conditions => "ordergroup_id = #{@ordergroup.id}", :include => :group_order_articles)
|
||||||
|
|
||||||
|
if @group_order
|
||||||
|
# Group has already ordered, so get the results...
|
||||||
|
for goa in @group_order.group_order_articles
|
||||||
|
ordered_articles[goa.order_article_id] = {:quantity => goa.quantity,
|
||||||
|
:tolerance => goa.tolerance,
|
||||||
|
:quantity_result => goa.result(:quantity),
|
||||||
|
:tolerance_result => goa.result(:tolerance)}
|
||||||
|
end
|
||||||
|
@version = @group_order.lock_version
|
||||||
|
@availableFunds = @ordergroup.get_available_funds(@group_order)
|
||||||
|
else
|
||||||
|
@version = 0
|
||||||
|
@availableFunds = @ordergroup.get_available_funds
|
||||||
|
end
|
||||||
|
|
||||||
|
# load prices ....
|
||||||
|
@price = Array.new; @quantity_available = Array.new
|
||||||
|
@others_quantity = Array.new; @quantity = Array.new; @quantity_result = Array.new; @used_quantity = Array.new; @unused_quantity = Array.new
|
||||||
|
i = 0;
|
||||||
|
@articles_grouped_by_category.each do |category_name, order_articles|
|
||||||
|
for order_article in order_articles
|
||||||
|
# price/unit size
|
||||||
|
@price[i] = order_article.article.fc_price
|
||||||
|
@quantity_available[i] = order_article.article.quantity_available(@order)
|
||||||
|
# quantity
|
||||||
|
@quantity[i] = (ordered_articles[order_article.id] ? ordered_articles[order_article.id][:quantity] : 0)
|
||||||
|
@others_quantity[i] = order_article.quantity - @quantity[i]
|
||||||
|
@used_quantity[i] = (ordered_articles[order_article.id] ? ordered_articles[order_article.id][:quantity_result] : 0)
|
||||||
|
i += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Update changes to a current order.
|
# Update changes to a current order.
|
||||||
def saveOrder
|
def saveOrder
|
||||||
if (params[:total_balance].to_i < 0) #TODO: Better use a real test on sufficiant funds
|
if (params[:total_balance].to_i < 0) #TODO: Better use a real test on sufficiant funds
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
class StockitController < ApplicationController
|
class StockitController < ApplicationController
|
||||||
def index
|
def index
|
||||||
@articles = Article.in_stock
|
@articles = StockArticle.all
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
# updated_at :datetime
|
# updated_at :datetime
|
||||||
# quantity :decimal(, ) default(0.0)
|
# quantity :decimal(, ) default(0.0)
|
||||||
# deleted_at :datetime
|
# deleted_at :datetime
|
||||||
|
# type :string(255)
|
||||||
#
|
#
|
||||||
|
|
||||||
class Article < ActiveRecord::Base
|
class Article < ActiveRecord::Base
|
||||||
|
@ -32,9 +33,7 @@ class Article < ActiveRecord::Base
|
||||||
belongs_to :supplier
|
belongs_to :supplier
|
||||||
belongs_to :article_category
|
belongs_to :article_category
|
||||||
has_many :article_prices, :order => "created_at"
|
has_many :article_prices, :order => "created_at"
|
||||||
has_many :stock_changes
|
|
||||||
|
|
||||||
named_scope :in_stock, :conditions => "quantity > 0", :order => 'suppliers.name', :include => :supplier
|
|
||||||
named_scope :available, :conditions => {:availability => true}
|
named_scope :available, :conditions => {:availability => true}
|
||||||
|
|
||||||
# Validations
|
# Validations
|
||||||
|
@ -173,11 +172,6 @@ class Article < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Update the quantity of items in stock
|
|
||||||
def update_quantity!
|
|
||||||
update_attribute :quantity, stock_changes.collect(&:quantity).sum
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
# Checks if the article is in use before it will deleted
|
# Checks if the article is in use before it will deleted
|
||||||
|
|
|
@ -13,7 +13,7 @@ class Delivery < ActiveRecord::Base
|
||||||
|
|
||||||
belongs_to :supplier
|
belongs_to :supplier
|
||||||
has_one :invoice
|
has_one :invoice
|
||||||
has_many :stock_changes
|
has_many :stock_changes, :dependent => :destroy
|
||||||
|
|
||||||
named_scope :recent, :order => 'created_at DESC', :limit => 10
|
named_scope :recent, :order => 'created_at DESC', :limit => 10
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,7 @@
|
||||||
# quantity :integer default(0), not null
|
# quantity :integer default(0), not null
|
||||||
# tolerance :integer default(0), not null
|
# tolerance :integer default(0), not null
|
||||||
# updated_on :datetime not null
|
# updated_on :datetime not null
|
||||||
# quantity_result :integer
|
# result :integer
|
||||||
# tolerance_result :integer
|
|
||||||
#
|
#
|
||||||
|
|
||||||
# A GroupOrderArticle stores the sum of how many items of an OrderArticle are ordered as part of a GroupOrder.
|
# A GroupOrderArticle stores the sum of how many items of an OrderArticle are ordered as part of a GroupOrder.
|
||||||
|
@ -106,9 +105,10 @@ class GroupOrderArticle < ActiveRecord::Base
|
||||||
# See description of the ordering algorithm in the general application documentation for details.
|
# See description of the ordering algorithm in the general application documentation for details.
|
||||||
def calculate_result
|
def calculate_result
|
||||||
quantity = tolerance = 0
|
quantity = tolerance = 0
|
||||||
|
stockit = order_article.article.is_a?(StockArticle)
|
||||||
|
|
||||||
# Get total
|
# Get total
|
||||||
total = order_article.units_to_order * order_article.price.unit_quantity
|
total = stockit ? order_article.article.quantity : order_article.units_to_order * order_article.price.unit_quantity
|
||||||
logger.debug("<#{order_article.article.name}>.unitsToOrder => items ordered: #{order_article.units_to_order} => #{total}")
|
logger.debug("<#{order_article.article.name}>.unitsToOrder => items ordered: #{order_article.units_to_order} => #{total}")
|
||||||
|
|
||||||
if (total > 0)
|
if (total > 0)
|
||||||
|
|
|
@ -24,6 +24,7 @@ class Order < ActiveRecord::Base
|
||||||
has_many :ordergroups, :through => :group_orders
|
has_many :ordergroups, :through => :group_orders
|
||||||
has_one :invoice
|
has_one :invoice
|
||||||
has_many :comments, :class_name => "OrderComment", :order => "created_at"
|
has_many :comments, :class_name => "OrderComment", :order => "created_at"
|
||||||
|
has_many :stock_changes
|
||||||
belongs_to :supplier
|
belongs_to :supplier
|
||||||
belongs_to :updated_by, :class_name => "User", :foreign_key => "updated_by_user_id"
|
belongs_to :updated_by, :class_name => "User", :foreign_key => "updated_by_user_id"
|
||||||
|
|
||||||
|
@ -51,8 +52,10 @@ class Order < ActiveRecord::Base
|
||||||
|
|
||||||
def articles_for_ordering
|
def articles_for_ordering
|
||||||
if stockit?
|
if stockit?
|
||||||
Article.in_stock.all(:include => :article_category,
|
StockArticle.available.all(:include => :article_category,
|
||||||
:order => 'article_categories.name, articles.name').group_by { |a| a.article_category.name }
|
:order => 'article_categories.name, articles.name').reject{ |a|
|
||||||
|
a.quantity_available == 0
|
||||||
|
}.group_by { |a| a.article_category.name }
|
||||||
else
|
else
|
||||||
supplier.articles.available.all.group_by { |a| a.article_category.name }
|
supplier.articles.available.all.group_by { |a| a.article_category.name }
|
||||||
end
|
end
|
||||||
|
@ -196,6 +199,14 @@ class Order < ActiveRecord::Base
|
||||||
price = group_order.price * -1 # decrease! account balance
|
price = group_order.price * -1 # decrease! account balance
|
||||||
group_order.ordergroup.add_financial_transaction(price, transaction_note, user)
|
group_order.ordergroup.add_financial_transaction(price, transaction_note, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if stockit? # Decreases the quantity of stock_articles
|
||||||
|
for oa in order_articles.all(:include => :article)
|
||||||
|
oa.update_results! # Update units_to_order of order_article
|
||||||
|
stock_changes.create! :stock_article => oa.article, :quantity => oa.units_to_order*-1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
self.update_attributes! :state => 'closed', :updated_by => user
|
self.update_attributes! :state => 'closed', :updated_by => user
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -48,12 +48,15 @@ class OrderArticle < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
# Update quantity/tolerance/units_to_order from group_order_articles
|
# Update quantity/tolerance/units_to_order from group_order_articles
|
||||||
# This is only used in opened orders.
|
|
||||||
def update_results!
|
def update_results!
|
||||||
|
if order.open?
|
||||||
quantity = group_order_articles.collect(&:quantity).sum
|
quantity = group_order_articles.collect(&:quantity).sum
|
||||||
tolerance = group_order_articles.collect(&:tolerance).sum
|
tolerance = group_order_articles.collect(&:tolerance).sum
|
||||||
update_attributes(:quantity => quantity, :tolerance => tolerance,
|
update_attributes(:quantity => quantity, :tolerance => tolerance,
|
||||||
:units_to_order => calculate_units_to_order(quantity, tolerance))
|
:units_to_order => calculate_units_to_order(quantity, tolerance))
|
||||||
|
elsif order.finished?
|
||||||
|
update_attribute(:units_to_order, group_order_articles.collect(&:result).sum)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns how many units of the belonging article need to be ordered given the specified order quantity and tolerance.
|
# Returns how many units of the belonging article need to be ordered given the specified order quantity and tolerance.
|
||||||
|
|
49
app/models/stock_article.rb
Normal file
49
app/models/stock_article.rb
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
# == Schema Information
|
||||||
|
# Schema version: 20090120184410
|
||||||
|
#
|
||||||
|
# Table name: articles
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# name :string(255) default(""), not null
|
||||||
|
# supplier_id :integer default(0), not null
|
||||||
|
# article_category_id :integer default(0), not null
|
||||||
|
# unit :string(255) default(""), not null
|
||||||
|
# note :string(255)
|
||||||
|
# availability :boolean default(TRUE), not null
|
||||||
|
# manufacturer :string(255)
|
||||||
|
# origin :string(255)
|
||||||
|
# shared_updated_on :datetime
|
||||||
|
# price :decimal(, )
|
||||||
|
# tax :float
|
||||||
|
# deposit :decimal(, ) default(0.0)
|
||||||
|
# unit_quantity :integer default(1), not null
|
||||||
|
# order_number :string(255)
|
||||||
|
# created_at :datetime
|
||||||
|
# updated_at :datetime
|
||||||
|
# quantity :decimal(, ) default(0.0)
|
||||||
|
# deleted_at :datetime
|
||||||
|
# type :string(255)
|
||||||
|
#
|
||||||
|
|
||||||
|
class StockArticle < Article
|
||||||
|
has_many :stock_changes
|
||||||
|
|
||||||
|
named_scope :available, :conditions => "quantity > 0"
|
||||||
|
|
||||||
|
# Update the quantity of items in stock
|
||||||
|
def update_quantity!
|
||||||
|
update_attribute :quantity, stock_changes.collect(&:quantity).sum
|
||||||
|
end
|
||||||
|
|
||||||
|
# Check for unclosed orders and substract its ordered quantity
|
||||||
|
def quantity_available(exclude_order = nil)
|
||||||
|
available = quantity
|
||||||
|
for order in Order.stockit.all(:conditions => "state = 'open' OR state = 'finished'")
|
||||||
|
unless order == exclude_order
|
||||||
|
order_article = order.order_articles.first(:conditions => {:article_id => id})
|
||||||
|
available -= order_article.units_to_order if order_article
|
||||||
|
end
|
||||||
|
end
|
||||||
|
available
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,22 +1,22 @@
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
# Schema version: 20090119155930
|
# Schema version: 20090120184410
|
||||||
#
|
#
|
||||||
# Table name: stock_changes
|
# Table name: stock_changes
|
||||||
#
|
#
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# delivery_id :integer
|
# delivery_id :integer
|
||||||
# order_id :integer
|
# order_id :integer
|
||||||
# article_id :integer
|
# stock_article_id :integer
|
||||||
# quantity :decimal(6, 2) default(0.0)
|
# quantity :decimal(, ) default(0.0)
|
||||||
# created_at :datetime
|
# created_at :datetime
|
||||||
#
|
#
|
||||||
|
|
||||||
class StockChange < ActiveRecord::Base
|
class StockChange < ActiveRecord::Base
|
||||||
belongs_to :delivery
|
belongs_to :delivery
|
||||||
belongs_to :order
|
belongs_to :order
|
||||||
belongs_to :article
|
belongs_to :stock_article
|
||||||
|
|
||||||
validates_presence_of :article_id, :quantity
|
validates_presence_of :stock_article_id, :quantity
|
||||||
validates_numericality_of :quantity
|
validates_numericality_of :quantity
|
||||||
|
|
||||||
after_save :update_article_quantity
|
after_save :update_article_quantity
|
||||||
|
@ -25,6 +25,6 @@ class StockChange < ActiveRecord::Base
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def update_article_quantity
|
def update_article_quantity
|
||||||
article.update_quantity!
|
stock_article.update_quantity!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -26,6 +26,7 @@ class Supplier < ActiveRecord::Base
|
||||||
|
|
||||||
has_many :articles, :dependent => :destroy,
|
has_many :articles, :dependent => :destroy,
|
||||||
:include => [:article_category], :order => 'article_categories.name, articles.name'
|
:include => [:article_category], :order => 'article_categories.name, articles.name'
|
||||||
|
has_many :stock_articles
|
||||||
has_many :orders
|
has_many :orders
|
||||||
has_many :deliveries
|
has_many :deliveries
|
||||||
has_many :invoices
|
has_many :invoices
|
||||||
|
|
34
app/views/deliveries/_new_stock_article.html.haml
Normal file
34
app/views/deliveries/_new_stock_article.html.haml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
- remote_form_for stock_article, :url => add_stock_article_supplier_deliveries_path(@supplier) do |form|
|
||||||
|
= form.error_messages
|
||||||
|
|
||||||
|
%p
|
||||||
|
remote_link_to "Artikel aus dem Katalog wählen"...
|
||||||
|
%p
|
||||||
|
= form.label :name
|
||||||
|
%br/
|
||||||
|
= form.text_field :name
|
||||||
|
%p
|
||||||
|
= form.label :unit
|
||||||
|
%br/
|
||||||
|
= form.text_field :unit
|
||||||
|
%p
|
||||||
|
= form.label :note
|
||||||
|
%br/
|
||||||
|
= form.text_field :note
|
||||||
|
%p
|
||||||
|
= form.label :price
|
||||||
|
%br/
|
||||||
|
= form.text_field :price
|
||||||
|
%p
|
||||||
|
= form.label :tax
|
||||||
|
%br/
|
||||||
|
= form.text_field :tax, :value => (stock_article.tax || 7.0)
|
||||||
|
%p
|
||||||
|
= form.label :deposit
|
||||||
|
%br/
|
||||||
|
= form.text_field :deposit
|
||||||
|
%p
|
||||||
|
Kategorie:
|
||||||
|
= form.select :article_category, ArticleCategory.all(:order => 'name').collect { |c| [c.name, c.id] }
|
||||||
|
%p
|
||||||
|
= submit_tag "Artikel speichern"
|
|
@ -1,6 +1,9 @@
|
||||||
%p
|
%p
|
||||||
- fields_for "delivery[stock_change_attributes][]", stock_change do |form|
|
- fields_for "delivery[stock_change_attributes][]", stock_change do |form|
|
||||||
= form.select :article_id, articles_for_select(@supplier), :prompt => " -- Artikel auswählen -- "
|
= form.hidden_field :stock_article_id
|
||||||
Menge
|
Menge
|
||||||
= form.text_field :quantity, :size => 5, :autocomplete => 'off'
|
= form.text_field :quantity, :size => 5, :autocomplete => 'off'
|
||||||
= link_to_function "Löschen", "$(this).up('p').remove()"
|
- article = stock_change.stock_article
|
||||||
|
%b= article.name
|
||||||
|
= "(#{number_to_currency(article.price)} / #{article.unit})"
|
||||||
|
//= link_to_function "Löschen", "$(this).up('p').remove()"
|
|
@ -1,4 +1,27 @@
|
||||||
- title "Neue Lieferung von #{@supplier.name}"
|
- title "Neue Lieferung von #{@supplier.name}"
|
||||||
|
|
||||||
- render :layout => 'form' do
|
.left_column
|
||||||
|
- form_for([@supplier,@delivery]) do |f|
|
||||||
|
.box_title
|
||||||
|
%h2 Lieferung anlegen
|
||||||
|
.column_content
|
||||||
|
= f.error_messages
|
||||||
|
= f.hidden_field :supplier_id
|
||||||
|
%p
|
||||||
|
%b= f.label :delivered_on
|
||||||
|
= f.date_select :delivered_on
|
||||||
|
%h2 Lagerartikel des Lieferanten
|
||||||
|
#stock_changes
|
||||||
= render :partial => 'stock_change', :collection => @delivery.stock_changes
|
= render :partial => 'stock_change', :collection => @delivery.stock_changes
|
||||||
|
%p
|
||||||
|
= f.submit "Lieferung anlegen"
|
||||||
|
|
||||||
|
.right_column{:style => "width:35em;"}
|
||||||
|
.box_title
|
||||||
|
%h2 Neuen Lagerartikel anlegen
|
||||||
|
.column_content
|
||||||
|
#new_stock_article
|
||||||
|
= render :partial => 'new_stock_article', :locals => {:stock_article => @supplier.stock_articles.build}
|
||||||
|
|
||||||
|
%p{:style => "clear:both"}
|
||||||
|
= link_to 'Zurück', supplier_deliveries_path(@supplier)
|
||||||
|
|
|
@ -16,10 +16,10 @@
|
||||||
%th Artikel
|
%th Artikel
|
||||||
%th Einheit
|
%th Einheit
|
||||||
%th Menge
|
%th Menge
|
||||||
- for stock_change in @delivery.stock_changes.find :all, :include => :article
|
- for stock_change in @delivery.stock_changes.find :all, :include => :stock_article
|
||||||
%tr
|
%tr
|
||||||
%td= stock_change.article.name
|
%td= stock_change.stock_article.name
|
||||||
%td= stock_change.article.unit
|
%td= stock_change.stock_article.unit
|
||||||
%td= stock_change.quantity
|
%td= stock_change.quantity
|
||||||
|
|
||||||
%br/
|
%br/
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
%td{:id => "group_order_article_#{group_order_article.id}_quantity"}
|
%td{:id => "group_order_article_#{group_order_article.id}_quantity"}
|
||||||
= group_order_article.result
|
= group_order_article.result
|
||||||
%td.currency
|
%td.currency
|
||||||
= number_to_currency(group_order_article.order_article.price.fc_price * group_order_article.quantity, :unit => "")
|
= number_to_currency(group_order_article.order_article.price.fc_price * group_order_article.result, :unit => "")
|
||||||
%td.actions{:style=>"width:1em"}
|
%td.actions{:style=>"width:1em"}
|
||||||
= remote_link_to icon(:edit), :update => 'edit_box', |
|
= remote_link_to icon(:edit), :update => 'edit_box', |
|
||||||
:url => {:action => 'edit_group_order_article', :id => group_order_article}, |
|
:url => {:action => 'edit_group_order_article', :id => group_order_article}, |
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
%h2 Zusammenfassung
|
%h2 Zusammenfassung
|
||||||
.column_content#summary
|
.column_content#summary
|
||||||
= render :partial => "summary", :locals => {:order => @order}
|
= render :partial => "summary", :locals => {:order => @order}
|
||||||
|
|
||||||
|
- unless @order.stockit?
|
||||||
.left_column{:style => 'width: 24em'}
|
.left_column{:style => 'width: 24em'}
|
||||||
.box_title
|
.box_title
|
||||||
%h2 Rechnung
|
%h2 Rechnung
|
||||||
|
|
48
app/views/ordering/_order_head.haml
Normal file
48
app/views/ordering/_order_head.haml
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
- title "Bestellen"
|
||||||
|
|
||||||
|
.left_column{:style => "width:49em"}
|
||||||
|
.box_title
|
||||||
|
%h2=h @order.name
|
||||||
|
.column_content
|
||||||
|
%table
|
||||||
|
%tr{:valign => "top"}
|
||||||
|
%td{:width => "60%"}
|
||||||
|
%p
|
||||||
|
%b Lieferant:
|
||||||
|
=h @order.name
|
||||||
|
%p
|
||||||
|
%b Ende:
|
||||||
|
=h format_time(@order.ends)
|
||||||
|
- if @group_order && @group_order.updated_by
|
||||||
|
%p
|
||||||
|
%b Zuletzt bestellt:
|
||||||
|
=h @group_order.updated_by.nick if @group_order.updated_by
|
||||||
|
= "(#{format_time(@group_order.updated_on)})"
|
||||||
|
%p
|
||||||
|
%b Verfügbares Guthaben:
|
||||||
|
= number_to_currency(@availableFunds)
|
||||||
|
%td
|
||||||
|
- unless @order.note.empty?
|
||||||
|
%p
|
||||||
|
%b Notiz:
|
||||||
|
= simple_format(@order.note)
|
||||||
|
- unless @order.stockit? || @order.supplier.min_order_quantity.blank?
|
||||||
|
%p
|
||||||
|
%b Mindestellmenge:
|
||||||
|
=h @order.supplier.min_order_quantity
|
||||||
|
%p
|
||||||
|
%b Gesamtbestellmenge bisher:
|
||||||
|
= number_to_currency @order.sum
|
||||||
|
|
||||||
|
- orders = Order.open.reject{ |order| order == @order }
|
||||||
|
- unless orders.empty?
|
||||||
|
.right_column{:style => "width:22em"}
|
||||||
|
.box_title
|
||||||
|
%h2 Anderer Bestellungen
|
||||||
|
.column_content
|
||||||
|
%table
|
||||||
|
- for order in @other_orders
|
||||||
|
%tr
|
||||||
|
%td
|
||||||
|
= link_to_function order.name, "if (confirmSwitchOrder()) (window.location = '#{ url_for(:action => 'order', :id => order) }' )"
|
||||||
|
%td= "noch #{time_ago_in_words(order.ends)}" if order.ends
|
|
@ -1,64 +1,6 @@
|
||||||
<h1>Bestellen</h1>
|
<%= render :partial => 'order_head' %>
|
||||||
|
|
||||||
<div class="left_column" style="width:49em">
|
<div class="single_column" style="clear:both;">
|
||||||
<div class="box_title"><h2><%=h @order.name %></h2></div>
|
|
||||||
<div class="column_content">
|
|
||||||
<table>
|
|
||||||
<tr valign="top">
|
|
||||||
<td width="60%">
|
|
||||||
<p><b>Lieferant:</b> <%=h @order.name %></p>
|
|
||||||
<p><b>Ende:</b> <%=h format_time(@order.ends) %></p>
|
|
||||||
<% if @group_order && @group_order.updated_by -%>
|
|
||||||
<p><b>Zuletzt bestellt:</b> <%=h @group_order.updated_by.nick if @group_order.updated_by %> (<%= format_time(@group_order.updated_on) %>)</p>
|
|
||||||
<% end -%>
|
|
||||||
<p><b>Verfügbares Guthaben:</b> <%= number_to_currency(@availableFunds) %></p>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<% unless @order.note.empty? %>
|
|
||||||
<p>
|
|
||||||
<b>Notiz:</b>
|
|
||||||
</p>
|
|
||||||
<%= simple_format(@order.note) %>
|
|
||||||
<% end %>
|
|
||||||
<% unless @order.stockit? || @order.supplier.min_order_quantity.blank? -%>
|
|
||||||
<p>
|
|
||||||
<b>Mindestellmenge:</b>
|
|
||||||
<%=h @order.supplier.min_order_quantity %>
|
|
||||||
</p>
|
|
||||||
<% end -%>
|
|
||||||
<p>
|
|
||||||
<b>Gesamtbestellmenge bisher:</b>
|
|
||||||
<%= number_to_currency @order.sum %>
|
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<%- if !@other_orders.empty? -%>
|
|
||||||
<div class="right_column" style="width:22em">
|
|
||||||
<div class="box_title">
|
|
||||||
<h2>Andere Bestellungen</h2>
|
|
||||||
</div>
|
|
||||||
<div class="column_content">
|
|
||||||
<table>
|
|
||||||
<% for order in @other_orders -%>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<%= link_to_function order.name, "if (confirmSwitchOrder()) (window.location = '#{ url_for(:action => 'order', :id => order) }' )" %>
|
|
||||||
</td>
|
|
||||||
<td>noch <%= time_ago_in_words(order.ends) if order.ends -%></td>
|
|
||||||
</tr>
|
|
||||||
<% end -%>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<%- end -%>
|
|
||||||
|
|
||||||
<br style="clear:both" />
|
|
||||||
|
|
||||||
<div class="single_column">
|
|
||||||
<% form_tag(:action => 'saveOrder', :id => @order) do %>
|
<% form_tag(:action => 'saveOrder', :id => @order) do %>
|
||||||
<div class="box_title">
|
<div class="box_title">
|
||||||
<h2>Artikel</h2>
|
<h2>Artikel</h2>
|
||||||
|
@ -70,13 +12,11 @@
|
||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th>Herstellerin</th>
|
<th>Herstellerin</th>
|
||||||
<th style="width:7em;"><%= @order.stockit? ? "im Lager" : "Gebinde" -%></th>
|
<th style="width:7em;">Gebinde</th>
|
||||||
<th style="width:4.5em;">Preis</th>
|
<th style="width:4.5em;">Preis</th>
|
||||||
<th id="col_packages"><acronym title="insgesamt bestellte Gebinde">Best</acronym></th>
|
<th id="col_packages"><acronym title="insgesamt bestellte Gebinde">Best</acronym></th>
|
||||||
<th id="col_required">Menge</th>
|
<th id="col_required">Menge</th>
|
||||||
<% unless @order.stockit? -%>
|
|
||||||
<th id="col_tolerance">Toleranz</th>
|
<th id="col_tolerance">Toleranz</th>
|
||||||
<% end -%>
|
|
||||||
<th>Summe</th>
|
<th>Summe</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -168,7 +108,7 @@
|
||||||
//<![CDATA[
|
//<![CDATA[
|
||||||
// preset data
|
// preset data
|
||||||
<% for i in 0...@price.size -%>
|
<% for i in 0...@price.size -%>
|
||||||
addData(<%= @price[i] %>, <%= @unit[i] %>, <%= @price[i] * (@tolerance[i] + @quantity[i])%>, <%= @others_quantity[i] %>, <%= @others_tolerance[i] %>, <%= @used_quantity[i] %>);
|
addData(<%= @price[i] %>, <%= @unit[i] %>, <%= @price[i] * (@tolerance[i] + @quantity[i])%>, <%= @others_quantity[i] %>, <%= @others_tolerance[i] %>, <%= @used_quantity[i] %>, 0);
|
||||||
<% end -%>
|
<% end -%>
|
||||||
setGroupBalance(<%= @availableFunds %>);
|
setGroupBalance(<%= @availableFunds %>);
|
||||||
|
|
||||||
|
|
98
app/views/ordering/stock_order.html.haml
Normal file
98
app/views/ordering/stock_order.html.haml
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
= render :partial => 'order_head'
|
||||||
|
|
||||||
|
.single_column{:style => 'clear:both'}
|
||||||
|
- form_tag(:action => 'saveOrder', :id => @order) do
|
||||||
|
.box_title
|
||||||
|
%h2 Anderer Bestellungen
|
||||||
|
.column_content
|
||||||
|
%table#order.list
|
||||||
|
%thead
|
||||||
|
%tr
|
||||||
|
%th Name
|
||||||
|
%th
|
||||||
|
%th Herstellerin
|
||||||
|
%th Lieferantin
|
||||||
|
%th{:style => "width:5em;"} Einheit
|
||||||
|
%th{:style => "width:4.5em;"} Preis
|
||||||
|
%th Verfügbar
|
||||||
|
%th#col_required Menge
|
||||||
|
%th Summe
|
||||||
|
%tbody
|
||||||
|
- total = 0
|
||||||
|
- i = 0
|
||||||
|
- for category_name, order_articles in @articles_grouped_by_category
|
||||||
|
%tr{:style => "background-color:#EFEFEF"}
|
||||||
|
%td{:style => "text-align:left"}
|
||||||
|
%b=h category_name
|
||||||
|
%td{:colspan => "9"}
|
||||||
|
- for order_article in order_articles
|
||||||
|
- article_total = @price[i] * @quantity[i]
|
||||||
|
- total += article_total
|
||||||
|
%tr{:class => cycle('even', 'odd', :name => 'articles'), :valign => "top"}
|
||||||
|
%td.name
|
||||||
|
= order_article.article.name
|
||||||
|
- unless order_article.article.note.blank?
|
||||||
|
= image_tag "lamp_grey.png", {:alt => _("Show note"), :size => "15x16", :border => "0", :onmouseover => "$('note_#{i}').show();", :onmouseout => "$('note_#{i}').hide();" }
|
||||||
|
%td=h order_article.article.origin
|
||||||
|
%td=h truncate order_article.article.manufacturer, :length => 11
|
||||||
|
%td=h truncate order_article.article.supplier.name, :length => 11
|
||||||
|
%td=h order_article.article.unit
|
||||||
|
%td= number_to_currency @price[i]
|
||||||
|
%td= @quantity_available[i]
|
||||||
|
%td{:style => "text-align:right;"}
|
||||||
|
= hidden_field_tag "ordered[#{order_article.id}][quantity]", @quantity[i], :id => "q_#{i}", :size => "2"
|
||||||
|
%span.used{:id => "q_used_#{i}"}= @used_quantity[i]
|
||||||
|
%span.total= "(<span id='q_total_#{i}'>#{@quantity[i] + @others_quantity[i]}</span>)"
|
||||||
|
= button_to_function('+', "increaseStockQuantity(#{i})")
|
||||||
|
= button_to_function('-', "decreaseStockQuantity(#{i})")
|
||||||
|
|
||||||
|
%td{:id => "td_price_#{i}", :style => "text-align:right; padding-right:10px; width:4em"}
|
||||||
|
%span{:id => "price_#{i}_display"}= number_to_currency(article_total, :unit => "")
|
||||||
|
€
|
||||||
|
- unless order_article.article.note.blank?
|
||||||
|
%tr.note{:id => "note_#{i}", :style => "display:none"}
|
||||||
|
%td{:colspan => "10"}
|
||||||
|
=h order_article.article.note
|
||||||
|
|
|
||||||
|
=h order_article.article.manufacturer
|
||||||
|
|
||||||
|
- i = i + 1
|
||||||
|
%tfoot
|
||||||
|
%tr
|
||||||
|
%td{:colspan => "5"}
|
||||||
|
%td.currency{:colspan => "3"}
|
||||||
|
Gesamtbetrag:
|
||||||
|
%span#total_price= total
|
||||||
|
€
|
||||||
|
%tr
|
||||||
|
%td{:colspan => "5"}
|
||||||
|
%td.currency{:colspan => "3"}
|
||||||
|
Verfügbares Guthaben:
|
||||||
|
= number_to_currency @availableFunds
|
||||||
|
%tr
|
||||||
|
%td{:colspan => "5"}
|
||||||
|
%td.currency{:colspan => "3"}
|
||||||
|
Neuer Kontostand:
|
||||||
|
%strong
|
||||||
|
%span#new_balance= @ordergroup.account_balance - total
|
||||||
|
€
|
||||||
|
%tr
|
||||||
|
%td{:style => "text-align:left;"}= link_to_top
|
||||||
|
%td{:colspan => "4"}
|
||||||
|
%td{:colspan => "3", :style => "text-align:right;"}
|
||||||
|
%span{:style => "font-size:1.2em"}= submit_tag("Bestellung speichern", :id => 'submit_button' )
|
||||||
|
|
|
||||||
|
= link_to "Abbrechen", :controller => 'ordering'
|
||||||
|
|
||||||
|
= hidden_field_tag "total_balance", @ordergroup.account_balance - total, :id => "total_balance"
|
||||||
|
= hidden_field_tag "version", @version
|
||||||
|
|
||||||
|
%script{:type => "text/" + "javascript"}
|
||||||
|
// preset data
|
||||||
|
- for i in 0...@price.size
|
||||||
|
= "addData(#{@price[i]}, 1, #{@price[i] * @quantity[i]}, #{@others_quantity[i]}, 0, #{@used_quantity[i]}, #{@quantity_available[i]});"
|
||||||
|
= "setGroupBalance(#{@availableFunds});"
|
||||||
|
// localization
|
||||||
|
setDecimalSeparator(",");
|
||||||
|
// initialize javascript
|
||||||
|
updateBalance();
|
|
@ -18,6 +18,7 @@
|
||||||
%th Einheit
|
%th Einheit
|
||||||
%th Preis
|
%th Preis
|
||||||
%th Lieferant
|
%th Lieferant
|
||||||
|
%th Kategorie
|
||||||
%tbody
|
%tbody
|
||||||
- for article in @articles
|
- for article in @articles
|
||||||
%tr{:class => cycle("even", "odd")}
|
%tr{:class => cycle("even", "odd")}
|
||||||
|
@ -26,3 +27,4 @@
|
||||||
%td= article.unit
|
%td= article.unit
|
||||||
%td= article.price
|
%td= article.price
|
||||||
%td= link_to article.supplier.name, article.supplier
|
%td= link_to article.supplier.name, article.supplier
|
||||||
|
%td= article.article_category.name
|
||||||
|
|
|
@ -126,6 +126,8 @@ de:
|
||||||
article:
|
article:
|
||||||
price: Nettopreis
|
price: Nettopreis
|
||||||
gross_price: Bruttopreis
|
gross_price: Bruttopreis
|
||||||
|
stock_article:
|
||||||
|
price: Nettopreis
|
||||||
user:
|
user:
|
||||||
password: Passwort
|
password: Passwort
|
||||||
first_name: Vorname
|
first_name: Vorname
|
|
@ -4,8 +4,6 @@ ActionController::Routing::Routes.draw do |map|
|
||||||
map.my_tasks '/home/tasks', :controller => 'tasks', :action => 'myTasks'
|
map.my_tasks '/home/tasks', :controller => 'tasks', :action => 'myTasks'
|
||||||
|
|
||||||
map.resources :orders, :member => { :finish => :post, :add_comment => :post }
|
map.resources :orders, :member => { :finish => :post, :add_comment => :post }
|
||||||
map.resources :stock_orders, :member => { :finish => :post, :add_comment => :post },
|
|
||||||
:controller => 'orders'
|
|
||||||
|
|
||||||
map.resources :messages, :only => [:index, :show, :new, :create],
|
map.resources :messages, :only => [:index, :show, :new, :create],
|
||||||
:member => { :reply => :get, :user => :get, :group => :get }
|
:member => { :reply => :get, :user => :get, :group => :get }
|
||||||
|
@ -22,7 +20,8 @@ ActionController::Routing::Routes.draw do |map|
|
||||||
end
|
end
|
||||||
|
|
||||||
map.resources :suppliers, :collection => { :shared_suppliers => :get } do |suppliers|
|
map.resources :suppliers, :collection => { :shared_suppliers => :get } do |suppliers|
|
||||||
suppliers.resources :deliveries, :member => { :drop_stock_change => :post }
|
suppliers.resources :deliveries, :member => { :drop_stock_change => :post },
|
||||||
|
:collection => {:add_stock_article => :post}
|
||||||
suppliers.resources :articles,
|
suppliers.resources :articles,
|
||||||
:collection => { :update_selected => :post, :edit_all => :get, :update_all => :post,
|
:collection => { :update_selected => :post, :edit_all => :get, :update_all => :post,
|
||||||
:upload => :get, :parse_upload => :post, :create_from_upload => :post,
|
:upload => :get, :parse_upload => :post, :create_from_upload => :post,
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
class CreateInvoices < ActiveRecord::Migration
|
|
||||||
def self.up
|
|
||||||
create_table :invoices do |t|
|
|
||||||
t.integer :supplier_id
|
|
||||||
t.integer :delivery_id
|
|
||||||
t.string :number
|
|
||||||
t.date :date
|
|
||||||
t.date :paid_on
|
|
||||||
t.text :note
|
|
||||||
t.decimal :amount, :null => false, :precision => 8, :scale => 2, :default => 0.0
|
|
||||||
|
|
||||||
t.timestamps
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.down
|
|
||||||
drop_table :invoices
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,13 +0,0 @@
|
||||||
class CreateDeliveries < ActiveRecord::Migration
|
|
||||||
def self.up
|
|
||||||
create_table :deliveries do |t|
|
|
||||||
t.integer :supplier_id
|
|
||||||
t.date :delivered_on
|
|
||||||
t.datetime :created_at
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.down
|
|
||||||
drop_table :deliveries
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,14 +0,0 @@
|
||||||
class CreateWorkgroups < ActiveRecord::Migration
|
|
||||||
def self.up
|
|
||||||
# Migrate all groups to workgroups
|
|
||||||
Group.find(:all, :conditions => { :type => "" }).each do |workgroup|
|
|
||||||
workgroup.update_attribute(:type, "Workgroup")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.down
|
|
||||||
Group.find(:all, :conditions => { :type => "Workgroup" }).each do |workgroup|
|
|
||||||
workgroup.update_attribute(:type, "")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,16 +0,0 @@
|
||||||
class RenameOrdergroups < ActiveRecord::Migration
|
|
||||||
def self.up
|
|
||||||
rename_column :financial_transactions, :order_group_id, :ordergroup_id
|
|
||||||
rename_column :group_orders, :order_group_id, :ordergroup_id
|
|
||||||
rename_column :tasks, :group_id, :workgroup_id
|
|
||||||
remove_index :group_orders, :name => "index_group_orders_on_order_group_id_and_order_id"
|
|
||||||
add_index :group_orders, [:ordergroup_id, :order_id], :unique => true
|
|
||||||
|
|
||||||
Group.find(:all, :conditions => { :type => "OrderGroup" }).each do |ordergroup|
|
|
||||||
ordergroup.update_attribute(:type, "Ordergroup")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.down
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,20 +0,0 @@
|
||||||
class RefactorMessaging < ActiveRecord::Migration
|
|
||||||
def self.up
|
|
||||||
|
|
||||||
drop_table :messages
|
|
||||||
|
|
||||||
create_table :messages do |t|
|
|
||||||
t.references :sender
|
|
||||||
t.text :recipients_ids
|
|
||||||
t.string :subject, :null => false
|
|
||||||
t.text :body
|
|
||||||
t.integer :email_state, :default => 0, :null => false
|
|
||||||
t.boolean :private, :default => false
|
|
||||||
t.datetime :created_at
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def self.down
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,17 +0,0 @@
|
||||||
class CreateStockChanges < ActiveRecord::Migration
|
|
||||||
def self.up
|
|
||||||
create_table :stock_changes do |t|
|
|
||||||
t.references :delivery
|
|
||||||
t.references :order
|
|
||||||
t.references :article
|
|
||||||
t.decimal :quantity, :precision => 6, :scale => 2, :default => 0.0
|
|
||||||
t.datetime :created_at
|
|
||||||
end
|
|
||||||
|
|
||||||
add_column :articles, :quantity, :decimal, :precision => 6, :scale => 2, :default => 0.0
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.down
|
|
||||||
drop_table :stock_changes
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,11 +0,0 @@
|
||||||
class ActsAsParanoid < ActiveRecord::Migration
|
|
||||||
def self.up
|
|
||||||
add_column :suppliers, :deleted_at, :datetime
|
|
||||||
add_column :articles, :deleted_at, :datetime
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.down
|
|
||||||
remove_column :suppliers, :deleted_at
|
|
||||||
remove_column :articles, :deleted_at
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -3,9 +3,41 @@ class RefactorOrderLogic < ActiveRecord::Migration
|
||||||
# TODO: Combine migrations since foodsoft3-development into one file
|
# TODO: Combine migrations since foodsoft3-development into one file
|
||||||
# and try to build a migration path from old data.
|
# and try to build a migration path from old data.
|
||||||
|
|
||||||
|
# # == Message
|
||||||
|
# drop_table :messages
|
||||||
|
# create_table :messages do |t|
|
||||||
|
# t.references :sender
|
||||||
|
# t.text :recipients_ids
|
||||||
|
# t.string :subject, :null => false
|
||||||
|
# t.text :body
|
||||||
|
# t.integer :email_state, :default => 0, :null => false
|
||||||
|
# t.boolean :private, :default => false
|
||||||
|
# t.datetime :created_at
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# # Acts_as_paranoid
|
||||||
|
# add_column :suppliers, :deleted_at, :datetime
|
||||||
|
# add_column :articles, :deleted_at, :datetime
|
||||||
|
# add_column :groups, :deleted_at, :datetime
|
||||||
|
#
|
||||||
|
# # == Workgroups
|
||||||
|
# # Migrate all groups to workgroups
|
||||||
|
# Group.find(:all, :conditions => { :type => "" }).each do |workgroup|
|
||||||
|
# workgroup.update_attribute(:type, "Workgroup")
|
||||||
|
# end
|
||||||
|
#
|
||||||
# # == Ordergroups
|
# # == Ordergroups
|
||||||
# add_column :groups, :deleted_at, :datetime # acts_as_paranoid
|
|
||||||
# remove_column :groups, :actual_size # Useless, desposits are better stored within a transaction.note
|
# remove_column :groups, :actual_size # Useless, desposits are better stored within a transaction.note
|
||||||
|
# # rename from OrderGroup to Ordergroup
|
||||||
|
# rename_column :financial_transactions, :order_group_id, :ordergroup_id
|
||||||
|
# rename_column :group_orders, :order_group_id, :ordergroup_id
|
||||||
|
# rename_column :tasks, :group_id, :workgroup_id
|
||||||
|
# remove_index :group_orders, :name => "index_group_orders_on_order_group_id_and_order_id"
|
||||||
|
# add_index :group_orders, [:ordergroup_id, :order_id], :unique => true
|
||||||
|
#
|
||||||
|
# Group.find(:all, :conditions => { :type => "OrderGroup" }).each do |ordergroup|
|
||||||
|
# ordergroup.update_attribute(:type, "Ordergroup")
|
||||||
|
# end
|
||||||
# # move contact-infos from users to ordergroups
|
# # move contact-infos from users to ordergroups
|
||||||
# add_column :groups, :contact_person, :string
|
# add_column :groups, :contact_person, :string
|
||||||
# add_column :groups, :contact_phone, :string
|
# add_column :groups, :contact_phone, :string
|
||||||
|
@ -19,10 +51,6 @@ class RefactorOrderLogic < ActiveRecord::Migration
|
||||||
# end
|
# end
|
||||||
# remove_column :users, :address
|
# remove_column :users, :address
|
||||||
#
|
#
|
||||||
# # == Article
|
|
||||||
# rename_column :articles, :net_price, :price
|
|
||||||
# remove_column :articles, :gross_price
|
|
||||||
#
|
|
||||||
# # == Order
|
# # == Order
|
||||||
# drop_table :orders
|
# drop_table :orders
|
||||||
# drop_table :group_order_results
|
# drop_table :group_order_results
|
||||||
|
@ -41,9 +69,26 @@ class RefactorOrderLogic < ActiveRecord::Migration
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# # == Invoice
|
# # == Invoice
|
||||||
# add_column :invoices, :order_id, :integer
|
# create_table :invoices do |t|
|
||||||
# add_column :invoices, :deposit, :decimal, :precision => 8, :scale => 2, :default => 0.0, :null => false
|
# t.references :supplier
|
||||||
# add_column :invoices, :deposit_credit, :decimal, :precision => 8, :scale => 2, :default => 0.0, :null => false
|
# t.references :delivery
|
||||||
|
# t.references :order
|
||||||
|
# t.string :number
|
||||||
|
# t.date :date
|
||||||
|
# t.date :paid_on
|
||||||
|
# t.text :note
|
||||||
|
# t.decimal :amount, :null => false, :precision => 8, :scale => 2, :default => 0.0
|
||||||
|
# t.decimal :deposit, :precision => 8, :scale => 2, :default => 0.0, :null => false
|
||||||
|
# t.decimal :deposit_credit, :precision => 8, :scale => 2, :default => 0.0, :null => false
|
||||||
|
# t.timestamps
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# # == Delivery
|
||||||
|
# create_table :deliveries do |t|
|
||||||
|
# t.integer :supplier_id
|
||||||
|
# t.date :delivered_on
|
||||||
|
# t.datetime :created_at
|
||||||
|
# end
|
||||||
#
|
#
|
||||||
# # == Comment
|
# # == Comment
|
||||||
# drop_table :comments
|
# drop_table :comments
|
||||||
|
@ -54,6 +99,10 @@ class RefactorOrderLogic < ActiveRecord::Migration
|
||||||
# t.datetime :created_at
|
# t.datetime :created_at
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
|
# # == Article
|
||||||
|
# rename_column :articles, :net_price, :price
|
||||||
|
# remove_column :articles, :gross_price
|
||||||
|
#
|
||||||
# # == ArticlePrice
|
# # == ArticlePrice
|
||||||
# create_table :article_prices do |t|
|
# create_table :article_prices do |t|
|
||||||
# t.references :article
|
# t.references :article
|
||||||
|
@ -81,6 +130,22 @@ class RefactorOrderLogic < ActiveRecord::Migration
|
||||||
# # == GroupOrderArticle
|
# # == GroupOrderArticle
|
||||||
# # The total order result in ordergroup is now saved!
|
# # The total order result in ordergroup is now saved!
|
||||||
# add_column :group_order_articles, :result, :integer, :default => nil
|
# add_column :group_order_articles, :result, :integer, :default => nil
|
||||||
|
#
|
||||||
|
# # == StockArticle
|
||||||
|
# add_column :articles, :type, :string
|
||||||
|
# add_column :articles, :quantity, :integer, :default => 0
|
||||||
|
#
|
||||||
|
# # == StockChanges
|
||||||
|
# create_table :stock_changes do |t|
|
||||||
|
# t.references :delivery
|
||||||
|
# t.references :order
|
||||||
|
# t.references :stock_article
|
||||||
|
# t.integer :quantity, :default => 0
|
||||||
|
# t.datetime :created_at
|
||||||
|
# end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.down
|
def self.down
|
||||||
|
|
|
@ -46,6 +46,7 @@ ActiveRecord::Schema.define(:version => 20090119155930) do
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.decimal "quantity", :default => 0.0
|
t.decimal "quantity", :default => 0.0
|
||||||
t.datetime "deleted_at"
|
t.datetime "deleted_at"
|
||||||
|
t.string "type"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "articles", ["name", "supplier_id"], :name => "index_articles_on_name_and_supplier_id"
|
add_index "articles", ["name", "supplier_id"], :name => "index_articles_on_name_and_supplier_id"
|
||||||
|
@ -212,8 +213,8 @@ ActiveRecord::Schema.define(:version => 20090119155930) do
|
||||||
create_table "stock_changes", :force => true do |t|
|
create_table "stock_changes", :force => true do |t|
|
||||||
t.integer "delivery_id"
|
t.integer "delivery_id"
|
||||||
t.integer "order_id"
|
t.integer "order_id"
|
||||||
t.integer "article_id"
|
t.integer "stock_article_id"
|
||||||
t.decimal "quantity", :precision => 6, :scale => 2, :default => 0.0
|
t.decimal "quantity", :default => 0.0
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ var itemTotal = new Array(); // total item price
|
||||||
var quantityOthers = new Array();
|
var quantityOthers = new Array();
|
||||||
var toleranceOthers = new Array();
|
var toleranceOthers = new Array();
|
||||||
var itemsAllocated = new Array(); // how many items the group has been allocated and should definitely get
|
var itemsAllocated = new Array(); // how many items the group has been allocated and should definitely get
|
||||||
|
var quantityAvailable = new Array(); // stock_order. how many items are currently in stock
|
||||||
|
|
||||||
function setDecimalSeparator(character) {
|
function setDecimalSeparator(character) {
|
||||||
decimalSeparator = character;
|
decimalSeparator = character;
|
||||||
|
@ -25,7 +26,7 @@ function setGroupBalance(amount) {
|
||||||
groupBalance = amount;
|
groupBalance = amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addData(itemPrice, itemUnit, itemSubtotal, itemQuantityOthers, itemToleranceOthers, allocated) {
|
function addData(itemPrice, itemUnit, itemSubtotal, itemQuantityOthers, itemToleranceOthers, allocated, available) {
|
||||||
i = price.length;
|
i = price.length;
|
||||||
price[i] = itemPrice;
|
price[i] = itemPrice;
|
||||||
unit[i] = itemUnit;
|
unit[i] = itemUnit;
|
||||||
|
@ -33,6 +34,7 @@ function addData(itemPrice, itemUnit, itemSubtotal, itemQuantityOthers, itemTole
|
||||||
quantityOthers[i] = itemQuantityOthers;
|
quantityOthers[i] = itemQuantityOthers;
|
||||||
toleranceOthers[i] = itemToleranceOthers;
|
toleranceOthers[i] = itemToleranceOthers;
|
||||||
itemsAllocated[i] = allocated;
|
itemsAllocated[i] = allocated;
|
||||||
|
quantityAvailable[i] = available;
|
||||||
}
|
}
|
||||||
|
|
||||||
function increaseQuantity(item) {
|
function increaseQuantity(item) {
|
||||||
|
@ -103,6 +105,46 @@ function update(item, quantity, tolerance) {
|
||||||
updateBalance();
|
updateBalance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function increaseStockQuantity(item) {
|
||||||
|
value = Number($('q_' + item).value) + 1;
|
||||||
|
if (value <= quantityAvailable[item] - quantityOthers[item]) {
|
||||||
|
updateStockQuantity(item, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function decreaseStockQuantity(item) {
|
||||||
|
value = Number($('q_' + item).value) - 1;
|
||||||
|
if (value >= 0) {
|
||||||
|
updateStockQuantity(item, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateStockQuantity(item, quantity) {
|
||||||
|
// set modification flag
|
||||||
|
modified = true
|
||||||
|
|
||||||
|
// update hidden input fields
|
||||||
|
$('q_' + item).value = quantity;
|
||||||
|
|
||||||
|
// update used/unused quantity
|
||||||
|
available = Math.max(0, quantityAvailable[item] - quantityOthers[item]);
|
||||||
|
q_used = Math.min(available, quantity);
|
||||||
|
|
||||||
|
// ensure that at least the amout of items this group has already been allocated is used
|
||||||
|
if (quantity >= itemsAllocated[item] && q_used < itemsAllocated[item]) {
|
||||||
|
q_used = itemsAllocated[item];
|
||||||
|
}
|
||||||
|
$('q_used_' + item).update(String(q_used));
|
||||||
|
$('q_total_' + item).update(String(Number(quantity) + quantityOthers[item]));
|
||||||
|
|
||||||
|
// update total price
|
||||||
|
itemTotal[item] = price[item] * (Number(quantity));
|
||||||
|
$('price_' + item + '_display').update(asMoney(itemTotal[item]));
|
||||||
|
|
||||||
|
// update balance
|
||||||
|
updateBalance();
|
||||||
|
}
|
||||||
|
|
||||||
function asMoney(amount) {
|
function asMoney(amount) {
|
||||||
return String(amount.toFixed(2)).replace(/\./, ",");
|
return String(amount.toFixed(2)).replace(/\./, ",");
|
||||||
}
|
}
|
||||||
|
|
1
test/fixtures/articles.yml
vendored
1
test/fixtures/articles.yml
vendored
|
@ -22,6 +22,7 @@
|
||||||
# updated_at :datetime
|
# updated_at :datetime
|
||||||
# quantity :decimal(, ) default(0.0)
|
# quantity :decimal(, ) default(0.0)
|
||||||
# deleted_at :datetime
|
# deleted_at :datetime
|
||||||
|
# type :string(255)
|
||||||
#
|
#
|
||||||
|
|
||||||
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
|
# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
|
||||||
|
|
6
test/fixtures/stock_changes.yml
vendored
6
test/fixtures/stock_changes.yml
vendored
|
@ -1,13 +1,13 @@
|
||||||
# == Schema Information
|
# == Schema Information
|
||||||
# Schema version: 20090119155930
|
# Schema version: 20090120184410
|
||||||
#
|
#
|
||||||
# Table name: stock_changes
|
# Table name: stock_changes
|
||||||
#
|
#
|
||||||
# id :integer not null, primary key
|
# id :integer not null, primary key
|
||||||
# delivery_id :integer
|
# delivery_id :integer
|
||||||
# order_id :integer
|
# order_id :integer
|
||||||
# article_id :integer
|
# stock_article_id :integer
|
||||||
# quantity :decimal(6, 2) default(0.0)
|
# quantity :decimal(, ) default(0.0)
|
||||||
# created_at :datetime
|
# created_at :datetime
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
8
test/unit/stock_article_test.rb
Normal file
8
test/unit/stock_article_test.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class StockArticleTest < ActiveSupport::TestCase
|
||||||
|
# Replace this with your real tests.
|
||||||
|
test "the truth" do
|
||||||
|
assert true
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue