comable-core 0.6.0 → 0.7.0.beta1

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.
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