rshop 0.1.0

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 (82) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +1 -0
  8. data/app/controllers/ajax/rshop/products_controller.rb +12 -0
  9. data/app/controllers/rshop/.keep +0 -0
  10. data/app/controllers/rshop/auto_products_controller.rb +38 -0
  11. data/app/controllers/rshop/brands_controller.rb +9 -0
  12. data/app/controllers/rshop/cart_controller.rb +61 -0
  13. data/app/controllers/rshop/checkout_controller.rb +69 -0
  14. data/app/controllers/rshop/products_controller.rb +13 -0
  15. data/app/controllers/rshop/stock_requests_controller.rb +17 -0
  16. data/app/mailers/order_mailer.rb +13 -0
  17. data/app/views/order_mailer/feedback.html.slim +3 -0
  18. data/app/views/order_mailer/new_order.html.slim +33 -0
  19. data/app/views/rshop/address/_address_form.html.slim +27 -0
  20. data/app/views/rshop/admin/order/_address.html.slim +13 -0
  21. data/app/views/rshop/admin/order/_order_items.html.slim +7 -0
  22. data/app/views/rshop/brands/index.html.slim +6 -0
  23. data/app/views/rshop/brands/show.html.slim +4 -0
  24. data/app/views/rshop/cart/show.html.slim +74 -0
  25. data/app/views/rshop/checkout/form.html.slim +65 -0
  26. data/app/views/rshop/checkout/ty.html.slim +22 -0
  27. data/app/views/rshop/products/_list.html.slim +27 -0
  28. data/app/views/rshop/products/all.html.slim +1 -0
  29. data/app/views/rshop/products/index.html.slim +0 -0
  30. data/app/views/rshop/products/show.html.slim +67 -0
  31. data/bin/console +14 -0
  32. data/bin/setup +7 -0
  33. data/config/locales/rshop.ru.yml +141 -0
  34. data/config/locales/rshop_autozap.ru.yml +88 -0
  35. data/config/routes.rb +2 -0
  36. data/lib/generators/rshop_autozap_generator.rb +30 -0
  37. data/lib/generators/rshop_generator.rb +38 -0
  38. data/lib/generators/rshop_price_log_generator.rb +30 -0
  39. data/lib/generators/rshop_views_generator.rb +17 -0
  40. data/lib/generators/templates/app/admin/dashboard.rb +37 -0
  41. data/lib/generators/templates/app/admin/rshop/brand.rb +24 -0
  42. data/lib/generators/templates/app/admin/rshop/delivery.rb +4 -0
  43. data/lib/generators/templates/app/admin/rshop/order.rb +55 -0
  44. data/lib/generators/templates/app/admin/rshop/payment.rb +4 -0
  45. data/lib/generators/templates/app/admin/rshop/product.rb +61 -0
  46. data/lib/generators/templates/app/controllers/rshop/.keep +0 -0
  47. data/lib/generators/templates/app/models/rshop/address.rb +11 -0
  48. data/lib/generators/templates/app/models/rshop/album.rb +11 -0
  49. data/lib/generators/templates/app/models/rshop/album_image.rb +7 -0
  50. data/lib/generators/templates/app/models/rshop/brand.rb +24 -0
  51. data/lib/generators/templates/app/models/rshop/delivery.rb +3 -0
  52. data/lib/generators/templates/app/models/rshop/order.rb +65 -0
  53. data/lib/generators/templates/app/models/rshop/order_item.rb +9 -0
  54. data/lib/generators/templates/app/models/rshop/payment.rb +3 -0
  55. data/lib/generators/templates/app/models/rshop/product.rb +88 -0
  56. data/lib/generators/templates/app/uploaders/rshop_album_image_uploader.rb +49 -0
  57. data/lib/generators/templates/app/uploaders/rshop_base_image_uploader.rb +63 -0
  58. data/lib/generators/templates/app/uploaders/rshop_brand_uploader.rb +7 -0
  59. data/lib/generators/templates/migration.rb +95 -0
  60. data/lib/generators/templates_autozap/app/admin/rshop/auto_category.rb +16 -0
  61. data/lib/generators/templates_autozap/app/admin/rshop/auto_mark.rb +15 -0
  62. data/lib/generators/templates_autozap/app/admin/rshop/auto_model.rb +16 -0
  63. data/lib/generators/templates_autozap/app/admin/rshop/auto_subcategory.rb +14 -0
  64. data/lib/generators/templates_autozap/app/admin/rshop/product.rb +66 -0
  65. data/lib/generators/templates_autozap/app/controllers/rshop/.keep +0 -0
  66. data/lib/generators/templates_autozap/app/models/rshop/auto_category.rb +15 -0
  67. data/lib/generators/templates_autozap/app/models/rshop/auto_mark.rb +11 -0
  68. data/lib/generators/templates_autozap/app/models/rshop/auto_model.rb +13 -0
  69. data/lib/generators/templates_autozap/app/models/rshop/auto_subcategory.rb +12 -0
  70. data/lib/generators/templates_autozap/app/models/rshop/product.rb +94 -0
  71. data/lib/generators/templates_autozap/app/views/rshop/auto/_filters.html.slim +18 -0
  72. data/lib/generators/templates_autozap/migration.rb +51 -0
  73. data/lib/generators/templates_price_log/app/models/rshop/price_log.rb +5 -0
  74. data/lib/generators/templates_price_log/migration.rb +11 -0
  75. data/lib/rshop.rb +47 -0
  76. data/lib/rshop/application_controller.rb +51 -0
  77. data/lib/rshop/auto_application_controller.rb +43 -0
  78. data/lib/rshop/price_adjustable_product.rb +30 -0
  79. data/lib/rshop/price_loggable_product.rb +19 -0
  80. data/lib/rshop/version.rb +3 -0
  81. data/rshop.gemspec +32 -0
  82. metadata +156 -0
