gobl 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00b73bb211ab21feae26489018bc3d8ae114c46e17de67d6c2f079b1e28f4398
4
- data.tar.gz: 1d02eeb43e4c4b2f8d8b991faf5daf64f4489667f37cf6271f3293a8856cd893
3
+ metadata.gz: e52ec878de6b32774a12c296cd33c914373d6af02f8aa60f02320876b124f47f
4
+ data.tar.gz: 8a610c8a3758bcd87d31d9062b46921ae56c91f834259430a3befab7f4c04551
5
5
  SHA512:
6
- metadata.gz: 88add7771b5ea0cc1c8bd19b935c1c930f8f4f0e8ff974ea7688d37c73994bf8c06e239aabee0f4f071134da26b5e58bcc62c78936ac8551b96d4d5ba2ef238c
7
- data.tar.gz: 625cc3b78e2350b70b1eb4b7ffbc1e8932bfc84801945b8f27232eab569150428b721810689e27752918df6d968211bea32707f7254644b643c6dfee371bbfaf
6
+ metadata.gz: 3d9feadf8a8233343c9a97103991ccd7bc9a9312c66f904dcaf29b60915de5dc73d604c2b11021a18ef11000b5c2d525c2af3c4f9d325fe8d882cf7c881d9169
7
+ data.tar.gz: 07a08ffd6bcc9a6fe5c8419d9869e8c1e046348b3226971dd38057d2728c704dd3e4e70a3d18335d4dd0a74c28db84264add27d888d9373ad0216249b13e9e56
data/lib/ext/hashme.rb ADDED
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ raise 'The `hashme` library version has changed. Review if this extension still applies' if Hashme::VERSION != '0.2.6'
4
+
5
+ # Temporary extensions for the `hashme` gem. To be removed when the library supports them.
6
+ # @api private
7
+ module Hashme
8
+ # Adds an URI helper class to the Hashme namespace so that properties referencing them
9
+ # typecast to URI objects in Ruby standard library.
10
+ class URI
11
+ def self.new(value)
12
+ URI(value)
13
+ end
14
+ end
15
+
16
+ # TrueClass typecasts to a boolean in Hashme. We alias it to `Boolean` for clarity
17
+ Boolean = TrueClass
18
+
19
+ class CastedArray
20
+ # Provides access to the whole Enumerable set of methods
21
+ include Enumerable
22
+
23
+ # Fixes equality between CastedArray objects
24
+ def ==(other)
25
+ @_array == other.to_a
26
+ end
27
+ end
28
+ end
@@ -9,82 +9,6 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # Advances contains an array of advance objects.
12
- class Advances < GOBL::Struct
13
- extend Forwardable
14
- include Enumerable
15
-
16
- # The Schema ID of the GOBL Advances structure
17
- SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/Advances'
18
-
19
- attribute :_ary, GOBL::Types::Array.of(GOBL::Pay::Advance)
20
-
21
- # @!method [](*args)
22
- # Returns elements from the array
23
- # @overload [](index)
24
- # Returns the element in a specific position
25
- # @param index [Integer] the position of the object
26
- # @return [GOBL::Pay::Advance] the element in the `index` position
27
- # @overload [](start, length)
28
- # Returns all the elements within a range of positions
29
- # @param start [Integer] start position of the range
30
- # @param length [Integer] length of the range
31
- # @return [Array<GOBL::Pay::Advance>] the elements in the range
32
- # @overload [](range)
33
- # Returns all the elements within a range
34
- # @param range [Range] start and end positions of the range
35
- # @return [Array<GOBL::Pay::Advance>] the elements in the range
36
- #
37
- # @!method each
38
- # Iterates over the array elements
39
- # @overload each(&block)
40
- # Calls the given block with each element in the array
41
- # @yield [element] element of the array
42
- # @return [self] the object itself
43
- # @overload each
44
- # Returns an Enumerator that iterates over the array elements
45
- # @return [Enumerator] the enumerator of the array elements
46
- #
47
- # @!method empty?
48
- # Returns `true` if the number of elements in the array is zero, `false` otherwise.
49
- # @return [Boolean] whether the array is empty or not
50
- #
51
- # @!method length
52
- # Returns the number of elements in the array
53
- # @return [Integer] the number of elements in the array
54
- def_delegators :_ary, :[], :each, :empty?, :length
55
-
56
- # Creates a new object from an array of GOBL data
57
- #
58
- # @param data [Array] an array of GOBL data
59
- #
60
- # @return [Advances] the object created from the given data
61
- def self.from_gobl!(data)
62
- new(_ary: data&.map { |item| GOBL::Pay::Advance.from_gobl!(item) })
63
- end
64
-
65
- # Returns an array of GOBL data representing the current object
66
- #
67
- # @return [Array<Hash>] the array of GOBL data that represents the current object
68
- def to_gobl
69
- _ary.map(&:to_gobl)
70
- end
71
-
72
- # Returns a {Advances} object from a given array of structs. The array may
73
- # contain {GOBL::Pay::Advance} objects or hashes. If hashes are provided, the constructor
74
- # will call `GOBL::Pay::Advance#new` to generate the objects that will be part of the
75
- # returned {Advances} object
76
- #
77
- # @param object [Array<GOBL::Pay::Advance, Hash>] the array containing the structs
78
- #
79
- # @return [Advances] the object corresponding to the given input
80
- def self.new(object)
81
- case object
82
- when Array
83
- super _ary: object
84
- else # internal use, not to be used in public calls
85
- super
86
- end
87
- end
88
- end
12
+ Advances = [GOBL::Pay::Advance] # rubocop:disable Naming/ConstantName, Style/MutableConstant
89
13
  end
