comable_core 0.2.1 → 0.2.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0847e05a0d1404a70910a95138f0666315b06db
4
- data.tar.gz: 213b8f3f6e5d9f11779633b3ce76eb97a366075a
3
+ metadata.gz: b77ac8195add8320091e5c17e8b8eb99d3a0ef5f
4
+ data.tar.gz: 9b4e674341684b9d4d6807aa9283a4eee1c40594
5
5
  SHA512:
6
- metadata.gz: 9fcebb0bbdd4673c92acacaea3fe91ebed3591b10dbc050c86311a0026acfe431460e0a46c9fabec158fc00ea7ef59561d14ee566800d0e8e8d10aea26915483
7
- data.tar.gz: d2bba80062e20dd7320057eb35e70c4c2e4f609ae522288b5fc43691a621977f2a06039d3d4caaa390f482be08dc530ce947d69fe04dd36ced4d138e8794a6f4
6
+ metadata.gz: ea16779b2ba3b37d19946de36f67bdbf846914750d4e006ebf86e7483a4c415c7163854e66aa4b1d8f1b7e056d285648bd529d13d0d1000dfb545490b5f19a1d
7
+ data.tar.gz: 42fba0d835446368be5aec1f6deaf0a316c763751c43998035648fc64ad15e565ac27fa6d9f6f403e04243788cdef7ed43c8c3a91aa406bb791606d9746c21f7
@@ -10,4 +10,6 @@
10
10
  // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
11
  // about supported directives.
12
12
  //
13
+ //= require jquery
14
+ //= require jquery_ujs
13
15
  //= require_tree .
@@ -1,12 +1,15 @@
1
1
  module Comable
2
2
  module ApplicationHelper
3
3
  def current_store
4
- @current_store || load_store
4
+ @current_store ||= Comable::Store.instance
5
5
  end
6
6
 
7
- def current_customer
8
- @current_customer || load_customer
9
- end
7
+ # Override the devise method.
8
+ # The below codes move to core/lib/comable/core/engine.rb:
9
+ #
10
+ # def current_customer
11
+ # ...
12
+ # end
10
13
 
11
14
  def current_order
12
15
  current_customer.incomplete_order
@@ -24,20 +27,5 @@ module Comable
24
27
  "x#{quantity}"
25
28
  ].join(' ')
26
29
  end
27
-
28
- private
29
-
30
- def load_store
31
- @current_store = Comable::Store.instance
32
- end
33
-
34
- def load_customer
35
- @current_customer = logged_in_customer
36
- @current_customer ||= Comable::Customer.new(cookies)
37
- end
38
-
39
- def logged_in_customer
40
- # Please override this method for logged in customer
41
- end
42
30
  end
43
31
  end
@@ -12,11 +12,7 @@ module Comable
12
12
  private
13
13
 
14
14
  def subject_for(order)
15
- [
16
- current_store.name,
17
- I18n.t('comable.order_mailer.complete.subject'),
18
- order.code
19
- ].join(' ')
15
+ I18n.t('comable.order_mailer.complete.subject', store_name: current_store.name, order_code: order.code)
20
16
  end
21
17
  end
22
18
  end
@@ -0,0 +1,13 @@
1
+ module Comable
2
+ class Address < ActiveRecord::Base
3
+ extend Enumerize
4
+
5
+ belongs_to :customer, class_name: Comable::Customer.name, foreign_key: Comable::Customer.table_name.singularize.foreign_key, autosave: false
6
+
7
+ enumerize :assign_key, in: {
8
+ nothing: nil,
9
+ bill: 1,
10
+ ship: 2
11
+ }
12
+ end
13
+ end
@@ -2,8 +2,12 @@ module Comable
2
2
  class Customer < ActiveRecord::Base
3
3
  include CartOwner
4
4
 
5
- has_many :comable_orders, class_name: Comable::Order.name, foreign_key: table_name.singularize.foreign_key
6
- alias_method :orders, :comable_orders
5
+ has_many :orders, class_name: Comable::Order.name, foreign_key: table_name.singularize.foreign_key
6
+
7
+ has_many :comable_addresses, class_name: Comable::Address.name, foreign_key: table_name.singularize.foreign_key
8
+ alias_method :addresses, :comable_addresses
9
+
10
+ devise(*Comable::Config.devise_strategies[:customer])
7
11
 
