comable-core 0.6.0 → 0.7.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/comable/application_controller.rb +4 -0
  3. data/app/helpers/comable/application_helper.rb +23 -8
  4. data/app/helpers/comable/products_helper.rb +0 -63
  5. data/app/models/comable/image.rb +1 -1
  6. data/app/models/comable/navigation.rb +12 -0
  7. data/app/models/comable/navigation_item.rb +52 -0
  8. data/app/models/comable/option_type.rb +19 -0
  9. data/app/models/comable/option_value.rb +14 -0
  10. data/app/models/comable/order.rb +1 -0
  11. data/app/models/comable/order_item/csvable.rb +1 -1
  12. data/app/models/comable/order_item.rb +38 -7
  13. data/app/models/comable/page.rb +3 -1
  14. data/app/models/comable/payment.rb +1 -1
  15. data/app/models/comable/product/csvable.rb +1 -0
  16. data/app/models/comable/product.rb +68 -9
  17. data/app/models/comable/stock/csvable.rb +5 -6
  18. data/app/models/comable/stock.rb +45 -8
  19. data/app/models/comable/store.rb +0 -2
  20. data/app/models/comable/theme.rb +10 -0
  21. data/app/models/comable/variant.rb +46 -0
  22. data/app/models/concerns/comable/cart_owner.rb +6 -2
  23. data/app/models/concerns/comable/checkout.rb +2 -2
  24. data/app/models/concerns/comable/linkable.rb +46 -0
  25. data/app/models/concerns/comable/sku_choice.rb +1 -9
  26. data/app/uploaders/comable/image_uploader.rb +9 -0
  27. data/config/locales/en.yml +67 -2
  28. data/config/locales/ja.yml +66 -2
  29. data/db/migrate/20150701094210_create_comable_navigation.rb +8 -0
  30. data/db/migrate/20150706085056_create_comable_navigation_item.rb +15 -0
  31. data/db/migrate/20150805074914_add_published_at_to_comable_products.rb +9 -0
  32. data/db/migrate/20150823071425_create_comable_variants.rb +10 -0
  33. data/db/migrate/20150823072622_create_comable_option_types.rb +10 -0
  34. data/db/migrate/20150823072955_create_comable_option_values.rb +11 -0
  35. data/db/migrate/20150823073250_create_comable_variants_option_values.rb +8 -0
  36. data/db/migrate/20150823073809_change_comable_products_and_comable_stocks.rb +82 -0
  37. data/db/migrate/20150823102819_change_comable_order_items.rb +50 -0
  38. data/lib/comable/core.rb +1 -0
  39. data/lib/comable/deprecator.rb +1 -1
  40. data/lib/comable/errors.rb +7 -0
  41. metadata +74 -21
  42. data/app/uploaders/image_uploader.rb +0 -7
@@ -51,18 +51,22 @@ module Comable
51
51
 
52
52
  private
53
53
 
54
+ # rubocop:disable Metrics/MethodLength
54
55
  def process_cart_item(obj)
55
56
  case obj
56
57
  when Comable::Product
57
58
  yield obj.stocks.first
58
59
  when Comable::Stock
59
60
  yield obj
61
+ when Comable::Variant
62
+ yield obj.stock
60
63
  when Array
61
64
  obj.map { |item| yield item }
62
65
  else
63
66
  fail
64
67
  end
65
68
  end
69
+ # rubocop:enable Metrics/MethodLength
66
70
 
67
71
  def add_stock_to_cart(stock, quantity)
68
72
  cart_item = find_cart_item_by(stock)
@@ -70,7 +74,7 @@ module Comable
70
74
  cart_item.quantity += quantity
71
75
  (cart_item.quantity > 0) ? cart_item.save : cart_item.destroy
72
76
  else
73
- cart_items.build(stock_id: stock.id, quantity: quantity).save
77
+ cart_items.build(variant: stock.variant, quantity: quantity).save
74
78
  end
75
79
  end
76
80
 
@@ -88,7 +92,7 @@ module Comable
88
92
  def find_cart_item_by(stock)
89
93
  # TODO: Refactoring
90
94
  fail unless stock.is_a?(Comable::Stock)
