solidus-returnly 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 770f17457a8c4b1ef1e54ea9693055061f3dc437
4
+ data.tar.gz: cf0ff331d9a612981c085b4e831dd6cd24c6313f
5
+ SHA512:
6
+ metadata.gz: f21ab272464d7d9727094bde59dc4b386e644d0f0a0b94e720f6383179dec22f0175188fa844e2cbd905e4aaf052fa229159173b5e4ff0647c07b5c6dbe48b5a
7
+ data.tar.gz: ed2e2506d1ae775b53daf470eb1e1524a7801a3172d263de89b83c7b3ac7a32b8bd1acc1fb22f20f08205ab6425fef0207d2ef04e47351c120e1824002e6cbb9
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2017 Returnly Technologies, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,152 @@
1
+ Solidus Returnly
2
+ ===============
3
+
4
+ This gem adds the required apis to allow returnly obtain an estimate, process a return and apply a reimbursement
5
+
6
+ Installation
7
+ ------------
8
+
9
+ Add solidus_returnly to your Gemfile:
10
+
11
+ ```ruby
12
+ gem 'solidus-returnly'
13
+ ```
14
+
15
+ Bundle your dependencies and run the installation generator:
16
+
17
+ ```shell
18
+ bundle
19
+ bundle exec rails g solidus_returnly:install
20
+ ```
21
+
22
+ Testing
23
+ -------
24
+
25
+ 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, and [Rubocop](https://github.com/bbatsov/rubocop) static code analysis. The dummy app can be regenerated by using `rake test_app`.
26
+
27
+ ```shell
28
+ bundle
29
+ bundle exec rake
30
+ ```
31
+
32
+ When testing your applications integration with this extension you may use it's factories.
33
+ Simply add this require statement to your spec_helper:
34
+
35
+ ```ruby
36
+ require 'solidus_returnly/factories'
37
+ ```
38
+
39
+ Solidus/Spree Sandbox
40
+ ---------------------
41
+
42
+ You can create a sandbox spree installationm
43
+ ```shell
44
+ git clone git@github.com:solidusio/solidus.git
45
+ cd solidus
46
+ git co v2.0
47
+ bundle install
48
+ rake sandbox
49
+ cd sandbox
50
+ rake spree_auth:admin:create
51
+ ```
52
+
53
+ default admin credentials:
54
+ ```
55
+ Email [admin@example.com]
56
+ Password [test123]
57
+ ```
58
+
59
+ this will create a pristine solidus installation you can add the `solidus_returnly` gem and test the endpoints live
60
+
61
+ API
62
+ ---
63
+
64
+ To get an estimate of the return order and taxes
65
+
66
+ `POST /api/orders/:order_number/refunds/estimate`
67
+
68
+ Payload:
69
+ ```json
70
+ {
71
+ "line_items": [
72
+ {
73
+ "order_line_item_id": "{spree order line item id}",
74
+ "quantity": 1
75
+ }
76
+ ]
77
+ }
78
+ ```
79
+
80
+ Response:
81
+
82
+ ```json
83
+ {
84
+ "total_amount": "{money}",
85
+ "subtotal_amount": "{money}",
86
+ "tax_amount": "{money}",
87
+ "discount_amount": "{money}",
88
+ "shipping_amount": "{money}",
89
+ "line_items": [
90
+ {
91
+ "order_line_item_id": "{x_order_line_item_id1}",
92
+ "quantity": 1,
93
+ "total_amount": "{money}",
94
+ "subtotal_amount": "{money}",
95
+ "tax_amount": "{money}",
96
+ "discount_amount": "{money}",
97
+ }
98
+ ]
99
+ }
100
+ ```
101
+
102
+ To process the return and apply the reimbursement**immediately**
103
+ you can pass the `restock` parameter on false to prevent the api
104
+ to immediately change the stock in the default warehouse
105
+
106
+ `POST /api/orders/:order_number/refunds/estimate`
107
+
108
+ Payload:
109
+
110
+ ```json
111
+ {
112
+ "line_items": [
113
+ {
114
+ "order_line_item_id": "{x_order_line_item_id1}",
115
+ "quantity": 2
116
+ },
117
+ ],
118
+ "transactions": {
119
+ "parent_id": "{parent (order) tx id}",
120
+ "amount": "{money}"
121
+ },
122
+ "note": "comment text",
123
+ "restock": true
124
+ }
125
+ ```
126
+
127
+ Responce:
128
+
129
+ ```json
130
+ {
131
+ "refund_id": "{x_refund_id}",
132
+ "created_at": "{timestamp}",
133
+ "updated_at": "{timestamp}",
134
+ "user_id": "{optional merchant user ID}",
135
+ "line_items": [
136
+ {
137
+ "refund_line_item_id": "{x_refund_line_item_id1}",
138
+ "order_line_item_id": "{x_order_line_item_id1}",
139
+ "quantity": 2
140
+ },
141
+ ],
142
+ "transactions": [
143
+ "id": "{refund tx id}",
144
+ "amount": "{money}"
145
+ ],
146
+ "note": "comment text",
147
+ "restock": true
148
+ }
149
+ ```
150
+
151
+
152
+ Copyright (c) 2017 Returnly Technologies, Inc
@@ -0,0 +1,27 @@
1
+ require 'bundler'
2
+
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ begin
6
+ require 'spree/testing_support/extension_rake'
7
+ require 'rspec/core/rake_task'
8
+
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ task default: %i(first_run spec)
12
+ rescue LoadError
13
+ # no rspec available
14
+ end
15
+
16
+ task :first_run do
17
+ if Dir['spec/dummy'].empty?
18
+ Rake::Task[:test_app].invoke
19
+ Dir.chdir('../../')
20
+ end
21
+ end
22
+
23
+ desc 'Generates a dummy app for testing'
24
+ task :test_app do
25
+ ENV['LIB_NAME'] = 'solidus/returnly'
26
+ Rake::Task['extension:test_app'].invoke
27
+ end
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module Api
3
+ class RefundsController < Spree::Api::BaseController
4
+
5
+ def estimate
6
+ authorize! :create, Order
7
+ render json: SolidusReturnly::Calculator.process(order, line_items_params)
8
+ end
9
+
10
+ def create
11
+ authorize! :create, Order
12
+
13
+ refunds = SolidusReturnly::Refunds.new order: order,
14
+ line_items: line_items_params,
15
+ restock: refund_restock_param,
16
+ transactions: transactions_params
17
+ render json: refunds.proceed!
18
+ end
19
+
20
+ private
21
+
22
+ def line_items_params
23
+ params.require(:line_items)
24
+ end
25
+
26
+ def transactions_params
27
+ params.require(:transactions)
28
+ end
29
+
30
+ def refund_restock_param
31
+ params.require(:restock) == 'true'
32
+ end
33
+
34
+ def order
35
+ @order ||= Spree::Order.find_by(number: params[:order_id])
36
+ end
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,5 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: Hello world
@@ -0,0 +1,6 @@
1
+ Spree::Core::Engine.routes.draw do
2
+ namespace :api, defaults: { format: 'json' } do
3
+ post '/orders/:order_id/refunds/estimate', to: 'refunds#estimate'
4
+ post '/orders/:order_id/refunds', to: 'refunds#create'
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ module SolidusReturnly
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_javascripts
7
+ end
8
+
9
+ def add_stylesheets
10
+ end
11
+
12
+ def add_migrations
13
+ end
14
+
15
+ def run_migrations
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ require 'solidus_core'
2
+
3
+ require 'solidus_returnly/engine'
4
+ require 'solidus_returnly/refunds'
5
+ require 'solidus_returnly/calculator'
@@ -0,0 +1,98 @@
1
+ module SolidusReturnly
2
+ class Calculator
3
+ attr_accessor :line_items, :order
4
+
5
+ def self.process(order, line_items)
6
+ new(order, line_items).calculated_estimate
7
+ end
8
+
9
+ def initialize(order, line_items)
10
+ self.line_items = line_items
11
+ self.order = order
12
+ end
13
+
14
+ def calculated_estimate
15
+ total = line_items_return_items.values.sum{|iu| iu.sum(&:pre_tax_amount) }
16
+
17
+ tax_amount = returnable_inventory_units.sum do |inventory_unit|
18
+ calculate_tax inventory_unit
19
+ end
20
+
21
+ {
22
+ total_amount: total,
23
+ subtotal_amount: total - tax_amount,
24
+ tax_amount: tax_amount,
25
+ discount_amount: order.promo_total,
26
+ shipping_amount: order.shipment_total,
27
+ line_items: present_line_items
28
+ }
29
+ end
30
+
31
+ def present_line_items
32
+ line_items_return_items.map do| line_item_id, inventory_units|
33
+ line_item = line_item(line_item_id)
34
+
35
+ {
36
+ order_line_item_id: line_item.id,
37
+ quantity: inventory_units.size,
38
+ total_amount: inventory_units.sum(&:amount),
39
+ tax_amount: line_item.included_tax_total,
40
+ discount_amount: line_item.adjustment_total,
41
+ }
42
+ end
43
+ end
44
+
45
+
46
+ def calculate_tax(inventory_unit)
47
+ return_item = Spree::ReturnItem.from_inventory_unit(inventory_unit)
48
+ (return_item.amount <= 0) ? 0 : return_item.amount /
49
+ Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)
50
+ end
51
+
52
+
53
+ def line_items_return_items
54
+ found_return_items = {}
55
+
56
+ self.line_items.each do |line_item|
57
+ quantity = line_item[:quantity].to_i
58
+
59
+ if quantity > 0
60
+ available_inventory_units = line_item_inventory_unit(line_item).slice(0, quantity)
61
+
62
+ available_inventory_units.each do |inventory_unit|
63
+ found_return_items[line_item[:order_line_item_id]] ||= []
64
+ found_return_items[line_item[:order_line_item_id]] << Spree::ReturnItem.new({amount: inventory_unit.line_item.price,
65
+ acceptance_status: 'accepted',
66
+ inventory_unit_id: inventory_unit.id,
67
+ reception_status_event: 'receive'
68
+ })
69
+ end
70
+ end
71
+ end
72
+
73
+ found_return_items
74
+ end
75
+
76
+ def line_item_inventory_unit(line_item)
77
+ returnable_inventory_units.select{|iu| iu.line_item_id == line_item[:order_line_item_id].to_i }
78
+ end
79
+
80
+ def line_item(id)
81
+ returnable_line_items.select{|i| i.id == id.to_i }.first
82
+ end
83
+
84
+ def returnable_inventory_units
85
+ @_inventory_units ||= order.inventory_units.includes(:line_item)
86
+ .where(line_item_id: requested_line_items)
87
+ .where('state is not "returned"')
88
+ end
89
+
90
+ def returnable_line_items
91
+ @_line_items ||= returnable_inventory_units.map(&:line_item)
92
+ end
93
+
94
+ def requested_line_items
95
+ line_items.map { |item| item[:order_line_item_id] }
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,53 @@
1
+ module SolidusReturnly
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+
5
+ engine_name 'solidus_returnly'
6
+
7
+ config.autoload_paths += %W(#{config.root}/lib)
8
+
9
+ # use rspec for tests
10
+ config.generators do |g|
11
+ g.test_framework :rspec
12
+ end
13
+
14
+ def self.activate
15
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
16
+ Rails.configuration.cache_classes ? require(c) : load(c)
17
+ end
18
+ end
19
+
20
+ config.to_prepare(&method(:activate).to_proc)
21
+
22
+ rake_tasks do
23
+ namespace :returnly do
24
+ require 'securerandom'
25
+
26
+ desc "Creates an returnly user and prints the generated API key"
27
+ task install_user: :environment do
28
+ returnly_email = 'api@returnly.coim'
29
+
30
+ password = SecureRandom.hex(24)
31
+
32
+ if (user = Spree::User.find_by email: returnly_email)
33
+ puts "The Returnly User is already generated"
34
+ puts "The Api key is: #{user.spree_api_key}"
35
+ else
36
+ user = Spree::User.new email: returnly_email, password: password,
37
+ password_confirmation: password
38
+
39
+ api_key = user.generate_spree_api_key
40
+
41
+ if user.save!
42
+ puts "****************************************************"
43
+ puts "Api key Generated #{api_key}"
44
+ puts "Returnly User Password #{password}"
45
+ puts "Returnly User email #{returnly_email}"
46
+ puts "****************************************************"
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ # Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
3
+ #
4
+ # Example adding this to your spec_helper will load these Factories for use:
5
+ # require 'solidus_returnly/factories'
6
+ end
@@ -0,0 +1,81 @@
1
+ module SolidusReturnly
2
+ class Refunds
3
+ attr_accessor :calculator, :order, :line_items, :restock, :transactions
4
+
5
+ def initialize(order:, line_items:, restock: true, transactions:)
6
+ self.order = order
7
+ self.line_items = line_items
8
+ self.calculator = Calculator.new order, line_items
9
+ self.restock = restock
10
+ self.transactions = transactions
11
+ end
12
+
13
+ def restock_return(customer_return)
14
+ customer_return.return_items.each do | item |
15
+ customer_return.stock_location.restock(item.inventory_unit.variant, 1, customer_return)
16
+ end
17
+ end
18
+
19
+ def proceed!
20
+ customer_return = Spree::CustomerReturn.new customer_return_params
21
+ customer_return.return_items = calculator.line_items_return_items.values.flatten
22
+
23
+ customer_return.return_items.each do |return_item|
24
+ return_item.amount = refund_amount_per_item
25
+ end
26
+
27
+ if customer_return.save!
28
+ reimbursement = perform_reimbursement(customer_return)
29
+ restock_return(customer_return) if self.restock
30
+
31
+ processed_customer_return(customer_return, reimbursement)
32
+ end
33
+ end
34
+
35
+ def processed_customer_return(customer_return, reimbursement)
36
+ {
37
+ refund_id: customer_return.number,
38
+ created_at: customer_return.created_at,
39
+ updated_at: customer_return.updated_at,
40
+ line_items: customer_return.return_items.map { |ri|
41
+ {
42
+ refund_line_item_id: ri.id,
43
+ order_line_item_id: ri.inventory_unit.line_item.id,
44
+ quantity: 1
45
+ }
46
+ },
47
+ transactions: [
48
+ id: reimbursement.id,
49
+ amount: reimbursement.total
50
+ ],
51
+ note: "comment text",
52
+ restock: true
53
+ }
54
+ end
55
+
56
+ def perform_reimbursement(customer_return)
57
+ reimbursement = Spree::Reimbursement.build_from_customer_return(customer_return)
58
+ reimbursement.save!
59
+ reimbursement.perform!
60
+ reimbursement
61
+ end
62
+
63
+ def customer_return_params
64
+ {
65
+ stock_location_id: stock_location_id,
66
+ }
67
+ end
68
+
69
+ def stock_location_id
70
+ order.shipments.last.stock_location.id
71
+ end
72
+
73
+ def refund_available_amount
74
+ @available_amount ||= self.transactions.sum{|t| Money.from_amount(t[:amount].to_f) }
75
+ end
76
+
77
+ def refund_amount_per_item
78
+ refund_available_amount / line_items.size
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,3 @@
1
+ module SolidusReturnly
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,280 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solidus-returnly
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Returnly Technologies, Inc
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-05-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: solidus
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: solidus_core
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: solidus_api
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: capybara
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: awesome_print
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: poltergeist
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coffee-rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sass-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: database_cleaner
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: factory_girl
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rspec-rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.5'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.5'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rubocop
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.37.2
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 0.37.2
181
+ - !ruby/object:Gem::Dependency
182
+ name: rubocop-rspec
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '='
186
+ - !ruby/object:Gem::Version
187
+ version: 1.4.0
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '='
193
+ - !ruby/object:Gem::Version
194
+ version: 1.4.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: simplecov
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: sqlite3
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: with_model
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ description: Solidus API extensions for returnly
238
+ email: support@returnly.com
239
+ executables: []
240
+ extensions: []
241
+ extra_rdoc_files: []
242
+ files:
243
+ - LICENSE
244
+ - README.md
245
+ - Rakefile
246
+ - app/controllers/spree/api/refunds_controller.rb
247
+ - config/locales/en.yml
248
+ - config/routes.rb
249
+ - lib/generators/solidus_returnly/install/install_generator.rb
250
+ - lib/solidus/returnly.rb
251
+ - lib/solidus_returnly/calculator.rb
252
+ - lib/solidus_returnly/engine.rb
253
+ - lib/solidus_returnly/factories.rb
254
+ - lib/solidus_returnly/refunds.rb
255
+ - lib/solidus_returnly/version.rb
256
+ homepage: https://github.com/returnly/solidus-returnly
257
+ licenses:
258
+ - MIT
259
+ metadata: {}
260
+ post_install_message:
261
+ rdoc_options: []
262
+ require_paths:
263
+ - lib
264
+ required_ruby_version: !ruby/object:Gem::Requirement
265
+ requirements:
266
+ - - ">="
267
+ - !ruby/object:Gem::Version
268
+ version: '0'
269
+ required_rubygems_version: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - ">="
272
+ - !ruby/object:Gem::Version
273
+ version: '0'
274
+ requirements: []
275
+ rubyforge_project:
276
+ rubygems_version: 2.6.11
277
+ signing_key:
278
+ specification_version: 4
279
+ summary: Returnly integration with Solidus
280
+ test_files: []