90
14
  end
@@ -9,113 +9,59 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # Charge represents a surchange applied to the complete document independent from the individual lines.
12
- class Charge < GOBL::Struct
12
+ class Charge < GOBL::Object
13
13
  # The Schema ID of the GOBL Charge structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/Charge'
15
15
 
16
16
  # @!attribute [r] uuid
17
17
  # Unique identifying for the discount entry
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 list of discounts (calculated).
23
23
  # @return [Integer]
24
- attribute? :i, GOBL::Types::Int.optional
24
+ property :i, Integer
25
25
 
26
26
  # @!attribute [r] ref
27
27
  # Code to used to refer to the this charge
28
28
  # @return [String]
29
- attribute? :ref, GOBL::Types::String.optional
29
+ property :ref, String
30
30
 
31
31
  # @!attribute [r] base
32
32
  # Base represents the value used as a base for percent calculations. If not already provided, we'll take the invoices sum before discounts.
33
33
  # @return [GOBL::Num::Amount]
34
- attribute? :base, GOBL::Types.Constructor(GOBL::Num::Amount).optional
34
+ property :base, GOBL::Num::Amount
35
35
 
36
36
  # @!attribute [r] percent
37
37
  # Percentage to apply to the invoice's Sum
38
38
  # @return [GOBL::Num::Percentage]
39
- attribute? :percent, GOBL::Types.Constructor(GOBL::Num::Percentage).optional
39
+ property :percent, GOBL::Num::Percentage
40
40
 
41
41
  # @!attribute [r] amount
42
42
  # Amount to apply (calculated if percent present)
43
43
  # @return [GOBL::Num::Amount]
44
- attribute? :amount, GOBL::Types.Constructor(GOBL::Num::Amount).optional
44
+ property :amount, GOBL::Num::Amount
45
45
 
46
46
  # @!attribute [r] taxes
47
47
  # List of taxes to apply to the charge
48
48
  # @return [GOBL::Tax::Set]
49
- attribute? :taxes, GOBL::Tax::Set.optional
49
+ property :taxes, GOBL::Tax::Set
50
50
 
51
51
  # @!attribute [r] code
