diff --git a/app/controllers/finance/balancing_controller.rb b/app/controllers/finance/balancing_controller.rb index 17b3a4a4..016199da 100644 --- a/app/controllers/finance/balancing_controller.rb +++ b/app/controllers/finance/balancing_controller.rb @@ -60,6 +60,19 @@ class Finance::BalancingController < Finance::BaseController end end + def edit_transport + @order = Order.find(params[:id]) + render :layout => false + end + + def update_transport + @order = Order.find(params[:id]) + @order.update_attributes! params[:order] + redirect_to new_finance_order_path(order_id: @order.id) + rescue => error + redirect_to new_finance_order_path(order_id: @order.id), alert: t('errors.general_msg', msg: error.message) + end + # before the order will booked, a view lists all Ordergroups and its order_prices def confirm @order = Order.find(params[:id]) diff --git a/app/models/group_order.rb b/app/models/group_order.rb index eace896e..b29322ce 100644 --- a/app/models/group_order.rb +++ b/app/models/group_order.rb @@ -94,4 +94,9 @@ class GroupOrder < ApplicationRecord ordergroup ? ordergroup.name : I18n.t('model.group_order.stock_ordergroup_name', :user => updated_by.try(:name) || '?') end + def total + return price + transport if transport + price + end + end diff --git a/app/models/order.rb b/app/models/order.rb index ed160391..8aecc66d 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,7 +1,7 @@ # encoding: utf-8 # class Order < ApplicationRecord - attr_accessor :ignore_warnings + attr_accessor :ignore_warnings, :transport_distribution # Associations has_many :order_articles, :dependent => :destroy @@ -17,6 +17,7 @@ class Order < ApplicationRecord belongs_to :created_by, :class_name => 'User', :foreign_key => 'created_by_user_id' enum end_action: { no_end_action: 0, auto_close: 1, auto_close_and_send: 2, auto_close_and_send_min_quantity: 3 } + enum transport_distribution: [:skip, :ordergroup, :price, :articles] # Validations validates_presence_of :starts @@ -25,6 +26,7 @@ class Order < ApplicationRecord # Callbacks after_save :save_order_articles, :update_price_of_group_orders + before_validation :distribute_transport # Finders scope :started, -> { where('starts <= ?', Time.now) } @@ -258,7 +260,7 @@ class Order < ApplicationRecord transaction do # Start updating account balances for group_order in gos if group_order.ordergroup - price = group_order.price * -1 # decrease! account balance + price = group_order.total * -1 # decrease! account balance group_order.ordergroup.add_financial_transaction!(price, transaction_note, user, transaction_type, nil, group_order) end end @@ -347,6 +349,27 @@ class Order < ApplicationRecord private + def distribute_transport + return unless group_orders.any? + case transport_distribution.try(&:to_i) + when Order.transport_distributions[:ordergroup] then + amount = transport / group_orders.size + group_orders.each do |go| + go.transport = amount.ceil(2) + end + when Order.transport_distributions[:price] then + amount = transport / group_orders.sum(:price) + group_orders.each do |go| + go.transport = (amount * go.price).ceil(2) + end + when Order.transport_distributions[:articles] then + amount = transport / group_orders.includes(:group_order_articles).sum(:result) + group_orders.each do |go| + go.transport = (amount * go.group_order_articles.sum(:result)).ceil(2) + end + end + end + # Updates the "price" attribute of GroupOrders or GroupOrderResults # This will be either the maximum value of a current order or the actual order value of a finished order. def update_price_of_group_orders diff --git a/app/views/finance/balancing/_edit_results_by_articles.html.haml b/app/views/finance/balancing/_edit_results_by_articles.html.haml index 9c2c9547..61ada1b8 100644 --- a/app/views/finance/balancing/_edit_results_by_articles.html.haml +++ b/app/views/finance/balancing/_edit_results_by_articles.html.haml @@ -36,8 +36,15 @@ %th= heading_helper Article, :tax %th= heading_helper Article, :deposit %th{:colspan => "2"} - = link_to t('.add_article'), new_order_order_article_path(@order), remote: true, - class: 'btn btn-small' unless @order.closed? + - unless @order.closed? + .btn-group + = link_to t('.add_article'), new_order_order_article_path(@order), remote: true, + class: 'btn btn-small' + = link_to '#', data: {toggle: 'dropdown'}, class: 'btn btn-small dropdown-toggle' do + %span.caret + %ul.dropdown-menu + %li= link_to t('.add_article'), new_order_order_article_path(@order), remote: true + %li= link_to t('.edit_transport'), edit_transport_finance_order_path(@order), remote: true %tbody.list#result_table - for order_article in @articles.select { |oa| oa.units > 0 } = render :partial => "order_article_result", :locals => {:order_article => order_article} @@ -47,3 +54,10 @@ - for order_article in @articles.select { |oa| oa.units == 0 } = render :partial => "order_article_result", :locals => {:order_article => order_article} + + - if @order.transport + %tr + %td{ colspan: 5 }= heading_helper Order, :transport + %td{ colspan: 3, data: {value: @order.transport} }= number_to_currency(@order.transport) + %td= link_to t('ui.edit'), edit_transport_finance_order_path(@order), remote: true, + class: 'btn btn-mini' unless order_article.order.closed? diff --git a/app/views/finance/balancing/_edit_transport.html.haml b/app/views/finance/balancing/_edit_transport.html.haml new file mode 100644 index 00000000..b08f9361 --- /dev/null +++ b/app/views/finance/balancing/_edit_transport.html.haml @@ -0,0 +1,11 @@ += simple_form_for @order, url: update_transport_finance_order_path(@order), method: :put do |f| + .modal-header + = close_button :modal + %h3= t('.title') + .modal-body + = f.input :transport + = f.input :transport_distribution, as: :radio_buttons, collection: Order.transport_distributions, + include_blank: false, label_method: ->(k){ t("activerecord.attributes.order.transport_distributions.#{k.first}") } + .modal-footer + = link_to t('ui.close'), '#', class: 'btn', data: {dismiss: 'modal'} + = f.submit t('ui.save'), class: 'btn btn-primary' diff --git a/app/views/finance/balancing/confirm.html.haml b/app/views/finance/balancing/confirm.html.haml index 0e90e8f9..873ed87c 100644 --- a/app/views/finance/balancing/confirm.html.haml +++ b/app/views/finance/balancing/confirm.html.haml @@ -8,7 +8,7 @@ - for group_order in @order.group_orders %tr{:class => cycle('even', 'odd')} %td= group_order.ordergroup_name - %td.numeric= number_to_currency(group_order.price) + %td.numeric= number_to_currency(group_order.total) .form-actions = submit_tag t('.clear'), class: 'btn btn-primary' = link_to t('.or_cancel'), new_finance_order_path(order_id: @order.id) diff --git a/app/views/finance/balancing/edit_transport.js.haml b/app/views/finance/balancing/edit_transport.js.haml new file mode 100644 index 00000000..7b471006 --- /dev/null +++ b/app/views/finance/balancing/edit_transport.js.haml @@ -0,0 +1,2 @@ +$('#modalContainer').html('#{j(render("edit_transport"))}'); +$('#modalContainer').modal(); diff --git a/app/views/group_orders/show.html.haml b/app/views/group_orders/show.html.haml index 0e9f530a..8c9678d7 100644 --- a/app/views/group_orders/show.html.haml +++ b/app/views/group_orders/show.html.haml @@ -24,6 +24,11 @@ = number_to_currency(@group_order.price) - else = t '.not_ordered' + - if @group_order && @group_order.transport + %dt= heading_helper GroupOrder, :transport + %dd= number_to_currency(@group_order.transport) + %dt= heading_helper GroupOrder, :total + %dd= number_to_currency(@group_order.total) - if @order.closed? %dt= heading_helper Order, :closed_by %dd= show_user_link @order.updated_by @@ -83,6 +88,13 @@ %tr{class: cycle('even', 'odd', name: 'articles')} %th{colspan: "5"}= heading_helper GroupOrder, :price %th= number_to_currency(@group_order.price) + - if @group_order.transport + %tr{class: cycle('even', 'odd', name: 'articles')} + %td{colspan: "5"}= heading_helper GroupOrder, :transport + %td= number_to_currency(@group_order.transport) + %tr{class: cycle('even', 'odd', name: 'articles')} + %th{colspan: "5"}= heading_helper GroupOrder, :total + %th= number_to_currency(@group_order.total) %br/ = link_to_top - else diff --git a/app/views/shared/articles_by/_articles.html.haml b/app/views/shared/articles_by/_articles.html.haml index c0a6c895..c2bb0695 100644 --- a/app/views/shared/articles_by/_articles.html.haml +++ b/app/views/shared/articles_by/_articles.html.haml @@ -12,3 +12,13 @@ = render 'shared/articles_by/article_single', order_article: order_article %tr %td{colspan: 4} + - if order.transport + %tbody + %tr.list-heading + %th{colspan: 4}> + %h4.name.pull-left= heading_helper GroupOrder, :transport + - for go in order.group_orders + - if go.transport + %tr + %td{colspan: 3, style: 'width:70%'}= go.ordergroup_name + %td= number_to_currency(go.transport) diff --git a/app/views/shared/articles_by/_common.html.haml b/app/views/shared/articles_by/_common.html.haml index e75560ce..36d538f8 100644 --- a/app/views/shared/articles_by/_common.html.haml +++ b/app/views/shared/articles_by/_common.html.haml @@ -27,4 +27,11 @@ el_price_sum.text(I18n.l('currency', new_price_sum)); el_price_sum.data('value', new_price_sum); } + var el_total = $('.total', el_sum); + if (el_total.length) { + var old_total = el_total.data('value'); + var new_total = old_total - old_price + e.group_order_article_price; + el_total.text(I18n.l('currency', new_total)); + el_total.data('value', new_total); + } }); diff --git a/app/views/shared/articles_by/_group_single.html.haml b/app/views/shared/articles_by/_group_single.html.haml index b1b5fc31..890954f7 100644 --- a/app/views/shared/articles_by/_group_single.html.haml +++ b/app/views/shared/articles_by/_group_single.html.haml @@ -8,8 +8,16 @@ - total += goa.total_price = render 'shared/articles_by/group_single_goa', goa: goa %tr{class: cycle('even', 'odd', :name => 'articles')} - %th{colspan: 7}= t 'shared.articles_by.price_sum' + %th{colspan: 7}= heading_helper GroupOrder, :price %th.price_sum{colspan: 2, data: {value: total}}= number_to_currency(total) + - if group_order.transport + - total += group_order.transport + %tr{class: cycle('even', 'odd', :name => 'articles')} + %td{colspan: 7}= heading_helper GroupOrder, :transport + %td{colspan: 2}= number_to_currency(group_order.transport) + %tr{class: cycle('even', 'odd', :name => 'articles')} + %th{colspan: 7}= heading_helper GroupOrder, :total + %th.total{colspan: 2, data: {value: total}}= number_to_currency(total) %tr %th{colspan: 9} - reset_cycle("articles") diff --git a/config/locales/de.yml b/config/locales/de.yml index 1b8f8a6c..ab5012cf 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -113,6 +113,13 @@ de: pickup: Abholung starts: Läuft vom supplier: Lieferant + transport: Transportkosten + transport_distribution: Transportkostenverteilung + transport_distributions: + articles: Kosten anhand der Anzahl an erhaltenen Artiklen verteilen + ordergroup: Jede Bestellgruppe zahlt gleich viel + price: Kosten anhand der Bestellsumme aufteilen + skip: Kosten nicht auf die Bestellgruppen aufteilen updated_by: Zuletzt geändert von order_article: article: Artikel @@ -738,8 +745,11 @@ de: edit_results_by_articles: add_article: Artikel hinzufügen amount: Menge + edit_transport: Transportkosten bearbeiten gross: Brutto net: Netto + edit_transport: + title: Transportkosten verteilen group_order_articles: add_group: Gruppe hinzufügen total: Gesamtpreis diff --git a/config/locales/en.yml b/config/locales/en.yml index 07588a37..743f6289 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -121,6 +121,13 @@ en: starts: Starts at status: Status supplier: Supplier + transport: Transport costs + transport_distribution: Transport costs distribution + transport_distributions: + articles: Distribute the costs among the number of received articles + ordergroup: Every ordergroup pays the same amount + price: Distribute the costs among the order sum + skip: Do not distribute the costs updated_by: Last edited by order_article: article: Article @@ -761,8 +768,11 @@ en: edit_results_by_articles: add_article: Add article amount: Amount + edit_transport: Edit transport gross: Gross net: Net + edit_transport: + title: Distribute transport costs group_order_articles: add_group: Add group total: Total costs diff --git a/config/routes.rb b/config/routes.rb index 4a74a598..540fbbe2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -154,6 +154,8 @@ Foodsoft::Application.routes.draw do get :update_summary get :edit_note put :update_note + get :edit_transport + put :update_transport get :confirm post :close diff --git a/db/migrate/20181201000220_add_transport_to_order.rb b/db/migrate/20181201000220_add_transport_to_order.rb new file mode 100644 index 00000000..7da7f15e --- /dev/null +++ b/db/migrate/20181201000220_add_transport_to_order.rb @@ -0,0 +1,6 @@ +class AddTransportToOrder < ActiveRecord::Migration + def change + add_column :orders, :transport, :decimal, precision: 8, scale: 2 + add_column :group_orders, :transport, :decimal, precision: 8, scale: 2 + end +end diff --git a/db/schema.rb b/db/schema.rb index bd1c3037..fea4e440 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -174,6 +174,7 @@ ActiveRecord::Schema.define(version: 20181205010000) do t.integer "lock_version", limit: 4, default: 0, null: false t.datetime "updated_on", null: false t.integer "updated_by_user_id", limit: 4 + t.decimal "transport", precision: 8, scale: 2 end add_index "group_orders", ["order_id"], name: "index_group_orders_on_order_id", using: :btree @@ -362,6 +363,7 @@ ActiveRecord::Schema.define(version: 20181205010000) do t.date "pickup" t.datetime "last_sent_mail" t.integer "end_action", limit: 4, default: 0, null: false + t.decimal "transport", precision: 8, scale: 2 end add_index "orders", ["state"], name: "index_orders_on_state", using: :btree