gobl 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +7 -0
  2. data/data/tax/ES.json +841 -0
  3. data/data/tax/FR.json +47 -0
  4. data/data/tax/GB.json +56 -0
  5. data/data/tax/NL.json +60 -0
  6. data/home/cavalle/workspace/invopop/gobl.ruby/gobl.gemspec +30 -0
  7. data/lib/extensions.rb +12 -0
  8. data/lib/gobl/bill/advances.rb +90 -0
  9. data/lib/gobl/bill/charge.rb +121 -0
  10. data/lib/gobl/bill/delivery.rb +79 -0
  11. data/lib/gobl/bill/discount.rb +121 -0
  12. data/lib/gobl/bill/exchange_rates.rb +90 -0
  13. data/lib/gobl/bill/invoice.rb +209 -0
  14. data/lib/gobl/bill/invoice_type.rb +163 -0
  15. data/lib/gobl/bill/line.rb +121 -0
  16. data/lib/gobl/bill/line_charge.rb +79 -0
  17. data/lib/gobl/bill/line_discount.rb +79 -0
  18. data/lib/gobl/bill/ordering.rb +58 -0
  19. data/lib/gobl/bill/outlay.rb +107 -0
  20. data/lib/gobl/bill/payment.rb +79 -0
  21. data/lib/gobl/bill/preceding.rb +114 -0
  22. data/lib/gobl/bill/scheme_keys.rb +90 -0
  23. data/lib/gobl/bill/tax.rb +72 -0
  24. data/lib/gobl/bill/totals.rb +135 -0
  25. data/lib/gobl/cal/date.rb +106 -0
  26. data/lib/gobl/cal/period.rb +63 -0
  27. data/lib/gobl/config.rb +14 -0
  28. data/lib/gobl/currency/code.rb +322 -0
  29. data/lib/gobl/currency/exchange_rate.rb +65 -0
  30. data/lib/gobl/document.rb +70 -0
  31. data/lib/gobl/dsig/digest.rb +65 -0
  32. data/lib/gobl/dsig/signature.rb +106 -0
  33. data/lib/gobl/envelope.rb +77 -0
  34. data/lib/gobl/header.rb +98 -0
  35. data/lib/gobl/i18n/string.rb +72 -0
  36. data/lib/gobl/id.rb +80 -0
  37. data/lib/gobl/l10n/code.rb +106 -0
  38. data/lib/gobl/l10n/country_code.rb +405 -0
  39. data/lib/gobl/note/message.rb +72 -0
  40. data/lib/gobl/num/amount.rb +248 -0
  41. data/lib/gobl/num/percentage.rb +84 -0
  42. data/lib/gobl/operations/service_error.rb +10 -0
  43. data/lib/gobl/operations/validation_result.rb +46 -0
  44. data/lib/gobl/operations.rb +170 -0
  45. data/lib/gobl/org/address.rb +156 -0
  46. data/lib/gobl/org/code.rb +106 -0
  47. data/lib/gobl/org/coordinates.rb +79 -0
  48. data/lib/gobl/org/email.rb +79 -0
  49. data/lib/gobl/org/inbox.rb +86 -0
  50. data/lib/gobl/org/item.rb +121 -0
  51. data/lib/gobl/org/item_code.rb +65 -0
  52. data/lib/gobl/org/key.rb +106 -0
  53. data/lib/gobl/org/meta.rb +72 -0
  54. data/lib/gobl/org/name.rb +114 -0
  55. data/lib/gobl/org/note.rb +79 -0
  56. data/lib/gobl/org/note_key.rb +181 -0
  57. data/lib/gobl/org/party.rb +135 -0
  58. data/lib/gobl/org/person.rb +100 -0
  59. data/lib/gobl/org/registration.rb +99 -0
  60. data/lib/gobl/org/source_key.rb +161 -0
  61. data/lib/gobl/org/tax_identity.rb +93 -0
  62. data/lib/gobl/org/telephone.rb +72 -0
  63. data/lib/gobl/org/unit.rb +204 -0
  64. data/lib/gobl/pay/advance.rb +107 -0
  65. data/lib/gobl/pay/card.rb +65 -0
  66. data/lib/gobl/pay/credit_transfer.rb +86 -0
  67. data/lib/gobl/pay/direct_debit.rb +72 -0
  68. data/lib/gobl/pay/due_date.rb +86 -0
  69. data/lib/gobl/pay/instructions.rb +114 -0
  70. data/lib/gobl/pay/method_key.rb +163 -0
  71. data/lib/gobl/pay/online.rb +65 -0
  72. data/lib/gobl/pay/term_key.rb +166 -0
  73. data/lib/gobl/pay/terms.rb +79 -0
  74. data/lib/gobl/stamp.rb +63 -0
  75. data/lib/gobl/struct.rb +48 -0
  76. data/lib/gobl/tax/category.rb +83 -0
  77. data/lib/gobl/tax/category_total.rb +87 -0
  78. data/lib/gobl/tax/combo.rb +79 -0
  79. data/lib/gobl/tax/localities.rb +90 -0
  80. data/lib/gobl/tax/locality.rb +72 -0
  81. data/lib/gobl/tax/rate.rb +77 -0
  82. data/lib/gobl/tax/rate_total.rb +82 -0
  83. data/lib/gobl/tax/rate_total_surcharge.rb +63 -0
  84. data/lib/gobl/tax/rate_value.rb +79 -0
  85. data/lib/gobl/tax/region.rb +100 -0
  86. data/lib/gobl/tax/scheme.rb +86 -0
  87. data/lib/gobl/tax/schemes.rb +90 -0
  88. data/lib/gobl/tax/set.rb +90 -0
  89. data/lib/gobl/tax/total.rb +65 -0
  90. data/lib/gobl/types.rb +17 -0
  91. data/lib/gobl/uuid/uuid.rb +106 -0
  92. data/lib/gobl/version.rb +5 -0
  93. data/lib/gobl.rb +41 -0
  94. data/lib/gobl_extensions/document_helper.rb +45 -0
  95. data/lib/gobl_extensions/envelope_helper.rb +15 -0
  96. data/lib/gobl_extensions/i18n/value_keys_helper.rb +27 -0
  97. data/lib/gobl_extensions/tax/region_helper.rb +41 -0
  98. metadata +225 -0
