payday 1.1.3 → 1.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/.rubocop.yml +8 -0
- data/CHANGELOG.md +6 -0
- data/Rakefile +6 -6
- data/lib/generators/payday/setup/setup_generator.rb +15 -15
- data/lib/payday.rb +14 -14
- data/lib/payday/config.rb +7 -8
- data/lib/payday/invoice.rb +1 -2
- data/lib/payday/invoiceable.rb +12 -14
- data/lib/payday/line_item.rb +5 -5
- data/lib/payday/line_itemable.rb +1 -1
- data/lib/payday/locale/de.yml +1 -0
- data/lib/payday/pdf_renderer.rb +241 -217
- data/lib/payday/version.rb +1 -2
- data/payday.gemspec +14 -9
- data/spec/assets/testing.pdf +0 -0
- data/spec/invoice_spec.rb +74 -58
- data/spec/line_item_spec.rb +5 -6
- data/spec/pdf_renderer_spec.rb +7 -7
- data/spec/spec_helper.rb +2 -2
- data/spec/support/asset_matchers.rb +8 -7
- metadata +15 -14
data/lib/payday/version.rb
CHANGED
data/payday.gemspec
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
$LOAD_PATH.push File.expand_path("../lib", __FILE__)
|
3
3
|
require "payday/version"
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
@@ -8,19 +8,24 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Alan Johnson"]
|
10
10
|
s.email = ["alan@commondream.net"]
|
11
|
-
s.homepage = ""
|
12
|
-
s.summary =
|
13
|
-
s.description =
|
11
|
+
s.homepage = "https://github.com/commondream/payday"
|
12
|
+
s.summary = "A simple library for rendering invoices."
|
13
|
+
s.description = <<-EOF
|
14
|
+
Payday is a library for rendering invoices. At present it supports rendering
|
15
|
+
invoices to pdfs, but we're planning on adding support for other formats in
|
16
|
+
the near future.
|
17
|
+
EOF
|
14
18
|
|
15
19
|
s.add_dependency("prawn", "~> 1.0.0")
|
16
|
-
s.add_dependency("money", "~> 6.
|
20
|
+
s.add_dependency("money", "~> 6.5")
|
17
21
|
s.add_dependency("prawn-svg", "~> 0.15.0.0")
|
18
|
-
s.add_dependency("i18n", "
|
22
|
+
s.add_dependency("i18n", "~> 0.7")
|
19
23
|
|
20
24
|
s.add_development_dependency("rspec", "~> 3.1.0")
|
21
25
|
|
22
|
-
s.files
|
23
|
-
s.test_files
|
24
|
-
s.executables
|
26
|
+
s.files = `git ls-files`.split("\n")
|
27
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
28
|
+
s.executables =
|
29
|
+
`git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
25
30
|
s.require_paths = ["lib"]
|
26
31
|
end
|
data/spec/assets/testing.pdf
CHANGED
Binary file
|
data/spec/invoice_spec.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
module Payday
|
4
4
|
describe Invoice do
|
5
5
|
|
6
6
|
it "should be able to be initalized with a hash of options" do
|
7
|
-
i = Invoice.new(:
|
8
|
-
:
|
9
|
-
|
10
|
-
|
11
|
-
:
|
12
|
-
:
|
7
|
+
i = Invoice.new(invoice_number: 20, bill_to: "Here", ship_to: "There",
|
8
|
+
notes: "These are some notes.",
|
9
|
+
line_items:
|
10
|
+
[LineItem.new(price: 10, quantity: 3, description: "Shirts")],
|
11
|
+
shipping_rate: 15.00, shipping_description: "USPS Priority Mail:",
|
12
|
+
tax_rate: 0.125, tax_description: "Local Sales Tax, 12.5%",
|
13
|
+
invoice_date: Date.civil(1993, 4, 12))
|
13
14
|
|
14
15
|
expect(i.invoice_number).to eq(20)
|
15
16
|
expect(i.bill_to).to eq("Here")
|
@@ -27,58 +28,61 @@ module Payday
|
|
27
28
|
i = Invoice.new
|
28
29
|
|
29
30
|
# $100 in Pants
|
30
|
-
i.line_items << LineItem.new(:
|
31
|
+
i.line_items << LineItem.new(price: 20, quantity: 5, description: "Pants")
|
31
32
|
|
32
33
|
# $30 in Shirts
|
33
|
-
i.line_items <<
|
34
|
+
i.line_items <<
|
35
|
+
LineItem.new(price: 10, quantity: 3, description: "Shirts")
|
34
36
|
|
35
37
|
# $1000 in Hats
|
36
|
-
i.line_items << LineItem.new(:
|
38
|
+
i.line_items << LineItem.new(price: 5, quantity: 200, description: "Hats")
|
37
39
|
|
38
40
|
expect(i.subtotal).to eq(BigDecimal.new("1130"))
|
39
41
|
end
|
40
42
|
|
41
|
-
it "should calculate the correct tax
|
42
|
-
i = Invoice.new(:
|
43
|
-
i.line_items << LineItem.new(:
|
43
|
+
it "should calculate the correct tax rounded to two decimal places" do
|
44
|
+
i = Invoice.new(tax_rate: 0.1)
|
45
|
+
i.line_items << LineItem.new(price: 20, quantity: 5, description: "Pants")
|
44
46
|
|
45
47
|
expect(i.tax).to eq(BigDecimal.new("10"))
|
46
48
|
end
|
47
49
|
|
48
|
-
it "shouldn't apply taxes to invoices with
|
49
|
-
i = Invoice.new(:
|
50
|
-
i.line_items << LineItem.new(:
|
50
|
+
it "shouldn't apply taxes to invoices with subtotal <= 0" do
|
51
|
+
i = Invoice.new(tax_rate: 0.1)
|
52
|
+
i.line_items << LineItem.new(price: -1, quantity: 100,
|
53
|
+
description: "Negative Priced Pants")
|
51
54
|
|
52
55
|
expect(i.tax).to eq(BigDecimal.new("0"))
|
53
56
|
end
|
54
57
|
|
55
58
|
it "should calculate the total for an invoice correctly" do
|
56
|
-
i = Invoice.new(:
|
59
|
+
i = Invoice.new(tax_rate: 0.1)
|
57
60
|
|
58
61
|
# $100 in Pants
|
59
|
-
i.line_items << LineItem.new(:
|
62
|
+
i.line_items << LineItem.new(price: 20, quantity: 5, description: "Pants")
|
60
63
|
|
61
64
|
# $30 in Shirts
|
62
|
-
i.line_items <<
|
65
|
+
i.line_items <<
|
66
|
+
LineItem.new(price: 10, quantity: 3, description: "Shirts")
|
63
67
|
|
64
68
|
# $1000 in Hats
|
65
|
-
i.line_items << LineItem.new(:
|
69
|
+
i.line_items << LineItem.new(price: 5, quantity: 200, description: "Hats")
|
66
70
|
|
67
71
|
expect(i.total).to eq(BigDecimal.new("1243"))
|
68
72
|
end
|
69
73
|
|
70
74
|
it "is overdue when it's past date and unpaid" do
|
71
|
-
i = Invoice.new(:
|
75
|
+
i = Invoice.new(due_at: Date.today - 1)
|
72
76
|
expect(i.overdue?).to eq(true)
|
73
77
|
end
|
74
78
|
|
75
79
|
it "isn't overdue when past due date and paid" do
|
76
|
-
i = Invoice.new(:
|
80
|
+
i = Invoice.new(due_at: Date.today - 1, paid_at: Date.today)
|
77
81
|
expect(i.overdue?).not_to eq(true)
|
78
82
|
end
|
79
83
|
|
80
84
|
it "is overdue when due date is a time before the current date" do
|
81
|
-
i = Invoice.new(:
|
85
|
+
i = Invoice.new(due_at: Time.parse("Jan 1 14:33:20 GMT 2011"))
|
82
86
|
expect(i.overdue?).to eq(true)
|
83
87
|
end
|
84
88
|
|
@@ -88,7 +92,7 @@ module Payday
|
|
88
92
|
end
|
89
93
|
|
90
94
|
it "should be refunded when marked as refunded" do
|
91
|
-
i = Invoice.new(:
|
95
|
+
i = Invoice.new(refunded_at: Date.today)
|
92
96
|
expect(i.refunded?).to eq(true)
|
93
97
|
end
|
94
98
|
|
@@ -98,37 +102,38 @@ module Payday
|
|
98
102
|
end
|
99
103
|
|
100
104
|
it "should be paid when marked as paid" do
|
101
|
-
i = Invoice.new(:
|
105
|
+
i = Invoice.new(paid_at: Date.today)
|
102
106
|
expect(i.paid?).to eq(true)
|
103
107
|
end
|
104
108
|
|
105
109
|
it "should be able to iterate over details" do
|
106
|
-
i = Invoice.new(:
|
110
|
+
i = Invoice.new(invoice_details: [%w(Test Yes), %w(Awesome Absolutely)])
|
107
111
|
details = []
|
108
112
|
i.each_detail do |key, value|
|
109
113
|
details << [key, value]
|
110
114
|
end
|
111
115
|
|
112
116
|
expect(details.length).to eq(2)
|
113
|
-
expect(details).to include(
|
114
|
-
expect(details).to include(
|
117
|
+
expect(details).to include(%w(Test Yes))
|
118
|
+
expect(details).to include(%w(Awesome Absolutely))
|
115
119
|
end
|
116
120
|
|
117
121
|
it "should be able to iterate through invoice_details as a hash" do
|
118
|
-
i = Invoice.new(:
|
122
|
+
i = Invoice.new(invoice_details:
|
123
|
+
{ "Test" => "Yes", "Awesome" => "Absolutely" })
|
119
124
|
details = []
|
120
125
|
i.each_detail do |key, value|
|
121
126
|
details << [key, value]
|
122
127
|
end
|
123
128
|
|
124
129
|
expect(details.length).to eq(2)
|
125
|
-
expect(details).to include(
|
126
|
-
expect(details).to include(
|
130
|
+
expect(details).to include(%w(Test Yes))
|
131
|
+
expect(details).to include(%w(Awesome Absolutely))
|
127
132
|
end
|
128
133
|
|
129
134
|
describe "rendering" do
|
130
135
|
before do
|
131
|
-
Dir.mkdir("tmp") unless File.
|
136
|
+
Dir.mkdir("tmp") unless File.exist?("tmp")
|
132
137
|
Config.default.reset
|
133
138
|
end
|
134
139
|
|
@@ -136,58 +141,69 @@ module Payday
|
|
136
141
|
let(:invoice_params) { {} }
|
137
142
|
|
138
143
|
it "should render to a file" do
|
139
|
-
File.unlink("tmp/testing.pdf") if File.
|
144
|
+
File.unlink("tmp/testing.pdf") if File.exist?("tmp/testing.pdf")
|
140
145
|
|
141
146
|
invoice.render_pdf_to_file("tmp/testing.pdf")
|
142
147
|
|
143
|
-
expect(File.
|
148
|
+
expect(File.exist?("tmp/testing.pdf")).to be true
|
144
149
|
end
|
145
150
|
|
146
|
-
context
|
147
|
-
let(:invoice_params)
|
148
|
-
|
149
|
-
|
151
|
+
context "with some invoice details" do
|
152
|
+
let(:invoice_params) do
|
153
|
+
{
|
154
|
+
invoice_details: {
|
155
|
+
"Ordered By:" => "Alan Johnson",
|
156
|
+
"Paid By:" => "Dude McDude"
|
157
|
+
}
|
158
|
+
}
|
159
|
+
end
|
150
160
|
|
151
161
|
it "should render an invoice correctly" do
|
152
|
-
Payday::Config.default.company_details =
|
162
|
+
Payday::Config.default.company_details = <<-EOF
|
163
|
+
10 This Way
|
164
|
+
Manhattan, NY 10001
|
165
|
+
800-111-2222
|
166
|
+
awesome@awesomecorp.com
|
167
|
+
EOF
|
153
168
|
|
154
169
|
invoice.line_items += [
|
155
|
-
LineItem.new(:
|
156
|
-
LineItem.new(:
|
157
|
-
LineItem.new(:
|
170
|
+
LineItem.new(price: 20, quantity: 5, description: "Pants"),
|
171
|
+
LineItem.new(price: 10, quantity: 3, description: "Shirts"),
|
172
|
+
LineItem.new(price: 5, quantity: 200, description: "Hats")
|
158
173
|
] * 30
|
159
174
|
|
160
|
-
expect(invoice.render_pdf).to match_binary_asset
|
175
|
+
expect(invoice.render_pdf).to match_binary_asset "testing.pdf"
|
161
176
|
end
|
162
177
|
end
|
163
178
|
|
164
|
-
context
|
179
|
+
context "paid, with an svg logo" do
|
165
180
|
before do
|
166
|
-
|
181
|
+
logo = { filename: "spec/assets/tiger.svg", size: "100x100" }
|
182
|
+
Payday::Config.default.invoice_logo = logo
|
167
183
|
end
|
168
184
|
|
169
|
-
let(:invoice_params) { { :
|
185
|
+
let(:invoice_params) { { paid_at: Date.civil(2012, 2, 22) } }
|
170
186
|
|
171
|
-
it
|
187
|
+
it "should render an invoice correctly" do
|
172
188
|
invoice.line_items += [
|
173
|
-
LineItem.new(:
|
174
|
-
LineItem.new(:
|
175
|
-
LineItem.new(:
|
189
|
+
LineItem.new(price: 20, quantity: 5, description: "Pants"),
|
190
|
+
LineItem.new(price: 10, quantity: 3, description: "Shirts"),
|
191
|
+
LineItem.new(price: 5, quantity: 200.0, description: "Hats")
|
176
192
|
] * 3
|
177
193
|
|
178
|
-
expect(invoice.render_pdf).to match_binary_asset
|
194
|
+
expect(invoice.render_pdf).to match_binary_asset "svg.pdf"
|
179
195
|
end
|
180
196
|
end
|
181
197
|
|
182
198
|
def new_invoice(params = {})
|
183
199
|
default_params = {
|
184
|
-
:
|
185
|
-
:
|
186
|
-
:
|
187
|
-
:
|
188
|
-
:
|
189
|
-
:
|
190
|
-
:
|
200
|
+
tax_rate: 0.1,
|
201
|
+
notes: "These are some crazy awesome notes!",
|
202
|
+
invoice_number: 12,
|
203
|
+
invoice_date: Date.civil(2011, 1, 1),
|
204
|
+
due_at: Date.civil(2011, 1, 22),
|
205
|
+
bill_to: "Alan Johnson\n101 This Way\nSomewhere, SC 22222",
|
206
|
+
ship_to: "Frank Johnson\n101 That Way\nOther, SC 22229"
|
191
207
|
}
|
192
208
|
|
193
209
|
Invoice.new(default_params.merge(params))
|
data/spec/line_item_spec.rb
CHANGED
@@ -1,26 +1,25 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
module Payday
|
4
4
|
describe LineItem do
|
5
5
|
it "should be able to be initilized with a price" do
|
6
|
-
li = LineItem.new(:
|
6
|
+
li = LineItem.new(price: BigDecimal.new("20"))
|
7
7
|
expect(li.price).to eq(BigDecimal.new("20"))
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should be able to be initialized with a quantity" do
|
11
|
-
li = LineItem.new(:
|
11
|
+
li = LineItem.new(quantity: 30)
|
12
12
|
expect(li.quantity).to eq(BigDecimal.new("30"))
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should be able to be initlialized with a description" do
|
16
|
-
li = LineItem.new(:
|
16
|
+
li = LineItem.new(description: "12 Pairs of Pants")
|
17
17
|
expect(li.description).to eq("12 Pairs of Pants")
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should return the correct amount" do
|
21
|
-
li = LineItem.new(:
|
21
|
+
li = LineItem.new(price: 10, quantity: 12)
|
22
22
|
expect(li.amount).to eq(BigDecimal.new("120"))
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
data/spec/pdf_renderer_spec.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
module Payday
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
describe PdfRenderer do
|
5
|
+
describe ".number_to_currency" do
|
6
|
+
it "formats numbers to currency currectly" do
|
7
|
+
expect(PdfRenderer.number_to_currency(20, nil)).to eq("$20.00")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
11
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "../lib/payday"
|
2
2
|
|
3
3
|
# Requires supporting ruby files with custom matchers and macros, etc, in
|
4
4
|
# spec/support/ and its subdirectories.
|
5
5
|
Dir["spec/support/**/*.rb"].each { |f| require f[5..-1] }
|
6
6
|
|
7
|
-
RSpec.configure do |
|
7
|
+
RSpec.configure do |_config|
|
8
8
|
# some (optional) config here
|
9
9
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require "fileutils"
|
2
2
|
|
3
3
|
# Usage: expect(renderer.render).to match_binary_asset('pdf/test.pdf')
|
4
4
|
RSpec::Matchers.define(:match_binary_asset) do |file_name|
|
5
5
|
match do |actual_output|
|
6
|
-
expected_path = File.join(
|
6
|
+
expected_path = File.join("spec/assets", file_name)
|
7
7
|
expected_output = File.binread(expected_path)
|
8
8
|
|
9
9
|
(actual_output == expected_output).tap do |result|
|
10
10
|
unless result
|
11
|
-
output_path = File.join(
|
11
|
+
output_path = File.join("tmp/rendered_output", file_name)
|
12
12
|
|
13
13
|
FileUtils.mkdir_p(File.dirname(output_path))
|
14
14
|
File.open(output_path, "wb") { |f| f.write actual_output }
|
@@ -16,10 +16,11 @@ RSpec::Matchers.define(:match_binary_asset) do |file_name|
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
failure_message do |
|
20
|
-
expected_output_path = File.join(
|
21
|
-
actual_output_path = File.join(
|
19
|
+
failure_message do |_actual_output|
|
20
|
+
expected_output_path = File.join("spec/assets", file_name)
|
21
|
+
actual_output_path = File.join("tmp/rendered_output", file_name)
|
22
22
|
|
23
|
-
"expected output to match '#{expected_output_path}'
|
23
|
+
"expected output to match '#{expected_output_path}' "\
|
24
|
+
"(see #{actual_output_path})"
|
24
25
|
end
|
25
26
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: payday
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alan Johnson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prawn
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '6.
|
33
|
+
version: '6.5'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '6.
|
40
|
+
version: '6.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: prawn-svg
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: i18n
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: '0.7'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: '0.7'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,9 +80,10 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 3.1.0
|
83
|
-
description:
|
84
|
-
|
85
|
-
|
83
|
+
description: |2
|
84
|
+
Payday is a library for rendering invoices. At present it supports rendering
|
85
|
+
invoices to pdfs, but we're planning on adding support for other formats in
|
86
|
+
the near future.
|
86
87
|
email:
|
87
88
|
- alan@commondream.net
|
88
89
|
executables: []
|
@@ -91,6 +92,7 @@ extra_rdoc_files: []
|
|
91
92
|
files:
|
92
93
|
- ".gitattributes"
|
93
94
|
- ".gitignore"
|
95
|
+
- ".rubocop.yml"
|
94
96
|
- ".ruby-version"
|
95
97
|
- CHANGELOG.md
|
96
98
|
- Gemfile
|
@@ -126,7 +128,7 @@ files:
|
|
126
128
|
- spec/pdf_renderer_spec.rb
|
127
129
|
- spec/spec_helper.rb
|
128
130
|
- spec/support/asset_matchers.rb
|
129
|
-
homepage:
|
131
|
+
homepage: https://github.com/commondream/payday
|
130
132
|
licenses: []
|
131
133
|
metadata: {}
|
132
134
|
post_install_message:
|
@@ -148,7 +150,7 @@ rubyforge_project:
|
|
148
150
|
rubygems_version: 2.2.2
|
149
151
|
signing_key:
|
150
152
|
specification_version: 4
|
151
|
-
summary:
|
153
|
+
summary: A simple library for rendering invoices.
|
152
154
|
test_files:
|
153
155
|
- spec/assets/default_logo.png
|
154
156
|
- spec/assets/svg.pdf
|
@@ -159,4 +161,3 @@ test_files:
|
|
159
161
|
- spec/pdf_renderer_spec.rb
|
160
162
|
- spec/spec_helper.rb
|
161
163
|
- spec/support/asset_matchers.rb
|
162
|
-
has_rdoc:
|