91
- cart_items.find { |cart_item| cart_item.stock.id == stock.id }
95
+ cart_items.find { |cart_item| cart_item.stock == stock }
92
96
  end
93
97
  end
94
98
  end
@@ -37,8 +37,8 @@ module Comable
37
37
  end
38
38
 
39
39
  before_transition to: :completed, do: :complete!
40
- after_transition to: :canceled, do: :restock!
41
- after_transition to: :resumed, do: :unstock!
40
+ before_transition to: :canceled, do: [:payment_cancel!, :restock!]
41
+ before_transition to: :resumed, do: [:payment_resume!, :unstock!]
42
42
  end
43
43
  end
44
44
 
@@ -0,0 +1,46 @@
1
+ module Comable
2
+ module Linkable
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def linkable_columns_keys(options = {})
7
+ if options.present?
8
+ @_linkable_columns = default_columns_key.merge(options.slice(:name, :id))
9
+ @use_index = options[:use_index]
10
+ else
11
+ @_linkable_columns
12
+ end
13
+ end
14
+
15
+ def linkable_columns(*key)
16
+ (@_linkable_columns || default_columns_key).slice(*key).values
17
+ end
18
+
19
+ def linkable_id_options
20
+ # HACK: Rails3系のpluckでは複数フィールドを指定できないためselectとmapでカラムを取得する
21
+ # options = pluck(*linkable_columns(:name, :id))
22
+ columns = linkable_columns(:name, :id)
23
+ records = select(columns)
24
+ options = records.map(&columns.first).zip(records.map(&columns.last))
25
+ @use_index ? options.unshift(index_option) : options
26
+ end
27
+
28
+ def linkable_exists?
29
+ @use_index || exists?
30
+ end
31
+
32
+ private
33
+
34
+ def default_columns_key
35
+ {
36
+ id: :id,
37
+ name: :name
38
+ }
39
+ end
40
+
41
+ def index_option
42
+ [Comable.t('admin.actions.index'), nil]
43
+ end
44
+ end
45
+ end
46
+ end
@@ -5,15 +5,7 @@ module Comable
5
5
  #
6
6
  module SkuChoice
7
7
  def name_with_sku
8
- return name unless sku?
9
- name + "(#{sku_name})"
10
- end
11
-
12
- def sku_name
13
- return unless sku?
14
- sku_name = sku_h_choice_name
15
- sku_name += '/' + sku_v_choice_name if sku_v_choice_name.present?
16
- sku_name
8
+ name
17
9
  end
18
10
  end
19
11
  end
@@ -0,0 +1,9 @@
1
+ module Comable
2
+ class ImageUploader < CarrierWave::Uploader::Base
3
+ storage :file
4
+
5
+ def store_dir
6
+ "uploads/#{model.class.to_s.underscore}/#{model.id}"
7
+ end
8
+ end
9
+ end
@@ -33,6 +33,7 @@ en:
33
33
  failure: 'Failure'
34
34
  products: 'Products'
35
35
  pages: 'Pages'
36
+ navigations: 'Navigations'
36
37
  home: 'Home'
37
38
  support: 'Support'
38
39
  sample_header: 'Sample text'
@@ -110,6 +111,7 @@ en:
110
111
  confirmation_to_remove_product: 'This operation cannot be undone. Would you like to proceed?'
111
112
  confirmation_to_remove_stock: 'This operation cannot be undone. Would you like to proceed?'
112
113
  confirmation_to_remove_page: 'This operation cannot be undone. Would you like to proceed?'
114
+ confirmation_to_remove_navigation: 'This operation cannot be undone. Would you like to proceed?'
113
115
  you_can_drag_and_drop: 'Edit the category tree by drag-and-drop.'
114
116
  you_can_right_click: 'Open the context menu by right click.'
115
117
  link_to_add_new_node: 'Add a new category from the following link: '
@@ -163,6 +165,11 @@ en:
163
165
  please_see_following_page_for_syntax: 'Please see the following page for the syntax:'
164
166
  please_select_file_form_directory_tree_to_edit: 'Please select a file form the directory tree to edit.'
165
167
  here_editor_will_be_displayed_and_you_can_edit_file: 'Here the editor will be displayed, you can edit file.'
