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,148 +9,86 @@
9
9
  module GOBL
10
10
  module Org
11
11
  # Address defines a globally acceptable set of attributes that describes a postal or fiscal address.
12
- class Address < GOBL::Struct
12
+ class Address < GOBL::Object
13
13
  # The Schema ID of the GOBL Address structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/org/address'
15
15
 
16
16
  # @!attribute [r] uuid
17
17
  # Internal ID used to identify the party inside a document.
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] label
22
22
  # Useful identifier, such as home, work, etc.
23
23
  # @return [String]
24
- attribute? :label, GOBL::Types::String.optional
24
+ property :label, String
25
25
 
26
26
  # @!attribute [r] po_box
27
27
  # Box number or code for the post office box located at the address.
28
28
  # @return [String]
29
- attribute? :po_box, GOBL::Types::String.optional
29
+ property :po_box, String
30
30
 
31
31
  # @!attribute [r] num
32
32
  # House or building number in the street.
33
33
  # @return [String]
34
- attribute? :num, GOBL::Types::String.optional
34
+ property :num, String
35
35
 
36
36
  # @!attribute [r] floor
37
37
  # Floor number within the building.
38
38
  # @return [String]
39
- attribute? :floor, GOBL::Types::String.optional
39
+ property :floor, String
40
40
 
41
41
  # @!attribute [r] block
42
42
  # Block number within the building.
43
43
  # @return [String]
44
- attribute? :block, GOBL::Types::String.optional
44
+ property :block, String
45
45
 
46
46
  # @!attribute [r] door
47
47
  # Door number within the building.
48
48
  # @return [String]
49
- attribute? :door, GOBL::Types::String.optional
49
+ property :door, String
50
50
 
51
51
  # @!attribute [r] street
52
52
  # First line of street.
53
53
  # @return [String]
54
- attribute? :street, GOBL::Types::String.optional
54
+ property :street, String
55
55
 
56
56
  # @!attribute [r] street_extra
57
57
  # Additional street address details.
58
58
  # @return [String]
59
- attribute? :street_extra, GOBL::Types::String.optional
59
+ property :street_extra, String
60
60
 
61
61
  # @!attribute [r] locality
62
62
  # The village, town, district, or city.
63
63
  # @return [String]
64
- attribute :locality, GOBL::Types::String
64
+ property :locality, String
65
+ validates :locality, presence: true
65
66
 
66
67
  # @!attribute [r] region
67
68
  # Province, County, or State.
68
69
  # @return [String]
69
- attribute :region, GOBL::Types::String
70
+ property :region, String
71
+ validates :region, presence: true
70
72
 
71
73
  # @!attribute [r] code
72
74
  # Post or ZIP code.
73
75
  # @return [String]
74
- attribute? :code, GOBL::Types::String.optional
76
+ property :code, String
75
77
 
76
78
  # @!attribute [r] country
77
79
  # ISO country code.
78
80
  # @return [GOBL::L10n::CountryCode]
79
- attribute? :country, GOBL::L10n::CountryCode.optional
81
+ property :country, GOBL::L10n::CountryCode
80
82
 
81
83
  # @!attribute [r] coords
82
84
  # When the postal address is not sufficient, coordinates help locate the address more precisely.
83
85
  # @return [GOBL::Org::Coordinates]
84
- attribute? :coords, GOBL::Org::Coordinates.optional
86
+ property :coords, GOBL::Org::Coordinates
85
87
 
86
88
  # @!attribute [r] meta
87
89
  # Any additional semi-structure details about the address.
88
90
  # @return [GOBL::Org::Meta]
