secretariat 3.0.0 → 3.1.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.
- checksums.yaml +4 -4
- data/lib/secretariat/helpers.rb +7 -0
- data/lib/secretariat/invoice.rb +34 -4
- data/lib/secretariat/line_item.rb +2 -2
- data/lib/secretariat/validator.rb +25 -3
- data/lib/secretariat/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78a5b530fb987800431c180f91436cd9d538ed364f478aa17ddee805e85fc2f3
|
4
|
+
data.tar.gz: c4d569c8923b971e91eb5d1862f1e8484ddaf402cb62b6e405c4bee24ba2518f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7dbdd370a0790c03b4f2fdbbefa16c3653e5554236e97b25eb7ff778ec1253a57e1323166ada9e8010fd5b47266ceee0bfc5e3c4e0f4d31a98f8ffd2d417f5d1
|
7
|
+
data.tar.gz: 61c934e0e8994226b61ad2780695c610d86000265cb0e95478d994f3740143f5849c3662be0fe2e8754cc5ef02aff1176f2e7753a5036437cb087a39d833fb56
|
data/lib/secretariat/helpers.rb
CHANGED
@@ -15,5 +15,12 @@ module Secretariat
|
|
15
15
|
xml.text(format(amount, round: 4, digits: digits))
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
def self.date_element(xml, date)
|
20
|
+
date = date.strftime("%Y%m%d") if date.respond_to?(:strftime)
|
21
|
+
xml['udt'].DateTimeString(format: '102') do
|
22
|
+
xml.text(date)
|
23
|
+
end
|
24
|
+
end
|
18
25
|
end
|
19
26
|
end
|
data/lib/secretariat/invoice.rb
CHANGED
@@ -20,12 +20,18 @@ module Secretariat
|
|
20
20
|
Invoice = Struct.new("Invoice",
|
21
21
|
:id,
|
22
22
|
:issue_date,
|
23
|
+
:service_period_start,
|
24
|
+
:service_period_end,
|
23
25
|
:seller,
|
24
26
|
:buyer,
|
27
|
+
:buyer_reference,
|
25
28
|
:line_items,
|
26
29
|
:currency_code,
|
27
30
|
:payment_type,
|
28
31
|
:payment_text,
|
32
|
+
:payment_terms_text,
|
33
|
+
:payment_due_date,
|
34
|
+
:payment_iban,
|
29
35
|
:tax_category,
|
30
36
|
:tax_percent,
|
31
37
|
:tax_amount,
|
@@ -104,12 +110,12 @@ module Secretariat
|
|
104
110
|
)
|
105
111
|
end
|
106
112
|
|
107
|
-
def to_xml(version: 1)
|
113
|
+
def to_xml(version: 1, validate: true)
|
108
114
|
if version < 1 || version > 2
|
109
115
|
raise 'Unsupported Document Version'
|
110
116
|
end
|
111
117
|
|
112
|
-
|
118
|
+
if validate && !valid?
|
113
119
|
raise ValidationError.new("Invoice is invalid", errors)
|
114
120
|
end
|
115
121
|
|
@@ -141,19 +147,23 @@ module Secretariat
|
|
141
147
|
xml.text(issue_date.strftime("%Y%m%d"))
|
142
148
|
end
|
143
149
|
end
|
150
|
+
|
144
151
|
end
|
145
152
|
transaction = by_version(version, 'SpecifiedSupplyChainTradeTransaction', 'SupplyChainTradeTransaction')
|
146
153
|
xml['rsm'].send(transaction) do
|
147
154
|
|
148
155
|
if version == 2
|
149
156
|
line_items.each_with_index do |item, i|
|
150
|
-
item.to_xml(xml, i + 1, version: version) # one indexed
|
157
|
+
item.to_xml(xml, i + 1, version: version, validate: validate) # one indexed
|
151
158
|
end
|
152
159
|
end
|
153
160
|
|
154
161
|
trade_agreement = by_version(version, 'ApplicableSupplyChainTradeAgreement', 'ApplicableHeaderTradeAgreement')
|
155
162
|
|
156
163
|
xml['ram'].send(trade_agreement) do
|
164
|
+
if buyer_reference
|
165
|
+
xml['ram'].BuyerReference buyer_reference
|
166
|
+
end
|
157
167
|
xml['ram'].SellerTradeParty do
|
158
168
|
seller.to_xml(xml, version: version)
|
159
169
|
end
|
@@ -184,6 +194,11 @@ module Secretariat
|
|
184
194
|
xml['ram'].SpecifiedTradeSettlementPaymentMeans do
|
185
195
|
xml['ram'].TypeCode payment_code
|
186
196
|
xml['ram'].Information payment_text
|
197
|
+
if payment_iban
|
198
|
+
xml['ram'].PayeePartyCreditorFinancialAccount do
|
199
|
+
xml['ram'].IBANID payment_iban
|
200
|
+
end
|
201
|
+
end
|
187
202
|
end
|
188
203
|
xml['ram'].ApplicableTradeTax do
|
189
204
|
|
@@ -198,8 +213,23 @@ module Secretariat
|
|
198
213
|
percent = by_version(version, 'ApplicablePercent', 'RateApplicablePercent')
|
199
214
|
xml['ram'].send(percent, Helpers.format(tax_percent))
|
200
215
|
end
|
216
|
+
if version == 2 && service_period_start && service_period_end
|
217
|
+
xml['ram'].BillingSpecifiedPeriod do
|
218
|
+
xml['ram'].StartDateTime do
|
219
|
+
Helpers.date_element(xml, service_period_start)
|
220
|
+
end
|
221
|
+
xml['ram'].EndDateTime do
|
222
|
+
Helpers.date_element(xml, service_period_end)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
201
226
|
xml['ram'].SpecifiedTradePaymentTerms do
|
202
|
-
xml['ram'].Description "Paid"
|
227
|
+
xml['ram'].Description payment_terms_text || "Paid"
|
228
|
+
if payment_due_date
|
229
|
+
xml['ram'].DueDateDateTime do
|
230
|
+
Helpers.date_element(xml, payment_due_date)
|
231
|
+
end
|
232
|
+
end
|
203
233
|
end
|
204
234
|
|
205
235
|
monetary_summation = by_version(version, 'SpecifiedTradeSettlementMonetarySummation', 'SpecifiedTradeSettlementHeaderMonetarySummation')
|
@@ -84,8 +84,8 @@ module Secretariat
|
|
84
84
|
TAX_CATEGORY_CODES[tax_category] || 'S'
|
85
85
|
end
|
86
86
|
|
87
|
-
def to_xml(xml, line_item_index, version: 2)
|
88
|
-
if !valid?
|
87
|
+
def to_xml(xml, line_item_index, version: 2, validate: true)
|
88
|
+
if validate && !valid?
|
89
89
|
pp errors
|
90
90
|
raise ValidationError.new("LineItem #{line_item_index} is invalid", errors)
|
91
91
|
end
|
@@ -15,8 +15,13 @@ limitations under the License.
|
|
15
15
|
=end
|
16
16
|
|
17
17
|
require 'nokogiri'
|
18
|
+
require 'tmpdir'
|
18
19
|
|
19
20
|
module Secretariat
|
21
|
+
|
22
|
+
class ValidatorError < StandardError; end
|
23
|
+
|
24
|
+
|
20
25
|
class Validator
|
21
26
|
SCHEMATRON = [
|
22
27
|
'../../schemas/zugferd_1/ZUGFeRD1p0.sch',
|
@@ -55,10 +60,27 @@ module Secretariat
|
|
55
60
|
Dir.mktmpdir do |dir|
|
56
61
|
docpath = File.join(dir, 'doc.xml')
|
57
62
|
File.write(docpath, doc, mode: 'wb')
|
58
|
-
|
59
|
-
|
60
|
-
out.
|
63
|
+
jarpath = File.join(__dir__, '../..', 'bin', 'schxslt-cli.jar')
|
64
|
+
out = `java -jar #{jarpath} -v -d #{docpath} -s #{schematron_path}`
|
65
|
+
return [] if out.start_with?("[valid]")
|
66
|
+
return process_schematron_errors(out)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def process_schematron_errors(output)
|
73
|
+
errors = []
|
74
|
+
error_lines = output.lines.clone
|
75
|
+
error_lines.shift # get rid of file notice
|
76
|
+
|
77
|
+
while(error_lines.length > 0) do
|
78
|
+
assert_error = error_lines.shift
|
79
|
+
_, ref = assert_error.split(" failed-assert ").map(&:strip)
|
80
|
+
error_description = error_lines.shift.strip
|
81
|
+
errors << ValidatorError.new("#{error_description} - Reference: #{ref}")
|
61
82
|
end
|
83
|
+
errors
|
62
84
|
end
|
63
85
|
end
|
64
86
|
end
|
data/lib/secretariat/version.rb
CHANGED