gobl 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) 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 -36
  92. data/home/cavalle/workspace/invopop/gobl.ruby/gobl.gemspec +0 -30
  93. 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