@@ -0,0 +1,4 @@
1
+ h2
2
+ = @brand.name
3
+ p
4
+ == @brand.description
@@ -0,0 +1,74 @@
1
+ .cart-show.paper-panel
2
+ .clearfix
3
+ h2 Корзина
4
+
5
+ .progress.progress-stage
6
+ .progress-bar.progress-stage-1 style="width: 34%"
7
+ = t('rshop.cart.stage_1')
8
+ .progress-bar.progress-stage-2 style="width: 33%"
9
+ = t('rshop.cart.stage_2')
10
+ .pointer
11
+ .progress-bar.progress-stage-3 style="width: 33%"
12
+ = t('rshop.cart.stage_3')
13
+
14
+ - unless @cart.nil?
15
+ = form_for @cart, url: cart_path, method: :patch do |f|
16
+ table.table
17
+ thead
18
+ tr
19
+ th
20
+ = t('rshop.cart.item')
21
+ th
22
+ = t('rshop.cart.cost')
23
+ th  
24
+ tbody
25
+ - @cart.order_items.each do |oi|
26
+ = f.fields_for :order_items, oi do |oif|
27
+ - product = oif.object.product
28
+ tr.product-item
29
+ td
30
+ .image
31
+ a href=product_path(product)
32
+ img src=product.image_url(:gallery)
33
+ .info
34
+ a href=product_path(product)
35
+ span.name #{product.name}
36
+ br
37
+ - if product.brand
38
+ a.brand href=brand_path(product.brand)
39
+ span #{product.brand.try(:name)}
40
+ br
41
+ td.qty
42
+ span.operation #{number_to_currency(product.price)} x
43
+ = oif.number_field :qty, class: "form-control", min: 1, max: 100
44
+ span.operation
45
+ | шт. =
46
+ span #{number_to_currency(oif.object.cost)}
47
+ td.remove-item-td
48
+ a.remove-item href=cart_item_path(oi) data-method="delete" title=t('rshop.cart_item.delete_title')
49
+ i.fa.fa-trash
50
+ tr
51
+ td colspan="3"
52
+ h3.pull-right #{number_to_currency(@cart.cost)}
53
+ tfoot
54
+ tr
55
+ td.has-flat-ts colspan="3"
56
+ .pull-left
57
+ /a href=permalink_path(@cart.order_items.last.product.category)
58
+ i.fa.fa-reply
59
+ | <-
60
+ .pull-right
61
+ button.btn.btn-success type="submit"
62
+ i.fa.l.fa-refresh.flat-ts-lb-success
63
+ span #{t('rshop.cart.save')}
64
+ | &nbsp;&nbsp;
65
+ button.btn.btn-success type="submit" name="buy_action"
66
+ i.fa.l.fa-shopping-cart.flat-ts-lb-success
67
+ span #{t('rshop.cart.checkout')}
68
+
69
+ - else
70
+ span #{t('rshop.cart.is_empty')}
71
+ br
72
+ br
73
+ br
74
+ .clearfix
@@ -0,0 +1,65 @@
1
+ .checkout-show
2
+ h2 Оформление заказа
3
+ .progress
4
+ .progress-bar.progress-bar-info style="width: 34%"
5
+ | 1. Поиск товаров
6
+ .progress-bar.progress-bar-warning style="width: 33%"
7
+ | 2. Просмотр корзины
8
+ .progress-bar.progress-bar-success.progress-bar-striped.active style="width: 33%"
9
+ | 3. Оформление заказа
10
+ .pointer
11
+
12
+ .row
13
+ .col-xs-12.col-sm-6.col-md-7.col-lg-8.action-variant
14
+ h4 Купить без регистрации
15
+ = simple_form_for @cart, url: checkout_save_path, id: 'checkout-full-form', html: { class: 's-form edit_order'} do |f|
16
+ .col-xs-12.col-lg-6
17
+ = f.simple_fields_for :address, @cart.address do |af|
18
+ .form-group
19
+ = af.label :phone, class: 'form-label', required: f.object.validate_saving?
20
+ span
21
+ = af.full_error :phone
22
+ = af.input_field :phone, class: 'form-control'
23
+
24
+ .form-group
25
+ = f.association :payment, required: f.object.validate_saving?, prompt: false, label_html: { class: 'form-label '}, input_html: { class: 'form-control' }
26
+
27
+ .form-group
28
+ = f.association :delivery, required: f.object.validate_saving?, prompt: false, label_html: { class: 'form-label '}, input_html: { class: 'form-control' }
29
+
30
+ = f.simple_fields_for :address, @cart.address do |af|
31
+ .form-group
32
+ = af.label :address, class: 'form-label', required: f.object.validate_saving?
33
+ span
34
+ = af.full_error :address
35
+ = af.input_field :address, class: 'form-control', as: :text
36
+
37
+ .col-xs-12.col-lg-6
38
+ = f.simple_fields_for :address, @cart.address do |af|
39
+ .form-group
40
+ = af.label :username, class: 'form-label'
41
+ span
42
+ = af.full_error :username
43
+ = af.input_field :username, class: 'form-control'
44
+
45
+ .form-group
46
+ = af.label :email, class: 'form-label'
47
+ span
48
+ = af.full_error :email
49
+ = af.input_field :email, class: 'form-control'
50
+ .form-group
51
+ = f.label :comments, class: 'form-label'
52
+ span
53
+ = f.full_error :comments
54
+ = f.input_field :comments, class: 'form-control'
55
+
56
+ .clearfix
57
+ hr.visible-lg
58
+ .form-group.text-center
59
+ button.btn.btn-primary.btn-lg
60
+ | Купить
61
+ i.fa.fa-caret-right
62
+ .clearfix
63
+
64
+
65
+ .clearfix
@@ -0,0 +1,22 @@
1
+ p.text-center
2
+ | Спасибо за покупку
3
+
4
+ /- if @order && false
5
+ script type="text/javascript"
6
+ | ga('ecommerce:addTransaction', {
7
+ 'id': '#{@order.id}', // Transaction ID. Required.
8
+ 'affiliation': 'Добра фігура', // Affiliation or store name.
9
+ 'revenue': '#{@order.cost}', // Grand Total.
10
+ 'shipping': '0', // Shipping.
11
+ 'tax': '0' // Tax.
12
+ });
13
+ - @order.order_items.each do |item|
14
+ | ga('ecommerce:addItem', {
15
+ 'id': '#{@order.id}', // Transaction ID. Required.
16
+ 'name': '#{item.product.name}', // Product name. Required.
17
+ 'sku': '#{item.product.code}', // SKU/code.
18
+ 'category': '#{item.product.category.name}', // Category or variation.
19
+ 'price': '#{item.product.price}', // Unit price.
20
+ 'quantity': '#{item.qty}' // Quantity.
21
+ });
22
+ | ga('ecommerce:send');
@@ -0,0 +1,27 @@
1
+ .product-list itemscope="" itemtype="http://schema.org/ItemList"
2
+ - products.each_with_index do |product, index|
3
+ .product-item itemtype="http://schema.org/Product" itemprop="itemListElement" itemscope=""
4
+ meta itemprop="url" content=product_path(product)
5
+ .hide itemtype="http://schema.org/Offer" itemprop="offers" itemscope=""
6
+ link itemprop="availability" content="in_stock"
7
+ meta itemprop="priceCurrency" content="UAH"
8
+ meta itemprop="price" content=product.price
9
+
10
+ .h3
11
+ a class="#{product.get_name_font}" href=product_path(product) itemprop="name" #{product.name}
12
+
13
+ - if product.is_promotion
14
+ .promotions
15
+ span.badge
16
+ | Акция
17
+
18
+ a href=product_path(product) rel="nofollow"
19
+ img.img-responsive src=product.image_url(:list) itemprop="image"
20
+
21
+ .price
22
+ span.value
23
+ span #{number_to_currency(product.price)}
24
+
25
+ .description itemprop="description"
26
+ .clearfix
27
+
@@ -0,0 +1 @@
1
+ = render 'list', products: @products
@@ -0,0 +1,67 @@
1
+ /script
2
+ | ga('send', 'event', 'Interface', 'product-show-action');
3
+
4
+ .product-show itemscope="" itemtype="http://schema.org/Product"
5
+ .hide itemprop="offers" itemscope="" itemtype="http://schema.org/Offer"
6
+ link itemprop="availability" content="in_stock"
7
+ meta itemprop="priceCurrency" content="UAH"
8
+ meta itemprop="price" content=@product.price
9
+ .hide itemprop="aggregateRating" itemscope="" itemtype="http://schema.org/AggregateRating"
10
+ meta itemprop="ratingValue" content="4,3"
11
+ meta itemprop="ratingCount" content="15"
12
+ meta itemprop="bestRating" content="5"
13
+
14
+ .col-xs-12.col-sm-4
15
+ .album.m-t-15
16
+ - if @product.album.has_images?
17
+ a href=@product.album.images[0].url(:origin) rel="nofollow" data-lightbox="product-show"
18
+ img.img-responsive src=@product.album.images[0].url(:list) alt=@product.name itemprop="image"
19
+ .clearfix
20
+ - if @product.album.images.count > 1
21
+ .thumbs
22
+ - @product.album.images.each_with_index do |i, index|
23
+ - if index != 0
24
+ .col-xs-6.col-sm-4.row
25
+ a href=i.image.url data-lightbox="product-show"
26
+ img.img-responsive src=i.image.url(:gallery) alt=@product.name
27
+ - else
28
+ a rel="nofollow"
29
+ img.img-responsive src=@product.image_url alt=@product.name
30
+ .clearfix
31
+
32
+ .col-xs-12.col-sm-8
33
+ .desc
34
+ - if @product.is_promotion
35
+ .promotions
36
+ span.badge
37
+ | акція
38
+ = form_tag cart_items_path do
39
+
40
+ = hidden_field_tag(:product_id, @product.id)
41
+
42
+ h2 itemprop="name"
43
+ | #{@product.name}
44
+
45
+ .price
46
+ span.value
47
+ span itemprop="price" #{number_to_currency(@product.price)}
48
+
49
+ .qty
50
+ input type="number" class="form-control" value="1" name="qty" min="1" max="100"
51
+ | шт.
52
+ button.btn.btn-primary
53
+ i.fa.fa-shopping-cart
54
+ | В КОРЗИНУ
55
+ .clearfix
56
+ .m-t-15
57
+ .pull-left
58
+ - if @product.brand
59
+ div itemprop="brand" itemscope="" itemtype="http://schema.org/Organization"
60
+ | Виробник:&nbsp;
61
+ a href=brand_path(@product.brand) itemprop="name" #{@product.brand.name}
62
+ .clearfix
63
+ p.text.m-t-15 itemprop="description"
64
+ == @product.description
65
+
66
+ .clearfix
67
+ .clearfix
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rshop"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,141 @@
1
+ ru:
2
+ number:
3
+ currency:
4
+ format:
5
+ unit: 'грн'
6
+ delimiter: ' '
7
+ separator: '.'
8
+ precision: 2
9
+ format: '%n %u'
10
+
11
+ active_admin:
12
+ filters:
13
+ predicates:
14
+ eq: равно
15
+
16
+ rshop:
17
+ order:
18
+ status_1: в корзине (не заказан)
19
+ status_2: новый заказ
20
+ status_3: заказ обработан
21
+ status_4: отклоненный заказ
22
+ cart_item:
23
+ created: Товар %{name} добавлен в корзину
24
+ deleted: Товар %{name} удален с корзины
25
+ delete_title: Удалить с корзины
26
+ cart:
27
+ view_title: Просмотреть корзину
28
+ is_empty: Корзина пустая
29
+ save: Сохранить изменения
30
+ checkout: Оформить заказ
31
+ flashed: Корзина очищена
32
+ cost: Стоимость
33
+ item: Товар
34
+ stage_1: 1. Поиск товаров
35
+ stage_2: 2. Просмотр корзины
36
+ stage_3: 3. оформление заказа
37
+
38
+ activerecord:
39
+ models:
40
+ rshop/brand:
41
+ one: Бренд
42
+ few: Брендов
43
+ many: Брендов
44
+ other: Бренды
45
+
46
+ rshop/product:
47
+ one: Товар
48
+ few: Товара
49
+ many: Товаров
50
+ other: Товары
51
+
52
+ rshop/album:
53
+ one: Альбом
54
+ few: Альбома
55
+ many: Альбомов
56
+ other: Альбома
57
+
58
+ rshop/album_image:
59
+ one: Изображение
60
+ few: Изображения
61
+ many: Изображений
62
+ other: Изображения
63
+
64
+ rshop/payment:
65
+ one: Способ оплаты
66
+ few: Способа оплаты
67
+ many: Способов оплаты
68
+ other: Способы оплаты
69
+
70
+ rshop/delivery:
71
+ one: Способ доставки
72
+ few: Способа доставки
73
+ many: Способов доставки
74
+ other: Способы доставки
75
+
76
+ rshop/order:
77
+ one: Заказ
78
+ few: Заказа
79
+ many: Заказов
80
+ other: Заказы
81
+
82
+ attributes:
83
+ rshop/order:
84
+ payment: Способ оплаты
85
+ delivery: Способ доставки
86
+ comments: Комментарии к заказу
87
+ status: Состояние (статус)
88
+ created_at: Создан
89
+ updated_at: Редактирован
90
+ cost: Стоимость товаров
91
+ order_items: Товары
92
+ address: Адрес
93
+ user: Пользователь
94
+ payment_and_delivery: Доставка
95
+
96
+ rshop/address:
97
+ phone: Телефон
98
+ address: Адрес
99
+ username: Имя
100
+ email: E-mail
101
+
102
+ rshop/brand:
103
+ name: Название
104
+ n: Приоритет
105
+ slug: Url-ключ
106
+ description: Описание
107
+ image: Изображение
108
+ remove_image: Удалить изображение
109
+ created_at: Создан
110
+ updated_at: Редактирован
111
+
112
+ rshop/product:
113
+ name: Название
114
+ n: Приоритет
115
+ slug: Url-ключ
116
+ description: Описание
117
+ price: Цена продажи
118
+ price_hint: например "200.50" (используйте точку для копеек)
119
+ code: Код (артикул)
120
+ brand: Бренд
121
+ album: Альбом
122
+ categories: Катагории
123
+ description_short: Краткое описание
124
+ is_promotion: По акции
125
+ is_published: Опубликован
126
+ in_stock: В наличии
127
+ created_at: Создан
128
+ updated_at: Редактирован
129
+
130
+ rshop/payment:
131
+ name: Название
132
+ n: Приоритет
133
+ created_at: Создан
134
+ updated_at: Редактирован
135
+
136
+ rshop/delivery:
137
+ name: Название
138
+ n: Приоритет
139
+ created_at: Создан
140
+ updated_at: Редактирован
141
+
@@ -0,0 +1,88 @@
1
+ ru:
2
+ number:
3
+ currency:
4
+ format:
5
+ unit: 'грн'
6
+ delimiter: ' '
7
+ separator: '.'
8
+ precision: 2
9
+ format: '%n <span class="currency">%u</span>'
10
+
11
+ activerecord:
12
+ models:
13
+ rshop/auto_mark:
14
+ one: Авто марка
15
+ few: Авто марки
16
+ many: Авто марок
17
+ other: Авто марки
18
+
19
+ rshop/auto_model:
20
+ one: Авто модель
21
+ few: Авто модели
22
+ many: Авто моделей
23
+ other: Авто модели
24
+
25
+ rshop/auto_category:
26
+ one: Авто категория
27
+ few: Авто категории
28
+ many: Авто категорий
29
+ other: Авто категории
30
+
31
+ rshop/auto_subcategory:
32
+ one: Авто подкатегория
33
+ few: Авто подкатегории
34
+ many: Авто подкатегорий
35
+ other: Авто подкатегории
36
+
37
+ attributes:
38
+ rshop/auto_mark:
39
+ name: Название
40
+ n: Приоритет
41
+ slug: Url-ключ
42
+ image: Изображение
43
+ remove_image: Удалить изображение
44
+ created_at: Создан
45
+ updated_at: Редактирован
46
+
47
+ rshop/auto_model:
48
+ mark: Марка авто
49
+ name: Название
50
+ n: Приоритет
51
+ slug: Url-ключ
52
+ image: Изображение
53
+ remove_image: Удалить изображение
54
+ created_at: Создан
55
+ updated_at: Редактирован
56
+
57
+ rshop/auto_category:
58
+ name: Название
59
+ n: Приоритет
60
+ slug: Url-ключ
61
+ image: Изображение
62
+ remove_image: Удалить изображение
63
+ created_at: Создан
64
+ updated_at: Редактирован
65
+
66
+ rshop/auto_subcategory:
67
+ name: Название
68
+ n: Приоритет
69
+ slug: Url-ключ
70
+ image: Изображение
71
+ remove_image: Удалить изображение
72
+ created_at: Создан
73
+ updated_at: Редактирован
74
+
75
+ rshop/product:
76
+ admin_comment: Комент
77
+ xls_code: Идентификатор импорта
78
+ mark: Марка
79
+ model: Модель
80
+ category: Категория
81
+ subcategory: Подкатегория
82
+ album: Альбом
83
+ brand: Бренд
84
+ views_count: Просмотры
85
+ sold_count: Кол-во продаж
86
+ cart_count: Кол-во в корзине
87
+ ctb: в корзине / продажи
88
+ ctc: показы / в корзине