89
- attribute? :meta, GOBL::Org::Meta.optional
90
-
91
- # Creates a new object from a hash of GOBL data
92
- #
93
- # @param data [Hash] a hash of GOBL data
94
- #
95
- # @return [Address] the object created from the given data
96
- def self.from_gobl!(data)
97
- data = GOBL::Types::Hash[data]
98
-
99
- new(
100
- uuid: data['uuid'] ? GOBL::UUID::UUID.from_gobl!(data['uuid']) : nil,
101
- label: data['label'],
102
- po_box: data['po_box'],
103
- num: data['num'],
104
- floor: data['floor'],
105
- block: data['block'],
106
- door: data['door'],
107
- street: data['street'],
108
- street_extra: data['street_extra'],
109
- locality: data['locality'],
110
- region: data['region'],
111
- code: data['code'],
112
- country: data['country'] ? GOBL::L10n::CountryCode.from_gobl!(data['country']) : nil,
113
- coords: data['coords'] ? GOBL::Org::Coordinates.from_gobl!(data['coords']) : nil,
114
- meta: data['meta'] ? GOBL::Org::Meta.from_gobl!(data['meta']) : nil
115
- )
116
- end
117
-
118
- # Returns a hash of GOBL data representing the current object
119
- #
120
- # @return [Hash] the array of GOBL data that represents the current object
121
- def to_gobl
122
- {
123
- 'uuid' => attributes[:uuid]&.to_gobl,
124
- 'label' => attributes[:label],
125
- 'po_box' => attributes[:po_box],
126
- 'num' => attributes[:num],
127
- 'floor' => attributes[:floor],
128
- 'block' => attributes[:block],
129
- 'door' => attributes[:door],
130
- 'street' => attributes[:street],
131
- 'street_extra' => attributes[:street_extra],
132
- 'locality' => attributes[:locality],
133
- 'region' => attributes[:region],
134
- 'code' => attributes[:code],
135
- 'country' => attributes[:country]&.to_gobl,
136
- 'coords' => attributes[:coords]&.to_gobl,
137
- 'meta' => attributes[:meta]&.to_gobl
138
- }.compact
139
- end
140
-
141
- # @!method self.new(attrs)
142
- #
143
- # Returns a {Address} object from a given hash of attributes. Nested
144
- # attributes are supported: the constructor will instantiate the proper GOBL
145
- # objects when nested hashes or arrays are given as part of the `attrs`
146
- # parameter.
147
- #
148
- # The `new` method will only allow to create a new object if all attributes
149
- # marked as mandatory and not calculated in the JSON schema are provided.
150
- #
151
- # @param attrs [Hash] the hash of attributes
152
- #
153
- # @return [Address] the object corresponding to the given input
91
+ property :meta, GOBL::Org::Meta
154
92
  end
155
93
  end
156
94
  end
data/lib/gobl/org/code.rb CHANGED
@@ -9,98 +9,9 @@
9
9
  module GOBL
10
10
  module Org
11
11
  # Short upper-case identifier.
12
- class Code < GOBL::Struct
12
+ class Code < GOBL::Value
13
13
  # The Schema ID of the GOBL Code structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/org/code'
15
-
16
- attribute :_value, GOBL::Types::String
17
- private :_value
18
-
19
- # Creates a new object from a GOBL value
20
- #
21
- # @param data [String] the GOBL value
22
- #
23
- # @return [Code] the object created from the given data
24
- def self.from_gobl!(data)
25
- new(_value: data)
26
- end
27
-
28
- # Returns a GOBL value representing the current object
29
- #
30
- # @return [String] the GOBL value that represents the current object
31
- def to_gobl
32
- _value
33
- end
34
-
35
- # Returns a {Code} that corresponds to a given object. The object can be a
36
- # `Symbol`, a `String` or anything coercible into one (via `#to_s`).
37
- #
38
- # @param object [Symbol, String, #to_s] the value of the object.
39
- #
40
- # @return [Code] the object corresponding to the given value.
41
- #
42
- # @example Instantiating from a symbol
43
- # code = GOBL::Org::Code.new(:value)
44
- #
45
- # @example Instantiating from a string
46
- # code = GOBL::Org::Code.new('value')
47
- def self.new(object)
48
- case object
49
- when Hash, self # internal use, not to be used in public calls
50
- super
51
- when Symbol
52
- new object.to_s
53
- else
54
- super _value: object.to_s
55
- end
56
- end
57
-
58
- # Returns the string representation of the current object
59
- #
60
- # @return [String] the string representation of the current object
61
- def to_s
62
- _value.to_s
63
- end
64
-
65
- # Returns the symbol representation of the current object
66
- #
67
- # @return [Symbol] the symbol representation of the current object
68
- def to_sym
69
- to_s.parameterize.underscore.to_sym
70
- end
71
-
72
- # Returns whether the current object is equivalent to a given one. In addition
73
- # to {Code} objects, the current object can be compared to a `Symbol`, a
74
- # `String` or anything coercible into one (via `#to_s`)
75
- #
76
- # @param other [Code, Symbol, String, #to_s] the other object to compare to
77
- #
78
- # @return [Boolean] `true` if the objects are equivalent, `false` otherwise
79
- #
80
- # @example Comparing to another {Code} object
81
- # code = GOBL::Org::Code.new('value')
82
- # code == GOBL::Org::Code.new('value') #=> true
83
- # code == GOBL::Org::Code.new('other') #=> false
84
- #
85
- # @example Comparing to a string
86
- # code = GOBL::Org::Code.new('value')
87
- # code == 'value' #=> true
88
- # code == 'other' #=> false
89
- #
90
- # @example Comparing to a symbol
91
- # code = GOBL::Org::Code.new('value')
92
- # code == :value #=> true
93
- # code == :other #=> false
94
- def ==(other)
95
- case other
96
- when self.class
97
- super
98
- when Symbol
99
- to_sym == other
100
- else
101
- to_s == other.to_s
102
- end
103
- end
104
15
  end
