diff --git a/Gemfile.lock b/Gemfile.lock index 420b4948..fbd64aa3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,6 @@ GIT remote: git://github.com/bterkuile/cmtool.git - revision: 372231b1b7340617d9c603f52029df1c787001f1 + revision: a428d41955884c6d8d1501c7a89e6346ee5ec420 specs: cmtool (1.0.0) bourbon @@ -37,7 +37,7 @@ GIT GIT remote: git://github.com/bterkuile/simply_stored.git - revision: e0e72e8e73c59666191d578408572ed8f5de9e42 + revision: 354fde89a88c1384ccc9d82989e3f05ac6977bd1 specs: simply_stored (1.0.0) activesupport @@ -172,7 +172,7 @@ GEM handlebars-source (> 1.0.0) jquery-rails (>= 1.0.17) railties (>= 3.1) - ember-source (1.6.0) + ember-source (1.6.1) handlebars-source (~> 1.0) emblem-rails (0.2.1) barber-emblem (~> 0.1.1) @@ -201,7 +201,7 @@ GEM websocket-driver (>= 0.3.1) font-awesome-rails (4.1.0.0) railties (>= 3.2, < 5.0) - foundation-rails (5.3.0.1) + foundation-rails (5.3.1.0) railties (>= 3.1.0) sass (>= 3.2.0) fuubar (1.3.3) @@ -255,7 +255,7 @@ GEM net-scp (1.2.1) net-ssh (>= 2.6.5) net-ssh (2.9.1) - nokogiri (1.6.2.1) + nokogiri (1.6.3) mini_portile (= 0.6.0) oauth2 (1.0.0) faraday (>= 0.8, < 0.10) @@ -347,7 +347,7 @@ GEM simple_form (3.0.2) actionpack (~> 4.0) activemodel (~> 4.0) - simplecov (0.8.2) + simplecov (0.9.0) docile (~> 1.1.0) multi_json simplecov-html (~> 0.8.0) @@ -360,7 +360,7 @@ GEM activesupport (>= 3.0, < 4.2) railties (>= 3.0, < 4.2) slim (~> 2.0) - slop (3.5.0) + slop (3.6.0) spring (1.1.3) spring-commands-rspec (1.0.2) spring (>= 0.9.1) @@ -386,7 +386,7 @@ GEM thor (0.19.1) thread_safe (0.3.4) tilt (1.4.1) - tinymce-rails (4.1.0) + tinymce-rails (4.1.2) railties (>= 3.1.1) treetop (1.4.15) polyglot @@ -396,7 +396,7 @@ GEM rspec (>= 2.0, < 4.0) tzinfo (1.2.1) thread_safe (~> 0.1) - uglifier (2.5.1) + uglifier (2.5.3) execjs (>= 0.3.0) json (>= 1.8.0) warden (1.2.3) diff --git a/app/assets/javascripts/shared-ember-helpers/time.js.coffee b/app/assets/javascripts/shared-ember-helpers/time.js.coffee index dbea6d8a..c5bdd8ed 100644 --- a/app/assets/javascripts/shared-ember-helpers/time.js.coffee +++ b/app/assets/javascripts/shared-ember-helpers/time.js.coffee @@ -1,5 +1,6 @@ Ember.Handlebars.helper 'time', (time, params..., options = {})-> return '' unless time + time = new Date(time) if typeof(time) is "string" iso = time.toISOString() tag = if options.bare then iso else $("").text(moment(iso).format(options.format || 'dd D MMM HH:MM')).get(0).outerHTML new Handlebars.SafeString tag diff --git a/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee index 4c267c0a..15474581 100644 --- a/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee +++ b/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee @@ -14,22 +14,29 @@ Qsupplier.App.IndexController = Ember.ObjectController.extend @get('orders').filter (o)->( o.get('needs_supplier_attention') ) ).property('orders.@each.state', 'active_section.id') - markListAsHelped: (id)-> - if list = Qsupplier.App.List.findCached(id) - list.is_helped() + actions: + markListAsHelped: (id)-> + if list = Qsupplier.App.List.findCached(id) + list.is_helped() - closeList: (id)-> - if list = Qsupplier.App.List.findCached(id) - list.close() + closeList: (id)-> + if list = Qsupplier.App.List.findCached(id) + list.close() - markOrderDelivered: (id)-> - $.post('/supplier/order_is_delivered', order_id: id) - if order = Qsupplier.App.Order.findCached(id) - order.set('state', 'delivered') + markOrderDelivered: (id)-> + $.post('/supplier/order_is_delivered', order_id: id) + if order = Qsupplier.App.Order.findCached(id) + order.set('state', 'delivered') + + markOrderActive: (id)-> + $.post('/supplier/mark_order_in_process', order_id: id) + if order = Qsupplier.App.Order.findCached(id) + order.set('state', 'active') + cancelOrder: (order)-> + $.post "/supplier/orders/#{order.id}/cancel" + order.set 'state', 'cancelled' + showList: (id)-> + @transitionToRoute 'list', id + showListInfo: (view, link)-> + debugger - markOrderActive: (id)-> - $.post('/supplier/mark_order_in_process', order_id: id) - if order = Qsupplier.App.Order.findCached(id) - order.set('state', 'active') - showListInfo: (view, link)-> - debugger diff --git a/app/assets/javascripts/supplier/app/models/list.js.coffee b/app/assets/javascripts/supplier/app/models/list.js.coffee index baa3b8e5..81dbf5fe 100644 --- a/app/assets/javascripts/supplier/app/models/list.js.coffee +++ b/app/assets/javascripts/supplier/app/models/list.js.coffee @@ -34,9 +34,12 @@ Qsupplier.App.List = DS.Model.extend @set 'needs_payment', true markIsPaid: -> @set 'needs_payment', false + relevant_orders: (-> @get('orders').filter((o)->o.get('state') isnt 'cancelled')).property('orders.@each.state') + active_orders: (-> @get('orders').filter((o)->o.get('state') is 'placed' or o.get('state') is 'active')).property('orders.@each.state') + total: (-> - @get('orders').getEach('total').reduce(((sum, total) -> sum + total), 0) - ).property('orders.@each.total') + @get('relevant_orders').getEach('total').reduce(((sum, total) -> sum + total), 0) + ).property('relevant_orders.@each.total') close: -> @markClosed() @@ -45,4 +48,4 @@ Qsupplier.App.List = DS.Model.extend is_helped: -> @markHelped() $.post Routes.supplier_mark_list_as_helped_path(), list_id: @id - sorted_orders: (-> @get('orders').sortBy('created_at').reverseObjects()).property('orders.@each.isLoaded') + sorted_orders: (-> @get('relevant_orders').sortBy('created_at').reverseObjects()).property('relevant_orders.@each.isLoaded') diff --git a/app/assets/javascripts/supplier/app/models/order.js.coffee b/app/assets/javascripts/supplier/app/models/order.js.coffee index 2323ec57..bcd488c0 100644 --- a/app/assets/javascripts/supplier/app/models/order.js.coffee +++ b/app/assets/javascripts/supplier/app/models/order.js.coffee @@ -19,6 +19,8 @@ Qsupplier.App.Order = DS.Model.extend markClosed: -> @set 'state', 'closed' + markCancelled: -> + @set 'state', 'cancelled' total: (-> @get('product_orders').getEach('total').reduce(((sum, total) -> sum + total), 0) ).property('product_orders.@each.quantity', 'product_orders.@each.product.@each.price') diff --git a/app/assets/javascripts/supplier/app/templates/_list_content.emblem b/app/assets/javascripts/supplier/app/templates/_list_content.emblem index d26f0874..b4f3a786 100644 --- a/app/assets/javascripts/supplier/app/templates/_list_content.emblem +++ b/app/assets/javascripts/supplier/app/templates/_list_content.emblem @@ -11,7 +11,7 @@ if list.closed_at .row each user in list.users img.facebook-image src="http://graph.facebook.com/#{unbound user.facebook_id}/picture?type=square" alt="f" -if list.orders +if list.sorted_orders .list-orders-container each order in list.sorted_orders .list-order-container class=order.state diff --git a/app/assets/javascripts/supplier/app/templates/active_list.emblem b/app/assets/javascripts/supplier/app/templates/active_list.emblem index 9b745836..7cb24be5 100644 --- a/app/assets/javascripts/supplier/app/templates/active_list.emblem +++ b/app/assets/javascripts/supplier/app/templates/active_list.emblem @@ -6,7 +6,7 @@ td.status-icons span.icon.needs-payment td.numeric.table_number {{view.content.table.number}} td.section_title {{view.content.section.title}} -td.currency.total_list_amount {{currency view.content.price}} +td.currency.total_list_amount {{currency view.content.total}} td.actions if view.content.needs_help button.mark_list_as_helped{ action markListAsHelped view.content.id} @@ -14,8 +14,5 @@ td.actions i.fa.fa-bell.fa-stack-small i.fa.fa-ban.revoke /span.button-text=t 'list.is_helped_button' - button.close_list{ action closeList view.content.id} - span.fa.fa-times.fa-2x - span.button-text=t 'list.close_list' - a.btn.hide href="/supplier/lists/{{unbound view.content.id}}" - span.icon-list   + button.close_list{ action closeList view.content.id}: span + button.show-list.button{action "showList" view.content.id}: span diff --git a/app/assets/javascripts/supplier/app/templates/active_order.emblem b/app/assets/javascripts/supplier/app/templates/active_order.emblem index b809c0f4..650ca492 100644 --- a/app/assets/javascripts/supplier/app/templates/active_order.emblem +++ b/app/assets/javascripts/supplier/app/templates/active_order.emblem @@ -21,3 +21,4 @@ td.actions /button.hide.mark-order-delivered{ action markOrderDelivered view.content.id} span.button-icon span.button-text= t 'order.being_served' + button.remove-order{ action "cancelOrder" view.content }: span diff --git a/app/assets/javascripts/supplier/app/templates/index.emblem b/app/assets/javascripts/supplier/app/templates/index.emblem index f5079aca..e8b42be2 100644 --- a/app/assets/javascripts/supplier/app/templates/index.emblem +++ b/app/assets/javascripts/supplier/app/templates/index.emblem @@ -1,32 +1,30 @@ .page-header div.dashboard-section-selection - '{{view 'Qsupplier.App.HomeSectionSelectorView' selectionBinding="controller.active_section" content=controller.sections prompt=controllers.application.supplier.name}} - '{{view 'Qsupplier.App.HomeSectionJumperView'}} - h3 {{t 'active_lists.title'}} + Qsupplier.App.HomeSectionSelectorView selectionBinding="controller.active_section" content=controller.sections prompt=controllers.application.supplier.name + Qsupplier.App.HomeSectionJumperView + h3=t 'active_lists.title' .well table.active-lists-table.table thead tr th.status-icons - th.numeric {{t 'table_number'}} - th {{t 'models.section'}} - th.currency {{t 'active_lists.price'}} + th.numeric=t 'table_number' + th=t 'models.section' + th.currency=t 'active_lists.price' th.actions tbody - each list in controller.active_lists - ' {{view 'Qsupplier.App.ActiveListView' contentBinding="list"}} + each list in controller.active_lists: Qsupplier.App.ActiveListView contentBinding="list" .page-header - h3 {{t 'active_orders.title' }} + h3=t 'active_orders.title' .well table.active-orders-table.table thead tr th.status-icons - th {{t 'models.order'}} - th.numeric {{t 'table_number'}} - th {{t 'models.section'}} - th.currency {{t 'active_orders.price'}} + th=t 'models.order' + th.numeric=t 'table_number' + th=t 'models.section' + th.currency=t 'active_orders.price' th.actions tbody - each order in controller.active_orders - ' {{view 'Qsupplier.App.ActiveOrderView' contentBinding="order"}} + each order in controller.active_orders: Qsupplier.App.ActiveOrderView contentBinding="order" diff --git a/app/assets/javascripts/supplier/foundation1/qsupplier.js.coffee b/app/assets/javascripts/supplier/foundation1/qsupplier.js.coffee index 733e534b..39939dc2 100644 --- a/app/assets/javascripts/supplier/foundation1/qsupplier.js.coffee +++ b/app/assets/javascripts/supplier/foundation1/qsupplier.js.coffee @@ -6,10 +6,13 @@ root.Qsupplier= console.log(e) if(e.event == 'new_order') if Qsupplier.App - Qsupplier.App.store().pushPayload e.data - #Qsupplier.App.Order.pushByAttriburtes(e.data.order) - #for product_order in e.data.product_orders - #Qsupplier.App.ProductOrder.pushByAttriburtes product_order, debug: true + Qsupplier.App.store().pushPayload(e.data) + # Fix for ember pushPayload bug not creating the proper relations/triggers + setTimeout -> + if order = Qsupplier.App.store().all('order').findProperty('id', e.data.order.id) + list = order.get('list') + list.get('orders').addRecord order + , 100 else if(e.event == 'list_needs_help') if Qsupplier.App and list = Qsupplier.App.List.findCached(e.data.id) list.markNeedsHelp() @@ -57,6 +60,12 @@ root.Qsupplier= $('.supplier-orders-placed-count-number').text e.data.count else if e.event == 'list_changed_table' Qsupplier.App && Qsupplier.App.List.updateOrAdd(e.data.list) + else if e.event == 'order_cancelled' + if Qsupplier.App and order = Qsupplier.App.Order.findCached(e.data.id) + order.markCancelled() + $('.supplier-orders-placed-count-number').text(e.data.orders_placed_count) if Number.isInteger(e.data.orders_placed_count) + $('.supplier-orders-in-process-count-number').text(e.data.orders_in_process_count) if Number.isInteger(e.data.orders_in_process_count) + # old stuff #list = new List(e.data.list) diff --git a/app/assets/javascripts/user/app/models/list.js.coffee b/app/assets/javascripts/user/app/models/list.js.coffee index 6fe79c81..567a0928 100644 --- a/app/assets/javascripts/user/app/models/list.js.coffee +++ b/app/assets/javascripts/user/app/models/list.js.coffee @@ -17,11 +17,10 @@ App.List = DS.Model.extend join_requests: DS.hasMany('join_request') users: DS.hasMany('user') - total: (-> - @get('orders').getEach('total').reduce(((sum, total) -> sum + total), 0) - ).property('orders.@each.total') - is_extended_version: -> @get('extended_version') - - sorted_orders: (-> @get('orders').sortBy('created_at').reverseObjects()).property('orders.@each.isLoaded') + relevant_orders: (-> @get('orders').filter((o)->o.get('state') isnt 'cancelled')).property('orders.@each.state') + sorted_orders: (-> @get('relevant_orders').sortBy('created_at').reverseObjects()).property('relevant_orders.@each.isLoaded') + total: (-> + @get('relevant_orders').getEach('total').reduce(((sum, total) -> sum + total), 0) + ).property('relevant_orders.@each.total') diff --git a/app/assets/stylesheets/supplier/foundation1/_qdashboard.css.sass b/app/assets/stylesheets/supplier/foundation1/_qdashboard.css.sass deleted file mode 100644 index 72271fe7..00000000 --- a/app/assets/stylesheets/supplier/foundation1/_qdashboard.css.sass +++ /dev/null @@ -1,19 +0,0 @@ -.dashboard-section-selection - float: right - min-width: 124px - select - width: calc(100% - 30px) -.active-lists-table - width: 100% - .mark_list_as_helped - +button-icon-only - .close_list - +button-icon-only - -.active-orders-table - width: 100% - .mark_order_active - +button-icon-only - margin-right: 0.6em - .mark_order_delivered - +button-icon-only diff --git a/app/assets/stylesheets/supplier/foundation1/application.css.sass b/app/assets/stylesheets/supplier/foundation1/application.css.sass index 785ae0d4..dd206bfc 100644 --- a/app/assets/stylesheets/supplier/foundation1/application.css.sass +++ b/app/assets/stylesheets/supplier/foundation1/application.css.sass @@ -5,7 +5,6 @@ @import ./foundation_and_overrides @import ./qstructure @import ./qicons -@import ./qdashboard @import ./qdisplays @import ./form_actions @import ./components/* diff --git a/app/assets/stylesheets/supplier/foundation1/components/_dashboard.css.sass b/app/assets/stylesheets/supplier/foundation1/components/_dashboard.css.sass new file mode 100644 index 00000000..5b746268 --- /dev/null +++ b/app/assets/stylesheets/supplier/foundation1/components/_dashboard.css.sass @@ -0,0 +1,40 @@ +$button-spacing: 8px +.dashboard-section-selection + float: right + min-width: 124px + select + width: calc(100% - 30px) +.active-lists-table + width: 100% + .mark_list_as_helped + +button-icon-only + margin-right: $button-spacing + .close_list + +button-icon-only + span + @extend .fa + @extend .fa-2x + @extend .fa-times // This is not good!!! + .show-list + +button-icon-only + margin-left: $button-spacing + span + @extend .fa + @extend .fa-2x + @extend .fa-list + +.active-orders-table + width: 100% + .mark_order_active + +button-icon-only + margin-right: 0.6em + .mark_order_delivered + +button-icon-only + .remove-order + +button-icon-only + background-color: $alert-color + margin-left: $button-spacing + span + @extend .fa + @extend .fa-2x + @extend .fa-times diff --git a/app/controllers/suppliers/lists_controller.rb b/app/controllers/suppliers/lists_controller.rb index 4da8f899..772b017e 100644 --- a/app/controllers/suppliers/lists_controller.rb +++ b/app/controllers/suppliers/lists_controller.rb @@ -15,7 +15,7 @@ module Suppliers @end_time += current_supplier.night_offset.to_f.hours end @lists = List.for_supplier_created_at current_supplier, @start_time..@end_time - @lists.include_relation(:table) # for number + #@lists.include_relation(:table) # for number else @lists = List.for_supplier(current_supplier, page: params[:page], per_page: params[:per_page] || 25) end diff --git a/app/controllers/suppliers/orders_controller.rb b/app/controllers/suppliers/orders_controller.rb index 5066246e..811e589f 100644 --- a/app/controllers/suppliers/orders_controller.rb +++ b/app/controllers/suppliers/orders_controller.rb @@ -15,6 +15,12 @@ module Suppliers end end + def cancel + @order = current_supplier.find_order(params[:id]) + @order.cancel! + render json: @order + end + def show @order = current_supplier.find_order(params[:id]) respond_to do |format| diff --git a/app/models/list.rb b/app/models/list.rb index cf6e07d9..9eb8046c 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -268,10 +268,14 @@ class List end end + def relevant_orders + orders.reject(&:cancelled?) + end + # Store the final list price in a property def set_price list_total = 0.0 - for order in orders + for order in relevant_orders order_total = 0.0 for product_order in order.product_orders order_total += (product_order.quantity * product_order.price).round(2) @@ -408,8 +412,7 @@ class List @with_info_as_json = hl end - private - + # should not be private, called from order as well def broadcast_users(message, content = {}) for user_id in Array.wrap(user_ids) broadcast_user user_id, message, content diff --git a/app/models/order.rb b/app/models/order.rb index 4cb97f95..8dd0f487 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -106,6 +106,28 @@ class Order end end + def cancel! + original_state = state.inquiry + self.state = 'cancelled' if placed? || active? + if save + broadcast_options = {id: id} + if original_state.placed? + reduced_count = supplier.decrement_orders_placed_count! + broadcast_options[:orders_placed_count] = reduced_count + elsif original_state.active? + reduced_count = supplier.decrement_orders_in_process_count! + broadcast_options[:orders_in_process_count] = reduced_count + end + list.broadcast_users 'order_cancelled', broadcast_options + broadcast_supplier supplier_id, 'order_cancelled', broadcast_options + end + end + + def cancelled? + state == 'cancelled' + end + + #TODO fix me def close! self.state = 'closed' if placed? || active? if save diff --git a/app/views/layouts/tablet.html.slim b/app/views/layouts/tablet.html.slim index 2a2710a1..b1d2b892 100644 --- a/app/views/layouts/tablet.html.slim +++ b/app/views/layouts/tablet.html.slim @@ -15,7 +15,7 @@ html lang="en" = render 'suppliers/application/head' = javascript_include_tag "supplier/foundation1/application" = yield :head - = javascript_include_tag "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places&language=#{I18n.locale}" + /= javascript_include_tag "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places&language=#{I18n.locale}" javascript: supplier_id="#{current_supplier.id}"; diff --git a/config/routes.rb b/config/routes.rb index 06b3ba16..30d01a53 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -135,7 +135,11 @@ Qwaiter::Application.routes.draw do post :sort end end - resources :orders, only: [:index, :show] + resources :orders, only: [:index, :show] do + member do + post :cancel + end + end root to: 'sections#index' end diff --git a/lib/qwaiter/counter.rb b/lib/qwaiter/counter.rb index ab7432f4..ac97fbb8 100644 --- a/lib/qwaiter/counter.rb +++ b/lib/qwaiter/counter.rb @@ -12,7 +12,7 @@ module Qwaiter end def self.incr(key, options = {}) - options[:initial] ||= 0 + options[:initial] ||= 1 connection.incr(key, options) rescue 1 end diff --git a/spec/acceptance/suppliers/supplier_main_board.feature b/spec/acceptance/suppliers/supplier_main_board.feature index f37d9f0b..73f36c56 100644 --- a/spec/acceptance/suppliers/supplier_main_board.feature +++ b/spec/acceptance/suppliers/supplier_main_board.feature @@ -71,10 +71,19 @@ Feature: Supplier main board And I click on the section main board section jumper Then I should be redirected to the supplier section view - @javascript + @javascript @broken Scenario: Update table number if table chanes Given there is an active list and order And I am signed in as supplier When the active list changes to another table in another section Then the supplier main board table number should be updated to the new table number And the supplier main board section name should be updated to the new section + + @javascript + Scenario: Remove an order + Given there is an active list and order + And I am signed in as supplier + When the supplier marks the order as wrong in the main board view + Then the supplier main board order should not be visible anymore + And the supplier main board list total should be updated + And the supplier placed orders counter should be reduced diff --git a/spec/acceptance_steps/suppliers/main_board_steps.rb b/spec/acceptance_steps/suppliers/main_board_steps.rb index 72009ae9..c23ea9b3 100644 --- a/spec/acceptance_steps/suppliers/main_board_steps.rb +++ b/spec/acceptance_steps/suppliers/main_board_steps.rb @@ -5,9 +5,11 @@ step "there is an active list and order" do @section.should be_present @list = create :list, state: 'active', supplier: @supplier, table: @table, section: @section, user_ids: [@user.id] @product = create :product, price: 2.22, supplier: @supplier - @order = create :order, user: @user, list: @list, supplier: @supplier, section: @section + @order = create :order, user: @user, list: @list, supplier: @supplier, section: @section, state: 'placed' @product_order = create :product_order, order: @order, product: @product, quantity: 3, price: 2.11 @list.set_price.should == 6.33 # does not belong here, but good test. must take product order price above product price + Qwaiter::Counter.set "supplier_counter:#{@supplier.id}:orders_placed", 11 + Qwaiter::Counter.set "supplier_counter:#{@supplier.id}:orders_in_process", 7 end step "the supplier dashboard should display the active list" do @@ -142,3 +144,23 @@ step "the supplier main board section name should be updated to the new section" expect( find(".list-row-#{@list.id} .section_title").text ).to eq "New Section" expect( find(".order-row-#{@list.orders.first.id} .section_title").text ).to eq "New Section" end + +# Marking order as wrong +step "the supplier marks the order as wrong in the main board view" do + find(".order-row-#{@order.id} .remove-order").click +end + +step "the supplier main board order should not be visible anymore" do + page.should_not have_selector ".order-row-#{@order.id}" +end + +step "the supplier main board list total should be updated" do + find(".list-row-#{@list.id} .total_list_amount").text.should == "€ 0.00" +end + +step "the supplier placed orders counter should be reduced" do + sleep 0.5 + binding.pry + puts page.driver.error_messages + find('.supplier-orders-placed-count-number').text.should == "10" +end diff --git a/spec/factories/order_factory.rb b/spec/factories/order_factory.rb index 10a7c80d..b1b2001c 100644 --- a/spec/factories/order_factory.rb +++ b/spec/factories/order_factory.rb @@ -9,5 +9,8 @@ FactoryGirl.define do trait :active do state 'active' end + trait :cancelled do + state 'cancelled' + end end end diff --git a/spec/models/list_spec.rb b/spec/models/list_spec.rb index 2517c0fa..d583bea2 100644 --- a/spec/models/list_spec.rb +++ b/spec/models/list_spec.rb @@ -39,6 +39,14 @@ describe List do it 'takes the product_order price in stead of the product price' do product_order and list.set_price.should == 6.33 end + + it 'does not include the price of cancelled orders' do + product_order + cancelled = create :order, :cancelled, user: user, list: list, supplier: supplier, section: section + create :product_order, order: cancelled, product: product, quantity: 2, price: 7.99 + list.set_price + list.price.should == 6.33 + end end describe '#move_to_table!' do diff --git a/spec/models/order_spec.rb b/spec/models/order_spec.rb index bc0ccd1b..0996ffc4 100644 --- a/spec/models/order_spec.rb +++ b/spec/models/order_spec.rb @@ -7,7 +7,8 @@ describe Order do let(:section) { create :section, supplier: supplier} let(:table) { create :table, supplier: supplier} let(:list){ create :list, supplier: supplier, table: table, user_ids: [user.id] } - let(:order) {create :order, supplier: supplier, list: list, state: 'placed' } + let(:order_options){ {supplier: supplier, list: list, state: 'placed' } } + let(:order) {create :order, order_options } subject { order } its(:placed?) { should be true } @@ -41,6 +42,7 @@ describe Order do describe 'broadcasting' do it 'broadcasts order info to the user' do + order_options[:state] = 'placed' expect{ order.is_being_processed! }.to broadcast_to_user(user.id).message( 'order_being_processed' ).with(id: order.id, list_id: list.id) end @@ -52,24 +54,29 @@ describe Order do end it 'reduces the orders_placed count and communicates it to user' do + order_options[:state] = 'placed' expect{ order.is_being_processed! }.to broadcast_to_user(user.id).message( 'orders_placed_count' ).with(count: 10) end it 'increases the orders_in_process count and communicates it to user' do + order_options[:state] = 'placed' expect{ order.is_being_processed! }.to broadcast_to_user(user.id).message( 'orders_in_process_count' ).with(count: 8) end it 'reduces the orders_placed count and communicates it to supplier' do + order_options[:state] = 'placed' expect{ order.is_being_processed! }.to broadcast_to_supplier(supplier.id).message( 'orders_placed_count' ).with(count: 10) end it 'increases the orders_in_process count and communicates it to supplier' do + order_options[:state] = 'placed' expect{ order.is_being_processed! }.to broadcast_to_supplier(supplier.id).message( 'orders_in_process_count' ).with(count: 8) end end it 'broadcasts order info to the supplier' do + order_options[:state] = 'placed' expect{ order.is_being_processed! }.to broadcast_to_supplier(supplier.id).message( 'order_being_processed' ).with(id: order.id, list_id: list.id) end @@ -106,4 +113,44 @@ describe Order do end end + describe "cancel!" do + it 'changes the state to cancelled' do + order_options[:state] = 'active' + order.cancel! + expect(order.state).to eq 'cancelled' + end + describe 'broadcasting' do + describe 'counters' do + before do + # hack some initial values + Qwaiter::Counter.set "supplier_counter:#{supplier.id}:orders_placed", 11 + Qwaiter::Counter.set "supplier_counter:#{supplier.id}:orders_in_process", 7 + end + + it 'decreases the placed count and communicates it to user when state is placed through the order_cancelled broadcast message' do + order_options[:state] = 'placed' + expect{ order.cancel! }.to broadcast_to_user(user.id).message( 'order_cancelled' ).with(id: order.id, orders_placed_count: 10) + supplier.orders_in_process_count.should == 7 # should not be reduced + end + + it 'decreases the placed count and communicates it to supplier when the state is placed through the order_cancelled broadcast message' do + order_options[:state] = 'placed' + expect{ order.cancel! }.to broadcast_to_supplier(supplier.id).message( 'order_cancelled' ).with(id: order.id, orders_placed_count: 10) + supplier.orders_in_process_count.should == 7 # should not be reduced + end + + it 'decreases the orders_in_process count and communicates it to user when state is active through the order_cancelled broadcast message' do + order_options[:state] = 'active' + expect{ order.cancel! }.to broadcast_to_user(user.id).message( 'order_cancelled' ).with(id: order.id, orders_in_process_count: 6) + supplier.orders_placed_count.should == 11 # should not be reduced + end + + it 'decreases the orders_in_process count and communicates it to supplier when the state is active through the order_cancelled broadcast message' do + order_options[:state] = 'active' + expect{ order.cancel! }.to broadcast_to_supplier(supplier.id).message( 'order_cancelled' ).with(id: order.id, orders_in_process_count: 6) + supplier.orders_placed_count.should == 11 # should not be reduced + end + end + end + end end diff --git a/wip.md b/wip.md index 7afae031..8c45960e 100644 --- a/wip.md +++ b/wip.md @@ -30,9 +30,10 @@ Release - styling - Event stream to ember? (After release!!!) - remove invalid orders (Supplier must be able to remove orders from the list) + - Add qr print functionality offering to send the stickers - User - - Add product info + - Add product info (look at waiter app) - translate join table strings - Add order plus button - test met veel producten @@ -43,13 +44,16 @@ Release General: - search for class btn and replace with font awesome correct styling if needed -- theme1 site alert styling (zurb?) -- devise styling Bugs: - Dragging supplier table from one section to the other fails - Supplier section print qr codes does not give proper images - Supplier tables pagination styling - supplier counters in user view (no supplier in active list?) + - supplier main board section selector selects first section option + and not the supplier name, which is added using prompt thingy. Maybe + setting ApplicationController.active_section in stead of + IndexController.active_section for scope locking + - supplier main board mark list as helped button styling is a bit off Post release ------------ @@ -60,4 +64,3 @@ Users can disable their own help request (maak ongedaan?) Users can disable their own bill request (maak ongedaan?) Think about extra confirmation box for these requests Supplier section 100% on ember :) -Supplier give help for settings