receipts 1.1.2 → 2.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.
File without changes
Binary file
data/examples/invoice.pdf CHANGED
Binary file
data/examples/receipt.pdf CHANGED
Binary file
Binary file
@@ -0,0 +1,102 @@
1
+ module Receipts
2
+ class Base < Prawn::Document
3
+ attr_accessor :title, :company
4
+
5
+ class << self
6
+ attr_reader :title
7
+ end
8
+
9
+ def initialize(attributes = {})
10
+ super(page_size: "LETTER")
11
+ setup_fonts attributes[:font]
12
+
13
+ @title = attributes.fetch(:title, self.class.title)
14
+
15
+ generate_from(attributes)
16
+ end
17
+
18
+ def generate_from(attributes)
19
+ return if attributes.empty?
20
+
21
+ company = attributes.fetch(:company)
22
+ header company: company
23
+ render_details attributes.fetch(:details)
24
+ render_billing_details company: company, recipient: attributes.fetch(:recipient)
25
+ render_line_items attributes.fetch(:line_items)
26
+ render_footer attributes.fetch(:footer, default_message(company: company))
27
+ end
28
+
29
+ def setup_fonts(custom_font = nil)
30
+ if !!custom_font
31
+ font_families.update "Primary" => custom_font
32
+ font "Primary"
33
+ end
34
+
35
+ font_size 8
36
+ end
37
+
38
+ def load_image(logo)
39
+ if logo.is_a? String
40
+ logo.start_with?("http") ? URI.parse(logo).open : File.open(logo)
41
+ else
42
+ logo
43
+ end
44
+ end
45
+
46
+ def header(company: {}, height: 16)
47
+ logo = company[:logo]
48
+
49
+ if logo.nil?
50
+ text company.fetch(:name), align: :right, style: :bold, size: 16, color: "4b5563"
51
+ else
52
+ image load_image(logo), height: height, position: :right
53
+ end
54
+
55
+ move_up height
56
+ text title, style: :bold, size: 16
57
+ end
58
+
59
+ def render_details(details, margin_top: 16)
60
+ move_down margin_top
61
+ table(details, cell_style: {borders: [], inline_format: true, padding: [0, 8, 2, 0]})
62
+ end
63
+
64
+ def render_billing_details(company:, recipient:, margin_top: 16)
65
+ move_down margin_top
66
+
67
+ company_details = [
68
+ company[:address],
69
+ company[:phone],
70
+ company[:email]
71
+ ].compact.join("\n")
72
+
73
+ line_items = [
74
+ [
75
+ {content: "<b>#{company.fetch(:name)}</b>\n#{company_details}", padding: [0, 12, 0, 0]},
76
+ {content: Array(recipient).join("\n"), padding: [0, 12, 0, 0]}
77
+ ]
78
+ ]
79
+ table(line_items, width: bounds.width, cell_style: {borders: [], inline_format: true, overflow: :expand})
80
+ end
81
+
82
+ def render_line_items(line_items, margin_top: 30)
83
+ move_down margin_top
84
+
85
+ borders = line_items.length - 2
86
+ table(line_items, width: bounds.width, cell_style: {border_color: "eeeeee", inline_format: true}) do
87
+ cells.padding = 6
88
+ cells.borders = []
89
+ row(0..borders).borders = [:bottom]
90
+ end
91
+ end
92
+
93
+ def render_footer(message, margin_top: 30)
94
+ move_down margin_top
95
+ text message, inline_format: true
96
+ end
97
+
98
+ def default_message(company:)
99
+ "For questions, contact us anytime at <color rgb='326d92'><link href='mailto:#{company.fetch(:email)}?subject=Question about my receipt'><b>#{company.fetch(:email)}</b></link></color>."
100
+ end
101
+ end
102
+ end
@@ -1,91 +1,5 @@
1
- require "prawn"
2
- require "prawn/table"
3
-
4
1
  module Receipts
