receipts 0.2.3 → 1.0.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/.gitignore +1 -0
- data/CHANGELOG.md +3 -0
- data/README.md +44 -1
- data/Rakefile +55 -0
- data/examples/gorails.png +0 -0
- data/examples/invoice.pdf +0 -0
- data/examples/receipt.pdf +0 -0
- data/lib/receipts.rb +1 -0
- data/lib/receipts/invoice.rb +123 -0
- data/lib/receipts/receipt.rb +1 -1
- data/lib/receipts/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0877b9dcbd189ff86a0ab1f19c2635f1842be92a0490d33e1ad2276c201a11b0'
|
4
|
+
data.tar.gz: a5bbe668f1945390a64ff96ffd01c09b9b42bd2d68c8e4169a0d2209affaf9e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 300e387def1da02f4da69aebdb9a7e891ad35a5236a25889a9af06945f7ee9dac4ce50c6d10d45ad9faa3b38c61460025b22558ce5b9c7643c332c8aa51e0f0f
|
7
|
+
data.tar.gz: 0bede300b10b2c9bcc53cfccec438aca595f0b7a19ba673fb83851f7c2e56a313e609ee94f4896d072d54c99fe82e3b0fde28fa7832bff27e89fa45cc8186d81
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
Receipts for your Rails application that works with any payment provider.
|
6
6
|
|
7
|
-
Check out
|
7
|
+
Check out the [example receipt](https://github.com/excid3/receipts/blob/master/examples/receipt.pdf?raw=true) and [example invoice](https://github.com/excid3/receipts/blob/master/examples/invoice.pdf?raw=true) PDFs.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -170,6 +170,49 @@ resources :charges
|
|
170
170
|
<%= link_to "Download Receipt", charge_path(@charge, format: :pdf) %>
|
171
171
|
```
|
172
172
|
|
173
|
+
## Invoices
|
174
|
+
|
175
|
+
Invoices follow the exact same set of steps as above, with a few minor changes and have a few extra arguments you can use:
|
176
|
+
|
177
|
+
* `issue_date` - Date the invoice was issued
|
178
|
+
|
179
|
+
* `due_date` - Date the invoice payment is due
|
180
|
+
|
181
|
+
* `status` - A status for the invoice (Pending, Paid, etc)
|
182
|
+
|
183
|
+
* `bill_to` - A string or Array of lines with billing details
|
184
|
+
|
185
|
+
You can also use line_items to flexibly generate and display the table with items in it, including subtotal, taxes, and total amount.
|
186
|
+
|
187
|
+
```ruby
|
188
|
+
Receipts::Invoice.new(
|
189
|
+
id: "123",
|
190
|
+
issue_date: Date.today,
|
191
|
+
due_date: Date.today + 30,
|
192
|
+
status: "<b><color rgb='#5eba7d'>PAID</color></b>",
|
193
|
+
bill_to: [
|
194
|
+
"GoRails, LLC",
|
195
|
+
"Address",
|
196
|
+
"City, State Zipcode",
|
197
|
+
nil,
|
198
|
+
"mail@example.com",
|
199
|
+
],
|
200
|
+
company: {
|
201
|
+
name: "GoRails, LLC",
|
202
|
+
address: "123 Fake Street\nNew York City, NY 10012",
|
203
|
+
email: "support@example.com",
|
204
|
+
logo: File.expand_path("./examples/gorails.png")
|
205
|
+
},
|
206
|
+
line_items: [
|
207
|
+
["<b>Item</b>", "<b>Unit Cost</b>", "<b>Quantity</b>", "<b>Amount</b>"],
|
208
|
+
["GoRails Subscription", "$19.00", "1", "$19.00"],
|
209
|
+
[nil, nil, "Subtotal", "$19.00"],
|
210
|
+
[nil, nil, "Tax Rate", "0%"],
|
211
|
+
[nil, nil, "Total", "$19.00"],
|
212
|
+
],
|
213
|
+
)
|
214
|
+
```
|
215
|
+
|
173
216
|
## Contributing
|
174
217
|
|
175
218
|
1. Fork it ( https://github.com/[my-github-username]/receipts/fork )
|
data/Rakefile
CHANGED
@@ -10,3 +10,58 @@ task :test => :spec
|
|
10
10
|
task :console do
|
11
11
|
exec "irb -r receipts -I ./lib"
|
12
12
|
end
|
13
|
+
|
14
|
+
task :receipt do
|
15
|
+
require "./lib/receipts"
|
16
|
+
|
17
|
+
Receipts::Receipt.new(
|
18
|
+
id: "123",
|
19
|
+
subheading: "RECEIPT FOR CHARGE #1",
|
20
|
+
product: "GoRails",
|
21
|
+
company: {
|
22
|
+
name: "GoRails, LLC",
|
23
|
+
address: "123 Fake Street\nNew York City, NY 10012",
|
24
|
+
email: "support@example.com",
|
25
|
+
logo: File.expand_path("./examples/gorails.png")
|
26
|
+
},
|
27
|
+
line_items: [
|
28
|
+
["Date", Time.now.to_s],
|
29
|
+
["Account Billed", "Example User (user@example.com)"],
|
30
|
+
["Product", "GoRails"],
|
31
|
+
["Amount", "$19.00"],
|
32
|
+
["Charged to", "Visa (**** **** **** 1234)"],
|
33
|
+
["Transaction ID", "123456"]
|
34
|
+
],
|
35
|
+
).render_file "examples/receipt.pdf"
|
36
|
+
end
|
37
|
+
|
38
|
+
task :invoice do
|
39
|
+
require "./lib/receipts"
|
40
|
+
|
41
|
+
Receipts::Invoice.new(
|
42
|
+
id: "123",
|
43
|
+
issue_date: Date.today,
|
44
|
+
due_date: Date.today + 30,
|
45
|
+
status: "<b><color rgb='#5eba7d'>PAID</color></b>",
|
46
|
+
bill_to: [
|
47
|
+
"GoRails, LLC",
|
48
|
+
"Address",
|
49
|
+
"City, State Zipcode",
|
50
|
+
nil,
|
51
|
+
"mail@example.com",
|
52
|
+
],
|
53
|
+
company: {
|
54
|
+
name: "GoRails, LLC",
|
55
|
+
address: "123 Fake Street\nNew York City, NY 10012",
|
56
|
+
email: "support@example.com",
|
57
|
+
logo: File.expand_path("./examples/gorails.png")
|
58
|
+
},
|
59
|
+
line_items: [
|
60
|
+
["<b>Item</b>", "<b>Unit Cost</b>", "<b>Quantity</b>", "<b>Amount</b>"],
|
61
|
+
["GoRails Subscription", "$19.00", "1", "$19.00"],
|
62
|
+
[nil, nil, "Subtotal", "$19.00"],
|
63
|
+
[nil, nil, "Tax Rate", "0%"],
|
64
|
+
[nil, nil, "Amount Due", "$19.00"],
|
65
|
+
],
|
66
|
+
).render_file "examples/invoice.pdf"
|
67
|
+
end
|
Binary file
|
Binary file
|
data/examples/receipt.pdf
CHANGED
Binary file
|
data/lib/receipts.rb
CHANGED
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'prawn'
|
2
|
+
require 'prawn/table'
|
3
|
+
|
4
|
+
module Receipts
|
5
|
+
class Invoice < Prawn::Document
|
6
|
+
attr_reader :attributes, :id, :company, :custom_font, :line_items, :logo, :message, :product, :subheading, :bill_to, :issue_date, :due_date, :status
|
7
|
+
|
8
|
+
def initialize(attributes)
|
9
|
+
@attributes = attributes
|
10
|
+
@id = attributes.fetch(:id)
|
11
|
+
@company = attributes.fetch(:company)
|
12
|
+
@line_items = attributes.fetch(:line_items)
|
13
|
+
@custom_font = attributes.fetch(:font, {})
|
14
|
+
@message = attributes.fetch(:message) { default_message }
|
15
|
+
@subheading = attributes.fetch(:subheading) { default_subheading }
|
16
|
+
@bill_to = Array(attributes.fetch(:bill_to)).join("\n")
|
17
|
+
@issue_date = attributes.fetch(:issue_date)
|
18
|
+
@due_date = attributes.fetch(:due_date)
|
19
|
+
@status = attributes.fetch(:status)
|
20
|
+
|
21
|
+
super(margin: 0)
|
22
|
+
|
23
|
+
setup_fonts if custom_font.any?
|
24
|
+
generate
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def default_message
|
30
|
+
"For questions, contact us anytime at <color rgb='326d92'><link href='mailto:#{company.fetch(:email)}?subject=Charge ##{id}'><b>#{company.fetch(:email)}</b></link></color>."
|
31
|
+
end
|
32
|
+
|
33
|
+
def default_subheading
|
34
|
+
"INVOICE #%{id}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def setup_fonts
|
38
|
+
font_families.update "Primary" => custom_font
|
39
|
+
font "Primary"
|
40
|
+
end
|
41
|
+
|
42
|
+
def generate
|
43
|
+
bounding_box [0, 792], width: 612, height: 792 do
|
44
|
+
bounding_box [85, 792], width: 442, height: 792 do
|
45
|
+
header
|
46
|
+
charge_details
|
47
|
+
footer
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def header
|
53
|
+
move_down 60
|
54
|
+
|
55
|
+
logo_path = company.fetch(:logo, '')
|
56
|
+
|
57
|
+
if logo_path.empty?
|
58
|
+
move_down 32
|
59
|
+
else
|
60
|
+
image open(logo_path), height: 32
|
61
|
+
end
|
62
|
+
|
63
|
+
move_down 8
|
64
|
+
label (subheading % {id: id})
|
65
|
+
|
66
|
+
move_down 10
|
67
|
+
|
68
|
+
# Cache the Y value so we can have both boxes at the same height
|
69
|
+
top = y
|
70
|
+
bounding_box([0, y], width: 200) do
|
71
|
+
label "BILL TO"
|
72
|
+
|
73
|
+
move_down 5
|
74
|
+
text_box bill_to, at: [0, cursor], width: 200, height: 75, inline_format: true, size: 10, leading: 4, overflow: :shrink_to_fit
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
bounding_box([250, top], width: 200) do
|
79
|
+
label "INVOICE DATE"
|
80
|
+
|
81
|
+
move_down 5
|
82
|
+
text issue_date.to_s, inline_format: true, size: 12, leading: 4
|
83
|
+
|
84
|
+
move_down 10
|
85
|
+
label "DUE DATE"
|
86
|
+
|
87
|
+
move_down 5
|
88
|
+
text due_date.to_s, inline_format: true, size: 12, leading: 4
|
89
|
+
|
90
|
+
move_down 10
|
91
|
+
label "STATUS"
|
92
|
+
|
93
|
+
move_down 5
|
94
|
+
text status, inline_format: true, size: 12, leading: 4
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def charge_details
|
99
|
+
move_down 30
|
100
|
+
|
101
|
+
borders = line_items.length - 2
|
102
|
+
|
103
|
+
table(line_items, cell_style: { border_color: 'cccccc', inline_format: true }) do
|
104
|
+
cells.padding = 12
|
105
|
+
cells.borders = []
|
106
|
+
row(0..borders).borders = [:bottom]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def footer
|
111
|
+
move_down 30
|
112
|
+
text message, inline_format: true, size: 12, leading: 4
|
113
|
+
|
114
|
+
move_down 30
|
115
|
+
text company.fetch(:name), inline_format: true
|
116
|
+
text "<color rgb='888888'>#{company.fetch(:address)}</color>", inline_format: true
|
117
|
+
end
|
118
|
+
|
119
|
+
def label(text)
|
120
|
+
text "<color rgb='a6a6a6'>#{text}</color>", inline_format: true, size: 8
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/lib/receipts/receipt.rb
CHANGED
@@ -68,7 +68,7 @@ module Receipts
|
|
68
68
|
|
69
69
|
borders = line_items.length - 2
|
70
70
|
|
71
|
-
table(line_items, cell_style: { border_color: 'cccccc' }) do
|
71
|
+
table(line_items, cell_style: { border_color: 'cccccc', inline_format: true }) do
|
72
72
|
cells.padding = 12
|
73
73
|
cells.borders = []
|
74
74
|
row(0..borders).borders = [:bottom]
|
data/lib/receipts/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: receipts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Oliver
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -124,12 +124,16 @@ files:
|
|
124
124
|
- ".github/FUNDING.yml"
|
125
125
|
- ".gitignore"
|
126
126
|
- ".travis.yml"
|
127
|
+
- CHANGELOG.md
|
127
128
|
- Gemfile
|
128
129
|
- LICENSE.txt
|
129
130
|
- README.md
|
130
131
|
- Rakefile
|
132
|
+
- examples/gorails.png
|
133
|
+
- examples/invoice.pdf
|
131
134
|
- examples/receipt.pdf
|
132
135
|
- lib/receipts.rb
|
136
|
+
- lib/receipts/invoice.rb
|
133
137
|
- lib/receipts/receipt.rb
|
134
138
|
- lib/receipts/version.rb
|
135
139
|
- receipts.gemspec
|