bollettino 1.0.0 → 1.0.1
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 +5 -5
- data/.rubocop.yml +103 -0
- data/.travis.yml +3 -3
- data/CHANGELOG.md +31 -3
- data/README.md +8 -8
- data/bollettino.gemspec +10 -7
- data/lib/bollettino.rb +15 -12
- data/lib/bollettino/generator.rb +24 -20
- data/lib/bollettino/model/address.rb +22 -0
- data/lib/bollettino/model/base.rb +9 -0
- data/lib/bollettino/model/payee.rb +21 -0
- data/lib/bollettino/model/payer.rb +20 -0
- data/lib/bollettino/model/payment_order.rb +24 -0
- data/lib/bollettino/model/slip.rb +25 -0
- data/lib/bollettino/renderer/address.rb +32 -0
- data/lib/bollettino/renderer/base.rb +46 -0
- data/lib/bollettino/renderer/errors.rb +14 -0
- data/lib/bollettino/renderer/payee.rb +34 -0
- data/lib/bollettino/renderer/payer.rb +28 -0
- data/lib/bollettino/renderer/payment_order.rb +45 -0
- data/lib/bollettino/renderer/slip.rb +29 -0
- data/lib/bollettino/version.rb +3 -1
- data/spec/integration/generation_spec.rb +8 -9
- data/spec/spec_helper.rb +9 -1
- data/spec/unit/bollettino/generator_spec.rb +8 -35
- data/spec/unit/bollettino/model/address_spec.rb +20 -0
- data/spec/unit/bollettino/model/payee_spec.rb +18 -0
- data/spec/unit/bollettino/model/payer_spec.rb +24 -0
- data/spec/unit/bollettino/model/payment_order_spec.rb +19 -0
- data/spec/unit/bollettino/model/slip_spec.rb +29 -0
- data/spec/unit/bollettino/renderer/address_spec.rb +28 -0
- data/spec/unit/bollettino/renderer/payee_spec.rb +39 -0
- data/spec/unit/bollettino/renderer/payer_spec.rb +41 -0
- data/spec/unit/bollettino/renderer/payment_order_spec.rb +40 -0
- data/spec/unit/bollettino/renderer/slip_spec.rb +54 -0
- metadata +81 -51
- data/lib/bollettino/models/address.rb +0 -18
- data/lib/bollettino/models/payee.rb +0 -17
- data/lib/bollettino/models/payer.rb +0 -16
- data/lib/bollettino/models/payment_order.rb +0 -20
- data/lib/bollettino/models/slip.rb +0 -21
- data/lib/bollettino/renderer.rb +0 -47
- data/lib/bollettino/renderers/address_renderer.rb +0 -24
- data/lib/bollettino/renderers/payee_renderer.rb +0 -26
- data/lib/bollettino/renderers/payer_renderer.rb +0 -20
- data/lib/bollettino/renderers/payment_order_renderer.rb +0 -37
- data/lib/bollettino/renderers/slip_renderer.rb +0 -21
- data/spec/unit/bollettino/models/address_spec.rb +0 -12
- data/spec/unit/bollettino/models/payee_spec.rb +0 -10
- data/spec/unit/bollettino/models/payer_spec.rb +0 -12
- data/spec/unit/bollettino/models/payment_order_spec.rb +0 -11
- data/spec/unit/bollettino/models/slip_spec.rb +0 -15
- data/spec/unit/bollettino/renderers/address_renderer_spec.rb +0 -23
- data/spec/unit/bollettino/renderers/payee_renderer_spec.rb +0 -37
- data/spec/unit/bollettino/renderers/payer_renderer_spec.rb +0 -27
- data/spec/unit/bollettino/renderers/payment_order_renderer_spec.rb +0 -39
- data/spec/unit/bollettino/renderers/slip_renderer_spec.rb +0 -34
@@ -1,18 +0,0 @@
|
|
1
|
-
# Address
|
2
|
-
#
|
3
|
-
# @author Alessandro Desatnis <desa.alessandro@gmail.com>
|
4
|
-
class Bollettino::Address
|
5
|
-
include Virtus.model
|
6
|
-
|
7
|
-
# !@attribute [rw] street
|
8
|
-
# @return [String] the address street
|
9
|
-
attribute :street, String
|
10
|
-
|
11
|
-
# !@attribute [rw] zip
|
12
|
-
# @return [String] the address ZIP
|
13
|
-
attribute :zip, String
|
14
|
-
|
15
|
-
# !@attribute [rw] location
|
16
|
-
# @return [String] the address location (city, state etc.)
|
17
|
-
attribute :location, String
|
18
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# Payee
|
2
|
-
#
|
3
|
-
# The payee is the party requesting payment. A payee is associated with a
|
4
|
-
# postal account.
|
5
|
-
#
|
6
|
-
# @author Alessandro Desatnis <desa.alessandro@gmail.com>
|
7
|
-
class Bollettino::Payee
|
8
|
-
include Virtus.model
|
9
|
-
|
10
|
-
# !@attribute [rw] account_number
|
11
|
-
# @return [String] the postal account's number
|
12
|
-
attribute :account_number, String
|
13
|
-
|
14
|
-
# !@attribute [rw] name
|
15
|
-
# @return [String] the account holder's name
|
16
|
-
attribute :name, String
|
17
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# Payer
|
2
|
-
#
|
3
|
-
# The payer is the party making the payment.
|
4
|
-
#
|
5
|
-
# @author Alessandro Desatnis <desa.alessandro@gmail.com>
|
6
|
-
class Bollettino::Payer
|
7
|
-
include Virtus.model
|
8
|
-
|
9
|
-
# !@attribute [rw] name
|
10
|
-
# @return [String] the payer's full name
|
11
|
-
attribute :name, String
|
12
|
-
|
13
|
-
# !@attribute [rw] address
|
14
|
-
# @return [Bollettino::Address] the payer's address
|
15
|
-
attribute :address, Bollettino::Address
|
16
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# Payment order
|
2
|
-
#
|
3
|
-
# A payment order is a request for payment from the payee to the payer.
|
4
|
-
#
|
5
|
-
# @author Alessandro Desatnis <desa.alessandro@gmail.com>
|
6
|
-
class Bollettino::PaymentOrder
|
7
|
-
include Virtus.model
|
8
|
-
|
9
|
-
# !@attribute [rw] numeric amount
|
10
|
-
# @return [Float] the payment's amount
|
11
|
-
attribute :numeric_amount, Float
|
12
|
-
|
13
|
-
# !@attribute [rw] text amount
|
14
|
-
# @return [String] the payment's amount in letters
|
15
|
-
attribute :text_amount, String
|
16
|
-
|
17
|
-
# !@attribute [rw] reason
|
18
|
-
# @return [String] the reason for the payment
|
19
|
-
attribute :reason, String
|
20
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# Slip
|
2
|
-
#
|
3
|
-
# A slip is just the composition of a Payee, a Payer and a PaymentOrder. It is
|
4
|
-
# passed to {#Bollettino::Generator} to create the final image.
|
5
|
-
#
|
6
|
-
# @author Alessandro Desatnis <desa.alessandro@gmail.com>
|
7
|
-
class Bollettino::Slip
|
8
|
-
include Virtus.model
|
9
|
-
|
10
|
-
# !@attribute [rw] payee
|
11
|
-
# @return [Bollettino::Payee] the payee
|
12
|
-
attribute :payee, Bollettino::Payee
|
13
|
-
|
14
|
-
# !@attribute [rw] payer
|
15
|
-
# @return [Bollettino::Payer] the payer
|
16
|
-
attribute :payer, Bollettino::Payer
|
17
|
-
|
18
|
-
# !@attribute [rw] payment order
|
19
|
-
# @return [Bollettino::PaymentOrder] the payment order
|
20
|
-
attribute :payment_order, Bollettino::PaymentOrder
|
21
|
-
end
|
data/lib/bollettino/renderer.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
# Base rebder
|
2
|
-
#
|
3
|
-
# @abstract Subclass and override {.render} to create a renderer
|
4
|
-
#
|
5
|
-
# @author Alessandro Desantis <desa.alessandro@gmail.com>
|
6
|
-
class Bollettino::Renderer
|
7
|
-
KERNING_NORMAL = 1
|
8
|
-
|
9
|
-
KERNING_BOX = 17.5
|
10
|
-
KERNING_BOX_SMALLER = 17
|
11
|
-
KERNING_BOX_SMALLEST = 16
|
12
|
-
|
13
|
-
FONT_SIZE_NORMAL = 30
|
14
|
-
FONT_SIZE_SMALL = 25
|
15
|
-
|
16
|
-
# Renders the given model on the image.
|
17
|
-
#
|
18
|
-
# @param image [MiniMagick::Image]
|
19
|
-
# @param model
|
20
|
-
#
|
21
|
-
# @abstract This method must be overridden by the renderers
|
22
|
-
def self.render(image, model)
|
23
|
-
raise NotImplementedError
|
24
|
-
end
|
25
|
-
|
26
|
-
protected
|
27
|
-
|
28
|
-
def self.write_text(image, coords, text, kerning = KERNING_NORMAL, font_size = FONT_SIZE_NORMAL)
|
29
|
-
image.combine_options do |c|
|
30
|
-
c.font 'courier'
|
31
|
-
c.fill 'black'
|
32
|
-
c.pointsize font_size
|
33
|
-
c.gravity 'southwest'
|
34
|
-
c.kerning kerning
|
35
|
-
c.draw %Q[text #{coords.join(',')} "#{text.to_s.upcase.gsub('"', '\"')}"]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# Rendering error
|
40
|
-
#
|
41
|
-
# This error is usually raised when some data can't be renderered because
|
42
|
-
# it's malformed.
|
43
|
-
#
|
44
|
-
# @author Alessandro Desantis <desa.alessandro@gmail.com>
|
45
|
-
class RenderingError < StandardError
|
46
|
-
end
|
47
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
class Bollettino::Renderer::AddressRenderer < Bollettino::Renderer
|
2
|
-
def self.render(image, address)
|
3
|
-
render_street(image, address)
|
4
|
-
render_zip(image, address)
|
5
|
-
render_location(image, address)
|
6
|
-
end
|
7
|
-
|
8
|
-
private
|
9
|
-
|
10
|
-
def self.render_street(image, address)
|
11
|
-
write_text(image, [85, 267], address.street[0..29], KERNING_NORMAL, FONT_SIZE_SMALL)
|
12
|
-
write_text(image, [1508, 267], address.street[0..22], KERNING_BOX_SMALLEST)
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.render_zip(image, address)
|
16
|
-
write_text(image, [85, 223], address.zip[0..29], KERNING_NORMAL, FONT_SIZE_SMALL)
|
17
|
-
write_text(image, [1508, 200], address.zip[0..4], KERNING_BOX_SMALLEST)
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.render_location(image, address)
|
21
|
-
write_text(image, [85, 180], address.location[0..29], KERNING_NORMAL, FONT_SIZE_SMALL)
|
22
|
-
write_text(image, [1713, 200], address.location[0..16], KERNING_BOX_SMALLEST)
|
23
|
-
end
|
24
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
class Bollettino::Renderer::PayeeRenderer < Bollettino::Renderer
|
2
|
-
def self.render(image, payee)
|
3
|
-
render_account_number(image, payee)
|
4
|
-
render_name(image, payee)
|
5
|
-
end
|
6
|
-
|
7
|
-
private
|
8
|
-
|
9
|
-
def self.render_account_number(image, payee)
|
10
|
-
if payee.account_number.length > 10
|
11
|
-
raise RenderingError, "Account number can't be longer than 10 characters"
|
12
|
-
end
|
13
|
-
|
14
|
-
[[265, 695], [1310, 695]].each do |coords|
|
15
|
-
write_text(image, coords, payee.account_number, KERNING_BOX)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.render_name(image, payee)
|
20
|
-
write_text(image, [90, 585], payee.name[0..46])
|
21
|
-
write_text(image, [90, 545], payee.name[47..93])
|
22
|
-
|
23
|
-
write_text(image, [1105, 590], payee.name[0..33], KERNING_BOX_SMALLER)
|
24
|
-
write_text(image, [1105, 545], payee.name[34..67], KERNING_BOX_SMALLER)
|
25
|
-
end
|
26
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
class Bollettino::Renderer::PayerRenderer < Bollettino::Renderer
|
2
|
-
def self.render(image, payer)
|
3
|
-
render_name(image, payer)
|
4
|
-
render_address(image, payer)
|
5
|
-
end
|
6
|
-
|
7
|
-
private
|
8
|
-
|
9
|
-
def self.render_name(image, payer)
|
10
|
-
write_text(image, [85, 360], payer.name[0..24])
|
11
|
-
write_text(image, [85, 315], payer.name[25..49])
|
12
|
-
|
13
|
-
write_text(image, [1508, 375], payer.name[0..22], KERNING_BOX_SMALLEST)
|
14
|
-
write_text(image, [1508, 330], payer.name[23..45], KERNING_BOX_SMALLEST)
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.render_address(image, payer)
|
18
|
-
Bollettino::Renderer::AddressRenderer.render(image, payer.address)
|
19
|
-
end
|
20
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
class Bollettino::Renderer::PaymentOrderRenderer < Bollettino::Renderer
|
2
|
-
def self.render(image, payment_order)
|
3
|
-
render_numeric_amount(image, payment_order)
|
4
|
-
render_text_amount(image, payment_order)
|
5
|
-
render_reason(image, payment_order)
|
6
|
-
end
|
7
|
-
|
8
|
-
private
|
9
|
-
|
10
|
-
def self.render_numeric_amount(image, payment_order)
|
11
|
-
numeric_amount = payment_order.numeric_amount
|
12
|
-
numeric_amount = ('%.2f' % numeric_amount).to_s.gsub('.', '')
|
13
|
-
|
14
|
-
if numeric_amount.length > 7
|
15
|
-
raise RenderingError, "Numeric amount can't be longer than 7 total digits"
|
16
|
-
end
|
17
|
-
|
18
|
-
numeric_amount_x = 1000 - 35 * numeric_amount.length.to_i
|
19
|
-
|
20
|
-
[[numeric_amount_x, 690], [numeric_amount_x + 1315, 690]].each do |coords|
|
21
|
-
write_text(image, coords, numeric_amount, KERNING_BOX)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.render_reason(image, payment_order)
|
26
|
-
write_text(image, [90, 475], payment_order.reason[0..46])
|
27
|
-
write_text(image, [90, 435], payment_order.reason[47..93])
|
28
|
-
|
29
|
-
write_text(image, [1110, 475], payment_order.reason[0..60])
|
30
|
-
write_text(image, [1110, 435], payment_order.reason[61..121])
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.render_text_amount(image, payment_order)
|
34
|
-
write_text(image, [245, 650], payment_order.text_amount[0..38])
|
35
|
-
write_text(image, [1435, 650], payment_order.text_amount[0..44])
|
36
|
-
end
|
37
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class Bollettino::Renderer::SlipRenderer < Bollettino::Renderer
|
2
|
-
def self.render(image, slip)
|
3
|
-
render_payment_order(image, slip)
|
4
|
-
render_payee(image, slip)
|
5
|
-
render_payer(image, slip)
|
6
|
-
end
|
7
|
-
|
8
|
-
private
|
9
|
-
|
10
|
-
def self.render_payment_order(image, slip)
|
11
|
-
Bollettino::Renderer::PaymentOrderRenderer.render(image, slip.payment_order)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.render_payee(image, slip)
|
15
|
-
Bollettino::Renderer::PayeeRenderer.render(image, slip.payee)
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.render_payer(image, slip)
|
19
|
-
Bollettino::Renderer::PayerRenderer.render(image, slip.payer)
|
20
|
-
end
|
21
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Bollettino::Slip do
|
4
|
-
it 'is instantiated correctly' do
|
5
|
-
payee = Bollettino::Payee.new
|
6
|
-
payer = Bollettino::Payer.new
|
7
|
-
payment_order = Bollettino::PaymentOrder.new
|
8
|
-
|
9
|
-
described_class.new(
|
10
|
-
payee: payee,
|
11
|
-
payer: payer,
|
12
|
-
payment_order: payment_order
|
13
|
-
)
|
14
|
-
end
|
15
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Bollettino::Renderer::AddressRenderer do
|
4
|
-
subject { described_class }
|
5
|
-
|
6
|
-
describe '.render' do
|
7
|
-
it 'renders the address' do
|
8
|
-
address = stub(
|
9
|
-
street: 'Via Fasulla, 123',
|
10
|
-
location: 'Roma',
|
11
|
-
zip: '00100'
|
12
|
-
)
|
13
|
-
|
14
|
-
image = stub()
|
15
|
-
|
16
|
-
subject
|
17
|
-
.expects(:write_text)
|
18
|
-
.times(6)
|
19
|
-
|
20
|
-
subject.render image, address
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Bollettino::Renderer::PayeeRenderer do
|
4
|
-
subject { described_class }
|
5
|
-
|
6
|
-
describe '.render' do
|
7
|
-
it 'renders the payee' do
|
8
|
-
payee = stub(
|
9
|
-
account_number: '0123456789',
|
10
|
-
name: 'Acme Inc.'
|
11
|
-
)
|
12
|
-
|
13
|
-
image = stub()
|
14
|
-
|
15
|
-
subject
|
16
|
-
.expects(:write_text)
|
17
|
-
.times(6)
|
18
|
-
|
19
|
-
subject.render image, payee
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'when account_number is longer than 10 characters' do
|
23
|
-
it 'raises an error' do
|
24
|
-
payee = stub(
|
25
|
-
account_number: '01234567891',
|
26
|
-
name: 'Acme Inc.'
|
27
|
-
)
|
28
|
-
|
29
|
-
image = stub()
|
30
|
-
|
31
|
-
expect {
|
32
|
-
subject.render image, payee
|
33
|
-
}.to raise_error(Bollettino::Renderer::RenderingError)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Bollettino::Renderer::PayerRenderer do
|
4
|
-
subject { described_class }
|
5
|
-
|
6
|
-
describe '.render' do
|
7
|
-
it 'renders the payer' do
|
8
|
-
payer = stub(
|
9
|
-
name: 'Acme Inc.',
|
10
|
-
address: stub()
|
11
|
-
)
|
12
|
-
|
13
|
-
image = stub()
|
14
|
-
|
15
|
-
Bollettino::Renderer::AddressRenderer
|
16
|
-
.expects(:render)
|
17
|
-
.with(image, payer.address)
|
18
|
-
.once
|
19
|
-
|
20
|
-
subject
|
21
|
-
.expects(:write_text)
|
22
|
-
.times(4)
|
23
|
-
|
24
|
-
subject.render image, payer
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|