spree_winkelstraat 3.1.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +7 -0
  5. data/LICENSE +26 -0
  6. data/README.md +53 -0
  7. data/Rakefile +21 -0
  8. data/app/assets/javascripts/spree/backend/spree_winkelstraat.js +2 -0
  9. data/app/assets/javascripts/spree/frontend/spree_winkelstraat.js +2 -0
  10. data/app/assets/stylesheets/spree/backend/spree_winkelstraat.css +4 -0
  11. data/app/assets/stylesheets/spree/frontend/spree_winkelstraat.css +4 -0
  12. data/app/controllers/api/v1/orders_controller_decorator.rb +15 -0
  13. data/app/controllers/api/v1/products_controller_decorator.rb +13 -0
  14. data/app/models/spree/order/mail_defuser.rb +15 -0
  15. data/app/models/spree/order_decorator.rb +180 -0
  16. data/app/models/spree/product_decorator.rb +110 -0
  17. data/app/models/spree/promotion/rules/not_winkelstraat_order.rb +18 -0
  18. data/app/models/spree/reimbursement/mail_defuser.rb +9 -0
  19. data/app/models/spree/reimbursement_decorator.rb +5 -0
  20. data/app/models/spree/shipment_handler/mail_defuser.rb +7 -0
  21. data/app/models/spree/shipment_handler_decorator.rb +5 -0
  22. data/app/models/spree/variant_decorator.rb +51 -0
  23. data/app/overrides/option_value_fields.rb +13 -0
  24. data/app/overrides/order_index.rb +13 -0
  25. data/app/overrides/product_form.rb +6 -0
  26. data/app/views/spree/admin/option_types/_extra_option_value_fields.html.erb +1 -0
  27. data/app/views/spree/admin/option_types/_extra_option_value_headers.html.erb +1 -0
  28. data/app/views/spree/admin/orders/_index_tradebyte_state_override.html.erb +7 -0
  29. data/app/views/spree/admin/orders/_index_tradebyte_state_override_head.html.erb +1 -0
  30. data/app/views/spree/admin/products/_sell_on_winkelstraat.html.erb +7 -0
  31. data/app/views/spree/admin/promotions/rules/_not_winkelstraat_order.html.erb +0 -0
  32. data/bin/rails +7 -0
  33. data/config/locales/en.yml +9 -0
  34. data/config/routes.rb +18 -0
  35. data/db/migrate/20190424140108_add_winkelstraat_data.rb +5 -0
  36. data/db/migrate/20190429134248_add_ws_code_to_option_values.rb +5 -0
  37. data/db/migrate/20190501101657_add_winkelstraat_taxons.rb +24 -0
  38. data/db/migrate/20190501122837_add_winkelstraat_payment_method_and_shipping_method.rb +11 -0
  39. data/db/migrate/20190507114902_add_active_on_winkelstraat_to_spree_products.rb +5 -0
  40. data/lib/generators/spree_winkelstraat/install/install_generator.rb +31 -0
  41. data/lib/spree_winkelstraat/engine.rb +26 -0
  42. data/lib/spree_winkelstraat/factories.rb +6 -0
  43. data/lib/spree_winkelstraat/order_importer.rb +65 -0
  44. data/lib/spree_winkelstraat.rb +3 -0
  45. data/spec/spec_helper.rb +93 -0
  46. data/spree_winkelstraat.gemspec +33 -0
  47. metadata +257 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 474c043df609e402e78963ae719e3f3df6f234f5c50929ed67c1c888f601b394