168
+ variants: 'Variants'
169
+ pricing: 'Pricing'
170
+ view: 'View'
171
+ add_variants: 'Add variants'
172
+ size: 'Size'
166
173
  nav:
167
174
  dashboard: 'Dashboard'
168
175
  order: 'Orders'
@@ -170,6 +177,7 @@ en:
170
177
  stock: 'Stocks'
171
178
  category: 'Categories'
172
179
  page: 'Pages'
180
+ navigation: 'Navigations'
173
181
  user: 'Users'
174
182
  general_settings: 'General settings'
175
183
  store: 'Store'
@@ -180,6 +188,9 @@ en:
180
188
  products:
181
189
  detail: 'Product details'
182
190
  list: 'Product list'
191
+ visibility: 'publishing/closed'
192
+ published: 'Published'
193
+ unpublished: 'Unpublished'
183
194
  orders:
184
195
  detail: 'Order details'
185
196
  cart: 'Cart infomation'
@@ -196,6 +207,12 @@ en:
196
207
  visibility: 'publishing/closed'
197
208
  published: 'Published'
198
209
  unpublished: 'Unpublished'
210
+ navigations:
211
+ general: 'General'
212
+ navigation_items: 'Navigation items'
213
+ navigation_items:
214
+ web_address: 'Web Address'
215
+ add_link: 'Add Link'
199
216
  stores:
200
217
  edit: 'Editing store'
201
218
  shipment_methods:
@@ -264,8 +281,13 @@ en:
264
281
  models:
265
282
  comable/order: 'Orders'
266
283
  comable/order_items: 'Order items'
284
+ comable/navigation: 'Navigation'
285
+ comable/navigation_item: 'Navigation item'
267
286
 
268
287
  attributes:
288
+ timestamps: &timestamps
289
+ created_at: 'Created at'
290
+ updated_at: 'Updated at'
269
291
  comable/user:
270
292
  id: 'ID'
271
293
  email: 'Email address'
@@ -282,6 +304,7 @@ en:
282
304
  last_sign_in_at: 'Last sign in at'
283
305
  current_sign_in_ip: 'Current sign in ip'
284
306
  last_sign_in_ip: 'Last sign in ip'
307
+ <<: *timestamps
285
308
  comable/order:
286
309
  id: 'ID'
287
310
  code: 'Order number'
@@ -305,6 +328,7 @@ en:
305
328
  guest_token: 'Guest token'
306
329
  payment_state: 'Payment state'
307
330
  shipment_state: 'Shipment state'
331
+ <<: *timestamps
308
332
  comable/order_item: &comable_order_item
309
333
  quantity: *quantity
310
334
  price: *price
@@ -317,6 +341,7 @@ en:
317
341
  sku_h_choice_name: 'SKU Horizontal choice name'
318
342
  sku_v_choice_name: 'SKU Vertical choice name'
319
343
  order: 'Order'
344
+ <<: *timestamps
320
345
  comable/address: &comable_address
321
346
  full_name: 'Full name'
322
347
  family_name: 'Last name'
@@ -326,6 +351,7 @@ en:
326
351
  city: 'City'
327
352
  detail: 'Detail'
328
353
  phone_number: 'Phone number'
354
+ <<: *timestamps
329
355
  comable/product:
330
356
  id: 'ID'
331
357
  code: 'Code'
@@ -335,6 +361,8 @@ en:
335
361
  categories: 'Categories'
336
362
  sku_h_item_name: 'SKU Horizontal item name'
337
363
  sku_v_item_name: 'SKU Vertical item name'
364
+ published_at: 'Published at'
365
+ <<: *timestamps
338
366
  comable/stock:
339
367
  id: 'ID'
340
368
  code: 'SKU Code'
@@ -343,27 +371,34 @@ en:
343
371
  sku_v_choice_name: 'SKU Vertical choice name'
344
372
  product: 'Product'
345
373
  product_code: 'Product code'
374
+ name: 'Product name'
375
+ sku: 'SKU'
376
+ <<: *timestamps
346
377
  comable/store:
347
378
  name: 'Name'