5
2
  class Invoice < Base
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(page_size: "LETTER")
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 generate
38
- header
39
- description
40
- invoice_details
41
- charge_details
42
- footer
43
- end
44
-
45
- def header(height: 24)
46
- logo = company[:logo]
47
- return if logo.nil?
48
- image load_image(logo), height: height
49
- end
50
-
51
- def description
52
- move_down 8
53
- text label(subheading % {id: id}), inline_format: true, leading: 4
54
- end
55
-
56
- def invoice_details
57
- move_down 10
58
- font_size 9
59
-
60
- line_items = [
61
- [{content: "#{label("BILL TO")}\n#{bill_to}", rowspan: 3, padding: [0, 12, 0, 0]}, "#{label("INVOICE DATE")}\n#{issue_date}"],
62
- ["#{label("DUE DATE")}\n#{due_date}"],
63
- ["#{label("STATUS")}\n#{status}"]
64
- ]
65
- table(line_items, width: bounds.width, cell_style: {inline_format: true, overflow: :shrink_to_fit}) do
66
- cells.borders = []
67
- end
68
- end
69
-
70
- def charge_details
71
- move_down 30
72
-
73
- borders = line_items.length - 2
74
-
75
- table(line_items, width: bounds.width, cell_style: {border_color: "cccccc", inline_format: true, overflow: :shrink_to_fit}) do
76
- cells.padding = 10
77
- cells.borders = []
78
- row(0..borders).borders = [:bottom]
79
- end
80
- end
81
-
82
- def footer
83
- move_down 30
84
- text message, inline_format: true, leading: 4
85
-
86
- move_down 30
87
- text company.fetch(:name), inline_format: true
88
- text "<color rgb='888888'>#{company.fetch(:address)}</color>", inline_format: true
89
- end
3
+ @title = "Invoice"
90
4
  end
91
5
  end
@@ -1,70 +1,5 @@
1
1
  module Receipts
2
2
  class Receipt < Base
3
- attr_reader :attributes, :id, :company, :custom_font, :line_items, :logo, :message, :product, :subheading
4
-
5
- def initialize(attributes)
6
- @attributes = attributes
7
- @id = attributes.fetch(:id)
8
- @company = attributes.fetch(:company)
9
- @line_items = attributes.fetch(:line_items)
10
- @custom_font = attributes.fetch(:font, {})
11
- @message = attributes.fetch(:message) { default_message }
12
- @subheading = attributes.fetch(:subheading) { default_subheading }
13
-
14
- super(page_size: "LETTER")
15
-
16
- setup_fonts if custom_font.any?
17
- generate
18
- end
19
-
20
- private
21
-
22
- def default_message
23
- "We've received your payment for #{attributes.fetch(:product)}. You can keep this receipt for your records. 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>."
24
- end
25
-
26
- def default_subheading
27
- "RECEIPT FOR CHARGE #%{id}"
28
- end
29
-
30
- def generate
31
- header
32
- description
33
- charge_details
34
- footer
35
- end
36
-
37
- def header(height: 24)
38
- logo = company[:logo]
39
- return if logo.nil?
40
- image load_image(logo), height: height
41
- end
42
-
43
- def description
44
- move_down 8
45
- text "<color rgb='a6a6a6'>#{subheading % {id: id}}</color>", inline_format: true
46
-
47
- move_down 30
48
- text message, inline_format: true, leading: 4
49
- end
50
-
51
- def charge_details
52
- move_down 30
53
- font_size 9
54
-
55
- borders = line_items.length - 2
56
-
57
- table(line_items, width: bounds.width, cell_style: {border_color: "cccccc", inline_format: true}) do
58
- cells.padding = 10
59
- cells.borders = []
60
- row(0..borders).borders = [:bottom]
61
- end
62
- end
63
-
64
- def footer
65
- move_down 45
66
- text company.fetch(:name), inline_format: true
67
- text "<color rgb='888888'>#{company.fetch(:address)}</color>", inline_format: true
68
- end
3
+ @title = "Receipt"
69
4
  end
70
5
  end
@@ -1,88 +1,5 @@
1
1
  module Receipts
2
2
  class Statement < Base
3
- attr_reader :attributes, :id, :company, :custom_font, :line_items, :logo, :message, :product, :subheading, :bill_to, :issue_date, :start_date, :end_date
4
-
5
- def initialize(attributes)
6
- @attributes = attributes
7
- @id = attributes.fetch(:id)
8
- @company = attributes.fetch(:company)
9
- @line_items = attributes.fetch(:line_items)
10
- @custom_font = attributes.fetch(:font, {})
11
- @message = attributes.fetch(:message) { default_message }
12
- @subheading = attributes.fetch(:subheading) { default_subheading }
13
- @bill_to = Array(attributes.fetch(:bill_to)).join("\n")
14
- @issue_date = attributes.fetch(:issue_date)
15
- @start_date = attributes.fetch(:start_date)
16
- @end_date = attributes.fetch(:end_date)
17
-
18
- super(page_size: "LETTER")
19
-
20
- setup_fonts if custom_font.any?
21
- generate
22
- end
23
-
24
- private
25
-
26
- def default_message
27
- "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>."
28
- end
29
-
30
- def default_subheading
31
- "STATEMENT #%{id}"
32
- end
33
-
34
- def generate
35
- header
36
- description
37
- statement_details
38
- charge_details
39
- footer
40
- end
41
-
42
- def header(height: 24)
43
- logo = company[:logo]
44
- return if logo.nil?
45
- image load_image(logo), height: height
46
- end
47
-
48
- def description
49
- move_down 8
50
- text label(subheading % {id: id}), inline_format: true, leading: 4
51
- end
52
-
53
- def statement_details
54
- move_down 10
55
- font_size 9
56
-
57
- line_items = [
58
- [{content: "#{label("BILL TO")}\n#{bill_to}", rowspan: 3, padding: [0, 12, 0, 0]}, "#{label("INVOICE DATE")}\n#{issue_date}"],
59
- ["#{label("STATEMENT DATE")}\n#{issue_date}"],
60
- ["#{label("STATEMENT PERIOD")}\n#{start_date} - #{end_date}"]
61
- ]
62
- table(line_items, width: bounds.width, cell_style: {inline_format: true, overflow: :shrink_to_fit}) do
63
- cells.borders = []
64
- end
65
- end
66
-
67
- def charge_details
68
- move_down 30
69
-
70
- borders = line_items.length - 2
71
-
72
- table(line_items, width: bounds.width, cell_style: {border_color: "cccccc", inline_format: true}) do
73
- cells.padding = 10
74
- cells.borders = []
75
- row(0..borders).borders = [:bottom]
76
- end
77
- end
78
-
79
- def footer
80
- move_down 30
81
- text message, inline_format: true, leading: 4
82
-
83
- move_down 30
84
- text company.fetch(:name), inline_format: true
85
- text "<color rgb='888888'>#{company.fetch(:address)}</color>", inline_format: true
86
- end
3
+ @title = "Statement"
87
4
  end
88
5
  end
@@ -1,3 +1,3 @@
1
1
  module Receipts
2
- VERSION = "1.1.2"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/receipts.rb CHANGED
@@ -4,26 +4,8 @@ require "prawn"
4
4
  require "prawn/table"
5
5
 
6
6
  module Receipts
7
+ autoload :Base, "receipts/base"
7
8
  autoload :Invoice, "receipts/invoice"
8
9
  autoload :Receipt, "receipts/receipt"
9
10
  autoload :Statement, "receipts/statement"
10
-
11
- class Base < Prawn::Document
12
- def setup_fonts
13
- font_families.update "Primary" => custom_font
14
- font "Primary"
15
- end
16
-
17
- def load_image(logo)
18
- if logo.is_a? String
19
- logo.start_with?("http") ? URI.parse(logo).open : File.open(logo)
20
- else
21
- logo
22
- end
23
- end
24
-
25
- def label(text)
26
- "<font size='8'><color rgb='a6a6a6'>#{text}</color></font>"
27
- end
28
- end
29
11
  end
