dorsale 3.13.0 → 3.14.0
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/CHANGELOG.md +4 -0
- data/app/assets/javascripts/dorsale/engines/{billing_machine.coffee → billing_machine.coffee.erb} +10 -6
- data/app/models/dorsale/billing_machine.rb +7 -0
- data/app/models/dorsale/billing_machine/invoice.rb +6 -2
- data/app/models/dorsale/billing_machine/quotation.rb +5 -1
- data/lib/dorsale/version.rb +1 -1
- data/spec/models/dorsale/billing_machine/invoice_line_spec.rb +2 -2
- data/spec/models/dorsale/billing_machine/invoice_spec.rb +40 -23
- data/spec/models/dorsale/billing_machine/quotation_line_spec.rb +2 -2
- data/spec/models/dorsale/billing_machine/quotation_spec.rb +40 -23
- data/spec/models/dorsale/billing_machine_spec.rb +49 -27
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebdaffde3d6482e50a41707f99a6e11672e92d70217bc78a53998597643c6f7a
|
4
|
+
data.tar.gz: 89a6e804ec650c078e4fc40fdd88c2261e625c889c6125daee6dc90870ed66b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c37a324dc797b8b2b0fabfe48c23a115d838b462fd54b7f6bde6548897a7e266983c0576c059cbf1694db245c0102de1725ef4b36c133b9d8ac98841b88c47d
|
7
|
+
data.tar.gz: 21fdf0df6905f79ba1b0acac5d044723e50e15507a39729eea45578f7daf672ab1f4ec024aea193696156470772f3e35da1e9c59349e93a64b0d8042e4609e7c
|
data/CHANGELOG.md
CHANGED
data/app/assets/javascripts/dorsale/engines/{billing_machine.coffee → billing_machine.coffee.erb}
RENAMED
@@ -1,5 +1,7 @@
|
|
1
1
|
@BillingMachine = {}
|
2
2
|
|
3
|
+
BillingMachine.vat_round_by_line = <%= Dorsale::BillingMachine.vat_round_by_line %>
|
4
|
+
|
3
5
|
BillingMachine.settings =
|
4
6
|
precision : 2
|
5
7
|
thousand : " " # nbsp
|
@@ -18,7 +20,7 @@ BillingMachine.num2str = (num) ->
|
|
18
20
|
accounting.formatNumber(num, settings.precision, settings.thousand, settings.decimal)
|
19
21
|
|
20
22
|
BillingMachine.round2 = (num) ->
|
21
|
-
return +(Math.round(num + "e+2")
|
23
|
+
return +(Math.round(num + "e+2") + "e-2")
|
22
24
|
|
23
25
|
BillingMachine.updateTotals = ->
|
24
26
|
total_excluding_taxes = 0.0
|
@@ -42,7 +44,7 @@ BillingMachine.updateTotals = ->
|
|
42
44
|
discount_rate = commercial_discount / raw_total_excluding_taxes
|
43
45
|
|
44
46
|
# VAT amount based on each line total with discount rate
|
45
|
-
|
47
|
+
total_vat_amount = 0.0
|
46
48
|
$("#billing_machine-form .line").map ->
|
47
49
|
return if parseInt($(this).find("input[name*=destroy]").val()) == 1
|
48
50
|
|
@@ -55,11 +57,13 @@ BillingMachine.updateTotals = ->
|
|
55
57
|
|
56
58
|
line_total = BillingMachine.str2num $(this).find(".line-total input").val()
|
57
59
|
discounted_line_total = line_total - (line_total * discount_rate)
|
58
|
-
line_vat_amount =
|
59
|
-
|
60
|
-
|
60
|
+
line_vat_amount = discounted_line_total * vat_rate / 100
|
61
|
+
line_vat_amount = BillingMachine.round2(line_vat_amount) if BillingMachine.vat_round_by_line
|
62
|
+
total_vat_amount += line_vat_amount
|
63
|
+
total_vat_amount = BillingMachine.round2(total_vat_amount)
|
64
|
+
$(".vat_amount input").val BillingMachine.num2str total_vat_amount
|
61
65
|
|
62
|
-
total_including_taxes = total_excluding_taxes +
|
66
|
+
total_including_taxes = total_excluding_taxes + total_vat_amount
|
63
67
|
$(".total_including_taxes input").val BillingMachine.num2str total_including_taxes
|
64
68
|
|
65
69
|
# Advances is for invoices only, not for quotations
|
@@ -13,6 +13,13 @@ module Dorsale::BillingMachine
|
|
13
13
|
@vat_mode = new_mode
|
14
14
|
end
|
15
15
|
|
16
|
+
def vat_round_by_line
|
17
|
+
@vat_round_by_line = false if @vat_round_by_line.nil?
|
18
|
+
@vat_round_by_line
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_writer :vat_round_by_line
|
22
|
+
|
16
23
|
def invoice_pdf_model
|
17
24
|
"::Dorsale::BillingMachine::Invoice#{vat_mode.to_s.capitalize}VatPdf".constantize
|
18
25
|
end
|
@@ -57,7 +57,7 @@ class Dorsale::BillingMachine::Invoice < ::Dorsale::ApplicationRecord
|
|
57
57
|
lines.each(&:update_total)
|
58
58
|
apply_vat_rate_to_lines
|
59
59
|
|
60
|
-
lines_sum = lines.map(&:total).sum
|
60
|
+
lines_sum = lines.map(&:total).sum.round(2)
|
61
61
|
|
62
62
|
self.total_excluding_taxes = lines_sum - commercial_discount
|
63
63
|
|
@@ -71,9 +71,13 @@ class Dorsale::BillingMachine::Invoice < ::Dorsale::ApplicationRecord
|
|
71
71
|
|
72
72
|
lines.each do |line|
|
73
73
|
line_total = line.total - (line.total * discount_rate)
|
74
|
-
|
74
|
+
line_vat = (line_total * line.vat_rate / 100.0)
|
75
|
+
line_vat = line_vat.round(2) if Dorsale::BillingMachine.vat_round_by_line
|
76
|
+
self.vat_amount += line_vat
|
75
77
|
end
|
76
78
|
|
79
|
+
self.vat_amount = vat_amount.round(2)
|
80
|
+
|
77
81
|
self.total_including_taxes = total_excluding_taxes + vat_amount
|
78
82
|
self.balance = total_including_taxes - advance
|
79
83
|
end
|
@@ -76,9 +76,13 @@ class Dorsale::BillingMachine::Quotation < ::Dorsale::ApplicationRecord
|
|
76
76
|
|
77
77
|
lines.each do |line|
|
78
78
|
line_total = line.total - (line.total * discount_rate)
|
79
|
-
|
79
|
+
line_vat = (line_total * line.vat_rate / 100.0)
|
80
|
+
line_vat = line_vat.round(2) if Dorsale::BillingMachine.vat_round_by_line
|
81
|
+
self.vat_amount += line_vat
|
80
82
|
end
|
81
83
|
|
84
|
+
self.vat_amount = vat_amount.round(2)
|
85
|
+
|
82
86
|
self.total_including_taxes = total_excluding_taxes + vat_amount
|
83
87
|
end
|
84
88
|
|
data/lib/dorsale/version.rb
CHANGED
@@ -42,11 +42,11 @@ describe Dorsale::BillingMachine::InvoiceLine, type: :model do
|
|
42
42
|
|
43
43
|
it "should update the total upon save" do
|
44
44
|
line = create(:billing_machine_invoice_line, quantity: 12.34, unit_price: 12.34, total: 0)
|
45
|
-
expect(line.total).to eq
|
45
|
+
expect(line.total.to_f).to eq 152.28
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should update the total gracefully with invalid data" do
|
49
49
|
line = create(:billing_machine_invoice_line, quantity: nil, unit_price: nil, total: 0)
|
50
|
-
expect(line.total).to eq
|
50
|
+
expect(line.total.to_f).to eq 0
|
51
51
|
end
|
52
52
|
end
|
@@ -202,30 +202,47 @@ describe Dorsale::BillingMachine::Invoice, type: :model do
|
|
202
202
|
expect(invoice.balance).to eq(108)
|
203
203
|
end
|
204
204
|
|
205
|
-
|
206
|
-
invoice
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
:
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
:
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
205
|
+
describe "VAT round" do
|
206
|
+
let(:invoice) {
|
207
|
+
invoice = create(:billing_machine_invoice,
|
208
|
+
:commercial_discount => 0,
|
209
|
+
)
|
210
|
+
|
211
|
+
create(:billing_machine_invoice_line,
|
212
|
+
:quantity => 12.34,
|
213
|
+
:unit_price => 12.34,
|
214
|
+
:vat_rate => 20,
|
215
|
+
:invoice => invoice,
|
216
|
+
) # vat 30.45512 / total 152.2756
|
217
|
+
|
218
|
+
create(:billing_machine_invoice_line,
|
219
|
+
:quantity => 12.34,
|
220
|
+
:unit_price => 12.34,
|
221
|
+
:vat_rate => 20,
|
222
|
+
:invoice => invoice,
|
223
|
+
) # vat 30.45512 / total 152.2756
|
224
|
+
|
225
|
+
invoice
|
226
|
+
}
|
227
|
+
|
228
|
+
after { Dorsale::BillingMachine.vat_round_by_line = nil }
|
229
|
+
|
230
|
+
it "should round VAT by line" do
|
231
|
+
Dorsale::BillingMachine.vat_round_by_line = true
|
232
|
+
expect(invoice.total_excluding_taxes.to_f).to eq(304.56)
|
233
|
+
expect(invoice.vat_amount.to_f).to eq(60.92)
|
234
|
+
expect(invoice.total_including_taxes.to_f).to eq(365.48)
|
235
|
+
expect(invoice.balance.to_f).to eq(365.48)
|
236
|
+
end
|
223
237
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
238
|
+
it "should round VAT globally" do
|
239
|
+
Dorsale::BillingMachine.vat_round_by_line = false
|
240
|
+
expect(invoice.total_excluding_taxes.to_f).to eq(304.56)
|
241
|
+
expect(invoice.vat_amount.to_f).to eq(60.91)
|
242
|
+
expect(invoice.total_including_taxes.to_f).to eq(365.47)
|
243
|
+
expect(invoice.balance.to_f).to eq(365.47)
|
244
|
+
end
|
245
|
+
end # describe "VAT round"
|
229
246
|
|
230
247
|
it "should work fine even with empty lines" do
|
231
248
|
invoice = create(:billing_machine_invoice)
|
@@ -41,11 +41,11 @@ describe Dorsale::BillingMachine::QuotationLine do
|
|
41
41
|
|
42
42
|
it "should update the total upon save" do
|
43
43
|
line = create(:billing_machine_quotation_line, quantity: 12.34, unit_price: 12.34, total: 0)
|
44
|
-
expect(line.total).to eq
|
44
|
+
expect(line.total.to_f).to eq 152.28
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should update the total gracefully with invalid data" do
|
48
48
|
line = create(:billing_machine_quotation_line, quantity: nil, unit_price: nil, total: 0)
|
49
|
-
expect(line.total).to eq
|
49
|
+
expect(line.total.to_f).to eq 0
|
50
50
|
end
|
51
51
|
end
|
@@ -152,30 +152,47 @@ describe Dorsale::BillingMachine::Quotation do
|
|
152
152
|
Dorsale::BillingMachine.vat_mode = :single
|
153
153
|
end
|
154
154
|
|
155
|
-
|
156
|
-
quotation
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
:
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
:
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
155
|
+
describe "VAT round" do
|
156
|
+
let(:quotation) {
|
157
|
+
quotation = create(:billing_machine_quotation,
|
158
|
+
:commercial_discount => 0,
|
159
|
+
)
|
160
|
+
|
161
|
+
create(:billing_machine_quotation_line,
|
162
|
+
:quantity => 12.34,
|
163
|
+
:unit_price => 12.34,
|
164
|
+
:vat_rate => 20,
|
165
|
+
:quotation => quotation,
|
166
|
+
) # vat 30.45512 / total 152.2756
|
167
|
+
|
168
|
+
create(:billing_machine_quotation_line,
|
169
|
+
:quantity => 12.34,
|
170
|
+
:unit_price => 12.34,
|
171
|
+
:vat_rate => 20,
|
172
|
+
:quotation => quotation,
|
173
|
+
) # vat 30.45512 / total 152.2756
|
174
|
+
|
175
|
+
quotation
|
176
|
+
}
|
177
|
+
|
178
|
+
after { Dorsale::BillingMachine.vat_round_by_line = nil }
|
179
|
+
|
180
|
+
it "should round VAT by line" do
|
181
|
+
Dorsale::BillingMachine.vat_round_by_line = true
|
182
|
+
expect(quotation.total_excluding_taxes.to_f).to eq(304.56)
|
183
|
+
expect(quotation.vat_amount.to_f).to eq(60.92)
|
184
|
+
expect(quotation.total_including_taxes.to_f).to eq(365.48)
|
185
|
+
expect(quotation.balance.to_f).to eq(365.48)
|
186
|
+
end
|
173
187
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
188
|
+
it "should round VAT globally" do
|
189
|
+
Dorsale::BillingMachine.vat_round_by_line = false
|
190
|
+
expect(quotation.total_excluding_taxes.to_f).to eq(304.56)
|
191
|
+
expect(quotation.vat_amount.to_f).to eq(60.91)
|
192
|
+
expect(quotation.total_including_taxes.to_f).to eq(365.47)
|
193
|
+
expect(quotation.balance.to_f).to eq(365.47)
|
194
|
+
end
|
195
|
+
end # describe "VAT round" do
|
179
196
|
|
180
197
|
it "should work fine even with empty lines" do
|
181
198
|
quotation = create(:billing_machine_quotation, commercial_discount: nil)
|
@@ -5,31 +5,53 @@ RSpec.describe Dorsale::BillingMachine do
|
|
5
5
|
::Dorsale::BillingMachine
|
6
6
|
}
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
8
|
+
describe "::vat_mode" do
|
9
|
+
it "default vat_mode should be :single" do
|
10
|
+
expect(bm.vat_mode).to eq :single
|
11
|
+
expect(bm.invoice_pdf_model).to eq Dorsale::BillingMachine::InvoiceSingleVatPdf
|
12
|
+
expect(bm.quotation_pdf_model).to eq Dorsale::BillingMachine::QuotationSingleVatPdf
|
13
|
+
end
|
14
|
+
|
15
|
+
it "vat_mode should accept :multiple value" do
|
16
|
+
bm.vat_mode = :multiple
|
17
|
+
expect(bm.vat_mode).to eq :multiple
|
18
|
+
expect(bm.invoice_pdf_model).to eq Dorsale::BillingMachine::InvoiceMultipleVatPdf
|
19
|
+
expect(bm.quotation_pdf_model).to eq Dorsale::BillingMachine::QuotationMultipleVatPdf
|
20
|
+
end
|
21
|
+
|
22
|
+
it "vat_mode should not accept :abc value" do
|
23
|
+
expect {
|
24
|
+
bm.vat_mode = :abc
|
25
|
+
}.to raise_error(RuntimeError)
|
26
|
+
end
|
27
|
+
end # describe "::vat_mode"
|
28
|
+
|
29
|
+
describe "::vat_round_by_line" do
|
30
|
+
after { Dorsale::BillingMachine.vat_round_by_line = nil }
|
31
|
+
|
32
|
+
it "should return default value" do
|
33
|
+
expect(Dorsale::BillingMachine.vat_round_by_line).to eq false
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should assign false value" do
|
37
|
+
Dorsale::BillingMachine.vat_round_by_line = false
|
38
|
+
expect(Dorsale::BillingMachine.vat_round_by_line).to eq false
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should assign true value" do
|
42
|
+
Dorsale::BillingMachine.vat_round_by_line = true
|
43
|
+
expect(Dorsale::BillingMachine.vat_round_by_line).to eq true
|
44
|
+
end
|
45
|
+
end # describe "::vat_round_by_line"
|
46
|
+
|
47
|
+
describe "::default_currency" do
|
48
|
+
it "default currency should be €" do
|
49
|
+
expect(bm.default_currency).to eq "€"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "assign an other default currency" do
|
53
|
+
bm.default_currency = "$"
|
54
|
+
expect(bm.default_currency).to eq "$"
|
55
|
+
end
|
56
|
+
end # describe "::default_currency"
|
35
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dorsale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- agilidée
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -433,7 +433,7 @@ files:
|
|
433
433
|
- app/assets/javascripts/dorsale/dependencies.coffee
|
434
434
|
- app/assets/javascripts/dorsale/engines.coffee
|
435
435
|
- app/assets/javascripts/dorsale/engines/alexandrie.coffee
|
436
|
-
- app/assets/javascripts/dorsale/engines/billing_machine.coffee
|
436
|
+
- app/assets/javascripts/dorsale/engines/billing_machine.coffee.erb
|
437
437
|
- app/assets/javascripts/dorsale/engines/customer_vault.coffee
|
438
438
|
- app/assets/javascripts/dorsale/engines/flyboy.coffee
|
439
439
|
- app/assets/javascripts/url.min.js
|