52
52
  # Code for why was this charge applied?
53
53
  # @return [String]
54
- attribute? :code, GOBL::Types::String.optional
54
+ property :code, String
55
55
 
56
56
  # @!attribute [r] reason
57
57
  # Text description as to why the charge was applied
58
58
  # @return [String]
59
- attribute? :reason, GOBL::Types::String.optional
59
+ property :reason, String
60
60
 
61
61
  # @!attribute [r] meta
62
62
  # Additional semi-structured information.
63
63
  # @return [GOBL::Org::Meta]
64
- attribute? :meta, GOBL::Org::Meta.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 [Charge] 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
- ref: data['ref'],
78
- base: data['base'] || nil,
79
- percent: data['percent'] || nil,
80
- amount: data['amount'] || nil,
81
- taxes: data['taxes'] ? GOBL::Tax::Set.from_gobl!(data['taxes']) : nil,
82
- code: data['code'],
83
- reason: data['reason'],
84
- meta: data['meta'] ? GOBL::Org::Meta.from_gobl!(data['meta']) : nil
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
- 'ref' => attributes[:ref],
96
- 'base' => attributes[:base]&.to_gobl,
97
- 'percent' => attributes[:percent]&.to_gobl,
98
- 'amount' => attributes[:amount]&.to_gobl,
99
- 'taxes' => attributes[:taxes]&.to_gobl,
100
- 'code' => attributes[:code],
101
- 'reason' => attributes[:reason],
102
- 'meta' => attributes[:meta]&.to_gobl
103
- }.compact
104
- end
105
-
106
- # @!method self.new(attrs)
107
- #
108
- # Returns a {Charge} 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 [Charge] the object corresponding to the given input
64
+ property :meta, GOBL::Org::Meta
119
65
  end
120
66
  end
121
67
  end
@@ -9,71 +9,29 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # Delivery covers the details of the destination for the products described in the invoice body.
12
- class Delivery < GOBL::Struct
12
+ class Delivery < GOBL::Object
13
13
  # The Schema ID of the GOBL Delivery structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/Delivery'
15
15
 
16
16
  # @!attribute [r] receiver
17
17
  # The party who will receive delivery of the goods defined in the invoice and is not responsible for taxes.
18
18
  # @return [GOBL::Org::Party]
19
- attribute? :receiver, GOBL::Org::Party.optional
19
+ property :receiver, GOBL::Org::Party
20
20
 
21
21
  # @!attribute [r] date
22
22
  # When the goods should be expected
23
23
  # @return [GOBL::Cal::Date]
24
- attribute? :date, GOBL::Cal::Date.optional
24
+ property :date, GOBL::Cal::Date
25
25
 
26
26
  # @!attribute [r] start_date
27
27
  # Start of a n invoicing or delivery period
28
28
  # @return [GOBL::Cal::Date]
29
- attribute? :start_date, GOBL::Cal::Date.optional
29
+ property :start_date, GOBL::Cal::Date
30
30
 
31
31
  # @!attribute [r] end_date
32
32
  # End of a n invoicing or delivery period
33
33
  # @return [GOBL::Cal::Date]
34
- attribute? :end_date, GOBL::Cal::Date.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 [Delivery] the object created from the given data
41
- def self.from_gobl!(data)
42
- data = GOBL::Types::Hash[data]
43
-
44
- new(
45
- receiver: data['receiver'] ? GOBL::Org::Party.from_gobl!(data['receiver']) : nil,
46
- date: data['date'] ? GOBL::Cal::Date.from_gobl!(data['date']) : nil,
47
- start_date: data['start_date'] ? GOBL::Cal::Date.from_gobl!(data['start_date']) : nil,
48
- end_date: data['end_date'] ? GOBL::Cal::Date.from_gobl!(data['end_date']) : nil
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
- 'receiver' => attributes[:receiver]&.to_gobl,
58
- 'date' => attributes[:date]&.to_gobl,
59
- 'start_date' => attributes[:start_date]&.to_gobl,
60
- 'end_date' => attributes[:end_date]&.to_gobl
61
- }.compact
62
- end
63
-
64
- # @!method self.new(attrs)
65
- #
66
- # Returns a {Delivery} 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 [Delivery] the object corresponding to the given input
34
+ property :end_date, GOBL::Cal::Date
77
35
  end
