gobl 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ext/hashme.rb +28 -0
  3. data/lib/gobl/bill/advances.rb +1 -77
  4. data/lib/gobl/bill/charge.rb +11 -65
  5. data/lib/gobl/bill/delivery.rb +5 -47
  6. data/lib/gobl/bill/discount.rb +11 -65
  7. data/lib/gobl/bill/exchange_rates.rb +1 -77
  8. data/lib/gobl/bill/invoice.rb +28 -104
  9. data/lib/gobl/bill/invoice_type.rb +3 -134
  10. data/lib/gobl/bill/line.rb +13 -65
  11. data/lib/gobl/bill/line_charge.rb +5 -47
  12. data/lib/gobl/bill/line_discount.rb +5 -47
  13. data/lib/gobl/bill/ordering.rb +2 -38
  14. data/lib/gobl/bill/outlay.rb +11 -59
  15. data/lib/gobl/bill/payment.rb +5 -47
  16. data/lib/gobl/bill/preceding.rb +12 -62
  17. data/lib/gobl/bill/scheme_keys.rb +1 -77
  18. data/lib/gobl/bill/tax.rb +4 -44
  19. data/lib/gobl/bill/totals.rb +17 -71
  20. data/lib/gobl/cal/date.rb +1 -90
  21. data/lib/gobl/cal/period.rb +5 -41
  22. data/lib/gobl/currency/code.rb +3 -134
  23. data/lib/gobl/currency/exchange_rate.rb +5 -41
  24. data/lib/gobl/document.rb +1 -58
  25. data/lib/gobl/dsig/digest.rb +5 -41
  26. data/lib/gobl/dsig/signature.rb +1 -90
  27. data/lib/gobl/enum.rb +81 -0
  28. data/lib/gobl/envelope.rb +9 -48
  29. data/lib/gobl/header.rb +10 -56
  30. data/lib/gobl/i18n/string.rb +1 -58
  31. data/lib/gobl/l10n/code.rb +1 -90
  32. data/lib/gobl/l10n/country_code.rb +3 -134
  33. data/lib/gobl/map.rb +62 -0
  34. data/lib/gobl/note/message.rb +5 -44
  35. data/lib/gobl/num/amount.rb +6 -35
  36. data/lib/gobl/object.rb +21 -0
  37. data/lib/gobl/operations.rb +3 -3
  38. data/lib/gobl/org/address.rb +18 -80
  39. data/lib/gobl/org/code.rb +1 -90
  40. data/lib/gobl/org/coordinates.rb +5 -47
  41. data/lib/gobl/org/email.rb +6 -47
  42. data/lib/gobl/org/inbox.rb +8 -50
  43. data/lib/gobl/org/item.rb +13 -65
  44. data/lib/gobl/org/item_code.rb +4 -41
  45. data/lib/gobl/org/key.rb +1 -90
  46. data/lib/gobl/org/meta.rb +1 -58
  47. data/lib/gobl/org/name.rb +12 -62
  48. data/lib/gobl/org/note.rb +6 -47
  49. data/lib/gobl/org/note_key.rb +3 -134
  50. data/lib/gobl/org/party.rb +14 -71
  51. data/lib/gobl/org/person.rb +9 -56
  52. data/lib/gobl/org/registration.rb +9 -59
  53. data/lib/gobl/org/source_key.rb +3 -134
  54. data/lib/gobl/org/tax_identity.rb +8 -53
  55. data/lib/gobl/org/telephone.rb +5 -44
  56. data/lib/gobl/org/unit.rb +1 -136
  57. data/lib/gobl/pay/advance.rb +11 -59
  58. data/lib/gobl/pay/card.rb +5 -41
  59. data/lib/gobl/pay/credit_transfer.rb +6 -50
  60. data/lib/gobl/pay/direct_debit.rb +4 -44
  61. data/lib/gobl/pay/due_date.rb +8 -50
  62. data/lib/gobl/pay/instructions.rb +11 -62
  63. data/lib/gobl/pay/method_key.rb +3 -134
  64. data/lib/gobl/pay/online.rb +4 -41
  65. data/lib/gobl/pay/term_key.rb +3 -134
  66. data/lib/gobl/pay/terms.rb +6 -47
  67. data/lib/gobl/stamp.rb +5 -41
  68. data/lib/gobl/struct.rb +15 -15
  69. data/lib/gobl/tax/category.rb +9 -50
  70. data/lib/gobl/tax/category_total.rb +11 -53
  71. data/lib/gobl/tax/combo.rb +6 -47
  72. data/lib/gobl/tax/localities.rb +1 -77
  73. data/lib/gobl/tax/locality.rb +6 -44
  74. data/lib/gobl/tax/rate.rb +8 -47
  75. data/lib/gobl/tax/rate_total.rb +9 -50
  76. data/lib/gobl/tax/rate_total_surcharge.rb +5 -41
  77. data/lib/gobl/tax/rate_value.rb +6 -47
  78. data/lib/gobl/tax/region.rb +12 -56
  79. data/lib/gobl/tax/scheme.rb +8 -50
  80. data/lib/gobl/tax/schemes.rb +1 -77
  81. data/lib/gobl/tax/set.rb +1 -77
  82. data/lib/gobl/tax/total.rb +4 -41
  83. data/lib/gobl/uuid/uuid.rb +1 -90
  84. data/lib/gobl/value.rb +58 -0
  85. data/lib/gobl/version.rb +1 -1
  86. data/lib/gobl.rb +3 -1
  87. data/lib/gobl_extensions/document_helper.rb +3 -3
  88. data/lib/gobl_extensions/envelope_helper.rb +5 -0
  89. data/lib/gobl_extensions/i18n/value_keys_helper.rb +3 -3
  90. data/lib/gobl_extensions/tax/region_helper.rb +3 -9
  91. metadata +11 -35
  92. data/lib/gobl/types.rb +0 -17