@@ -0,0 +1,114 @@
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 Pay
11
+ # Instructions holds a set of instructions that determine how the payment has or should be made.
12
+ class Instructions < GOBL::Struct
13
+ # The Schema ID of the GOBL Instructions structure
14
+ SCHEMA_ID = 'https://gobl.org/draft-0/pay/instructions'
15
+
16
+ # @!attribute [r] key
17
+ # How payment is expected or has been arranged to be collected
18
+ # @return [MethodKey]
19
+ attribute :key, MethodKey
20
+
21
+ # @!attribute [r] detail
22
+ # Optional text description of the payment method
23
+ # @return [String]
24
+ attribute? :detail, GOBL::Types::String.optional
25
+
26
+ # @!attribute [r] ref
27
+ # Remittance information, a text value used to link the payment with the invoice.
28
+ # @return [String]
29
+ attribute? :ref, GOBL::Types::String.optional
30
+
31
+ # @!attribute [r] credit_transfer
32
+ # Instructions for sending payment via a bank transfer.
33
+ # @return [Array<CreditTransfer>]
34
+ attribute? :credit_transfer, GOBL::Types::Array.of(CreditTransfer).optional
35
+
36
+ # @!attribute [r] card
37
+ # Details of the payment that will be made via a credit or debit card.
38
+ # @return [Card]
39
+ attribute? :card, Card.optional
40
+
41
+ # @!attribute [r] direct_debit
42
+ # A group of terms that can be used by the customer or payer to consolidate direct debit payments.
43
+ # @return [DirectDebit]
44
+ attribute? :direct_debit, DirectDebit.optional
45
+
46
+ # @!attribute [r] online
47
+ # Array of online payment options
48
+ # @return [Array<Online>]
49
+ attribute? :online, GOBL::Types::Array.of(Online).optional
50
+
51
+ # @!attribute [r] notes
52
+ # Any additional instructions that may be required to make the payment.
53
+ # @return [String]
54
+ attribute? :notes, GOBL::Types::String.optional
55
+
56
+ # @!attribute [r] meta
57
+ # Non-structured additional data that may be useful.
58
+ # @return [GOBL::Org::Meta]
59
+ attribute? :meta, GOBL::Org::Meta.optional
60
+
61
+ # Creates a new object from a hash of GOBL data
62
+ #
63
+ # @param data [Hash] a hash of GOBL data
64
+ #
65
+ # @return [Instructions] the object created from the given data
66
+ def self.from_gobl!(data)
67
+ data = GOBL::Types::Hash[data]
68
+
69
+ new(
70
+ key: MethodKey.from_gobl!(data['key']),
71
+ detail: data['detail'],
72
+ ref: data['ref'],
73
+ credit_transfer: data['credit_transfer']&.map { |item| CreditTransfer.from_gobl!(item) },
74
+ card: data['card'] ? Card.from_gobl!(data['card']) : nil,
75
+ direct_debit: data['direct_debit'] ? DirectDebit.from_gobl!(data['direct_debit']) : nil,
76
+ online: data['online']&.map { |item| Online.from_gobl!(item) },
77
+ notes: data['notes'],
78
+ meta: data['meta'] ? GOBL::Org::Meta.from_gobl!(data['meta']) : nil
79
+ )
80
+ end
81
+
82
+ # Returns a hash of GOBL data representing the current object
83
+ #
84
+ # @return [Hash] the array of GOBL data that represents the current object
85
+ def to_gobl
86
+ {
87
+ 'key' => attributes[:key]&.to_gobl,
88
+ 'detail' => attributes[:detail],
89
+ 'ref' => attributes[:ref],
90
+ 'credit_transfer' => attributes[:credit_transfer]&.map { |item| item&.to_gobl },
91
+ 'card' => attributes[:card]&.to_gobl,
92
+ 'direct_debit' => attributes[:direct_debit]&.to_gobl,
93
+ 'online' => attributes[:online]&.map { |item| item&.to_gobl },
94
+ 'notes' => attributes[:notes],
95
+ 'meta' => attributes[:meta]&.to_gobl
96
+ }.compact
97
+ end
98
+
99
+ # @!method self.new(attrs)
100
+ #
101
+ # Returns a {Instructions} object from a given hash of attributes. Nested
102
+ # attributes are supported: the constructor will instantiate the proper GOBL
103
+ # objects when nested hashes or arrays are given as part of the `attrs`
104
+ # parameter.
105
+ #
106
+ # The `new` method will only allow to create a new object if all attributes
107
+ # marked as mandatory and not calculated in the JSON schema are provided.
108
+ #
109
+ # @param attrs [Hash] the hash of attributes
110
+ #
111
+ # @return [Instructions] the object corresponding to the given input
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,163 @@
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 Pay
11
+ # Method Key describes how a payment should be made
12
+ class MethodKey < GOBL::Struct
13
+ # The Schema ID of the GOBL MethodKey structure
14
+ SCHEMA_ID = 'https://gobl.org/draft-0/pay/instructions#/$defs/MethodKey'
15
+
16
+ # The enumeration of values of the object and their descriptions (Values different to these are not allowed)
17
+ ENUM = {
18
+ 'any' => 'Any method available, no preference',
19
+ 'card' => 'Credit or debit card',
20
+ 'credit-transfer' => 'Send initiated bank or wire transfer',
21
+ 'debit-transfer' => 'Receive initiated bank or wire transfer',
22
+ 'cash' => 'Cash',
23
+ 'direct-debit' => 'Direct debit',
24
+ 'online' => 'Online or web payment'
25
+ }.freeze
26
+
27
+ attribute :_value, GOBL::Types::String.enum(*ENUM.keys)
28
+ private :_value
29
+
30
+ # Creates a new object from a GOBL value
31
+ #
32
+ # @param data [String] the GOBL value
33
+ #
34
+ # @return [MethodKey] the object created from the given data
35
+ def self.from_gobl!(data)
36
+ new(_value: data)
37
+ end
38
+
39
+ # Returns a GOBL value representing the current object
40
+ #
41
+ # @return [String] the GOBL value that represents the current object
42
+ def to_gobl
43
+ _value
44
+ end
45
+
46
+ # Returns a {MethodKey} that corresponds to a given object. The object can be a
47
+ # `Symbol`, a `String` or anything coercible into one (via `#to_s`).
48
+ #
49
+ # @param object [Symbol, String, #to_s] the value of the object.
50
+ #
51
+ # @return [MethodKey] the object corresponding to the given value.
52
+ #
53
+ # @example Instantiating from a symbol
54
+ # method_key = GOBL::Pay::MethodKey.new(:any)
55
+ #
56
+ # @example Instantiating from a string
57
+ # method_key = GOBL::Pay::MethodKey.new('any')
58
+ def self.new(object)
59
+ case object
60
+ when Hash, self # internal use, not to be used in public calls
61
+ super
62
+ when Symbol
63
+ new find_by_sym(object)
64
+ else
65
+ super _value: object.to_s
66
+ end
67
+ end
68
+
69
+ # Returns the string representation of the current object
70
+ #
71
+ # @return [String] the string representation of the current object
72
+ def to_s
73
+ _value.to_s
74
+ end
75
+
76
+ # Returns the symbol representation of the current object
77
+ #
78
+ # @return [Symbol] the symbol representation of the current object
79
+ def to_sym
80
+ to_s.parameterize.underscore.to_sym
81
+ end
82
+
83
+ # Returns whether the current object is equivalent to a given one. In addition
84
+ # to {MethodKey} objects, the current object can be compared to a `Symbol`, a
85
+ # `String` or anything coercible into one (via `#to_s`)
86
+ #
87
+ # @param other [MethodKey, Symbol, String, #to_s] the other object to compare to
88
+ #
89
+ # @return [Boolean] `true` if the objects are equivalent, `false` otherwise
90
+ #
91
+ # @example Comparing to another {MethodKey} object
92
+ # method_key = GOBL::Pay::MethodKey.new('any')
93
+ # method_key == GOBL::Pay::MethodKey.new('any') #=> true
94
+ # method_key == GOBL::Pay::MethodKey.new('card') #=> false
95
+ #
96
+ # @example Comparing to a string
97
+ # method_key = GOBL::Pay::MethodKey.new('any')
98
+ # method_key == 'any' #=> true
99
+ # method_key == 'card' #=> false
100
+ #
101
+ # @example Comparing to a symbol
102
+ # method_key = GOBL::Pay::MethodKey.new('any')
103
+ # method_key == :any #=> true
104
+ # method_key == :card #=> false
105
+ def ==(other)
106
+ case other
107
+ when self.class
108
+ super
109
+ when Symbol
110
+ to_sym == other
111
+ else
112
+ to_s == other.to_s
113
+ end
114
+ end
115
+
116
+ # Returns an array with all the enumerated objects of this type
117
+ #
118
+ # @return [Array<MethodKey>] the array of enumerated objects
119
+ def self.all
120
+ ENUM.keys.map { |key| new(key) }
121
+ end
122
+
123
+ # @api private
124
+ def self.find_by_sym(sym)
125
+ all.find { |object| object.to_sym == sym }
126
+ end
127
+
128
+ # @api private
129
+ def self.find_by_inquirer(method_name)
130
+ method_name =~ /(.+)\?$/ && find_by_sym(Regexp.last_match(1).to_sym)
131
+ end
132
+
133
+ # Returns the description of the current object
134
+ #
135
+ # @return [String] the description of the current object
136
+ def description
137
+ ENUM.fetch(_value, _value)
138
+ end
139
+
140
+ # @api private
141
+ def respond_to_missing?(method_name, include_private = false)
142
+ self.class.find_by_inquirer(method_name) || super
143
+ end
144
+
145
+ # Enables dynamic value inquirers like `MethodKey#any?` for
146
+ # each of the declared enum values (see {ENUM}). Each inquirer returns a
147
+ # `Boolean` denoting whether the value equals the enquired value (`true`) or
148
+ # not (`false`)
149
+ #
150
+ # @example
151
+ # method_key = GOBL::Pay::MethodKey.new('any')
152
+ # method_key.any? # => true
153
+ # method_key.card? # => false
154
+ def method_missing(method_name, *args, &block)
155
+ if value = self.class.find_by_inquirer(method_name)
156
+ self == value
157
+ else
158
+ super
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,65 @@
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 Pay
11
+ # Online provides the details required to make a payment online using a website
12
+ class Online < GOBL::Struct
13
+ # The Schema ID of the GOBL Online structure
14
+ SCHEMA_ID = 'https://gobl.org/draft-0/pay/instructions#/$defs/Online'
15
+
16
+ # @!attribute [r] name
17
+ # Descriptive name given to the online provider.
18
+ # @return [String]
19
+ attribute? :name, GOBL::Types::String.optional
20
+
21
+ # @!attribute [r] addr
22
+ # Full URL to be used for payment.
23
+ # @return [String]
24
+ attribute :addr, GOBL::Types::String
25
+
26
+ # Creates a new object from a hash of GOBL data
27
+ #
28
+ # @param data [Hash] a hash of GOBL data
29
+ #
30
+ # @return [Online] the object created from the given data
31
+ def self.from_gobl!(data)
32
+ data = GOBL::Types::Hash[data]
33
+
34
+ new(
35
+ name: data['name'],
36
+ addr: data['addr']
37
+ )
38
+ end
39
+
40
+ # Returns a hash of GOBL data representing the current object
41
+ #
42
+ # @return [Hash] the array of GOBL data that represents the current object
43
+ def to_gobl
44
+ {
45
+ 'name' => attributes[:name],
46
+ 'addr' => attributes[:addr]
47
+ }.compact
48
+ end
49
+
50
+ # @!method self.new(attrs)
51
+ #
52
+ # Returns a {Online} object from a given hash of attributes. Nested
53
+ # attributes are supported: the constructor will instantiate the proper GOBL
54
+ # objects when nested hashes or arrays are given as part of the `attrs`
55
+ # parameter.
56
+ #
57
+ # The `new` method will only allow to create a new object if all attributes
58
+ # marked as mandatory and not calculated in the JSON schema are provided.
59
+ #
60
+ # @param attrs [Hash] the hash of attributes
61
+ #
62
+ # @return [Online] the object corresponding to the given input
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,166 @@
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 Pay
11
+ # Payment terms key
12
+ class TermKey < GOBL::Struct
13
+ # The Schema ID of the GOBL TermKey structure
14
+ SCHEMA_ID = 'https://gobl.org/draft-0/pay/terms#/$defs/TermKey'
15
+
16
+ # The enumeration of values of the object and their descriptions (Values different to these are not allowed)
17
+ ENUM = {
18
+ '' => 'Not yet defined',
19
+ 'end-of-month' => 'End of month',
20
+ 'due-date' => 'Due on a specific date',
21
+ 'deferred' => 'Deferred until after the due date',
22
+ 'proximo' => 'Month after the present',
23
+ 'instant' => 'On receipt of invoice',
24
+ 'elective' => 'Chosen by the buyer',
25
+ 'pending' => 'Seller to advise buyer in separate transaction',
26
+ 'advance' => 'Payment made in advance',
27
+ 'delivery' => 'Payment on Delivery'
28
+ }.freeze
29
+
30
+ attribute :_value, GOBL::Types::String.enum(*ENUM.keys)
31
+ private :_value
32
+
33
+ # Creates a new object from a GOBL value
34
+ #
35
+ # @param data [String] the GOBL value
36
+ #
37
+ # @return [TermKey] the object created from the given data
38
+ def self.from_gobl!(data)
39
+ new(_value: data)
40
+ end
41
+
42
+ # Returns a GOBL value representing the current object
43
+ #
44
+ # @return [String] the GOBL value that represents the current object
45
+ def to_gobl
46
+ _value
47
+ end
48
+
49
+ # Returns a {TermKey} that corresponds to a given object. The object can be a
50
+ # `Symbol`, a `String` or anything coercible into one (via `#to_s`).
51
+ #
52
+ # @param object [Symbol, String, #to_s] the value of the object.
53
+ #
54
+ # @return [TermKey] the object corresponding to the given value.
55
+ #
56
+ # @example Instantiating from a symbol
57
+ # term_key = GOBL::Pay::TermKey.new(:)
58
+ #
59
+ # @example Instantiating from a string
60
+ # term_key = GOBL::Pay::TermKey.new('')
61
+ def self.new(object)
62
+ case object
63
+ when Hash, self # internal use, not to be used in public calls
64
+ super
65
+ when Symbol
66
+ new find_by_sym(object)
67
+ else
68
+ super _value: object.to_s
69
+ end
70
+ end
71
+
72
+ # Returns the string representation of the current object
73
+ #
74
+ # @return [String] the string representation of the current object
75
+ def to_s
76
+ _value.to_s
77
+ end
78
+
79
+ # Returns the symbol representation of the current object
80
+ #
81
+ # @return [Symbol] the symbol representation of the current object
82
+ def to_sym
83
+ to_s.parameterize.underscore.to_sym
84
+ end
85
+
86
+ # Returns whether the current object is equivalent to a given one. In addition
87
+ # to {TermKey} objects, the current object can be compared to a `Symbol`, a
88
+ # `String` or anything coercible into one (via `#to_s`)
89
+ #
90
+ # @param other [TermKey, Symbol, String, #to_s] the other object to compare to
91
+ #
92
+ # @return [Boolean] `true` if the objects are equivalent, `false` otherwise
93
+ #
94
+ # @example Comparing to another {TermKey} object
95
+ # term_key = GOBL::Pay::TermKey.new('')
96
+ # term_key == GOBL::Pay::TermKey.new('') #=> true
97
+ # term_key == GOBL::Pay::TermKey.new('end-of-month') #=> false
98
+ #
99
+ # @example Comparing to a string
100
+ # term_key = GOBL::Pay::TermKey.new('')
101
+ # term_key == '' #=> true
102
+ # term_key == 'end-of-month' #=> false
103
+ #
104
+ # @example Comparing to a symbol
105
+ # term_key = GOBL::Pay::TermKey.new('')
106
+ # term_key == : #=> true
107
+ # term_key == :end_of_month #=> false
108
+ def ==(other)
109
+ case other
110
+ when self.class
111
+ super
112
+ when Symbol
113
+ to_sym == other
114
+ else
115
+ to_s == other.to_s
116
+ end
117
+ end
118
+
119
+ # Returns an array with all the enumerated objects of this type
120
+ #
121
+ # @return [Array<TermKey>] the array of enumerated objects
122
+ def self.all
123
+ ENUM.keys.map { |key| new(key) }
124
+ end
125
+
126
+ # @api private
127
+ def self.find_by_sym(sym)
128
+ all.find { |object| object.to_sym == sym }
129
+ end
130
+
131
+ # @api private
132
+ def self.find_by_inquirer(method_name)
133
+ method_name =~ /(.+)\?$/ && find_by_sym(Regexp.last_match(1).to_sym)
134
+ end
135
+
136
+ # Returns the description of the current object
137
+ #
138
+ # @return [String] the description of the current object
139
+ def description
140
+ ENUM.fetch(_value, _value)
141
+ end
142
+
143
+ # @api private
144
+ def respond_to_missing?(method_name, include_private = false)
145
+ self.class.find_by_inquirer(method_name) || super
146
+ end
147
+
148
+ # Enables dynamic value inquirers like `TermKey#?` for
149
+ # each of the declared enum values (see {ENUM}). Each inquirer returns a
150
+ # `Boolean` denoting whether the value equals the enquired value (`true`) or
151
+ # not (`false`)
152
+ #
153
+ # @example
154
+ # term_key = GOBL::Pay::TermKey.new('')
155
+ # term_key.? # => true
156
+ # term_key.end_of_month? # => false
157
+ def method_missing(method_name, *args, &block)
158
+ if value = self.class.find_by_inquirer(method_name)
159
+ self == value
160
+ else
161
+ super
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,79 @@
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 Pay
11
+ # Terms defines when we expect the customer to pay, or have paid, for the contents of the document.
12
+ class Terms < GOBL::Struct
13
+ # The Schema ID of the GOBL Terms structure
14
+ SCHEMA_ID = 'https://gobl.org/draft-0/pay/terms'
15
+
16
+ # @!attribute [r] key
17
+ # Type of terms to be applied.
18
+ # @return [TermKey]
19
+ attribute :key, TermKey
20
+
21
+ # @!attribute [r] detail
22
+ # Text detail of the chosen payment terms.
23
+ # @return [String]
24
+ attribute? :detail, GOBL::Types::String.optional
25
+
26
+ # @!attribute [r] due_dates
27
+ # Set of dates for agreed payments.
28
+ # @return [Array<DueDate>]
29
+ attribute? :due_dates, GOBL::Types::Array.of(DueDate).optional
30
+
31
+ # @!attribute [r] notes
32
+ # Description of the conditions for payment.
33
+ # @return [String]
34
+ attribute? :notes, GOBL::Types::String.optional
35
+
36
+ # Creates a new object from a hash of GOBL data
37
+ #
38
+ # @param data [Hash] a hash of GOBL data
39
+ #
40
+ # @return [Terms] the object created from the given data
41
+ def self.from_gobl!(data)
42
+ data = GOBL::Types::Hash[data]
43
+
44
+ new(
45
+ key: TermKey.from_gobl!(data['key']),
46
+ detail: data['detail'],
47
+ due_dates: data['due_dates']&.map { |item| DueDate.from_gobl!(item) },
48
+ notes: data['notes']
49
+ )
50
+ end
51
+
52
+ # Returns a hash of GOBL data representing the current object
53
+ #
54
+ # @return [Hash] the array of GOBL data that represents the current object
55
+ def to_gobl
56
+ {
57
+ 'key' => attributes[:key]&.to_gobl,
58
+ 'detail' => attributes[:detail],
59
+ 'due_dates' => attributes[:due_dates]&.map { |item| item&.to_gobl },
60
+ 'notes' => attributes[:notes]
61
+ }.compact
62
+ end
63
+
64
+ # @!method self.new(attrs)
65
+ #
66
+ # Returns a {Terms} object from a given hash of attributes. Nested
67
+ # attributes are supported: the constructor will instantiate the proper GOBL
68
+ # objects when nested hashes or arrays are given as part of the `attrs`
69
+ # parameter.
70
+ #
71
+ # The `new` method will only allow to create a new object if all attributes
72
+ # marked as mandatory and not calculated in the JSON schema are provided.
73
+ #
74
+ # @param attrs [Hash] the hash of attributes
75
+ #
76
+ # @return [Terms] the object corresponding to the given input
77
+ end
78
+ end
79
+ end
data/lib/gobl/stamp.rb ADDED
@@ -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
+ # Stamp defines an official seal of approval from a third party like a governmental agency or intermediary and should thus be included in any official envelopes.
11
+ class Stamp < GOBL::Struct
12
+ # The Schema ID of the GOBL Stamp structure
13
+ SCHEMA_ID = 'https://gobl.org/draft-0/envelope#/$defs/Stamp'
14
+
15
+ # @!attribute [r] prv
16
+ # Identity of the agency used to create the stamp usually defined by each region.
17
+ # @return [GOBL::Org::Key]
18
+ attribute :prv, GOBL::Org::Key
19
+
20
+ # @!attribute [r] val
21
+ # The serialized stamp value generated for or by the external agency
22
+ # @return [String]
23
+ attribute :val, GOBL::Types::String
24
+
25
+ # Creates a new object from a hash of GOBL data
26
+ #
27
+ # @param data [Hash] a hash of GOBL data
28
+ #
29
+ # @return [Stamp] the object created from the given data
30
+ def self.from_gobl!(data)
31
+ data = GOBL::Types::Hash[data]
32
+
33
+ new(
34
+ prv: GOBL::Org::Key.from_gobl!(data['prv']),
35
+ val: data['val']
36
+ )
37
+ end
38
+
39
+ # Returns a hash of GOBL data representing the current object
40
+ #
41
+ # @return [Hash] the array of GOBL data that represents the current object
42
+ def to_gobl
43
+ {
44
+ 'prv' => attributes[:prv]&.to_gobl,
45
+ 'val' => attributes[:val]
46
+ }.compact
47
+ end
48
+
49
+ # @!method self.new(attrs)
50
+ #
51
+ # Returns a {Stamp} object from a given hash of attributes. Nested
52
+ # attributes are supported: the constructor will instantiate the proper GOBL
53
+ # objects when nested hashes or arrays are given as part of the `attrs`
54
+ # parameter.
55
+ #
56
+ # The `new` method will only allow to create a new object if all attributes
57
+ # marked as mandatory and not calculated in the JSON schema are provided.
58
+ #
59
+ # @param attrs [Hash] the hash of attributes
60
+ #
61
+ # @return [Stamp] the object corresponding to the given input
62
+ end
63
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GOBL
4
+ # Base class for any GOBL structure
5
+ class Struct < Dry::Struct
6
+ # Returns a new GOBL struct from a hash of GOBL data. The type of the returned struct
7
+ # is determined from the `$schema` attribute.
8
+ #
9
+ # This method is usually overwritten at sub-class level, where the `$schema` attribute
10
+ # isn't necessary since the type is determined by the sub-class itself.
11
+ #
12
+ # @param data [Hash] the hash of GOBL data
13
+ #
14
+ # @return [GOBL::Struct] the created GOBL struct
15
+ def self.from_gobl!(data)
16
+ raise ArgumentError, 'Schema not present in the given data' unless data&.key?('$schema')
17
+
18
+ schema = GOBL::ID.new(data['$schema'])
19
+
20
+ # This could become more sophisticated in the future. For the moment, any schema not
21
+ # being an envelope is considered to be a document as these are the only two structures
22
+ # that are required to specify its schema.
23
+ if schema.name == 'envelope'
24
+ GOBL::Envelope.from_gobl! data
25
+ else
26
+ GOBL::Document.from_gobl! data
27
+ end
28
+ end
29
+
30
+ # Deserializes a GOBL struct from a JSON string
31
+ #
32
+ # @param json [String] the JSON string representing the GOBL struct
33
+ #
34
+ # @return [GOBL::Struct] the deserialized GOBL struct
35
+ def self.from_json!(json)
36
+ from_gobl!(JSON.parse(json))
37
+ end
38
+
39
+ # Serializes a GOBL struct into a JSON string
40
+ #
41
+ # @param options [#to_h] a Hash-like object to pass to `JSON.generate`
42
+ #
43
+ # @return [GOBL::Struct] the JSON string representing the GOBL struct
44
+ def to_json(options = nil)
45
+ JSON.generate(to_gobl, options)
46
+ end
47
+ end
48
+ end