receipts 0.2.2 → 1.0.3

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: 42fd5e58ab95cd832a64807adf73afa1e9756316190dbe4819d0d0c634875c01
4
- data.tar.gz: 1295e9bc817000ef60a9b63112429716febd07e316d07cd8da164d4771622952
3
+ metadata.gz: 225c91cdad16636a1e15291e308eedce0d9e47c27e9fd831ab1a3870e2fe208d
4
+ data.tar.gz: a92e20ae450a54d5f78ce44955e8a20c14b672f740e41b6e877a328e8deee9ff
5
5
  SHA512:
6
- metadata.gz: d3bbc34ddee5fef59da9cbc2f5a8107a5ee1635a23e77241b42ac9e2f0d7a844db3a19e78603865e62be7adc58442c89e5ff0dc483bb1807e9113dd885acd330
7
- data.tar.gz: 9ee6b9e94669033b9a21a3fb9c064353ce2e24881caf5b5964a6639f3daf88df52b25ce054dabbd9c84b670615eb981e1684cd8c03c3139ac395b6d30d2143da
6
+ metadata.gz: 2a25e8b39b2f534353d7f4afe84169f31e76add4d709ca98c441f57f94b9b35e663c91854c8f77ab19d1ef7a880bc9a23d9e5b1194642d5a4b2d8ca400a82b02
7
+ data.tar.gz: 562bc42aacd3aea8f84e1ff23dd7b7d3da86cf8eb196679dad60e5621f5180a9b456c914a1d7519aba19fd77100ccc19e9d04c468efa582315c7548f8ffe4c79
@@ -0,0 +1,12 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: [excid3] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4
+ patreon: # Replace with a single Patreon username
5
+ open_collective: # Replace with a single Open Collective username
6
+ ko_fi: # Replace with a single Ko-fi username
7
+ tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
+ liberapay: # Replace with a single Liberapay username
10
+ issuehunt: # Replace with a single IssueHunt username
11
+ otechie: # Replace with a single Otechie username
12
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ .DS_Store
@@ -0,0 +1,15 @@
1
+ ### 1.0.3
2
+
3
+ * [FIX] Fixes typo introduced in 1.0.2
4
+
5
+ ### 1.0.2
6
+
7
+ * [NEW] Add ability to specify file-like objects for logo
8
+
9
+ ### 1.0.1
10
+
11
+ * [FIX] Make tables full width
12
+
13
+ ### 1.0.0
14
+
15
+ * [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
 
@@ -60,12 +60,13 @@ class Charge < ActiveRecord::Base
60
60
  def receipt
61
61
  Receipts::Receipt.new(
62
62
  id: id,
63
+ subheading: "RECEIPT FOR CHARGE #%{id}",
63
64
  product: "GoRails",
64
65
  company: {
65
- name: "One Month, Inc.",
66
- address: "37 Great Jones\nFloor 2\nNew York City, NY 10012",
67
- email: "teachers@onemonth.com",
68
- logo: Rails.root.join("app/assets/images/one-month-dark.png")
66
+ name: "GoRails, LLC.",
67
+ address: "123 Fake Street\nNew York City, NY 10012",
68
+ email: "support@example.com",
69
+ logo: Rails.root.join("app/assets/images/logo.png")
69
70
  },
70
71
  line_items: [
71
72
  ["Date", created_at.to_s],
@@ -104,11 +105,25 @@ Company consists of several required nested attributes.
104
105
  * `name` - **Required**
105
106
  * `address` - **Required**
106
107
  * `email` - **Required**
108
+ * `line_items` - **Required**
109
+
110
+ You can set as many line items on the receipts as you want. Just pass in an array with each item containing a name and a value to display on the receipt.
111
+
107
112
  * `logo` - *Optional*
108
113
 
109
- * `line_items` - **Required**
114
+ The logo must be either a string path to a file or a file-like object.
110
115
 
111
- You can set as many line items on the receipts as you want. Just pass in an array with each item containing a name and a value to display on the receipt.
116
+ ```ruby
117
+ logo: Rails.root.join("app/assets/images/logo.png")
118
+ # or
119
+ logo: File.open("app/assets/images/logo.png", "rb")
120
+ ```
121
+
122
+ To use an image from a URL, we recommend using `open-uri` to open the remote file as a StringIO object.
123
+
124
+ `require 'open-uri'`
125
+
126
+ `logo: URI.open("https://www.ruby-lang.org/images/header-ruby-logo@2x.png")`
112
127
 
113
128
  * `font` - *Optional*
114
129
 
@@ -169,9 +184,52 @@ resources :charges
169
184
  <%= link_to "Download Receipt", charge_path(@charge, format: :pdf) %>
170
185
  ```
171
186
 
187
+ ## Invoices
188
+
189
+ Invoices follow the exact same set of steps as above, with a few minor changes and have a few extra arguments you can use:
190
+
191
+ * `issue_date` - Date the invoice was issued
192
+
193
+ * `due_date` - Date the invoice payment is due
194
+
195
+ * `status` - A status for the invoice (Pending, Paid, etc)
196
+
197
+ * `bill_to` - A string or Array of lines with billing details
198
+
199
+ You can also use line_items to flexibly generate and display the table with items in it, including subtotal, taxes, and total amount.
200
+
201
+ ```ruby
202
+ Receipts::Invoice.new(
203
+ id: "123",
204
+ issue_date: Date.today,
205
+ due_date: Date.today + 30,
206
+ status: "<b><color rgb='#5eba7d'>PAID</color></b>",
207
+ bill_to: [
208
+ "GoRails, LLC",
209
+ "123 Fake Street",
210
+ "New York City, NY 10012",
211
+ nil,
212
+ "mail@example.com",
213
+ ],
214
+ company: {
215
+ name: "GoRails, LLC",
216
+ address: "123 Fake Street\nNew York City, NY 10012",
217
+ email: "support@example.com",
218
+ logo: File.expand_path("./examples/gorails.png")
219
+ },
220
+ line_items: [
221
+ ["<b>Item</b>", "<b>Unit Cost</b>", "<b>Quantity</b>", "<b>Amount</b>"],
222
+ ["GoRails Subscription", "$19.00", "1", "$19.00"],
223
+ [nil, nil, "Subtotal", "$19.00"],
224
+ [nil, nil, "Tax Rate", "0%"],
225
+ [nil, nil, "Total", "$19.00"],
226
+ ],
227
+ )
228
+ ```
229
+
172
230
  ## Contributing
173
231
 
174
- 1. Fork it ( https://github.com/[my-github-username]/receipts/fork )
232
+ 1. Fork it ( https://github.com/excid3/receipts/fork )
175
233
  2. Create your feature branch (`git checkout -b my-new-feature`)
176
234
  3. Commit your changes (`git commit -am 'Add some feature'`)
177
235
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
- require 'rspec/core/rake_task'
2
+ require "rspec/core/rake_task"
3
+ require "open-uri"
3
4
 
4
5
  RSpec::Core::RakeTask.new('spec')
5
6
 
@@ -10,3 +11,60 @@ task :test => :spec
10
11
  task :console do
11
12
  exec "irb -r receipts -I ./lib"
12
13
  end
14
+
15
+ task :receipt do
16
+ require "./lib/receipts"
17
+
18
+ Receipts::Receipt.new(
19
+ id: "123",
20
+ subheading: "RECEIPT FOR CHARGE #1",
21
+ product: "GoRails",
22
+ company: {
23
+ name: "GoRails, LLC",
24
+ address: "123 Fake Street\nNew York City, NY 10012",
25
+ email: "support@example.com",
26
+ logo: URI.open("https://www.ruby-lang.org/images/header-ruby-logo@2x.png")
27
+ },
28
+ line_items: [
29
+ ["Date", Time.now.to_s],
30
+ ["Account Billed", "Example User (user@example.com)"],
31
+ ["Product", "GoRails"],
32
+ ["Amount", "$19.00"],
33
+ ["Charged to", "Visa (**** **** **** 1234)"],
34
+ ["Transaction ID", "123456"]
35
+ ],
36
+ ).render_file "examples/receipt.pdf"
37
+ end
38
+
39
+ task :invoice do
40
+ require "./lib/receipts"
41
+
42
+ Receipts::Invoice.new(
43
+ id: "123",
44
+ issue_date: Date.today,
45
+ due_date: Date.today + 30,
46
+ status: "<b><color rgb='#5eba7d'>PAID</color></b>",
47
+ bill_to: [
48
+ "GoRails, LLC",
49
+ "Address",
50
+ "City, State Zipcode",
51
+ nil,
52
+ "mail@example.com",
53
+ ],
54
+ company: {
55
+ name: "GoRails, LLC",
56
+ address: "123 Fake Street\nNew York City, NY 10012",
57
+ email: "support@example.com",
58
+ #logo: Rails.root.join("app/assets/images/gorails.png")
59
+ #logo: File.expand_path("./examples/gorails.png")
60
+ logo: File.open("./examples/gorails.png")
61
+ },
62
+ line_items: [
63
+ ["<b>Item</b>", "<b>Unit Cost</b>", "<b>Quantity</b>", "<b>Amount</b>"],
64
+ ["GoRails Subscription", "$19.00", "1", "$19.00"],
65
+ [nil, nil, "Subtotal", "$19.00"],
66
+ [nil, nil, "Tax Rate", "0%"],
67
+ [nil, nil, "Amount Due", "$19.00"],
68
+ ],
69
+ ).render_file "examples/invoice.pdf"
70
+ 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,125 @@
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 = company[:logo]
56
+
57
+ if logo.nil?
58
+ move_down 32
59
+ elsif logo.is_a?(String)
60
+ image open(logo), height: 32
61
+ else
62
+ image logo, height: 32
63
+ end
64
+
65
+ move_down 8
66
+ label (subheading % {id: id})
67
+
68
+ move_down 10
69
+
70
+ # Cache the Y value so we can have both boxes at the same height
71
+ top = y
72
+ bounding_box([0, y], width: 200) do
73
+ label "BILL TO"
74
+
75
+ move_down 5
76
+ text_box bill_to, at: [0, cursor], width: 200, height: 75, inline_format: true, size: 10, leading: 4, overflow: :shrink_to_fit
77
+
78
+ end
79
+
80
+ bounding_box([250, top], width: 200) do
81
+ label "INVOICE DATE"
82
+
83
+ move_down 5
84
+ text issue_date.to_s, inline_format: true, size: 12, leading: 4
85
+
86
+ move_down 10
87
+ label "DUE DATE"
88
+
89
+ move_down 5
90
+ text due_date.to_s, inline_format: true, size: 12, leading: 4
91
+
92
+ move_down 10
93
+ label "STATUS"
94
+
95
+ move_down 5
96
+ text status, inline_format: true, size: 12, leading: 4
97
+ end
98
+ end
99
+
100
+ def charge_details
101
+ move_down 30
102
+
103
+ borders = line_items.length - 2
104
+
105
+ table(line_items, width: bounds.width, cell_style: { border_color: 'cccccc', inline_format: true }) do
106
+ cells.padding = 12
107
+ cells.borders = []
108
+ row(0..borders).borders = [:bottom]
109
+ end
110
+ end
111
+
112
+ def footer
113
+ move_down 30
114
+ text message, inline_format: true, size: 12, leading: 4
115
+
116
+ move_down 30
117
+ text company.fetch(:name), inline_format: true
118
+ text "<color rgb='888888'>#{company.fetch(:address)}</color>", inline_format: true
119
+ end
120
+
121
+ def label(text)
122
+ text "<color rgb='a6a6a6'>#{text}</color>", inline_format: true, size: 8
123
+ end
124
+ end
125
+ end
@@ -48,10 +48,14 @@ module Receipts
48
48
  def header
49
49
  move_down 60
50
50
 
51
- if company.has_key? :logo
52
- image open(company.fetch(:logo)), height: 32
53
- else
51
+ logo = company[:logo]
52
+
53
+ if logo.nil?
54
54
  move_down 32
55
+ elsif logo.is_a?(String)
56
+ image open(logo), height: 32
57
+ else
58
+ image logo, height: 32
55
59
  end
56
60
 
57
61
  move_down 8
@@ -66,7 +70,7 @@ module Receipts
66
70
 
67
71
  borders = line_items.length - 2
68
72
 
69
- table(line_items, cell_style: { border_color: 'cccccc' }) do
73
+ table(line_items, width: bounds.width, cell_style: { border_color: 'cccccc', inline_format: true }) do
70
74
  cells.padding = 12
71
75
  cells.borders = []
72
76
  row(0..borders).borders = [:bottom]
@@ -1,3 +1,3 @@
1
1
  module Receipts
2
- VERSION = "0.2.2"
2
+ VERSION = "1.0.3"
3
3
  end
@@ -18,11 +18,12 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.7"
21
+ spec.add_development_dependency "bundler"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
23
  spec.add_development_dependency "rspec"
24
24
  spec.add_development_dependency "pry"
25
25
 
26
26
  spec.add_dependency 'prawn', '>= 1.3.0', '< 3.0.0'
27
27
  spec.add_dependency 'prawn-table', '~> 0.2.1'
28
+ spec.add_dependency 'ttfunk', '~> 1.5.1'
28
29
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: receipts
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Oliver
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-03 00:00:00.000000000 Z
11
+ date: 2020-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -100,6 +100,20 @@ dependencies:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
102
  version: 0.2.1
103
+ - !ruby/object:Gem::Dependency
104
+ name: ttfunk
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 1.5.1
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 1.5.1
103
117
  description: Receipts for your Rails application that works with any payment provider.
104
118
  email:
105
119
  - excid3@gmail.com
@@ -107,14 +121,19 @@ executables: []
107
121
  extensions: []
108
122
  extra_rdoc_files: []
109
123
  files:
124
+ - ".github/FUNDING.yml"
110
125
  - ".gitignore"
111
126
  - ".travis.yml"
127
+ - CHANGELOG.md
112
128
  - Gemfile
113
129
  - LICENSE.txt
114
130
  - README.md
115
131
  - Rakefile
132
+ - examples/gorails.png
133
+ - examples/invoice.pdf
116
134
  - examples/receipt.pdf
117
135
  - lib/receipts.rb
136
+ - lib/receipts/invoice.rb
118
137
  - lib/receipts/receipt.rb
119
138
  - lib/receipts/version.rb
120
139
  - receipts.gemspec
@@ -124,7 +143,7 @@ homepage: ''
124
143
  licenses:
125
144
  - MIT
126
145
  metadata: {}
127
- post_install_message:
146
+ post_install_message:
128
147
  rdoc_options: []
129
148
  require_paths:
130
149
  - lib
@@ -139,9 +158,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
158
  - !ruby/object:Gem::Version
140
159
  version: '0'
141
160
  requirements: []
142
- rubyforge_project:
143
- rubygems_version: 2.7.6
144
- signing_key:
161
+ rubygems_version: 3.1.4
162
+ signing_key:
145
163
  specification_version: 4
146
164
  summary: Receipts for your Rails application that works with any payment provider.
147
165
  test_files: