gobl 0.1.2
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 +7 -0
- data/data/tax/ES.json +841 -0
- data/data/tax/FR.json +47 -0
- data/data/tax/GB.json +56 -0
- data/data/tax/NL.json +60 -0
- data/home/cavalle/workspace/invopop/gobl.ruby/gobl.gemspec +30 -0
- data/lib/extensions.rb +12 -0
- data/lib/gobl/bill/advances.rb +90 -0
- data/lib/gobl/bill/charge.rb +121 -0
- data/lib/gobl/bill/delivery.rb +79 -0
- data/lib/gobl/bill/discount.rb +121 -0
- data/lib/gobl/bill/exchange_rates.rb +90 -0
- data/lib/gobl/bill/invoice.rb +209 -0
- data/lib/gobl/bill/invoice_type.rb +163 -0
- data/lib/gobl/bill/line.rb +121 -0
- data/lib/gobl/bill/line_charge.rb +79 -0
- data/lib/gobl/bill/line_discount.rb +79 -0
- data/lib/gobl/bill/ordering.rb +58 -0
- data/lib/gobl/bill/outlay.rb +107 -0
- data/lib/gobl/bill/payment.rb +79 -0
- data/lib/gobl/bill/preceding.rb +114 -0
- data/lib/gobl/bill/scheme_keys.rb +90 -0
- data/lib/gobl/bill/tax.rb +72 -0
- data/lib/gobl/bill/totals.rb +135 -0
- data/lib/gobl/cal/date.rb +106 -0
- data/lib/gobl/cal/period.rb +63 -0
- data/lib/gobl/config.rb +14 -0
- data/lib/gobl/currency/code.rb +322 -0
- data/lib/gobl/currency/exchange_rate.rb +65 -0
- data/lib/gobl/document.rb +70 -0
- data/lib/gobl/dsig/digest.rb +65 -0
- data/lib/gobl/dsig/signature.rb +106 -0
- data/lib/gobl/envelope.rb +77 -0
- data/lib/gobl/header.rb +98 -0
- data/lib/gobl/i18n/string.rb +72 -0
- data/lib/gobl/id.rb +80 -0
- data/lib/gobl/l10n/code.rb +106 -0
- data/lib/gobl/l10n/country_code.rb +405 -0
- data/lib/gobl/note/message.rb +72 -0
- data/lib/gobl/num/amount.rb +248 -0
- data/lib/gobl/num/percentage.rb +84 -0
- data/lib/gobl/operations/service_error.rb +10 -0
- data/lib/gobl/operations/validation_result.rb +46 -0
- data/lib/gobl/operations.rb +170 -0
- data/lib/gobl/org/address.rb +156 -0
- data/lib/gobl/org/code.rb +106 -0
- data/lib/gobl/org/coordinates.rb +79 -0
- data/lib/gobl/org/email.rb +79 -0
- data/lib/gobl/org/inbox.rb +86 -0
- data/lib/gobl/org/item.rb +121 -0
- data/lib/gobl/org/item_code.rb +65 -0
- data/lib/gobl/org/key.rb +106 -0
- data/lib/gobl/org/meta.rb +72 -0
- data/lib/gobl/org/name.rb +114 -0
- data/lib/gobl/org/note.rb +79 -0
- data/lib/gobl/org/note_key.rb +181 -0
- data/lib/gobl/org/party.rb +135 -0
- data/lib/gobl/org/person.rb +100 -0
- data/lib/gobl/org/registration.rb +99 -0
- data/lib/gobl/org/source_key.rb +161 -0
- data/lib/gobl/org/tax_identity.rb +93 -0
- data/lib/gobl/org/telephone.rb +72 -0
- data/lib/gobl/org/unit.rb +204 -0
- data/lib/gobl/pay/advance.rb +107 -0
- data/lib/gobl/pay/card.rb +65 -0
- data/lib/gobl/pay/credit_transfer.rb +86 -0
- data/lib/gobl/pay/direct_debit.rb +72 -0
- data/lib/gobl/pay/due_date.rb +86 -0
- data/lib/gobl/pay/instructions.rb +114 -0
- data/lib/gobl/pay/method_key.rb +163 -0
- data/lib/gobl/pay/online.rb +65 -0
- data/lib/gobl/pay/term_key.rb +166 -0
- data/lib/gobl/pay/terms.rb +79 -0
- data/lib/gobl/stamp.rb +63 -0
- data/lib/gobl/struct.rb +48 -0
- data/lib/gobl/tax/category.rb +83 -0
- data/lib/gobl/tax/category_total.rb +87 -0
- data/lib/gobl/tax/combo.rb +79 -0
- data/lib/gobl/tax/localities.rb +90 -0
- data/lib/gobl/tax/locality.rb +72 -0
- data/lib/gobl/tax/rate.rb +77 -0
- data/lib/gobl/tax/rate_total.rb +82 -0
- data/lib/gobl/tax/rate_total_surcharge.rb +63 -0
- data/lib/gobl/tax/rate_value.rb +79 -0
- data/lib/gobl/tax/region.rb +100 -0
- data/lib/gobl/tax/scheme.rb +86 -0
- data/lib/gobl/tax/schemes.rb +90 -0
- data/lib/gobl/tax/set.rb +90 -0
- data/lib/gobl/tax/total.rb +65 -0
- data/lib/gobl/types.rb +17 -0
- data/lib/gobl/uuid/uuid.rb +106 -0
- data/lib/gobl/version.rb +5 -0
- data/lib/gobl.rb +41 -0
- data/lib/gobl_extensions/document_helper.rb +45 -0
- data/lib/gobl_extensions/envelope_helper.rb +15 -0
- data/lib/gobl_extensions/i18n/value_keys_helper.rb +27 -0
- data/lib/gobl_extensions/tax/region_helper.rb +41 -0
- metadata +225 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
## DO NOT EDIT - This file was generated automatically.
|
|
5
|
+
##
|
|
6
|
+
## Generated with GOBL v0.30.4
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
module GOBL
|
|
10
|
+
module Bill
|
|
11
|
+
# Totals contains the summaries of all calculations for the invoice.
|
|
12
|
+
class Totals < GOBL::Struct
|
|
13
|
+
# The Schema ID of the GOBL Totals structure
|
|
14
|
+
SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/Totals'
|
|
15
|
+
|
|
16
|
+
# @!attribute [r] sum
|
|
17
|
+
# Sum of all line item sums
|
|
18
|
+
# @return [GOBL::Num::Amount]
|
|
19
|
+
attribute :sum, GOBL::Types.Constructor(GOBL::Num::Amount)
|
|
20
|
+
|
|
21
|
+
# @!attribute [r] discount
|
|
22
|
+
# Sum of all document level discounts
|
|
23
|
+
# @return [GOBL::Num::Amount]
|
|
24
|
+
attribute? :discount, GOBL::Types.Constructor(GOBL::Num::Amount).optional
|
|
25
|
+
|
|
26
|
+
# @!attribute [r] charge
|
|
27
|
+
# Sum of all document level charges
|
|
28
|
+
# @return [GOBL::Num::Amount]
|
|
29
|
+
attribute? :charge, GOBL::Types.Constructor(GOBL::Num::Amount).optional
|
|
30
|
+
|
|
31
|
+
# @!attribute [r] tax_included
|
|
32
|
+
# If prices include tax, this is the total tax included in the price.
|
|
33
|
+
# @return [GOBL::Num::Amount]
|
|
34
|
+
attribute? :tax_included, GOBL::Types.Constructor(GOBL::Num::Amount).optional
|
|
35
|
+
|
|
36
|
+
# @!attribute [r] total
|
|
37
|
+
# Sum of all line sums minus the discounts, plus the charges, without tax.
|
|
38
|
+
# @return [GOBL::Num::Amount]
|
|
39
|
+
attribute :total, GOBL::Types.Constructor(GOBL::Num::Amount)
|
|
40
|
+
|
|
41
|
+
# @!attribute [r] taxes
|
|
42
|
+
# Summary of all the taxes included in the invoice.
|
|
43
|
+
# @return [GOBL::Tax::Total]
|
|
44
|
+
attribute? :taxes, GOBL::Tax::Total.optional
|
|
45
|
+
|
|
46
|
+
# @!attribute [r] tax
|
|
47
|
+
# Total amount of tax to apply to the invoice.
|
|
48
|
+
# @return [GOBL::Num::Amount]
|
|
49
|
+
attribute? :tax, GOBL::Types.Constructor(GOBL::Num::Amount).optional
|
|
50
|
+
|
|
51
|
+
# @!attribute [r] total_with_tax
|
|
52
|
+
# Grand total after all taxes have been applied.
|
|
53
|
+
# @return [GOBL::Num::Amount]
|
|
54
|
+
attribute :total_with_tax, GOBL::Types.Constructor(GOBL::Num::Amount)
|
|
55
|
+
|
|
56
|
+
# @!attribute [r] outlays
|
|
57
|
+
# Total paid in outlays that need to be reimbursed
|
|
58
|
+
# @return [GOBL::Num::Amount]
|
|
59
|
+
attribute? :outlays, GOBL::Types.Constructor(GOBL::Num::Amount).optional
|
|
60
|
+
|
|
61
|
+
# @!attribute [r] payable
|
|
62
|
+
# Total amount to be paid after applying taxes and outlays.
|
|
63
|
+
# @return [GOBL::Num::Amount]
|
|
64
|
+
attribute :payable, GOBL::Types.Constructor(GOBL::Num::Amount)
|
|
65
|
+
|
|
66
|
+
# @!attribute [r] advance
|
|
67
|
+
# Total amount already paid in advance.
|
|
68
|
+
# @return [GOBL::Num::Amount]
|
|
69
|
+
attribute? :advance, GOBL::Types.Constructor(GOBL::Num::Amount).optional
|
|
70
|
+
|
|
71
|
+
# @!attribute [r] due
|
|
72
|
+
# How much actually needs to be paid now.
|
|
73
|
+
# @return [GOBL::Num::Amount]
|
|
74
|
+
attribute? :due, GOBL::Types.Constructor(GOBL::Num::Amount).optional
|
|
75
|
+
|
|
76
|
+
# Creates a new object from a hash of GOBL data
|
|
77
|
+
#
|
|
78
|
+
# @param data [Hash] a hash of GOBL data
|
|
79
|
+
#
|
|
80
|
+
# @return [Totals] the object created from the given data
|
|
81
|
+
def self.from_gobl!(data)
|
|
82
|
+
data = GOBL::Types::Hash[data]
|
|
83
|
+
|
|
84
|
+
new(
|
|
85
|
+
sum: data['sum'],
|
|
86
|
+
discount: data['discount'] || nil,
|
|
87
|
+
charge: data['charge'] || nil,
|
|
88
|
+
tax_included: data['tax_included'] || nil,
|
|
89
|
+
total: data['total'],
|
|
90
|
+
taxes: data['taxes'] ? GOBL::Tax::Total.from_gobl!(data['taxes']) : nil,
|
|
91
|
+
tax: data['tax'] || nil,
|
|
92
|
+
total_with_tax: data['total_with_tax'],
|
|
93
|
+
outlays: data['outlays'] || nil,
|
|
94
|
+
payable: data['payable'],
|
|
95
|
+
advance: data['advance'] || nil,
|
|
96
|
+
due: data['due'] || nil
|
|
97
|
+
)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Returns a hash of GOBL data representing the current object
|
|
101
|
+
#
|
|
102
|
+
# @return [Hash] the array of GOBL data that represents the current object
|
|
103
|
+
def to_gobl
|
|
104
|
+
{
|
|
105
|
+
'sum' => attributes[:sum]&.to_gobl,
|
|
106
|
+
'discount' => attributes[:discount]&.to_gobl,
|
|
107
|
+
'charge' => attributes[:charge]&.to_gobl,
|
|
108
|
+
'tax_included' => attributes[:tax_included]&.to_gobl,
|
|
109
|
+
'total' => attributes[:total]&.to_gobl,
|
|
110
|
+
'taxes' => attributes[:taxes]&.to_gobl,
|
|
111
|
+
'tax' => attributes[:tax]&.to_gobl,
|
|
112
|
+
'total_with_tax' => attributes[:total_with_tax]&.to_gobl,
|
|
113
|
+
'outlays' => attributes[:outlays]&.to_gobl,
|
|
114
|
+
'payable' => attributes[:payable]&.to_gobl,
|
|
115
|
+
'advance' => attributes[:advance]&.to_gobl,
|
|
116
|
+
'due' => attributes[:due]&.to_gobl
|
|
117
|
+
}.compact
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# @!method self.new(attrs)
|
|
121
|
+
#
|
|
122
|
+
# Returns a {Totals} object from a given hash of attributes. Nested
|
|
123
|
+
# attributes are supported: the constructor will instantiate the proper GOBL
|
|
124
|
+
# objects when nested hashes or arrays are given as part of the `attrs`
|
|
125
|
+
# parameter.
|
|
126
|
+
#
|
|
127
|
+
# The `new` method will only allow to create a new object if all attributes
|
|
128
|
+
# marked as mandatory and not calculated in the JSON schema are provided.
|
|
129
|
+
#
|
|
130
|
+
# @param attrs [Hash] the hash of attributes
|
|
131
|
+
#
|
|
132
|
+
# @return [Totals] the object corresponding to the given input
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
## DO NOT EDIT - This file was generated automatically.
|
|
5
|
+
##
|
|
6
|
+
## Generated with GOBL v0.30.4
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
module GOBL
|
|
10
|
+
module Cal
|
|
11
|
+
# Civil date in simplified ISO format, like 2021-05-26
|
|
12
|
+
class Date < GOBL::Struct
|
|
13
|
+
# The Schema ID of the GOBL Date structure
|
|
14
|
+
SCHEMA_ID = 'https://gobl.org/draft-0/cal/date'
|
|
15
|
+
|
|
16
|
+
attribute :_value, GOBL::Types::String
|
|
17
|
+
private :_value
|
|
18
|
+
|
|
19
|
+
# Creates a new object from a GOBL value
|
|
20
|
+
#
|
|
21
|
+
# @param data [String] the GOBL value
|
|
22
|
+
#
|
|
23
|
+
# @return [Date] the object created from the given data
|
|
24
|
+
def self.from_gobl!(data)
|
|
25
|
+
new(_value: data)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Returns a GOBL value representing the current object
|
|
29
|
+
#
|
|
30
|
+
# @return [String] the GOBL value that represents the current object
|
|
31
|
+
def to_gobl
|
|
32
|
+
_value
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Returns a {Date} that corresponds to a given object. The object can be a
|
|
36
|
+
# `Symbol`, a `String` or anything coercible into one (via `#to_s`).
|
|
37
|
+
#
|
|
38
|
+
# @param object [Symbol, String, #to_s] the value of the object.
|
|
39
|
+
#
|
|
40
|
+
# @return [Date] the object corresponding to the given value.
|
|
41
|
+
#
|
|
42
|
+
# @example Instantiating from a symbol
|
|
43
|
+
# date = GOBL::Cal::Date.new(:value)
|
|
44
|
+
#
|
|
45
|
+
# @example Instantiating from a string
|
|
46
|
+
# date = GOBL::Cal::Date.new('value')
|
|
47
|
+
def self.new(object)
|
|
48
|
+
case object
|
|
49
|
+
when Hash, self # internal use, not to be used in public calls
|
|
50
|
+
super
|
|
51
|
+
when Symbol
|
|
52
|
+
new object.to_s
|
|
53
|
+
else
|
|
54
|
+
super _value: object.to_s
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Returns the string representation of the current object
|
|
59
|
+
#
|
|
60
|
+
# @return [String] the string representation of the current object
|
|
61
|
+
def to_s
|
|
62
|
+
_value.to_s
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Returns the symbol representation of the current object
|
|
66
|
+
#
|
|
67
|
+
# @return [Symbol] the symbol representation of the current object
|
|
68
|
+
def to_sym
|
|
69
|
+
to_s.parameterize.underscore.to_sym
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Returns whether the current object is equivalent to a given one. In addition
|
|
73
|
+
# to {Date} objects, the current object can be compared to a `Symbol`, a
|
|
74
|
+
# `String` or anything coercible into one (via `#to_s`)
|
|
75
|
+
#
|
|
76
|
+
# @param other [Date, Symbol, String, #to_s] the other object to compare to
|
|
77
|
+
#
|
|
78
|
+
# @return [Boolean] `true` if the objects are equivalent, `false` otherwise
|
|
79
|
+
#
|
|
80
|
+
# @example Comparing to another {Date} object
|
|
81
|
+
# date = GOBL::Cal::Date.new('value')
|
|
82
|
+
# date == GOBL::Cal::Date.new('value') #=> true
|
|
83
|
+
# date == GOBL::Cal::Date.new('other') #=> false
|
|
84
|
+
#
|
|
85
|
+
# @example Comparing to a string
|
|
86
|
+
# date = GOBL::Cal::Date.new('value')
|
|
87
|
+
# date == 'value' #=> true
|
|
88
|
+
# date == 'other' #=> false
|
|
89
|
+
#
|
|
90
|
+
# @example Comparing to a symbol
|
|
91
|
+
# date = GOBL::Cal::Date.new('value')
|
|
92
|
+
# date == :value #=> true
|
|
93
|
+
# date == :other #=> false
|
|
94
|
+
def ==(other)
|
|
95
|
+
case other
|
|
96
|
+
when self.class
|
|
97
|
+
super
|
|
98
|
+
when Symbol
|
|
99
|
+
to_sym == other
|
|
100
|
+
else
|
|
101
|
+
to_s == other.to_s
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
## DO NOT EDIT - This file was generated automatically.
|
|
5
|
+
##
|
|
6
|
+
## Generated with GOBL v0.30.4
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
module GOBL
|
|
10
|
+
module Cal
|
|
11
|
+
# Period represents two dates with a start and finish.
|
|
12
|
+
class Period < GOBL::Struct
|
|
13
|
+
# The Schema ID of the GOBL Period structure
|
|
14
|
+
SCHEMA_ID = 'https://gobl.org/draft-0/cal/period'
|
|
15
|
+
|
|
16
|
+
# @!attribute [r] start
|
|
17
|
+
# @return [GOBL::Cal::Date]
|
|
18
|
+
attribute :start, GOBL::Cal::Date
|
|
19
|
+
|
|
20
|
+
# @!attribute [r] end
|
|
21
|
+
# @return [GOBL::Cal::Date]
|
|
22
|
+
attribute :end, GOBL::Cal::Date
|
|
23
|
+
|
|
24
|
+
# Creates a new object from a hash of GOBL data
|
|
25
|
+
#
|
|
26
|
+
# @param data [Hash] a hash of GOBL data
|
|
27
|
+
#
|
|
28
|
+
# @return [Period] the object created from the given data
|
|
29
|
+
def self.from_gobl!(data)
|
|
30
|
+
data = GOBL::Types::Hash[data]
|
|
31
|
+
|
|
32
|
+
new(
|
|
33
|
+
start: GOBL::Cal::Date.from_gobl!(data['start']),
|
|
34
|
+
end: GOBL::Cal::Date.from_gobl!(data['end'])
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns a hash of GOBL data representing the current object
|
|
39
|
+
#
|
|
40
|
+
# @return [Hash] the array of GOBL data that represents the current object
|
|
41
|
+
def to_gobl
|
|
42
|
+
{
|
|
43
|
+
'start' => attributes[:start]&.to_gobl,
|
|
44
|
+
'end' => attributes[:end]&.to_gobl
|
|
45
|
+
}.compact
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @!method self.new(attrs)
|
|
49
|
+
#
|
|
50
|
+
# Returns a {Period} object from a given hash of attributes. Nested
|
|
51
|
+
# attributes are supported: the constructor will instantiate the proper GOBL
|
|
52
|
+
# objects when nested hashes or arrays are given as part of the `attrs`
|
|
53
|
+
# parameter.
|
|
54
|
+
#
|
|
55
|
+
# The `new` method will only allow to create a new object if all attributes
|
|
56
|
+
# marked as mandatory and not calculated in the JSON schema are provided.
|
|
57
|
+
#
|
|
58
|
+
# @param attrs [Hash] the hash of attributes
|
|
59
|
+
#
|
|
60
|
+
# @return [Period] the object corresponding to the given input
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
data/lib/gobl/config.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module GOBL
|
|
4
|
+
# Provides accessors to the library's configuration settings
|
|
5
|
+
class Config
|
|
6
|
+
# The host of the GOBL CLI service to use by {GOBL::Operations}
|
|
7
|
+
# @return [String] the backend service's host
|
|
8
|
+
attr_accessor :service_host
|
|
9
|
+
|
|
10
|
+
# The port of the GOBL CLI service to use by {GOBL::Operations}
|
|
11
|
+
# @return [String, Integer] the backend service's port
|
|
12
|
+
attr_accessor :service_port
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
## DO NOT EDIT - This file was generated automatically.
|
|
5
|
+
##
|
|
6
|
+
## Generated with GOBL v0.30.4
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
module GOBL
|
|
10
|
+
module Currency
|
|
11
|
+
# ISO Currency Code
|
|
12
|
+
class Code < GOBL::Struct
|
|
13
|
+
# The Schema ID of the GOBL Code structure
|
|
14
|
+
SCHEMA_ID = 'https://gobl.org/draft-0/currency/code'
|
|
15
|
+
|
|
16
|
+
# The enumeration of values of the object and their descriptions (Values different to these are not allowed)
|
|
17
|
+
ENUM = {
|
|
18
|
+
'AED' => 'UAE Dirham',
|
|
19
|
+
'AFN' => 'Afghani',
|
|
20
|
+
'ALL' => 'Lek',
|
|
21
|
+
'AMD' => 'Armenian Dram',
|
|
22
|
+
'ANG' => 'Netherlands Antillean Guilder',
|
|
23
|
+
'AOA' => 'Kwanza',
|
|
24
|
+
'ARS' => 'Argentine Peso',
|
|
25
|
+
'AUD' => 'Australian Dollar',
|
|
26
|
+
'AWG' => 'Aruban Florin',
|
|
27
|
+
'AZN' => 'Azerbaijan Manat',
|
|
28
|
+
'BAM' => 'Convertible Mark',
|
|
29
|
+
'BBD' => 'Barbados Dollar',
|
|
30
|
+
'BDT' => 'Taka',
|
|
31
|
+
'BGN' => 'Bulgarian Lev',
|
|
32
|
+
'BHD' => 'Bahraini Dinar',
|
|
33
|
+
'BIF' => 'Burundi Franc',
|
|
34
|
+
'BMD' => 'Bermudian Dollar',
|
|
35
|
+
'BND' => 'Brunei Dollar',
|
|
36
|
+
'BOB' => 'Boliviano',
|
|
37
|
+
'BOV' => 'Mvdol',
|
|
38
|
+
'BRL' => 'Brazilian Real',
|
|
39
|
+
'BSD' => 'Bahamian Dollar',
|
|
40
|
+
'BTN' => 'Ngultrum',
|
|
41
|
+
'BWP' => 'Pula',
|
|
42
|
+
'BYN' => 'Belarusian Ruble',
|
|
43
|
+
'BZD' => 'Belize Dollar',
|
|
44
|
+
'CAD' => 'Canadian Dollar',
|
|
45
|
+
'CDF' => 'Congolese Franc',
|
|
46
|
+
'CHE' => 'WIR Euro',
|
|
47
|
+
'CHF' => 'Swiss Franc',
|
|
48
|
+
'CHW' => 'WIR Franc',
|
|
49
|
+
'CLF' => 'Unidad de Fomento',
|
|
50
|
+
'CLP' => 'Chilean Peso',
|
|
51
|
+
'CNY' => 'Yuan Renminbi',
|
|
52
|
+
'COP' => 'Colombian Peso',
|
|
53
|
+
'COU' => 'Unidad de Valor Real',
|
|
54
|
+
'CRC' => 'Costa Rican Colon',
|
|
55
|
+
'CUC' => 'Peso Convertible',
|
|
56
|
+
'CUP' => 'Cuban Peso',
|
|
57
|
+
'CVE' => 'Cabo Verde Escudo',
|
|
58
|
+
'CZK' => 'Czech Koruna',
|
|
59
|
+
'DJF' => 'Djibouti Franc',
|
|
60
|
+
'DKK' => 'Danish Krone',
|
|
61
|
+
'DOP' => 'Dominican Peso',
|
|
62
|
+
'DZD' => 'Algerian Dinar',
|
|
63
|
+
'EGP' => 'Egyptian Pound',
|
|
64
|
+
'ERN' => 'Nakfa',
|
|
65
|
+
'ETB' => 'Ethiopian Birr',
|
|
66
|
+
'EUR' => 'Euro',
|
|
67
|
+
'FJD' => 'Fiji Dollar',
|
|
68
|
+
'FKP' => 'Falkland Islands Pound',
|
|
69
|
+
'GBP' => 'Pound Sterling',
|
|
70
|
+
'GEL' => 'Lari',
|
|
71
|
+
'GHS' => 'Ghana Cedi',
|
|
72
|
+
'GIP' => 'Gibraltar Pound',
|
|
73
|
+
'GMD' => 'Dalasi',
|
|
74
|
+
'GNF' => 'Guinean Franc',
|
|
75
|
+
'GTQ' => 'Quetzal',
|
|
76
|
+
'GYD' => 'Guyana Dollar',
|
|
77
|
+
'HKD' => 'Hong Kong Dollar',
|
|
78
|
+
'HNL' => 'Lempira',
|
|
79
|
+
'HRK' => 'Kuna',
|
|
80
|
+
'HTG' => 'Gourde',
|
|
81
|
+
'HUF' => 'Forint',
|
|
82
|
+
'IDR' => 'Rupiah',
|
|
83
|
+
'ILS' => 'New Israeli Sheqel',
|
|
84
|
+
'INR' => 'Indian Rupee',
|
|
85
|
+
'IQD' => 'Iraqi Dinar',
|
|
86
|
+
'IRR' => 'Iranian Rial',
|
|
87
|
+
'ISK' => 'Iceland Krona',
|
|
88
|
+
'JMD' => 'Jamaican Dollar',
|
|
89
|
+
'JOD' => 'Jordanian Dinar',
|
|
90
|
+
'JPY' => 'Yen',
|
|
91
|
+
'KES' => 'Kenyan Shilling',
|
|
92
|
+
'KGS' => 'Som',
|
|
93
|
+
'KHR' => 'Riel',
|
|
94
|
+
'KMF' => 'Comorian Franc ',
|
|
95
|
+
'KPW' => 'North Korean Won',
|
|
96
|
+
'KRW' => 'Won',
|
|
97
|
+
'KWD' => 'Kuwaiti Dinar',
|
|
98
|
+
'KYD' => 'Cayman Islands Dollar',
|
|
99
|
+
'KZT' => 'Tenge',
|
|
100
|
+
'LAK' => 'Lao Kip',
|
|
101
|
+
'LBP' => 'Lebanese Pound',
|
|
102
|
+
'LKR' => 'Sri Lanka Rupee',
|
|
103
|
+
'LRD' => 'Liberian Dollar',
|
|
104
|
+
'LSL' => 'Loti',
|
|
105
|
+
'LYD' => 'Libyan Dinar',
|
|
106
|
+
'MAD' => 'Moroccan Dirham',
|
|
107
|
+
'MDL' => 'Moldovan Leu',
|
|
108
|
+
'MGA' => 'Malagasy Ariary',
|
|
109
|
+
'MKD' => 'Denar',
|
|
110
|
+
'MMK' => 'Kyat',
|
|
111
|
+
'MNT' => 'Tugrik',
|
|
112
|
+
'MOP' => 'Pataca',
|
|
113
|
+
'MRU' => 'Ouguiya',
|
|
114
|
+
'MUR' => 'Mauritius Rupee',
|
|
115
|
+
'MVR' => 'Rufiyaa',
|
|
116
|
+
'MWK' => 'Malawi Kwacha',
|
|
117
|
+
'MXN' => 'Mexican Peso',
|
|
118
|
+
'MXV' => 'Mexican Unidad de Inversion (UDI)',
|
|
119
|
+
'MYR' => 'Malaysian Ringgit',
|
|
120
|
+
'MZN' => 'Mozambique Metical',
|
|
121
|
+
'NAD' => 'Namibia Dollar',
|
|
122
|
+
'NGN' => 'Naira',
|
|
123
|
+
'NIO' => 'Cordoba Oro',
|
|
124
|
+
'NOK' => 'Norwegian Krone',
|
|
125
|
+
'NPR' => 'Nepalese Rupee',
|
|
126
|
+
'NZD' => 'New Zealand Dollar',
|
|
127
|
+
'OMR' => 'Rial Omani',
|
|
128
|
+
'PAB' => 'Balboa',
|
|
129
|
+
'PEN' => 'Sol',
|
|
130
|
+
'PGK' => 'Kina',
|
|
131
|
+
'PHP' => 'Philippine Peso',
|
|
132
|
+
'PKR' => 'Pakistan Rupee',
|
|
133
|
+
'PLN' => 'Zloty',
|
|
134
|
+
'PYG' => 'Guarani',
|
|
135
|
+
'QAR' => 'Qatari Rial',
|
|
136
|
+
'RON' => 'Romanian Leu',
|
|
137
|
+
'RSD' => 'Serbian Dinar',
|
|
138
|
+
'RUB' => 'Russian Ruble',
|
|
139
|
+
'RWF' => 'Rwanda Franc',
|
|
140
|
+
'SAR' => 'Saudi Riyal',
|
|
141
|
+
'SBD' => 'Solomon Islands Dollar',
|
|
142
|
+
'SCR' => 'Seychelles Rupee',
|
|
143
|
+
'SDG' => 'Sudanese Pound',
|
|
144
|
+
'SEK' => 'Swedish Krona',
|
|
145
|
+
'SGD' => 'Singapore Dollar',
|
|
146
|
+
'SHP' => 'Saint Helena Pound',
|
|
147
|
+
'SLL' => 'Leone',
|
|
148
|
+
'SOS' => 'Somali Shilling',
|
|
149
|
+
'SRD' => 'Surinam Dollar',
|
|
150
|
+
'SSP' => 'South Sudanese Pound',
|
|
151
|
+
'STN' => 'Dobra',
|
|
152
|
+
'SVC' => 'El Salvador Colon',
|
|
153
|
+
'SYP' => 'Syrian Pound',
|
|
154
|
+
'SZL' => 'Lilangeni',
|
|
155
|
+
'THB' => 'Baht',
|
|
156
|
+
'TJS' => 'Somoni',
|
|
157
|
+
'TMT' => 'Turkmenistan New Manat',
|
|
158
|
+
'TND' => 'Tunisian Dinar',
|
|
159
|
+
'TOP' => 'Pa’anga',
|
|
160
|
+
'TRY' => 'Turkish Lira',
|
|
161
|
+
'TTD' => 'Trinidad and Tobago Dollar',
|
|
162
|
+
'TWD' => 'New Taiwan Dollar',
|
|
163
|
+
'TZS' => 'Tanzanian Shilling',
|
|
164
|
+
'UAH' => 'Hryvnia',
|
|
165
|
+
'UGX' => 'Uganda Shilling',
|
|
166
|
+
'USD' => 'US Dollar',
|
|
167
|
+
'USN' => 'US Dollar (Next day)',
|
|
168
|
+
'UYI' => 'Uruguay Peso en Unidades Indexadas (UI)',
|
|
169
|
+
'UYU' => 'Peso Uruguayo',
|
|
170
|
+
'UYW' => 'Unidad Previsional',
|
|
171
|
+
'UZS' => 'Uzbekistan Sum',
|
|
172
|
+
'VES' => 'Bolívar Soberano',
|
|
173
|
+
'VND' => 'Dong',
|
|
174
|
+
'VUV' => 'Vatu',
|
|
175
|
+
'WST' => 'Tala',
|
|
176
|
+
'XAF' => 'CFA Franc BEAC',
|
|
177
|
+
'XCD' => 'East Caribbean Dollar',
|
|
178
|
+
'XOF' => 'CFA Franc BCEAO',
|
|
179
|
+
'XPF' => 'CFP Franc',
|
|
180
|
+
'YER' => 'Yemeni Rial',
|
|
181
|
+
'ZAR' => 'Rand',
|
|
182
|
+
'ZMW' => 'Zambian Kwacha',
|
|
183
|
+
'ZWL' => 'Zimbabwe Dollar'
|
|
184
|
+
}.freeze
|
|
185
|
+
|
|
186
|
+
attribute :_value, GOBL::Types::String.enum(*ENUM.keys)
|
|
187
|
+
private :_value
|
|
188
|
+
|
|
189
|
+
# Creates a new object from a GOBL value
|
|
190
|
+
#
|
|
191
|
+
# @param data [String] the GOBL value
|
|
192
|
+
#
|
|
193
|
+
# @return [Code] the object created from the given data
|
|
194
|
+
def self.from_gobl!(data)
|
|
195
|
+
new(_value: data)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Returns a GOBL value representing the current object
|
|
199
|
+
#
|
|
200
|
+
# @return [String] the GOBL value that represents the current object
|
|
201
|
+
def to_gobl
|
|
202
|
+
_value
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Returns a {Code} that corresponds to a given object. The object can be a
|
|
206
|
+
# `Symbol`, a `String` or anything coercible into one (via `#to_s`).
|
|
207
|
+
#
|
|
208
|
+
# @param object [Symbol, String, #to_s] the value of the object.
|
|
209
|
+
#
|
|
210
|
+
# @return [Code] the object corresponding to the given value.
|
|
211
|
+
#
|
|
212
|
+
# @example Instantiating from a symbol
|
|
213
|
+
# code = GOBL::Currency::Code.new(:aed)
|
|
214
|
+
#
|
|
215
|
+
# @example Instantiating from a string
|
|
216
|
+
# code = GOBL::Currency::Code.new('AED')
|
|
217
|
+
def self.new(object)
|
|
218
|
+
case object
|
|
219
|
+
when Hash, self # internal use, not to be used in public calls
|
|
220
|
+
super
|
|
221
|
+
when Symbol
|
|
222
|
+
new find_by_sym(object)
|
|
223
|
+
else
|
|
224
|
+
super _value: object.to_s
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# Returns the string representation of the current object
|
|
229
|
+
#
|
|
230
|
+
# @return [String] the string representation of the current object
|
|
231
|
+
def to_s
|
|
232
|
+
_value.to_s
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Returns the symbol representation of the current object
|
|
236
|
+
#
|
|
237
|
+
# @return [Symbol] the symbol representation of the current object
|
|
238
|
+
def to_sym
|
|
239
|
+
to_s.parameterize.underscore.to_sym
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# Returns whether the current object is equivalent to a given one. In addition
|
|
243
|
+
# to {Code} objects, the current object can be compared to a `Symbol`, a
|
|
244
|
+
# `String` or anything coercible into one (via `#to_s`)
|
|
245
|
+
#
|
|
246
|
+
# @param other [Code, Symbol, String, #to_s] the other object to compare to
|
|
247
|
+
#
|
|
248
|
+
# @return [Boolean] `true` if the objects are equivalent, `false` otherwise
|
|
249
|
+
#
|
|
250
|
+
# @example Comparing to another {Code} object
|
|
251
|
+
# code = GOBL::Currency::Code.new('AED')
|
|
252
|
+
# code == GOBL::Currency::Code.new('AED') #=> true
|
|
253
|
+
# code == GOBL::Currency::Code.new('AFN') #=> false
|
|
254
|
+
#
|
|
255
|
+
# @example Comparing to a string
|
|
256
|
+
# code = GOBL::Currency::Code.new('AED')
|
|
257
|
+
# code == 'AED' #=> true
|
|
258
|
+
# code == 'AFN' #=> false
|
|
259
|
+
#
|
|
260
|
+
# @example Comparing to a symbol
|
|
261
|
+
# code = GOBL::Currency::Code.new('AED')
|
|
262
|
+
# code == :aed #=> true
|
|
263
|
+
# code == :afn #=> false
|
|
264
|
+
def ==(other)
|
|
265
|
+
case other
|
|
266
|
+
when self.class
|
|
267
|
+
super
|
|
268
|
+
when Symbol
|
|
269
|
+
to_sym == other
|
|
270
|
+
else
|
|
271
|
+
to_s == other.to_s
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
# Returns an array with all the enumerated objects of this type
|
|
276
|
+
#
|
|
277
|
+
# @return [Array<Code>] the array of enumerated objects
|
|
278
|
+
def self.all
|
|
279
|
+
ENUM.keys.map { |key| new(key) }
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
# @api private
|
|
283
|
+
def self.find_by_sym(sym)
|
|
284
|
+
all.find { |object| object.to_sym == sym }
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
# @api private
|
|
288
|
+
def self.find_by_inquirer(method_name)
|
|
289
|
+
method_name =~ /(.+)\?$/ && find_by_sym(Regexp.last_match(1).to_sym)
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
# Returns the description of the current object
|
|
293
|
+
#
|
|
294
|
+
# @return [String] the description of the current object
|
|
295
|
+
def description
|
|
296
|
+
ENUM.fetch(_value, _value)
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
# @api private
|
|
300
|
+
def respond_to_missing?(method_name, include_private = false)
|
|
301
|
+
self.class.find_by_inquirer(method_name) || super
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
# Enables dynamic value inquirers like `Code#aed?` for
|
|
305
|
+
# each of the declared enum values (see {ENUM}). Each inquirer returns a
|
|
306
|
+
# `Boolean` denoting whether the value equals the enquired value (`true`) or
|
|
307
|
+
# not (`false`)
|
|
308
|
+
#
|
|
309
|
+
# @example
|
|
310
|
+
# code = GOBL::Currency::Code.new('AED')
|
|
311
|
+
# code.aed? # => true
|
|
312
|
+
# code.afn? # => false
|
|
313
|
+
def method_missing(method_name, *args, &block)
|
|
314
|
+
if value = self.class.find_by_inquirer(method_name)
|
|
315
|
+
self == value
|
|
316
|
+
else
|
|
317
|
+
super
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|