8
12
  def initialize(*args)
9
13
  obj = args.first
@@ -16,12 +20,18 @@ module Comable
16
20
  end
17
21
  end
18
22
 
19
- def logged_in?
23
+ # Add conditions for the orders association.
24
+ # Override method of the orders association to support Rails 3.x.
25
+ def orders
26
+ super.complete
27
+ end
28
+
29
+ def signed_in?
20
30
  !new_record?
21
31
  end
22
32
 
23
- def not_logged_in?
24
- !logged_in?
33
+ def not_signed_in?
34
+ !signed_in?
25
35
  end
26
36
 
27
37
  def reset_cart
@@ -43,18 +53,20 @@ module Comable
43
53
 
44
54
  def preorder(order_params = {})
45
55
  incomplete_order.attributes = order_params
46
- incomplete_order.precomplete
56
+ incomplete_order.precomplete!
57
+ incomplete_order
47
58
  end
48
59
 
49
60
  def order(order_params = {})
50
61
  incomplete_order.attributes = order_params
51
- incomplete_order.complete.tap { |completed_flag| reset_cart if completed_flag }
62
+ incomplete_order.complete!
63
+ incomplete_order.tap { |completed_flag| reset_cart if completed_flag }
52
64
  end
53
65
 
54
66
  private
55
67
 
56
68
  def current_guest_token
57
- return if logged_in?
69
+ return if signed_in?
58
70
  @cookies.signed[:guest_token]
59
71
  end
60
72
 
@@ -62,7 +74,7 @@ module Comable
62
74
  orders = find_incomplete_orders
63
75
  return orders.first if orders.any?
64
76
  order = orders.create(family_name: family_name, first_name: first_name, email: email, order_deliveries_attributes: [{ family_name: family_name, first_name: first_name }])
65
- @cookies.permanent.signed[:guest_token] = order.guest_token if not_logged_in?
77
+ @cookies.permanent.signed[:guest_token] = order.guest_token if not_signed_in?
66
78
  order
67
79
  end
68
80
 
@@ -3,7 +3,7 @@ module Comable
3
3
  belongs_to :customer, class_name: Comable::Customer.name, foreign_key: Comable::Customer.table_name.singularize.foreign_key, autosave: false
4
4
  belongs_to :payment, class_name: Comable::Payment.name, foreign_key: Comable::Payment.table_name.singularize.foreign_key, autosave: false
5
5
  belongs_to :shipment_method, class_name: Comable::ShipmentMethod.name, autosave: false
6
- has_many :order_deliveries, dependent: :destroy, class_name: Comable::OrderDelivery.name, foreign_key: table_name.singularize.foreign_key
6
+ has_many :order_deliveries, dependent: :destroy, class_name: Comable::OrderDelivery.name, foreign_key: table_name.singularize.foreign_key, inverse_of: :order
7
7
 
8
8
  accepts_nested_attributes_for :order_deliveries
9
9
 
@@ -29,16 +29,23 @@ module Comable
29
29
  scope :incomplete, -> { where(completed_at: nil) }
30
30
 
31
31
  def precomplete
32
- valid_stock
33
- fail Comable::InvalidOrder, errors.full_messages.join("\n") if errors.any?
32
+ valid_order_quantity?
33
+ end
34
+
35
+ def precomplete!
36
+ fail Comable::InvalidOrder unless precomplete
34
37
  self
35
38
  end
36
39
 
37
40
  def complete
38
41
  # TODO: トランザクションの追加
39
42
  run_callbacks :complete do
40
- save_to_complete!
43
+ save_to_complete
41
44
  end
45
+ end
46
+
47
+ def complete!
48
+ fail Comable::InvalidOrder unless complete
42
49
  self
43
50
  end
44
51
 
@@ -77,21 +84,17 @@ module Comable
77
84
 
78
85
  private
79
86
 
80
- def save_to_complete!
87
+ def save_to_complete
81
88
  self.completed_at = Time.now
82
89
  self.shipment_fee = current_shipment_fee
83
90
  self.total_price = current_total_price
84
91
  generate_code
85
92
  order_deliveries.each(&:save_to_complete)
