Improved delivery-invoice-workflow.

This commit is contained in:
Benjamin Meichsner 2009-01-18 17:42:51 +01:00
parent 936e6ef69a
commit ff6b460cfc
28 changed files with 253 additions and 231 deletions

View File

@ -1,7 +1,11 @@
class ArticleCategoriesController < ApplicationController
before_filter :authenticate_article_meta
def index
@article_categories = ArticleCategory.all :order => 'name'
end
def new
@article_category = ArticleCategory.new

View File

@ -307,7 +307,6 @@ class ArticlesController < ApplicationController
# sync all articles with the external database
# renders a form with articles, which should be updated
def sync
@supplier = Supplier.find(params[:id])
# check if there is an shared_supplier
unless @supplier.shared_supplier
flash[:error]= @supplier.name + _(" ist not assigned to an external database.")

View File

@ -19,7 +19,7 @@ class Finance::InvoicesController < ApplicationController
end
def new
@invoice = Invoice.new
@invoice = Invoice.new(:supplier_id => params[:supplier_id], :delivery_id => params[:delivery_id])
respond_to do |format|
format.html # new.html.erb

View File

@ -0,0 +1,6 @@
class StockitController < ApplicationController
def index
@articles = Article.in_stock
end
end

View File

@ -1,20 +1,15 @@
class SuppliersController < ApplicationController
before_filter :authenticate_suppliers, :except => [:index, :list]
helper :deliveries
# messages
MSG_SUPPLIER_DESTOYED = "Lieferant wurde gelöscht"
MSG_SUPPLIER_UPDATED = 'Lieferant wurde aktualisiert'
MSG_SUPPLIER_CREATED = "Lieferant wurde erstellt"
def index
@suppliers = Supplier.all :order => 'name'
#@categories = ArticleCategory.all :order => 'name'
@deliveries = Delivery.recent
end
def show
@supplier = Supplier.find(params[:id])
@supplier_column_names = ["Name", "Telefon", "Telefon2", "FAX", "Email", "URL", "Kontakt", "Kundennummer", "Liefertage", "BestellHowTo", "Notiz", "Mindestbestellmenge"]
@supplier_columns = ["name", "phone", "phone2", "fax", "email", "url", "contact_person", "customer_number", "delivery_days", "order_howto", "note", "min_order_quantity"]
@deliveries = @supplier.deliveries.recent
end
# new supplier
@ -31,7 +26,7 @@ class SuppliersController < ApplicationController
def create
@supplier = Supplier.new(params[:supplier])
if @supplier.save
flash[:notice] = MSG_SUPPLIER_CREATED
flash[:notice] = "Lieferant wurde erstellt"
redirect_to suppliers_path
else
render :action => 'new'
@ -45,7 +40,7 @@ class SuppliersController < ApplicationController
def update
@supplier = Supplier.find(params[:id])
if @supplier.update_attributes(params[:supplier])
flash[:notice] = MSG_SUPPLIER_UPDATED
flash[:notice] = 'Lieferant wurde aktualisiert'
redirect_to @supplier
else
render :action => 'edit'
@ -55,7 +50,7 @@ class SuppliersController < ApplicationController
def destroy
@supplier = Supplier.find(params[:id])
@supplier.destroy
flash[:notice] = MSG_SUPPLIER_DESTOYED
flash[:notice] = "Lieferant wurde gelöscht"
redirect_to suppliers_path
rescue => e
flash[:error] = _("An error has occurred: ") + e.message

View File

@ -9,4 +9,13 @@ module DeliveriesHelper
end
end
def link_to_invoice(delivery)
if delivery.invoice
link_to number_to_currency(delivery.invoice.amount), [:finance, delivery.invoice],
:title => "Rechnung anzeigen"
else
link_to "Rechnung anlegen", new_finance_invoice_path(:supplier_id => delivery.supplier.id, :delivery_id => delivery.id)
end
end
end

View File

@ -0,0 +1,2 @@
module StockitHelper
end

View File

@ -27,7 +27,9 @@
class Article < ActiveRecord::Base
belongs_to :supplier
belongs_to :article_category
named_scope :in_stock, :conditions => "quantity > 0", :order => 'suppliers.name', :include => :supplier
validates_presence_of :name, :unit, :net_price, :tax, :deposit, :unit_quantity, :supplier_id
validates_length_of :name, :in => 4..60
validates_length_of :unit, :in => 2..15

