gobl 0.1.3 → 0.3.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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/data/tax/CO.json +420 -0
  3. data/data/tax/ES.json +61 -0
  4. data/lib/ext/hashme.rb +28 -0
  5. data/lib/gobl/bill/advances.rb +1 -77
  6. data/lib/gobl/bill/charge.rb +11 -65
  7. data/lib/gobl/bill/delivery.rb +5 -47
  8. data/lib/gobl/bill/discount.rb +11 -65
  9. data/lib/gobl/bill/exchange_rates.rb +1 -77
  10. data/lib/gobl/bill/invoice.rb +28 -104
  11. data/lib/gobl/bill/invoice_type.rb +3 -134
  12. data/lib/gobl/bill/line.rb +13 -65
  13. data/lib/gobl/bill/line_charge.rb +5 -47
  14. data/lib/gobl/bill/line_discount.rb +5 -47
  15. data/lib/gobl/bill/ordering.rb +2 -38
  16. data/lib/gobl/bill/outlay.rb +11 -59
  17. data/lib/gobl/bill/payment.rb +5 -47
  18. data/lib/gobl/bill/preceding.rb +12 -62
  19. data/lib/gobl/bill/scheme_keys.rb +1 -77
  20. data/lib/gobl/bill/tax.rb +4 -44
  21. data/lib/gobl/bill/totals.rb +17 -71
  22. data/lib/gobl/cal/date.rb +1 -90
  23. data/lib/gobl/cal/period.rb +5 -41
  24. data/lib/gobl/currency/code.rb +3 -134
  25. data/lib/gobl/currency/exchange_rate.rb +5 -41
  26. data/lib/gobl/document.rb +1 -58
  27. data/lib/gobl/dsig/digest.rb +5 -41
  28. data/lib/gobl/dsig/signature.rb +1 -90
  29. data/lib/gobl/enum.rb +81 -0
  30. data/lib/gobl/envelope.rb +9 -48
  31. data/lib/gobl/header.rb +10 -56
  32. data/lib/gobl/i18n/string.rb +1 -58
  33. data/lib/gobl/l10n/code.rb +1 -90
  34. data/lib/gobl/l10n/country_code.rb +3 -134
  35. data/lib/gobl/map.rb +62 -0
  36. data/lib/gobl/note/message.rb +5 -44
  37. data/lib/gobl/num/amount.rb +6 -35
  38. data/lib/gobl/object.rb +21 -0
  39. data/lib/gobl/operations.rb +3 -3
  40. data/lib/gobl/org/address.rb +18 -80
  41. data/lib/gobl/org/code.rb +1 -90
  42. data/lib/gobl/org/coordinates.rb +5 -47
  43. data/lib/gobl/org/email.rb +6 -47
  44. data/lib/gobl/org/inbox.rb +8 -50
  45. data/lib/gobl/org/item.rb +13 -65
  46. data/lib/gobl/org/item_code.rb +4 -41
  47. data/lib/gobl/org/key.rb +1 -90
  48. data/lib/gobl/org/meta.rb +1 -58
  49. data/lib/gobl/org/name.rb +12 -62
  50. data/lib/gobl/org/note.rb +6 -47
  51. data/lib/gobl/org/note_key.rb +3 -134
  52. data/lib/gobl/org/party.rb +14 -71
  53. data/lib/gobl/org/person.rb +9 -56
  54. data/lib/gobl/org/registration.rb +9 -59
  55. data/lib/gobl/org/source_key.rb +3 -134
  56. data/lib/gobl/org/tax_identity.rb +8 -53
  57. data/lib/gobl/org/telephone.rb +5 -44
  58. data/lib/gobl/org/unit.rb +1 -136
  59. data/lib/gobl/pay/advance.rb +11 -59
  60. data/lib/gobl/pay/card.rb +5 -41
  61. data/lib/gobl/pay/credit_transfer.rb +6 -50
  62. data/lib/gobl/pay/direct_debit.rb +4 -44
  63. data/lib/gobl/pay/due_date.rb +8 -50
  64. data/lib/gobl/pay/instructions.rb +11 -62
  65. data/lib/gobl/pay/method_key.rb +3 -134
  66. data/lib/gobl/pay/online.rb +4 -41
  67. data/lib/gobl/pay/term_key.rb +3 -134
  68. data/lib/gobl/pay/terms.rb +6 -47
  69. data/lib/gobl/stamp.rb +5 -41
  70. data/lib/gobl/struct.rb +15 -15
  71. data/lib/gobl/tax/category.rb +9 -50
  72. data/lib/gobl/tax/category_total.rb +11 -53
  73. data/lib/gobl/tax/combo.rb +6 -47
  74. data/lib/gobl/tax/localities.rb +1 -77
  75. data/lib/gobl/tax/locality.rb +6 -44
  76. data/lib/gobl/tax/rate.rb +8 -47
  77. data/lib/gobl/tax/rate_total.rb +9 -50
  78. data/lib/gobl/tax/rate_total_surcharge.rb +5 -41
  79. data/lib/gobl/tax/rate_value.rb +6 -47
  80. data/lib/gobl/tax/region.rb +12 -56
  81. data/lib/gobl/tax/scheme.rb +8 -50
  82. data/lib/gobl/tax/schemes.rb +1 -77
  83. data/lib/gobl/tax/set.rb +1 -77
  84. data/lib/gobl/tax/total.rb +4 -41
  85. data/lib/gobl/uuid/uuid.rb +1 -90
  86. data/lib/gobl/value.rb +58 -0
  87. data/lib/gobl/version.rb +1 -1
  88. data/lib/gobl.rb +3 -1
  89. data/lib/gobl_extensions/document_helper.rb +3 -3
  90. data/lib/gobl_extensions/envelope_helper.rb +5 -0
  91. data/lib/gobl_extensions/i18n/value_keys_helper.rb +3 -3
  92. data/lib/gobl_extensions/tax/region_helper.rb +3 -9
  93. metadata +12 -35
  94. data/lib/gobl/types.rb +0 -17
@@ -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
@@ -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