86
- save!
93
+ save
87
94
  end
88
95
 
89
- def valid_stock
90
- order_deliveries.map(&:order_details).flatten.each do |order_detail|
91
- return errors.add :base, "「#{order_detail.stock.name_with_sku}」の注文数が不正です。" if order_detail.quantity <= 0
92
- quantity = order_detail.stock.quantity - order_detail.quantity
93
- return errors.add :base, I18n.t('comable.errors.messages.product_soldout', name: order_detail.stock.name_with_sku) if quantity < 0
94
- end
96
+ def valid_order_quantity?
97
+ order_deliveries.map(&:order_details).flatten.map(&:valid_order_quantity?).all?
95
98
  end
96
99
 
97
100
  def generate_code
@@ -1,7 +1,9 @@
1
1
  module Comable
2
2
  class OrderDelivery < ActiveRecord::Base
3
3
  belongs_to :order, class_name: Comable::Order.name, foreign_key: Comable::Order.table_name.singularize.foreign_key
4
- has_many :order_details, dependent: :destroy, class_name: Comable::OrderDetail.name, foreign_key: table_name.singularize.foreign_key
4
+ has_many :order_details, dependent: :destroy, class_name: Comable::OrderDetail.name, foreign_key: table_name.singularize.foreign_key, inverse_of: :order_delivery
5
+
6
+ accepts_nested_attributes_for :order_details
5
7
 
6
8
  delegate :customer, to: :order
7
9
  delegate :guest_token, to: :order
@@ -6,13 +6,17 @@ module Comable
6
6
  belongs_to :stock, class_name: Comable::Stock.name, foreign_key: Comable::Stock.table_name.singularize.foreign_key
7
7
  belongs_to :order_delivery, class_name: Comable::OrderDelivery.name, foreign_key: Comable::OrderDelivery.table_name.singularize.foreign_key
8
8
 
9
+ accepts_nested_attributes_for :stock
10
+
9
11
  # TODO: バリデーションの追加
10
12
 
11
13
  delegate :product, to: :stock
12
14
  delegate :guest_token, to: :order_delivery
13
15
  delegate :complete?, to: :order_delivery
16
+ delegate :order, to: :order_delivery
14
17
 
15
18
  before_save :save_to_add_cart, unless: :complete?
19
+ before_save :verify_quantity, unless: :complete?
16
20
 
17
21
  def save_to_complete
18
22
  self.attributes = current_attributes
@@ -39,10 +43,30 @@ module Comable
39
43
  price * quantity
40
44
  end
41
45
 
46
+ def valid_order_quantity?
47
+ if quantity <= 0
48
+ add_order_quantity_invalid_error_to_order
49
+ return false
50
+ end
51
+
52
+ if stock.soldout?(quantity: quantity)
53
+ add_product_soldout_error_to_order
54
+ return false
55
+ end
56
+
57
+ true
58
+ end
59
+
42
60
  private
43
61
 
44
62
  def decrement_stock
45
- stock.decrement!(quantity: quantity)
63
+ return unless quantity
64
+ return unless stock.quantity
65
+ stock.quantity -= quantity
66
+ end
67
+
68
+ def verify_quantity
69
+ fail Comable::NoStock if stock.soldout?(quantity: quantity)
46
70
  end
47
71
 
48
72
  def current_attributes
@@ -56,5 +80,13 @@ module Comable
56
80
  sku_v_choice_name: stock.sku_v_choice_name
57
81
  }
58
82
  end
83
+
84
+ def add_order_quantity_invalid_error_to_order
85
+ order.errors.add :base, I18n.t('comable.errors.messages.order_quantity_invalid', name: stock.name_with_sku)
86
+ end
87
+
88
+ def add_product_soldout_error_to_order
89
+ order.errors.add :base, I18n.t('comable.errors.messages.product_soldout', name: stock.name_with_sku)
90
+ end
59
91
  end
60
92
  end
@@ -9,6 +9,7 @@ ja:
9
9
  products_soldout: 'ご指定の商品は在庫が不足しています。'
10
10
  product_not_found: '%{name}は存在しないか削除された可能性があります。'
11
11
  products_not_found: 'ご指定の商品は存在しないか削除された可能性があります。'
