From 5907ff11bb4d11a9071fa3427c1bf94beb5a49e1 Mon Sep 17 00:00:00 2001 From: wvengen Date: Fri, 10 Apr 2015 20:18:49 +0200 Subject: [PATCH] Import current_orders plugin from foodcoop-adam --- plugins/current_orders/README.md | 16 +++ .../current_orders/articles_controller.rb | 43 ++++++ .../current_orders/group_orders_controller.rb | 26 ++++ .../current_orders/ordergroups_controller.rb | 43 ++++++ .../current_orders/orders_controller.rb | 40 ++++++ .../controllers/current_orders_controller.rb | 6 + .../documents/multiple_orders_by_articles.rb | 79 +++++++++++ .../documents/multiple_orders_by_groups.rb | 125 ++++++++++++++++++ .../app/helpers/current_orders_helper.rb | 14 ++ .../_orders/remove_receive.html.haml.deface | 1 + .../show/add_pdf_download.html.haml.deface | 7 + .../add_combined_button.html.haml.deface | 8 ++ .../articles/_actions.html.haml | 7 + .../articles/_article.html.haml | 9 ++ .../articles/_article_info.html.haml | 22 +++ .../articles/_articles.html.haml | 4 + .../current_orders/articles/_form.html.haml | 70 ++++++++++ .../articles/_ordergroups.html.haml | 37 ++++++ .../current_orders/articles/index.html.haml | 3 + .../current_orders/articles/index.js.erb | 2 + .../current_orders/articles/show.html.haml | 3 + .../views/current_orders/articles/show.js.erb | 3 + .../show_on_group_order_article_create.js.erb | 7 + .../group_orders/_payment_bar.html.haml | 8 ++ .../group_orders/_result.html.haml | 55 ++++++++ .../group_orders/index.html.haml | 13 ++ .../ordergroups/_article.html.haml | 18 +++ .../ordergroups/_articles.html.haml | 53 ++++++++ .../ordergroups/_form.html.haml | 72 ++++++++++ .../ordergroups/_payment_bar.html.haml | 15 +++ .../ordergroups/index.html.haml | 3 + .../current_orders/ordergroups/show.html.haml | 3 + .../current_orders/ordergroups/show.js.erb | 3 + .../show_on_group_order_article_create.js.erb | 7 + .../show_on_group_order_article_update.js.erb | 7 + .../current_orders/orders/receive.html.haml | 24 ++++ plugins/current_orders/config/locales/en.yml | 61 +++++++++ plugins/current_orders/config/locales/nl.yml | 55 ++++++++ plugins/current_orders/config/routes.rb | 27 ++++ .../foodsoft_current_orders.gemspec | 20 +++ .../lib/foodsoft_current_orders.rb | 5 + .../lib/foodsoft_current_orders/engine.rb | 4 + .../lib/foodsoft_current_orders/version.rb | 3 + 43 files changed, 1031 insertions(+) create mode 100644 plugins/current_orders/README.md create mode 100644 plugins/current_orders/app/controllers/current_orders/articles_controller.rb create mode 100644 plugins/current_orders/app/controllers/current_orders/group_orders_controller.rb create mode 100644 plugins/current_orders/app/controllers/current_orders/ordergroups_controller.rb create mode 100644 plugins/current_orders/app/controllers/current_orders/orders_controller.rb create mode 100644 plugins/current_orders/app/controllers/current_orders_controller.rb create mode 100644 plugins/current_orders/app/documents/multiple_orders_by_articles.rb create mode 100644 plugins/current_orders/app/documents/multiple_orders_by_groups.rb create mode 100644 plugins/current_orders/app/helpers/current_orders_helper.rb create mode 100644 plugins/current_orders/app/overrides/finance/balancing/_orders/remove_receive.html.haml.deface create mode 100644 plugins/current_orders/app/overrides/group_orders/show/add_pdf_download.html.haml.deface create mode 100644 plugins/current_orders/app/overrides/orders/index/add_combined_button.html.haml.deface create mode 100644 plugins/current_orders/app/views/current_orders/articles/_actions.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/articles/_article.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/articles/_article_info.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/articles/_articles.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/articles/_form.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/articles/_ordergroups.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/articles/index.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/articles/index.js.erb create mode 100644 plugins/current_orders/app/views/current_orders/articles/show.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/articles/show.js.erb create mode 100644 plugins/current_orders/app/views/current_orders/articles/show_on_group_order_article_create.js.erb create mode 100644 plugins/current_orders/app/views/current_orders/group_orders/_payment_bar.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/group_orders/_result.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/group_orders/index.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/_article.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/_articles.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/_form.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/_payment_bar.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/index.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/show.html.haml create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/show.js.erb create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/show_on_group_order_article_create.js.erb create mode 100644 plugins/current_orders/app/views/current_orders/ordergroups/show_on_group_order_article_update.js.erb create mode 100644 plugins/current_orders/app/views/current_orders/orders/receive.html.haml create mode 100644 plugins/current_orders/config/locales/en.yml create mode 100644 plugins/current_orders/config/locales/nl.yml create mode 100644 plugins/current_orders/config/routes.rb create mode 100644 plugins/current_orders/foodsoft_current_orders.gemspec create mode 100644 plugins/current_orders/lib/foodsoft_current_orders.rb create mode 100644 plugins/current_orders/lib/foodsoft_current_orders/engine.rb create mode 100644 plugins/current_orders/lib/foodsoft_current_orders/version.rb diff --git a/plugins/current_orders/README.md b/plugins/current_orders/README.md new file mode 100644 index 00000000..6020dd63 --- /dev/null +++ b/plugins/current_orders/README.md @@ -0,0 +1,16 @@ +FoodsoftCurrentOrders +===================== + +Quick support for working with all current orders, to bridge the time until we +have full support for order cycles in foodsoft. + +* `current_orders/ordergroups` to edit an ordergroup's order articles for all + orders that are closed but not settled. +* `current_orders/articles` to edit an order article's ordergroups for all + orders that are closed but not settled. +* `current_orders/orders.pdf?document=(groups|articles)` for PDFs for all + orders that are closed but not settled. +* `current_orders/orders/receive` for a list of orders that can be received. +* `current_orders/group_orders` for all articles in the user's group orders + from orders that are not settled. Can be used as a "shopping-cart overview" + page. diff --git a/plugins/current_orders/app/controllers/current_orders/articles_controller.rb b/plugins/current_orders/app/controllers/current_orders/articles_controller.rb new file mode 100644 index 00000000..6d1e92cd --- /dev/null +++ b/plugins/current_orders/app/controllers/current_orders/articles_controller.rb @@ -0,0 +1,43 @@ +# encoding: utf-8 +class CurrentOrders::ArticlesController < ApplicationController + + before_filter :authenticate_orders + before_filter :find_order_and_order_article, only: [:index, :show] + + def index + # sometimes need to pass id as parameter for forms + show if @order_article + end + + def show + respond_to do |format| + format.html { render :show } + format.js { render :show, layout: false } + end + end + + def show_on_group_order_article_create + @goa = GroupOrderArticle.find(params[:group_order_article_id]) + end + + def show_on_group_order_article_update + #@goa = GroupOrderArticle.find(params[:group_order_article_id]) + end + + protected + + def find_order_and_order_article + @current_orders = Order.finished_not_closed + unless params[:order_id].blank? + @order = Order.find(params[:order_id]) + @order_articles = @order.order_articles + else + @order_articles = OrderArticle.where(order_id: @current_orders.all.map(&:id)) + end + params[:q] ||= params[:search] # for meta_search instead of ransack + @q = OrderArticle.search(params[:q]) + @order_articles = @order_articles.ordered.merge(@q.relation).includes(:article, :article_price) + @order_article = @order_articles.where(id: params[:id]).first + end + +end diff --git a/plugins/current_orders/app/controllers/current_orders/group_orders_controller.rb b/plugins/current_orders/app/controllers/current_orders/group_orders_controller.rb new file mode 100644 index 00000000..68c84b5c --- /dev/null +++ b/plugins/current_orders/app/controllers/current_orders/group_orders_controller.rb @@ -0,0 +1,26 @@ +class CurrentOrders::GroupOrdersController < ApplicationController + # Security + before_filter :ensure_ordergroup_member + + def index + # XXX code duplication lib/foodsoft_current_orders/app/controllers/current_orders/ordergroups_controller.rb + @order_ids = Order.where(state: ['open', 'finished']).all.map(&:id) + @goas = GroupOrderArticle.includes(:group_order => :ordergroup).includes(:order_article). + where(group_orders: {order_id: @order_ids, ordergroup_id: @ordergroup.id}).ordered + @articles_grouped_by_category = @goas.includes(:order_article => {:article => :article_category}). + order('articles.name'). + group_by { |a| a.order_article.article.article_category.name }. + sort { |a, b| a[0] <=> b[0] } + end + + private + + # XXX code duplication from GroupOrdersController + def ensure_ordergroup_member + @ordergroup = @current_user.ordergroup + if @ordergroup.nil? + redirect_to root_url, :alert => I18n.t('group_orders.errors.no_member') + end + end + +end diff --git a/plugins/current_orders/app/controllers/current_orders/ordergroups_controller.rb b/plugins/current_orders/app/controllers/current_orders/ordergroups_controller.rb new file mode 100644 index 00000000..85562196 --- /dev/null +++ b/plugins/current_orders/app/controllers/current_orders/ordergroups_controller.rb @@ -0,0 +1,43 @@ +# encoding: utf-8 +class CurrentOrders::OrdergroupsController < ApplicationController + + before_filter :authenticate_orders + before_filter :find_group_orders, only: [:index, :show] + + def index + # sometimes need to pass id as parameter for forms + render 'show' if @ordergroup + end + + def show + respond_to do |format| + format.html { render :show } + format.js { render :show, layout: false } + end + end + + def show_on_group_order_article_create + @goa = GroupOrderArticle.find(params[:group_order_article_id]) + end + + def show_on_group_order_article_update + #@goa = GroupOrderArticle.find(params[:group_order_article_id]) + @group_order = GroupOrder.find(params[:group_order_id]) + @ordergroup = @group_order.ordergroup + end + + protected + + def find_group_orders + @order_ids = Order.finished_not_closed.map(&:id) + + @all_ordergroups = Ordergroup.undeleted.order(:name).all + @ordered_group_ids = GroupOrder.where(order_id: @order_ids).pluck('DISTINCT(ordergroup_id)') + @all_ordergroups.sort_by! {|o| @ordered_group_ids.include?(o.id) ? o.name : "ZZZZZ#{o.name}" } + + @ordergroup = Ordergroup.find(params[:id]) unless params[:id].nil? + @goas = GroupOrderArticle.includes(:group_order, :order_article => [:article, :article_price]). + where(group_orders: {order_id: @order_ids, ordergroup_id: @ordergroup.id}).ordered.all unless @ordergroup.nil? + end + +end diff --git a/plugins/current_orders/app/controllers/current_orders/orders_controller.rb b/plugins/current_orders/app/controllers/current_orders/orders_controller.rb new file mode 100644 index 00000000..b5ee1a33 --- /dev/null +++ b/plugins/current_orders/app/controllers/current_orders/orders_controller.rb @@ -0,0 +1,40 @@ +class CurrentOrders::OrdersController < ApplicationController + + before_filter :authenticate_orders, except: :my + + def show + @doc_options ||= {} + @order_ids = if params[:id] + params[:id].split('+').map(&:to_i) + else + Order.finished_not_closed.all.map(&:id) + end + @view = (params[:view] or 'default').gsub(/[^-_a-zA-Z0-9]/, '') + + respond_to do |format| + format.pdf do + pdf = case params[:document] + when 'groups' then MultipleOrdersByGroups.new(@order_ids, @doc_options) + when 'articles' then MultipleOrdersByArticles.new(@order_ids, @doc_options) + end + send_data pdf.to_pdf, filename: pdf.filename, type: 'application/pdf' + end + end + end + + def my + @doc_options ||= {} + @doc_options[:ordergroup] = @current_user.ordergroup.id + respond_to do |format| + format.pdf do + params[:document] = 'groups' + show + end + end + end + + def receive + @orders = Order.finished_not_closed.includes(:supplier) + end + +end diff --git a/plugins/current_orders/app/controllers/current_orders_controller.rb b/plugins/current_orders/app/controllers/current_orders_controller.rb new file mode 100644 index 00000000..2d0a0d97 --- /dev/null +++ b/plugins/current_orders/app/controllers/current_orders_controller.rb @@ -0,0 +1,6 @@ +# encoding: utf-8 +class CurrentOrdersController < ApplicationController + + before_filter :authenticate_orders + +end diff --git a/plugins/current_orders/app/documents/multiple_orders_by_articles.rb b/plugins/current_orders/app/documents/multiple_orders_by_articles.rb new file mode 100644 index 00000000..f857c945 --- /dev/null +++ b/plugins/current_orders/app/documents/multiple_orders_by_articles.rb @@ -0,0 +1,79 @@ +# encoding: utf-8 +class MultipleOrdersByArticles < OrderPdf + include OrdersHelper + + def filename + I18n.t('documents.multiple_orders_by_articles.filename', count: @order.count) + '.pdf' + end + + def title + I18n.t('documents.multiple_orders_by_articles.title', count: @order.count) + end + + def order_articles + @order_articles ||= OrderArticle.joins(:order, :article).where(:orders => {:id => @order}).ordered.reorder('orders.id, articles.name') + end + + def body + order_articles.each do |order_article| + down_or_page + + rows = [] + dimrows = [] + has_units_str = '' + for goa in order_article.group_order_articles.ordered + units = result_in_units(goa, order_article.article) + rows << [show_group(goa.group_order.ordergroup), + goa.tolerance > 0 ? "#{goa.quantity} + #{goa.tolerance}" : goa.quantity, + goa.result, + units, + number_to_currency(goa.total_price(order_article))] + dimrows << rows.length if goa.result == 0 + has_units_str = units.to_s if units.to_s.length > has_units_str.length # hack for prawn line-breaking units cell + end + next if rows.length == 0 + sum = order_article.group_orders_sum + rows.unshift I18n.t('documents.order_by_articles.rows').dup # table header + rows[0][2] = {content: rows[0][2], colspan: 2} + + rows << [I18n.t('documents.order_by_groups.sum'), + order_article.tolerance > 0 ? "#{order_article.quantity} + #{order_article.tolerance}" : order_article.quantity, + sum[:quantity], + result_in_units(sum[:quantity], order_article.article), + nil] #number_to_currency(sum[:price])] + + text "#{order_article.article.name} " + + "(#{order_article.article.unit}; #{number_to_currency order_article.price.fc_price}; " + + units_history_line(order_article, nil, plain: true) + ')', + size: fontsize(10), inline_format: true + s = ::OrderByArticles.article_info(order_article.article) and text s, size: fontsize(8), inline_format: true + table rows, cell_style: {size: fontsize(8), overflow: :shrink_to_fit} do |table| + # borders + table.cells.borders = [:bottom] + table.cells.border_width = 0.02 + table.cells.border_color = 'dddddd' + table.rows(0).border_width = 1 + table.rows(0).border_color = '666666' + table.row(rows.length-2).border_width = 1 + table.row(rows.length-2).border_color = '666666' + table.row(rows.length-1).borders = [] + + table.column(0).width = 200 + table.columns(1..2).align = :center + table.column(2..3).font_style = :bold + table.columns(3).width = width_of(has_units_str) + table.columns(3..4).align = :right + + # dim rows which were ordered but not received + dimrows.each { |ri| table.row(ri).text_color = '999999' } + end + end + end + + protected + + def pdf_add_page_breaks? + super 'order_by_articles' + end + +end diff --git a/plugins/current_orders/app/documents/multiple_orders_by_groups.rb b/plugins/current_orders/app/documents/multiple_orders_by_groups.rb new file mode 100644 index 00000000..69dc947f --- /dev/null +++ b/plugins/current_orders/app/documents/multiple_orders_by_groups.rb @@ -0,0 +1,125 @@ +# encoding: utf-8 +class MultipleOrdersByGroups < OrderPdf + include OrdersHelper + + def filename + I18n.t('documents.multiple_orders_by_groups.filename', count: @order.count) + '.pdf' + end + + def title + I18n.t('documents.multiple_orders_by_groups.title', count: @order.count) + end + + def ordergroups + unless @ordergroups + @ordergroups = Ordergroup.joins(:orders).where(orders: {id: @order}).select('distinct(groups.id)').select('groups.*').reorder(:name) + @ordergroups = @ordergroups.where(id: @options[:ordergroup]) if @options[:ordergroup] + end + @ordergroups + end + + def body + # Start rendering + ordergroups.each do |ordergroup| + down_or_page 15 + + totals = {net_price: 0, deposit: 0, gross_price: 0, fc_price: 0, fc_markup_price: 0} + taxes = Hash.new {0} + rows = [] + dimrows = [] + group_order_articles = GroupOrderArticle.ordered.joins(:group_order => :order).where(:group_orders =>{:ordergroup_id => ordergroup.id}).where(:orders => {id: @order}).includes(:order_article => :article_price).reorder('orders.id') + has_tolerance = group_order_articles.where('article_prices.unit_quantity > 1').any? + + group_order_articles.each do |goa| + price = goa.order_article.price + goa_totals = goa.total_prices + totals[:net_price] += goa_totals[:net_price] + totals[:deposit] += goa_totals[:deposit] + totals[:gross_price] += goa_totals[:gross_price] + totals[:fc_price] += goa_totals[:price] + totals[:fc_markup_price] += goa_totals[:fc_markup_price] + taxes[goa.order_article.price.tax.to_f.round(2)] += goa_totals[:fc_tax_price] + rows << [goa.order_article.article.name, + goa.group_order.order.name.truncate(10, omission: ''), + number_to_currency(price.fc_price(goa.group_order.ordergroup)), + goa.order_article.article.unit, + goa.tolerance > 0 ? "#{goa.quantity} + #{goa.tolerance}" : goa.quantity, + goa.result, + result_in_units(goa), + number_to_currency(goa_totals[:price]), + (goa.order_article.price.unit_quantity if has_tolerance)] + dimrows << rows.length if goa.result == 0 + end + next if rows.length == 0 + + # total + rows << [{content: I18n.t('documents.order_by_groups.sum'), colspan: 7}, number_to_currency(totals[:fc_price]), nil] + # price details + price_details = [] + price_details << "#{Article.human_attribute_name :price} #{number_to_currency totals[:net_price]}" if totals[:net_price] > 0 + price_details << "#{Article.human_attribute_name :deposit} #{number_to_currency totals[:deposit]}" if totals[:deposit] > 0 + taxes.each do |tax, tax_price| + price_details << "#{Article.human_attribute_name :tax} #{number_to_percentage tax} #{number_to_currency tax_price}" if tax_price > 0 + end + price_details << "#{Article.human_attribute_name :fc_share_short} #{number_to_percentage ordergroup.markup_pct} #{number_to_currency totals[:fc_markup_price]}" + rows << [{content: (' ' + price_details.join('; ') if totals[:fc_price] > 0), colspan: 8}] + + # table header + rows.unshift I18n.t('documents.order_by_groups.rows').dup + rows.first.insert(1, Article.human_attribute_name(:supplier)) + rows.first[5] = {content: rows.first[5], colspan: 2} + if has_tolerance + rows.first[-1] = {image: "#{Rails.root}/app/assets/images/package-bg.png", scale: 0.6, position: :center} + else + rows.first[-1] = nil + end + + text show_group(ordergroup), size: fontsize(13), style: :bold + table rows, width: bounds.width, cell_style: {size: fontsize(8), overflow: :shrink_to_fit} do |table| + # borders + table.cells.borders = [:bottom] + table.cells.border_width = 0.02 + table.cells.border_color = 'dddddd' + table.rows(0).border_width = 1 + table.rows(0).border_color = '666666' + table.rows(0).column(5).font_style = :bold + table.row(rows.length-3).border_width = 1 + table.row(rows.length-3).border_color = '666666' + table.row(rows.length-2).borders = [] + table.row(rows.length-1).borders = [] + + # bottom row with price details + table.row(rows.length-1).text_color = '999999' + table.row(rows.length-1).size = fontsize(7) + table.row(rows.length-1).padding = [0, 5, 0, 5] + table.row(rows.length-1).height = 0 if totals[:fc_price] == 0 + + table.column(0).width = 150 # @todo would like to set minimum width here + table.column(1).width = 62 + table.column(2).align = :right + table.column(5..7).font_style = :bold + table.columns(3..5).align = :center + table.column(6..7).align = :right + table.column(8).align = :center + # dim rows not relevant for members + table.column(4).text_color = '999999' + table.column(8).text_color = '999999' + # hide unit_quantity if there's no tolerance anyway + table.column(-1).width = has_tolerance ? 20 : 0 + + # dim rows which were ordered but not received + dimrows.each do |ri| + table.row(ri).text_color = 'aaaaaa' + table.row(ri).columns(0..-1).font_style = nil + end + end + end + end + + protected + + def pdf_add_page_breaks? + super 'order_by_groups' + end + +end diff --git a/plugins/current_orders/app/helpers/current_orders_helper.rb b/plugins/current_orders/app/helpers/current_orders_helper.rb new file mode 100644 index 00000000..53d0f699 --- /dev/null +++ b/plugins/current_orders/app/helpers/current_orders_helper.rb @@ -0,0 +1,14 @@ +module CurrentOrdersHelper + + def to_pay_message(ordergroup) + funds = ordergroup.get_available_funds + if funds > 0 + content_tag :b, I18n.t('helpers.current_orders.pay_done'), style: 'color: green' + elsif funds == 0 + I18n.t('helpers.current_orders.pay_none') + else + content_tag :b, I18n.t('helpers.current_orders.pay_amount', amount: number_to_currency(-ordergroup.get_available_funds)) + end + end + +end diff --git a/plugins/current_orders/app/overrides/finance/balancing/_orders/remove_receive.html.haml.deface b/plugins/current_orders/app/overrides/finance/balancing/_orders/remove_receive.html.haml.deface new file mode 100644 index 00000000..31c04322 --- /dev/null +++ b/plugins/current_orders/app/overrides/finance/balancing/_orders/remove_receive.html.haml.deface @@ -0,0 +1 @@ +/ remove 'erb:contains("link_to"):contains("action_receive")' diff --git a/plugins/current_orders/app/overrides/group_orders/show/add_pdf_download.html.haml.deface b/plugins/current_orders/app/overrides/group_orders/show/add_pdf_download.html.haml.deface new file mode 100644 index 00000000..f2db1732 --- /dev/null +++ b/plugins/current_orders/app/overrides/group_orders/show/add_pdf_download.html.haml.deface @@ -0,0 +1,7 @@ +/ insert_before '#articles_table' +- unless @orders.nil? or @orders.empty? or @order_articles.nil? or @order_articles.empty? + - content_for :actionbar do + = link_to url_for(controller: 'current_orders/orders', action: 'my', id: @orders.map(&:id).join('+'), format: 'pdf'), class: 'btn' do + = glyph :download + PDF + diff --git a/plugins/current_orders/app/overrides/orders/index/add_combined_button.html.haml.deface b/plugins/current_orders/app/overrides/orders/index/add_combined_button.html.haml.deface new file mode 100644 index 00000000..a59624bf --- /dev/null +++ b/plugins/current_orders/app/overrides/orders/index/add_combined_button.html.haml.deface @@ -0,0 +1,8 @@ +/ insert_before 'h2:contains(".orders_finished"), h2:contains(".orders_settled")' +.btn-group.pull-right#orders_finished_toolbar + = link_to '#', data: {toggle: 'dropdown'}, class: 'btn dropdown-toggle' do + = t 'orders.show.download.title' + %span.caret + %ul.dropdown-menu + %li= link_to t('orders.show.download.group_pdf'), current_orders_orders_path(document: :groups, format: :pdf) + %li= link_to t('orders.show.download.article_pdf'), current_orders_orders_path(document: :articles, format: :pdf) diff --git a/plugins/current_orders/app/views/current_orders/articles/_actions.html.haml b/plugins/current_orders/app/views/current_orders/articles/_actions.html.haml new file mode 100644 index 00000000..e5c76eba --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/_actions.html.haml @@ -0,0 +1,7 @@ +.btn-group.pull-right + = link_to '#', data: {toggle: 'dropdown'}, class: 'btn dropdown-toggle' do + = t 'orders.show.download.title' + %span.caret + %ul.dropdown-menu + %li= link_to t('orders.show.download.group_pdf'), current_orders_orders_path(document: :groups, format: :pdf) + %li= link_to t('orders.show.download.article_pdf'), current_orders_orders_path(document: :articles, format: :pdf) diff --git a/plugins/current_orders/app/views/current_orders/articles/_article.html.haml b/plugins/current_orders/app/views/current_orders/articles/_article.html.haml new file mode 100644 index 00000000..86ed84a5 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/_article.html.haml @@ -0,0 +1,9 @@ +#order_article + + - if order_article + = render 'article_info', order_article: order_article + = render 'ordergroups', order_article: order_article + + - else + %h2= t('current_orders.articles.index.title') + %i#articles_by_articles= t '.no_selection' diff --git a/plugins/current_orders/app/views/current_orders/articles/_article_info.html.haml b/plugins/current_orders/app/views/current_orders/articles/_article_info.html.haml new file mode 100644 index 00000000..8efa0d58 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/_article_info.html.haml @@ -0,0 +1,22 @@ +#article_info + %h2{style: 'margin-bottom: 0'} + = t('current_orders.articles.show.title', name: order_article.article.name) + %span.normal= order_article.article.unit + -# @todo unduplicate from group_orders's order_article_info + %p + - if order_article.article.manufacturer.blank? + = raw t 'group_orders.order_article_info.supplied_by', supplier: content_tag(:em, supplier_link(order_article.article.supplier)) + - elsif order_article.article.supplier.name == order_article.article.manufacturer + = raw t 'group_orders.order_article_info.supplied_and_made_by', manufacturer: content_tag(:em, supplier_link(order_article.article.supplier)) + - else + = raw t 'group_orders.order_article_info.supplied_by_made_by', supplier: content_tag(:em, supplier_link(order_article.article.supplier)), manufacturer: content_tag(:em, order_article.article.manufacturer) + - unless order_article.article.origin.blank? + = raw t 'group_orders.order_article_info.origin_in', origin: content_tag(:em, order_article.article.origin) + + - pkg_info = pkg_helper(order_article.price) + = ", #{pkg_info}".html_safe unless pkg_info.blank? + + = ", " + = Article.human_attribute_name(:fc_price_short) + ": " + = number_to_currency(order_article.price.fc_price) + = t 'current_orders.articles.article_info.unit', unit: order_article.article.unit diff --git a/plugins/current_orders/app/views/current_orders/articles/_articles.html.haml b/plugins/current_orders/app/views/current_orders/articles/_articles.html.haml new file mode 100644 index 00000000..8e7110cf --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/_articles.html.haml @@ -0,0 +1,4 @@ +- @order_articles.includes(:order => :supplier).reorder('suppliers.name, articles.article_category_id, articles.name').group_by {|oa| oa.order.name}.each do |name, articles| + %li.nav-header= name + - articles.each do |oa| + %li= link_to oa.article.name, current_orders_articles_path(order: oa.order.id, id: oa.id, anchor: 'order_article'), remote: true diff --git a/plugins/current_orders/app/views/current_orders/articles/_form.html.haml b/plugins/current_orders/app/views/current_orders/articles/_form.html.haml new file mode 100644 index 00000000..ba8add9e --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/_form.html.haml @@ -0,0 +1,70 @@ +.row-fluid + + .span4 + .well + %ul.nav.nav-list#article_list + %li.keep + = form_for @q, url: current_orders_articles_path, method: 'get', html: {data: {'submit-onchange' => true}, class: 'form-search'}, remote: true do |f| + .input-append + = f.text_field :article_name_contains, placeholder: t('.article_placeholder'), class: 'search-query input-block-level resettable' + %button.add-on.btn.reset-search{type: 'button'} + %i.icon.icon-remove + = render 'articles', orders: @current_orders + + .span8 + = render 'actions' + = render 'article', order_article: @order_article + = render 'shared/articles_by/common' + + +- content_for :javascript do + :javascript + + $(function() { + + // update number of received items - would prefer to do this server-side to + // keep working when showing a partial list, but this avoids an extra ajax call + $(document).on('GroupOrderArticle#update #update_articles_summary', function(e) { + var count_sum = 0; + // number of received items + $('#articles_by_articles input[data-delta]').each(function() { + count_sum += Number($(this).val()); + }); + $('#single_order_article_total .count_sum').html(count_sum); + // delta + // @todo partial code-duplication with orders/_edit_amounts + var expected = $('#single_order_article_delta .units_delta').data('quantity-expected'); + var delta = Math.round((count_sum - expected)*100)/100.0; + if (isNaN(delta)) { + html = ''; + color = 'inherit'; + } else if (delta == 0) { + html = I18n.t('js.current_orders.articles.equal'); + color = 'green'; + //$('#single_order_article_total .count_sum').html(count_sum + ' '); + } else if (delta < 0) { + html = I18n.t('js.current_orders.articles.below', {count: -delta}); + color = 'inherit'; + } else { + html = I18n.t('js.current_orders.articles.above', {count: delta}); + color = 'red'; + } + $('#single_order_article_delta .units_delta').html(html).attr('style', 'color: '+color); + $('#single_order_article_total .count_sum').attr('style', 'color: '+color); + }); + + // add ordergroup + $('#group_order_article_ordergroup_id').select2().select2('data', null); + $(document).on('GroupOrderArticle#create', function(e) { + var base_unit = $('#articles_by_articles').data('base-unit'); + // reset selection + $('#group_order_article_ordergroup_id').select2('data', null); + // update table + $.ajax({ + url: '#{show_on_group_order_article_create_current_orders_articles_path}', + type: 'get', + data: {group_order_article_id: e.group_order_article_id, base_unit: base_unit} + }); + }); + }); + diff --git a/plugins/current_orders/app/views/current_orders/articles/_ordergroups.html.haml b/plugins/current_orders/app/views/current_orders/articles/_ordergroups.html.haml new file mode 100644 index 00000000..dc5d0465 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/_ordergroups.html.haml @@ -0,0 +1,37 @@ +- units = order_article.article.unit_unit +- multiplier = (params[:base_unit] and units) ? units.scalar : 1 +%table.table.table-hover#articles_by_articles{data: {'base-unit' => params[:base_unit]}} + %thead.list-heading + %tr + %th{:style => 'width:70%'}= Ordergroup.model_name.human + %th.center.dimmed + %acronym{:title => t('shared.articles.ordered_desc')}= t 'shared.articles.ordered' + %th.center + %acronym{:title => t('shared.articles.received_desc')}= t 'shared.articles.received' + %td.center + .btn-group + - if units and units.units != order_article.article.unit + = link_to t('.piece'), current_orders_articles_path(order: order_article.order.id, id: order_article.id), remote: true, class: "btn btn-small #{'active' unless params[:base_unit]}" + = link_to units.units, current_orders_articles_path(order: order_article.order.id, id: order_article.id, base_unit: true), remote: true, class: "btn btn-small #{'active' if params[:base_unit]}" + + = render 'shared/articles_by/article_single', order_article: order_article, heading: false, delta_column: true, base_unit: params[:base_unit] + + %tfoot + %tr + %td + = form_for GroupOrderArticle.new, remote: true, html: {'data-submit-onchange' => true, style: 'margin: 0'} do |f| + = f.hidden_field :order_article_id, value: order_article.id + = f.select :ordergroup_id, + options_for_select(Ordergroup.undeleted.order(:name).all.map { |g| [ show_group(g), g.id ] }), + {include_blank: true}, {style: 'width: 100%', 'data-placeholder' => t('.add_new')} + %td{colspan: 3} + %tr#single_order_article_total + %th= t 'shared.articles_by.price_sum' + %td.center.dimmed #{order_article.quantity*multiplier} + #{order_article.tolerance*multiplier} + - sum = order_article.group_orders_sum + %th.center.count_sum= sum[:quantity]*multiplier + %tr.no-top-border#single_order_article_delta + %td + %td + %td.center + %span.units_delta{data: {'quantity-expected' => order_article.units * order_article.price.unit_quantity * multiplier}} diff --git a/plugins/current_orders/app/views/current_orders/articles/index.html.haml b/plugins/current_orders/app/views/current_orders/articles/index.html.haml new file mode 100644 index 00000000..d0f38296 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/index.html.haml @@ -0,0 +1,3 @@ +- title t('.title'), false + += render 'form' diff --git a/plugins/current_orders/app/views/current_orders/articles/index.js.erb b/plugins/current_orders/app/views/current_orders/articles/index.js.erb new file mode 100644 index 00000000..b04d27e7 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/index.js.erb @@ -0,0 +1,2 @@ +$('#article_list li:not(.keep)').remove(); +$('#article_list').append('<%= j(render('articles', orders: @current_orders)) %>'); diff --git a/plugins/current_orders/app/views/current_orders/articles/show.html.haml b/plugins/current_orders/app/views/current_orders/articles/show.html.haml new file mode 100644 index 00000000..e6d600f8 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/show.html.haml @@ -0,0 +1,3 @@ +- title t('.title', name: @order_article.article.name), false + += render 'form' diff --git a/plugins/current_orders/app/views/current_orders/articles/show.js.erb b/plugins/current_orders/app/views/current_orders/articles/show.js.erb new file mode 100644 index 00000000..6fe2a888 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/show.js.erb @@ -0,0 +1,3 @@ +$('#order_article').replaceWith('<%= j(render('article', order_article: @order_article)) if @order_article %>'); +// add javascript improvements (delta) +$(document).trigger('#update_articles_summary'); diff --git a/plugins/current_orders/app/views/current_orders/articles/show_on_group_order_article_create.js.erb b/plugins/current_orders/app/views/current_orders/articles/show_on_group_order_article_create.js.erb new file mode 100644 index 00000000..6b023c54 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/articles/show_on_group_order_article_create.js.erb @@ -0,0 +1,7 @@ +// Handle more advanced DOM update after AJAX database manipulation. +// See publish/subscribe design pattern in /doc. +(function(w) { + $('#goa_<%= @goa.id %>').remove(); // just to be sure: remove table row which is added below + $('#articles_by_articles tbody').append('<%= j render('shared/articles_by/article_single_goa', goa: @goa, base_unit: params[:base_unit]) %>').addClass('success'); +})(window); + diff --git a/plugins/current_orders/app/views/current_orders/group_orders/_payment_bar.html.haml b/plugins/current_orders/app/views/current_orders/group_orders/_payment_bar.html.haml new file mode 100644 index 00000000..6d4352f7 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/group_orders/_payment_bar.html.haml @@ -0,0 +1,8 @@ +.pull-right + = link_to t('ui.back'), root_path(anchor: ''), class: 'btn' + +%p.pull-left + = link_to t('current_orders.ordergroups.payment_bar.account_balance'), my_ordergroup_path + = number_to_currency (ordergroup.account_balance) + +%p#to_pay_message{style: 'text-align: center'}= to_pay_message(ordergroup) diff --git a/plugins/current_orders/app/views/current_orders/group_orders/_result.html.haml b/plugins/current_orders/app/views/current_orders/group_orders/_result.html.haml new file mode 100644 index 00000000..7939c67e --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/group_orders/_result.html.haml @@ -0,0 +1,55 @@ +-# XXX code duplication of foodcoop-adam's app/views/group_orders/show.html.haml +- if @articles_grouped_by_category.count > 0 + %table.table.table-hover + %thead + %tr + %th{style: "width:40%"}= heading_helper Article, :name + %th= heading_helper Article, :unit + %th= t 'group_orders.show.articles.unit_price' + %th + %abbr{title: t('group_orders.show.articles.ordered_title')}= t 'group_orders.show.articles.ordered' + %th + %abbr{title: t('group_orders.show.articles.order_nopen_title')} + - if (@order.open? rescue true) + = t 'group_orders.show.articles.order_open' + - else + = t 'group_orders.show.articles.order_not_open' + %th= heading_helper GroupOrderArticle, :total_price + %tbody + - group_order_sum = 0 + - for category_name, goas in @articles_grouped_by_category + %tr.article-category.list-heading + %td + = category_name + %i.icon-tag + %td{colspan: "9"} + - goas.each do |goa| + - # get the order-results for the ordergroup + - oa = goa.order_article + - r = {quantity: goa.quantity, tolerance: goa.tolerance, result: goa.result, sub_total: goa.total_price(oa)} + - group_order_sum += r[:sub_total] + %tr{class: cycle('even', 'odd', name: 'articles') + " order-article " + order_article_class_name(r[:quantity], r[:tolerance], r[:result])} + -# article_info is present in foodcoop-adam only + %td.name{style: "width:40%", title: (article_info_title(oa.article) rescue nil)} + = article_info_icon oa.article rescue nil + = oa.article.name + %td + = oa.article.unit + %span{style: 'opacity: 0.4; margin-left: 1em;'}= pkg_helper(oa.price, soft_uq: true) + %td= number_to_currency oa.price.fc_price(@ordergroup) + %td + = r[:quantity] + = "+ #{r[:tolerance]}" if oa.price.unit_quantity > 1 + %td= r[:result] > 0 ? r[:result] : "0" + %td= number_to_currency(r[:sub_total]) + - unless oa.article.note.blank? + %tr{id: "note_#{oa.id}", class: "note even", style: "display:none"} + %td{colspan: "6"}=h oa.article.note + %tr{class: cycle('even', 'odd', name: 'articles')} + %th{colspan: "5"}= heading_helper GroupOrder, :price + %th= number_to_currency(group_order_sum) +- elsif @articles_grouped_by_category.count == 0 + = t 'group_orders.show.articles.no_articles' +- else + = t 'group_orders.show.articles.order_closed_msg' + diff --git a/plugins/current_orders/app/views/current_orders/group_orders/index.html.haml b/plugins/current_orders/app/views/current_orders/group_orders/index.html.haml new file mode 100644 index 00000000..801e6dae --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/group_orders/index.html.haml @@ -0,0 +1,13 @@ +- title t('.title') + +// Article box +%section + .column_content#result + = render 'result' + + .well + = render 'payment_bar', ordergroup: @ordergroup + + %br/ + = link_to_top + diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/_article.html.haml b/plugins/current_orders/app/views/current_orders/ordergroups/_article.html.haml new file mode 100644 index 00000000..d33be330 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/_article.html.haml @@ -0,0 +1,18 @@ +-# @todo move multiplier to model & unduplicate with shared/articles_by/ +- multiplier, unit = 1, '× ' + goa.order_article.article.unit +- if local_assigns[:base_unit] and unit = goa.order_article.article.unit_unit + - multiplier = unit.scalar + - unit = unit.units +-# output row +%tr{:class => [cycle('even', 'odd', :name => 'articles'), if goa.result == 0 then 'unavailable' end], id: "goa_#{goa.id}"} + %td.name= goa.order_article.article.name + %td{title: goa.order_article.order.name}= link_to goa.order_article.order.name.truncate(15), goa.order_article.order + %td= goa.order_article.article.unit + %td.center= "#{goa.quantity} + #{goa.tolerance}" + %td.center.input-delta= group_order_article_edit_result(goa, multiplier: multiplier, edit: local_assigns[:edit]||true) + %td.nowrap.dimmed= unit if multiplier != 1 + %td.symbol + × + %td= number_to_currency goa.order_article.price.fc_price(@ordergroup)/multiplier + %td.symbol = + %td.price{data: {value: goa.total_price}}= number_to_currency goa.total_price diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/_articles.html.haml b/plugins/current_orders/app/views/current_orders/ordergroups/_articles.html.haml new file mode 100644 index 00000000..db865a87 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/_articles.html.haml @@ -0,0 +1,53 @@ +- if @ordergroup + %table.table.table-hover#articles_by_groups_table{data: {'base-unit' => params[:base_unit]}} + %thead + %tr + %th{style: 'width: 35%'}= heading_helper Article, :name + %th= Order.model_name.human + %th= heading_helper Article, :unit + %th.center + %acronym{:title => t('shared.articles.ordered_desc')}= t 'shared.articles.ordered' + %th.center{style: 'width: 88px'} + %acronym{:title => t('shared.articles.received_desc')}= t 'shared.articles.received' + %th.nowrap.dimmed + %th.symbol + %th= heading_helper Article, :fc_price, short: true + %th.symbol + %td.center + .btn-group + - if true #if units and units.units != order_article.article.unit + = link_to t('current_orders.articles.ordergroups.piece'), current_orders_ordergroups_path(id: @ordergroup.id), remote: true, class: "btn btn-small #{'active' unless params[:base_unit]}" + = link_to t('current_orders.articles.ordergroups.unit'), current_orders_ordergroups_path(id: @ordergroup.id, base_unit: true), remote: true, class: "btn btn-small #{'active' if params[:base_unit]}" + + - total = 0 + %tbody.list + - if @goas and @goas.length > 0 + - for goa in @goas + - total += goa.total_price + = render 'article', goa: goa, base_unit: params[:base_unit] + + - else + %tr + %td{colspan: 11} + %i No articles for #{show_group(@ordergroup)} in the current orders. + + %tfoot + %tr + %td{colspan: 10} + - new_articles = OrderArticle.includes(:article, :article_price).where(order_id: @order_ids) + - new_article_data = articles_for_select2(new_articles) {|a| "#{a.article.name} (#{a.article.unit}, #{number_to_currency a.price.fc_price})"} + = form_for GroupOrderArticle.new, remote: true, html: {'data-submit-onchange' => true, style: 'margin: 0'} do |f| + = f.select :order_article_id, + options_for_select(new_article_data.map {|a| [a[:text], a[:id]]}), + {}, {style: 'width: 500px', 'data-placeholder' => t('.add_new') } + = f.hidden_field :ordergroup_id, value: @ordergroup.id + %tr#single_ordergroup_total{:class => cycle('even', 'odd', :name => 'articles')} + %th{colspan: 9}= t 'shared.articles_by.price_sum' + %th.price_sum{colspan: 2, data: {value: total}}= number_to_currency(total) + + + .well#payment_bar + = render 'payment_bar', ordergroup: @ordergroup + +- else + %i= t '.no_selection' diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/_form.html.haml b/plugins/current_orders/app/views/current_orders/ordergroups/_form.html.haml new file mode 100644 index 00000000..0e25ef43 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/_form.html.haml @@ -0,0 +1,72 @@ +.well + = form_tag current_orders_ordergroups_path, method: :get, 'data-submit-onchange' => true, style: 'margin: 0' do + = select_tag 'id', + options_for_select(@all_ordergroups.map { |g| [ show_group(g), g.id, {class: ('muted' unless @ordered_group_ids.include? g.id)}] }, (@ordergroup.id rescue '')), + include_blank: true, id: 'ordergroup_select', style: 'min-width: 300px', + 'data-placeholder' => t('.ordergroup_placeholder'), 'data-submit-on-change' => :true + -#.form-search.pull-right # see below why this is disabled + .input-append + = text_field_tag :query, params[:query], class: 'search-query delayed-search resettable', disabled: @ordergroup.nil?, + 'placeholder' => t('orders.show.search_placeholder.articles') + %button.add-on.btn.reset-search{:type => :button, :title => t('orders.show.search_reset')} + %i.icon.icon-remove + + + - if @ordergroup and FoodsoftConfig[:price_markup_list] + %span.price_markup_note{style: 'margin-left: 1em'}= show_price_markup @ordergroup, format: :full_label, optional: true + +#articles_by_groups + = render 'articles' + += render 'shared/articles_by/common', order: @order + + +- content_for :javascript do + :javascript + + $(function() { + // TODO group by ordered / not-ordered + $('#ordergroup_select').select2(); + + // add article + $('#group_order_article_order_article_id').select2({ + placeholder: '#{j t('orders.receive.add_article')}', + formatNoMatches: function(term) { return '#{j t('.no_articles_available')}';} + }); + $(document).on('GroupOrderArticle#create', function(e) { + var base_unit = $('#articles_by_groups_table').data('base-unit'); + // reset selection + $('#group_order_article_order_article_id').select2('data', null); + // update table + $.ajax({ + url: '#{show_on_group_order_article_create_current_orders_ordergroups_path}', + type: 'get', + data: {group_order_article_id: e.group_order_article_id, base_unit: base_unit} + }); + }); + + $(document).on('GroupOrderArticle#update', function(e) { + $.ajax({ + url: '#{show_on_group_order_article_update_current_orders_ordergroups_path}', + type: 'get', + data: {group_order_id: e.group_order_id, group_order_article_id: e.group_order_article_id} + }); + }); + + // article search + // DO NOT USE because listjs can't handle updates https://github.com/javve/list.js/issues/86 + /* + new List(document.body, { + valueNames: ['name'], + engine: 'unlist', + plugins: [ + ['reset', {highlightClass: 'btn-primary'}], + ['delay', {delayedSearchTime: 500}], + ], + // make large pages work too (as we don't have paging) + page: 10000, + indexAsync: true + }); + */ + }); + diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/_payment_bar.html.haml b/plugins/current_orders/app/views/current_orders/ordergroups/_payment_bar.html.haml new file mode 100644 index 00000000..7a76977d --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/_payment_bar.html.haml @@ -0,0 +1,15 @@ +- if current_user.role_finance? + .pull-right + = t('.payment') + - if current_user.role_finance? + = link_to t('.new_transaction'), new_finance_ordergroup_transaction_path(ordergroup), class: 'btn' + +%p.pull-left + - if current_user.role_finance? + = link_to 'Account balance', finance_ordergroup_transactions_path(ordergroup) + - else + = t '.account_balance' + of #{show_group(ordergroup)}: #{number_to_currency ordergroup.account_balance} + +%p#to_pay_message{style: 'text-align: center'}= to_pay_message(ordergroup) + diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/index.html.haml b/plugins/current_orders/app/views/current_orders/ordergroups/index.html.haml new file mode 100644 index 00000000..624324db --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/index.html.haml @@ -0,0 +1,3 @@ +- title t('.title') + += render 'form' diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/show.html.haml b/plugins/current_orders/app/views/current_orders/ordergroups/show.html.haml new file mode 100644 index 00000000..81fc247b --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/show.html.haml @@ -0,0 +1,3 @@ +- title t('.title', name: show_group(@ordergroup)) + += render 'form' diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/show.js.erb b/plugins/current_orders/app/views/current_orders/ordergroups/show.js.erb new file mode 100644 index 00000000..b3001e77 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/show.js.erb @@ -0,0 +1,3 @@ +// untested +$('h1, title').html('<%= j t('.title', name: show_group(@ordergroup)) %>'); +$('#articles_by_groups').html('<%= j render('articles') %>'); diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/show_on_group_order_article_create.js.erb b/plugins/current_orders/app/views/current_orders/ordergroups/show_on_group_order_article_create.js.erb new file mode 100644 index 00000000..0c9bdb16 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/show_on_group_order_article_create.js.erb @@ -0,0 +1,7 @@ +// Handle more advanced DOM update after AJAX database manipulation. +// See publish/subscribe design pattern in /doc. +(function(w) { + $('#goa_<%= @goa.id %>').remove(); // just to be sure: remove table row which is added below + $('#articles_by_groups tbody').append('<%= j render('article', goa: @goa, base_unit: params[:base_unit]) %>').addClass('success'); +})(window); + diff --git a/plugins/current_orders/app/views/current_orders/ordergroups/show_on_group_order_article_update.js.erb b/plugins/current_orders/app/views/current_orders/ordergroups/show_on_group_order_article_update.js.erb new file mode 100644 index 00000000..284fce3e --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/ordergroups/show_on_group_order_article_update.js.erb @@ -0,0 +1,7 @@ +// Handle more advanced DOM update after AJAX database manipulation. +// See publish/subscribe design pattern in /doc. +(function(w) { + // table update is done by group_order_article hook already + $('#to_pay_message').html('<%= j to_pay_message(@ordergroup) %>'); +})(window); + diff --git a/plugins/current_orders/app/views/current_orders/orders/receive.html.haml b/plugins/current_orders/app/views/current_orders/orders/receive.html.haml new file mode 100644 index 00000000..c73faf06 --- /dev/null +++ b/plugins/current_orders/app/views/current_orders/orders/receive.html.haml @@ -0,0 +1,24 @@ +- title t('.title') + +.well + - if @orders.empty? + = t '.no_finished_orders' + - else + %table.table.table-striped + %thead + %tr + %th= heading_helper Order, :name + %th= heading_helper Order, :ends + %th= heading_helper Order, :note + %th{colspan: "2"} + %tbody + - for order in @orders + %tr + %td= order.name + %td= format_time(order.ends) + %td= truncate(order.note) + %td= receive_button order, class: 'btn-small' unless order.stockit? + %td + = link_to t('ui.show'), order, class: 'btn btn-small' + = order_pdf order, :fax, t('orders.show.download.fax_pdf'), class: 'btn btn-small' + diff --git a/plugins/current_orders/config/locales/en.yml b/plugins/current_orders/config/locales/en.yml new file mode 100644 index 00000000..7bbe6586 --- /dev/null +++ b/plugins/current_orders/config/locales/en.yml @@ -0,0 +1,61 @@ +en: + current_orders: + articles: + article: + no_selection: Choose an article to show who ordered it, or download pick lists at the right. + article_info: + from: from %{supplier} + unit: per %{unit} + form: + article_placeholder: Search articles... + current_orders: All current orders + index: + title: Distribute article + ordergroups: + piece: pc + unit: unit + add_new: Add an ordergroup... + show: + title: ! 'Distribute %{name}' + group_orders: + index: + title: Your current orders + ordergroups: + articles: + add_new: Add an article... + form: + ordergroup_placeholder: Choose an ordergroup... + no_selection: Choose an ordergroup to show the articles. + index: + title: Articles for ordergroup + payment_bar: + account_balance: Account balance + new_pin: PIN + new_transaction: New transaction + payment: ! 'Payment:' + show: + title: Articles for %{name} + orders: + receive: + title: Receive orders + no_finished_orders: There are currently no orders to receive. + documents: + multiple_orders_by_articles: + filename: Current orders sorted by article + title: Current orders - by article + multiple_orders_by_groups: + filename: Current orders sorted by group + title: Current orders - by group + helpers: + current_orders: + pay_done: Fully paid + pay_none: Nothing to pay + pay_amount: To pay %{amount} + js: + current_orders: + articles: + above: '%{count} more
than available' + below: '%{count} left over' + equal: all distributed + ui: + back: Back diff --git a/plugins/current_orders/config/locales/nl.yml b/plugins/current_orders/config/locales/nl.yml new file mode 100644 index 00000000..b2c56292 --- /dev/null +++ b/plugins/current_orders/config/locales/nl.yml @@ -0,0 +1,55 @@ +nl: + current_orders: + articles: + article: + no_selection: Kies een artikel om te zien wie het besteld heeft, of download verdeellijsten rechtsboven. + article_info: + from: van %{supplier} + unit: per %{unit} + form: + article_placeholder: Zoek artikelen... + current_orders: Alle huidige bestellingen + index: + title: Artikelen verdelen + ordergroups: + piece: st + add_new: Huishouden toevoegen... + show: + title: ! '%{name} verdelen' + ordergroups: + articles: + add_new: Artikel toevoegen... + form: + ordergroup_placeholder: Kies een huishouden... + no_selection: Kies een huishouden om de artikelen te tonen. + index: + title: Artikelen voor huishouden + payment_bar: + account_balance: Account balance + new_pin: PIN + new_transaction: Nieuwe transactie + payment: ! 'Betaling:' + show: + title: Artikelen voor %{name} + orders: + receive: + title: Bestellingen ontvangen + no_finished_orders: Er zijn momenteel geen bestellingen die ontvangen hoeven te worden. + documents: + multiple_orders_by_articles: + filename: Huidige bestellingen per artikel + title: Huidige bestellingen - per artikel + multiple_orders_by_groups: + filename: Huidige bestellingen per huishouden + title: Huidige bestellingen - per huishouden + js: + current_orders: + articles: + above: '%{count} meer dan
beschikbaar' + below: '%{count} blijft over' + equal: alles verdeeld + helpers: + current_orders: + pay_done: Alles betaald + pay_none: Niets te betalen + pay_amount: Te betalen %{amount} diff --git a/plugins/current_orders/config/routes.rb b/plugins/current_orders/config/routes.rb new file mode 100644 index 00000000..f642fc31 --- /dev/null +++ b/plugins/current_orders/config/routes.rb @@ -0,0 +1,27 @@ +Rails.application.routes.draw do + scope '/:foodcoop' do + namespace :current_orders do + resources :ordergroups, :only => [:index, :show] do + collection do + get :show_on_group_order_article_create + get :show_on_group_order_article_update + end + end + + resources :articles, :only => [:index, :show] do + collection do + get :show_on_group_order_article_create + end + end + + resource :orders, :only => [:show] do + collection do + get :my + get :receive + end + end + + resources :group_orders, :only => [:index] + end + end +end diff --git a/plugins/current_orders/foodsoft_current_orders.gemspec b/plugins/current_orders/foodsoft_current_orders.gemspec new file mode 100644 index 00000000..03a85483 --- /dev/null +++ b/plugins/current_orders/foodsoft_current_orders.gemspec @@ -0,0 +1,20 @@ +$:.push File.expand_path("../lib", __FILE__) + +# Maintain your gem's version: +require "foodsoft_current_orders/version" + +# Describe your gem and declare its dependencies: +Gem::Specification.new do |s| + s.name = "foodsoft_current_orders" + s.version = FoodsoftCurrentOrders::VERSION + s.authors = ["wvengen"] + s.email = ["dev-voko@willem.engen.nl"] + s.homepage = "https://github.com/foodcoop-adam/foodsoft" + s.summary = "Quick support for working on all currently active orders in foodsoft." + s.description = "" + + s.files = Dir["{app,config,db,lib}/**/*"] + ["Rakefile", "README.md"] + + s.add_dependency "rails" + s.add_dependency "deface", "~> 1.0.0" +end diff --git a/plugins/current_orders/lib/foodsoft_current_orders.rb b/plugins/current_orders/lib/foodsoft_current_orders.rb new file mode 100644 index 00000000..c75cea81 --- /dev/null +++ b/plugins/current_orders/lib/foodsoft_current_orders.rb @@ -0,0 +1,5 @@ +require "deface" +require "foodsoft_current_orders/engine" + +module FoodsoftCurrentOrders +end diff --git a/plugins/current_orders/lib/foodsoft_current_orders/engine.rb b/plugins/current_orders/lib/foodsoft_current_orders/engine.rb new file mode 100644 index 00000000..c3a555b6 --- /dev/null +++ b/plugins/current_orders/lib/foodsoft_current_orders/engine.rb @@ -0,0 +1,4 @@ +module FoodsoftCurrentOrders + class Engine < ::Rails::Engine + end +end diff --git a/plugins/current_orders/lib/foodsoft_current_orders/version.rb b/plugins/current_orders/lib/foodsoft_current_orders/version.rb new file mode 100644 index 00000000..af58aa9c --- /dev/null +++ b/plugins/current_orders/lib/foodsoft_current_orders/version.rb @@ -0,0 +1,3 @@ +module FoodsoftCurrentOrders + VERSION = "0.0.1" +end