78
36
  end
79
37
  end
@@ -9,113 +9,59 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # Discount represents an allowance applied to the complete document independent from the individual lines.
12
- class Discount < GOBL::Struct
12
+ class Discount < GOBL::Object
13
13
  # The Schema ID of the GOBL Discount structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/Discount'
15
15
 
16
16
  # @!attribute [r] uuid
17
17
  # Unique identifying for the discount entry
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 list of discounts (calculated)
23
23
  # @return [Integer]
24
- attribute? :i, GOBL::Types::Int.optional
24
+ property :i, Integer
25
25
 
26
26
  # @!attribute [r] ref
27
27
  # Reference or ID for this Discount
28
28
  # @return [String]
29
- attribute? :ref, GOBL::Types::String.optional
29
+ property :ref, String
30
30
 
31
31
  # @!attribute [r] base
32
32
  # Base represents the value used as a base for percent calculations. If not already provided, we'll take the invoices sum.
33
33
  # @return [GOBL::Num::Amount]
34
- attribute? :base, GOBL::Types.Constructor(GOBL::Num::Amount).optional
34
+ property :base, GOBL::Num::Amount
35
35
 
36
36
  # @!attribute [r] percent
37
37
  # Percentage to apply to the invoice's Sum.
38
38
  # @return [GOBL::Num::Percentage]
39
- attribute? :percent, GOBL::Types.Constructor(GOBL::Num::Percentage).optional
39
+ property :percent, GOBL::Num::Percentage
40
40
 
41
41
  # @!attribute [r] amount
42
42
  # Amount to apply (calculated if percent present).
43
43
  # @return [GOBL::Num::Amount]
44
- attribute? :amount, GOBL::Types.Constructor(GOBL::Num::Amount).optional
44
+ property :amount, GOBL::Num::Amount
45
45
 
46
46
  # @!attribute [r] taxes
47
47
  # List of taxes to apply to the discount
48
48
  # @return [GOBL::Tax::Set]
49
- attribute? :taxes, GOBL::Tax::Set.optional
49
+ property :taxes, GOBL::Tax::Set
50
50
 
51
51
  # @!attribute [r] code
52
52
  # Code for the reason this discount applied
53
53
  # @return [String]
54
- attribute? :code, GOBL::Types::String.optional
54
+ property :code, String
55
55
 
56
56
  # @!attribute [r] reason
57
57
  # Text description as to why the discount was applied
58
58
  # @return [String]
59
- attribute? :reason, GOBL::Types::String.optional
59
+ property :reason, String
60
60
 
61
61
  # @!attribute [r] meta
62
62
  # Additional semi-structured information.
63
63
  # @return [GOBL::Org::Meta]
64
- attribute? :meta, GOBL::Org::Meta.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 [Discount] 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
- ref: data['ref'],
78
- base: data['base'] || nil,
79
- percent: data['percent'] || nil,
80
- amount: data['amount'] || nil,
81
- taxes: data['taxes'] ? GOBL::Tax::Set.from_gobl!(data['taxes']) : nil,
82
- code: data['code'],
83
- reason: data['reason'],
84
- meta: data['meta'] ? GOBL::Org::Meta.from_gobl!(data['meta']) : nil
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
- 'ref' => attributes[:ref],
96
- 'base' => attributes[:base]&.to_gobl,
97
- 'percent' => attributes[:percent]&.to_gobl,
98
- 'amount' => attributes[:amount]&.to_gobl,
99
- 'taxes' => attributes[:taxes]&.to_gobl,
100
- 'code' => attributes[:code],
101
- 'reason' => attributes[:reason],
102
- 'meta' => attributes[:meta]&.to_gobl
103
- }.compact
104
- end
105
-
106
- # @!method self.new(attrs)
107
- #
108
- # Returns a {Discount} 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 [Discount] the object corresponding to the given input
64
+ property :meta, GOBL::Org::Meta
119
65
  end
