solidus_marketplace 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +8 -0
- data/LICENSE +26 -0
- data/README.md +123 -0
- data/Rakefile +15 -0
- data/Versionfile +6 -0
- data/app/assets/javascripts/spree/backend/solidus_marketplace.js +5 -0
- data/app/assets/javascripts/spree/backend/solidus_marketplace_routes.js +1 -0
- data/app/assets/javascripts/spree/backend/suppliers_autocomplete.js +55 -0
- data/app/assets/javascripts/spree/frontend/solidus_marketplace.js +1 -0
- data/app/assets/stylesheets/spree/backend/solidus_marketplace.scss +22 -0
- data/app/assets/stylesheets/spree/frontend/solidus_marketplace.css +3 -0
- data/app/controllers/ckeditor/attachment_files_controller_decorator.rb +20 -0
- data/app/controllers/ckeditor/pictures_controller_decorator.rb +17 -0
- data/app/controllers/spree/admin/marketplace_settings_controller.rb +19 -0
- data/app/controllers/spree/admin/products_controller_decorator.rb +79 -0
- data/app/controllers/spree/admin/reports_controller_decorator.rb +68 -0
- data/app/controllers/spree/admin/shipments_controller.rb +47 -0
- data/app/controllers/spree/admin/stock_items_controller_decorator.rb +10 -0
- data/app/controllers/spree/admin/stock_locations_controller_decorator.rb +23 -0
- data/app/controllers/spree/admin/suppliers_controller.rb +54 -0
- data/app/controllers/spree/admin/users_controller_decorator.rb +34 -0
- data/app/controllers/spree/api/suppliers_controller.rb +16 -0
- data/app/controllers/spree/api/v1/stock_locations_controller_decorator.rb +18 -0
- data/app/controllers/spree/base_controller_decorator.rb +13 -0
- data/app/helpers/spree/api/api_helpers_decorator.rb +22 -0
- data/app/mailers/spree/marketplace_order_mailer.rb +13 -0
- data/app/mailers/spree/supplier_mailer.rb +12 -0
- data/app/models/ckeditor/asset_decorator.rb +5 -0
- data/app/models/spree.rb +5 -0
- data/app/models/spree/marketplace_configuration.rb +14 -0
- data/app/models/spree/order_decorator.rb +44 -0
- data/app/models/spree/payment_decorator.rb +7 -0
- data/app/models/spree/product_decorator.rb +52 -0
- data/app/models/spree/shipment_decorator.rb +40 -0
- data/app/models/spree/stock/splitter/marketplace.rb +47 -0
- data/app/models/spree/stock_location_decorator.rb +23 -0
- data/app/models/spree/supplier.rb +120 -0
- data/app/models/spree/supplier_ability.rb +35 -0
- data/app/models/spree/supplier_variant.rb +6 -0
- data/app/models/spree/user_decorator.rb +23 -0
- data/app/models/spree/variant_decorator.rb +24 -0
- data/app/overrides/spree/admin/menus.rb +15 -0
- data/app/overrides/spree/admin/products/_form/converted_admin_product_form_right.html.erb.deface +5 -0
- data/app/overrides/spree/admin/products/edit/override_rows.html.erb.deface +22 -0
- data/app/overrides/spree/admin/stock_locations/_form/add_supplier.html.erb.deface +12 -0
- data/app/views/spree/admin/marketplace_settings/edit.html.erb +21 -0
- data/app/views/spree/admin/orders/index.html.erb +187 -0
- data/app/views/spree/admin/products/_form.html.erb +198 -0
- data/app/views/spree/admin/reports/earnings.html.erb +34 -0
- data/app/views/spree/admin/shared/_marketplace_settings.html.erb +1 -0
- data/app/views/spree/admin/shared/_marketplace_tabs.html.erb +4 -0
- data/app/views/spree/admin/shipments/edit.html.erb +24 -0
- data/app/views/spree/admin/shipments/index.html.erb +93 -0
- data/app/views/spree/admin/suppliers/_form.html.erb +75 -0
- data/app/views/spree/admin/suppliers/edit.html.erb +22 -0
- data/app/views/spree/admin/suppliers/index.html.erb +68 -0
- data/app/views/spree/admin/suppliers/new.html.erb +17 -0
- data/app/views/spree/api/shared/_pagination.json.jbuilder +5 -0
- data/app/views/spree/api/suppliers/_supplier.json.jbuilder +1 -0
- data/app/views/spree/api/suppliers/index.json.jbuilder +4 -0
- data/app/views/spree/marketplace_order_mailer/supplier_order.html.erb +119 -0
- data/app/views/spree/shared/unauthorized.erb +1 -0
- data/app/views/spree/supplier_mailer/welcome.html.erb +53 -0
- data/config/locales/en.yml +107 -0
- data/config/locales/es.yml +133 -0
- data/config/routes.rb +24 -0
- data/db/default/spree/marketplace_roles.rb +14 -0
- data/db/migrate/20121006073854_create_suppliers.rb +20 -0
- data/db/migrate/20130216070944_product_belongs_to_supplier.rb +6 -0
- data/db/migrate/20130405005502_stock_locations_belongs_to_supplier.rb +6 -0
- data/db/migrate/20130405011127_user_belongs_to_supplier.rb +6 -0
- data/db/migrate/20130428063053_add_balanced_token_to_suppliers.rb +7 -0
- data/db/migrate/20130510181443_add_supplier_id_to_ckeditor_assets.rb +8 -0
- data/db/migrate/20130606220913_add_permalink_to_suppliers.rb +6 -0
- data/db/migrate/20140323170638_add_supplier_commission_to_shipments.rb +5 -0
- data/db/migrate/20140416184616_migrate_payment_and_commission.rb +7 -0
- data/db/migrate/20140529041325_create_spree_supplier_variants.rb +15 -0
- data/db/migrate/20171027180043_add_paypal_email_to_suppliers.rb +5 -0
- data/db/seeds.rb +8 -0
- data/lib/generators/solidus_marketplace/install/install_generator.rb +36 -0
- data/lib/solidus_marketplace.rb +6 -0
- data/lib/solidus_marketplace/engine.rb +53 -0
- data/lib/solidus_marketplace/factories.rb +107 -0
- data/lib/solidus_marketplace/version.rb +3 -0
- data/lib/spree/permitted_attributes_decorator.rb +18 -0
- data/lib/tasks/spree_sample.rake +72 -0
- data/log/awesome.log +1 -0
- data/script/rails +7 -0
- data/solidus_marketplace.gemspec +46 -0
- data/spec/features/admin/orders_spec.rb +11 -0
- data/spec/features/admin/products_spec.rb +25 -0
- data/spec/features/admin/return_authorizations_spec.rb +7 -0
- data/spec/features/admin/settings_spec.rb +33 -0
- data/spec/features/admin/shipments_spec.rb +80 -0
- data/spec/features/admin/stock_management_spec.rb +156 -0
- data/spec/features/admin/stock_spec.rb +98 -0
- data/spec/features/admin/suppliers_spec.rb +130 -0
- data/spec/models/spree/order_decorator_spec.rb +80 -0
- data/spec/models/spree/payment_decorator_spec.rb +7 -0
- data/spec/models/spree/product_decorator_spec.rb +56 -0
- data/spec/models/spree/shipment_decorator_spec.rb +48 -0
- data/spec/models/spree/stock/splitter/marketplace_spec.rb +62 -0
- data/spec/models/spree/stock_location_decorator_spec.rb +33 -0
- data/spec/models/spree/supplier_ability_spec.rb +182 -0
- data/spec/models/spree/supplier_spec.rb +123 -0
- data/spec/models/spree/supplier_variant_spec.rb +5 -0
- data/spec/models/spree/user_decorator_spec.rb +57 -0
- data/spec/models/spree/variant_decorator_spec.rb +7 -0
- data/spec/spec_helper.rb +91 -0
- data/spec/support/ability_helpers.rb +11 -0
- data/spec/support/integration_helpers.rb +15 -0
- metadata +473 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 518ae3e24ec32c0b5b821e644c68da757eb8cf30
|
4
|
+
data.tar.gz: 1ddcc47402d8dc0ded60e5056f1c3603fc1906e9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fbae1888258fc884af783e660aaef37c39729764845a301da2c5390e8f8a3bef83569bd14007c4ffcc148518178d11dce32a18b11119b35335ed6fed27794b07
|
7
|
+
data.tar.gz: 44973e168ebbfc6851cfaa7539885208985d29f2f0ee3b5d152cbb9ca1df263b43bc9730c8d90f3ea22253287e78c57565ddaf0fc20f33aa27b5a586a0ff7f16
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--format progress
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 2012-2013 Jeff Dutil
|
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,123 @@
|
|
1
|
+
# Solidus Marketplace
|
2
|
+
|
3
|
+
# NOTE: This gem is currently a work-in-progress.
|
4
|
+
Contributors are welcome to help us get this gem to a viable MVP.
|
5
|
+
We suggest installing [ZenHub](http://zenhub.com) in order to view/manage open issues.
|
6
|
+
This will give you a new tab in Github called "Boards", which provides a Kanban-style view of the project's issues.
|
7
|
+
|
8
|
+
# Overview
|
9
|
+
|
10
|
+
This is marketplace implementation for solidus.
|
11
|
+
|
12
|
+
Basic functionality:
|
13
|
+
* Links products to one or more suppliers
|
14
|
+
* Once an order is placed:
|
15
|
+
* A shipment is created for the product's supplier
|
16
|
+
* The shipment is then sent to the store owner for fulfillment and to the supplier for visibility (via Email by default).
|
17
|
+
* The store owner fulfills orders. The supplier can view their shipments (read-only for now).
|
18
|
+
|
19
|
+
Installation
|
20
|
+
------------
|
21
|
+
Here's how to install solidus_marketplace into your existing spree site AFTER you've installed Spree:
|
22
|
+
|
23
|
+
Add the following to your Gemfile:
|
24
|
+
|
25
|
+
gem 'solidus_marketplace'
|
26
|
+
|
27
|
+
Make your bundle happy:
|
28
|
+
|
29
|
+
bundle install
|
30
|
+
|
31
|
+
Now run the generator:
|
32
|
+
|
33
|
+
rails g solidus_marketplace:install
|
34
|
+
|
35
|
+
(Optional) Run the generator for solidus_gateway to enable the use of Stripe or other payment providers
|
36
|
+
included with that extension:
|
37
|
+
|
38
|
+
rails g solidus_gateway:install
|
39
|
+
|
40
|
+
Then migrate your database if you did not run during installation generator:
|
41
|
+
|
42
|
+
bundle exec rake db:migrate
|
43
|
+
|
44
|
+
And reboot your server:
|
45
|
+
|
46
|
+
rails s
|
47
|
+
|
48
|
+
You should be up and running now!
|
49
|
+
|
50
|
+
Sample Data
|
51
|
+
-----------
|
52
|
+
|
53
|
+
If you'd like to generate sample data, use the included rake tasks:
|
54
|
+
|
55
|
+
```shell
|
56
|
+
rake db:seed # Loads seed data into the store
|
57
|
+
rake spree_sample:load # Loads sample data into the store
|
58
|
+
rake spree_sample:suppliers # Create sample suppliers and randomly link to products
|
59
|
+
rake spree_sample:marketplace_orders # Create sample marketplace orders
|
60
|
+
```
|
61
|
+
|
62
|
+
This will include a new role (supplier_admin) and 2 new users in addition to the default 'admin@example.com' user provided by solidus.
|
63
|
+
|
64
|
+
Those users have the following email/password/roles
|
65
|
+
|
66
|
+
* marketmaker@example.com / test123 / admin
|
67
|
+
* supplier_admin@example.com / test123 / supplier_admin
|
68
|
+
|
69
|
+
Demo
|
70
|
+
----
|
71
|
+
|
72
|
+
You can easily use the spec/dummy app as a demo of solidus_marketplace. Just `cd` to where you develop and run:
|
73
|
+
|
74
|
+
```shell
|
75
|
+
git clone git://github.com/boomerdigital/solidus_marketplace.git
|
76
|
+
cd solidus_marketplace
|
77
|
+
bundle install
|
78
|
+
bundle exec rake test_app
|
79
|
+
cd spec/dummy
|
80
|
+
rake db:migrate db:seed spree_sample:load spree_sample:suppliers spree_sample:marketplace_orders
|
81
|
+
rails s
|
82
|
+
```
|
83
|
+
|
84
|
+
Testing
|
85
|
+
-------
|
86
|
+
|
87
|
+
Be sure to bundle your dependencies and then create a dummy test app for the specs to run against.
|
88
|
+
|
89
|
+
```shell
|
90
|
+
brew install geckodriver
|
91
|
+
|
92
|
+
bundle
|
93
|
+
bundle exec rake test_app
|
94
|
+
bundle exec rspec spec
|
95
|
+
```
|
96
|
+
|
97
|
+
Todo
|
98
|
+
----
|
99
|
+
|
100
|
+
* See open issues here: [open issues](https://github.com/boomerdigital/solidus_marketplace/issues)
|
101
|
+
|
102
|
+
Contributing
|
103
|
+
------------
|
104
|
+
|
105
|
+
In the spirit of [free software](http://www.fsf.org/licensing/essays/free-sw.html), **everyone** is encouraged to help improve this project.
|
106
|
+
|
107
|
+
Here are some ways *you* can contribute:
|
108
|
+
|
109
|
+
* by using prerelease versions
|
110
|
+
* by reporting [bugs](https://github.com/boomerdigital/solidus_marketplace/issues)
|
111
|
+
* by suggesting new features
|
112
|
+
* by [translating to a new language](https://github.com/boomerdigital/solidus_marketplace/tree/master/config/locales)
|
113
|
+
* by writing or editing documentation
|
114
|
+
* by writing specifications
|
115
|
+
* by writing code (*no patch is too small*: fix typos, add comments, clean up inconsistent whitespace)
|
116
|
+
* by refactoring code
|
117
|
+
* by resolving [issues](https://github.com/boomerdigital/solidus_marketplace/issues)
|
118
|
+
* by reviewing patches
|
119
|
+
|
120
|
+
Donating
|
121
|
+
--------
|
122
|
+
|
123
|
+
Copyright (c) 2016-2017 Boomer Digital, released under the [New BSD License](https://github.com/boomerdigital/solidus_marketplace/tree/master/LICENSE).
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'spree/testing_support/common_rake'
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new
|
8
|
+
|
9
|
+
task :default => [:spec]
|
10
|
+
|
11
|
+
desc 'Generates a dummy app for testing'
|
12
|
+
task :test_app do
|
13
|
+
ENV['LIB_NAME'] = 'solidus_marketplace'
|
14
|
+
Rake::Task['common:test_app'].invoke 'Spree::User'
|
15
|
+
end
|
data/Versionfile
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
# This file is used to designate compatibilty with different versions of Spree
|
2
|
+
# Please see http://spreecommerce.com/documentation/extensions.html#versionfile for details
|
3
|
+
# '1.3.x' => { :ref => 'e5624f7' } # Not going to be maintained but most of the works there if your looking for a starting point to branch off of.
|
4
|
+
|
5
|
+
'2.4.x' => { :branch => 'master' }
|
6
|
+
'2.3.x' => { :branch => '2-3-stable' }
|
@@ -0,0 +1 @@
|
|
1
|
+
Spree.routes.suppliers_search = Spree.pathFor('api/suppliers')
|
@@ -0,0 +1,55 @@
|
|
1
|
+
$.fn.supplierAutocomplete = function () {
|
2
|
+
'use strict';
|
3
|
+
|
4
|
+
this.select2({
|
5
|
+
placeholder: Spree.translations.supplier_placeholder,
|
6
|
+
multiple: true,
|
7
|
+
initSelection: function (element, callback) {
|
8
|
+
var ids = element.val(),
|
9
|
+
count = ids.split(",").length;
|
10
|
+
|
11
|
+
Spree.ajax({
|
12
|
+
type: "GET",
|
13
|
+
url: Spree.routes.suppliers_search,
|
14
|
+
data: {
|
15
|
+
ids: ids,
|
16
|
+
per_page: count
|
17
|
+
},
|
18
|
+
success: function (data) {
|
19
|
+
callback(data['suppliers']);
|
20
|
+
}
|
21
|
+
});
|
22
|
+
},
|
23
|
+
ajax: {
|
24
|
+
url: Spree.routes.suppliers_search,
|
25
|
+
datatype: 'json',
|
26
|
+
data: function (term, page) {
|
27
|
+
return {
|
28
|
+
per_page: 50,
|
29
|
+
page: page,
|
30
|
+
q: {
|
31
|
+
name_cont: term
|
32
|
+
},
|
33
|
+
token: Spree.api_key
|
34
|
+
};
|
35
|
+
},
|
36
|
+
results: function (data, page) {
|
37
|
+
var more = page < data.pages;
|
38
|
+
return {
|
39
|
+
results: data['suppliers'],
|
40
|
+
more: more
|
41
|
+
};
|
42
|
+
}
|
43
|
+
},
|
44
|
+
formatResult: function (supplier, container, query, escapeMarkup) {
|
45
|
+
return escapeMarkup(supplier.name);
|
46
|
+
},
|
47
|
+
formatSelection: function (supplier, container, escapeMarkup) {
|
48
|
+
return escapeMarkup(supplier.name);
|
49
|
+
}
|
50
|
+
});
|
51
|
+
};
|
52
|
+
|
53
|
+
$(document).ready(function () {
|
54
|
+
$('#product_supplier_ids').supplierAutocomplete();
|
55
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require spree/frontend
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/*
|
2
|
+
*= require spree/backend
|
3
|
+
*/
|
4
|
+
|
5
|
+
.center {
|
6
|
+
text-align: center;
|
7
|
+
}
|
8
|
+
|
9
|
+
.state.delivered:before,
|
10
|
+
.state.confirmed:before {
|
11
|
+
background-color: #ff9300;
|
12
|
+
}
|
13
|
+
|
14
|
+
.supplier-banks ol li {
|
15
|
+
margin-left: 20px;
|
16
|
+
margin-bottom: 5px;
|
17
|
+
text-align: left;
|
18
|
+
}
|
19
|
+
|
20
|
+
a .without-textdecor{
|
21
|
+
text-decoration: none;
|
22
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
if defined?(Ckeditor::AttachmentFilesController)
|
2
|
+
Ckeditor::AttachmentFilesController.class_eval do
|
3
|
+
|
4
|
+
load_and_authorize_resource :class => 'Ckeditor::AttachmentFile'
|
5
|
+
after_filter :set_supplier, only: [:create]
|
6
|
+
|
7
|
+
def index
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def set_supplier
|
13
|
+
if try_spree_current_user.supplier? and @attachment
|
14
|
+
@attachment.supplier = try_spree_current_user.supplier
|
15
|
+
@attachment.save
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
if defined?(Ckeditor::PicturesController)
|
2
|
+
Ckeditor::PicturesController.class_eval do
|
3
|
+
load_and_authorize_resource :class => 'Ckeditor::Picture'
|
4
|
+
after_filter :set_supplier, only: [:create]
|
5
|
+
|
6
|
+
def index
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def set_supplier
|
11
|
+
if spree_current_user.supplier? and @picture
|
12
|
+
@picture.supplier = spree_current_user.supplier
|
13
|
+
@picture.save
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Spree::Admin::MarketplaceSettingsController < Spree::Admin::BaseController
|
2
|
+
|
3
|
+
def edit
|
4
|
+
@config = Spree::MarketplaceConfiguration.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def update
|
8
|
+
config = Spree::MarketplaceConfiguration.new
|
9
|
+
|
10
|
+
params.each do |name, value|
|
11
|
+
next unless config.has_preference? name
|
12
|
+
config[name] = value
|
13
|
+
end
|
14
|
+
|
15
|
+
flash[:success] = Spree.t('admin.marketplace_settings.update.success')
|
16
|
+
redirect_to spree.edit_admin_marketplace_settings_path
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
Spree::Admin::ProductsController.class_eval do
|
2
|
+
|
3
|
+
before_action :get_suppliers, only: [:edit] #, :update]
|
4
|
+
before_action :supplier_collection, only: [:index]
|
5
|
+
after_action :update_product_suppliers, only: [:update]
|
6
|
+
create.after :add_product_to_supplier
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def permitted_resource_params
|
11
|
+
params[object_name].present? ? params.require(object_name).permit! : ActionController::Parameters.new.permit!
|
12
|
+
params[object_name].except(:supplier_ids)
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_product_suppliers
|
16
|
+
if adding_suppliers?
|
17
|
+
supplier_ids = new_supplier_ids - current_supplier_ids
|
18
|
+
@product.add_suppliers!(supplier_ids)
|
19
|
+
elsif removing_suppliers?
|
20
|
+
supplier_ids = current_supplier_ids - new_supplier_ids
|
21
|
+
@product.remove_suppliers!(supplier_ids)
|
22
|
+
elsif same_number_of_suppliers? && different_suppliers?
|
23
|
+
@product.remove_suppliers!(current_suppliers)
|
24
|
+
@product.add_suppliers!(new_suppliers)
|
25
|
+
elsif same_suppliers?
|
26
|
+
#noop
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def adding_suppliers?
|
31
|
+
new_supplier_ids.count > current_supplier_ids.count
|
32
|
+
end
|
33
|
+
|
34
|
+
def removing_suppliers?
|
35
|
+
new_supplier_ids.count < current_supplier_ids.count
|
36
|
+
end
|
37
|
+
|
38
|
+
def same_suppliers?
|
39
|
+
new_supplier_ids == current_supplier_ids
|
40
|
+
end
|
41
|
+
|
42
|
+
def same_number_of_suppliers?
|
43
|
+
new_supplier_ids.count == current_supplier_ids.count
|
44
|
+
end
|
45
|
+
|
46
|
+
def different_suppliers?
|
47
|
+
new_supplier_ids.sort != current_supplier_ids.sort
|
48
|
+
end
|
49
|
+
|
50
|
+
def new_supplier_ids
|
51
|
+
return [] unless params["product"].present? && params["product"]["supplier_ids"].present?
|
52
|
+
params["product"]["supplier_ids"].split(",").map(&:to_i)
|
53
|
+
end
|
54
|
+
|
55
|
+
def current_supplier_ids
|
56
|
+
@product.supplier_ids
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_suppliers
|
60
|
+
@suppliers = Spree::Supplier.order(:name)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Scopes the collection to what the user should have access to, based on the user's role
|
64
|
+
def supplier_collection
|
65
|
+
return unless try_spree_current_user
|
66
|
+
|
67
|
+
if try_spree_current_user.supplier?
|
68
|
+
@collection = @collection.joins(:suppliers).where('spree_suppliers.id = ?', try_spree_current_user.supplier_id)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Newly added products by a Supplier are associated with it.
|
73
|
+
def add_product_to_supplier
|
74
|
+
if try_spree_current_user && try_spree_current_user.supplier?
|
75
|
+
@product.add_supplier!(try_spree_current_user.supplier_id)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|