348
379
  meta_keywords: 'Meta keywords'
349
380
  meta_description: 'Meta description'
350
381
  email: 'Email'
382
+ <<: *timestamps
351
383
  comable/shipment_method:
352
384
  name: 'Name'
353
385
  fee: 'Fee'
354
386
  activated_flag: 'Activated'
355
387
  traking_url: 'Tracking URL'
388
+ <<: *timestamps
356
389
  comable/payment_method:
357
390
  name: 'Name'
358
391
  payment_provider: 'Oayment provider'
359
392
  fee: 'Fee'
360
393
  enable_price: 'Enable price range'
394
+ <<: *timestamps
361
395
  comable/tracker:
362
396
  activated_flag: 'Activated'
363
397
  name: 'Name'
364
398
  tracker_id: 'Tracker ID'
365
399
  code: 'Code'
366
400
  place: 'Place'
401
+ <<: *timestamps
367
402
  comable/order/order_items:
368
403
  <<: *comable_order_item
369
404
  comable/order/bill_address:
@@ -377,6 +412,7 @@ en:
377
412
  fee: 'Fee'
378
413
  state: 'Status'
379
414
  completed_at: 'Completed at'
415
+ <<: *timestamps
380
416
  comable/shipment:
381
417
  id: 'ID'
382
418
  order_id: 'Order ID'
@@ -385,6 +421,7 @@ en:
385
421
  state: 'Status'
386
422
  tracking_number: 'Tracking number'
387
423
  completed_at: 'Completed at'
424
+ <<: *timestamps
388
425
  comable/page:
389
426
  id: 'ID'
390
427
  title: 'Title'
@@ -395,8 +432,36 @@ en:
395
432
  meta_keywords: 'Meta Keywords'
396
433
  slug: 'Slug'
397
434
  published_at: 'Published at'
398
- created_at: 'Created at'
399
- updated_at: 'Updated at'
435
+ <<: *timestamps
436
+ comable/navigation: &comable_navigation_item
437
+ id: 'ID'
438
+ name: 'Name'
439
+ <<: *timestamps
440
+ comable/navigation_item:
441
+ id: 'ID'
442
+ name: 'Name'
443
+ linkable_type: 'Link to'
444
+ linkable_id: ''
445
+ url: 'Name'
446
+ <<: *timestamps
447
+ comable/navigation/navigation_items:
448
+ <<: *comable_navigation_item
449
+ comable/variant:
450
+ id: 'ID'
451
+ sku: 'SKU'
452
+ price: 'Price'
453
+ product: 'Product'
454
+ quantity: 'Quantity'
455
+ <<: *timestamps
456
+ comable/option_type:
457
+ id: 'ID'
458
+ name: 'Name'
459
+ <<: *timestamps
460
+ comable/option_value:
461
+ id: 'ID'
462
+ name: 'Name'
463
+ <<: *timestamps
464
+
400
465
  enumerize:
401
466
  comable/user:
402
467
  role:
@@ -33,6 +33,7 @@ ja:
33
33
  failure: 失敗しました
34
34
  products: '商品'
35
35
  pages: 'ページ'
36
+ navigations: 'ナビゲーション'
36
37
  home: 'ホーム'
37
38
  support: 'サポート'
38
39
  sample_header: 'サンプルテキスト'
@@ -110,6 +111,7 @@ ja:
110
111
  confirmation_to_remove_product: この操作は元に戻せません。商品を削除してもよろしいですか?
111
112
  confirmation_to_remove_stock: この操作は元に戻せません。在庫を削除してもよろしいですか?
112
113
  confirmation_to_remove_page: この操作は元に戻せません。ページを削除してもよろしいですか?
114
+ confirmation_to_remove_navigation: この操作は元に戻せません。ナビゲーションを削除してもよろしいですか?
113
115
  you_can_drag_and_drop: ドラッグ&ドロップの操作でツリーを編集できます。
114
116
  you_can_right_click: 右クリックでメニューを表示できます。
115
117
  link_to_add_new_node: '次のリンクから新しいカテゴリを追加できます: '
@@ -163,6 +165,11 @@ ja:
163
165
  please_see_following_page_for_syntax: '構文については次のページを参照してください:'