12
+ order_quantity_invalid: '%{name}の注文数が不正です。'
12
13
 
13
14
  carts:
14
15
  add_product: '1つの商品がカートに入りました'
@@ -20,7 +21,7 @@ ja:
20
21
 
21
22
  order_mailer:
22
23
  complete:
23
- subject: '注文完了メール'
24
+ subject: '%{store_name} 注文完了メール %{order_code}'
24
25
  dear: *honorific
25
26
  introductions: |-
26
27
  %{store_name} をご利用いただきましてありがとうございます。
@@ -1,9 +1,43 @@
1
1
  class CreateComableCustomers < ActiveRecord::Migration
2
2
  def change
3
3
  create_table :comable_customers do |t|
4
- t.string :family_name, null: false
5
- t.string :first_name, null: false
4
+ ## Database authenticatable
6
5
  t.string :email, null: false
6
+ t.string :encrypted_password
7
+
8
+ ## Recoverable
9
+ t.string :reset_password_token
10
+ t.datetime :reset_password_sent_at
11
+
12
+ ## Rememberable
13
+ t.datetime :remember_created_at
14
+
15
+ ## Trackable
16
+ t.integer :sign_in_count, default: 0, null: false
17
+ t.datetime :current_sign_in_at
18
+ t.datetime :last_sign_in_at
19
+ t.string :current_sign_in_ip
20
+ t.string :last_sign_in_ip
21
+
22
+ ## Confirmable
23
+ # t.string :confirmation_token
24
+ # t.datetime :confirmed_at
25
+ # t.datetime :confirmation_sent_at
26
+ # t.string :unconfirmed_email # Only if using reconfirmable
27
+
28
+ ## Lockable
29
+ # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
30
+ # t.string :unlock_token # Only if unlock strategy is :email or :both
31
+ # t.datetime :locked_at
32
+
33
+ ## Others
34
+ t.string :family_name
35
+ t.string :first_name
7
36
  end
37
+
38
+ add_index :comable_customers, :email, unique: true
39
+ add_index :comable_customers, :reset_password_token, unique: true
40
+ # add_index :comable_customers, :confirmation_token, unique: true
41
+ # add_index :comable_customers, :unlock_token, unique: true
8
42
  end
9
43
  end
@@ -0,0 +1,19 @@
1
+ class CreateComableAddresses < ActiveRecord::Migration
2
+ def change
3
+ create_table :comable_addresses do |t|
4
+ t.integer :comable_customer_id, null: false
5
+ t.integer :assign_key
6
+ t.string :family_name, null: false
7
+ t.string :first_name, null: false
8
+ t.string :zip_code, null: false, limit: 8
9
+ t.integer :comable_state_id
10
+ t.string :state_name, null: false
11
+ t.string :city, null: false
12
+ t.string :detail
13
+ t.string :phone_number, null: false, limit: 18
14
+ t.datetime :last_used_at
15
+ end
16
+
17
+ add_index :comable_addresses, [:comable_customer_id, :assign_key], unique: true, name: :comable_addresses_idx_01
18
+ end
19
+ end
@@ -49,18 +49,14 @@ module Comable
49
49
  cart_items = find_cart_items_by(stock)
50
50
  if cart_items.any?
51
51
  cart_item = cart_items.first
52
- fail Comable::NoStock if stock.soldout?(quantity: quantity + cart_item.quantity)
53
52
  cart_item.quantity += quantity
54
53
  (cart_item.quantity > 0) ? cart_item.save : cart_item.destroy
55
54
  else
56
- fail Comable::NoStock if stock.soldout?(quantity: quantity)
57
55
  cart_items.create(quantity: quantity)
58
56
  end
59
57
  end
60
58
 
61
59
  def reset_stock_from_cart(stock, quantity)
62
- fail Comable::NoStock if stock.soldout?(quantity: quantity)
63
-
64
60
  cart_items = find_cart_items_by(stock)
65
61
  if quantity > 0
66
62
  return add_stock_to_cart(stock, quantity) if cart_items.empty?
@@ -0,0 +1,10 @@
1
+ module Comable
2
+ module Core
3
+ module Configuration
4
+ mattr_accessor :devise_strategies
5
+ @@devise_strategies = {
6
+ customer: [:database_authenticatable, :registerable, :recoverable, :rememberable, :trackable]
7
+ }
8
+ end
9
+ end
10
+ end
@@ -9,6 +9,53 @@ module Comable
9
9
  end