@@ -9,201 +9,125 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # Invoice represents a payment claim for goods or services supplied under conditions agreed between the supplier and the customer.
12
- class Invoice < GOBL::Struct
12
+ class Invoice < GOBL::Object
13
13
  # The Schema ID of the GOBL Invoice structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice'
15
15
 
16
16
  # @!attribute [r] uuid
17
17
  # Unique document ID. Not required, but always recommended in addition to the Code.
18
18
  # @return [GOBL::UUID::UUID]
19
- attribute? :uuid, GOBL::UUID::UUID.optional
19
+ property :uuid, GOBL::UUID::UUID
20
20
 
21
21
  # @!attribute [r] code
22
22
  # Sequential code used to identify this invoice in tax declarations.
23
23
  # @return [String]
24
- attribute :code, GOBL::Types::String
24
+ property :code, String
25
+ validates :code, presence: true
25
26
 
26
27
  # @!attribute [r] series
27
28
  # Used in addition to the Code in some regions.
28
29
  # @return [String]
29
- attribute? :series, GOBL::Types::String.optional
30
+ property :series, String
30
31
 
31
32
  # @!attribute [r] type
32
33
  # Optional invoice type, leave empty unless needed for a specific situation.
33
34
  # @return [InvoiceType]
34
- attribute? :type, InvoiceType.optional
35
+ property :type, InvoiceType
35
36
 
36
37
  # @!attribute [r] currency
37
38
  # Currency for all invoice totals.
38
39
  # @return [GOBL::Currency::Code]
39
- attribute :currency, GOBL::Currency::Code
40
+ property :currency, GOBL::Currency::Code
41
+ validates :currency, presence: true
40
42
 
41
43
  # @!attribute [r] exchange_rates
42
44
  # Exchange rates to be used when converting the invoices monetary values into other currencies.
43
45
  # @return [ExchangeRates]
44
- attribute? :exchange_rates, ExchangeRates.optional
46
+ property :exchange_rates, ExchangeRates
45
47
 
46
48
  # @!attribute [r] tax
47
49
  # Special tax configuration for billing.
48
50
  # @return [Tax]
49
- attribute? :tax, Tax.optional
51
+ property :tax, Tax
50
52
 
51
53
  # @!attribute [r] preceding
52
54
  # Key information regarding a previous invoice and potentially details as to why it was corrected.
53
55
  # @return [Preceding]
54
- attribute? :preceding, Preceding.optional
56
+ property :preceding, Preceding
55
57
 
56
58
  # @!attribute [r] issue_date