105
16
  end
106
17
  end
@@ -9,71 +9,29 @@
9
9
  module GOBL
10
10
  module Org
11
11
  # Coordinates describes an exact geographical location in the world.
12
- class Coordinates < GOBL::Struct
12
+ class Coordinates < GOBL::Object
13
13
  # The Schema ID of the GOBL Coordinates structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/org/coordinates'
15
15
 
16
16
  # @!attribute [r] lat
17
17
  # Decimal latitude coordinate.
18
18
  # @return [Float]
19
- attribute? :lat, GOBL::Types::Double.optional
19
+ property :lat, Float
20
20
 
21
21
  # @!attribute [r] lon
22
22
  # Decimal longitude coordinate.
23
23
  # @return [Float]
24
- attribute? :lon, GOBL::Types::Double.optional
24
+ property :lon, Float
25
25
 
26
26
  # @!attribute [r] w3w
27
27
  # Text coordinates compose of three words.
28
28
  # @return [String]
29
- attribute? :w3w, GOBL::Types::String.optional
29
+ property :w3w, String
30
30
 
31
31
  # @!attribute [r] geohash
32
32
  # Single string coordinate based on geohash standard.
33
33
  # @return [String]
34
- attribute? :geohash, 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 [Coordinates] the object created from the given data
41
- def self.from_gobl!(data)
42
- data = GOBL::Types::Hash[data]
43
-
44
- new(
45
- lat: data['lat'],
46
- lon: data['lon'],
47
- w3w: data['w3w'],
48
- geohash: data['geohash']
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
- 'lat' => attributes[:lat],
58
- 'lon' => attributes[:lon],
59
- 'w3w' => attributes[:w3w],
60
- 'geohash' => attributes[:geohash]
61
- }.compact
62
- end
63
-
64
- # @!method self.new(attrs)
65
- #
66
- # Returns a {Coordinates} 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 [Coordinates] the object corresponding to the given input
34
+ property :geohash, String
77
35
  end
78
36
  end
79
37
  end
@@ -9,71 +9,30 @@
9
9
  module GOBL
10
10
  module Org
11
11
  # Email describes the electronic mailing details.
12
- class Email < GOBL::Struct
12
+ class Email < GOBL::Object
13
13
  # The Schema ID of the GOBL Email structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/org/email'
15
15
 
16
16
  # @!attribute [r] uuid
17
17
  # Unique identity 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] label
22
22
  # Identifier for the email.
23
23
  # @return [String]
24
- attribute? :label, GOBL::Types::String.optional
24
+ property :label, String
25
25
 
26
26
  # @!attribute [r] addr
27
27
  # Electronic mailing address.
28
28
  # @return [String]
29
- attribute :addr, GOBL::Types::String
29
+ property :addr, String
30
+ validates :addr, presence: true
30
31
 
31
32
  # @!attribute [r] meta
32
33
  # Additional fields.
33
34
  # @return [GOBL::Org::Meta]