10
10
 
11
11
  config.autoload_paths << "#{config.root}/app/models/concerns" if Rails::VERSION::MAJOR == 3
12
+
13
+ initializer 'comable.congiguration', before: :load_config_initializers do |app|
14
+ app.config.comable = Comable::Core::Configuration
15
+ Comable::Config = app.config.comable
16
+ end
17
+
18
+ # refs: https://github.com/plataformatec/devise/wiki/How-To:-Use-devise-inside-a-mountable-engine
19
+ initializer 'comable.devise.setup', before: :load_config_initializers do
20
+ Devise.setup do |config|
21
+ config.mailer_sender = 'comable@example.com'
22
+
23
+ require 'devise/orm/active_record'
24
+
25
+ config.case_insensitive_keys = [:email]
26
+ config.strip_whitespace_keys = [:email]
27
+ config.skip_session_storage = [:http_auth]
28
+ config.stretches = Rails.env.test? ? 1 : 10
29
+ config.reconfirmable = true
30
+ config.password_length = 8..128
31
+ config.reset_password_within = 6.hours
32
+ config.sign_out_via = :delete
33
+
34
+ # ==> Mountable engine configurations
35
+ config.router_name = :comable
36
+ config.parent_controller = 'Comable::ApplicationController'
37
+ end
38
+ end
39
+
40
+ initializer 'comable.devise.helpers' do
41
+ module DeviseHelperPrepender
42
+ def define_helpers(mapping)
43
+ super.tap do
44
+ mapping = mapping.name
45
+ return if mapping.to_sym != :customer
46
+
47
+ class_eval <<-METHODS, __FILE__, __LINE__ + 1
48
+ alias_method :devise_current_#{mapping}, :current_#{mapping}
49
+ def current_#{mapping}
50
+ @current_#{mapping} ||= devise_current_#{mapping} || Comable::Customer.new(cookies)
51
+ end
52
+ METHODS
53
+ end
54
+ end
55
+ end
56
+
57
+ Devise::Controllers::Helpers.singleton_class.send(:prepend, DeviseHelperPrepender)
58
+ end
12
59
  end
13
60
  end
14
61
  end
data/lib/comable_core.rb CHANGED
@@ -1,3 +1,8 @@
1
+ require 'devise'
2
+ require 'jquery-rails'
3
+ require 'enumerize'
4
+
5
+ require 'comable/core/configuration'
1
6
  require 'comable/core/engine'
2
7
 
3
8
  require 'comable/errors'
@@ -5,4 +10,9 @@ require 'comable/cart_owner'
5
10
  require 'comable/payment_method'
6
11
 
7
12
  module Comable
13
+ class << self
14
+ def setup(&_)
15
+ yield Comable::Config
16
+ end
17
+ end
8
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: comable_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - YOSHIDA Hiroki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-29 00:00:00.000000000 Z
11
+ date: 2014-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: devise
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: enumerize
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  description: Provide core functions for Comable.
28
56
  email:
29
57
  - hyoshida@appirits.com
@@ -37,6 +65,7 @@ files:
37
65
  - app/helpers/comable/application_helper.rb
38
66
  - app/helpers/comable/products_helper.rb
39
67
  - app/mailers/comable/order_mailer.rb
68
+ - app/models/comable/address.rb
40
69
  - app/models/comable/customer.rb
41
70
  - app/models/comable/order.rb
42
71
  - app/models/comable/order_delivery.rb
@@ -59,7 +88,9 @@ files:
59
88
  - db/migrate/20140817194104_create_comable_payments.rb
60
89
  - db/migrate/20140921191416_create_comable_shipment_methods.rb
61
90
  - db/migrate/20140926063541_create_comable_stores.rb
91
+ - db/migrate/20141024025526_create_comable_addresses.rb
62
92
  - lib/comable/cart_owner.rb
93
+ - lib/comable/core/configuration.rb
63
94
  - lib/comable/core/engine.rb
64
95
  - lib/comable/errors.rb
65
96
  - lib/comable/payment_method.rb