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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0466ac55f2ba9f07b0caac72cc9785a78ef44a0ce8ba507d9c8bb1ed81675a6
4
- data.tar.gz: d8daa107a52b0cfe63af6c8f1b927e0e590dd80a316893ce984a0a14f7d98829
3
+ metadata.gz: '0877b9dcbd189ff86a0ab1f19c2635f1842be92a0490d33e1ad2276c201a11b0'
4
+ data.tar.gz: a5bbe668f1945390a64ff96ffd01c09b9b42bd2d68c8e4169a0d2209affaf9e0
5
5
  SHA512:
6
- metadata.gz: 560016286cb1ea373742c3f855b8cb8677f0fb74ac4cfc90808f54efbca8955902f4775012697d2a0b85b8637bb3158d2250893745eaf6eb4b87fb011a7484ef
7
- data.tar.gz: f07a19f5860698341e9edddf96872297016c63fbc2a31c1d2c9cb2980ca69ebb98603aae6b020e0cb77e5bb18f2aa198a03859796221cf64fc66747c8276a2a0
6
+ metadata.gz: 300e387def1da02f4da69aebdb9a7e891ad35a5236a25889a9af06945f7ee9dac4ce50c6d10d45ad9faa3b38c61460025b22558ce5b9c7643c332c8aa51e0f0f
7
+ data.tar.gz: 0bede300b10b2c9bcc53cfccec438aca595f0b7a19ba673fb83851f7c2e56a313e609ee94f4896d072d54c99fe82e3b0fde28fa7832bff27e89fa45cc8186d81
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ .DS_Store
@@ -0,0 +1,3 @@
1
+ ### 1.0.0
2
+
3
+ * [NEW] Invoices!
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 an [example PDF receipt](https://github.com/excid3/receipts/blob/master/examples/receipt.pdf?raw=true)
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
Binary file
@@ -1,2 +1,3 @@
1
1
  require "receipts/version"
2
2
  require "receipts/receipt"
3
+ require "receipts/invoice"
@@ -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
@@ -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]
@@ -1,3 +1,3 @@
1
1
  module Receipts
2
- VERSION = "0.2.3"
2
+ VERSION = "1.0.0"
3
3
  end
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.2.3
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-01-29 00:00:00.000000000 Z
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