workarea-legacy_orders 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +20 -0
- data/.eslintrc.json +35 -0
- data/.github/workflows/ci.yml +61 -0
- data/.gitignore +24 -0
- data/.rubocop.yml +2 -0
- data/.stylelintrc.json +8 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +39 -0
- data/Gemfile +7 -0
- data/LICENSE +52 -0
- data/README.md +188 -0
- data/Rakefile +56 -0
- data/app/controllers/workarea/admin/legacy_orders_controller.rb +17 -0
- data/app/controllers/workarea/api/admin/legacy_orders_controller.rb +44 -0
- data/app/controllers/workarea/storefront/orders_controller.decorator +37 -0
- data/app/controllers/workarea/storefront/users/orders_controller.decorator +42 -0
- data/app/models/workarea/legacy_order/address.rb +28 -0
- data/app/models/workarea/legacy_order/item.rb +22 -0
- data/app/models/workarea/legacy_order/tender.rb +25 -0
- data/app/models/workarea/legacy_order.rb +58 -0
- data/app/models/workarea/search/admin/legacy_order.rb +80 -0
- data/app/queries/workarea/search/admin_legacy_orders.rb +33 -0
- data/app/seeds/workarea/legacy_orders_seeds.rb +112 -0
- data/app/view_models/workarea/admin/legacy_order_view_model.rb +12 -0
- data/app/view_models/workarea/storefront/legacy_order_item_view_model.rb +38 -0
- data/app/view_models/workarea/storefront/legacy_order_view_model.rb +37 -0
- data/app/view_models/workarea/storefront/user_view_model.decorator +23 -0
- data/app/views/workarea/admin/legacy_orders/_menu.html.haml +1 -0
- data/app/views/workarea/admin/legacy_orders/_summary.html.haml +7 -0
- data/app/views/workarea/admin/legacy_orders/index.html.haml +119 -0
- data/app/views/workarea/admin/legacy_orders/show.html.haml +108 -0
- data/app/views/workarea/admin/legacy_orders/tenders/_legacy_tender.html.haml +7 -0
- data/app/views/workarea/storefront/legacy_orders/_summary.html.haml +223 -0
- data/app/views/workarea/storefront/legacy_orders/show.html.haml +16 -0
- data/app/views/workarea/storefront/legacy_orders/tenders/_legacy_tender.html.haml +14 -0
- data/app/views/workarea/storefront/users/legacy_orders/show.html.haml +24 -0
- data/bin/rails +19 -0
- data/config/initializers/appends.rb +4 -0
- data/config/initializers/config.rb +4 -0
- data/config/locales/en.yml +16 -0
- data/config/routes.rb +19 -0
- data/doc/index.json +37 -0
- data/doc/legacy_orders/creating_a_legacy_order.json +44 -0
- data/doc/legacy_orders/listing_legacy_orders.json +56 -0
- data/doc/legacy_orders/showing_a_legacy_order.json +42 -0
- data/doc/legacy_orders/updating_a_legacy_order.json +40 -0
- data/lib/workarea/legacy_orders/engine.rb +17 -0
- data/lib/workarea/legacy_orders/version.rb +5 -0
- data/lib/workarea/legacy_orders.rb +11 -0
- data/package.json +9 -0
- data/script/admin_ci +9 -0
- data/script/ci +11 -0
- data/script/core_ci +9 -0
- data/script/plugins_ci +9 -0
- data/script/storefront_ci +9 -0
- data/test/documentation/workarea/api/legacy_orders_documentation_test.rb +81 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/jobs/application_job.rb +2 -0
- data/test/dummy/app/mailers/application_mailer.rb +4 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +34 -0
- data/test/dummy/bin/update +29 -0
- data/test/dummy/config/application.rb +25 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +9 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +54 -0
- data/test/dummy/config/environments/production.rb +86 -0
- data/test/dummy/config/environments/test.rb +44 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/new_framework_defaults.rb +23 -0
- data/test/dummy/config/initializers/session_store.rb +5 -0
- data/test/dummy/config/initializers/workarea.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/puma.rb +47 -0
- data/test/dummy/config/routes.rb +6 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/db/seeds.rb +2 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/factories/legacy_orders.rb +88 -0
- data/test/integration/workarea/api/admin/legacy_orders_integration_test.rb +59 -0
- data/test/integration/workarea/storefront/legacy_order_lookup_integration_test.rb +113 -0
- data/test/system/workarea/storefront/legacy_order_lookup_system_test.rb +21 -0
- data/test/system/workarea/storefront/order_history_system_test.rb +64 -0
- data/test/teaspoon_env.rb +6 -0
- data/test/test_helper.rb +10 -0
- data/workarea-legacy_orders.gemspec +18 -0
- metadata +173 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
module Workarea
|
2
|
+
class LegacyOrder
|
3
|
+
class Address
|
4
|
+
include Mongoid::Document
|
5
|
+
|
6
|
+
field :first_name, type: String
|
7
|
+
field :last_name, type: String
|
8
|
+
field :street, type: String
|
9
|
+
field :street_2, type: String
|
10
|
+
field :city, type: String
|
11
|
+
field :company, type: String
|
12
|
+
field :region, type: String
|
13
|
+
field :postal_code, type: String
|
14
|
+
field :country, type: Country
|
15
|
+
field :phone_number, type: String
|
16
|
+
field :phone_extension, type: String
|
17
|
+
|
18
|
+
embedded_in :order, class_name: "Workarea::LegacyOrder"
|
19
|
+
|
20
|
+
alias_method :name=, :first_name=
|
21
|
+
alias_method :region_name, :region
|
22
|
+
|
23
|
+
def name
|
24
|
+
[first_name, last_name].compact.join(' ')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Workarea
|
2
|
+
class LegacyOrder
|
3
|
+
class Item
|
4
|
+
include Mongoid::Document
|
5
|
+
|
6
|
+
field :name, type: String
|
7
|
+
field :sku, type: String
|
8
|
+
field :product_id, type: String
|
9
|
+
field :quantity, type: Integer
|
10
|
+
field :price, type: Money
|
11
|
+
field :details, type: Hash, default: {}
|
12
|
+
field :customizations, type: Hash, default: {}
|
13
|
+
field :token, type: String
|
14
|
+
field :status, type: String
|
15
|
+
field :data, type: Hash, default: {}
|
16
|
+
|
17
|
+
embedded_in :order, class_name: "Workarea::LegacyOrder"
|
18
|
+
|
19
|
+
validates_presence_of :name, :sku, :quantity, :price
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Workarea
|
2
|
+
class LegacyOrder
|
3
|
+
class Tender
|
4
|
+
include Mongoid::Document
|
5
|
+
|
6
|
+
field :type, type: String
|
7
|
+
field :number, type: String
|
8
|
+
field :amount, type: Money
|
9
|
+
field :issuer, type: String
|
10
|
+
field :expiration_month, type: String
|
11
|
+
field :expiration_year, type: String
|
12
|
+
field :data, type: Hash, default: {}
|
13
|
+
|
14
|
+
validates_presence_of :type, :amount
|
15
|
+
|
16
|
+
def slug
|
17
|
+
"legacy_tender"
|
18
|
+
end
|
19
|
+
|
20
|
+
def issuer
|
21
|
+
super.presence || type
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Workarea
|
2
|
+
class LegacyOrder
|
3
|
+
include ApplicationDocument
|
4
|
+
|
5
|
+
field :_id, type: String, default: -> { SecureRandom.hex(5).upcase }
|
6
|
+
field :email, type: String
|
7
|
+
field :customer_number, type: String
|
8
|
+
field :alternate_number, type: String
|
9
|
+
field :placed_at, type: DateTime
|
10
|
+
field :status, type: String, default: "Shipped"
|
11
|
+
field :shipping_method, type: String
|
12
|
+
field :shipping_total, type: Money
|
13
|
+
field :tax_total, type: Money
|
14
|
+
field :total_price, type: Money
|
15
|
+
field :discount_total, type: Money
|
16
|
+
field :data, type: Hash, default: {}
|
17
|
+
|
18
|
+
embeds_many :items, class_name: "Workarea::LegacyOrder::Item"
|
19
|
+
embeds_one :billing_address, class_name: "Workarea::LegacyOrder::Address"
|
20
|
+
embeds_one :shipping_address, class_name: "Workarea::LegacyOrder::Address"
|
21
|
+
embeds_many :tenders, class_name: "Workarea::LegacyOrder::Tender"
|
22
|
+
|
23
|
+
index(email: 1)
|
24
|
+
|
25
|
+
validates_presence_of :email, :placed_at, :tax_total, :total_price
|
26
|
+
|
27
|
+
default_scope -> { order_by(:placed_at.desc) }
|
28
|
+
|
29
|
+
def self.for_email(email)
|
30
|
+
where(email: email)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.lookup(id, postal_code)
|
34
|
+
order = find(id) rescue nil
|
35
|
+
order&.billing_address&.postal_code == postal_code ? order : nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def name
|
39
|
+
I18n.t('workarea.order.name', id: id)
|
40
|
+
end
|
41
|
+
|
42
|
+
# The number of units in this order.
|
43
|
+
#
|
44
|
+
# @return [Integer]
|
45
|
+
#
|
46
|
+
def quantity
|
47
|
+
items.sum(&:quantity)
|
48
|
+
end
|
49
|
+
|
50
|
+
def subtotal_price
|
51
|
+
items.sum(&:price)
|
52
|
+
end
|
53
|
+
|
54
|
+
def placed?
|
55
|
+
placed_at.present?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Search
|
3
|
+
class Admin
|
4
|
+
class LegacyOrder < Search::Admin
|
5
|
+
def name
|
6
|
+
if model.billing_address.present?
|
7
|
+
model.billing_address.name
|
8
|
+
else
|
9
|
+
model.name
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def search_text
|
14
|
+
[
|
15
|
+
'order',
|
16
|
+
model.id,
|
17
|
+
model.status,
|
18
|
+
model.email,
|
19
|
+
model.customer_number,
|
20
|
+
model.alternate_number,
|
21
|
+
model.items.map { |i| "#{i.product_id} #{i.sku}" },
|
22
|
+
model.shipping_method,
|
23
|
+
addresses_text,
|
24
|
+
tenders_text
|
25
|
+
].flatten.join(' ')
|
26
|
+
end
|
27
|
+
|
28
|
+
def keywords
|
29
|
+
super + [model.email, model.alternate_number]
|
30
|
+
end
|
31
|
+
|
32
|
+
def jump_to_text
|
33
|
+
if model.placed?
|
34
|
+
"#{model.id} - Placed @ #{model.placed_at.to_s(:short)}"
|
35
|
+
else
|
36
|
+
"#{model.id} - #{model.status.to_s.titleize}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def jump_to_position
|
41
|
+
3
|
42
|
+
end
|
43
|
+
|
44
|
+
def facets
|
45
|
+
super.merge(order_status: model.status)
|
46
|
+
end
|
47
|
+
|
48
|
+
def as_document
|
49
|
+
super.merge(
|
50
|
+
total_price: model.total_price.to_f,
|
51
|
+
placed_at: model.placed_at
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def addresses_text
|
56
|
+
[model.shipping_address, model.billing_address].map do |address|
|
57
|
+
[
|
58
|
+
address.first_name,
|
59
|
+
address.last_name,
|
60
|
+
address.company,
|
61
|
+
address.street,
|
62
|
+
address.street_2,
|
63
|
+
address.city,
|
64
|
+
address.region,
|
65
|
+
address.postal_code,
|
66
|
+
address.country,
|
67
|
+
address.phone_number
|
68
|
+
]
|
69
|
+
end.flatten
|
70
|
+
end
|
71
|
+
|
72
|
+
def tenders_text
|
73
|
+
model.tenders.map do |tender|
|
74
|
+
[tender.issuer, tender.type]
|
75
|
+
end.flatten
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Search
|
3
|
+
class AdminLegacyOrders
|
4
|
+
include Query
|
5
|
+
include AdminIndexSearch
|
6
|
+
include AdminSorting
|
7
|
+
include Pagination
|
8
|
+
|
9
|
+
document Search::Admin
|
10
|
+
|
11
|
+
def initialize(params = {})
|
12
|
+
super(params.merge(type: 'legacy_order'))
|
13
|
+
end
|
14
|
+
|
15
|
+
def facets
|
16
|
+
super + [TermsFacet.new(self, 'order_status')]
|
17
|
+
end
|
18
|
+
|
19
|
+
def filters
|
20
|
+
[
|
21
|
+
DateFilter.new(self, 'placed_at', :gte),
|
22
|
+
DateFilter.new(self, 'placed_at', :lte),
|
23
|
+
RangeFilter.new(self, 'total_price', :gte),
|
24
|
+
RangeFilter.new(self, 'total_price', :lt)
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
def current_sort
|
29
|
+
AdminOrders.available_sorts.find(params[:sort])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Workarea
|
2
|
+
class LegacyOrdersSeeds
|
3
|
+
def perform
|
4
|
+
puts "Adding legacy orders..."
|
5
|
+
|
6
|
+
users.each do |user|
|
7
|
+
rand(1..5).times { Workarea::LegacyOrder.create!(order(user)) }
|
8
|
+
end
|
9
|
+
|
10
|
+
10.times { Workarea::LegacyOrder.create!(order) }
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def users
|
16
|
+
(
|
17
|
+
Workarea::User.all.sample(4) +
|
18
|
+
[Workarea::User.find_by_email("user@workarea.com")]
|
19
|
+
).uniq.compact
|
20
|
+
end
|
21
|
+
|
22
|
+
def order(user = nil)
|
23
|
+
email = user&.email || Faker::Internet.email
|
24
|
+
items = rand(1..5).times.map { item }
|
25
|
+
|
26
|
+
shipping = Faker::Commerce.price.to_m
|
27
|
+
discount = [0, nil, -1 * Faker::Commerce.price.to_m].sample
|
28
|
+
tax = Faker::Commerce.price.to_m
|
29
|
+
|
30
|
+
total = items.sum { |i| i[:price] } + shipping + tax + discount.to_m
|
31
|
+
|
32
|
+
{
|
33
|
+
email: email,
|
34
|
+
customer_number: user&.id,
|
35
|
+
alternate_number: SecureRandom.hex(5).upcase,
|
36
|
+
placed_at: Faker::Date.between(from: 3.years.ago, to: Date.today),
|
37
|
+
status: "Shipped",
|
38
|
+
shipping_method: "USPS Ground",
|
39
|
+
shipping_total: shipping,
|
40
|
+
discount_total: discount,
|
41
|
+
tax_total: tax,
|
42
|
+
total_price: total,
|
43
|
+
items: items,
|
44
|
+
tenders: tenders(total),
|
45
|
+
billing_address: address,
|
46
|
+
shipping_address: address
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def tenders(total)
|
51
|
+
tenders = []
|
52
|
+
|
53
|
+
if Faker::Boolean.boolean
|
54
|
+
tenders << {
|
55
|
+
type: "Gift Card",
|
56
|
+
number: Faker::Business.credit_card_number,
|
57
|
+
amount: Faker::Commerce.price(range: 0..total.to_f).to_m
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
tenders << {
|
62
|
+
type: Faker::Business.credit_card_type,
|
63
|
+
number: Faker::Business.credit_card_number,
|
64
|
+
amount: total - (tenders.sum { |t| t[:amount] } || 0).to_m,
|
65
|
+
expiration_month: Faker::Business.credit_card_expiry_date.month,
|
66
|
+
expiration_year: Faker::Business.credit_card_expiry_date.year
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def item
|
71
|
+
item = {
|
72
|
+
name: Faker::Commerce.product_name,
|
73
|
+
sku: Faker::Code.isbn,
|
74
|
+
quantity: rand(1..8),
|
75
|
+
price: Faker::Commerce.price.to_m,
|
76
|
+
status: item_status.sample
|
77
|
+
}
|
78
|
+
if Faker::Boolean.boolean
|
79
|
+
item[:details] = {
|
80
|
+
color: Faker::Commerce.color,
|
81
|
+
size: "medium"
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
if Faker::Boolean.boolean
|
86
|
+
item[:customizations] = {
|
87
|
+
line_1: Faker::Hipster.words.join(" "),
|
88
|
+
line_2: Faker::Hipster.words.join(" ")
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
item
|
93
|
+
end
|
94
|
+
|
95
|
+
def address
|
96
|
+
{
|
97
|
+
name: Faker::Name.name,
|
98
|
+
street: Faker::Address.street_address,
|
99
|
+
street_2: Faker::Address.secondary_address,
|
100
|
+
city: Faker::Address.city,
|
101
|
+
region: Faker::Address.state_abbr,
|
102
|
+
postal_code: Faker::Address.zip,
|
103
|
+
country: Faker::Address.country_code,
|
104
|
+
phone_number: Faker::PhoneNumber.phone_number
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def item_status
|
109
|
+
@item_status = [*%w(shipping) * 9, nil, 'pending', 'canceled']
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Admin
|
3
|
+
class LegacyOrderViewModel < ApplicationViewModel
|
4
|
+
delegate_missing_to :storefront_view_model
|
5
|
+
|
6
|
+
def storefront_view_model
|
7
|
+
@storefront_view_model ||=
|
8
|
+
Storefront::LegacyOrderViewModel.wrap(model, options)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Storefront
|
3
|
+
class LegacyOrderItemViewModel < ApplicationViewModel
|
4
|
+
def sku_name
|
5
|
+
name
|
6
|
+
end
|
7
|
+
|
8
|
+
def total_price
|
9
|
+
price
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_options?
|
13
|
+
model.details.present?
|
14
|
+
end
|
15
|
+
|
16
|
+
def product_name
|
17
|
+
return sku_name unless product.present?
|
18
|
+
product.name
|
19
|
+
end
|
20
|
+
|
21
|
+
def product
|
22
|
+
return nil if product_id.blank?
|
23
|
+
return @product if defined?(@product)
|
24
|
+
|
25
|
+
model = Catalog::Product.find(product_id) rescue nil
|
26
|
+
@product = model.present? ? ProductViewModel.wrap(model, sku: sku) : nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def image
|
30
|
+
if product.present?
|
31
|
+
product.primary_image
|
32
|
+
else
|
33
|
+
Catalog::ProductPlaceholderImage.cached
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Storefront
|
3
|
+
class LegacyOrderViewModel < ApplicationViewModel
|
4
|
+
def fulfillment_status
|
5
|
+
status
|
6
|
+
end
|
7
|
+
|
8
|
+
def requires_shipping?
|
9
|
+
shipping_address.present?
|
10
|
+
end
|
11
|
+
|
12
|
+
def items
|
13
|
+
@items ||= LegacyOrderItemViewModel.wrap(model.items)
|
14
|
+
end
|
15
|
+
|
16
|
+
def pending_items
|
17
|
+
items.select { |i| i.status == 'pending' }
|
18
|
+
end
|
19
|
+
|
20
|
+
def shipped_items
|
21
|
+
items.select { |i| i.status == 'shipped' }
|
22
|
+
end
|
23
|
+
|
24
|
+
def canceled_items
|
25
|
+
items.select { |i| i.status == 'canceled' }
|
26
|
+
end
|
27
|
+
|
28
|
+
def packages
|
29
|
+
[]
|
30
|
+
end
|
31
|
+
|
32
|
+
def refunds
|
33
|
+
[]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate Storefront::UserViewModel, with: :legacy_orders do
|
3
|
+
def recent_orders
|
4
|
+
super + legacy_orders
|
5
|
+
end
|
6
|
+
|
7
|
+
def legacy_orders
|
8
|
+
Storefront::LegacyOrderViewModel.wrap(legacy_order_models)
|
9
|
+
end
|
10
|
+
|
11
|
+
def legacy_order_models
|
12
|
+
return [] unless legacy_order_limit > 0
|
13
|
+
|
14
|
+
LegacyOrder
|
15
|
+
.for_email(model.email)
|
16
|
+
.limit(legacy_order_limit)
|
17
|
+
end
|
18
|
+
|
19
|
+
def legacy_order_limit
|
20
|
+
Workarea.config.recent_order_count - recent_order_models.size
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
%li{ class: "primary-nav__item" }= link_to t('workarea.admin.shared.primary_nav.legacy_orders'), legacy_orders_path, class: navigation_link_classes(legacy_orders_path)
|
@@ -0,0 +1,7 @@
|
|
1
|
+
.summary
|
2
|
+
= link_to legacy_order_path(model) do
|
3
|
+
%span.summary__name= model.name
|
4
|
+
.summary__info-container
|
5
|
+
%span.summary__info= local_time_ago(model.updated_at)
|
6
|
+
%span.summary__info #{model.email}, #{number_to_currency model.total_price}
|
7
|
+
%span.summary__type{ title: t('workarea.admin.orders.summary.order') }= t('workarea.admin.orders.summary.order')
|
@@ -0,0 +1,119 @@
|
|
1
|
+
- @page_title = t('workarea.admin.legacy_orders.index.title')
|
2
|
+
|
3
|
+
.view
|
4
|
+
.view__header
|
5
|
+
.grid.grid--center
|
6
|
+
.grid__cell.grid__cell--50
|
7
|
+
.view__heading
|
8
|
+
= link_to "↑ #{t('workarea.admin.orders.index.dashboard_link')}", orders_dashboards_path, class: 'view__dashboard-button'
|
9
|
+
%h1= t('workarea.admin.legacy_orders.index.title')
|
10
|
+
|
11
|
+
.view__container
|
12
|
+
.browsing-controls.browsing-controls--with-divider.browsing-controls--center{ class: ('browsing-controls--filters-displayed' unless @search.toggle_facets?) }
|
13
|
+
= form_tag legacy_orders_path, method: 'get', class: 'browsing-controls__form' do
|
14
|
+
= facet_hidden_inputs(@search.facets)
|
15
|
+
.browsing-controls__sort
|
16
|
+
.property.property--inline
|
17
|
+
= label_tag 'sort', t('workarea.admin.search.sort_by'), class: 'property__name'
|
18
|
+
= select_tag :sort, options_for_select(@search.sorts, selected: @search.sort), data: { form_submitting_control: '' }
|
19
|
+
|
20
|
+
.browsing-controls__search
|
21
|
+
.search-form
|
22
|
+
= text_field_tag :q, params[:q], class: 'search-form__input', id: 'search_legacy_orders', title: t('workarea.admin.search.keywords'), placeholder: t('workarea.admin.search.keywords')
|
23
|
+
= submit_tag 'search_legacy_orders', class: 'search-form__button'
|
24
|
+
|
25
|
+
.browsing-controls__filter.browsing-controls__filter--date
|
26
|
+
%button.browsing-controls__filter-button{ type: 'button', data: { filter_dropdown: "#filters-dropdown-date-placed" } }
|
27
|
+
= t('workarea.admin.orders.index.filters.order_placed')
|
28
|
+
= inline_svg('workarea/admin/icons/calendar.svg', class: 'browsing-controls__filter-button-icon svg-icon svg-icon--small')
|
29
|
+
|
30
|
+
#filters-dropdown-date.browsing-controls__filter-dropdown.tooltip-content
|
31
|
+
.grid
|
32
|
+
.grid__cell.grid__cell--50
|
33
|
+
.property.property--inline
|
34
|
+
-# TODO v4 rename to placed_at_starts_at, unify globally with partial
|
35
|
+
= label_tag 'placed_at_greater_than', t('workarea.admin.orders.index.filters.placed_date'), class: 'property__name'
|
36
|
+
= datetime_picker_tag 'placed_at_greater_than', params[:placed_at_greater_than], class: 'text-box', placeholder: 'Start Date', data: { datepicker_field: { inline: true }, datepicker_field_starts_at: '' }
|
37
|
+
.grid__cell.grid__cell--50
|
38
|
+
.property.property--inline
|
39
|
+
-# TODO v4 rename to placed_at_ends_at
|
40
|
+
= datetime_picker_tag 'placed_at_less_than', params[:placed_at_less_than], class: 'text-box', placeholder: 'End Date', data: { datepicker_field: { inline: true }, datepicker_field_ends_at: '' }
|
41
|
+
.browsing-controls__filter-dropdown-submit
|
42
|
+
.grid.grid--auto.grid--middle.grid--center
|
43
|
+
.grid__cell= label_tag 'quick_range', t('workarea.admin.date_selector.or_choose')
|
44
|
+
.grid__cell= select_tag 'quick_range', options_for_select(date_selector_quick_range_options)
|
45
|
+
.grid__cell= t('workarea.admin.date_selector.and')
|
46
|
+
.grid__cell= submit_tag t('workarea.admin.search.submit'), name: 'filter_by_creation_date', class: 'button button--small'
|
47
|
+
|
48
|
+
|
49
|
+
.browsing-controls__filter.browsing-controls__filter--price
|
50
|
+
%button.browsing-controls__filter-button{ type: 'button', data: { filter_dropdown: "#filters-dropdown-price" } }
|
51
|
+
= t('workarea.admin.orders.index.filters.price_range')
|
52
|
+
= inline_svg('workarea/admin/icons/prices.svg', class: 'browsing-controls__filter-button-icon svg-icon svg-icon--small')
|
53
|
+
|
54
|
+
#filters-dropdown-price.browsing-controls__filter-dropdown
|
55
|
+
.grid.grid--auto
|
56
|
+
.grid__cell
|
57
|
+
.property
|
58
|
+
.grid.grid--auto.grid--middle
|
59
|
+
.grid__cell= label_tag 'total_price_greater_than', currency_symbol, class: 'property__name'
|
60
|
+
.grid__cell= text_field_tag 'total_price_greater_than', params[:total_price_greater_than], class: 'text-box text-box--small', title: 'Total Price Min', placeholder: 'Min', pattern: '\d*\.?\d*'
|
61
|
+
.grid__cell
|
62
|
+
.property
|
63
|
+
.grid.grid--auto.grid--middle
|
64
|
+
.grid__cell= label_tag 'total_price_less_than', currency_symbol, class: 'property__name'
|
65
|
+
.grid__cell= text_field_tag 'total_price_less_than', params[:total_price_less_than], class: 'text-box text-box--small', title: 'Total Price Max', placeholder: 'Max', pattern: '\d*\.?\d*'
|
66
|
+
.grid_cell
|
67
|
+
= button_tag t('workarea.admin.search.submit'), value: 'search', class: 'button'
|
68
|
+
|
69
|
+
- if @search.facets.present?
|
70
|
+
- @search.facets.each do |facet|
|
71
|
+
= render "workarea/admin/facets/#{facet.type}", facet: facet
|
72
|
+
|
73
|
+
- if @search.toggle_facets?
|
74
|
+
.browsing-controls__toggle-filters
|
75
|
+
%button.text-button{ type: 'button', data: { toggle_filters: '' } }= t('workarea.admin.search.show_filters')
|
76
|
+
|
77
|
+
= render 'workarea/admin/facets/applied', search: @search, reset_path: legacy_orders_path
|
78
|
+
|
79
|
+
.browsing-controls__count= pluralize(@search.total, t('workarea.admin.orders.index.summary.results'))
|
80
|
+
|
81
|
+
- if @search.results.any?
|
82
|
+
%table.index-table
|
83
|
+
%thead
|
84
|
+
%tr
|
85
|
+
%th.index-table__control-cell
|
86
|
+
.checkbox
|
87
|
+
= check_box_tag 'select_all', nil, false, id: 'select_all', class: 'checkbox__input', data: { bulk_action_select_all: '' }
|
88
|
+
= label_tag 'select_all', t('workarea.admin.bulk_actions.select_all'), class: 'checkbox__label'
|
89
|
+
%th= t('workarea.admin.fields.id')
|
90
|
+
%th= t('workarea.admin.fields.email')
|
91
|
+
%th= t('workarea.admin.fields.total_price')
|
92
|
+
%th= t('workarea.admin.fields.status')
|
93
|
+
%th.align-right= t('workarea.admin.fields.placed_at')
|
94
|
+
%th= t('workarea.admin.fields.updated_at')
|
95
|
+
%tbody
|
96
|
+
- @search.results.each do |result|
|
97
|
+
%tr
|
98
|
+
%td.index-table__control-cell
|
99
|
+
.checkbox
|
100
|
+
= check_box_tag 'global_id', result.to_gid_param, false, class: 'checkbox__input', id: dom_id(result), data: { bulk_action_item: '' }
|
101
|
+
= label_tag dom_id(result), '', class: 'checkbox__label', title: t('workarea.admin.bulk_actions.add_summary_button')
|
102
|
+
%td= link_to result.id, legacy_order_path(result)
|
103
|
+
%td= result.email
|
104
|
+
%td= number_to_currency result.total_price
|
105
|
+
%td= result.status.to_s.titleize
|
106
|
+
%td.align-right
|
107
|
+
- if result.placed?
|
108
|
+
= local_time_ago(result.placed_at)
|
109
|
+
- else
|
110
|
+
\-
|
111
|
+
%td= local_time_ago(result.updated_at)
|
112
|
+
|
113
|
+
- if @search.results.total_pages > 1
|
114
|
+
= render 'workarea/admin/shared/pagination', collection: @search.results
|
115
|
+
|
116
|
+
.workflow-bar
|
117
|
+
.grid
|
118
|
+
.grid__cell
|
119
|
+
= render 'workarea/admin/shared/bulk_actions', klass: Workarea::LegacyOrder, search: @search, bulk_delete: false
|