spree_fosdick_integration 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +28 -0
- data/Gemfile +21 -0
- data/LICENSE.txt +22 -0
- data/README.md +76 -0
- data/Rakefile +15 -0
- data/app/controllers/spree/admin/fosdick_shipments_controller.rb +18 -0
- data/app/mailers/spree/fosdick_shipment_mailer.rb +13 -0
- data/app/models/spree/fosdick_exception.rb +15 -0
- data/app/models/spree/fosdick_shipment.rb +8 -0
- data/app/models/spree/shipment_decorator.rb +17 -0
- data/app/overrides/add_fosdick_panel.rb +8 -0
- data/app/serializers/address_serializer.rb +18 -0
- data/app/serializers/inventory_unit_serializer.rb +21 -0
- data/app/serializers/shipment_serializer.rb +104 -0
- data/app/services/exception_logger.rb +21 -0
- data/app/views/spree/admin/fosdick_shipments/_filters_bar.html.haml +36 -0
- data/app/views/spree/admin/fosdick_shipments/_fosdick_shipments_list.html.haml +28 -0
- data/app/views/spree/admin/fosdick_shipments/_fosdick_shipments_list_respond.js.erb +1 -0
- data/app/views/spree/admin/fosdick_shipments/_titles.html.haml +5 -0
- data/app/views/spree/admin/fosdick_shipments/index.html.haml +3 -0
- data/app/views/spree/admin/fosdick_shipments/index.js.haml +1 -0
- data/app/views/spree/fosdick_shipment_mailer/order_shipped.html.erb +135 -0
- data/config/locales/en.yml +14 -0
- data/config/locales/ru.yml +14 -0
- data/config/routes.rb +10 -0
- data/db/migrate/20151013153126_create_spree_fosdick_shipment.rb +17 -0
- data/db/migrate/20151015122038_create_fosdick_exceptions.rb +15 -0
- data/db/migrate/20151028105216_add_fosdick_atempt_and_state_spree_shipments.rb +6 -0
- data/lib/fosdick/documents/shipment.rb +89 -0
- data/lib/fosdick/processor.rb +64 -0
- data/lib/fosdick/receiver.rb +49 -0
- data/lib/fosdick/sender.rb +39 -0
- data/lib/generators/spree_fosdick_integration/install/install_generator.rb +32 -0
- data/lib/generators/spree_fosdick_integration/install/templates/fosdick.rb +6 -0
- data/lib/generators/spree_fosdick_integration/install/templates/fosdick.yml.template +18 -0
- data/lib/spree_fosdick_integration.rb +8 -0
- data/lib/spree_fosdick_integration/engine.rb +22 -0
- data/lib/spree_fosdick_integration/factories.rb +31 -0
- data/lib/spree_fosdick_integration/version.rb +3 -0
- data/script/rails +7 -0
- data/spec/controllers/admin/fosdick_shipments_controller_spec.rb +16 -0
- data/spec/models/spree/fosdick_exception_spec.rb +21 -0
- data/spec/models/spree/fosdick_shipment_spec.rb +9 -0
- data/spec/models/spree/shipment_spec.rb +50 -0
- data/spec/services/exception_logger_spec.rb +11 -0
- data/spec/services/fosdick/processor_spec.rb +94 -0
- data/spec/services/fosdick/receiver_spec.rb +43 -0
- data/spec/services/fosdick/sender_spec.rb +34 -0
- data/spec/spec_helper.rb +99 -0
- data/spree_fosdick_integration.gemspec +37 -0
- metadata +286 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b13986672e0deb67ca5905d5bb4ddd945baf4535
|
4
|
+
data.tar.gz: c8f580eb733f0bf062a9ed39154c7879eee2d110
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 97ee5e4468d6637dca27732d38eec742864ae783e7acb5872745fa8bdef388337a6bac43dbccd32fcc751cfc0f171cc9e715cef8135695f5f8cd9b970dd54f19
|
7
|
+
data.tar.gz: e0370185fa1dd7097b24be8b92705ebe2b3acca64c132462ef31c5235f742cdf773e70c7e36bc2c060e2de59dd46d32b3dbf1a75863b3927c520db428d2da58b
|
data/.gitignore
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/Gemfile.lock
|
4
|
+
/_yardoc/
|
5
|
+
/coverage/
|
6
|
+
/doc/
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
9
|
+
/tmp/
|
10
|
+
*.bundle
|
11
|
+
*.so
|
12
|
+
*.o
|
13
|
+
*.a
|
14
|
+
mkmf.log
|
15
|
+
|
16
|
+
\#*
|
17
|
+
*~
|
18
|
+
.#*
|
19
|
+
.DS_Store
|
20
|
+
.idea
|
21
|
+
.project
|
22
|
+
.sass-cache
|
23
|
+
.ruby-version
|
24
|
+
.ruby-gemset
|
25
|
+
nbproject
|
26
|
+
*.swp
|
27
|
+
spec/dummy
|
28
|
+
config/fosdick.yml
|
data/Gemfile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in spree_fosdick_integration.gemspec
|
4
|
+
gem 'httparty'
|
5
|
+
gem 'nokogiri'
|
6
|
+
gem 'model_un'
|
7
|
+
|
8
|
+
spree_version = '3-1-stable'
|
9
|
+
|
10
|
+
gem 'spree', github: 'spree/spree', branch: spree_version
|
11
|
+
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: spree_version
|
12
|
+
|
13
|
+
gem 'haml'
|
14
|
+
gem 'haml-rails'
|
15
|
+
gem 'active_model_serializers', '~> 0.9.3'
|
16
|
+
|
17
|
+
group :test do
|
18
|
+
gem 'shoulda-matchers', require: false
|
19
|
+
gem 'webmock'
|
20
|
+
end
|
21
|
+
gemspec
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 JetRuby Agency
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# SpreeFosdickIntegration
|
2
|
+
|
3
|
+
Current gem provides easy integration for you Spree Commerce based apps with full service fulfillment services of Fosdick Fulfillment.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'spree_fosdick_integration'
|
11
|
+
```
|
12
|
+
|
13
|
+
Bundle your dependencies and run the installation generator:
|
14
|
+
|
15
|
+
```shell
|
16
|
+
bundle
|
17
|
+
bundle exec rails g spree_fosdick_integration:install
|
18
|
+
```
|
19
|
+
Update ``` config/fosdick.yml ``` with your credentials received from Fosdick
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
Create a rake task to push shipments to Fosdick iPost interface:
|
23
|
+
|
24
|
+
```
|
25
|
+
desc "Push shipments to Fosdick iPost interface"
|
26
|
+
task push_shipments_fosdick: :environment do
|
27
|
+
eligible_shipments = Spree::Shipment.perform_fosdick_shipments
|
28
|
+
|
29
|
+
if eligible_shipments.present?
|
30
|
+
eligible_shipments.each do |shipment|
|
31
|
+
Fosdick::Processor.send_shipment(shipment, FOSDICK_CONFIG)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
```
|
36
|
+
|
37
|
+
Create a rake task to receive shipment information from Fosdick API:
|
38
|
+
|
39
|
+
```
|
40
|
+
desc "Receive shipment information from Fosdick API"
|
41
|
+
task receive_shipments_fosdick: :environment do
|
42
|
+
eligible_shipments = Spree::FosdickShipment.eligible_fosdick_shipments
|
43
|
+
|
44
|
+
if eligible_shipments.present?
|
45
|
+
eligible_shipments.each do |fosdick_shipment|
|
46
|
+
# get tracking details
|
47
|
+
Fosdick::Processor.receive_shipment({external_order_num: fosdick_shipment.external_order_num }) if fosdick_shipment.tracking_number.nil?
|
48
|
+
# get ship_date
|
49
|
+
Fosdick::Processor.receive_shipment({external_order_num: fosdick_shipment.external_order_num }, 'shipments.json') if fosdick_shipment.ship_date.nil?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
```
|
54
|
+
|
55
|
+
Override the email view to customise:
|
56
|
+
|
57
|
+
```
|
58
|
+
app/views/spree/fosdick_shipment_mailer/order_shipped.html.erb
|
59
|
+
```
|
60
|
+
|
61
|
+
## Testing
|
62
|
+
|
63
|
+
Be sure to bundle your dependencies and then create a dummy test app for the specs to run against.
|
64
|
+
|
65
|
+
```shell
|
66
|
+
bundle
|
67
|
+
bundle exec rake test_app
|
68
|
+
bundle exec rspec spec
|
69
|
+
```
|
70
|
+
|
71
|
+
When testing your applications integration with this extension you may use it's factories.
|
72
|
+
Simply add this require statement to your spec_helper:
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
require 'spree_fosdick_integration/factories'
|
76
|
+
```
|
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/extension_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'] = 'spree_fosdick_integration'
|
14
|
+
Rake::Task['extension:test_app'].invoke
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Spree::Admin::FosdickShipmentsController < Spree::Admin::BaseController
|
2
|
+
respond_to :js, only: [:index]
|
3
|
+
|
4
|
+
def index
|
5
|
+
params[:q] ||= {}
|
6
|
+
|
7
|
+
params_clone = params[:q].deep_dup
|
8
|
+
|
9
|
+
[:created_at_gt, :created_at_lt, :ship_date_gt, :ship_date_lt].each do |date_param|
|
10
|
+
if params_clone[date_param].present?
|
11
|
+
params_clone[date_param] = Time.zone.parse(params_clone[date_param]).beginning_of_day rescue ''
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
@search = Spree::FosdickShipment.includes(:fosdick_exceptions).ransack(params_clone)
|
16
|
+
@fosdick_shipments = @search.result(distinct: true).page(params[:page]).per(Spree::Config[:admin_products_per_page]).order(created_at: :desc)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Spree
|
2
|
+
class FosdickShipmentMailer < ActionMailer::Base
|
3
|
+
default from: 'spree@example.com'
|
4
|
+
|
5
|
+
def order_shipped(shipment)
|
6
|
+
@shipment = shipment
|
7
|
+
@tracking = shipment.tracking,
|
8
|
+
@order_number = shipment.order.number
|
9
|
+
|
10
|
+
mail to: @shipment.order.email, subject: Spree.t('fosdick.order_shipped.subject')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Spree::FosdickException < ActiveRecord::Base
|
2
|
+
belongs_to :fosdick_shipment, class_name: 'Spree::FosdickShipment', foreign_key: :spree_fosdick_shipment_id
|
3
|
+
|
4
|
+
after_create :update_shipment_fosdick_state
|
5
|
+
|
6
|
+
def shipment
|
7
|
+
self.fosdick_shipment.shipment
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def update_shipment_fosdick_state
|
13
|
+
self.shipment.update_column(:fosdick_state, "#{message.include?('Duplicate') ? 'duplicate' : 'exception'}")
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class Spree::FosdickShipment < ActiveRecord::Base
|
2
|
+
belongs_to :shipment, class_name: 'Spree::Shipment', foreign_key: :spree_shipment_id
|
3
|
+
has_many :fosdick_exceptions, class_name: 'Spree::FosdickException', foreign_key: :spree_fosdick_shipment_id
|
4
|
+
|
5
|
+
scope :eligible_fosdick_shipments, -> { where.not(fosdick_order_num: nil).where(state: 'sent', ship_date: nil)}
|
6
|
+
|
7
|
+
serialize :tracking_number
|
8
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Spree::Shipment.class_eval do
|
2
|
+
has_one :fosdick_shipment, class_name: 'Spree::FosdickShipment', foreign_key: :spree_shipment_id, dependent: :delete
|
3
|
+
|
4
|
+
def self.perform_fosdick_shipments
|
5
|
+
shipments = where(shipped_at: nil, state: 'ready', send_atempt: 0..2).where.not(fosdick_state: ['duplicate', 'success'])
|
6
|
+
|
7
|
+
JSON.parse(ActiveModel::ArraySerializer.new(shipments, each_serializer: ShipmentSerializer, root: false).to_json) if shipments.present?
|
8
|
+
end
|
9
|
+
|
10
|
+
def bill_to
|
11
|
+
order.bill_address
|
12
|
+
end
|
13
|
+
|
14
|
+
def ship_to
|
15
|
+
order.ship_address
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Deface::Override.new(
|
2
|
+
virtual_path: 'spree/admin/orders/index',
|
3
|
+
name: 'admin_fosdick_index_button',
|
4
|
+
insert_before: "erb[silent]:contains('if can? :edit, Spree::Order.new ')",
|
5
|
+
text: "<li style='padding-right: 5px;'>
|
6
|
+
<%= button_link_to 'Fosdick panel', admin_fosdick_shipments_path, icon: '', id: 'admin_fosdick_index' %>
|
7
|
+
</li>"
|
8
|
+
)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'active_model/serializer'
|
2
|
+
|
3
|
+
class AddressSerializer < ActiveModel::Serializer
|
4
|
+
attributes :firstname, :lastname, :address1, :address2, :zipcode, :city,
|
5
|
+
:state, :country, :phone
|
6
|
+
|
7
|
+
def country
|
8
|
+
object.country.try(:iso)
|
9
|
+
end
|
10
|
+
|
11
|
+
def state
|
12
|
+
if object.state
|
13
|
+
object.state.abbr
|
14
|
+
else
|
15
|
+
object.state_name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'active_model/serializer'
|
2
|
+
|
3
|
+
class InventoryUnitSerializer < ActiveModel::Serializer
|
4
|
+
attributes :product_id, :name, :quantity, :price
|
5
|
+
|
6
|
+
def quantity
|
7
|
+
object.respond_to?(:quantity) ? object.quantity : 1
|
8
|
+
end
|
9
|
+
|
10
|
+
def price
|
11
|
+
object.line_item.price.round(2).to_f
|
12
|
+
end
|
13
|
+
|
14
|
+
def product_id
|
15
|
+
object.variant.sku
|
16
|
+
end
|
17
|
+
|
18
|
+
def name
|
19
|
+
object.variant.name
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'active_model/serializer'
|
2
|
+
|
3
|
+
class ShipmentSerializer < ActiveModel::Serializer
|
4
|
+
attributes :id, :order_id, :email, :cost, :status, :stock_location,
|
5
|
+
:shipping_method, :tracking, :placed_on, :shipped_at, :totals,
|
6
|
+
:updated_at, :channel, :items, :shipping_method_code
|
7
|
+
|
8
|
+
has_one :bill_to, serializer: AddressSerializer, root: 'billing_address'
|
9
|
+
has_one :ship_to, serializer: AddressSerializer, root: 'shipping_address'
|
10
|
+
|
11
|
+
def id
|
12
|
+
object.number
|
13
|
+
end
|
14
|
+
|
15
|
+
def order_id
|
16
|
+
object.order.number
|
17
|
+
end
|
18
|
+
|
19
|
+
def email
|
20
|
+
object.order.email
|
21
|
+
end
|
22
|
+
|
23
|
+
def channel
|
24
|
+
object.order.channel || 'spree'
|
25
|
+
end
|
26
|
+
|
27
|
+
def cost
|
28
|
+
object.cost.to_f
|
29
|
+
end
|
30
|
+
|
31
|
+
def status
|
32
|
+
object.state
|
33
|
+
end
|
34
|
+
|
35
|
+
def stock_location
|
36
|
+
object.stock_location.name
|
37
|
+
end
|
38
|
+
|
39
|
+
def shipping_method
|
40
|
+
if object.shipping_method.try(:name)
|
41
|
+
if object.shipping_method.try(:name).include?('Standard') || object.shipping_method.try(:name).include?('Free')
|
42
|
+
''
|
43
|
+
elsif object.shipping_method.try(:name).include?('Expedited')
|
44
|
+
object.shipping_method.try(:code)
|
45
|
+
end
|
46
|
+
else
|
47
|
+
''
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def shipping_method_code
|
52
|
+
object.shipping_method.try(:code)
|
53
|
+
end
|
54
|
+
|
55
|
+
def placed_on
|
56
|
+
if object.order.completed_at?
|
57
|
+
object.order.completed_at.getutc.try(:iso8601)
|
58
|
+
else
|
59
|
+
''
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def shipped_at
|
64
|
+
object.shipped_at.try(:iso8601)
|
65
|
+
end
|
66
|
+
|
67
|
+
def totals
|
68
|
+
{
|
69
|
+
item: object.order.display_item_total.to_s,
|
70
|
+
adjustment: object.order.display_adjustment_total.to_s, #adjustment_total.to_s,
|
71
|
+
tax: object.order.display_tax_total.to_s, #tax_total.to_s,
|
72
|
+
shipping: object.order.display_ship_total.to_s, #shipping_total.to_s
|
73
|
+
payment: object.order.payments.completed.sum(:amount).to_s,
|
74
|
+
order: object.order.display_total.to_s
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def updated_at
|
79
|
+
object.updated_at.iso8601
|
80
|
+
end
|
81
|
+
|
82
|
+
def items
|
83
|
+
i = []
|
84
|
+
object.inventory_units.each do |inventory_unit|
|
85
|
+
i << InventoryUnitSerializer.new(inventory_unit, root: false)
|
86
|
+
end
|
87
|
+
i
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def adjustment_total
|
93
|
+
object.order.adjustment_total.to_f
|
94
|
+
end
|
95
|
+
|
96
|
+
def shipping_total
|
97
|
+
object.order.shipment_total.to_f
|
98
|
+
end
|
99
|
+
|
100
|
+
def tax_total
|
101
|
+
object.order.tax_total.to_f
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class ExceptionLogger
|
2
|
+
|
3
|
+
def log(code, message, instance_id)
|
4
|
+
# Include notification logic if needed
|
5
|
+
unless Spree::FosdickException.find_by(spree_fosdick_shipment_id: instance_id, error_code: code).present?
|
6
|
+
Spree::FosdickException.create! build_fosdick_exception_attributes(code, message, instance_id)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def build_fosdick_exception_attributes(code, message, instance_id)
|
13
|
+
{
|
14
|
+
spree_fosdick_shipment_id: instance_id,
|
15
|
+
error_code: code,
|
16
|
+
message: message,
|
17
|
+
state: 'error',
|
18
|
+
happened_at: Time.now.in_time_zone
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
.row
|
2
|
+
- content_for :table_filter do
|
3
|
+
%div{'data-hook' => 'admin_fosdick_shipments_index_search'}
|
4
|
+
= search_form_for [:admin, @search] do |f|
|
5
|
+
.field-block.alpha.four.columns
|
6
|
+
.date-range-filter.field
|
7
|
+
= label_tag :q_created_at, Spree.t('fosdick.date_range_created')
|
8
|
+
.date-range-fields
|
9
|
+
= f.text_field :created_at_gt, class: 'datepicker datepicker-from', value: params[:q][:created_at_gt], placeholder: Spree.t(:start)
|
10
|
+
%span.range-divider{style: 'padding-top: 3px;'}
|
11
|
+
= f.text_field :created_at_lt, class: 'datepicker datepicker-to', value: params[:q][:created_at_lt], placeholder: Spree.t(:stop)
|
12
|
+
.field-block.alpha.four.columns
|
13
|
+
.date-range-filter.field
|
14
|
+
= label_tag :q_ship_date, Spree.t('fosdick.date_range_shipped')
|
15
|
+
.date-range-fields
|
16
|
+
= f.text_field :ship_date_gt, class: 'datepicker datepicker-from', value: params[:q][:ship_date_gt], placeholder: Spree.t(:start)
|
17
|
+
%span.range-divider{style: 'padding-top: 3px;'}
|
18
|
+
= f.text_field :ship_date_lt, class: 'datepicker datepicker-to', value: params[:q][:ship_date_lt], placeholder: Spree.t(:stop)
|
19
|
+
|
20
|
+
.field-block.alpha.four.columns
|
21
|
+
.date-range-filter.field
|
22
|
+
= label_tag :q_external_order_num_cont, Spree.t('fosdick.shipment_num')
|
23
|
+
= f.text_field :external_order_num_cont
|
24
|
+
|
25
|
+
.four.columns
|
26
|
+
.field
|
27
|
+
= label_tag :q_state_count, Spree.t('fosdick.integration_state')
|
28
|
+
= f.select :state_eq, [[Spree.t('fosdick.successfully_sent'),'sent'],
|
29
|
+
[Spree.t('fosdick.successfully_shipped'),'shipped'],
|
30
|
+
[Spree.t('fosdick.state_exception'),'exception']],
|
31
|
+
{include_blank: Spree.t('fosdick.select_integration_state')}, class: 'select2'
|
32
|
+
|
33
|
+
.clearfix
|
34
|
+
.actions.filter-actions
|
35
|
+
%div{'data-hook' => 'admin_abandoned_orders_index_search_buttons'}
|
36
|
+
= button Spree.t(:filter_results), 'search'
|