164
166
  please_select_file_form_directory_tree_to_edit: 'ディレクトリーツリーから編集したいファイルを選択してください。'
165
167
  here_editor_will_be_displayed_and_you_can_edit_file: 'ここにエディタが表示されてファイルの内容を編集できます。'
168
+ variants: 'バリエーション'
169
+ pricing: '価格'
170
+ view: '確認する'
171
+ add_variants: 'バリエーションを追加する'
172
+ size: 'サイズ'
166
173
  nav:
167
174
  dashboard: ダッシュボード
168
175
  order: 注文管理
@@ -170,6 +177,7 @@ ja:
170
177
  stock: 在庫管理
171
178
  category: カテゴリ
172
179
  page: ページ
180
+ navigation: ナビゲーション
173
181
  user: ユーザー
174
182
  general_settings: 一般設定
175
183
  store: ストア設定
@@ -180,6 +188,9 @@ ja:
180
188
  products:
181
189
  detail: 商品詳細
182
190
  list: '商品一覧'
191
+ visibility: 公開/非公開
192
+ published: 公開
193
+ unpublished: 非公開
183
194
  orders:
184
195
  detail: 注文明細
185
196
  cart: カート情報
@@ -196,6 +207,12 @@ ja:
196
207
  visibility: 公開/非公開
197
208
  published: 公開
198
209
  unpublished: 非公開
210
+ navigations:
211
+ general: 一般
212
+ navigation_items: ナビゲーション項目
213
+ navigation_items:
214
+ web_address: アドレス入力
215
+ add_link: リンク追加
199
216
  stores:
200
217
  edit: 編集
201
218
  shipment_methods:
@@ -264,8 +281,13 @@ ja:
264
281
  models:
265
282
  comable/order: ご注文
266
283
  comable/order_items: ご注文明細
284
+ comable/navigation: 'ナビゲーション'
285
+ comable/navigation_item: 'ナビゲーション項目'
267
286
 
268
287
  attributes:
288
+ timestamps: &timestamps
289
+ created_at: '作成日'
290
+ updated_at: '更新日'
269
291
  comable/user:
270
292
  id: ID
271
293
  email: メールアドレス
@@ -282,6 +304,7 @@ ja:
282
304
  last_sign_in_at: 最終ログイン日時
283
305
  current_sign_in_ip: ログインIP
284
306
  last_sign_in_ip: 最終ログインIP
307
+ <<: *timestamps
285
308
  comable/order:
286
309
  id: ID
287
310
  code: 注文番号
@@ -305,6 +328,7 @@ ja:
305
328
  guest_token: ゲストトークン
306
329
  payment_state: '決済ステータス'
307
330
  shipment_state: '配送ステータス'
331
+ <<: *timestamps
308
332
  comable/order_item: &comable_order_item
309
333
  quantity: *quantity
310
334
  price: *price
@@ -317,6 +341,7 @@ ja:
317
341
  sku_h_choice_name: SKU横軸選択肢名
318
342
  sku_v_choice_name: SKU縦軸選択肢名
319
343
  order: 注文
344
+ <<: *timestamps
320
345
  comable/address: &comable_address
321
346
  full_name: お名前
322
347
  family_name: 姓
@@ -326,6 +351,7 @@ ja:
326
351
  city: 市町村
327
352
  detail: その他
328
353
  phone_number: 電話番号
354
+ <<: *timestamps
329
355
  comable/product:
330
356
  id: ID
331
357
  code: 商品コード
@@ -335,6 +361,8 @@ ja:
335
361
  categories: カテゴリ
336
362
  sku_h_item_name: SKU横軸項目名
337
363
  sku_v_item_name: SKU縦軸項目名
364
+ published_at: '公開日'
365
+ <<: *timestamps
338
366
  comable/stock:
339
367
  id: ID
340
368
  code: SKU商品コード
@@ -343,27 +371,34 @@ ja:
343
371
  sku_v_choice_name: SKU縦軸選択肢名
344
372
  product: 商品
345
373
  product_code: 商品コード
374
+ name: '商品名'
375
+ sku: 'SKUコード'
376
+ <<: *timestamps
346
377
  comable/store:
347
378
  name: ストア名
348
379
  meta_keywords: メタキーワード
349
380
  meta_description: メタディスクリプション
350
381
  email: メールアドレス
382
+ <<: *timestamps
351
383
  comable/shipment_method:
352
384
  name: 発送方法名
353
385
  fee: 手数料
354
386
  activated_flag: この発送方法を有効にする
355
387
  traking_url: トラッキングURL
388
+ <<: *timestamps
356
389
  comable/payment_method:
357
390
  name: 決済方法名
358
391
  payment_provider: 決済プロバイダ
359
392
  fee: '手数料'
360
393
  enable_price: 利用可能な価格範囲
394
+ <<: *timestamps
361
395
  comable/tracker:
362
396
  activated_flag: 'このトラッキング情報を有効にする'
363
397
  name: 'トラッキング名'
364
398
  tracker_id: 'トラッキングID'
365
399
  code: 'トラッキングコード'
366
400
  place: '設置場所'
401
+ <<: *timestamps
367
402
  comable/order/order_items:
368
403
  <<: *comable_order_item
369
404
  comable/order/bill_address:
@@ -377,6 +412,7 @@ ja:
377
412
  fee: '手数料'
378
413
  state: 'ステータス'
379
414
  completed_at: '決済日時'
415
+ <<: *timestamps
380
416
  comable/shipment:
381
417
  id: 'ID'
382
418
  order_id: '注文ID'
@@ -385,6 +421,7 @@ ja:
385
421
  state: 'ステータス'
386
422
  tracking_number: 'トラッキング番号'
387
423
  completed_at: '発送日時'
424
+ <<: *timestamps
388
425
  comable/page:
389
426
  id: ID
390
427
  title: タイトル
@@ -395,8 +432,35 @@ ja:
395
432
  meta_keywords: メタキーワード
396
433
  slug: スラッグ
397
434
  published_at: 公開日
398
- created_at: 作成日
399
- updated_at: 更新日
435
+ <<: *timestamps
436
+ comable/navigation:
437
+ id: ID
438
+ name: 名前
439
+ <<: *timestamps
440
+ comable/navigation_item: &comable_navigation_item
441
+ id: ID
442
+ name: 名前
443
+ linkable_type: リンク先
444
+ linkable_id: ''
445
+ url: URL
446
+ <<: *timestamps
447
+ comable/navigation/navigation_items:
448
+ <<: *comable_navigation_item
449
+ comable/variant:
450
+ id: 'ID'
451
+ sku: 'SKUコード'
452
+ price: '価格'
453
+ product: '商品'
454
+ quantity: '個数'
455
+ <<: *timestamps
456
+ comable/option_type:
457
+ id: 'ID'
458
+ name: '名称'
459
+ <<: *timestamps
460
+ comable/option_value:
461
+ id: 'ID'
462
+ name: '名称'
463
+ <<: *timestamps
400
464
 
401
465
  enumerize:
402
466
  comable/user:
@@ -0,0 +1,8 @@
1
+ class CreateComableNavigation < ActiveRecord::Migration
2
+ def change
3
+ create_table :comable_navigations do |t|
4
+ t.string :name, null: false
5
+ t.timestamps null: false
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ class CreateComableNavigationItem < ActiveRecord::Migration
2
+ def change
3
+ create_table :comable_navigation_items do |t|
4
+ t.references :navigation, null: false
5
+ t.integer :linkable_id
6
+ t.string :linkable_type
7
+ t.integer :position, null: false
8
+ t.string :name, null: false
9
+ t.string :url
10
+ t.timestamps null: false
11
+ end
12
+
13
+ add_index :comable_navigation_items, [:position, :navigation_id]
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ class AddPublishedAtToComableProducts < ActiveRecord::Migration
2
+ def change
3
+ change_table :comable_products do |t|
4
+ t.datetime :published_at
5
+ end
6
+
7
+ Comable::Product.update_all(published_at: (Rails::VERSION::MAJOR == 3) ? Date.today.to_time_in_current_zone : Date.today.in_time_zone) unless reverting?
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ class CreateComableVariants < ActiveRecord::Migration
2
+ def change
3
+ create_table :comable_variants do |t|
4
+ t.references :product, null: false
5
+ t.integer :price, null: false, default: 0
6
+ t.string :sku
7
+ t.timestamps null: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class CreateComableOptionTypes < ActiveRecord::Migration
2
+ def change
3
+ create_table :comable_option_types do |t|
4
+ t.string :name, null: false
5
+ t.timestamps null: false
6
+ end
7
+
8
+ add_index :comable_option_types, :name, unique: true
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class CreateComableOptionValues < ActiveRecord::Migration
2
+ def change
3
+ create_table :comable_option_values do |t|
4
+ t.references :option_type, null: false
5
+ t.string :name, null: false
6
+ t.timestamps null: false
7
+ end
8
+
9
+ add_index :comable_option_values, [:option_type_id, :name], unique: true
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ class CreateComableVariantsOptionValues < ActiveRecord::Migration
2
+ def change
3
+ create_table :comable_variants_option_values do |t|
4
+ t.references :variant, null: false, index: true
5
+ t.references :option_value, null: false, index: true
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,82 @@
1
+ class ChangeComableProductsAndComableStocks < ActiveRecord::Migration
2
+ def change
3
+ reversible do |dir|
4
+ change_table :comable_stocks do |t|
5
+ dir.up { t.references :variant }
6
+ dir.down { t.remove :variant_id }
7
+ end
8
+
9
+ dir.up { up_records }
10
+ dir.down { down_records }
11
+
12
+ dir.up { remove_index :comable_products, :code }
13
+ dir.down { add_index :comable_products, :code, unique: true }
14
+
15
+ change_table :comable_products do |t|
16
+ dir.up { t.remove :code }
17
+ dir.down { t.string :code, null: false }
18
+
19
+ dir.up { t.remove :price }
20
+ dir.down { t.string :price, null: false }
21
+
22
+ dir.up { t.remove :sku_h_item_name }
23
+ dir.down { t.string :sku_h_item_name }
24
+
25
+ dir.up { t.remove :sku_v_item_name }
26
+ dir.down { t.string :sku_v_item_name }
27
+ end
28
+
29
+ dir.up { remove_index :comable_stocks, :code }
30
+ dir.down { add_index :comable_stocks, :code, unique: true }
31
+
32
+ change_table :comable_stocks do |t|
33
+ dir.up { t.remove :product_id }
34
+ dir.down { t.references :product, null: false }
35
+
36
+ dir.up { t.remove :code }
37
+ dir.down { t.string :code, null: false }
38
+
39
+ dir.up { t.remove :sku_h_choice_name }
40
+ dir.down { t.string :sku_h_choice_name }
41
+
42
+ dir.up { t.remove :sku_v_choice_name }
43
+ dir.down { t.string :sku_v_choice_name }
44
+
45
+ dir.up { t.change :quantity, :integer, default: 0 }
46
+ dir.down { t.change :quantity, :integer, default: nil }
47
+
48
+ dir.up { t.change :variant_id, :integer, null: false }
49
+ end
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def up_records
56
+ Comable::Product.all.each do |product|
57
+ if product[:sku_h_item_name].present? || product[:sku_v_item_name].present?
58
+ create_variants_for(product)
59
+ else
60
+ create_variant_for(product)
61
+ end
62
+ end
63
+ end
64
+
65
+ def down_records
66
+ # TODO: Implement
67
+ end
68
+
69
+ def create_variant_for(product)
70
+ stock = Comable::Stock.find_by(product_id: product.id)
71
+ product.variants.create!(stock: stock, price: product[:price], sku: product[:code])
72
+ end
73
+
74
+ def create_variants_for(product)
75
+ Comable::Stock.where(product_id: product.id).each do |stock|
76
+ options = []
77
+ options << { name: product[:sku_h_item_name], value: stock[:sku_h_choice_name] } if product[:sku_h_item_name].present?
78
+ options << { name: product[:sku_v_item_name], value: stock[:sku_v_choice_name] } if product[:sku_v_item_name].present?
79
+ product.variants.create!(stock: stock, price: product[:price], sku: stock[:code], options: options)
80
+ end
81
+ end
82
+ end