cxml-ruby 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.
Files changed (151) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +23 -0
  3. data/.gitignore +14 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +175 -0
  6. data/Gemfile +2 -0
  7. data/LICENSE +18 -0
  8. data/README.md +94 -0
  9. data/Rakefile +6 -0
  10. data/cxml-ruby.gemspec +27 -0
  11. data/lib/cxml/accounting.rb +27 -0
  12. data/lib/cxml/additional_cost.rb +10 -0
  13. data/lib/cxml/additional_deduction.rb +12 -0
  14. data/lib/cxml/address.rb +16 -0
  15. data/lib/cxml/bill_to.rb +10 -0
  16. data/lib/cxml/browser_form_post.rb +13 -0
  17. data/lib/cxml/charge.rb +9 -0
  18. data/lib/cxml/classification.rb +9 -0
  19. data/lib/cxml/confirmation_header.rb +16 -0
  20. data/lib/cxml/confirmation_item.rb +14 -0
  21. data/lib/cxml/confirmation_request.rb +25 -0
  22. data/lib/cxml/confirmation_status.rb +32 -0
  23. data/lib/cxml/contact.rb +16 -0
  24. data/lib/cxml/country.rb +9 -0
  25. data/lib/cxml/credential.rb +49 -0
  26. data/lib/cxml/credential_mac.rb +26 -0
  27. data/lib/cxml/deducted_price.rb +9 -0
  28. data/lib/cxml/deduction_amount.rb +9 -0
  29. data/lib/cxml/description.rb +9 -0
  30. data/lib/cxml/discount.rb +10 -0
  31. data/lib/cxml/discount_percent.rb +9 -0
  32. data/lib/cxml/distribution.rb +11 -0
  33. data/lib/cxml/document.rb +71 -0
  34. data/lib/cxml/document_node.rb +126 -0
  35. data/lib/cxml/document_reference.rb +9 -0
  36. data/lib/cxml/due_amount.rb +9 -0
  37. data/lib/cxml/email.rb +10 -0
  38. data/lib/cxml/errors.rb +7 -0
  39. data/lib/cxml/extrinsic.rb +10 -0
  40. data/lib/cxml/from.rb +9 -0
  41. data/lib/cxml/gross_amount.rb +9 -0
  42. data/lib/cxml/header.rb +29 -0
  43. data/lib/cxml/id_reference.rb +13 -0
  44. data/lib/cxml/invoice_detail_discount.rb +13 -0
  45. data/lib/cxml/invoice_detail_header_indicator.rb +11 -0
  46. data/lib/cxml/invoice_detail_header_order.rb +24 -0
  47. data/lib/cxml/invoice_detail_item.rb +55 -0
  48. data/lib/cxml/invoice_detail_item_reference.rb +17 -0
  49. data/lib/cxml/invoice_detail_line_indicator.rb +14 -0
  50. data/lib/cxml/invoice_detail_line_shipping.rb +11 -0
  51. data/lib/cxml/invoice_detail_line_special_handling.rb +11 -0
  52. data/lib/cxml/invoice_detail_order.rb +24 -0
  53. data/lib/cxml/invoice_detail_order_info.rb +10 -0
  54. data/lib/cxml/invoice_detail_order_summary.rb +32 -0
  55. data/lib/cxml/invoice_detail_request.rb +40 -0
  56. data/lib/cxml/invoice_detail_request_header.rb +54 -0
  57. data/lib/cxml/invoice_detail_shipping.rb +27 -0
  58. data/lib/cxml/invoice_detail_summary.rb +18 -0
  59. data/lib/cxml/invoice_id_info.rb +10 -0
  60. data/lib/cxml/invoice_partner.rb +10 -0
  61. data/lib/cxml/item_detail.rb +27 -0
  62. data/lib/cxml/item_id.rb +10 -0
  63. data/lib/cxml/item_in.rb +14 -0
  64. data/lib/cxml/item_out.rb +17 -0
  65. data/lib/cxml/master_agreement_reference.rb +9 -0
  66. data/lib/cxml/message.rb +13 -0
  67. data/lib/cxml/modification.rb +15 -0
  68. data/lib/cxml/modification_detail.rb +16 -0
  69. data/lib/cxml/modifications.rb +23 -0
  70. data/lib/cxml/money.rb +35 -0
  71. data/lib/cxml/name.rb +9 -0
  72. data/lib/cxml/net_amount.rb +9 -0
  73. data/lib/cxml/order_reference.rb +12 -0
  74. data/lib/cxml/order_request.rb +33 -0
  75. data/lib/cxml/order_request_header.rb +66 -0
  76. data/lib/cxml/parser.rb +37 -0
  77. data/lib/cxml/payment_term.rb +28 -0
  78. data/lib/cxml/period.rb +10 -0
  79. data/lib/cxml/postal_address.rb +35 -0
  80. data/lib/cxml/protocol.rb +57 -0
  81. data/lib/cxml/punch_out_order_message.rb +33 -0
  82. data/lib/cxml/punch_out_order_message_header.rb +20 -0
  83. data/lib/cxml/punch_out_setup_request.rb +31 -0
  84. data/lib/cxml/punch_out_setup_response.rb +9 -0
  85. data/lib/cxml/request.rb +21 -0
  86. data/lib/cxml/response.rb +20 -0
  87. data/lib/cxml/segment.rb +12 -0
  88. data/lib/cxml/sender.rb +10 -0
  89. data/lib/cxml/ship_to.rb +10 -0
  90. data/lib/cxml/shipping.rb +10 -0
  91. data/lib/cxml/shipping_amount.rb +10 -0
  92. data/lib/cxml/special_handling_amount.rb +11 -0
  93. data/lib/cxml/start_page.rb +13 -0
  94. data/lib/cxml/state.rb +9 -0
  95. data/lib/cxml/status.rb +27 -0
  96. data/lib/cxml/subtotal_amount.rb +9 -0
  97. data/lib/cxml/supplier_setup.rb +13 -0
  98. data/lib/cxml/tax.rb +42 -0
  99. data/lib/cxml/tax_adjustment_amount.rb +9 -0
  100. data/lib/cxml/tax_amount.rb +9 -0
  101. data/lib/cxml/tax_detail.rb +44 -0
  102. data/lib/cxml/tax_location.rb +9 -0
  103. data/lib/cxml/taxable_amount.rb +9 -0
  104. data/lib/cxml/to.rb +9 -0
  105. data/lib/cxml/total.rb +10 -0
  106. data/lib/cxml/total_allowances.rb +9 -0
  107. data/lib/cxml/total_amount_without_tax.rb +9 -0
  108. data/lib/cxml/total_charges.rb +9 -0
  109. data/lib/cxml/unit_price.rb +9 -0
  110. data/lib/cxml/version.rb +5 -0
  111. data/lib/cxml.rb +39 -0
  112. data/spec/credential_spec.rb +37 -0
  113. data/spec/cxml_spec.rb +6 -0
  114. data/spec/document_spec.rb +155 -0
  115. data/spec/fixtures/.gitkeep +0 -0
  116. data/spec/fixtures/envelope.xml +31 -0
  117. data/spec/fixtures/envelope2.xml +36 -0
  118. data/spec/fixtures/invoice_backed_and_unbacked_by_pos.xml +106 -0
  119. data/spec/fixtures/invoice_backed_by_multiple_pos.xml +97 -0
  120. data/spec/fixtures/invoice_taxes_at_line.xml +82 -0
  121. data/spec/fixtures/invoice_taxes_at_line_multiple_taxes.xml +403 -0
  122. data/spec/fixtures/invoice_taxes_at_total.xml +78 -0
  123. data/spec/fixtures/item_in.xml +11 -0
  124. data/spec/fixtures/order_request.cxml +121 -0
  125. data/spec/fixtures/punch_out_order_message_doc.xml +32 -0
  126. data/spec/fixtures/punch_out_setup_request_doc.xml +32 -0
  127. data/spec/fixtures/punch_out_setup_request_doc_coupa.xml +42 -0
  128. data/spec/fixtures/punch_out_setup_request_doc_with_ship_to.xml +46 -0
  129. data/spec/fixtures/purchase_order_request_200.xml +132 -0
  130. data/spec/fixtures/request_doc.xml +79 -0
  131. data/spec/fixtures/response_status_200.xml +11 -0
  132. data/spec/fixtures/response_status_400.xml +5 -0
  133. data/spec/header_spec.rb +54 -0
  134. data/spec/invoice_detail_request_spec.rb +88 -0
  135. data/spec/item_detail_spec.rb +44 -0
  136. data/spec/item_id_spec.rb +40 -0
  137. data/spec/item_in_spec.rb +41 -0
  138. data/spec/money_spec.rb +44 -0
  139. data/spec/parser_spec.rb +6 -0
  140. data/spec/protocol_spec.rb +16 -0
  141. data/spec/punch_out_order_message_header_spec.rb +36 -0
  142. data/spec/punch_out_order_message_spec.rb +43 -0
  143. data/spec/punch_out_setup_request_spec.rb +60 -0
  144. data/spec/purchase_order_request_spec.rb +40 -0
  145. data/spec/request_spec.rb +36 -0
  146. data/spec/response_spec.rb +58 -0
  147. data/spec/sender_spec.rb +32 -0
  148. data/spec/spec_helper.rb +21 -0
  149. data/spec/status_spec.rb +44 -0
  150. data/spec/support/helpers.rb +5 -0
  151. metadata +317 -0
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class InvoiceDetailRequestHeader < DocumentNode
5
+ accessible_attributes %i[
6
+ invoice_date
7
+ invoice_id
8
+ invoice_origin
9
+ is_information_only
10
+ operation
11
+ purpose
12
+ ]
13
+ accessible_nodes %i[
14
+ comments
15
+ document_reference
16
+ extrinsics
17
+ invoice_detail_header_indicator
18
+ invoice_detail_line_indicator
19
+ invoice_detail_shipping
20
+ invoice_id_info
21
+ invoice_partners
22
+ payment_term
23
+ period
24
+ ]
25
+
26
+ def initialize_invoice_partner(value)
27
+ value = [value] unless value.is_a?(Array)
28
+ @invoice_partners = value.map do |item|
29
+ InvoicePartner.new(item)
30
+ end
31
+ end
32
+
33
+ def initialize_invoice_partners(value)
34
+ value = [value] unless value.is_a?(Array)
35
+ @invoice_partners = value.map do |item|
36
+ InvoicePartner.new(item)
37
+ end
38
+ end
39
+
40
+ def initialize_extrinsic(value)
41
+ value = [value] unless value.is_a?(Array)
42
+ @extrinsics = value.map do |item|
43
+ Extrinsic.new(item)
44
+ end
45
+ end
46
+
47
+ def initialize_extrinsics(value)
48
+ value = [value] unless value.is_a?(Array)
49
+ @extrinsics = value.map do |item|
50
+ Extrinsic.new(item)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class InvoiceDetailShipping < DocumentNode
5
+ accessible_attributes %i[
6
+ shipping_date
7
+ ]
8
+ accessible_nodes %i[
9
+ contacts
10
+ document_reference
11
+ ]
12
+
13
+ def initialize_contact(value)
14
+ value = [value] unless value.is_a?(Array)
15
+ @contacts = value.map do |item|
16
+ Contact.new(item)
17
+ end
18
+ end
19
+
20
+ def initialize_contacts(value)
21
+ value = [value] unless value.is_a?(Array)
22
+ @contacts = value.map do |item|
23
+ Contact.new(item)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class InvoiceDetailSummary < DocumentNode
5
+ accessible_nodes %i[
6
+ gross_amount
7
+ invoice_detail_discount
8
+ net_amount
9
+ shipping_amount
10
+ special_handling_amount
11
+ subtotal_amount
12
+ tax
13
+ total_allowances
14
+ total_amount_without_tax
15
+ total_charges
16
+ ]
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class InvoiceIDInfo < DocumentNode
5
+ accessible_attributes %i[
6
+ invoice_id
7
+ invoice_date
8
+ ]
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class InvoicePartner < DocumentNode
5
+ accessible_nodes %i[
6
+ contact
7
+ id_reference
8
+ ]
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class ItemDetail < DocumentNode
5
+ accessible_nodes %i[
6
+ description
7
+ unit_of_measure
8
+ unit_price
9
+ classification
10
+ extrinsics
11
+ ]
12
+
13
+ def initialize_extrinsic(value)
14
+ value = [value] unless value.is_a?(Array)
15
+ @extrinsics = value.map do |item|
16
+ Extrinsic.new(item)
17
+ end
18
+ end
19
+
20
+ def initialize_extrinsics(value)
21
+ value = [value] unless value.is_a?(Array)
22
+ @extrinsics = value.map do |item|
23
+ Extrinsic.new(item)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class ItemID < DocumentNode
5
+ accessible_nodes %i[
6
+ supplier_part_id
7
+ supplier_part_auxiliary_id
8
+ ]
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class ItemIn < DocumentNode
5
+ accessible_attributes %i[
6
+ quantity
7
+ line_number
8
+ ]
9
+ accessible_nodes %i[
10
+ item_id
11
+ item_detail
12
+ ]
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ # items in purchase order message
5
+ class ItemOut < DocumentNode
6
+ accessible_attributes %i[
7
+ quantity
8
+ line_number
9
+ ]
10
+ accessible_nodes %i[
11
+ item_id
12
+ item_detail
13
+ distribution
14
+ comments
15
+ ]
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class MasterAgreementReference < DocumentNode
5
+ accessible_nodes %i[
6
+ document_reference
7
+ ]
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class Message < DocumentNode
5
+ accessible_attributes %i[
6
+ deployment_mode
7
+ id
8
+ ]
9
+ accessible_nodes %i[
10
+ punch_out_order_message
11
+ ]
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class Modification < DocumentNode
5
+ accessible_attributes %i[
6
+ level
7
+ ]
8
+ accessible_nodes %i[
9
+ original_price
10
+ additional_cost
11
+ additional_deduction
12
+ modification_detail
13
+ ]
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class ModificationDetail < DocumentNode
5
+ accessible_attributes %i[
6
+ name
7
+ start_date
8
+ end_date
9
+ code
10
+ ]
11
+ accessible_nodes %i[
12
+ description
13
+ extrinsic
14
+ ]
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class Modifications < DocumentNode
5
+ accessible_nodes %i[
6
+ modifications
7
+ ]
8
+
9
+ def initialize_modification(value)
10
+ value = [value] unless value.is_a?(Array)
11
+ @modifications = value.map do |item|
12
+ Modification.new(item)
13
+ end
14
+ end
15
+
16
+ def initialize_modifications(value)
17
+ value = [value] unless value.is_a?(Array)
18
+ @modifications = value.map do |item|
19
+ Modification.new(item)
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/cxml/money.rb ADDED
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The Money element has three possible attributes: currency, alternateAmount,
4
+ # alternateCurrency. The attributes currency and alternateCurrecy must be a three-letter ISO
5
+ # 4217 currency code. The content of the Money element and of the aternateAmount
6
+ # attribute should be a numeric value. For example:
7
+ # <Money currency="USD">12.34</Money>
8
+ # The optional alternateCurrency and alternateAmount attributes are used together to specify
9
+ # an amount in an alternate currency. These can be used to support dual-currency
10
+ # requirements such as the euro. For example:
11
+ # <Money currency="USD" alternateCurrency=”EUR” alternateAmount=”14.28”>12.34
12
+ # </Money>
13
+ # Note: You can optionally use commas as thousands separators. Do not use
14
+ # commas as decimal separators.
15
+ #
16
+ # Page: 59
17
+ # <Money currency="GBP">5.35</Money>
18
+
19
+ module CXML
20
+ class Money < DocumentNode
21
+ accessible_attributes %i[
22
+ alternate_amount
23
+ alternate_currency
24
+ currency
25
+ ]
26
+
27
+ def amount
28
+ content
29
+ end
30
+
31
+ def amount=(value)
32
+ self.content = value
33
+ end
34
+ end
35
+ end
data/lib/cxml/name.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class Name < DocumentNode
5
+ accessible_attributes %i[
6
+ xml_lang
7
+ ]
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class NetAmount < DocumentNode
5
+ accessible_nodes %i[
6
+ money
7
+ ]
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class OrderReference < DocumentNode
5
+ accessible_attributes %i[
6
+ order_id
7
+ ]
8
+ accessible_nodes %i[
9
+ document_reference
10
+ ]
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ # body of purchase order request
5
+ class OrderRequest < DocumentNode
6
+ accessible_nodes %i[
7
+ order_request_header
8
+ items_out
9
+ ]
10
+
11
+ def initialize_item_out(value)
12
+ value = [value] unless value.is_a?(Array)
13
+ @items_out = value.map do |item|
14
+ CXML::ItemOut.new(item)
15
+ end
16
+ end
17
+
18
+ def initialize_items_out(value)
19
+ value = [value] unless value.is_a?(Array)
20
+ @items_out = value.map do |item|
21
+ CXML::ItemOut.new(item)
22
+ end
23
+ end
24
+
25
+ def add_item(item_in_data)
26
+ items_out << CXML::ItemOut.new(item_in_data)
27
+ end
28
+
29
+ def items_out
30
+ @items_out ||= []
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ # body header of purchase order request
5
+ class OrderRequestHeader < DocumentNode
6
+ accessible_attributes %i[
7
+ agreement_id
8
+ agreement_payload_id
9
+ effective_date
10
+ expiration_date
11
+ is_internal_version
12
+ order_date
13
+ order_id
14
+ order_type
15
+ order_version
16
+ parent_agreement_id
17
+ parent_agreement_payload_id
18
+ pick_up_date
19
+ release_required
20
+ requested_delivery_date
21
+ requisition_id
22
+ ship_complete
23
+ type
24
+ ]
25
+ accessible_nodes %i[
26
+ bill_to
27
+ comments
28
+ contact
29
+ control_keys
30
+ delivery_period
31
+ document_reference
32
+ extrinsics
33
+ followup
34
+ id_reference
35
+ legal_identity
36
+ order_request_header_industry
37
+ organizational_unit
38
+ payment
39
+ payment_term
40
+ ship_to
41
+ shipping
42
+ supplier_order_info
43
+ tax
44
+ terms_of_delivery
45
+ total
46
+ ]
47
+
48
+ def type
49
+ @type || 'new'
50
+ end
51
+
52
+ def initialize_extrinsic(value)
53
+ value = [value] unless value.is_a?(Array)
54
+ @extrinsics = value.map do |item|
55
+ Extrinsic.new(item)
56
+ end
57
+ end
58
+
59
+ def initialize_extrinsics(value)
60
+ value = [value] unless value.is_a?(Array)
61
+ @extrinsics = value.map do |item|
62
+ Extrinsic.new(item)
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require('nokogiri')
4
+ require('xmlsimple')
5
+
6
+ module CXML
7
+ class Parser
8
+ def parse(data)
9
+ hash = XmlSimple.xml_in(data, { 'ForceArray' => false })
10
+ hash.transform_keys!(&method(:underscore_key))
11
+ hash.transform_values!(&method(:underscore_hash_values))
12
+ hash
13
+ end
14
+
15
+ private
16
+
17
+ def underscore_hash_values(value)
18
+ return value.map(&method(:underscore_hash_values)) if value.is_a?(Array)
19
+ return value unless value.is_a?(Hash)
20
+
21
+ value.transform_keys!(&method(:underscore_key))
22
+ value.transform_values!(&method(:underscore_hash_values))
23
+ value
24
+ end
25
+
26
+ def underscore_key(key)
27
+ return key.to_s.to_sym unless /[A-Z-]|:/.match?(key)
28
+
29
+ word = key.to_s.gsub(':', '_')
30
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
31
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
32
+ word.tr!('-', '_')
33
+ word.downcase!
34
+ word.to_sym
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class PaymentTerm < DocumentNode
5
+ accessible_attributes %i[
6
+ pay_in_number_of_days
7
+ ]
8
+ accessible_nodes %i[
9
+ discount
10
+ extrinsics
11
+ net_due_days
12
+ ]
13
+
14
+ def initialize_extrinsic(value)
15
+ value = [value] unless value.is_a?(Array)
16
+ @extrinsics = value.map do |item|
17
+ Extrinsic.new(item)
18
+ end
19
+ end
20
+
21
+ def initialize_extrinsics(value)
22
+ value = [value] unless value.is_a?(Array)
23
+ @extrinsics = value.map do |item|
24
+ Extrinsic.new(item)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class Period < DocumentNode
5
+ accessible_attributes %i[
6
+ start_date
7
+ end_date
8
+ ]
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ # postal address, typically in a purchase order message
5
+ class PostalAddress < DocumentNode
6
+ accessible_attributes %i[
7
+ name
8
+ ]
9
+ accessible_nodes %i[
10
+ deliver_to
11
+ state
12
+ street
13
+ municipality
14
+ city
15
+ postal_code
16
+ country
17
+ ]
18
+
19
+ def initialize_deliver_to(value)
20
+ @deliver_to = if value.is_a?(Array)
21
+ value
22
+ else
23
+ [value]
24
+ end
25
+ end
26
+
27
+ def initialize_street(value)
28
+ @street = if value.is_a?(Array)
29
+ value
30
+ else
31
+ [value]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ module Protocol
5
+ VERSION = '1.2.011'
6
+
7
+ REQUEST_ELEMENTS = %w[
8
+ OrderRequest
9
+ ProfileRequest
10
+ PunchOutSetupRequest
11
+ StatusUpdateRequest
12
+ GetPendingRequest
13
+ ConfirmationRequest
14
+ ShipNoticeRequest
15
+ ProviderSetupRequest
16
+ PaymentRemittanceRequest
17
+ ].freeze
18
+
19
+ RESPONSE_ELEMENTS = %w[
20
+ ProfileResponse
21
+ PunchOutSetupResponse
22
+ GetPendingResponse
23
+ ].freeze
24
+
25
+ STATUS_CODES = [
26
+ 200, 201, 204, 280, 281,
27
+ 400, 401, 402, 403, 406, 409, 412, 417, 450, 475, 476, 477,
28
+ 500, 550, 551, 560,
29
+ ].freeze
30
+
31
+ class << self
32
+ # Get current protocol version
33
+ # @return [String]
34
+ def version
35
+ VERSION
36
+ end
37
+
38
+ # Get available request elements
39
+ # @return [Array<String>]
40
+ def request_elements
41
+ REQUEST_ELEMENTS
42
+ end
43
+
44
+ # Get available response elements
45
+ # @return [Array<String>]
46
+ def response_elements
47
+ RESPONSE_ELEMENTS
48
+ end
49
+
50
+ # Get available status codes
51
+ # @return [Array<Fixnum>]
52
+ def status_codes
53
+ STATUS_CODES
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ class PunchOutOrderMessage < DocumentNode
5
+ accessible_nodes %i[
6
+ buyer_cookie
7
+ punch_out_order_message_header
8
+ items_in
9
+ ]
10
+
11
+ def initialize_item_in(value)
12
+ value = [value] unless value.is_a?(Array)
13
+ @items_in = value.map do |item|
14
+ CXML::ItemIn.new(item)
15
+ end
16
+ end
17
+
18
+ def initialize_items_in(value)
19
+ value = [value] unless value.is_a?(Array)
20
+ @items_in = value.map do |item|
21
+ CXML::ItemIn.new(item)
22
+ end
23
+ end
24
+
25
+ def add_item(item_in_data)
26
+ items_in << CXML::ItemIn.new(item_in_data)
27
+ end
28
+
29
+ def items_in
30
+ @items_in ||= []
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CXML
4
+ # punchout order message header
5
+ class PunchOutOrderMessageHeader < DocumentNode
6
+ accessible_attributes %i[
7
+ operation_allowed
8
+ ]
9
+ accessible_nodes %i[
10
+ total
11
+ shipping
12
+ tax
13
+ ship_to
14
+ ]
15
+
16
+ def operation_allowed
17
+ @operation_allowed || 'create'
18
+ end
19
+ end
20
+ end