4
+ data.tar.gz: 14d6b9d2860666f9f800eb75026e66050cd74f0be0c3fc0ab89a4e4c4fbd2d6d
5
+ SHA512:
6
+ metadata.gz: cb308272b9596335d80f130a38cf15303fb3c6878ceed9d22f4836c47c2264beec9b09518d40b27350c7f667a29c647078676002ad10e53449e96f9fa952381d
7
+ data.tar.gz: acf83a91851d735b9a75ecd0c32cb33db19fa63fe643aeb4bc7912907eb7317a898378ac8b9f7da874ed75532c159fb1d49449eed8c8ef69131d10cccbd7765b
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .project
7
+ .sass-cache
8
+ coverage
9
+ Gemfile.lock
10
+ tmp
11
+ nbproject
12
+ pkg
13
+ *.swp
14
+ spec/dummy
15
+ .bundle
16
+ .rvmrc
17
+ .ruby-version
18
+ .ruby-gemset
19
+ *.gem
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'spree'
4
+ # Provides basic authentication functionality for testing parts of your engine
5
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
6
+
7
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2019 [name of plugin creator]
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ SpreeWinkelstraat
2
+ =================
3
+
4
+ Introduction goes here.
5
+
6
+ ## Installation
7
+
8
+ 1. Add this extension to your Gemfile with this line:
9
+ ```ruby
10
+ gem 'spree_winkelstraat', github: '[your-github-handle]/spree_winkelstraat', branch: 'X-X-stable'
11
+ ```
12
+
13
+ The `branch` option is important: it must match the version of Spree you're using.
14
+ For example, use `3-1-stable` if you're using Spree `3-1-stable` or any `3.1.x` version.
15
+
16
+ 2. Install the gem using Bundler:
17
+ ```ruby
18
+ bundle install
19
+ ```
20
+
21
+ 3. Copy & run migrations
22
+ ```ruby
23
+ bundle exec rails g spree_winkelstraat:install
24
+ ```
25
+
26
+ 4. Restart your server
27
+
28
+ If your server was running, restart it so that it can find the assets properly.
29
+
30
+ ## Testing
31
+
32
+ First bundle your dependencies, then run `rake`. `rake` will default to building the dummy app if it does not exist, then it will run specs. The dummy app can be regenerated by using `rake test_app`.
33
+
34
+ ```shell
35
+ bundle
36
+ bundle exec rake
37
+ ```
38
+
39
+ When testing your applications integration with this extension you may use it's factories.
40
+ Simply add this require statement to your spec_helper:
41
+
42
+ ```ruby
43
+ require 'spree_winkelstraat/factories'
44
+ ```
45
+
46
+
47
+ ## Contributing
48
+
49
+ If you'd like to contribute, please take a look at the
50
+ [instructions](CONTRIBUTING.md) for installing dependencies and crafting a good
51
+ pull request.
52
+
53
+ Copyright (c) 2019 [name of extension creator], released under the New BSD License
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ require 'spree/testing_support/extension_rake'
6
+
7
+ RSpec::Core::RakeTask.new
8
+
9
+ task :default do
10
+ if Dir["spec/dummy"].empty?
11
+ Rake::Task[:test_app].invoke
12
+ Dir.chdir("../../")
13
+ end
14
+ Rake::Task[:spec].invoke
15
+ end
16
+
17
+ desc 'Generates a dummy app for testing'
18
+ task :test_app do
19
+ ENV['LIB_NAME'] = 'spree_winkelstraat'
20
+ Rake::Task['extension:test_app'].invoke
21
+ end
@@ -0,0 +1,2 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/backend/all.js'
@@ -0,0 +1,2 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/frontend/all.js'
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/backend/all.css'
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/frontend/all.css'
4
+ */
@@ -0,0 +1,15 @@
1
+ Spree::Api::V1::OrdersController.class_eval do
2
+
3
+ skip_before_action :find_order, only: [:import]
4
+
5
+ def import
6
+ begin
7
+ order_params = Spree::Order.winkelstraat_to_order_params(params)
8
+ @order = SpreeWinkelstraat::OrderImporter.import(nil, order_params)
9
+ render :show
10
+ rescue Exception => e
11
+ error_during_processing(e)
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,13 @@
1
+ Spree::Api::V1::ProductsController.class_eval do
2
+
3
+ def winkelstraat_stock
4
+ csv = Spree::Variant.winkelstraat_stock_csv
5
+ send_data csv, filename: "ws-stock-#{Date.today}.csv"
6
+ end
7
+
8
+ def winkelstraat_article
9
+ csv = Spree::Product.winkelstraat_csv
10
+ send_data csv, filename: "ws-articles-#{Date.today}.csv"
11
+ end
12
+
13
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ module Order::MailDefuser
3
+ def deliver_order_confirmation_email
4
+ unless is_winkelstraat_order?
5
+ super
6
+ end
7
+ end
8
+
9
+ def send_cancel_email
10
+ unless is_winkelstraat_order?
11
+ super
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,180 @@
1
+ Spree::Order.class_eval do
2
+
3
+ self.prepend(Spree::Order::MailDefuser)
4
+
5
+ def is_winkelstraat_order?
6
+ winkelstraat_order_id.present?
7
+ end
8
+
9
+ class << self
10
+
11
+ # {
12
+ # "id":"401292144",
13
+ # "date":"2019-04-06T20:35:05+02:00",
14
+ # "items":[
15
+ # {
16
+ # "sku":"32963-40",
17
+ # "reference":"00002795 AZ",
18
+ # "article_number":"00002795",
19
+ # "manufacturer":"Dsquared2",
20
+ # "name":"Jeans met leg pattern",
21
+ # "size":"IT 50",
22
+ # "color":"Blauw",
23
+ # "quantity":1,
24
+ # "price":718
25
+ # }
26
+ # ],
27
+ # "discount":0,
28
+ # "grand_total":718,
29
+ # "shipping_method":null,
30
+ # "picking_pdf_url":"https:\/\/www.winkelstraat.nl\/pushapi\/order\/download\/0%3A2%3Aaeed630c14ba637b%3AHK6I26xV2rwoECXttEr5dQ%3D%3D\/2534447b7eef8a7e0878e6195fc7be470d1a07e0b4549e25784bc3816d031c45:yeLKFkZerl1XlrWKNTYR8qz5BNKWEw7v",
31
+ # "shipping_address":{
32
+ # "name":"Test de Test",
33
+ # "street":"J.J.A. Winkelstraat",
34
+ # "housenumber":"5",
35
+ # "postcode":"3494RK",
36
+ # "city":"Ergens",
37
+ # "province":null,
38
+ # "country":"NL",
39
+ # "email":"service@Winkelstraat.nl"
40
+ # }
41
+ # }
42
+ def winkelstraat_to_order_params(params)
43
+ order_params = {}
44
+
45
+ order_params[:winkelstraat_order_id] = params['id']
46
+ order_params[:completed_at] = DateTime.parse(params['date'])
47
+ order_params[:email] = params['shipping_address']['email']
48
+ order_params[:winkelstraat_order_id] = params['id']
49
+ order_params[:use_billing] = true
50
+
51
+ order_params[:bill_address_attributes] = build_address(params['shipping_address'])
52
+
53
+ order_params[:shipments_attributes] = build_shipments_attributes(params, 'Amstelveen')
54
+ order_params[:payments_attributes] = build_payments_attributes(params)
55
+ order_params[:line_items_attributes] = build_line_items_attributes(params)
56
+ order_params[:adjustments_attributes] = build_adjustments_attributes(params)
57
+
58
+ order_params
59
+ end
60
+
61
+ # private
62
+
63
+ def build_address(address_params)
64
+ {
65
+ firstname: address_params['name'].split(' ').first,
66
+ lastname: address_params['name'].split(' ')[1..-1].join(' '),
67
+ address1: address_params['street'],
68
+ address2: address_params['housenumber'],
69
+ city: address_params['city'],
70
+ zipcode: address_params['postcode'],
71
+ phone: '0612345678',
72
+ country: {
73
+ 'iso' => address_params['country']
74
+ }
75
+ }
76
+ end
77
+
78
+ # "shipments_attributes": [
79
+ # {
80
+ # "tracking": "track track track",
81
+ # "stock_location": "default",
82
+ # "cost": 11,
83
+ # "shipping_method": "UPS Ground (USD)",
84
+ # "inventory_units": [
85
+ # { "variant_id": "1" },
86
+ # { "variant_id": "2" },
87
+ # { "variant_id": "2" },
88
+ # { "variant_id": "2" },
89
+ # { "variant_id": "2" },
90
+ # { "variant_id": "3" },
91
+ # { "variant_id": "4" },
92
+ # { "variant_id": "5" }
93
+ # ]
94
+ # }
95
+ # ],
96
+ def build_shipments_attributes(params, stock_location_name)
97
+ [
98
+ {
99
+ tracking: nil,
100
+ stock_location: stock_location_name,
101
+ shipping_method: 'Winkelstraat shipping',
102
+ inventory_units: params['items'].map do |item|
103
+ item['quantity'].times.map do
104
+ {
105
+ sku: item['sku']
106
+ }
107
+ end
108
+ end.flatten
109
+ }
110
+ ]
111
+ end
112
+
113
+ # "payments_attributes": [
114
+ # {
115
+ # "number": "REGE345546FDF",
116
+ # "state": "completed",
117
+ # "amount": 480.90,
118
+ # "payment_method": "Authorize.Net"
119
+ # },
120
+ # {
121
+ # "number": "ERERGREG43534DF",
122
+ # "state": "void",
123
+ # "amount": 46.95,
124
+ # "payment_method": "Authorize.Net"
125
+ # }
126
+ # ],
127
+ def build_payments_attributes(params)
128
+ [
129
+ {
130
+ amount: params['grand_total'],
131
+ state: 'completed',
132
+ payment_method: 'Paid at winkelstraat'
133
+ }
134
+ ]
135
+ end
136
+
137
+ # "line_items_attributes": {
138
+ # "0": {
139
+ # "variant_id": "1",
140
+ # "quantity": 1,
141
+ # "price": 50
142
+ # },
143
+ # "3": {
144
+ # "variant_id": "2",
145
+ # "quantity": 4,
146
+ # "price": 60
147
+ # },
148
+ # },
149
+ def build_line_items_attributes(params)
150
+ params['items'].map do |item|
151
+ variant = Spree::Variant.active.find_by_sku(item['sku'])
152
+ next if variant.blank?
153
+ {
154
+ variant_id: variant.id,
155
+ quantity: item['quantity'],
156
+ price: item['price']
157
+ }
158
+ end.compact
159
+ end
160
+
161
+ # "adjustments_attributes": [
162
+ # {
163
+ # "label": "tax",
164
+ # "amount": 0
165
+ # },
166
+ # {
167
+ # "label": "something",
168
+ # "amount": 17.9
169
+ # }
170
+ # ],
171
+ def build_adjustments_attributes(params)
172
+ [
173
+ {
174
+ label: 'Winkelstraat Discount',
175
+ amount: -(params['discount'].to_f.abs)
176
+ }
177
+ ]
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,110 @@
1
+ Spree::Product.class_eval do
2
+
3
+ WOMEN_CATEGORIES = ["Accessoires", "Badmode", "Blazers & Gilets", "Blouses", "Broeken", "Jassen", "Jeans",
4
+ "Jumpsuits", "Jurken", "Lingerie", "Nachtmode", "Rokken", "Schoenen", "Sport", "Tassen", "Tops", "Truien & Vesten"]
5
+ MEN_CATEGORIES = ["Accessoires", "Badmode", "Broeken", "Colberts & Gilets", "Jassen", "Jeans", "Ondergoed",
6
+ "Overhemden", "Schoenen", "Shirts", "Sport", "Truien", "Vesten"]
7
+ KIDS_CATEGORIES = ["Jongens", "Meisjes"]
8
+
9
+ IMG_HOST = Rails.env.production? ? 'https://paulwarmer-production.imgix.net' : Settings.backend_url
10
+
11
+ class << self
12
+ def winkelstraat_csv
13
+ products = Spree::Product.active.where(sell_on_winkelstraat: true)
14
+ variants = Spree::Variant.includes(:images, option_values: :translations, product: :translations).where(product: products, is_master: false)
15
+
16
+ headings = [
17
+ 'Productnaam',
18
+ 'Winkel product nummer',
19
+ 'EAN',
20
+ 'Merk product nummer',
21
+ 'Kassa referentie',
22
+ 'Geslacht',
23
+ 'Categorie',
24
+ 'Subcategorie',
25
+ 'Merk',
26
+ 'Kleur',
27
+ 'Prijs',
28
+ 'Maatvoering',
29
+ 'Materiaal',
30
+ 'Pasvorm',
31
+ 'Omschrijving',
32
+ 'Maat op foto',
33
+ 'Lengte',
34
+ 'Breedte',
35
+ 'Hoogte',
36
+ 'Omvang',
37
+ 'Seizoen',
38
+ 'Carry over',
39
+ *(1..10).to_a.map {|i| "Afbeelding#{i}"},
40
+ *Spree::StockLocation.all.map {|sl| sl.name }
41
+ ]
42
+
43
+ women_taxon = Spree::Taxon.where(name: 'women').first
44
+ men_taxon = Spree::Taxon.where(name: 'men').first
45
+ kids_taxon = Spree::Taxon.where(name: 'kids').first
46
+
47
+ main_taxonomy = Spree::Taxonomy.where(name: 'Winkelstraat Category').first
48
+ brand_taxonomy = Spree::Taxonomy.where(name: 'Filter').first
49
+ brand_taxon_parent = Spree::Taxon.where(taxonomy: brand_taxonomy, name: 'Brands').try(:first)
50
+
51
+ season_taxonomy = Spree::Taxonomy.where(name: 'Season').first
52
+
53
+
54
+ CSV.generate(headers: true) do |csv|
55
+ csv << headings
56
+
57
+ variants.each do |variant|
58
+
59
+ gender = case
60
+ when variant.in_taxon?(women_taxon)
61
+ 'D'
62
+ when variant.in_taxon?(men_taxon)
63
+ 'H'
64
+ when variant.in_taxon?(kids_taxon)
65
+ 'K'
66
+ else
67
+ 'D'
68
+ end
69
+
70
+ csv << [
71
+ variant.product.ws_compatible_name, #'Productnaam',
72
+ variant.id, #'Winkel product nummer',
73
+ variant.sku, # 'EAN',
74
+ variant.sku, # 'Merk product nummer',
75
+ variant.kassa_reference, # 'Kassa referentie',
76
+ gender, #Geslacht
77
+ variant.product.taxons.where(taxonomy: main_taxonomy, parent: main_taxonomy.root).first.try(:name), # 'Categorie',
78
+ variant.product.taxons.where(taxonomy: main_taxonomy).where.not(parent: nil).where.not(parent: main_taxonomy.root).first.try(:name), #'Subcategorie',
79
+ brand_taxon_parent.present? ? variant.product.taxons.where(parent: brand_taxon_parent).first.try(:name) : nil, #'Merk',
80
+ variant.option_values.joins(option_type: :translations).where(spree_option_type_translations: { name: 'color' }).first.try(:ws_code), #'Kleur',
81
+ variant.price, # 'Prijs',
82
+ 'CF', #Maatvoering',
83
+ variant.product.product_properties.includes(property: :translations).where(spree_property_translations: {name: 'material'}).first.try(:value), #Materiaal',
84
+ variant.product.product_properties.includes(property: :translations).where(spree_property_translations: {name: 'fit'}).first.try(:value) || 'Dit item valt normaal', #Pasvorm',
85
+ ActionController::Base.helpers.strip_tags(variant.description), #'Omschrijving',
86
+ variant.product.variants.first.option_values.joins(option_type: :translations).where(spree_option_type_translations: { name: 'size' }).first.try(:presentation), #'Maat op foto',
87
+ variant.depth, #lengte
88
+ variant.width, #breedte
89
+ variant.height, #hoogte
90
+ nil, #'Omvang',
91
+ variant.product.taxons.where(taxonomy: season_taxonomy).first.try(:name), # 'Seizoen',Afbeeldingen
92
+ nil, #'Carry over',
93
+ *(variant.images.any? ? variant.images : variant.product.master.images).first(10).map do |image|
94
+ uri = URI.join(IMG_HOST, image.attachment(:original))
95
+ uri.query = URI.encode_www_form [['fm', 'jpg'], ['w', '1280'], ['h', '1920'], ['fit', 'clamp']]
96
+ uri.to_s
97
+ end,
98
+ *Spree::StockLocation.all.map {|sl| sl.count_on_hand(variant) || 0 }
99
+ ]
100
+ end
101
+ end
102
+
103
+ end
104
+ end
105
+
106
+ def ws_compatible_name
107
+ name
108
+ end
109
+
110
+ end