120
66
  end
121
67
  end
@@ -9,82 +9,6 @@
9
9
  module GOBL
10
10
  module Bill
11
11
  # ExchangeRates represents an array of currency exchange rates.
12
- class ExchangeRates < GOBL::Struct
13
- extend Forwardable
14
- include Enumerable
15
-
16
- # The Schema ID of the GOBL ExchangeRates structure
17
- SCHEMA_ID = 'https://gobl.org/draft-0/bill/invoice#/$defs/ExchangeRates'
18
-
19
- attribute :_ary, GOBL::Types::Array.of(GOBL::Currency::ExchangeRate)
20
-
21
- # @!method [](*args)
22
- # Returns elements from the array
23
- # @overload [](index)
24
- # Returns the element in a specific position
25
- # @param index [Integer] the position of the object
26
- # @return [GOBL::Currency::ExchangeRate] the element in the `index` position
27
- # @overload [](start, length)
28
- # Returns all the elements within a range of positions
29
- # @param start [Integer] start position of the range
30
- # @param length [Integer] length of the range
31
- # @return [Array<GOBL::Currency::ExchangeRate>] the elements in the range
32
- # @overload [](range)
33
- # Returns all the elements within a range
34
- # @param range [Range] start and end positions of the range
35
- # @return [Array<GOBL::Currency::ExchangeRate>] the elements in the range
36
- #
37
- # @!method each
38
- # Iterates over the array elements
39
- # @overload each(&block)
40
- # Calls the given block with each element in the array
41
- # @yield [element] element of the array
42
- # @return [self] the object itself
43
- # @overload each
44
- # Returns an Enumerator that iterates over the array elements
45
- # @return [Enumerator] the enumerator of the array elements
46
- #
47
- # @!method empty?
48
- # Returns `true` if the number of elements in the array is zero, `false` otherwise.
49
- # @return [Boolean] whether the array is empty or not
50
- #
51
- # @!method length
52
- # Returns the number of elements in the array
53
- # @return [Integer] the number of elements in the array
54
- def_delegators :_ary, :[], :each, :empty?, :length
55
-
56
- # Creates a new object from an array of GOBL data
57
- #
58
- # @param data [Array] an array of GOBL data
59
- #
60
- # @return [ExchangeRates] the object created from the given data
61
- def self.from_gobl!(data)
62
- new(_ary: data&.map { |item| GOBL::Currency::ExchangeRate.from_gobl!(item) })
63
- end
64
-
65
- # Returns an array of GOBL data representing the current object
66
- #
67
- # @return [Array<Hash>] the array of GOBL data that represents the current object
68
- def to_gobl
69
- _ary.map(&:to_gobl)
70
- end
71
-
72
- # Returns a {ExchangeRates} object from a given array of structs. The array may
73
- # contain {GOBL::Currency::ExchangeRate} objects or hashes. If hashes are provided, the constructor
74
- # will call `GOBL::Currency::ExchangeRate#new` to generate the objects that will be part of the
75
- # returned {ExchangeRates} object
76
- #
77
- # @param object [Array<GOBL::Currency::ExchangeRate, Hash>] the array containing the structs
78
- #
79
- # @return [ExchangeRates] the object corresponding to the given input
80
- def self.new(object)
81
- case object
82
- when Array
83
- super _ary: object
84
- else # internal use, not to be used in public calls
85
- super
86
- end
87
- end
88
- end
12
+ ExchangeRates = [GOBL::Currency::ExchangeRate] # rubocop:disable Naming/ConstantName, Style/MutableConstant
89
13
  end
90
14
  end