data/receipts.gemspec CHANGED
@@ -1,27 +1,32 @@
1
- lib = File.expand_path("../lib", __FILE__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "receipts/version"
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/receipts/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "receipts"
7
7
  spec.version = Receipts::VERSION
8
8
  spec.authors = ["Chris Oliver"]
9
9
  spec.email = ["excid3@gmail.com"]
10
+
10
11
  spec.summary = "Receipts for your Rails application that works with any payment provider."
11
12
  spec.description = "Receipts for your Rails application that works with any payment provider."
12
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/excid3/receipts"
13
14
  spec.license = "MIT"
14
15
 
15
- spec.files = `git ls-files -z`.split("\x0")
16
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
- spec.require_paths = ["lib"]
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = spec.homepage
18
+ spec.metadata["changelog_uri"] = "https://github.com/excid3/receipts/blob/master/CHANGELOG.md"
19
19
 
20
- spec.add_development_dependency "bundler"
21
- spec.add_development_dependency "rake", "~> 10.0"
22
- spec.add_development_dependency "rspec"
23
- spec.add_development_dependency "pry"
24
- spec.add_development_dependency "standard"
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject do |f|
24
+ (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
25
+ end
26
+ end
27
+ spec.bindir = "exe"
28
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
25
30
 
26
31
  spec.add_dependency "prawn", ">= 1.3.0", "< 3.0.0"
27
32
  spec.add_dependency "prawn-table", "~> 0.2.1"
metadata CHANGED
@@ -1,85 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: receipts
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Oliver
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-04 00:00:00.000000000 Z
11
+ date: 2022-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '10.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '10.0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: pry
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: standard
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
13
  - !ruby/object:Gem::Dependency
84
14
  name: prawn
85
15
  requirement: !ruby/object:Gem::Requirement
@@ -121,31 +51,30 @@ executables: []
121
51
  extensions: []
122
52
  extra_rdoc_files: []
123
53
  files:
124
- - ".github/FUNDING.yml"
125
- - ".github/workflows/ci.yml"
126
- - ".gitignore"
127
- - ".travis.yml"
128
54
  - CHANGELOG.md
129
55
  - Gemfile
130
56
  - LICENSE.txt
131
57
  - README.md
132
58
  - Rakefile
133
- - examples/gorails.png
59
+ - examples/images/logo.png
60
+ - examples/images/options.jpg
134
61
  - examples/invoice.pdf
135
62
  - examples/receipt.pdf
136
63
  - examples/statement.pdf
137
64
  - lib/receipts.rb
65
+ - lib/receipts/base.rb
138
66
  - lib/receipts/invoice.rb
139
67
  - lib/receipts/receipt.rb
140
68
  - lib/receipts/statement.rb
141
69
  - lib/receipts/version.rb
142
70
  - receipts.gemspec
143
- - spec/receipts_spec.rb
144
- - spec/spec_helper.rb
145
- homepage: ''
71
+ homepage: https://github.com/excid3/receipts
146
72
  licenses:
147
73
  - MIT
148
- metadata: {}
74
+ metadata:
75
+ homepage_uri: https://github.com/excid3/receipts
76
+ source_code_uri: https://github.com/excid3/receipts
77
+ changelog_uri: https://github.com/excid3/receipts/blob/master/CHANGELOG.md
149
78
  post_install_message:
150
79
  rdoc_options: []
151
80
  require_paths:
@@ -161,10 +90,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
90
  - !ruby/object:Gem::Version
162
91
  version: '0'
163
92
  requirements: []
164
- rubygems_version: 3.2.22
93
+ rubygems_version: 3.2.32
165
94
  signing_key:
166
95
  specification_version: 4
167
96
  summary: Receipts for your Rails application that works with any payment provider.
168
- test_files:
169
- - spec/receipts_spec.rb
170
- - spec/spec_helper.rb
97
+ test_files: []
data/.github/FUNDING.yml DELETED
@@ -1,12 +0,0 @@
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']
@@ -1,36 +0,0 @@
1
- name: Tests
2
-
3
- on:
4
- pull_request:
5
- branches:
6
- - '*'
7
- push:
8
- branches:
9
- - master
10
- jobs:
11
- tests:
12
- runs-on: ubuntu-latest
13
- strategy:
14
- matrix:
15
- ruby: ['2.7', '3.0']
16
- env:
17
- BUNDLE_PATH_RELATIVE_TO_CWD: true
18
-
19
- steps:
20
- - uses: actions/checkout@master
21
-
22
- - name: Set up Ruby
23
- uses: ruby/setup-ruby@v1
24
- with:
25
- ruby-version: ${{ matrix.ruby }}
26
- bundler: default
27
- bundler-cache: true
28
-
29
- - name: StandardRb check
30
- run: bundle exec standardrb
31
-
32
- - name: Run tests
33
- env:
34
- RAILS_ENV: test
35
- run: |
36
- bundle exec rspec
data/.gitignore DELETED
@@ -1,15 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- mkmf.log
15
- .DS_Store
data/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.3.3
4
- - 2.4.0
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Receipts do
4
- it "lets you create a new receipt" do
5
- expect(Receipts::Receipt.new(
6
- id: 1,
7
- product: "GoRails",
8
- company: {
9
- name: "One Month, Inc.",
10
- address: "37 Great Jones\nFloor 2\nNew York City, NY 10012",
11
- email: "teachers@onemonth.com"
12
- },
13
- line_items: [
14
- ["Product", "GoRails"]
15
- ]
16
- ).class.name).to eq("Receipts::Receipt")
17
- end
18
- end
data/spec/spec_helper.rb DELETED
@@ -1,9 +0,0 @@
1
- begin
2
- require "pry"
3
- rescue LoadError
4
- end
5
-
6
- require "receipts"
7
-
8
- RSpec.configure do |config|
9
- end