xrechnung 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rspec.yml +23 -0
- data/.github/workflows/validate-fixtures.yml +2 -2
- data/Gemfile.lock +47 -38
- data/Rakefile +1 -1
- data/lib/xrechnung/invoice_line.rb +10 -0
- data/lib/xrechnung/invoice_period.rb +20 -0
- data/lib/xrechnung/legal_monetary_total.rb +3 -3
- data/lib/xrechnung/member_container.rb +18 -27
- data/lib/xrechnung/version.rb +1 -1
- data/lib/xrechnung.rb +14 -5
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f041dd061b2cbafddf1f119d5dd735030f5090385ae705e4a078fba9308e3c4
|
4
|
+
data.tar.gz: bdb51353f944c7560ef64f6f908f45eed508212d357d3e28bd95ba4c8a0b24d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01ecec735fd1d6df67c83ff14a722b48d8fae9191d27f200b12efeb9d810045c54cf8534a0dee6d41d9935a24edf25589b4b872c9c37d14bf11b0b12263bfef9
|
7
|
+
data.tar.gz: 682358abc94767c051821749ef42d7bb92f8e687bd6d47b4085dda99e95f5fe52ee4edf8fd99029a2bc37426afd4699ab397eb55c5adeca24a3d56cc5918db7d
|
@@ -0,0 +1,23 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push, fork]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
name: Ruby ${{ matrix.ruby }}
|
9
|
+
strategy:
|
10
|
+
matrix:
|
11
|
+
ruby: ['2.7', '3.0', '3.2']
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@v4
|
15
|
+
|
16
|
+
- name: Set up Ruby
|
17
|
+
uses: ruby/setup-ruby@v1
|
18
|
+
with:
|
19
|
+
ruby-version: ${{ matrix.ruby }}
|
20
|
+
bundler-cache: true
|
21
|
+
|
22
|
+
- name: Run rspec
|
23
|
+
run: bundle exec rake spec
|
@@ -7,7 +7,7 @@ jobs:
|
|
7
7
|
runs-on: ubuntu-latest
|
8
8
|
|
9
9
|
steps:
|
10
|
-
- uses: actions/checkout@
|
10
|
+
- uses: actions/checkout@v4
|
11
11
|
|
12
12
|
- uses: actions/setup-java@v2
|
13
13
|
with:
|
@@ -25,7 +25,7 @@ jobs:
|
|
25
25
|
- name: Run validator
|
26
26
|
run: bundle exec rake validator:run
|
27
27
|
|
28
|
-
- uses: actions/upload-artifact@
|
28
|
+
- uses: actions/upload-artifact@v4
|
29
29
|
if: failure()
|
30
30
|
with:
|
31
31
|
name: validation-results
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
xrechnung (0.
|
4
|
+
xrechnung (0.2.0)
|
5
5
|
builder (~> 3.2)
|
6
6
|
|
7
7
|
GEM
|
@@ -9,51 +9,60 @@ GEM
|
|
9
9
|
specs:
|
10
10
|
ast (2.4.2)
|
11
11
|
builder (3.2.4)
|
12
|
-
diff-lcs (1.
|
13
|
-
httparty (0.
|
14
|
-
|
12
|
+
diff-lcs (1.5.1)
|
13
|
+
httparty (0.21.0)
|
14
|
+
mini_mime (>= 1.0.0)
|
15
15
|
multi_xml (>= 0.5.2)
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
json (2.7.1)
|
17
|
+
language_server-protocol (3.17.0.3)
|
18
|
+
mini_mime (1.1.5)
|
19
19
|
multi_xml (0.6.0)
|
20
|
-
parallel (1.
|
21
|
-
parser (3.0.
|
20
|
+
parallel (1.24.0)
|
21
|
+
parser (3.3.0.5)
|
22
22
|
ast (~> 2.4.1)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
rspec-
|
31
|
-
|
32
|
-
rspec-
|
33
|
-
rspec-
|
23
|
+
racc
|
24
|
+
racc (1.7.3)
|
25
|
+
rainbow (3.1.1)
|
26
|
+
rake (13.1.0)
|
27
|
+
regexp_parser (2.9.0)
|
28
|
+
rexml (3.2.6)
|
29
|
+
rspec (3.13.0)
|
30
|
+
rspec-core (~> 3.13.0)
|
31
|
+
rspec-expectations (~> 3.13.0)
|
32
|
+
rspec-mocks (~> 3.13.0)
|
33
|
+
rspec-core (3.13.0)
|
34
|
+
rspec-support (~> 3.13.0)
|
35
|
+
rspec-expectations (3.13.0)
|
34
36
|
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
-
rspec-support (~> 3.
|
36
|
-
rspec-mocks (3.
|
37
|
+
rspec-support (~> 3.13.0)
|
38
|
+
rspec-mocks (3.13.0)
|
37
39
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
-
rspec-support (~> 3.
|
39
|
-
rspec-support (3.
|
40
|
-
rubocop (1.
|
40
|
+
rspec-support (~> 3.13.0)
|
41
|
+
rspec-support (3.13.1)
|
42
|
+
rubocop (1.62.1)
|
43
|
+
json (~> 2.3)
|
44
|
+
language_server-protocol (>= 3.17.0)
|
41
45
|
parallel (~> 1.10)
|
42
|
-
parser (>= 3.
|
46
|
+
parser (>= 3.3.0.2)
|
43
47
|
rainbow (>= 2.2.2, < 4.0)
|
44
48
|
regexp_parser (>= 1.8, < 3.0)
|
45
|
-
rexml
|
46
|
-
rubocop-ast (>= 1.
|
49
|
+
rexml (>= 3.2.5, < 4.0)
|
50
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
47
51
|
ruby-progressbar (~> 1.7)
|
48
|
-
unicode-display_width (>=
|
49
|
-
rubocop-ast (1.
|
50
|
-
parser (>=
|
51
|
-
rubocop-
|
52
|
-
rubocop (~> 1.
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
53
|
+
rubocop-ast (1.31.2)
|
54
|
+
parser (>= 3.3.0.4)
|
55
|
+
rubocop-capybara (2.20.0)
|
56
|
+
rubocop (~> 1.41)
|
57
|
+
rubocop-factory_bot (2.25.1)
|
58
|
+
rubocop (~> 1.41)
|
59
|
+
rubocop-rspec (2.27.1)
|
60
|
+
rubocop (~> 1.40)
|
61
|
+
rubocop-capybara (~> 2.17)
|
62
|
+
rubocop-factory_bot (~> 2.22)
|
63
|
+
ruby-progressbar (1.13.0)
|
64
|
+
rubyzip (2.3.2)
|
65
|
+
unicode-display_width (2.5.0)
|
57
66
|
|
58
67
|
PLATFORMS
|
59
68
|
ruby
|
@@ -67,4 +76,4 @@ DEPENDENCIES
|
|
67
76
|
xrechnung!
|
68
77
|
|
69
78
|
BUNDLED WITH
|
70
|
-
2.
|
79
|
+
2.4.19
|
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ namespace :validator do
|
|
14
14
|
},
|
15
15
|
scenarios: {
|
16
16
|
filename: "validator/scenarios.xml",
|
17
|
-
release_url: "https://github.com/itplr-kosit/validator-configuration-xrechnung/releases/download/release-
|
17
|
+
release_url: "https://github.com/itplr-kosit/validator-configuration-xrechnung/releases/download/release-2023-05-12/validator-configuration-xrechnung_2.3.1_2023-05-12.zip",
|
18
18
|
}
|
19
19
|
}
|
20
20
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "xrechnung/invoice_period"
|
2
|
+
|
1
3
|
module Xrechnung
|
2
4
|
class InvoiceLine
|
3
5
|
include MemberContainer
|
@@ -14,6 +16,10 @@ module Xrechnung
|
|
14
16
|
# @return [Xrechnung::Currency]
|
15
17
|
member :line_extension_amount, type: Xrechnung::Currency
|
16
18
|
|
19
|
+
# @!attribute invoice_period
|
20
|
+
# @return [Xrechnung::InvoicePeriod]
|
21
|
+
member :invoice_period, type: Xrechnung::InvoicePeriod, optional: true
|
22
|
+
|
17
23
|
# @!attribute item
|
18
24
|
# @return [Xrechnung::Item]
|
19
25
|
member :item, type: Xrechnung::Item
|
@@ -33,6 +39,10 @@ module Xrechnung
|
|
33
39
|
xml.cbc :ID, id
|
34
40
|
xml.cbc :InvoicedQuantity, invoiced_quantity.amount_to_s, unitCode: invoiced_quantity.unit_code
|
35
41
|
xml.cbc :LineExtensionAmount, *line_extension_amount.xml_args
|
42
|
+
|
43
|
+
unless self.class.members[:invoice_period].optional && invoice_period.nil?
|
44
|
+
invoice_period&.to_xml(xml)
|
45
|
+
end
|
36
46
|
item&.to_xml(xml)
|
37
47
|
price&.to_xml(xml)
|
38
48
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Xrechnung
|
2
|
+
class InvoicePeriod
|
3
|
+
include MemberContainer
|
4
|
+
|
5
|
+
# @!attribute start_date
|
6
|
+
# @return [Date]
|
7
|
+
member :start_date, type: Date
|
8
|
+
|
9
|
+
# @!attribute end_date
|
10
|
+
# @return [Date]
|
11
|
+
member :end_date, type: Date
|
12
|
+
|
13
|
+
def to_xml(xml)
|
14
|
+
xml.cac :InvoicePeriod do
|
15
|
+
xml.cbc :StartDate, start_date
|
16
|
+
xml.cbc :EndDate, end_date
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -40,10 +40,10 @@ module Xrechnung
|
|
40
40
|
|
41
41
|
# noinspection RubyResolve
|
42
42
|
def to_xml(xml)
|
43
|
-
members.
|
44
|
-
next if self[
|
43
|
+
self.class.members.each_key do |name|
|
44
|
+
next if self[name].nil?
|
45
45
|
|
46
|
-
xml.cbc :"#{
|
46
|
+
xml.cbc :"#{name.to_s.split("_").map(&:capitalize).join}", *self[name].xml_args
|
47
47
|
end
|
48
48
|
xml.target!
|
49
49
|
end
|
@@ -6,8 +6,9 @@ module Xrechnung
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def initialize(**kwargs)
|
9
|
-
|
10
|
-
|
9
|
+
# initialize default values
|
10
|
+
self.class.members.each do |name, member|
|
11
|
+
self[name] = member.default.dup unless member.default.nil?
|
11
12
|
end
|
12
13
|
|
13
14
|
kwargs.each do |k, v|
|
@@ -15,54 +16,44 @@ module Xrechnung
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
|
-
def members
|
19
|
-
self.class.instance_variable_get :@members
|
20
|
-
end
|
21
|
-
|
22
19
|
def [](key)
|
23
20
|
send(key)
|
24
21
|
end
|
25
22
|
|
26
23
|
def []=(key, value)
|
27
|
-
send(
|
24
|
+
send("#{key}=", value)
|
28
25
|
end
|
29
26
|
|
27
|
+
Member = Struct.new(:type, :default, :optional, :transform_value, keyword_init: true)
|
28
|
+
|
30
29
|
module ClassMethods
|
30
|
+
def members
|
31
|
+
@members
|
32
|
+
end
|
33
|
+
|
31
34
|
# @param [String] member_name
|
32
35
|
# @param [Array<Class>, Class] type
|
33
36
|
# @param [Object] default
|
34
37
|
# @param [TrueClass, FalseClass] optional When true, omits tag rather than rendering an empty tag on nil
|
35
38
|
# @param [Proc] transform_value A Proc which is called with the input value to perform type conversion.
|
36
|
-
def member(member_name,
|
39
|
+
def member(member_name, **kwargs)
|
37
40
|
attr_reader member_name
|
38
|
-
|
39
|
-
@members[member_name] = { optional: optional, setter_name: setter_name }
|
41
|
+
kwargs[:default].freeze
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
43
|
+
setter_name = :"#{member_name}="
|
44
|
+
member = Member.new(**kwargs)
|
45
|
+
@members[member_name] = member
|
46
46
|
|
47
47
|
define_method setter_name do |in_value|
|
48
|
-
in_value = transform_value.call(in_value) if transform_value
|
48
|
+
in_value = member.transform_value.call(in_value) if member.transform_value
|
49
49
|
|
50
|
-
if type && !in_value.nil? && Array(type).none? { |t| in_value.is_a?(t) }
|
51
|
-
raise ArgumentError, "expected #{type} for :#{member_name}, got: #{in_value.class}"
|
50
|
+
if member.type && !in_value.nil? && Array(member.type).none? { |t| in_value.is_a?(t) }
|
51
|
+
raise ArgumentError, "expected #{member.type} for :#{member_name}, got: #{in_value.class}"
|
52
52
|
end
|
53
53
|
|
54
54
|
instance_variable_set :"@#{member_name}", in_value
|
55
55
|
end
|
56
56
|
end
|
57
|
-
|
58
|
-
def after_initialize(&block)
|
59
|
-
@after_initialize_blocks ||= []
|
60
|
-
if block
|
61
|
-
@after_initialize_blocks << block
|
62
|
-
else
|
63
|
-
@after_initialize_blocks
|
64
|
-
end
|
65
|
-
end
|
66
57
|
end
|
67
58
|
end
|
68
59
|
end
|
data/lib/xrechnung/version.rb
CHANGED
data/lib/xrechnung.rb
CHANGED
@@ -21,6 +21,7 @@ require "xrechnung/allowance_charge"
|
|
21
21
|
require "xrechnung/price"
|
22
22
|
require "xrechnung/invoice_line"
|
23
23
|
require "xrechnung/invoice_document_reference"
|
24
|
+
require "xrechnung/invoice_period"
|
24
25
|
require "builder"
|
25
26
|
|
26
27
|
module Xrechnung
|
@@ -168,6 +169,10 @@ module Xrechnung
|
|
168
169
|
# @return [Xrechnung::InvoiceDocumentReference]
|
169
170
|
member :billing_reference, type: Xrechnung::InvoiceDocumentReference, optional: true
|
170
171
|
|
172
|
+
# @!attribute invoice_period
|
173
|
+
# @return [Xrechnung::InvoicePeriod]
|
174
|
+
member :invoice_period, type: Xrechnung::InvoicePeriod, optional: true
|
175
|
+
|
171
176
|
# Contract reference BT-12
|
172
177
|
#
|
173
178
|
# Eine eindeutige Bezeichnung des Vertrages (z. B. Vertragsnummer).
|
@@ -250,7 +255,7 @@ module Xrechnung
|
|
250
255
|
"xmlns:cbc" => "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2",
|
251
256
|
"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
|
252
257
|
"xsi:schemaLocation" => "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 http://docs.oasis-open.org/ubl/os-UBL-2.1/xsd/maindoc/UBL-Invoice-2.1.xsd" do
|
253
|
-
xml.cbc :CustomizationID, "urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.
|
258
|
+
xml.cbc :CustomizationID, "urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.3"
|
254
259
|
xml.cbc :ID, id
|
255
260
|
xml.cbc :IssueDate, issue_date
|
256
261
|
xml.cbc :DueDate, due_date
|
@@ -260,19 +265,23 @@ module Xrechnung
|
|
260
265
|
xml.cbc :Note, note
|
261
266
|
end
|
262
267
|
|
263
|
-
xml.cbc :TaxPointDate, tax_point_date
|
268
|
+
xml.cbc :TaxPointDate, tax_point_date unless tax_point_date.nil?
|
264
269
|
xml.cbc :DocumentCurrencyCode, document_currency_code
|
265
270
|
xml.cbc :TaxCurrencyCode, tax_currency_code
|
266
271
|
xml.cbc :BuyerReference, buyer_reference
|
267
272
|
|
273
|
+
unless self.class.members[:invoice_period].optional && invoice_period.nil?
|
274
|
+
invoice_period&.to_xml(xml)
|
275
|
+
end
|
276
|
+
|
268
277
|
xml.cac :OrderReference do
|
269
278
|
xml.cbc :ID, purchase_order_reference
|
270
|
-
unless members[:sales_order_reference]
|
279
|
+
unless self.class.members[:sales_order_reference].optional && sales_order_reference.nil?
|
271
280
|
xml.cbc :SalesOrderID, sales_order_reference
|
272
281
|
end
|
273
282
|
end
|
274
283
|
|
275
|
-
unless members[:billing_reference]
|
284
|
+
unless self.class.members[:billing_reference].optional && billing_reference.nil?
|
276
285
|
xml.cac :BillingReference do
|
277
286
|
billing_reference&.to_xml(xml)
|
278
287
|
end
|
@@ -294,7 +303,7 @@ module Xrechnung
|
|
294
303
|
accounting_customer_party&.to_xml(xml)
|
295
304
|
end
|
296
305
|
|
297
|
-
unless members[:tax_representative_party]
|
306
|
+
unless self.class.members[:tax_representative_party].optional && tax_representative_party.nil?
|
298
307
|
xml.cac :TaxRepresentativeParty do
|
299
308
|
tax_representative_party&.to_xml(xml)
|
300
309
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xrechnung
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Kornberger
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: builder
|
@@ -52,13 +52,14 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2.0'
|
55
|
-
description:
|
55
|
+
description:
|
56
56
|
email:
|
57
57
|
- jk+github@digineo.de
|
58
58
|
executables: []
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
+
- ".github/workflows/rspec.yml"
|
62
63
|
- ".github/workflows/validate-fixtures.yml"
|
63
64
|
- ".gitignore"
|
64
65
|
- ".rspec"
|
@@ -78,6 +79,7 @@ files:
|
|
78
79
|
- lib/xrechnung/id.rb
|
79
80
|
- lib/xrechnung/invoice_document_reference.rb
|
80
81
|
- lib/xrechnung/invoice_line.rb
|
82
|
+
- lib/xrechnung/invoice_period.rb
|
81
83
|
- lib/xrechnung/item.rb
|
82
84
|
- lib/xrechnung/legal_monetary_total.rb
|
83
85
|
- lib/xrechnung/member_container.rb
|
@@ -101,7 +103,7 @@ licenses:
|
|
101
103
|
metadata:
|
102
104
|
homepage_uri: https://github.com/digineo/xrechnung
|
103
105
|
source_code_uri: https://github.com/digineo/xrechnung
|
104
|
-
post_install_message:
|
106
|
+
post_install_message:
|
105
107
|
rdoc_options: []
|
106
108
|
require_paths:
|
107
109
|
- lib
|
@@ -117,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
119
|
version: '0'
|
118
120
|
requirements: []
|
119
121
|
rubygems_version: 3.1.6
|
120
|
-
signing_key:
|
122
|
+
signing_key:
|
121
123
|
specification_version: 4
|
122
124
|
summary: Library to create invoices in the XRechnung format.
|
123
125
|
test_files: []
|