diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 4b260a8..5af3905 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -15,7 +15,6 @@ class OrdersController < ApplicationController flash[:success] = "#{@order.to_sentence} ordered. Enjoy it!" redirect_to root_path else - @order.g_order_items Product.for_sale render 'new' end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index ed17ae0..ee4d610 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -9,6 +9,10 @@ module ApplicationHelper "background-color: \#"+ get_color(user) +";" end + def euro_from_cents(f) + euro(f / 100.0) + end + def euro(f) number_to_currency(f, unit: '€') end diff --git a/app/jobs/tab_api_job.rb b/app/jobs/tab_api_job.rb new file mode 100644 index 0000000..3b66796 --- /dev/null +++ b/app/jobs/tab_api_job.rb @@ -0,0 +1,15 @@ +TabApiJob = Struct.new(:order_id) do + def perform(*args) + order = Order.find_by(id: order_id) + if order && !order.transaction_id + body = { transaction: { debtor: order.user.uid, cents: order.price_cents, message: order.to_sentence, id_at_client: order.id } } + headers = { "Authorization" => "Token token=#{Rails.application.secrets.tab_api_key}" } + result = HTTParty.post("https://zeus.ugent.be/tab/transactions", body: body, headers: headers ) + order.update_attribute(:transaction_id, JSON.parse(result.body)["id"].to_i) + end + end + + def error(job, exception) + Airbrake.notify(exception) + end +end diff --git a/app/models/order.rb b/app/models/order.rb index b76072b..d551d14 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -20,26 +20,16 @@ class Order < ActiveRecord::Base has_many :products, through: :order_items before_validation :calculate_price - after_create :tab_api_created + before_save { |o| o.order_items = o.order_items.reject{ |oi| oi.count == 0 } } + after_create { Delayed::Job.enqueue TabApiJob.new(id) } default_scope -> { where(cancelled: false) } validates :user, presence: true validates :order_items, presence: true, in_stock: true + validates :price_cents, presence: true - accepts_nested_attributes_for :order_items, reject_if: proc { |oi| oi[:count].to_i <= 0 } - - def price_cents - self.order_items.map{ |oi| oi.count * oi.product.price_cents }.sum - end - - def price - self.price_cents / 100.0 - end - - def price=(_) - write_attribute(:price_cents, price_cents) - end + accepts_nested_attributes_for :order_items def cancel return false if cancelled || created_at < 5.minutes.ago @@ -59,35 +49,13 @@ class Order < ActiveRecord::Base def g_order_items(products) products.each do |p| - if (oi = self.order_items.select { |t| t.product == p }).size > 0 - oi.first.count = [oi.first.product.stock, oi.first.count].min - else - self.order_items.build(product: p) - end + self.order_items.build(product: p) end end private def calculate_price - self.price_cents = price_cents - end - - def tab_api_created - body = { transaction: { debtor: user.uid, cents: price_cents, message: to_sentence } } - tab_api body - end - handle_asynchronously :tab_api_created - - def tab_api_cancelled - body = { transaction: { creditor: user.uid, cents: price_cents, message: "Order cancelled" } } - tab_api body - end - handle_asynchronously :tab_api_cancelled - - def tab_api body - headers = { "Authorization" => "Token token=#{Rails.application.secrets.tab_api_key}" } - result = HTTParty.post("https://zeus.ugent.be/tab/transactions", body: body, headers: headers ) - update_attribute(:transaction_id, JSON.parse(result.body)["id"]) + self.price_cents = self.order_items.map{ |oi| oi.count * oi.product.price_cents }.sum end end diff --git a/app/models/order_item.rb b/app/models/order_item.rb index ba5a4ae..b30b43b 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -13,7 +13,7 @@ class OrderItem < ActiveRecord::Base belongs_to :product validates :product, presence: true - validates :count, presence: true, numericality: { only_integer: true, greater_than: 0 } + validates :count, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 } after_create :remove_from_stock diff --git a/app/views/orders/_order.html.erb b/app/views/orders/_order.html.erb index aef0f4a..f123b18 100644 --- a/app/views/orders/_order.html.erb +++ b/app/views/orders/_order.html.erb @@ -8,6 +8,7 @@ <%= order.to_sentence %> - <%= euro(order.price) %> + <% p order %> + <%= euro_from_cents(order.price_cents) %> diff --git a/config/initializers/delayed_job_config.rb b/config/initializers/delayed_job_config.rb new file mode 100644 index 0000000..7323b71 --- /dev/null +++ b/config/initializers/delayed_job_config.rb @@ -0,0 +1,2 @@ +Delayed::Worker.destroy_failed_jobs = false +Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log')) diff --git a/config/secrets.yml b/config/secrets.yml index b79fc95..03566fd 100644 --- a/config/secrets.yml +++ b/config/secrets.yml @@ -15,7 +15,7 @@ development: omniauth_client_id: tomtest omniauth_client_secret: blargh access_token: "token" - tab_api_key: "LNJxGqkM39O21gcJJq6BLQ==" + tab_api_key: "6GNUM/BhsU3If20qXluPIA==" test: secret_key_base: 961437e28e7d6055ffaad9cf1f8d614354f57f10cb2d7601c9d6ede72a03b9c9535ad9e63507e3eb31252c4895970a63117493408f2e9a46c7a0c4a5a7836b81