34
- attribute? :meta, GOBL::Org::Meta.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 [Email] the object created from the given data
41
- def self.from_gobl!(data)
42
- data = GOBL::Types::Hash[data]
43
-
44
- new(
45
- uuid: data['uuid'] ? GOBL::UUID::UUID.from_gobl!(data['uuid']) : nil,
46
- label: data['label'],
47
- addr: data['addr'],
48
- meta: data['meta'] ? GOBL::Org::Meta.from_gobl!(data['meta']) : 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
- 'uuid' => attributes[:uuid]&.to_gobl,
58
- 'label' => attributes[:label],
59
- 'addr' => attributes[:addr],
60
- 'meta' => attributes[:meta]&.to_gobl
61
- }.compact
62
- end
63
-
64
- # @!method self.new(attrs)
65
- #
66
- # Returns a {Email} 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 [Email] the object corresponding to the given input
35
+ property :meta, GOBL::Org::Meta
77
36
  end
78
37
  end
79
38
  end
@@ -9,78 +9,36 @@
9
9
  module GOBL
10
10
  module Org
11
11
  # Inbox is used to store data about a connection with a service that is responsible for potentially receiving copies of GOBL envelopes or other document formats defined locally.
12
- class Inbox < GOBL::Struct
12
+ class Inbox < GOBL::Object
13
13
  # The Schema ID of the GOBL Inbox structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/org/inbox'
15
15
 
16
16
  # @!attribute [r] uuid
17
17
  # Unique ID. Useful if inbox is stored in a database.
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] key
22
22
  # Type of inbox being defined.
23
23
  # @return [GOBL::Org::Key]
24
- attribute :key, GOBL::Org::Key
24
+ property :key, GOBL::Org::Key
25
+ validates :key, presence: true
25
26
 
26
27
  # @!attribute [r] role
27
28
  # Role assigned to this inbox that may be relevant for the consumer.
28
29
  # @return [GOBL::Org::Key]
29
- attribute? :role, GOBL::Org::Key.optional
30
+ property :role, GOBL::Org::Key
30
31
 
31
32
  # @!attribute [r] name
32
33
  # Human name for the inbox.
33
34
  # @return [String]
34
- attribute? :name, GOBL::Types::String.optional
35
+ property :name, String
35
36
 
36
37
  # @!attribute [r] code
37
38
  # Actual Code or ID that identifies the Inbox.
38
39
  # @return [String]
39
- attribute :code, GOBL::Types::String
40
-
41
- # Creates a new object from a hash of GOBL data
42
- #
43
- # @param data [Hash] a hash of GOBL data
44
- #
45
- # @return [Inbox] the object created from the given data
46
- def self.from_gobl!(data)
47
- data = GOBL::Types::Hash[data]
48
-
49
- new(
50
- uuid: data['uuid'] ? GOBL::UUID::UUID.from_gobl!(data['uuid']) : nil,
51
- key: GOBL::Org::Key.from_gobl!(data['key']),
52
- role: data['role'] ? GOBL::Org::Key.from_gobl!(data['role']) : nil,
53
- name: data['name'],
54
- code: data['code']
55
- )
56
- end
57
-
58
- # Returns a hash of GOBL data representing the current object
59
- #
60
- # @return [Hash] the array of GOBL data that represents the current object
61
- def to_gobl
62
- {
63
- 'uuid' => attributes[:uuid]&.to_gobl,
64
- 'key' => attributes[:key]&.to_gobl,
65
- 'role' => attributes[:role]&.to_gobl,
66
- 'name' => attributes[:name],
67
- 'code' => attributes[:code]
68
- }.compact
69
- end
70
-
71
- # @!method self.new(attrs)
72
- #
73
- # Returns a {Inbox} object from a given hash of attributes. Nested
74
- # attributes are supported: the constructor will instantiate the proper GOBL
75
- # objects when nested hashes or arrays are given as part of the `attrs`
76
- # parameter.
77
- #
78
- # The `new` method will only allow to create a new object if all attributes
79
- # marked as mandatory and not calculated in the JSON schema are provided.
80
- #
81
- # @param attrs [Hash] the hash of attributes
82
- #
83
- # @return [Inbox] the object corresponding to the given input
40
+ property :code, String
41
+ validates :code, presence: true
84
42
  end
