spree_multi_currency 1.0.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.coveralls.yml +0 -0
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +21 -3
- data/README.markdown +8 -0
- data/Rakefile +4 -2
- data/app/assets/javascripts/admin/spree_multi_currency.js +0 -0
- data/app/assets/javascripts/store/spree_multi_currency.js +0 -0
- data/app/assets/stylesheets/admin/spree_multi_currency.css +0 -0
- data/app/assets/stylesheets/store/spree_multi_currency.css +0 -0
- data/app/controllers/spree/admin/currencies_controller.rb +3 -1
- data/app/controllers/spree/admin/currency_converters_controller.rb +2 -0
- data/app/controllers/spree/base_controller_decorator.rb +5 -2
- data/app/controllers/spree/currency_controller.rb +7 -2
- data/app/helpers/base_helper_decorator.rb +8 -0
- data/app/helpers/number_helper_decorator.rb +19 -17
- data/app/models/spree/adjustment_decorator.rb +2 -0
- data/app/models/spree/controller_helper_order.rb +11 -0
- data/app/models/spree/currency.rb +82 -38
- data/app/models/spree/currency_converter.rb +2 -0
- data/app/models/spree/line_item_decorator.rb +19 -6
- data/app/models/spree/money_decorator.rb +15 -0
- data/app/models/spree/order_decorator.rb +63 -55
- data/app/models/spree/product_decorator.rb +33 -0
- data/app/models/spree/stock/estimator_decorator.rb +18 -0
- data/app/models/spree/variant_decorator.rb +93 -16
- data/app/overrides/add_currencies_admin_configurations_menu.rb +8 -7
- data/app/overrides/add_currency_selection.rb +15 -0
- data/app/views/spree/admin/currencies/new.html.erb +4 -4
- data/app/views/spree/admin/currency_converters/edit.html.erb +4 -4
- data/app/views/spree/admin/currency_converters/new.html.erb +3 -3
- data/config/routes.rb +2 -0
- data/db/migrate/20101109134351_create_currencies.rb +2 -0
- data/db/migrate/20101109134453_create_currency_converters.rb +2 -0
- data/db/seeds.rb +2 -0
- data/features/step_definitions/product.rb +2 -0
- data/features/support/env.rb +2 -0
- data/features/support/paths.rb +2 -0
- data/lib/generators/spree_multi_currency/install/install_generator.rb +27 -15
- data/lib/spree_multi_currency.rb +13 -9
- data/lib/spree_multi_currency/engine.rb +6 -0
- data/lib/tasks/spree_multi_currency.rake +57 -38
- data/spec/changing_currency_spec.rb +44 -15
- data/spec/controllers/spree/currency_controller_spec.rb +16 -0
- data/spec/features/buy_spec.rb +103 -0
- data/spec/helpers/number_helper_spec.rb +21 -0
- data/spec/models/spree/currency_spec.rb +32 -0
- data/spec/models/spree/variant_spec.rb +32 -0
- data/spec/spec_helper.rb +50 -10
- data/spree_multi_currency.gemspec +2 -4
- metadata +29 -34
- data.tar.gz.sig +0 -3
- data/Versionfile +0 -9
- metadata.gz.sig +0 -1
data/.coveralls.yml
ADDED
File without changes
|
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -1,11 +1,29 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gem 'sqlite3'
|
4
4
|
|
5
5
|
group :test do
|
6
|
-
gem 'rspec-rails', '
|
6
|
+
gem 'rspec-rails', '>= 2.6.1'
|
7
7
|
gem 'factory_girl'
|
8
8
|
gem 'faker'
|
9
|
+
gem 'therubyracer'
|
10
|
+
gem 'execjs'
|
11
|
+
gem 'rspec'
|
12
|
+
gem 'capybara'
|
13
|
+
gem 'capybara-webkit'
|
14
|
+
gem 'factory_girl'
|
15
|
+
gem 'ffaker'
|
16
|
+
gem 'simplecov'
|
17
|
+
gem 'database_cleaner','1.0.1'
|
18
|
+
gem 'i18n-spec'
|
19
|
+
gem 'launchy'
|
20
|
+
gem 'coveralls', require: false
|
21
|
+
gem 'sass'
|
22
|
+
gem 'coffee-script'
|
9
23
|
end
|
10
24
|
|
11
|
-
|
25
|
+
gem 'spree', github: 'spree/spree', branch: '2-0-stable'
|
26
|
+
# provides basic authentication functionality for testing parts of your engine
|
27
|
+
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '2-0-stable'
|
28
|
+
|
29
|
+
gemspec
|
data/README.markdown
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
[](https://coveralls.io/r/pronix/spree-multi-currency)
|
2
|
+
|
3
|
+
[](https://travis-ci.org/pronix/spree-multi-currency)
|
4
|
+
|
1
5
|
# Spree Multi-Currency
|
2
6
|
|
3
7
|
Support different currency and recalculate price from one to another
|
@@ -180,6 +184,10 @@ Settings
|
|
180
184
|
|
181
185
|
For tests
|
182
186
|
_________________________
|
187
|
+
For start tests require exec:
|
188
|
+
`bundle exec rake test_app && bundle exec rake spec`
|
189
|
+
|
190
|
+
|
183
191
|
|
184
192
|
extention require store in ./spree
|
185
193
|
in Rakefile defined
|
data/Rakefile
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
require 'rubygems'
|
1
3
|
require 'rake'
|
2
4
|
require 'rake/testtask'
|
3
5
|
require 'rake/packagetask'
|
4
6
|
require 'rubygems/package_task'
|
5
7
|
require 'rspec/core/rake_task'
|
6
|
-
require 'spree/
|
8
|
+
require 'spree/testing_support/common_rake'
|
7
9
|
|
8
10
|
RSpec::Core::RakeTask.new
|
9
11
|
|
@@ -25,4 +27,4 @@ desc "Generates a dummy app for testing"
|
|
25
27
|
task :test_app do
|
26
28
|
ENV['LIB_NAME'] = 'spree_multi_currency'
|
27
29
|
Rake::Task['common:test_app'].invoke
|
28
|
-
end
|
30
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,11 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
Spree::BaseController.class_eval do
|
2
4
|
before_filter :set_currency
|
3
5
|
|
4
6
|
private
|
5
7
|
|
6
8
|
def set_currency
|
7
|
-
if session[:currency_id].present?
|
8
|
-
|
9
|
+
if session[:currency_id].present?
|
10
|
+
@currency = Spree::Currency.find_by_char_code(session[:currency_id])
|
11
|
+
Spree::Currency.current!(@currency) if @currency
|
9
12
|
end
|
10
13
|
end
|
11
14
|
|
@@ -1,9 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
module Spree
|
2
4
|
class CurrencyController < Spree::BaseController
|
3
5
|
|
4
6
|
def set
|
5
|
-
|
6
|
-
|
7
|
+
char_code = params[:id].to_s.upcase
|
8
|
+
@currency = Spree::Currency.find_by_char_code(char_code)
|
9
|
+
if @currency
|
10
|
+
session[:currency_id] = char_code.to_sym
|
7
11
|
Spree::Currency.current!(@currency)
|
8
12
|
flash.notice = t(:currency_changed)
|
9
13
|
else
|
@@ -12,5 +16,6 @@ module Spree
|
|
12
16
|
|
13
17
|
redirect_back_or_default(root_path)
|
14
18
|
end
|
19
|
+
|
15
20
|
end
|
16
21
|
end
|
@@ -1,3 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Encoding: utf-8
|
4
|
+
#
|
5
|
+
# redefined default method
|
6
|
+
# http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html
|
1
7
|
module ActionView
|
2
8
|
module Helpers
|
3
9
|
module NumberHelper
|
@@ -5,11 +11,17 @@ module ActionView
|
|
5
11
|
def number_to_currency(number, options = {})
|
6
12
|
return nil if number.nil?
|
7
13
|
options.symbolize_keys!
|
8
|
-
|
9
|
-
|
10
|
-
|
14
|
+
currency_char = Spree::Currency.current.try(:char_code) ||
|
15
|
+
I18n.default_locale
|
16
|
+
options[:locale] = "currency_#{ currency_char }"
|
17
|
+
defaults = I18n.translate('number.format',
|
18
|
+
locale: options[:locale],
|
19
|
+
default: {})
|
20
|
+
currency = I18n.translate('number.currency.format',
|
21
|
+
locale: options[:locale],
|
22
|
+
default: {})
|
11
23
|
defaults = DEFAULT_CURRENCY_VALUES.merge(defaults).merge!(currency)
|
12
|
-
defaults[:negative_format] =
|
24
|
+
defaults[:negative_format] = '-%n %u'
|
13
25
|
options = defaults.merge!(options)
|
14
26
|
|
15
27
|
unit = options.delete(:unit)
|
@@ -17,24 +29,14 @@ module ActionView
|
|
17
29
|
|
18
30
|
if number.to_f < 0
|
19
31
|
format = options.delete(:negative_format)
|
20
|
-
number = number.
|
32
|
+
number = number.abs
|
21
33
|
end
|
22
34
|
|
23
|
-
|
24
|
-
|
25
|
-
format.gsub(/%n/, value).gsub(/%u/, unit).html_safe
|
26
|
-
rescue InvalidNumberError => e
|
27
|
-
if options[:raise]
|
28
|
-
raise
|
29
|
-
else
|
30
|
-
formatted_number = format.gsub(/%n/, e.number).gsub(/%u/, unit)
|
31
|
-
e.number.to_s.html_safe? ? formatted_number.html_safe : formatted_number
|
32
|
-
end
|
33
|
-
end
|
35
|
+
value = number_with_precision(number, options.merge(raise: true))
|
36
|
+
format.gsub(/%n/, value).gsub(/%u/, unit).html_safe
|
34
37
|
|
35
38
|
end
|
36
39
|
|
37
|
-
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
@@ -1,24 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'money'
|
2
|
-
class OriginMoney < Money
|
3
|
-
end
|
4
4
|
|
5
5
|
module Spree
|
6
6
|
class Currency < ActiveRecord::Base
|
7
7
|
|
8
8
|
has_many :currency_converters do
|
9
9
|
def get_rate(date)
|
10
|
-
last(:
|
10
|
+
last(conditions: ["date_req <= ?", date])
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
default_scope :
|
15
|
-
scope :locale, lambda{|str| where("locale like ?", "%#{str}%")}
|
14
|
+
default_scope order: 'spree_currencies.locale'
|
15
|
+
scope :locale, lambda { |str| where("locale like ?", "%#{str}%") }
|
16
16
|
after_save :reset_basic_currency
|
17
17
|
|
18
18
|
attr_accessible :basic, :locale, :char_code, :num_code, :name
|
19
19
|
|
20
|
+
# FIXME must be transaction
|
20
21
|
def basic!
|
21
|
-
self.class.update_all(:
|
22
|
+
self.class.update_all(basic: false) && update_attribute(:basic, true)
|
22
23
|
end
|
23
24
|
|
24
25
|
def locale=(locales)
|
@@ -26,40 +27,89 @@ module Spree
|
|
26
27
|
end
|
27
28
|
|
28
29
|
def locale(need_split = true)
|
29
|
-
|
30
|
+
locale_var = read_attribute(:locale).to_s
|
31
|
+
if need_split
|
32
|
+
locale_var.split(',')
|
33
|
+
else
|
34
|
+
locale_var
|
35
|
+
end
|
30
36
|
end
|
31
37
|
|
32
38
|
# We can only have one main currency.
|
33
39
|
# Therefore we reset all other currencies but the current if it's the main.
|
34
40
|
def reset_basic_currency
|
35
|
-
|
41
|
+
if basic?
|
42
|
+
self.class.where("id != ?", id).update_all(basic: false)
|
43
|
+
end
|
36
44
|
end
|
37
45
|
|
38
46
|
class << self
|
39
47
|
|
48
|
+
# return array of all char_codes
|
49
|
+
def all_currencies
|
50
|
+
all.map(&:char_code)
|
51
|
+
end
|
52
|
+
|
40
53
|
# Get the current locale
|
41
|
-
def current(
|
54
|
+
def current(current_locale = nil)
|
42
55
|
@current ||= locale(current_locale || I18n.locale).first
|
56
|
+
if @current
|
57
|
+
return @current
|
58
|
+
else
|
59
|
+
mess = 'Require load and set default currency'
|
60
|
+
mess << '<br/>'
|
61
|
+
mess << 'Locale field is factor for determine current currency'
|
62
|
+
raise mess
|
63
|
+
end
|
43
64
|
end
|
44
65
|
|
45
|
-
def current!(current_locale = nil
|
46
|
-
|
66
|
+
def current!(current_locale = nil)
|
67
|
+
if current_locale.is_a?(Spree::Currency)
|
68
|
+
@current = current_locale
|
69
|
+
else
|
70
|
+
@current = locale(current_locale || I18n.locale).first
|
71
|
+
end
|
47
72
|
end
|
48
73
|
|
49
|
-
def load_rate(options= {})
|
74
|
+
def load_rate(options = {})
|
50
75
|
current(options[:locale] || I18n.locale)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
76
|
+
load_rate_from(@current.char_code)
|
77
|
+
end
|
78
|
+
|
79
|
+
# load rate for currency(char_code) to basic
|
80
|
+
def load_rate_from(from_char_code)
|
81
|
+
from_cur = Spree::Currency.find_by_char_code(from_char_code)
|
82
|
+
basic = Spree::Currency.basic
|
83
|
+
rate = from_cur.currency_converters.get_rate(Time.now)
|
84
|
+
if rate
|
85
|
+
add_rate(basic.char_code,
|
86
|
+
from_cur.char_code,
|
87
|
+
rate.nominal/rate.value.to_f)
|
88
|
+
add_rate(from_cur.char_code,
|
89
|
+
basic.char_code,
|
90
|
+
rate.value.to_f)
|
55
91
|
end
|
56
92
|
end
|
57
93
|
|
58
94
|
# Exchanges money between two currencies.
|
59
95
|
# E.g. with these args: 150, DKK, GBP returns 16.93
|
60
96
|
def convert(value, from, to)
|
61
|
-
|
62
|
-
|
97
|
+
begin
|
98
|
+
from_money = ::Money.new(value.to_f * 10000, from)
|
99
|
+
res = from_money.exchange_to(to)
|
100
|
+
res = (res.to_f / 100).round(2)
|
101
|
+
rescue => e
|
102
|
+
load_rate_from(from)
|
103
|
+
begin
|
104
|
+
currency_config = Spree::Config.currency
|
105
|
+
res = from_money.exchange_to(currency_config)
|
106
|
+
load_rate_from(to)
|
107
|
+
res = ::Money.new(res, currency_config).exchange_to(to)
|
108
|
+
res = res.to_f
|
109
|
+
rescue => e
|
110
|
+
raise "Require load actual currency \t\n #{e}"
|
111
|
+
end
|
112
|
+
end
|
63
113
|
res
|
64
114
|
end
|
65
115
|
|
@@ -70,47 +120,41 @@ module Spree
|
|
70
120
|
load_rate(options)
|
71
121
|
convert(value, @basic.char_code, @current.char_code)
|
72
122
|
rescue => ex
|
73
|
-
|
123
|
+
error_logger(ex)
|
74
124
|
value
|
75
125
|
end
|
76
126
|
|
77
|
-
# Converts the currency value of the current locale to the basic currency
|
127
|
+
# Converts the currency value of the current locale to the basic currency
|
78
128
|
# In the parameters you can specify the locale you wish to convert FROM.
|
79
129
|
# Usage: Currency.conversion_from_current(100, :locale => "da")
|
80
|
-
def conversion_from_current(value, options={})
|
130
|
+
def conversion_from_current(value, options = {})
|
81
131
|
load_rate(options)
|
82
|
-
|
83
|
-
# Replace commas with dots as decimal mark for those languages that use this.
|
84
|
-
|
85
|
-
# 2,000.00 => 2000.00
|
86
|
-
value.gsub!(",","") if (value =~ /\,[0-9]+\./)
|
87
|
-
|
88
|
-
# 2.000,00 => 2000.00
|
89
|
-
value.gsub!(".","").gsub!(",",".") if (value =~ /\.[0-9]+\,/)
|
90
|
-
|
91
|
-
# 2000,00 => 2000.00
|
92
|
-
value.gsub!(",","") if (value =~ /\.[0-9]+\,/)
|
93
|
-
|
94
|
-
convert(value, @current.char_code, @basic.char_code)
|
132
|
+
convert(parse_price(value), @current.char_code, @basic.char_code)
|
95
133
|
rescue => ex
|
96
|
-
|
134
|
+
error_logger(ex)
|
97
135
|
value
|
98
136
|
end
|
99
137
|
|
138
|
+
# write to error log
|
139
|
+
# ex - Exception from 'rescue => e'
|
140
|
+
def error_logger(ex)
|
141
|
+
mes = " [ Currency ] :#{ex.inspect} \n #{ex.backtrace.join('\n ')}"
|
142
|
+
Rails.logger.error mes
|
143
|
+
end
|
100
144
|
|
101
145
|
# Retrieves the main currency.
|
102
146
|
def basic
|
103
|
-
@basic ||= where(:
|
147
|
+
@basic ||= where(basic: true).first
|
104
148
|
end
|
105
149
|
|
106
|
-
def get(num_code, options ={
|
150
|
+
def get(num_code, options = {})
|
107
151
|
find_by_num_code(num_code) || create(options)
|
108
152
|
end
|
109
153
|
|
110
154
|
private
|
111
155
|
|
112
156
|
def add_rate(from, to, rate)
|
113
|
-
|
157
|
+
::Money.add_rate(from, to, rate.to_f)
|
114
158
|
end
|
115
159
|
|
116
160
|
end
|