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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d87493b2d1156cf4362761b4dc3398dad0c6348ce3170826baec0bfba4828e89
4
- data.tar.gz: 24977f17f5d160e53db9bce2515ebf54f8230803dfd29421b70b0481999f9d93
3
+ metadata.gz: 9a70e0cf62712b8f2a9f32130333cfefde2290ee72e93dd5c9306efc5c6454c8
4
+ data.tar.gz: 3ec08efbd6910f6f8f2b3341fab2f7955d0b12b016d6583b600fad029734918d
5
5
  SHA512:
6
- metadata.gz: c557ebc83e0c24369c8fa95290fe21814709f4d87b6b0f7877d98dd6cf5ea6d1805a4a5ba6e087a25b00c5a2ded4fbaabdc237eddfafc802792e5603f3eb3489
7
- data.tar.gz: 85ef013be857e6ee3d4038c94aec51f06552d0e34daa75cd63a1e6755df6ed27accb484e5cc63478383382d85c3c6afd52547ef148034dcc95814b9a45616f43
6
+ metadata.gz: 3b73c93cb7944000755ff82cac2e71b8bffc8cff311ab75cb35dc7b63ff5c22af7b4d811125429c81b026611f18fb6bdca0ee05bff3a48a82bcefb12068a953e
7
+ data.tar.gz: 68cd3edbe9399e3b01bed3734d1b7e93ee9181159610ae7986d45be5d3c491cee421d422de4e524aa84e26884c9dccf68488976390edabbc9c2d52932a63e650
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
- ## [Unreleased]
1
+ [Unreleased]
2
+ ------------
2
3
 
3
- ## [0.1.0] - 2026-07-29
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
- if (tel = obj.phone)
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
- if (email = obj.email)
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
- if (spec_id = obj.specification_id)
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
- if (note = obj.note)
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
- if (gross = obj.price.gross)
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
- if (net = obj.price.net)
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
@@ -29,7 +29,7 @@ module Tradedoc
29
29
  w.add("ram:ID", obj.id)
30
30
  w.render(obj.issue_date, as: "ram:IssueDateTime")
31
31
 
32
- if (note = obj.note)
32
+ w.render(obj.note) do |note|
33
33
  w.add("ram:IncludedNote") do
34
34
  w.add("ram:Content", note)
35
35
  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
- if (po_number = obj.purchase_order_number)
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
- if (supplier = obj.supplier)
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
- if (buyer = obj.buyer)
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
- if (total_tax = obj.total_tax)
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
- if (price = obj.price)
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
- if (id = obj.seller_assigned_id)
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
- if (tax_scheme = obj.tax_scheme)
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
@@ -1,9 +1,15 @@
1
1
  module Tradedoc
2
2
  module Model
3
+ # [BG-4]
3
4
  class TradeParty < Base
4
5
  has :name, String
5
6
  has :address, Address
6
7
  has :contact, Contact
8
+
9
+ # [BT-63]
10
+ has :vat_number, String
11
+
12
+ has :legal_registration_id, String
7
13
  end
8
14
  end
9
15
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tradedoc
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tradedoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mroach