57
59
  # When the invoice was created.
58
60
  # @return [GOBL::Cal::Date]
59
- attribute :issue_date, GOBL::Cal::Date
61
+ property :issue_date, GOBL::Cal::Date
62
+ validates :issue_date, presence: true
60
63
 
61
64
  # @!attribute [r] op_date
62
65
  # Date when the operation defined by the invoice became effective.
63
66
  # @return [GOBL::Cal::Date]
64
- attribute? :op_date, GOBL::Cal::Date.optional
67
+ property :op_date, GOBL::Cal::Date
65
68
 
66
69
  # @!attribute [r] value_date
67
70
  # When the taxes of this invoice become accountable, if none set, the issue date is used.
68
71
  # @return [GOBL::Cal::Date]
69
- attribute? :value_date, GOBL::Cal::Date.optional
72
+ property :value_date, GOBL::Cal::Date
70
73
 
71
74
  # @!attribute [r] supplier
72
75
  # The taxable entity supplying the goods or services.
73
76
  # @return [GOBL::Org::Party]
74
- attribute :supplier, GOBL::Org::Party
77
+ property :supplier, GOBL::Org::Party
78
+ validates :supplier, presence: true
75
79
 
76
80
  # @!attribute [r] customer
77
81
  # Legal entity receiving the goods or services, may be empty in certain circumstances such as simplified invoices.
78
82
  # @return [GOBL::Org::Party]
79
- attribute? :customer, GOBL::Org::Party.optional
83
+ property :customer, GOBL::Org::Party
80
84
 
81
85
  # @!attribute [r] lines
82
86
  # List of invoice lines representing each of the items sold to the customer.
83
87
  # @return [Array<Line>]
84
- attribute? :lines, GOBL::Types::Array.of(Line).optional
88
+ property :lines, [Line]
85
89
 
86
90
  # @!attribute [r] discounts
87
91
  # Discounts or allowances applied to the complete invoice
88
92
  # @return [Array<Discount>]
89
- attribute? :discounts, GOBL::Types::Array.of(Discount).optional
93
+ property :discounts, [Discount]
90
94
 
91
95
  # @!attribute [r] charges
92
96
  # Charges or surcharges applied to the complete invoice
93
97
  # @return [Array<Charge>]
94
- attribute? :charges, GOBL::Types::Array.of(Charge).optional
98
+ property :charges, [Charge]
95
99
 
96
100
  # @!attribute [r] outlays
97
101
  # Expenses paid for by the supplier but invoiced directly to the customer.
98
102
  # @return [Array<Outlay>]
99
- attribute? :outlays, GOBL::Types::Array.of(Outlay).optional
103
+ property :outlays, [Outlay]
100
104
 
101
105
  # @!attribute [r] ordering
102
106
  # @return [Ordering]
103
- attribute? :ordering, Ordering.optional
107
+ property :ordering, Ordering
104
108
 
105
109
  # @!attribute [r] payment
106
110
  # @return [Payment]
107
- attribute? :payment, Payment.optional
111
+ property :payment, Payment
108
112
 
109
113
  # @!attribute [r] delivery
110
114
  # @return [Delivery]
111
- attribute? :delivery, Delivery.optional
115
+ property :delivery, Delivery
112
116
 
113
117
  # @!attribute [r] totals
114
118
  # Summary of all the invoice totals, including taxes (calculated).
115
119
  # @return [Totals]
116
- attribute? :totals, Totals.optional
120
+ property :totals, Totals
117
121
 
118
122
  # @!attribute [r] notes
119
123
  # Unstructured information that is relevant to the invoice, such as correction or additional legal details.
120
124
  # @return [Array<GOBL::Org::Note>]
121
- attribute? :notes, GOBL::Types::Array.of(GOBL::Org::Note).optional
125
+ property :notes, [GOBL::Org::Note]
122
126
 
123
127
  # @!attribute [r] meta
124
128
  # Additional semi-structured data that doesn't fit into the body of the invoice.
125
129
  # @return [GOBL::Org::Meta]
126
- attribute? :meta, GOBL::Org::Meta.optional
127
-
128
- # Creates a new object from a hash of GOBL data
129
- #
130
- # @param data [Hash] a hash of GOBL data
131
- #
132
- # @return [Invoice] the object created from the given data
133
- def self.from_gobl!(data)
134
- data = GOBL::Types::Hash[data]
135
-
136
- new(
137
- uuid: data['uuid'] ? GOBL::UUID::UUID.from_gobl!(data['uuid']) : nil,
138
- code: data['code'],
139
- series: data['series'],
140
- type: data['type'] ? InvoiceType.from_gobl!(data['type']) : nil,
141
- currency: GOBL::Currency::Code.from_gobl!(data['currency']),
142
- exchange_rates: data['exchange_rates'] ? ExchangeRates.from_gobl!(data['exchange_rates']) : nil,
143
- tax: data['tax'] ? Tax.from_gobl!(data['tax']) : nil,
144
- preceding: data['preceding'] ? Preceding.from_gobl!(data['preceding']) : nil,
145
- issue_date: GOBL::Cal::Date.from_gobl!(data['issue_date']),
146
- op_date: data['op_date'] ? GOBL::Cal::Date.from_gobl!(data['op_date']) : nil,
147
- value_date: data['value_date'] ? GOBL::Cal::Date.from_gobl!(data['value_date']) : nil,
148
- supplier: GOBL::Org::Party.from_gobl!(data['supplier']),
149
- customer: data['customer'] ? GOBL::Org::Party.from_gobl!(data['customer']) : nil,
150
- lines: data['lines']&.map { |item| Line.from_gobl!(item) },
151
- discounts: data['discounts']&.map { |item| Discount.from_gobl!(item) },
152
- charges: data['charges']&.map { |item| Charge.from_gobl!(item) },
153
- outlays: data['outlays']&.map { |item| Outlay.from_gobl!(item) },
154
- ordering: data['ordering'] ? Ordering.from_gobl!(data['ordering']) : nil,
155
- payment: data['payment'] ? Payment.from_gobl!(data['payment']) : nil,
156
- delivery: data['delivery'] ? Delivery.from_gobl!(data['delivery']) : nil,
157
- totals: data['totals'] ? Totals.from_gobl!(data['totals']) : nil,
158
- notes: data['notes']&.map { |item| GOBL::Org::Note.from_gobl!(item) },
159
- meta: data['meta'] ? GOBL::Org::Meta.from_gobl!(data['meta']) : nil
160
- )
161
- end
162
-
163
- # Returns a hash of GOBL data representing the current object
164
- #
165
- # @return [Hash] the array of GOBL data that represents the current object
166
- def to_gobl
167
- {
168
- 'uuid' => attributes[:uuid]&.to_gobl,
169
- 'code' => attributes[:code],
170
- 'series' => attributes[:series],
171
- 'type' => attributes[:type]&.to_gobl,
172
- 'currency' => attributes[:currency]&.to_gobl,
173
- 'exchange_rates' => attributes[:exchange_rates]&.to_gobl,
174
- 'tax' => attributes[:tax]&.to_gobl,
175
- 'preceding' => attributes[:preceding]&.to_gobl,
176
- 'issue_date' => attributes[:issue_date]&.to_gobl,
177
- 'op_date' => attributes[:op_date]&.to_gobl,
178
- 'value_date' => attributes[:value_date]&.to_gobl,
179
- 'supplier' => attributes[:supplier]&.to_gobl,
180
- 'customer' => attributes[:customer]&.to_gobl,
181
- 'lines' => attributes[:lines]&.map { |item| item&.to_gobl },
182
- 'discounts' => attributes[:discounts]&.map { |item| item&.to_gobl },
183
- 'charges' => attributes[:charges]&.map { |item| item&.to_gobl },
184
- 'outlays' => attributes[:outlays]&.map { |item| item&.to_gobl },
185
- 'ordering' => attributes[:ordering]&.to_gobl,
186
- 'payment' => attributes[:payment]&.to_gobl,
187
- 'delivery' => attributes[:delivery]&.to_gobl,
188
- 'totals' => attributes[:totals]&.to_gobl,
189
- 'notes' => attributes[:notes]&.map { |item| item&.to_gobl },
190
- 'meta' => attributes[:meta]&.to_gobl
191
- }.compact
192
- end
193
-
194
- # @!method self.new(attrs)
195
- #
196
- # Returns a {Invoice} object from a given hash of attributes. Nested
197
- # attributes are supported: the constructor will instantiate the proper GOBL
198
- # objects when nested hashes or arrays are given as part of the `attrs`
199
- # parameter.
200
- #
201
- # The `new` method will only allow to create a new object if all attributes
202
- # marked as mandatory and not calculated in the JSON schema are provided.
203
- #
204
- # @param attrs [Hash] the hash of attributes
205
- #
206
- # @return [Invoice] the object corresponding to the given input
130
+ property :meta, GOBL::Org::Meta
207
131
  end
208
132
  end
209
133
  end
@@ -9,7 +9,7 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # Defines an invoice type according to a subset of the UNTDID 1001 standard list.
12
- class InvoiceType < GOBL::Struct
12
+ class InvoiceType < GOBL::Enum
13
13
  # The Schema ID of the GOBL InvoiceType structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/InvoiceType'
15
15
 
@@ -24,139 +24,8 @@ module GOBL
24
24
  'self-billed' => 'Self billed invoice'
25
25
  }.freeze
26
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 [InvoiceType] 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 {InvoiceType} 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 [InvoiceType] the object corresponding to the given value.
52
- #
53
- # @example Instantiating from a symbol
54
- # invoice_type = GOBL::Bill::InvoiceType.new(:proforma)
55
- #
56
- # @example Instantiating from a string
57
- # invoice_type = GOBL::Bill::InvoiceType.new('proforma')
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 {InvoiceType} 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 [InvoiceType, 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 {InvoiceType} object
92
- # invoice_type = GOBL::Bill::InvoiceType.new('proforma')
93
- # invoice_type == GOBL::Bill::InvoiceType.new('proforma') #=> true
94
- # invoice_type == GOBL::Bill::InvoiceType.new('simplified') #=> false
95
- #
96
- # @example Comparing to a string
97
- # invoice_type = GOBL::Bill::InvoiceType.new('proforma')
98
- # invoice_type == 'proforma' #=> true
99
- # invoice_type == 'simplified' #=> false
100
- #
101
- # @example Comparing to a symbol
102
- # invoice_type = GOBL::Bill::InvoiceType.new('proforma')
103
- # invoice_type == :proforma #=> true
104
- # invoice_type == :simplified #=> 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<InvoiceType>] 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 `InvoiceType#proforma?` 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
- # invoice_type = GOBL::Bill::InvoiceType.new('proforma')
152
- # invoice_type.proforma? # => true
153
- # invoice_type.simplified? # => 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
27
+ def strict_enum?
28
+ true
160
29
  end
161
30
  end
162
31
  end
@@ -9,113 +9,61 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # Line is a single row in an invoice.
12
- class Line < GOBL::Struct
12
+ class Line < GOBL::Object
13
13
  # The Schema ID of the GOBL Line structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/Line'
15
15
 
16
16
  # @!attribute [r] uuid
17
17
  # Unique identifier for this line
18
18
  # @return [GOBL::UUID::UUID]
19
- attribute? :uuid, GOBL::UUID::UUID.optional
19
+ property :uuid, GOBL::UUID::UUID
20
20
 
21
21
  # @!attribute [r] i
22
22
  # Line number inside the parent (calculated)
23
23
  # @return [Integer]
24
- attribute? :i, GOBL::Types::Int.optional
24
+ property :i, Integer
25
25
 
26
26
  # @!attribute [r] quantity
27
27
  # Number of items
28
28
  # @return [GOBL::Num::Amount]
29
- attribute :quantity, GOBL::Types.Constructor(GOBL::Num::Amount)
29
+ property :quantity, GOBL::Num::Amount
30
+ validates :quantity, presence: true
30
31
 
31
32
  # @!attribute [r] item
32
33
  # Details about what is being sold
33
34
  # @return [GOBL::Org::Item]
34
- attribute :item, GOBL::Org::Item
35
+ property :item, GOBL::Org::Item
36
+ validates :item, presence: true
35
37
 
36
38
  # @!attribute [r] sum
37
39
  # Result of quantity multiplied by the item's price (calculated)
38
40
  # @return [GOBL::Num::Amount]
39
- attribute? :sum, GOBL::Types.Constructor(GOBL::Num::Amount).optional
41
+ property :sum, GOBL::Num::Amount
40
42
 
41
43
  # @!attribute [r] discounts
42
44
  # Discounts applied to this line
43
45
  # @return [Array<LineDiscount>]
44
- attribute? :discounts, GOBL::Types::Array.of(LineDiscount).optional
46
+ property :discounts, [LineDiscount]
45
47
 
46
48
  # @!attribute [r] charges
47
49
  # Charges applied to this line
48
50
  # @return [Array<LineCharge>]
49
- attribute? :charges, GOBL::Types::Array.of(LineCharge).optional
51
+ property :charges, [LineCharge]
50
52
 
51
53
  # @!attribute [r] taxes
52
54
  # Map of taxes to be applied and used in the invoice totals
53
55
  # @return [GOBL::Tax::Set]
54
- attribute? :taxes, GOBL::Tax::Set.optional
56
+ property :taxes, GOBL::Tax::Set
55
57
 
56
58
  # @!attribute [r] total
57
59
  # Total line amount after applying discounts to the sum (calculated).
58
60
  # @return [GOBL::Num::Amount]
59
- attribute? :total, GOBL::Types.Constructor(GOBL::Num::Amount).optional
61
+ property :total, GOBL::Num::Amount
60
62
 
61
63
  # @!attribute [r] notes
62
64
  # Set of specific notes for this line that may be required for clarification.
63
65
  # @return [Array<GOBL::Org::Note>]
64
- attribute? :notes, GOBL::Types::Array.of(GOBL::Org::Note).optional
65
-
66
- # Creates a new object from a hash of GOBL data
67
- #
68
- # @param data [Hash] a hash of GOBL data
69
- #
70
- # @return [Line] the object created from the given data
71
- def self.from_gobl!(data)
72
- data = GOBL::Types::Hash[data]
73
-
74
- new(
75
- uuid: data['uuid'] ? GOBL::UUID::UUID.from_gobl!(data['uuid']) : nil,
76
- i: data['i'],
77
- quantity: data['quantity'],
78
- item: GOBL::Org::Item.from_gobl!(data['item']),
79
- sum: data['sum'] || nil,
80
- discounts: data['discounts']&.map { |item| LineDiscount.from_gobl!(item) },
81
- charges: data['charges']&.map { |item| LineCharge.from_gobl!(item) },
82
- taxes: data['taxes'] ? GOBL::Tax::Set.from_gobl!(data['taxes']) : nil,
83
- total: data['total'] || nil,
84
- notes: data['notes']&.map { |item| GOBL::Org::Note.from_gobl!(item) }
85
- )
86
- end
87
-
88
- # Returns a hash of GOBL data representing the current object
89
- #
90
- # @return [Hash] the array of GOBL data that represents the current object
91
- def to_gobl
92
- {
93
- 'uuid' => attributes[:uuid]&.to_gobl,
94
- 'i' => attributes[:i],
95
- 'quantity' => attributes[:quantity]&.to_gobl,
96
- 'item' => attributes[:item]&.to_gobl,
97
- 'sum' => attributes[:sum]&.to_gobl,
98
- 'discounts' => attributes[:discounts]&.map { |item| item&.to_gobl },
99
- 'charges' => attributes[:charges]&.map { |item| item&.to_gobl },
100
- 'taxes' => attributes[:taxes]&.to_gobl,
101
- 'total' => attributes[:total]&.to_gobl,
102
- 'notes' => attributes[:notes]&.map { |item| item&.to_gobl }
103
- }.compact
104
- end
105
-
106
- # @!method self.new(attrs)
107
- #
108
- # Returns a {Line} object from a given hash of attributes. Nested
109
- # attributes are supported: the constructor will instantiate the proper GOBL
110
- # objects when nested hashes or arrays are given as part of the `attrs`
111
- # parameter.
112
- #
113
- # The `new` method will only allow to create a new object if all attributes
114
- # marked as mandatory and not calculated in the JSON schema are provided.
115
- #
116
- # @param attrs [Hash] the hash of attributes
117
- #
118
- # @return [Line] the object corresponding to the given input
66
+ property :notes, [GOBL::Org::Note]
119
67
  end
120
68
  end
121
69
  end
@@ -9,71 +9,29 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # LineCharge represents an amount added to the line, and will be applied before taxes.
12
- class LineCharge < GOBL::Struct
12
+ class LineCharge < GOBL::Object
13
13
  # The Schema ID of the GOBL LineCharge structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/LineCharge'
15
15
 
16
16
  # @!attribute [r] percent
17
17
  # Percentage if fixed amount not applied
18
18
  # @return [GOBL::Num::Percentage]
19
- attribute? :percent, GOBL::Types.Constructor(GOBL::Num::Percentage).optional
19
+ property :percent, GOBL::Num::Percentage
20
20
 
21
21
  # @!attribute [r] amount
22
22
  # Fixed or resulting charge amount to apply (calculated if percent present).
23
23
  # @return [GOBL::Num::Amount]
24
- attribute? :amount, GOBL::Types.Constructor(GOBL::Num::Amount).optional
24
+ property :amount, GOBL::Num::Amount
25
25
 
26
26
  # @!attribute [r] code
27
27
  # Reference code.
28
28
  # @return [String]
29
- attribute? :code, GOBL::Types::String.optional
29
+ property :code, String
30
30
 
31
31
  # @!attribute [r] reason
32
32
  # Text description as to why the charge was applied
33
33
  # @return [String]
34
- attribute? :reason, 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 [LineCharge] the object created from the given data
41
- def self.from_gobl!(data)
42
- data = GOBL::Types::Hash[data]
43
-
44
- new(
45
- percent: data['percent'] || nil,
46
- amount: data['amount'] || nil,
47
- code: data['code'],
48
- reason: data['reason']
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
- 'percent' => attributes[:percent]&.to_gobl,
58
- 'amount' => attributes[:amount]&.to_gobl,
59
- 'code' => attributes[:code],
60
- 'reason' => attributes[:reason]
61
- }.compact
62
- end
63
-
64
- # @!method self.new(attrs)
65
- #
66
- # Returns a {LineCharge} 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 [LineCharge] the object corresponding to the given input
34
+ property :reason, String
77
35
  end
78
36
  end
79
37
  end
@@ -9,71 +9,29 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # LineDiscount represents an amount deducted from the line, and will be applied before taxes.
12
- class LineDiscount < GOBL::Struct
12
+ class LineDiscount < GOBL::Object
13
13
  # The Schema ID of the GOBL LineDiscount structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/LineDiscount'
15
15
 
16
16
  # @!attribute [r] percent
17
17
  # Percentage if fixed amount not applied
18
18
  # @return [GOBL::Num::Percentage]
19
- attribute? :percent, GOBL::Types.Constructor(GOBL::Num::Percentage).optional
19
+ property :percent, GOBL::Num::Percentage
20
20
 
21
21
  # @!attribute [r] amount
22
22
  # Fixed discount amount to apply (calculated if percent present).
23
23
  # @return [GOBL::Num::Amount]
24
- attribute? :amount, GOBL::Types.Constructor(GOBL::Num::Amount).optional
24
+ property :amount, GOBL::Num::Amount
25
25
 
26
26
  # @!attribute [r] code
27
27
  # Reason code.
28
28
  # @return [String]
29
- attribute? :code, GOBL::Types::String.optional
29
+ property :code, String
30
30
 
31
31
  # @!attribute [r] reason
32
32
  # Text description as to why the discount was applied
33
33
  # @return [String]
34
- attribute? :reason, 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 [LineDiscount] the object created from the given data
41
- def self.from_gobl!(data)
42
- data = GOBL::Types::Hash[data]
43
-
44
- new(
45
- percent: data['percent'] || nil,
46
- amount: data['amount'] || nil,
47
- code: data['code'],
48
- reason: data['reason']
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
- 'percent' => attributes[:percent]&.to_gobl,
58
- 'amount' => attributes[:amount]&.to_gobl,
59
- 'code' => attributes[:code],
60
- 'reason' => attributes[:reason]
61
- }.compact
62
- end
63
-
64
- # @!method self.new(attrs)
65
- #
66
- # Returns a {LineDiscount} 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 [LineDiscount] the object corresponding to the given input
34
+ property :reason, String
77
35
  end
78
36
  end
79
37
  end