billing 0.0.7e → 0.0.7f
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/app/jobs/billing/issue_fiscal_doc.rb +128 -0
- data/app/models/billing/bill.rb +21 -6
- data/lib/billing/engine.rb +5 -0
- data/lib/billing/version.rb +1 -1
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 805e2665500fc7301222f87a0fccd5d44274c9da
|
4
|
+
data.tar.gz: 15a32f01fb6c33cc0d924b2e7b3a1e3aa777e1df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce7748011a09d97a8fa6f82d75223c8f78e92dd88aa326500b243d90f82e719db092f18c46bb041816c912e67f83795de90e4b712d6b3c67af1fb20a752fd784
|
7
|
+
data.tar.gz: 1393357178169a6e7edac86475c9c710d593761ca81a84173815af3f4f716ebff816c2d9afe83b9c20a972040923ee370f8c2de0645045e1ff9695df04b9bfb9
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Resque
|
2
|
+
module Plugins
|
3
|
+
module ExtfaceLonelyDevice
|
4
|
+
LOCK_TIMEOUT = 60 * 60 * 24 * 5 # 5 days
|
5
|
+
|
6
|
+
def lock_timeout
|
7
|
+
Time.now.to_i + LOCK_TIMEOUT + 1
|
8
|
+
end
|
9
|
+
|
10
|
+
def requeue_interval
|
11
|
+
self.instance_variable_get(:@requeue_interval) || 1
|
12
|
+
end
|
13
|
+
|
14
|
+
# Overwrite this method to uniquely identify which mutex should be used
|
15
|
+
# for a resque worker.
|
16
|
+
def redis_key(*args)
|
17
|
+
"extface_"
|
18
|
+
end
|
19
|
+
|
20
|
+
def can_lock_queue?(*args)
|
21
|
+
now = Time.now.to_i
|
22
|
+
key = redis_key(*args)
|
23
|
+
timeout = lock_timeout
|
24
|
+
|
25
|
+
# Per http://redis.io/commands/setnx
|
26
|
+
return true if Resque.redis.setnx(key, timeout)
|
27
|
+
return false if Resque.redis.get(key).to_i > now
|
28
|
+
return true if Resque.redis.getset(key, timeout).to_i <= now
|
29
|
+
return false
|
30
|
+
end
|
31
|
+
|
32
|
+
def unlock_queue(*args)
|
33
|
+
Resque.redis.del(redis_key(*args))
|
34
|
+
end
|
35
|
+
|
36
|
+
def reenqueue(*args)
|
37
|
+
Resque.enqueue_to(redis_key(*args), self, *args)
|
38
|
+
end
|
39
|
+
|
40
|
+
def before_perform(*args)
|
41
|
+
unless can_lock_queue?(*args)
|
42
|
+
# Sleep so the CPU's rest
|
43
|
+
sleep(requeue_interval)
|
44
|
+
|
45
|
+
# can't get the lock, so re-enqueue the task
|
46
|
+
reenqueue(*args)
|
47
|
+
|
48
|
+
# and don't perform
|
49
|
+
raise Resque::Job::DontPerform
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def around_perform(*args)
|
54
|
+
begin
|
55
|
+
yield
|
56
|
+
ensure
|
57
|
+
unlock_queue(*args)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module Billing
|
65
|
+
class IssueFiscalDoc
|
66
|
+
extend Resque::Plugins::ExtfaceLonelyDevice
|
67
|
+
|
68
|
+
def self.redis_key(bill_id)
|
69
|
+
"extface_#{Bill.find(bill_id).extface_job.device_id}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.perform(bill_id)
|
73
|
+
bill = Bill.find(bill_id)
|
74
|
+
qname = "extface_#{bill.extface_job.device_id}"
|
75
|
+
wjs = Resque::Worker.working.find_all{ |w| w.job && w.job['queue'] == qname }
|
76
|
+
|
77
|
+
p "############################"
|
78
|
+
p "d: #{bill.extface_job.device_id} Issue Fiscal Doc ##{bill_id}, job: #{bill.extface_job_id}, wjs: #{wjs.inspect}"
|
79
|
+
p "____________________________"
|
80
|
+
p "active jobs: #{bill.extface_job.device.jobs.active.count}"
|
81
|
+
|
82
|
+
|
83
|
+
bill.extface_job.runtime do |s|
|
84
|
+
return unless bill.fiscalizable?
|
85
|
+
operator_mapping = bill.find_operator_mapping_for(s)
|
86
|
+
s.notify "Fiscal Doc Start"
|
87
|
+
s.autofix_unclosed_doc
|
88
|
+
s.open_fiscal_doc(operator_mapping.try(:mapping), operator_mapping.try(:pwd))
|
89
|
+
s.notify "Register Sale"
|
90
|
+
bill.charges.each do |charge|
|
91
|
+
neto, percent_ratio = nil, nil, nil
|
92
|
+
if modifier = charge.modifier
|
93
|
+
neto = modifier.fixed_value
|
94
|
+
percent_ratio = modifier.percent_ratio unless neto.present?
|
95
|
+
end
|
96
|
+
if charge.price.zero? #printing comments with zero charges (TODO check zero charges allowed?)
|
97
|
+
s.add_comment charge.text
|
98
|
+
else
|
99
|
+
s.add_sale(
|
100
|
+
s.class::SaleItem.new(
|
101
|
+
price: charge.price.to_f,
|
102
|
+
text1: charge.name,
|
103
|
+
text2: charge.description,
|
104
|
+
tax_group: charge.find_tax_group_mapping_for(s), #find tax group mapping by ratio , not nice
|
105
|
+
qty: charge.qty,
|
106
|
+
neto: neto,
|
107
|
+
percent_ratio: percent_ratio #TODO check format
|
108
|
+
)
|
109
|
+
)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
if global_modifier_value = bill.global_modifier_value
|
113
|
+
s.notify "Register Global Modifier"
|
114
|
+
s.add_total_modifier global_modifier_value.to_f
|
115
|
+
end
|
116
|
+
s.notify "Register Payment"
|
117
|
+
bill.payments.each do |payment|
|
118
|
+
s.add_payment payment.value.to_f, payment.find_payment_type_mapping_for(s)
|
119
|
+
end
|
120
|
+
s.notify "Close Fiscal Receipt"
|
121
|
+
s.close_fiscal_doc
|
122
|
+
s.notify "Fiscal Doc End"
|
123
|
+
end
|
124
|
+
rescue Resque::TermException
|
125
|
+
reenqueue(bill_id)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
data/app/models/billing/bill.rb
CHANGED
@@ -39,6 +39,7 @@ module Billing
|
|
39
39
|
self.name = "B:#{number}" if name.nil?
|
40
40
|
end
|
41
41
|
before_save :perform_autofin, if: :becomes_paid?
|
42
|
+
after_save :create_fiscal_job, if: :fiscalizable?
|
42
43
|
|
43
44
|
validates_numericality_of :total, greater_than_or_equal_to: 0
|
44
45
|
validates_numericality_of :balance, less_than_or_equal_to: 0
|
@@ -89,8 +90,9 @@ module Billing
|
|
89
90
|
end
|
90
91
|
|
91
92
|
def fiscalize(detailed = false)
|
92
|
-
|
93
|
-
self.extface_job if
|
93
|
+
#TODO create resque job
|
94
|
+
#self.extface_job = origin.fiscal_device.driver.fiscalize(self, detailed) if fiscalizable? && origin.try(:fiscal_device)
|
95
|
+
#self.extface_job if save
|
94
96
|
end
|
95
97
|
|
96
98
|
def global_modifier_value
|
@@ -108,6 +110,10 @@ module Billing
|
|
108
110
|
# get operator, who close/pay the bill?
|
109
111
|
#operator.operator_fiscal_driver_mapping.find_by(extface_driver_id: fiscal_driver.id) if fiscal_driver.fiscal?
|
110
112
|
end
|
113
|
+
|
114
|
+
def fiscalizable?
|
115
|
+
self.finalized_at.present? && payments.select(&:fiscal?).any? && origin.try(:fiscal_device) && balance.zero?
|
116
|
+
end
|
111
117
|
|
112
118
|
private
|
113
119
|
def calculate_modifiers
|
@@ -153,17 +159,26 @@ module Billing
|
|
153
159
|
end
|
154
160
|
|
155
161
|
def perform_autofin
|
162
|
+
p "!!!!!!!!!!perform_autofin"
|
156
163
|
if autofin
|
157
164
|
self.finalized_at = Time.now
|
158
|
-
if defined?
|
159
|
-
self.extface_job = origin.fiscal_device.driver.fiscalize(self) if fiscalizable? && origin.try(:fiscal_device)
|
165
|
+
if defined?(Extface) && fiscalizable? && device = origin.try(:fiscal_device)
|
166
|
+
#self.extface_job = origin.fiscal_device.driver.fiscalize(self) if fiscalizable? && origin.try(:fiscal_device)
|
167
|
+
self.extface_job = device.jobs.new
|
160
168
|
end
|
161
169
|
end
|
162
170
|
true
|
163
171
|
end
|
164
172
|
|
165
|
-
def
|
166
|
-
|
173
|
+
def create_fiscal_job
|
174
|
+
if self.extface_job_id_changed? && defined?(Resque) && defined?(Extface) && device = origin.try(:fiscal_device)
|
175
|
+
p "device: #{device.try(:id)}"
|
176
|
+
p "self: #{self.try(:id)}"
|
177
|
+
p "self.finalized_at changed: #{self.finalized_at_changed?}"
|
178
|
+
|
179
|
+
Resque.enqueue_to("extface_#{device.id}", Billing::IssueFiscalDoc, self.id)
|
180
|
+
end
|
181
|
+
true
|
167
182
|
end
|
168
183
|
|
169
184
|
end
|
data/lib/billing/engine.rb
CHANGED
data/lib/billing/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: billing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7f
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Vangelov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: resque
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: sqlite3
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -76,6 +90,7 @@ files:
|
|
76
90
|
- MIT-LICENSE
|
77
91
|
- README.rdoc
|
78
92
|
- Rakefile
|
93
|
+
- app/jobs/billing/issue_fiscal_doc.rb
|
79
94
|
- app/models/billing/bill.rb
|
80
95
|
- app/models/billing/charge.rb
|
81
96
|
- app/models/billing/department.rb
|
@@ -253,7 +268,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
253
268
|
version: 1.3.1
|
254
269
|
requirements: []
|
255
270
|
rubyforge_project:
|
256
|
-
rubygems_version: 2.
|
271
|
+
rubygems_version: 2.5.0
|
257
272
|
signing_key:
|
258
273
|
specification_version: 4
|
259
274
|
summary: Billing for Rails 4 app
|