diff --git a/README.md b/README.md index 6828c53..6e7fa8c 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,16 @@ bundle exec rails g spree_price_books:install Configuration ------------- -Once installed you can seed default currency exchange rates via Google's Currency API. +Once installed you can seed default currency exchange rates via open exchange rate + +Get your app id from https://openexchangerates.org/signup + +Add open_exchange_rate.rb to config/initializers +```ruby +Rails.application.config.openExchangeRate = { + appId: 'YOUR APP ID HERE', +} +``` ```shell bundle exec rake price_books:currency_rates diff --git a/app/assets/javascripts/spree/frontend/spree_price_books.js b/app/assets/javascripts/spree/frontend/spree_price_books.js index fa8496b..41ba683 100644 --- a/app/assets/javascripts/spree/frontend/spree_price_books.js +++ b/app/assets/javascripts/spree/frontend/spree_price_books.js @@ -1,4 +1,3 @@ // Placeholder manifest file. // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/frontend/all.js' //= require spree/frontend -//= require spree/frontend/spree_multi_currency diff --git a/app/overrides/spree/admin/shared/_product_sub_menu/add_price_books_tab.html.erb.deface b/app/overrides/spree/admin/shared/_product_sub_menu/add_price_books_tab.html.erb.deface deleted file mode 100644 index f36222a..0000000 --- a/app/overrides/spree/admin/shared/_product_sub_menu/add_price_books_tab.html.erb.deface +++ /dev/null @@ -1,4 +0,0 @@ - -<%= tab :price_books %> diff --git a/app/overrides/spree/admin/shared/_product_tabs/add_price_books.html.erb.deface b/app/overrides/spree/admin/shared/_product_tabs/add_price_books.html.erb.deface index aa71da2..30f0749 100644 --- a/app/overrides/spree/admin/shared/_product_tabs/add_price_books.html.erb.deface +++ b/app/overrides/spree/admin/shared/_product_tabs/add_price_books.html.erb.deface @@ -1,5 +1,5 @@ > - <%= link_to_with_icon 'icon-picture', Spree::PriceBook.model_name.human(:count => 2), spree.variant_prices_admin_product_url(@product) %> + <%= link_to_with_icon 'list', Spree::PriceBook.model_name.human(:count => 2), spree.variant_prices_admin_product_url(@product) %> diff --git a/app/overrides/spree/admin/shared/_configuration_menu/current_rates_link.html.erb.deface b/app/overrides/spree/admin/shared/sub_menu/_configuration/current_rates_link.html.erb.deface similarity index 58% rename from app/overrides/spree/admin/shared/_configuration_menu/current_rates_link.html.erb.deface rename to app/overrides/spree/admin/shared/sub_menu/_configuration/current_rates_link.html.erb.deface index 6126edc..4475907 100644 --- a/app/overrides/spree/admin/shared/_configuration_menu/current_rates_link.html.erb.deface +++ b/app/overrides/spree/admin/shared/sub_menu/_configuration/current_rates_link.html.erb.deface @@ -1,5 +1,5 @@ <% if can? :manage, Spree::CurrencyRate %> - <%= configurations_sidebar_menu_item Spree.t(:currency_rates), spree.admin_currency_rates_path %> + <%= configurations_sidebar_menu_item Spree::CurrencyRate.model_name.human(count: 1.1), spree.admin_currency_rates_path %> <% end %> diff --git a/app/overrides/spree/admin/shared/sub_menu/_product/add_price_books_tab.html.erb.deface b/app/overrides/spree/admin/shared/sub_menu/_product/add_price_books_tab.html.erb.deface new file mode 100644 index 0000000..1ce4bec --- /dev/null +++ b/app/overrides/spree/admin/shared/sub_menu/_product/add_price_books_tab.html.erb.deface @@ -0,0 +1,4 @@ + +<%= tab :price_books, label: Spree::PriceBook.model_name.human(count: 1.1) %> diff --git a/app/views/spree/admin/currency_rates/_form.html.erb b/app/views/spree/admin/currency_rates/_form.html.erb index 56cbe15..e241eff 100644 --- a/app/views/spree/admin/currency_rates/_form.html.erb +++ b/app/views/spree/admin/currency_rates/_form.html.erb @@ -6,16 +6,17 @@
<%= f.label :base_currency %> - <%= f.text_field :base_currency, class: 'fullwidth' %> + <%= f.text_field :base_currency, class: 'form-control' %>
<%= f.label :currency, Spree.t(:currency) %> - <%= f.text_field :currency, class: 'fullwidth' %> + <%= f.text_field :currency, class: 'form-control' %>
- <%= f.label :exchange_rate, Spree.t(:exchange_rate) %> - <%= f.text_field :exchange_rate, :class => 'fullwidth' %> -
<%= Spree.t(:currency_rate_explanation) %> + <%= f.label :exchange_rate %> + <%= f.text_field :exchange_rate, :class => 'form-control' %> +
+
<% if f.object.default? || Spree::CurrencyRate.default.new_record? %>
diff --git a/app/views/spree/admin/currency_rates/edit.html.erb b/app/views/spree/admin/currency_rates/edit.html.erb index 0bdbef2..ab84e7e 100644 --- a/app/views/spree/admin/currency_rates/edit.html.erb +++ b/app/views/spree/admin/currency_rates/edit.html.erb @@ -1,13 +1,10 @@ -<%= render 'spree/admin/shared/configuration_menu' %> <% content_for :page_title do %> <%= Spree.t(:editing_currency_rate) %> <% end %> <% content_for :page_actions do %> -
  • <%= button_link_to Spree.t(:back_to_currency_rates_list), spree.admin_currency_rates_path, icon: 'arrow-left' %> -
  • <% end %> <%= render partial: 'spree/shared/error_messages', locals: { target: @currency_rate } %> diff --git a/app/views/spree/admin/currency_rates/index.html.erb b/app/views/spree/admin/currency_rates/index.html.erb index a8161da..3ef64b7 100644 --- a/app/views/spree/admin/currency_rates/index.html.erb +++ b/app/views/spree/admin/currency_rates/index.html.erb @@ -1,19 +1,16 @@ -<%= render 'spree/admin/shared/configuration_menu' %> <% content_for :page_title do %> - <%= Spree.t(:currency_rates) %> + <%= Spree::CurrencyRate.model_name.human(:count => 2) %> <% end %> <% content_for :page_actions do %> <% if can? :create, Spree::CurrencyRate %> -
  • <%= button_link_to Spree.t(:new_currency_rate), new_object_url, icon: 'plus' %> -
  • <% end %> <% end %> <% if @currency_rates.any? %> - +
    @@ -23,10 +20,10 @@ - - - - + + + + diff --git a/app/views/spree/admin/currency_rates/new.html.erb b/app/views/spree/admin/currency_rates/new.html.erb index 3a05c32..2fae162 100644 --- a/app/views/spree/admin/currency_rates/new.html.erb +++ b/app/views/spree/admin/currency_rates/new.html.erb @@ -1,4 +1,3 @@ -<%= render 'spree/admin/shared/configuration_menu' %> <% content_for :page_title do %> <%= Spree.t(:new_currency_rate) %> diff --git a/app/views/spree/admin/price_books/_form.html.erb b/app/views/spree/admin/price_books/_form.html.erb index 41ffe41..9a9ea1e 100644 --- a/app/views/spree/admin/price_books/_form.html.erb +++ b/app/views/spree/admin/price_books/_form.html.erb @@ -1,79 +1,79 @@
    -
    +
    <%= f.field_container :name do %> <%= f.label :name %> *
    - <%= f.text_field :name, class: "fullwidth" %> + <%= f.text_field :name, class: "form-control" %> <%= f.error_message_on :name %> <% end %>
    +
    -
    -
    +
    +
    <%= f.label :currency, Spree.t(:choose_currency) %> *
    - <%= f.select :currency, pb_currency_options(f.object.currency), class: 'fullwidth select2' %> + <%= f.select :currency, pb_currency_options(f.object.currency), class: 'form-control select2' %> <%= f.error_message_on :currency %>
    -
    -
    +
    <%= f.field_container :active_from do %> <%= f.label :active_from %> *
    - <%= f.text_field :active_from, class: 'datepicker datepicker-from' %> + <%= f.text_field :active_from, class: 'form-control datepicker datepicker-from' %> <%= f.error_message_on :active_from %> <% end %>
    -
    +
    <%= f.field_container :active_to do %> <%= f.label :active_to %> *
    - <%= f.text_field :active_to, class: 'datepicker datepicker-to' %> + <%= f.text_field :active_to, class: 'form-control datepicker datepicker-to' %> <%= f.error_message_on :active_to %> <% end %>
    -
    +
    <%= f.field_container :role_id do %> <%= f.label :role_id %>
    - <%= f.collection_select :role_id, Spree::Role.all, :id, :name, { include_blank: true }, { class: 'fullwidth select2' } %> + <%= f.collection_select :role_id, Spree::Role.all, :id, :name, { include_blank: true }, { class: 'select2' } %> <%= f.error_message_on :role_id %> <% end %>
    -
    +
    <%= f.field_container :priority do %> <%= f.label :priority %> *
    - <%= f.text_field :priority, class: "fullwidth" %> + <%= f.text_field :priority, class: "form-control" %> <%= f.error_message_on :priority %> <% end %>
    -
    +
    <%= f.field_container :parent do %> - <%= f.label :parent, Spree.t(:parent) %> *
    + <%= f.label :parent %> *
    <%= f.collection_select(:parent_id, Spree::PriceBook.all - [f.object], :id, :name, - include_blank: true, selected: Spree::PriceBook.default.id, class: 'fullwidth select2') %> + include_blank: true, selected: Spree::PriceBook.default.id, class: 'select2') %> <%= f.error_message_on :parent %> <% end %>
    -
    +
    <%= f.field_container :price_adjustment_factor do %> <%= f.label :price_adjustment_factor %> *
    - <%= f.text_field :price_adjustment_factor, class: 'fullwidth' %> + <%= f.text_field :price_adjustment_factor, class: 'form-control' %> <%= f.error_message_on :price_adjustment_factor %> <% end %>
    -
    +
    <%= f.field_container :discount do %> <%= f.label :discount %>
    <%= f.check_box :discount %> - <%= f.error_message_on :priority %> + <%= f.error_message_on :discount %> <% end %>
    diff --git a/app/views/spree/admin/price_books/edit.html.erb b/app/views/spree/admin/price_books/edit.html.erb index 7410336..7dc7806 100644 --- a/app/views/spree/admin/price_books/edit.html.erb +++ b/app/views/spree/admin/price_books/edit.html.erb @@ -1,13 +1,11 @@ -<%= render :partial => 'spree/admin/shared/product_sub_menu' %> +<%#= render :partial => 'spree/admin/shared/product_sub_menu' %> <% content_for :page_title do %> <%= Spree.t(:editing_price_book) %> "<%= @price_book.name %>" <% end %> <% content_for :page_actions do %> -
  • - <%= button_link_to Spree.t(:back_to_price_books_list), spree.admin_price_books_path, :icon => 'icon-arrow-left' %> -
  • + <%= button_link_to Spree.t(:back_to_price_books_list), spree.admin_price_books_path, :icon => 'icon-arrow-left' %> <% end %> <%= render :partial => 'spree/shared/error_messages', :locals => { :target => @price_book } %> diff --git a/app/views/spree/admin/price_books/index.html.erb b/app/views/spree/admin/price_books/index.html.erb index 48e7609..4211f11 100644 --- a/app/views/spree/admin/price_books/index.html.erb +++ b/app/views/spree/admin/price_books/index.html.erb @@ -3,17 +3,15 @@ <% end %> <% content_for :page_actions do %> - + <%= link_to_with_icon 'add', Spree.t(:new_price_book), new_admin_price_book_url, { :remote => true, :class => 'btn btn-success', :id => 'new_price_book_link' } %> <% end %> -<%= render :partial => 'spree/admin/shared/product_sub_menu' %> +<%#= render :partial => 'spree/admin/shared/product_sub_menu' %>
    <% if @price_books.any? %> -
    <%= Spree.t(:base_currency) %><%= Spree.t(:exchange_rate) %><%= Spree.t(:currency) %><%= Spree.t(:default) %><%= Spree::CurrencyRate.human_attribute_name(:base_currency) %><%= Spree::CurrencyRate.human_attribute_name(:exchange_rate) %><%= Spree::CurrencyRate.human_attribute_name(:currency) %><%= Spree::CurrencyRate.human_attribute_name(:default) %>
    +
    diff --git a/app/views/spree/admin/price_books/new.html.erb b/app/views/spree/admin/price_books/new.html.erb index 805a65f..f13f47f 100644 --- a/app/views/spree/admin/price_books/new.html.erb +++ b/app/views/spree/admin/price_books/new.html.erb @@ -1,4 +1,4 @@ -<%= render :partial => 'spree/admin/shared/product_sub_menu' %> +<%#= render :partial => 'spree/admin/shared/product_sub_menu' %> <% content_for :page_title do %> <%= Spree.t(:new_price_book) %> diff --git a/app/views/spree/admin/products/variant_prices.html.erb b/app/views/spree/admin/products/variant_prices.html.erb index d3d26f8..c837dc8 100644 --- a/app/views/spree/admin/products/variant_prices.html.erb +++ b/app/views/spree/admin/products/variant_prices.html.erb @@ -1,4 +1,4 @@ -<%= render :partial => 'spree/admin/shared/product_sub_menu' %> +<%#= render :partial => 'spree/admin/shared/product_sub_menu' %> <%= render :partial => 'spree/admin/shared/product_tabs', :locals => { :current => 'Prices' } %> <%# did we get her via redirect? %> @@ -12,7 +12,7 @@ <%= select_tag :price_book_id, options_for_select(@price_books.map {|pb| ["#{pb.name} (#{pb.currency})", pb.id]}, @current_price_book.id) %> -
    +
    @@ -29,7 +29,7 @@ <% @variants.each do |variant| %> data-hook="variants_row" class="<%= cycle('odd', 'even')%>"> - +
    <%= variant.is_master? ? 'Master' : variant.options_text %><%= Spree::Money.new(variant.default_price.amount, currency: variant.default_price.currency) %><%= Spree::Money.new(variant.default_price.try(:amount), currency: variant.default_price.try(:currency)) %> <% if @current_price_book.factored? %> <%= Spree::Money.new(@prices[variant.id].amount, currency: @prices[variant.id].currency) %> @@ -52,9 +52,7 @@ <%= Spree.t(:or) %> <%= button_link_to Spree.t('actions.cancel'), spree.admin_product_url(@product), :icon => 'icon-remove' %> - + <%# this is horrible Jeff S. Why didn't you just keep the product in the route? %> <%= hidden_field_tag :product_id, @product.id %> <%# due to the goofy way i chose to do my routing/redirecting %> - - diff --git a/config/locales/en.yml b/config/locales/en.yml index 6cf363f..9f2a82e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -12,6 +12,7 @@ en: spree/price_book: currency: Currency default: Default + priority: Priority price_adjustment_factor: Factor errors: models: @@ -27,4 +28,8 @@ en: one: Price Book other: Price Books spree: + default_price: Default price + new_price_book: New Price Book + back_to_price_books_list: Back to price books editing_currency_rate: Editing Currency Rate + editing_price_book: Editing Price Book diff --git a/config/locales/ru.yml b/config/locales/ru.yml new file mode 100644 index 0000000..e85df20 --- /dev/null +++ b/config/locales/ru.yml @@ -0,0 +1,45 @@ +ru: + activerecord: + attributes: + spree/currency_rate: + base_currency: Базовая Валюта + currency: Валюта + default: По умолчанию + exchange_rate: Курс обмена + spree/price_book: + name: Название + active_from: Активно с + active_to: Активно до + currency: Валюта + default: По умолчанию + priority: Приоритет + role: Роль + role_id: Роль + discount: Скидка? + parent: Родительское ценовое правило + price_adjustment_factor: Коэффициент корректировки цены + errors: + models: + spree/price: + attributes: + currency: + match_price_book: Must match price book currency. + models: + spree/currency_rate: + one: Курс обмена + few: Курсы обмена + many: Курсы обмена + other: Курсы обмена + spree/price_book: + one: Ценовое правило + few: Ценовые правила + many: Ценовые правила + other: Ценовые правила + spree: + new_currency_rate: Новый курс обмена + default_price: Цена по умолчанию + new_price_book: Новое ценовое правило + back_to_price_books_list: Назад к ценовым правилам + back_to_currency_rates_list: Назад к курсам обмена + editing_currency_rate: Редактирование курса обмена + editing_price_book: Редактирование ценового правила diff --git a/lib/spree_price_books.rb b/lib/spree_price_books.rb index f26310c..d33e814 100644 --- a/lib/spree_price_books.rb +++ b/lib/spree_price_books.rb @@ -1,4 +1,4 @@ require 'spree_core' -require 'money/bank/google_currency' +require 'money/bank/open_exchange_rates_bank' require 'validates_timeliness' require 'spree_price_books/engine' diff --git a/lib/tasks/price_books.rake b/lib/tasks/price_books.rake index d477591..aa44f94 100644 --- a/lib/tasks/price_books.rake +++ b/lib/tasks/price_books.rake @@ -6,19 +6,22 @@ namespace :price_books do # (optional) # set the seconds after than the current rates are automatically expired # by default, they never expire - Money::Bank::GoogleCurrency.ttl_in_seconds = 86400 - # set default bank to instance of GoogleCurrency - Money.default_bank = Money::Bank::GoogleCurrency.new - Money::Currency.all.each do |currency| - # Limit to only major currencies, which have priority below 100. - next if currency.priority >= 100 + oxr = Money::Bank::OpenExchangeRatesBank.new + oxr.app_id = Rails.application.config.openExchangeRate[:appId] + oxr.update_rates + oxr.cache = 'tmp/cache.json' + oxr.ttl_in_seconds = 86400 + oxr.source = Spree::CurrencyRate.default.currency + Money.default_bank = oxr + + Spree::Config[:supported_currencies].split(',').each do |currencyCode| + currency = Money::Currency.new(currencyCode) begin - rate = Money.default_bank.get_rate(Spree::CurrencyRate.default.currency, currency.iso_code) + rate = Money.default_bank.get_rate(Spree::CurrencyRate.default.currency, currency) if cr = Spree::CurrencyRate.find_or_create_by(base_currency: Spree::CurrencyRate.default.currency, currency: currency.iso_code, default: (Spree::Config[:currency] == currency.iso_code)) cr.update_attribute :exchange_rate, rate end - rescue Money::Bank::UnknownRate # Google doesn't track this currency. - rescue Money::Bank::GoogleCurrencyFetchError => ex + rescue Exception => ex puts currency.inspect puts ex.message puts ex.backtrace diff --git a/spree_price_books.gemspec b/spree_price_books.gemspec index b4b8777..3a199e7 100644 --- a/spree_price_books.gemspec +++ b/spree_price_books.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = 'spree_price_books' - s.version = '2.3.0.beta' + s.version = '3.1.0' s.summary = 'Price books allowing flexible product pricing.' s.description = s.summary s.required_ruby_version = '>= 2.0.0' @@ -16,8 +16,8 @@ Gem::Specification.new do |s| s.require_path = 'lib' s.requirements << 'none' - s.add_dependency 'google_currency' - s.add_dependency 'spree_core', '~> 2.3.0' + s.add_dependency 'money-open-exchange-rates', '1.2.0' + s.add_dependency 'spree_core', '~> 3.1.0' s.add_dependency 'validates_timeliness', '~> 3.0' s.add_development_dependency 'capybara', '~> 2.1'