View File

@ -12,8 +12,11 @@
class Delivery < ActiveRecord::Base
belongs_to :supplier
has_one :invoice
has_many :stock_changes
named_scope :recent, :order => 'created_at DESC', :limit => 10
validates_presence_of :supplier_id
def stock_change_attributes=(stock_change_attributes)

View File

@ -18,6 +18,7 @@
class Invoice < ActiveRecord::Base
belongs_to :supplier
belongs_to :delivery
validates_presence_of :supplier_id
validates_uniqueness_of :date, :scope => [:supplier_id]

View File

@ -0,0 +1,8 @@
- title "Artikelkategorien"
.left_column{:style => "width:50em"}
.box_title
%h2 Artikelkategorien
.column_content#categories
#category_form.box.edit_form{:style => "display:none;margin-bottom:1em;"}
#category_list= render :partial => 'article_categories/list'

View File

@ -16,7 +16,7 @@
=_ 'Change supplier:'
- form_tag do
= select_tag :switch_supplier, |
options_for_select( Supplier.all.collect {|s| [s.name, url_for(supplier_articles_path(s))] }, |
options_for_select( Supplier.all(:order => 'name').collect {|s| [s.name, url_for(supplier_articles_path(s))] }, |
url_for(supplier_articles_path(@supplier)) ), |
:onchange => "redirectTo(this)", |
:style => "font-size: 0.9em;margin-left:1em;" |

View File

@ -51,20 +51,21 @@
%td= article.deposit
%td= article.article_category.name if article.article_category
%tr
%td{:style => highlight_new(unequal_attributes, :name)}
= text_field 'article[]', 'name', :size => 0
= hidden_field 'article[]', 'shared_updated_on'
%td{:style => highlight_new(unequal_attributes, :note)}= text_field 'article[]', 'note', :size => 15
%td{:style => highlight_new(unequal_attributes, :manufacturer)}= text_field 'article[]', 'manufacturer', :size => 10
%td{:style => highlight_new(unequal_attributes, :origin)}= text_field 'article[]', 'origin', :size => 5
%td{:style => highlight_new(unequal_attributes, :unit)}= text_field 'article[]', 'unit', :size => 5
%td{:style => highlight_new(unequal_attributes, :unit_quantity)}= text_field 'article[]', 'unit_quantity', :size => 5
%td{:style => highlight_new(unequal_attributes, :net_price)}= text_field 'article[]', 'net_price', :size => 5
%td{:style => highlight_new(unequal_attributes, :tax)}= text_field 'article[]', 'tax', :size => 4
%td{:style => highlight_new(unequal_attributes, :deposit)}= text_field 'article[]', 'deposit', :size => 4
%td= select 'article[]', 'article_category_id', ArticleCategory.find(:all).collect {|a| [ a.name, a.id ] }, { :include_blank => true }
- fields_for 'articles[]', @article do |form|
%td{:style => highlight_new(unequal_attributes, :name)}
= form.text_field 'name', :size => 0
= form.hidden_field 'shared_updated_on'
%td{:style => highlight_new(unequal_attributes, :note)}= form.text_field 'note', :size => 15
%td{:style => highlight_new(unequal_attributes, :manufacturer)}= form.text_field 'manufacturer', :size => 10
%td{:style => highlight_new(unequal_attributes, :origin)}= form.text_field 'origin', :size => 5
%td{:style => highlight_new(unequal_attributes, :unit)}= form.text_field 'unit', :size => 5
%td{:style => highlight_new(unequal_attributes, :unit_quantity)}= form.text_field 'unit_quantity', :size => 5
%td{:style => highlight_new(unequal_attributes, :net_price)}= form.text_field 'net_price', :size => 5
%td{:style => highlight_new(unequal_attributes, :tax)}= form.text_field 'tax', :size => 4
%td{:style => highlight_new(unequal_attributes, :deposit)}= form.text_field 'deposit', :size => 4
%td= select 'article[]', 'article_category_id', ArticleCategory.find(:all).collect {|a| [ a.name, a.id ] }, { :include_blank => true }
%hr/
= hidden_field 'supplier', 'id'
= submit_tag 'Alle löschen/aktualisieren'
|
= link_to 'Abbrechen', :action => 'list', :id => @supplier
= link_to 'Abbrechen', supplier_articles_path(@supplier)

View File

@ -14,3 +14,5 @@
%br/
= link_to 'New delivery', new_supplier_delivery_path(@supplier)
|
= link_to "Lieferantenübersicht", suppliers_path

View File

@ -5,7 +5,10 @@
=h @delivery.supplier.name
%p
%b Delivered on:
=h @delivery.delivered_on
= @delivery.delivered_on
%p
%b Rechnungsbetrag:
= link_to_invoice(@delivery)
%h2 Artikel
%table.list{:style => "width:30em"}

View File

@ -0,0 +1,32 @@
- form_for([:finance, @invoice]) do |f|
= f.error_messages
= f.hidden_field :delivery_id
- if @invoice.delivery
%p= "Diese Rechnung ist mit einer #{link_to "Lieferung", [@invoice.supplier,@invoice.delivery]} verknüpft."
%p
= f.label :supplier_id
%br/
= f.select :supplier_id, Supplier.all.collect { |s| [s.name, s.id] }
%p
= f.label :number
%br/
= f.text_field :number
%p
= f.label :date
%br/
= f.date_select :date
%p
= f.label :paid_on
%br/
= f.date_select :paid_on, :include_blank => true
%p
= f.label :amount
%br/
= f.text_field :amount
%p
= f.label :note
%br/
= f.text_area :note
%p
= f.submit "Speichern"

View File

@ -1,36 +1,6 @@
<h1>Editing invoice</h1>
<% form_for([:finance, @invoice]) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :supplier_id %><br />
<%= f.select :supplier_id, Supplier.all.collect { |s| [s.name, s.id] } %>
</p>
<p>
<%= f.label :number %><br />
<%= f.text_field :number %>
</p>
<p>
<%= f.label :date %><br />
<%= f.date_select :date %>
</p>
<p>
<%= f.label :paid_on %><br />
<%= f.date_select :paid_on, :include_blank => true %>
</p>
<p>
<%= f.label :amount %><br />
<%= f.text_field :amount %>
</p>
<p>
<%= f.label :note %><br />
<%= f.text_area :note %>
</p>
<p>
<%= f.submit "Update" %>
</p>
<% end %>
<%= render :partial => 'form' %>
<%= link_to 'Show', [:finance, @invoice] %> |
<%= link_to 'Back', finance_invoices_path %>

View File

@ -23,7 +23,7 @@
<td><%= invoice.date %></td>
<td><%= invoice.paid_on %></td>
<td><%= invoice.amount %></td>
<td><%=h invoice.delivery_id %></td>
<td><%= link_to "Lieferung", [invoice.supplier,invoice.delivery] if invoice.delivery %></td>
<td><%=h truncate(invoice.note) %></td>
<td><%= link_to 'Show', finance_invoice_path(invoice) %></td>
<td><%= link_to 'Edit', edit_finance_invoice_path(invoice) %></td>

View File

@ -1,35 +1,4 @@
<h1>New invoice</h1>
<% title "Neue Rechnung anlegen" -%>
<% form_for([:finance, @invoice]) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :supplier_id %><br />
<%= f.select :supplier_id, Supplier.all.collect { |s| [s.name, s.id] } %>
</p>
<p>
<%= f.label :number %><br />
<%= f.text_field :number %>
</p>
<p>
<%= f.label :date %><br />
<%= f.date_select :date %>
</p>
<p>
<%= f.label :paid_on %><br />
<%= f.date_select :paid_on, :include_blank => true %>
</p>
<p>
<%= f.label :amount %><br />
<%= f.text_field :amount %>
</p>
<p>
<%= f.label :note %><br />
<%= f.text_area :note %>
</p>
<p>
<%= f.submit "Create" %>
</p>
<% end %>
<%= link_to 'Back', finance_invoices_path %>
<%= render :partial => 'form' %>
<%= link_to 'Zurück', finance_invoices_path %>

View File

@ -1,40 +0,0 @@
<% title "Show invoice #{@invoice.number}" %>
<p>
<b>Supplier:</b>
<%=h @invoice.supplier.name %>
</p>
<p>
<b>Delivery:</b>
<%=h @invoice.delivery_id %>
</p>
<p>
<b>Number:</b>
<%=h @invoice.number %>
</p>
<p>
<b>Date:</b>
<%=h @invoice.date %>
</p>
<p>
<b>Paid on:</b>
<%=h @invoice.paid_on %>
</p>
<p>
<b>Amount:</b>
<%=h @invoice.amount %>
</p>
<p>
<b>Note:</b>
<%=h @invoice.note %>
</p>
<%= link_to 'Edit', edit_finance_invoice_path(@invoice) %> |
<%= link_to 'Back', finance_invoices_path %>

View File

@ -0,0 +1,28 @@
- title "Rechnung #{@invoice.number}"
%p
%b Supplier:
=h @invoice.supplier.name
- if @invoice.delivery
%p
%b Delivery:
="Diese Rechnung ist mit einer #{link_to "Lieferung", [@invoice.supplier,@invoice.delivery]} verknüpft."
%p
%b Number:
=h @invoice.number
%p
%b Date:
=h @invoice.date
%p
%b Paid on:
=h @invoice.paid_on
%p
%b Amount:
=h @invoice.amount
%p
%b Note:
=h @invoice.note
= link_to 'Edit', edit_finance_invoice_path(@invoice)
|
= link_to 'Back', finance_invoices_path

View File

@ -23,12 +23,14 @@
{ :name => "Manage orders", :url => "/orders", :access? => (u.role_orders?) }
]
},
{ :name => "Articles", :url => "/suppliers", :active => ["articles", "suppliers", "deliveries", "article_categories"],
{ :name => "Articles", :url => "/suppliers",
:active => ["articles", "suppliers", "deliveries", "article_categories", "stockit"],
:access? => (u.role_article_meta? || u.role_suppliers?),
:subnav => [
{ :name => "Show articles", :url => "/suppliers" },
{ :name => "Categories", :url => "/suppliers" },
{ :name => "Suppliers", :url => suppliers_path, :access? => (u.role_suppliers?) }
{ :name => "Artikel", :url => supplier_articles_path(Supplier.first) },
{ :name => "Lager", :url => "/stockit" },
{ :name => "Lieferantinnen", :url => suppliers_path, :access? => (u.role_suppliers?) },
{ :name => "Kategorien", :url => "/article_categories"}
]
},
{ :name => "Finance", :url => "/finance",

View File

@ -1,17 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>ArticleCategories: <%= controller.action_name %></title>
<%= stylesheet_link_tag 'scaffold' %>
</head>
<body>
<p style="color: green"><%= flash[:notice] %></p>
<%= yield %>
</body>
</html>

View File

@ -1,17 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Workgroups: <%= controller.action_name %></title>
<%= stylesheet_link_tag 'scaffold' %>
</head>
<body>
<p style="color: green"><%= flash[:notice] %></p>
<%= yield %>
</body>
</html>

View File

@ -0,0 +1,27 @@
- title "Lagerübersicht"
%p
- form_tag do
Neue Lieferung anlegen für:
= select_tag :new_delivery, |
options_for_select([" -- Lieferantin wählen --", ""] + |
Supplier.find(:all).collect {|s| [ s.name, url_for(new_supplier_delivery_path(s))] }), |
:onchange => "redirectTo(this)", :style => "font-size: 0.9em;margin-left:1em;" |
%p
%table.list
%thead
%tr
%th Artikel
%th Menge
%th Einheit
%th Preis
%th Lieferant
%tbody
- for article in @articles
%tr{:class => cycle("even", "odd")}
%td=h article.name
%td= article.quantity
%td= article.unit
%td= article.net_price
%td= link_to article.supplier.name, article.supplier

View File

@ -28,7 +28,15 @@
.right_column{:style => "width:47%"}
.box_title
%h2 Artikelkategorien
.column_content#categories
#category_form.box.edit_form{:style => "display:none;margin-bottom:1em;"}
#category_list= render :partial => 'article_categories/list'
%h2 Letzte Lieferungen
.column_content
%table{:style => "width:50em"}
%tr
%th Datum
%th Betrag
%th Lieferant
- for delivery in @deliveries
%tr
%td= link_to delivery.delivered_on, [delivery.supplier, delivery]
%td= link_to_invoice(delivery)
%td=h delivery.supplier.name

View File

@ -1,54 +1,71 @@
%h1
Lieferantin
=h @supplier.name
- if shared_supplier = @supplier.shared_supplier
%p
%strong Der Lieferant ist mit der externen ArtikleDatenbank verknüpft.
- title "Lieferantin #{h(@supplier.name)}"
%table{:style => "width:40em"}
%tr
%td Name:
%td{:style => "font-weight:bold"}=h @supplier.name
%tr
%td Adresse:
%td{:style => "font-weight:bold"}=h @supplier.address
%tr
%td Telefon:
%td{:style => "font-weight:bold"}=h @supplier.phone
%tr
%td Telefon2:
%td{:style => "font-weight:bold"}=h @supplier.phone2
%tr
%td FAX:
%td{:style => "font-weight:bold"}=h @supplier.fax
%tr
%td Hompage:
%td{:style => "font-weight:bold"}=h @supplier.url
%tr
%td Kontakt-Person:
%td{:style => "font-weight:bold"}=h @supplier.contact_person
%tr
%td Kundennummer:
%td{:style => "font-weight:bold"}=h @supplier.customer_number
%tr
%td Liefertage:
%td{:style => "font-weight:bold"}=h @supplier.delivery_days
%tr
%td BestellHowTo:
%td{:style => "font-weight:bold"}=h @supplier.order_howto
%tr
%td Notiz:
%td{:style => "font-weight:bold"}=h @supplier.note
%tr
%td Liefertage:
%td{:style => "font-weight:bold"}=h @supplier.delivery_days
%tr
%td Mindestbestellmenge:
%td{:style => "font-weight:bold"}=h @supplier.min_order_quantity
%br/
- if @current_user.role_suppliers?
= link_to 'Bearbeiten', edit_supplier_path(@supplier)
|
= link_to 'Löschen', @supplier, :confirm => 'Bist Du sicher?', :method => :delete
|
= link_to 'zurück', suppliers_path
.left_column{:style => "width:45%"}
.box_title
%h2=h @supplier.name
.column_content
- if shared_supplier = @supplier.shared_supplier
%p
%strong Der Lieferant ist mit der externen ArtikleDatenbank verknüpft.
%table{:style => "width:40em"}
%tr
%td Adresse:
%td{:style => "font-weight:bold"}=h @supplier.address
%tr
%td Telefon:
%td{:style => "font-weight:bold"}=h @supplier.phone
%tr
%td Telefon2:
%td{:style => "font-weight:bold"}=h @supplier.phone2
%tr
%td FAX:
%td{:style => "font-weight:bold"}=h @supplier.fax
%tr
%td Hompage:
%td{:style => "font-weight:bold"}=h @supplier.url
%tr
%td Kontakt-Person:
%td{:style => "font-weight:bold"}=h @supplier.contact_person
%tr
%td Kundennummer:
%td{:style => "font-weight:bold"}=h @supplier.customer_number
%tr
%td Liefertage:
%td{:style => "font-weight:bold"}=h @supplier.delivery_days
%tr
%td BestellHowTo:
%td{:style => "font-weight:bold"}=h @supplier.order_howto
%tr
%td Notiz:
%td{:style => "font-weight:bold"}=h @supplier.note
%tr
%td Liefertage:
%td{:style => "font-weight:bold"}=h @supplier.delivery_days
%tr
%td Mindestbestellmenge:
%td{:style => "font-weight:bold"}=h @supplier.min_order_quantity
%br/
- if @current_user.role_suppliers?
= link_to 'Bearbeiten', edit_supplier_path(@supplier)
|
= link_to 'Löschen', @supplier, :confirm => 'Bist Du sicher?', :method => :delete
|
= link_to 'zurück', suppliers_path
.right_column{:style => "width:45%"}
.box_title
%h2 Letzte Lieferungen
.column_content
%table
%tr
%th Datum
%th Betrag
- for delivery in @deliveries
%tr
%td= link_to delivery.delivered_on, [@supplier, delivery]
%td= link_to_invoice(delivery)
%p
= link_to "Neue Lieferung anlegen", new_supplier_delivery_path(@supplier)
|
= link_to "Zeige alle Lieferungen", supplier_deliveries_path(@supplier)

View File

@ -0,0 +1,8 @@
require 'test_helper'
class StockitControllerTest < ActionController::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end