bbmb 2.1.3 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -3
- data/Gemfile +2 -0
- data/History.txt +11 -8
- data/Rakefile +1 -1
- data/bbmb.gemspec +3 -3
- data/lib/bbmb.rb +1 -1
- data/lib/bbmb/config.rb +6 -2
- data/lib/bbmb/html/state/change_password.rb +3 -3
- data/lib/bbmb/html/state/current_order.rb +1 -1
- data/lib/bbmb/html/state/customer.rb +6 -6
- data/lib/bbmb/html/state/customers.rb +2 -2
- data/lib/bbmb/html/state/global.rb +4 -2
- data/lib/bbmb/html/state/init.rb +1 -0
- data/lib/bbmb/html/state/login.rb +5 -1
- data/lib/bbmb/html/state/viral/admin.rb +2 -1
- data/lib/bbmb/html/state/viral/customer.rb +4 -3
- data/lib/bbmb/html/util/known_user.rb +42 -10
- data/lib/bbmb/html/util/session.rb +32 -7
- data/lib/bbmb/html/util/validator.rb +5 -5
- data/lib/bbmb/html/view/customers.rb +7 -22
- data/lib/bbmb/html/view/head.rb +1 -1
- data/lib/bbmb/html/view/navigation.rb +1 -0
- data/lib/bbmb/model/customer.rb +19 -6
- data/lib/bbmb/model/order.rb +8 -5
- data/lib/bbmb/model/product.rb +14 -45
- data/lib/bbmb/persistence/odba.rb +4 -4
- data/lib/bbmb/util/invoicer.rb +1 -0
- data/lib/bbmb/util/mail.rb +1 -2
- data/lib/bbmb/util/polling_manager.rb +11 -6
- data/lib/bbmb/util/server.rb +122 -68
- data/lib/bbmb/util/transfer_dat.rb +1 -1
- data/lib/bbmb/util/updater.rb +3 -3
- data/lib/bbmb/version.rb +1 -1
- data/test/html/state/test_customers.rb +1 -2
- data/test/model/test_customer.rb +1 -1
- data/test/model/test_order.rb +2 -2
- data/test/model/test_product.rb +11 -27
- data/test/model/test_promotion.rb +3 -3
- data/test/test_bbmb.rb +0 -1
- data/test/util/test_invoicer.rb +8 -8
- data/test/util/test_polling_manager.rb +12 -17
- data/test/util/test_server.rb +2 -6
- data/test/util/test_transfer_dat.rb +0 -3
- metadata +5 -20
@@ -6,7 +6,7 @@ require 'sbsm/validator'
|
|
6
6
|
module BBMB
|
7
7
|
module Html
|
8
8
|
module Util
|
9
|
-
class Validator < SBSM::Validator
|
9
|
+
class Validator < ::SBSM::Validator
|
10
10
|
BOOLEAN = [ :accept_terms, :order_confirmation ]
|
11
11
|
ENUMS = {
|
12
12
|
:canton => [
|
@@ -32,17 +32,17 @@ class Validator < SBSM::Validator
|
|
32
32
|
return nil if(value.empty?)
|
33
33
|
match = /\d{13}/.match(value.to_s)
|
34
34
|
unless match
|
35
|
-
raise SBSM::InvalidDataError.new(:e_invalid_ean13, :ean13, value)
|
35
|
+
raise SBSM::InvalidDataError.new(:e_invalid_ean13, :ean13, value)
|
36
36
|
end
|
37
37
|
values = match[0].split("")
|
38
38
|
check = values.pop
|
39
39
|
sum = 0
|
40
|
-
values.each_with_index { |val, index|
|
41
|
-
modulus = ((index%2)*2)+1
|
40
|
+
values.each_with_index { |val, index|
|
41
|
+
modulus = ((index%2)*2)+1
|
42
42
|
sum += (modulus*val.to_i)
|
43
43
|
}
|
44
44
|
unless (check.to_i == (10-(sum%10))%10)
|
45
|
-
raise SBSM::InvalidDataError.new(:e_invalid_ean13, :ean13, value)
|
45
|
+
raise SBSM::InvalidDataError.new(:e_invalid_ean13, :ean13, value)
|
46
46
|
end
|
47
47
|
match[0]
|
48
48
|
end
|
@@ -64,49 +64,34 @@ class CustomersList < HtmlGrid::List
|
|
64
64
|
def customer_id(model)
|
65
65
|
link = HtmlGrid::Link.new(:customer_id, model, @session, self)
|
66
66
|
link.value = model.customer_id
|
67
|
-
link.href = @lookandfeel._event_url(:customer,
|
67
|
+
link.href = @lookandfeel._event_url(:customer,
|
68
68
|
{:customer_id => model.customer_id})
|
69
69
|
link
|
70
70
|
end
|
71
71
|
def organisation(model)
|
72
72
|
link = HtmlGrid::Link.new(:organisation, model, @session, self)
|
73
73
|
link.value = model.organisation
|
74
|
-
link.href = @lookandfeel._event_url(:customer,
|
74
|
+
link.href = @lookandfeel._event_url(:customer,
|
75
75
|
{:customer_id => model.customer_id})
|
76
76
|
link
|
77
77
|
end
|
78
|
-
=begin
|
79
|
-
def email(model)
|
80
|
-
if(mail = model.email)
|
81
|
-
link = HtmlGrid::Link.new(:email, model, @session, self)
|
82
|
-
link.value = mail
|
83
|
-
link.href = sprintf("mailto:%s", mail)
|
84
|
-
link
|
85
|
-
end
|
86
|
-
end
|
87
|
-
def email(model)
|
88
|
-
EmailValue.new(model, @session, self)
|
89
|
-
end
|
90
|
-
def last_login(model)
|
91
|
-
DateTimeView.new(:last_login, model, @session, self)
|
92
|
-
end
|
93
|
-
def active(model)
|
94
|
-
model.value(:active)
|
95
|
-
end
|
96
|
-
=end
|
97
78
|
def last_login(model)
|
98
79
|
if model.respond_to?(:last_login)
|
99
80
|
model.last_login
|
100
81
|
else
|
101
|
-
@session.
|
82
|
+
@session.auth_session.last_login(model.email)
|
102
83
|
end
|
103
84
|
end
|
104
85
|
def valid(model)
|
105
86
|
if model.respond_to?(:valid)
|
106
87
|
@lookandfeel.lookup(model.valid)
|
88
|
+
elsif @session.auth_session && defined?(@session.auth_session.entity_valid?)
|
89
|
+
@session.auth_session.entity_valid?(model.email)
|
107
90
|
else
|
108
91
|
@lookandfeel.lookup(@session.user.entity_valid?(model.email).to_s)
|
109
92
|
end
|
93
|
+
rescue => error
|
94
|
+
puts error
|
110
95
|
end
|
111
96
|
private
|
112
97
|
def sort_link(header_key, matrix, component)
|
data/lib/bbmb/html/view/head.rb
CHANGED
@@ -16,7 +16,7 @@ class Head < HtmlGrid::DivComposite
|
|
16
16
|
CSS_ID_MAP = {2 => 'welcome', 1 => 'logged-in-as'}
|
17
17
|
def logged_in_as(model)
|
18
18
|
if(@session.logged_in?)
|
19
|
-
@lookandfeel.lookup(:logged_in_as, @session.
|
19
|
+
@lookandfeel.lookup(:logged_in_as, @session.auth_session.name)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
def logo(model)
|
data/lib/bbmb/model/customer.rb
CHANGED
@@ -6,8 +6,9 @@ require 'bbmb/model/order'
|
|
6
6
|
|
7
7
|
module BBMB
|
8
8
|
module Model
|
9
|
-
MUTEX ||= Mutex.new
|
10
9
|
class Customer
|
10
|
+
MUTEX = Mutex.new
|
11
|
+
|
11
12
|
attr_reader :customer_id, :email, :archive, :quotas
|
12
13
|
attr_accessor :address1, :address2, :address3, :canton, :city,
|
13
14
|
:drtitle, :ean13, :fax, :firstname, :language, :lastname,
|
@@ -22,6 +23,11 @@ class Customer
|
|
22
23
|
@quotas = []
|
23
24
|
end
|
24
25
|
def add_quota(quota)
|
26
|
+
unless @quotas.is_a?(Array)
|
27
|
+
puts "customer #{customer_id}: Fixing quotas #{@quotas} -> []"
|
28
|
+
@quotas = []
|
29
|
+
odba_store;
|
30
|
+
end
|
25
31
|
@quotas.push(quota).uniq!
|
26
32
|
quota
|
27
33
|
end
|
@@ -36,7 +42,7 @@ class Customer
|
|
36
42
|
].compact
|
37
43
|
end
|
38
44
|
def commit_order!(commit_time = Time.now)
|
39
|
-
|
45
|
+
MUTEX.synchronize {
|
40
46
|
id = @archive.keys.max.to_i.next
|
41
47
|
order = current_order
|
42
48
|
order.commit!(id, commit_time)
|
@@ -56,7 +62,6 @@ class Customer
|
|
56
62
|
end
|
57
63
|
end
|
58
64
|
def quota(article_id)
|
59
|
-
|
60
65
|
@quotas.compact.find { |quota| quota.article_number == article_id }
|
61
66
|
end
|
62
67
|
def email=(email)
|
@@ -69,11 +74,11 @@ class Customer
|
|
69
74
|
@email = email
|
70
75
|
end
|
71
76
|
end
|
72
|
-
def favorites
|
77
|
+
def favorites
|
73
78
|
@favorites ||= Order.new(self)
|
74
79
|
end
|
75
80
|
def inject_order(order, commit_time = Time.now)
|
76
|
-
|
81
|
+
MUTEX.synchronize {
|
77
82
|
id = @archive.keys.max.to_i.next
|
78
83
|
order.commit!(id, commit_time)
|
79
84
|
@archive.store(id, order)
|
@@ -93,7 +98,15 @@ class Customer
|
|
93
98
|
@protected.fetch(key, false)
|
94
99
|
end
|
95
100
|
def turnover
|
96
|
-
orders.inject(0)
|
101
|
+
orders.inject(0) do
|
102
|
+
|memo, order|
|
103
|
+
begin
|
104
|
+
order.total + memo
|
105
|
+
rescue => error
|
106
|
+
SBSM.info "turnover error for #{order.order_id} returning memo"
|
107
|
+
memo
|
108
|
+
end
|
109
|
+
end
|
97
110
|
end
|
98
111
|
end
|
99
112
|
end
|
data/lib/bbmb/model/order.rb
CHANGED
@@ -87,7 +87,7 @@ class Order
|
|
87
87
|
info
|
88
88
|
end
|
89
89
|
def calculate_effective_prices
|
90
|
-
@positions.each { |pos|
|
90
|
+
@positions.each { |pos|
|
91
91
|
pos.price_effective = price_effective(pos)
|
92
92
|
}
|
93
93
|
end
|
@@ -98,7 +98,7 @@ class Order
|
|
98
98
|
def commit!(commit_id, commit_time)
|
99
99
|
raise "can't commit empty order" if(empty?)
|
100
100
|
calculate_effective_prices
|
101
|
-
@positions.each { |pos|
|
101
|
+
@positions.each { |pos|
|
102
102
|
pos.commit!
|
103
103
|
}
|
104
104
|
@unavailable.clear
|
@@ -157,8 +157,8 @@ class Order
|
|
157
157
|
if(@priority)
|
158
158
|
lines.push "238:%i" % @priority
|
159
159
|
end
|
160
|
-
lines.push "250:ADE",
|
161
|
-
sprintf("251:%i%05i", @customer.customer_id, @commit_id),
|
160
|
+
lines.push "250:ADE",
|
161
|
+
sprintf("251:%i%05i", @customer.customer_id, @commit_id),
|
162
162
|
"300:4", "301:%s" % @commit_time.strftime('%Y%m%d')
|
163
163
|
lines.join("\n")
|
164
164
|
end
|
@@ -205,6 +205,9 @@ class Order
|
|
205
205
|
end
|
206
206
|
def total
|
207
207
|
@positions.inject(@shipping) { |memo, pos| pos.total + memo }
|
208
|
+
rescue
|
209
|
+
SBSM.info "total: rescuing by adding 0 to memo #{memo} as total for #{order_id}"
|
210
|
+
return memo
|
208
211
|
end
|
209
212
|
def total_incl_vat
|
210
213
|
if rate = BBMB.config.vat_rate
|
@@ -222,7 +225,7 @@ class Order
|
|
222
225
|
@customer.customer_id,
|
223
226
|
@customer.ean13,
|
224
227
|
@commit_time.strftime('%d%m%Y'),
|
225
|
-
@commit_id,
|
228
|
+
@commit_id,
|
226
229
|
position.pcode,
|
227
230
|
position.ean13,
|
228
231
|
position.article_number,
|
data/lib/bbmb/model/product.rb
CHANGED
@@ -62,47 +62,11 @@ class ProductInfo < Subject
|
|
62
62
|
instance_variable_get("@l#{level}_qty")
|
63
63
|
end
|
64
64
|
end
|
65
|
-
|
66
|
-
def ==(other)
|
67
|
-
other.is_a?(ProductInfo) && @article_number == other.article_number
|
68
|
-
end
|
69
|
-
|
70
65
|
def to_info
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
def to_product
|
75
|
-
convert_to(Product)
|
66
|
+
self
|
76
67
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
# Converts as new instance
|
81
|
-
#
|
82
|
-
# @param [Class] klass New class {Product|ProductInfo}
|
83
|
-
# @return [Array(Product,ProductInfo)] new instance
|
84
|
-
def convert_to(klass)
|
85
|
-
base_keys = %i{
|
86
|
-
backorder_date catalogue1 catalogue2 catalogue3
|
87
|
-
description ean13 expiry_date partner_index pcode status
|
88
|
-
}
|
89
|
-
keys = case klass.to_s
|
90
|
-
when 'BBMB::Model::Product'
|
91
|
-
base_keys
|
92
|
-
when 'BBMB::Model::ProductInfo'
|
93
|
-
base_keys += %i{
|
94
|
-
vat price
|
95
|
-
l1_qty l2_qty l3_qty l4_qty l5_qty l6_qty
|
96
|
-
l1_price l2_price l3_price l4_price l5_price l6_price
|
97
|
-
}
|
98
|
-
else
|
99
|
-
raise "Unknown class #{klass}"
|
100
|
-
end
|
101
|
-
obj = klass.new(@article_number)
|
102
|
-
keys.each { |key| obj.send("#{key}=", self.send(key)) }
|
103
|
-
obj.promotion = @promotion.dup if (@promotion && @promotion.current?)
|
104
|
-
obj.sale = @sale.dup if (@sale && @sale.current?)
|
105
|
-
obj
|
68
|
+
def ==(other)
|
69
|
+
other.is_a?(ProductInfo) && @article_number == other.article_number
|
106
70
|
end
|
107
71
|
end
|
108
72
|
class Product < ProductInfo
|
@@ -117,13 +81,18 @@ class Product < ProductInfo
|
|
117
81
|
def current_promo
|
118
82
|
[@sale, @promotion].find { |promo| promo && promo.current? }
|
119
83
|
end
|
120
|
-
|
121
|
-
def to_product
|
122
|
-
self
|
123
|
-
end
|
124
|
-
|
125
84
|
def to_info
|
126
|
-
|
85
|
+
info = ProductInfo.new(@article_number)
|
86
|
+
[ :backorder_date, :catalogue1, :catalogue2, :catalogue3,
|
87
|
+
:description, :ean13, :expiry_date, :partner_index, :pcode,
|
88
|
+
:status, :l1_qty, :l2_qty, :l3_qty, :l4_qty, :l5_qty, :l6_qty, :vat,
|
89
|
+
:price, :l1_price, :l2_price, :l3_price, :l4_price, :l5_price, :l6_price
|
90
|
+
].each { |key|
|
91
|
+
info.send("#{key}=", self.send(key))
|
92
|
+
}
|
93
|
+
info.promotion = @promotion.dup if(@promotion && @promotion.current?)
|
94
|
+
info.sale = @sale.dup if(@sale && @sale.current?)
|
95
|
+
info
|
127
96
|
end
|
128
97
|
end
|
129
98
|
end
|
@@ -24,12 +24,12 @@ module BBMB
|
|
24
24
|
objs.each { |obj| obj.odba_delete }
|
25
25
|
end
|
26
26
|
def ODBA.migrate_to_subject
|
27
|
-
all(Model::Product) { |product|
|
28
|
-
product.migrate_to_subject && product.odba_store
|
27
|
+
all(Model::Product) { |product|
|
28
|
+
product.migrate_to_subject && product.odba_store
|
29
29
|
}
|
30
30
|
all(Model::Order) { |order|
|
31
|
-
order.each { |position|
|
32
|
-
position.migrate_to_subject && position.odba_store
|
31
|
+
order.each { |position|
|
32
|
+
position.migrate_to_subject && position.odba_store
|
33
33
|
}
|
34
34
|
}
|
35
35
|
::ODBA.cache.create_deferred_indices(true)
|
data/lib/bbmb/util/invoicer.rb
CHANGED
data/lib/bbmb/util/mail.rb
CHANGED
@@ -101,8 +101,7 @@ module Mail
|
|
101
101
|
parts = []
|
102
102
|
config.mail_confirm_lines.collect do |line|
|
103
103
|
content = order.collect do |pos|
|
104
|
-
sprintf
|
105
|
-
pos.description, pos.price_qty.to_f, pos.total.to_f)
|
104
|
+
sprintf line, pos.quantity, pos.description, pos.price_qty, pos.total
|
106
105
|
end
|
107
106
|
parts.push date, content.join("\n"), order.total
|
108
107
|
if vtotal = order.total_incl_vat
|
@@ -16,12 +16,15 @@ class FileMission
|
|
16
16
|
attr_accessor :backup_dir, :delete, :directory, :glob_pattern
|
17
17
|
def file_paths
|
18
18
|
path = File.expand_path(@glob_pattern || '*', @directory)
|
19
|
-
Dir.glob(path).collect { |entry|
|
19
|
+
res = Dir.glob(path).collect { |entry|
|
20
20
|
File.expand_path(entry, @directory)
|
21
21
|
}.compact
|
22
|
+
puts res
|
23
|
+
res
|
22
24
|
end
|
23
25
|
def poll(&block)
|
24
|
-
@directory = File.expand_path(@directory, BBMB.config.bbmb_dir)
|
26
|
+
@directory = File.expand_path(@directory, BBMB.config.bbmb_dir) unless File.directory?(@directory) &&
|
27
|
+
File.absolute_path(@directory) == @directory
|
25
28
|
file_paths.each { |path|
|
26
29
|
poll_path(path, &block)
|
27
30
|
}
|
@@ -34,7 +37,11 @@ class FileMission
|
|
34
37
|
BBMB::Util::Mail.notify_error(err)
|
35
38
|
ensure
|
36
39
|
if(@backup_dir)
|
37
|
-
|
40
|
+
if File.absolute_path(@backup_dir) == @backup_dir
|
41
|
+
dir = @backup_dir
|
42
|
+
else
|
43
|
+
dir = File.expand_path(@backup_dir, BBMB.config.bbmb_dir)
|
44
|
+
end
|
38
45
|
FileUtils.mkdir_p(dir)
|
39
46
|
FileUtils.cp(path, dir)
|
40
47
|
end
|
@@ -43,12 +50,10 @@ class FileMission
|
|
43
50
|
end
|
44
51
|
end
|
45
52
|
end
|
46
|
-
class PopMission
|
53
|
+
class PopMission
|
47
54
|
attr_accessor :host, :port, :user, :pass, :content_type
|
48
55
|
def poll(&block)
|
49
56
|
# puts "PopMission starts polling host #{@host}:#{@port} u: #{@user} pw: #{@pass}"
|
50
|
-
@backup_dir ||= Dir.tmpdir
|
51
|
-
|
52
57
|
options = {
|
53
58
|
:address => @host,
|
54
59
|
:port => @port,
|
data/lib/bbmb/util/server.rb
CHANGED
@@ -6,20 +6,116 @@ require 'bbmb/html/util/known_user'
|
|
6
6
|
require 'bbmb/html/util/session'
|
7
7
|
require 'bbmb/html/util/validator'
|
8
8
|
require 'bbmb/util/invoicer'
|
9
|
+
require 'bbmb/util/invoicer'
|
9
10
|
require 'bbmb/util/mail'
|
10
11
|
require 'bbmb/util/updater'
|
11
12
|
require 'bbmb/model/order' # needed to be enable to invoice later
|
12
13
|
require 'bbmb/model/customer'
|
13
14
|
require 'date'
|
14
|
-
require 'sbsm/
|
15
|
+
require 'sbsm/app'
|
16
|
+
require 'bbmb/persistence/odba'
|
17
|
+
require 'bbmb/model/customer'
|
18
|
+
require 'bbmb/model/quota'
|
19
|
+
require 'bbmb/model/product'
|
20
|
+
require 'bbmb/model/promotion'
|
15
21
|
|
16
22
|
module BBMB
|
23
|
+
def self.persistence
|
24
|
+
@@persistence ||= BBMB::Persistence::ODBA
|
25
|
+
end
|
17
26
|
module Util
|
18
|
-
class Server
|
27
|
+
class Server
|
28
|
+
def initialize(persistence, app)
|
29
|
+
puts "Self #{self.class} initialize"
|
30
|
+
@persistence = persistence
|
31
|
+
@app = app
|
32
|
+
end
|
33
|
+
def invoice(range)
|
34
|
+
Invoicer.run(range)
|
35
|
+
rescue Exception => e
|
36
|
+
Mail.notify_error(e)
|
37
|
+
end
|
38
|
+
def update
|
39
|
+
Updater.run
|
40
|
+
rescue Exception => e
|
41
|
+
Mail.notify_error(e)
|
42
|
+
end
|
43
|
+
def inject_order(customer_id, products, infos, opts={})
|
44
|
+
@app.inject_order(customer_id, products, infos, opts)
|
45
|
+
end
|
46
|
+
def rename_user(old_name, new_name)
|
47
|
+
@app.rename_user(old_name, new_name)
|
48
|
+
end
|
49
|
+
def run_invoicer
|
50
|
+
SBSM.debug("run_invoicer starting")
|
51
|
+
@invoicer ||= Thread.new {
|
52
|
+
Thread.current.abort_on_exception = true
|
53
|
+
loop {
|
54
|
+
today = Date.today
|
55
|
+
day = today >> 1
|
56
|
+
start = Time.local(today.year, today.month)
|
57
|
+
now = Time.now
|
58
|
+
at = Time.local(day.year, day.month)
|
59
|
+
secs = at - now
|
60
|
+
SBSM.debug("invoicer") {
|
61
|
+
"sleeping %.2f seconds" % secs
|
62
|
+
}
|
63
|
+
sleep(secs)
|
64
|
+
SBSM.debug("invoice starting")
|
65
|
+
invoice(start...at)
|
66
|
+
SBSM.debug("invoice finished")
|
67
|
+
}
|
68
|
+
}
|
69
|
+
end
|
70
|
+
def run_updater
|
71
|
+
run_only_once_at_startup = false
|
72
|
+
SBSM.debug("updater") { "run_updater run_only_once_at_startup? #{run_only_once_at_startup} " }
|
73
|
+
@updater ||= Thread.new {
|
74
|
+
loop {
|
75
|
+
day = Date.today
|
76
|
+
now = Time.now
|
77
|
+
if(now.hour >= BBMB.config.update_hour)
|
78
|
+
day += 1
|
79
|
+
end
|
80
|
+
at = Time.local(day.year, day.month, day.day, BBMB.config.update_hour)
|
81
|
+
secs = at - now
|
82
|
+
SBSM.debug("updater") { "sleeping %.2f seconds. run_only_once_at_startup #{run_only_once_at_startup}" % secs }
|
83
|
+
if run_only_once_at_startup then puts "Skipped sleeping #{secs}" else sleep(secs) end
|
84
|
+
|
85
|
+
SBSM.debug("update starting")
|
86
|
+
update
|
87
|
+
SBSM.debug("update finished")
|
88
|
+
Thread.abort if run_only_once_at_startup
|
89
|
+
}
|
90
|
+
}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
class RackInterface < SBSM::RackInterface
|
19
94
|
ENABLE_ADMIN = true
|
20
|
-
|
21
|
-
|
22
|
-
attr_reader :updater
|
95
|
+
SESSION = Html::Util::Session
|
96
|
+
VALIDATOR = Html::Util::Validator
|
97
|
+
attr_reader :updater, :auth
|
98
|
+
def initialize(app: BBMB::Util::App.new,
|
99
|
+
auth: nil,
|
100
|
+
validator: BBMB::Html::Util::Validator)
|
101
|
+
[ File.join(Dir.pwd, 'etc', 'config.yml'),
|
102
|
+
].each do |config_file|
|
103
|
+
if File.exist?(config_file)
|
104
|
+
puts "BBMB.config.load from #{config_file}"
|
105
|
+
BBMB.config.load (config_file)
|
106
|
+
break
|
107
|
+
end
|
108
|
+
end
|
109
|
+
@auth = DRb::DRbObject.new(nil, BBMB.config.auth_url)
|
110
|
+
puts "@auth is #{@auth} from #{self.class}"
|
111
|
+
@app = app
|
112
|
+
super(app: app,
|
113
|
+
session_class: BBMB::Html::Util::Session,
|
114
|
+
unknown_user: Html::Util::KnownUser,
|
115
|
+
validator: validator,
|
116
|
+
cookie_name: 'virbac.bbmb'
|
117
|
+
)
|
118
|
+
end
|
23
119
|
def inject_order(customer_id, products, infos, opts={})
|
24
120
|
customer = Model::Customer.find_by_customer_id(customer_id) \
|
25
121
|
|| Model::Customer.find_by_ean13(customer_id)
|
@@ -39,8 +135,8 @@ module BBMB
|
|
39
135
|
order = Model::Order.new(customer)
|
40
136
|
products.each { |info|
|
41
137
|
if(product = Model::Product.find_by_pcode(info[:pcode]) \
|
42
|
-
|
43
|
-
|
138
|
+
|| Model::Product.find_by_ean13(info[:ean13]) \
|
139
|
+
|| Model::Product.find_by_article_number(info[:article_number]))
|
44
140
|
order.add(info[:quantity], product)
|
45
141
|
[:article_number, :backorder].each do |key|
|
46
142
|
info.store key, product.send(key)
|
@@ -65,19 +161,14 @@ module BBMB
|
|
65
161
|
end
|
66
162
|
{ :order_id => order.order_id, :products => products }
|
67
163
|
end
|
68
|
-
def invoice(range)
|
69
|
-
Invoicer.run(range)
|
70
|
-
rescue Exception => e
|
71
|
-
Mail.notify_error(e)
|
72
|
-
end
|
73
164
|
def login(email, pass)
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
165
|
+
session = BBMB.auth.login(email, pass, BBMB.config.auth_domain)
|
166
|
+
Html::Util::KnownUser.new(session)
|
167
|
+
end
|
168
|
+
def logout(session)
|
169
|
+
BBMB.auth.logout(session)
|
170
|
+
rescue DRb::DRbError, RangeError, NameError
|
171
|
+
end
|
81
172
|
def rename_user(old_name, new_name)
|
82
173
|
return if old_name.eql?(new_name)
|
83
174
|
BBMB.auth.autosession(BBMB.config.auth_domain) do |session|
|
@@ -88,49 +179,6 @@ module BBMB
|
|
88
179
|
end
|
89
180
|
end
|
90
181
|
end
|
91
|
-
def run_invoicer
|
92
|
-
BBMB.logger.debug("run_invoicer starting")
|
93
|
-
@invoicer ||= Thread.new {
|
94
|
-
Thread.current.abort_on_exception = true
|
95
|
-
loop {
|
96
|
-
today = Date.today
|
97
|
-
day = today >> 1
|
98
|
-
start = Time.local(today.year, today.month)
|
99
|
-
now = Time.now
|
100
|
-
at = Time.local(day.year, day.month)
|
101
|
-
secs = at - now
|
102
|
-
BBMB.logger.debug("invoicer") {
|
103
|
-
"sleeping %.2f seconds" % secs
|
104
|
-
}
|
105
|
-
sleep(secs)
|
106
|
-
BBMB.logger.debug("invoice starting")
|
107
|
-
invoice(start...at)
|
108
|
-
BBMB.logger.debug("invoice finished")
|
109
|
-
}
|
110
|
-
}
|
111
|
-
end
|
112
|
-
def run_updater
|
113
|
-
run_only_once_at_startup = false
|
114
|
-
BBMB.logger.debug("updater") { "run_updater run_only_once_at_startup? #{run_only_once_at_startup} " }
|
115
|
-
@updater ||= Thread.new {
|
116
|
-
loop {
|
117
|
-
day = Date.today
|
118
|
-
now = Time.now
|
119
|
-
if(now.hour >= BBMB.config.update_hour)
|
120
|
-
day += 1
|
121
|
-
end
|
122
|
-
at = Time.local(day.year, day.month, day.day, BBMB.config.update_hour)
|
123
|
-
secs = at - now
|
124
|
-
BBMB.logger.debug("updater") { "sleeping %.2f seconds. run_only_once_at_startup #{run_only_once_at_startup}" % secs }
|
125
|
-
if run_only_once_at_startup then puts "Skipped sleeping #{secs}" else sleep(secs) end
|
126
|
-
|
127
|
-
BBMB.logger.debug("update starting")
|
128
|
-
update
|
129
|
-
BBMB.logger.debug("update finished")
|
130
|
-
Thread.abort if run_only_once_at_startup
|
131
|
-
}
|
132
|
-
}
|
133
|
-
end
|
134
182
|
def send_order order, customer
|
135
183
|
begin
|
136
184
|
Timeout.timeout(300) {
|
@@ -157,11 +205,17 @@ module BBMB
|
|
157
205
|
BBMB::Util::Mail.notify_error(err)
|
158
206
|
end
|
159
207
|
end
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
208
|
+
end
|
209
|
+
class App < SBSM::App
|
210
|
+
def login(email, pass)
|
211
|
+
session = BBMB.auth.login(email, pass, BBMB.config.auth_domain)
|
212
|
+
Html::Util::KnownUser.new(session)
|
213
|
+
end
|
214
|
+
def logout(session)
|
215
|
+
# Here we start when logging in from the home page
|
216
|
+
BBMB.auth.logout(session)
|
217
|
+
rescue DRb::DRbError, RangeError, NameError
|
164
218
|
end
|
165
219
|
end
|
166
|
-
|
167
|
-
end
|
220
|
+
end
|
221
|
+
end
|