tradedoc 0.1.0 → 0.2.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/CHANGELOG.md +12 -2
- data/lib/tradedoc/format/cii/coder/contact.rb +2 -2
- data/lib/tradedoc/format/cii/coder/invoice.rb +2 -2
- data/lib/tradedoc/format/cii/coder/invoice_line.rb +2 -2
- data/lib/tradedoc/format/cii/coder/remittance_advice.rb +1 -1
- data/lib/tradedoc/format/cii/coder/trade_party.rb +17 -0
- data/lib/tradedoc/format/ubl/coder/invoice.rb +3 -3
- data/lib/tradedoc/format/ubl/coder/invoice_line.rb +2 -2
- data/lib/tradedoc/format/ubl/coder/product.rb +1 -1
- data/lib/tradedoc/format/ubl/coder/tax_category.rb +1 -1
- data/lib/tradedoc/format/ubl/coder/trade_party.rb +22 -0
- data/lib/tradedoc/model/trade_party.rb +6 -0
- data/lib/tradedoc/version.rb +1 -1
- data/lib/tradedoc/xml/writer.rb +12 -0
- 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: 9a70e0cf62712b8f2a9f32130333cfefde2290ee72e93dd5c9306efc5c6454c8
|
|
4
|
+
data.tar.gz: 3ec08efbd6910f6f8f2b3341fab2f7955d0b12b016d6583b600fad029734918d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3b73c93cb7944000755ff82cac2e71b8bffc8cff311ab75cb35dc7b63ff5c22af7b4d811125429c81b026611f18fb6bdca0ee05bff3a48a82bcefb12068a953e
|
|
7
|
+
data.tar.gz: 68cd3edbe9399e3b01bed3734d1b7e93ee9181159610ae7986d45be5d3c491cee421d422de4e524aa84e26884c9dccf68488976390edabbc9c2d52932a63e650
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
[Unreleased]
|
|
2
|
+
------------
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
[0.2.0] - 2026-09-30
|
|
5
|
+
--------------------
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
* `TradeParty` support for `vat_number` and `legal_registration_number`
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
[0.1.0] - 2026-07-29
|
|
13
|
+
--------------------
|
|
4
14
|
|
|
5
15
|
- Initial release
|
|
@@ -11,13 +11,13 @@ module Tradedoc
|
|
|
11
11
|
w.add(as) do
|
|
12
12
|
w.render(obj.name, as: "ram:PersonName")
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
w.render(obj.phone) do |tel|
|
|
15
15
|
w.add("ram:TelephoneUniversalCommunication") do
|
|
16
16
|
w.render(tel, as: "ram:CompleteNumber")
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
w.render(obj.email) do |email|
|
|
21
21
|
w.add("ram:EmailURIUniversalCommunication") do
|
|
22
22
|
w.render(email, as: "ram:URIID")
|
|
23
23
|
end
|
|
@@ -26,7 +26,7 @@ module Tradedoc
|
|
|
26
26
|
|
|
27
27
|
def self.dump(w, obj)
|
|
28
28
|
w.add("rsm:CrossIndustryInvoice", NS) do
|
|
29
|
-
|
|
29
|
+
w.render(obj.specification_id) do |spec_id|
|
|
30
30
|
w.add("rsm:ExchangedDocumentContext") do
|
|
31
31
|
w.add("ram:GuidelineSpecifiedDocumentContextParameter") do
|
|
32
32
|
w.render(spec_id, as: "ram:ID")
|
|
@@ -38,7 +38,7 @@ module Tradedoc
|
|
|
38
38
|
w.render(obj.invoice_number, as: "ram:ID")
|
|
39
39
|
w.render(obj.invoice_type_code, as: "ram:TypeCode")
|
|
40
40
|
w.render(obj.issue_date, as: "ram:IssueDateTime")
|
|
41
|
-
|
|
41
|
+
w.render(obj.note) do |note|
|
|
42
42
|
w.add("ram:IncludedNote") do
|
|
43
43
|
w.add("ram:Content", note)
|
|
44
44
|
end
|
|
@@ -20,13 +20,13 @@ module Tradedoc
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
w.add("ram:SpecifiedLineTradeAgreement") do
|
|
23
|
-
|
|
23
|
+
w.render(obj.price.gross) do |gross|
|
|
24
24
|
w.add("ram:GrossPriceProductTradePrice") do
|
|
25
25
|
w.render(gross, as: "ram:ChargeAmount")
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
w.render(obj.price.net) do |net|
|
|
30
30
|
w.add("ram:NetPriceProductTradePrice") do
|
|
31
31
|
w.render(net, as: "ram:ChargeAmount")
|
|
32
32
|
end
|
|
@@ -3,6 +3,9 @@ module Tradedoc
|
|
|
3
3
|
module CII
|
|
4
4
|
module Coder
|
|
5
5
|
class TradeParty
|
|
6
|
+
VAT_TYPE = "VA"
|
|
7
|
+
private_constant :VAT_TYPE
|
|
8
|
+
|
|
6
9
|
def self.ruby_type
|
|
7
10
|
Model::TradeParty
|
|
8
11
|
end
|
|
@@ -10,16 +13,30 @@ module Tradedoc
|
|
|
10
13
|
def self.dump(w, obj, as:)
|
|
11
14
|
w.add(as) do
|
|
12
15
|
w.render(obj.name, as: "Name")
|
|
16
|
+
w.render(obj.legal_registration_id) do |id|
|
|
17
|
+
w.add("ram:SpecifiedLegalOrganization") do
|
|
18
|
+
w.add("ram:ID", id)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
13
21
|
w.render(obj.contact, as: "ram:DefinedTradeContact")
|
|
14
22
|
w.render(obj.address, as: "PostalTradeAddress")
|
|
23
|
+
w.render(obj.vat_number) do |vat_number|
|
|
24
|
+
w.add("ram:SpecifiedTaxRegistration") do
|
|
25
|
+
w.add("ram:ID", vat_number, schemeID: VAT_TYPE)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
15
28
|
end
|
|
16
29
|
end
|
|
17
30
|
|
|
18
31
|
def self.parse(r)
|
|
19
32
|
ruby_type.new.tap do |tp|
|
|
20
33
|
r.parse("ram:Name", :String) { tp.name = it }
|
|
34
|
+
r.parse("ram:SpecifiedLegalOrganization/ram:ID", :String) { tp.legal_registration_id = it }
|
|
21
35
|
r.parse("ram:DefinedTradeContact", :Contact) { tp.contact = it }
|
|
22
36
|
r.parse("ram:PostalTradeAddress", :Address) { tp.address = it }
|
|
37
|
+
r.parse("ram:SpecifiedTaxRegistration/ram:ID[@schemeID='#{VAT_TYPE}']", :String) do
|
|
38
|
+
tp.vat_number = it
|
|
39
|
+
end
|
|
23
40
|
end
|
|
24
41
|
end
|
|
25
42
|
end
|
|
@@ -35,17 +35,17 @@ module Tradedoc
|
|
|
35
35
|
w.render(obj.note, as: "cbc:Note")
|
|
36
36
|
w.render(obj.currency_code, as: "cbc:DocumentCurrencyCode", listAgencyID: Code::Agency::CEFACT)
|
|
37
37
|
w.render(obj.invoice_period, as: "InvoicePeriod")
|
|
38
|
-
|
|
38
|
+
w.render(obj.purchase_order_number) do |po_number|
|
|
39
39
|
w.add("cac:OrderReference") do
|
|
40
40
|
w.render(po_number, as: "cbc:ID")
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
|
-
|
|
43
|
+
w.render(obj.supplier) do |supplier|
|
|
44
44
|
w.add("cac:AccountingSupplierParty") do
|
|
45
45
|
w.render(supplier, as: "cac:Party")
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
|
-
|
|
48
|
+
w.render(obj.buyer) do |buyer|
|
|
49
49
|
w.add("cac:AccountingCustomerParty") do
|
|
50
50
|
w.render(buyer, as: "cac:Party")
|
|
51
51
|
end
|
|
@@ -12,7 +12,7 @@ module Tradedoc
|
|
|
12
12
|
w.render(obj.id, as: "cbc:ID")
|
|
13
13
|
w.render(obj.invoiced_quantity, as: "cbc:InvoicedQuantity")
|
|
14
14
|
w.render(obj.total_excluding_tax, as: "LineExtensionAmount")
|
|
15
|
-
|
|
15
|
+
w.render(obj.total_tax) do |total_tax|
|
|
16
16
|
w.add("cac:TaxTotal") do
|
|
17
17
|
w.render(total_tax, as: "TotalTax")
|
|
18
18
|
end
|
|
@@ -20,7 +20,7 @@ module Tradedoc
|
|
|
20
20
|
|
|
21
21
|
w.render(obj.product)
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
w.render(obj.price) do |price|
|
|
24
24
|
w.add("cac:Price") do
|
|
25
25
|
w.render(price.net, as: "PriceAmount")
|
|
26
26
|
w.render(price.base_quantity, as: "cbc:BaseQuantity")
|
|
@@ -11,7 +11,7 @@ module Tradedoc
|
|
|
11
11
|
w.add(as) do
|
|
12
12
|
w.render(obj.description, as: "cbc:Description")
|
|
13
13
|
w.render(obj.name, as: "cbc:Name")
|
|
14
|
-
|
|
14
|
+
w.render(obj.seller_assigned_id) do |id|
|
|
15
15
|
w.add("cac:SellersItemIdentification") do
|
|
16
16
|
w.render(id, as: "cbc:ID")
|
|
17
17
|
end
|
|
@@ -13,7 +13,7 @@ module Tradedoc
|
|
|
13
13
|
w.render(obj.rate_percent, as: "cbc:Percent")
|
|
14
14
|
w.render(obj.exemption_reason_code, as: "cbc:TaxExemptionReasonCode")
|
|
15
15
|
w.render(obj.exemption_reason, as: "cbc:TaxExemptionReason")
|
|
16
|
-
|
|
16
|
+
w.render(obj.tax_scheme) do |tax_scheme|
|
|
17
17
|
w.add("cac:TaxScheme") do
|
|
18
18
|
w.render(tax_scheme, as: "cbc:ID")
|
|
19
19
|
end
|
|
@@ -3,6 +3,9 @@ module Tradedoc
|
|
|
3
3
|
module UBL
|
|
4
4
|
module Coder
|
|
5
5
|
class TradeParty
|
|
6
|
+
VAT_SCHEME = "VAT"
|
|
7
|
+
private_constant :VAT_SCHEME
|
|
8
|
+
|
|
6
9
|
def self.ruby_type
|
|
7
10
|
Model::TradeParty
|
|
8
11
|
end
|
|
@@ -13,6 +16,19 @@ module Tradedoc
|
|
|
13
16
|
w.add("cbc:Name", obj.name)
|
|
14
17
|
end
|
|
15
18
|
w.render(obj.address, as: "PostalAddress")
|
|
19
|
+
w.render(obj.vat_number) do |vat_number|
|
|
20
|
+
w.add("cac:PartyTaxScheme") do
|
|
21
|
+
w.add("cbc:CompanyID", vat_number)
|
|
22
|
+
w.add("cac:TaxScheme") do
|
|
23
|
+
w.add("cbc:ID", VAT_SCHEME, schemeAgencyID: Code::Agency::CEFACT)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
w.render(obj.legal_registration_id) do |id|
|
|
28
|
+
w.add("cac:PartyLegalEntity") do
|
|
29
|
+
w.add("cbc:CompanyID", id)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
16
32
|
w.render(obj.contact, as: "cac:Contact")
|
|
17
33
|
end
|
|
18
34
|
end
|
|
@@ -26,6 +42,12 @@ module Tradedoc
|
|
|
26
42
|
end
|
|
27
43
|
r.parse("cac:PostalAddress", :Address) { obj.address = it }
|
|
28
44
|
r.parse("cac:Contact", :Contact) { obj.contact = it }
|
|
45
|
+
r.parse("cac:PartyTaxScheme[cac:TaxScheme/cbc:ID='#{VAT_SCHEME}']/cbc:CompanyID", :String) do
|
|
46
|
+
obj.vat_number = it
|
|
47
|
+
end
|
|
48
|
+
r.with_node("cac:PartyLegalEntity") do
|
|
49
|
+
r.parse("cbc:CompanyID", :String) { obj.legal_registration_id = it }
|
|
50
|
+
end
|
|
29
51
|
end
|
|
30
52
|
|
|
31
53
|
obj
|
data/lib/tradedoc/version.rb
CHANGED
data/lib/tradedoc/xml/writer.rb
CHANGED
|
@@ -32,12 +32,24 @@ module Tradedoc
|
|
|
32
32
|
# Given an object, figure out how to dump/render it into the XML builder.
|
|
33
33
|
#
|
|
34
34
|
# If the given object/value is `nil`, nothing is rendered. No empty element.
|
|
35
|
+
#
|
|
36
|
+
# A block can be given for custom rendering without a coder class.
|
|
37
|
+
#
|
|
35
38
|
# Otherwise, a coder is looked-up and used for the given type.
|
|
36
39
|
# Assumes that the de-namespaced class name has a matching local coder.
|
|
37
40
|
# e.g. `Tradedoc::Model::Country` rendered by `Tradedoc::Format::UBL::Coder::Country`
|
|
38
41
|
def render(obj, coder_ref = nil, **opts)
|
|
39
42
|
return if obj.nil?
|
|
40
43
|
|
|
44
|
+
if coder_ref && block_given?
|
|
45
|
+
raise ArgumentError, "provide a coder or a block, but not both"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
if block_given?
|
|
49
|
+
yield obj
|
|
50
|
+
return
|
|
51
|
+
end
|
|
52
|
+
|
|
41
53
|
coder_class = self.format.coder_for(coder_ref || obj.class)
|
|
42
54
|
coder_class.dump(self, obj, **opts)
|
|
43
55
|
end
|