85
43
  end
86
44
  end
data/lib/gobl/org/item.rb CHANGED
@@ -9,113 +9,61 @@
9
9
  module GOBL
10
10
  module Org
11
11
  # Item is used to describe a single product or service.
12
- class Item < GOBL::Struct
12
+ class Item < GOBL::Object
13
13
  # The Schema ID of the GOBL Item structure
14
14
  SCHEMA_ID = 'https://gobl.org/draft-0/org/item'
15
15
 
16
16
  # @!attribute [r] uuid
17
17
  # Unique identify of this item independent of the Supplier IDs
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] ref
22
22
  # Primary reference code that identifies this item. Additional codes can be provided in the 'codes' field.
23
23
  # @return [String]
24
- attribute? :ref, GOBL::Types::String.optional
24
+ property :ref, String
25
25
 
26
26
  # @!attribute [r] name
27
27
  # Brief name of the item
28
28
  # @return [String]
29
- attribute :name, GOBL::Types::String
29
+ property :name, String
30
+ validates :name, presence: true
30
31
 
31
32
  # @!attribute [r] desc
32
33
  # Detailed description
33
34
  # @return [String]
34
- attribute? :desc, GOBL::Types::String.optional
35
+ property :desc, String
35
36
 
36
37
  # @!attribute [r] currency
37
38
  # Currency used for the item's price.
38
39
  # @return [String]
39
- attribute? :currency, GOBL::Types::String.optional
40
+ property :currency, String
40
41
 
41
42
  # @!attribute [r] price
42
43
  # Base price of a single unit to be sold.
43
44
  # @return [GOBL::Num::Amount]
44
- attribute :price, GOBL::Types.Constructor(GOBL::Num::Amount)
45
+ property :price, GOBL::Num::Amount
46
+ validates :price, presence: true
45
47
 
46
48
  # @!attribute [r] unit
47
49
  # Unit of measure.
48
50
  # @return [GOBL::Org::Unit]
49
- attribute? :unit, GOBL::Org::Unit.optional
51
+ property :unit, GOBL::Org::Unit
50
52
 
51
53
  # @!attribute [r] codes
52
54
  # List of additional codes, IDs, or SKUs which can be used to identify the item. The should be agreed upon between supplier and customer.
53
55
  # @return [Array<ItemCode>]
54
- attribute? :codes, GOBL::Types::Array.of(ItemCode).optional
56
+ property :codes, [ItemCode]
55
57
 
56
58
  # @!attribute [r] origin
57
59
  # Country code of where this item was from originally.
58
60
  # @return [GOBL::L10n::CountryCode]
59
- attribute? :origin, GOBL::L10n::CountryCode.optional
61
+ property :origin, GOBL::L10n::CountryCode
60
62
 
61
63
  # @!attribute [r] meta
62
64
  # Additional meta information that may be useful
63
65
  # @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 [Item] 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
- ref: data['ref'],
77
- name: data['name'],
78
- desc: data['desc'],
79
- currency: data['currency'],
80
- price: data['price'],
81
- unit: data['unit'] ? GOBL::Org::Unit.from_gobl!(data['unit']) : nil,
82
- codes: data['codes']&.map { |item| ItemCode.from_gobl!(item) },
83
- origin: data['origin'] ? GOBL::L10n::CountryCode.from_gobl!(data['origin']) : nil,
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
- 'ref' => attributes[:ref],
95
- 'name' => attributes[:name],
96
- 'desc' => attributes[:desc],
97
- 'currency' => attributes[:currency],
98
- 'price' => attributes[:price]&.to_gobl,
99
- 'unit' => attributes[:unit]&.to_gobl,
100
- 'codes' => attributes[:codes]&.map { |item| item&.to_gobl },
101
- 'origin' => attributes[:origin]&.to_gobl,
102
- 'meta' => attributes[:meta]&.to_gobl
103
- }.compact
104
- end
105
-
106
- # @!method self.new(attrs)
107
- #
108
- # Returns a {Item} 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 [Item] the object corresponding to the given input
66
+ property :meta, GOBL::Org::Meta
119
67
  end
120
68
  end
121
69
  end