office_clerk 0.8 → 0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -2
- data/Gemfile.lock +159 -100
- data/Guardfile +3 -0
- data/README.md +7 -2
- data/Rakefile +9 -0
- data/app/assets/images/missing_list.png +0 -0
- data/app/assets/images/missing_product.png +0 -0
- data/app/assets/images/missing_thumb.png +0 -0
- data/app/assets/javascripts/office_clerk.js +7 -5
- data/app/assets/stylesheets/office_clerk.css.scss +89 -14
- data/app/controllers/baskets_controller.rb +37 -26
- data/app/controllers/orders_controller.rb +44 -29
- data/app/controllers/products_controller.rb +6 -6
- data/app/controllers/purchases_controller.rb +18 -8
- data/app/helpers/admin_helper.rb +16 -21
- data/app/helpers/baskets_helper.rb +31 -0
- data/app/helpers/categories_helper.rb +3 -0
- data/app/helpers/office_helper.rb +34 -7
- data/app/helpers/orders_helper.rb +2 -3
- data/app/models/basket.rb +46 -20
- data/app/models/clerk.rb +6 -1
- data/app/models/item.rb +7 -0
- data/app/models/order.rb +18 -6
- data/app/models/product.rb +23 -8
- data/app/views/addresses/show.html.haml +2 -2
- data/app/views/baskets/_small.html.haml +2 -2
- data/app/views/baskets/edit.html.haml +19 -16
- data/app/views/baskets/index.html.haml +13 -5
- data/app/views/baskets/show.html.haml +3 -3
- data/app/views/categories/_treeview.html.haml +1 -2
- data/app/views/categories/edit.html.haml +4 -5
- data/app/views/categories/index.html.haml +7 -7
- data/app/views/categories/show.html.haml +3 -4
- data/app/views/clerks/edit.html.haml +4 -3
- data/app/views/clerks/index.html.haml +6 -6
- data/app/views/clerks/show.html.haml +3 -3
- data/app/views/layouts/_admin_menu.html.haml +8 -8
- data/app/views/layouts/_messages.html.haml +2 -2
- data/app/views/layouts/office_clerk.haml +10 -27
- data/app/views/order_mailer/confirm.text.erb +1 -2
- data/app/views/order_mailer/shipped.text.erb +2 -1
- data/app/views/orders/index.csv.erb +6 -6
- data/app/views/orders/index.html.haml +25 -20
- data/app/views/orders/shipment.haml +57 -0
- data/app/views/orders/show.html.haml +106 -39
- data/app/views/products/_head.haml +1 -2
- data/app/views/products/_line.html.haml +1 -1
- data/app/views/products/_preview_box.haml +14 -10
- data/app/views/products/_triple.html.haml +1 -1
- data/app/views/products/edit.html.haml +4 -4
- data/app/views/products/index.html.haml +24 -13
- data/app/views/products/show.html.haml +15 -12
- data/app/views/purchases/index.html.haml +11 -7
- data/app/views/purchases/show.html.haml +42 -25
- data/app/views/sessions/sign_up.haml +10 -10
- data/app/views/suppliers/edit.html.haml +2 -2
- data/app/views/suppliers/index.html.haml +6 -7
- data/app/views/suppliers/show.html.haml +2 -3
- data/config/i18n-tasks.yml +97 -0
- data/config/initializers/migrate.rb +11 -1
- data/config/initializers/paperclip.rb +17 -0
- data/config/locales/config.yml +0 -1
- data/config/locales/en.yml +99 -116
- data/config/locales/fi.yml +101 -117
- data/config/routes.rb +18 -15
- data/db/migrate/20131226143612_categories.rb +2 -2
- data/db/migrate/20131226151332_products.rb +3 -3
- data/lib/office_clerk/engine.rb +5 -8
- data/lib/office_clerk/shipping_method.rb +12 -1
- data/lib/office_clerk/version.rb +1 -1
- data/office_clerk.gemspec +5 -5
- data/spec/controllers/baskets_controller_spec.rb +2 -2
- data/spec/controllers/orders_controller_spec.rb +0 -29
- data/spec/controllers/products_controller_spec.rb +4 -3
- data/spec/controllers/purchases_controller_spec.rb +3 -4
- data/spec/factories/orders.rb +6 -1
- data/spec/factories/products.rb +3 -0
- data/spec/features/baskets/edit_spec.rb +6 -1
- data/spec/features/baskets/index_spec.rb +1 -0
- data/spec/features/baskets/search_spec.rb +1 -1
- data/spec/features/orders/filter_spec.rb +19 -0
- data/spec/features/orders/inventory_spec.rb +19 -0
- data/spec/features/orders/ordering_spec.rb +84 -0
- data/spec/features/paginate_spec.rb +11 -0
- data/spec/features/sessions_spec.rb +2 -1
- data/spec/{models/locale_spec.rb → i18n_spec.rb} +19 -1
- data/spec/mailers/order_mailer_spec.rb +2 -1
- data/spec/models/baskets/inventory_spec.rb +9 -2
- data/spec/models/baskets/items_spec.rb +6 -1
- data/spec/models/order_spec.rb +20 -1
- data/spec/routing/baskets_routing_spec.rb +5 -1
- data/spec/routing/orders_routing_spec.rb +0 -12
- data/spec/spec_helper.rb +16 -3
- data/test_app/bin/setup +29 -0
- data/test_app/config/application.rb +3 -0
- data/test_app/config/boot.rb +1 -2
- data/test_app/config/environment.rb +1 -1
- data/test_app/config/environments/development.rb +1 -1
- data/test_app/config/environments/production.rb +20 -21
- data/test_app/config/environments/test.rb +7 -4
- data/test_app/config/initializers/assets.rb +11 -0
- data/test_app/config/initializers/cookies_serializer.rb +3 -0
- data/test_app/config/initializers/mime_types.rb +0 -1
- data/test_app/config/initializers/session_store.rb +1 -1
- data/test_app/config/routes.rb +1 -2
- data/test_app/config/secrets.yml +22 -0
- data/test_app/db/migrate/20141114205526_suppliers.office.rb +1 -1
- data/test_app/db/migrate/20141114205527_categories.office.rb +3 -3
- data/test_app/db/migrate/20141114205528_items.office.rb +1 -1
- data/test_app/db/migrate/20141114205529_orders.office.rb +1 -1
- data/test_app/db/migrate/20141114205530_baskets.office.rb +1 -1
- data/test_app/db/migrate/20141114205531_purchases.office.rb +1 -1
- data/test_app/db/migrate/20141114205532_products.office.rb +4 -4
- data/test_app/db/schema.rb +26 -26
- metadata +35 -28
- data/app/views/orders/edit.html.haml +0 -25
- data/app/views/orders/ship.haml +0 -91
- data/app/views/purchases/edit.html.haml +0 -9
- data/spec/features/orders_spec.rb +0 -37
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
class ProductsController < AdminController
|
4
4
|
|
5
|
-
before_filter :load_product, :only => [:show, :edit, :update, :
|
5
|
+
before_filter :load_product, :only => [:show, :edit, :update, :destroy ]
|
6
6
|
|
7
7
|
# Uncomment for check abilities with CanCan
|
8
8
|
#authorize_resource
|
@@ -39,6 +39,7 @@ class ProductsController < AdminController
|
|
39
39
|
show = @product.product_item? ? @product.product : @product
|
40
40
|
redirect_to product_path(show)
|
41
41
|
else
|
42
|
+
flash.alert = t(:fix_errors, :model => "product")
|
42
43
|
render :action => :edit
|
43
44
|
end
|
44
45
|
end
|
@@ -55,12 +56,12 @@ class ProductsController < AdminController
|
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
58
|
-
def
|
59
|
+
def destroy
|
59
60
|
@product.delete
|
60
61
|
if @product.save
|
61
|
-
redirect_to products_url , :notice => t("deleted")
|
62
|
+
redirect_to products_url , :notice => t("deleted") + ": " + @product.full_name
|
62
63
|
else
|
63
|
-
redirect_to product_url , :notice => "#{t(:error)} : #{t(:
|
64
|
+
redirect_to product_url(@product) , :notice => "#{t(:error)} : #{t(:product_has_inventory)}"
|
64
65
|
end
|
65
66
|
end
|
66
67
|
|
@@ -69,9 +70,8 @@ class ProductsController < AdminController
|
|
69
70
|
end
|
70
71
|
|
71
72
|
def params_for_model
|
72
|
-
params.require(:product).permit(:price,:cost,:weight,:name,:description, :online, :summary,
|
73
|
+
params.require(:product).permit(:price,:cost,:weight,:name,:description, :online, :summary,:stock_level,
|
73
74
|
:link,:ean,:tax,:properties,:scode,:product_id,:category_id,:supplier_id, :main_picture,:extra_picture
|
74
75
|
)
|
75
76
|
end
|
76
77
|
end
|
77
|
-
|
@@ -13,6 +13,7 @@ class PurchasesController < AdminController
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def show
|
16
|
+
gon.purchase_id = @purchase.id
|
16
17
|
end
|
17
18
|
|
18
19
|
# order this from supplier
|
@@ -35,8 +36,11 @@ class PurchasesController < AdminController
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def new
|
38
|
-
|
39
|
-
|
39
|
+
today = Date.today
|
40
|
+
basket = Basket.create!
|
41
|
+
@purchase = Purchase.new :name => "#{I18n.t(:purchase)} #{I18n.l(today)}" , :basket => basket
|
42
|
+
@purchase.save!
|
43
|
+
redirect_to edit_basket_path basket
|
40
44
|
end
|
41
45
|
|
42
46
|
def edit
|
@@ -48,24 +52,30 @@ class PurchasesController < AdminController
|
|
48
52
|
if @purchase.save
|
49
53
|
redirect_to purchase_path(@purchase), :notice => t(:create_success, :model => "purchase")
|
50
54
|
else
|
51
|
-
render :
|
55
|
+
render :show
|
52
56
|
end
|
53
57
|
end
|
54
58
|
|
55
59
|
def update
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
+
respond_to do |format|
|
61
|
+
if @purchase.update_attributes(params_for_model)
|
62
|
+
format.html { redirect_to purchase_path(@purchase), :notice => t(:update_success, :model => "purchase") }
|
63
|
+
format.json { respond_with_bip(@purchase) }
|
64
|
+
else
|
65
|
+
format.html { render :action => :show }
|
66
|
+
format.json { respond_with_bip(@purchase) }
|
67
|
+
end
|
60
68
|
end
|
61
69
|
end
|
62
70
|
|
63
|
-
|
71
|
+
protected
|
64
72
|
|
65
73
|
def load_purchase
|
66
74
|
@purchase = Purchase.where( :id => params[:id]).includes( :basket => {:items => {:product => :supplier}} ).first
|
67
75
|
end
|
68
76
|
|
77
|
+
private
|
78
|
+
|
69
79
|
def params_for_model
|
70
80
|
params.require(:purchase).permit(:name,:ordered_on,:received_on,:basket_id)
|
71
81
|
end
|
data/app/helpers/admin_helper.rb
CHANGED
@@ -1,24 +1,6 @@
|
|
1
1
|
# encoding : utf-8
|
2
2
|
module AdminHelper
|
3
|
-
|
4
|
-
def basket_edit_link basket , options = {}
|
5
|
-
return "---" unless basket
|
6
|
-
return "" unless request.url.include?("basket")
|
7
|
-
text = t(:edit) + " "
|
8
|
-
link = edit_basket_path(basket)
|
9
|
-
case basket.kori
|
10
|
-
when Order
|
11
|
-
text += I18n.t(:order)
|
12
|
-
link = order_path(basket.kori) rescue ""
|
13
|
-
when Purchase
|
14
|
-
text += I18n.t(:purchase)
|
15
|
-
link = purchase_path(basket.kori) rescue ""
|
16
|
-
else
|
17
|
-
text += t(:basket)
|
18
|
-
end
|
19
|
-
return link_to text , link , options
|
20
|
-
end
|
21
|
-
|
3
|
+
|
22
4
|
def sort_date key
|
23
5
|
return "" unless params[:q]
|
24
6
|
params[:q][key] || ""
|
@@ -30,10 +12,23 @@ module AdminHelper
|
|
30
12
|
# a default note
|
31
13
|
# same signature as best_in_place, ie object, field symbol , hash
|
32
14
|
def in_place object , field , attributes ={}
|
33
|
-
defaults = { :ok_button => I18n.t(:edit), :ok_button_class => "btn btn-success" ,
|
15
|
+
defaults = { :ok_button => I18n.t(:edit), :ok_button_class => "btn btn-success" ,
|
34
16
|
:cancel_button => I18n.t(:cancel) , :cancel_button_class => "btn btn-warning",
|
35
17
|
:place_holder => I18n.t(:edit) , :inner_class => "form-control" }
|
36
|
-
attributes.reverse_merge! defaults
|
18
|
+
attributes.reverse_merge! defaults
|
37
19
|
best_in_place(object , field , attributes)
|
38
20
|
end
|
21
|
+
|
22
|
+
def office_assets
|
23
|
+
engines = Rails::Engine.subclasses.map(&:instance)
|
24
|
+
engines << Rails.application
|
25
|
+
engines.delete_if {|e| ! e.respond_to?(:office_assets) }
|
26
|
+
assets = engines.collect{ |e| e.office_assets }
|
27
|
+
assets.compact
|
28
|
+
end
|
29
|
+
|
30
|
+
# helper so one doesn't hav to write the funny content_for in templates
|
31
|
+
def title(page_title)
|
32
|
+
content_for(:title) { page_title }
|
33
|
+
end
|
39
34
|
end
|
@@ -1,4 +1,35 @@
|
|
1
1
|
# encoding : utf-8
|
2
2
|
require "admin_helper"
|
3
3
|
module BasketsHelper
|
4
|
+
def has_receipt?
|
5
|
+
styles = OfficeClerk.config(:print_styles)
|
6
|
+
return false if styles.nil?
|
7
|
+
return styles.split.include?("receipt")
|
8
|
+
end
|
9
|
+
def basket_edit_link basket , options = {}
|
10
|
+
return "---" unless basket
|
11
|
+
return "" unless request.url.include?("basket")
|
12
|
+
if basket.locked?
|
13
|
+
text = I18n.t(:locked) + ": "
|
14
|
+
case basket.kori
|
15
|
+
when Order
|
16
|
+
text += I18n.t(:order)
|
17
|
+
link = office.order_path(basket.kori)
|
18
|
+
when Purchase
|
19
|
+
text += I18n.t(:purchase)
|
20
|
+
link = office.purchase_path(basket.kori)
|
21
|
+
else
|
22
|
+
raise "System Error: Locked basket without order #{basket.id}"
|
23
|
+
end
|
24
|
+
else
|
25
|
+
if basket.kori
|
26
|
+
key = basket.kori.class.name.downcase
|
27
|
+
text = I18n.t(key)
|
28
|
+
else
|
29
|
+
text = t(:basket)
|
30
|
+
end
|
31
|
+
link = office.edit_basket_path(basket)
|
32
|
+
end
|
33
|
+
return link_to text , link , options
|
34
|
+
end
|
4
35
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
module OfficeHelper
|
3
|
-
|
3
|
+
|
4
4
|
# users are stored in the session by email
|
5
5
|
# if user is not logged i , return nil
|
6
6
|
def current_clerk
|
7
7
|
return @current_clerk if @current_clerk
|
8
8
|
return nil unless session[:clerk_email]
|
9
|
-
@current_clerk = Clerk.where( :email => session[:clerk_email] ).limit(1).first
|
9
|
+
@current_clerk = Clerk.where( :email => session[:clerk_email] ).limit(1).first
|
10
10
|
end
|
11
11
|
def current_basket_or_nil
|
12
12
|
return @current_basket unless @current_basket.nil?
|
13
13
|
if session[:current_basket]
|
14
|
-
Basket.where( :id => session[:current_basket] ).limit(1).first
|
14
|
+
Basket.where( :id => session[:current_basket] ).limit(1).first
|
15
15
|
else
|
16
16
|
nil
|
17
17
|
end
|
@@ -29,30 +29,38 @@ module OfficeHelper
|
|
29
29
|
end
|
30
30
|
@current_basket
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def has_ssl?
|
34
34
|
return false unless Rails.env.production?
|
35
35
|
OfficeClerk.config(:has_ssl) == true
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
# when the order is made and the basket locked, it's time to make a new one
|
39
39
|
def new_basket
|
40
40
|
session[:current_basket] = nil
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def shipping_method name
|
44
44
|
OfficeClerk::ShippingMethod.method(name)
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def markdown text
|
48
48
|
return "" if text.blank?
|
49
49
|
return sanitize Kramdown::Document.new(text).to_html
|
50
50
|
end
|
51
51
|
|
52
|
+
# euros displays the prices in ... da da .. . euros.
|
53
|
+
# This could of course be configurable, but since taxes and possibly shipping don't work in us, i wait for the pull
|
52
54
|
def euros price
|
53
55
|
price ? number_to_currency(price , :precision => 2 , :unit => "€") : 0.0
|
54
56
|
end
|
55
57
|
|
58
|
+
# this is the helper that best in place uses to display euros.
|
59
|
+
# it is different so it can be overriden
|
60
|
+
def best_euros p
|
61
|
+
euros(p)
|
62
|
+
end
|
63
|
+
|
56
64
|
def date d
|
57
65
|
return "" unless d
|
58
66
|
I18n.l d
|
@@ -62,7 +70,26 @@ module OfficeHelper
|
|
62
70
|
def paginate(collection , options = {})
|
63
71
|
#options = options.merge defaults
|
64
72
|
options[:renderer] = BootstrapPagination::Rails
|
73
|
+
options[:params] = { :url_scope => :office }
|
65
74
|
will_paginate collection, options
|
66
75
|
end
|
67
76
|
|
68
77
|
end
|
78
|
+
|
79
|
+
require "bootstrap_pagination/version"
|
80
|
+
|
81
|
+
BootstrapPagination::Rails.class_eval do
|
82
|
+
def url(page)
|
83
|
+
@base_url_params ||= begin
|
84
|
+
url_params = merge_get_params(default_url_params)
|
85
|
+
url_params[:only_path] = true
|
86
|
+
merge_optional_params(url_params)
|
87
|
+
end
|
88
|
+
|
89
|
+
url_params = @base_url_params.dup
|
90
|
+
add_current_page_param(url_params, page)
|
91
|
+
|
92
|
+
OfficeClerk::Engine.routes.url_for(url_params)
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
@@ -8,8 +8,7 @@ module OrdersHelper
|
|
8
8
|
def mail_path action
|
9
9
|
|
10
10
|
end
|
11
|
-
def
|
12
|
-
|
13
|
-
viite = open("http://www1.nordea.fi/P636V/H636VTXT.asp?action=tekstiLista&lkm=1&alkuViite=#{base}&L=1").read[/\d+ \d+/]
|
11
|
+
def number_with_comma n
|
12
|
+
number_with_precision(n , :precision => 2 , :separator => "," , :strip_insignificant_zeros => false)
|
14
13
|
end
|
15
14
|
end
|
data/app/models/basket.rb
CHANGED
@@ -4,7 +4,8 @@ class Basket < ActiveRecord::Base
|
|
4
4
|
|
5
5
|
belongs_to :kori, polymorphic: true #kori is basket in finnish
|
6
6
|
|
7
|
-
has_many :items, autosave: true
|
7
|
+
has_many :items, autosave: true , :dependent => :destroy
|
8
|
+
|
8
9
|
before_save :cache_total
|
9
10
|
|
10
11
|
accepts_nested_attributes_for :items
|
@@ -17,11 +18,15 @@ class Basket < ActiveRecord::Base
|
|
17
18
|
self.items.empty?
|
18
19
|
end
|
19
20
|
|
21
|
+
def locked?
|
22
|
+
not self.locked.blank?
|
23
|
+
end
|
24
|
+
|
20
25
|
def cache_total
|
21
26
|
self.total_price = (items.to_a.sum{ |i| i.total }).round(2)
|
22
27
|
self.total_tax = (items.to_a.sum{ |i| i.tax_amount}).round(2)
|
23
28
|
end
|
24
|
-
|
29
|
+
|
25
30
|
def touch
|
26
31
|
cache_total
|
27
32
|
super
|
@@ -39,27 +44,19 @@ class Basket < ActiveRecord::Base
|
|
39
44
|
|
40
45
|
# receiving the goods means that the item quantity is added to the stock (product.inventory)
|
41
46
|
# also we change the price to the products cost price
|
42
|
-
# locks the basket so receiving or
|
47
|
+
# locks the basket so receiving or deducting becomes an error.
|
43
48
|
def receive!
|
44
|
-
raise "Locked since #{self.locked}" if
|
45
|
-
sum =
|
46
|
-
self.items.each do |item|
|
47
|
-
prod = item.product
|
48
|
-
prod.inventory = prod.inventory + item.quantity
|
49
|
-
prod.save!
|
50
|
-
sum += item.quantity
|
51
|
-
item.price = item.product.cost
|
52
|
-
# item.save!
|
53
|
-
end
|
49
|
+
raise "Locked since #{self.locked}" if locked?
|
50
|
+
sum = do_receive(true) # change the prices
|
54
51
|
self.locked = Date.today
|
55
52
|
self.save!
|
56
53
|
sum
|
57
54
|
end
|
58
55
|
|
56
|
+
# deduct the items from inventory, change affects immediately in the products
|
59
57
|
# locks the basket so receiving or deducting becomes an error.
|
60
|
-
# deduct the items from inventory, change affects immediately in the products
|
61
58
|
def deduct!
|
62
|
-
raise "Locked since #{self.locked}" if
|
59
|
+
raise "Locked since #{self.locked}" if locked?
|
63
60
|
sum = 0
|
64
61
|
self.items.each do |item|
|
65
62
|
prod = item.product
|
@@ -72,13 +69,30 @@ class Basket < ActiveRecord::Base
|
|
72
69
|
sum
|
73
70
|
end
|
74
71
|
|
75
|
-
#
|
76
|
-
#
|
72
|
+
# return inventory and cancel basket
|
73
|
+
# very similar to receive, just we don't change prices (and don't lock)
|
74
|
+
def cancel_order!
|
75
|
+
self.locked = nil
|
76
|
+
do_receive(false) #don't change prices
|
77
|
+
self.save!
|
78
|
+
end
|
79
|
+
|
80
|
+
# inventorying the basket means setting the item quantity as the stock
|
81
|
+
# we actually change the basket for it to be a relative change (so as to look like a receive)
|
77
82
|
def inventory!
|
78
83
|
self.items.each { |item| item.quantity -= item.product.inventory }
|
79
84
|
self.receive!
|
80
85
|
end
|
81
86
|
|
87
|
+
# set all items prices to zero
|
88
|
+
def zero_prices!
|
89
|
+
raise "Locked since #{self.locked}" if locked?
|
90
|
+
self.items.each do |item|
|
91
|
+
item.price = 0.0
|
92
|
+
end
|
93
|
+
self.save!
|
94
|
+
end
|
95
|
+
|
82
96
|
def isa typ
|
83
97
|
self.kori_type.to_s.downcase == typ.to_s.downcase && self.kori_id != nil
|
84
98
|
end
|
@@ -89,17 +103,17 @@ class Basket < ActiveRecord::Base
|
|
89
103
|
ss.delete(nil)
|
90
104
|
ss
|
91
105
|
end
|
92
|
-
|
106
|
+
|
93
107
|
#when adding a product (with quantity) we ensure there is only one item for each product
|
94
108
|
def add_product prod , quant = 1
|
95
109
|
return unless prod
|
96
110
|
return unless quant != 0
|
97
|
-
raise "Locked since #{self.locked}" if
|
111
|
+
raise "Locked since #{self.locked}" if locked?
|
98
112
|
exists = items.where(:product_id => prod.id ).limit(1).first
|
99
113
|
if exists
|
100
114
|
exists.quantity += quant
|
101
115
|
else
|
102
|
-
exists = items.new :quantity => quant , :product => prod , :price => prod.price ,
|
116
|
+
exists = items.new :quantity => quant , :product => prod , :price => prod.price ,
|
103
117
|
:tax => prod.tax , :name => prod.full_name
|
104
118
|
end
|
105
119
|
if( exists.quantity == 0)
|
@@ -110,4 +124,16 @@ class Basket < ActiveRecord::Base
|
|
110
124
|
end
|
111
125
|
reload
|
112
126
|
end
|
127
|
+
private
|
128
|
+
def do_receive change_prices
|
129
|
+
sum = 0
|
130
|
+
self.items.each do |item|
|
131
|
+
prod = item.product
|
132
|
+
prod.inventory = prod.inventory + item.quantity
|
133
|
+
prod.save!
|
134
|
+
sum += item.quantity
|
135
|
+
item.price = item.product.cost if change_prices
|
136
|
+
end
|
137
|
+
sum
|
138
|
+
end
|
113
139
|
end
|
data/app/models/clerk.rb
CHANGED
@@ -31,8 +31,13 @@ class Clerk < ActiveRecord::Base
|
|
31
31
|
res == 0
|
32
32
|
end
|
33
33
|
|
34
|
+
# just an ar association with order of the same email
|
35
|
+
def orders
|
36
|
+
Order.where(:email => self.email)
|
37
|
+
end
|
38
|
+
|
34
39
|
def last_address
|
35
|
-
order =
|
40
|
+
order = orders.last
|
36
41
|
order ? order.address : {}
|
37
42
|
end
|
38
43
|
private
|