qbwc_requests 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -2
  3. data/lib/qbwc_requests/{qbwc/request/v07/account.rb → account/v07/add.rb} +3 -3
  4. data/lib/qbwc_requests/account/v07/query.rb +9 -0
  5. data/lib/qbwc_requests/base.rb +76 -0
  6. data/lib/qbwc_requests/bill/v07/add.rb +11 -0
  7. data/lib/qbwc_requests/bill/v07/query.rb +9 -0
  8. data/lib/qbwc_requests/customer/v07/add.rb +39 -0
  9. data/lib/qbwc_requests/customer/v07/query.rb +9 -0
  10. data/lib/qbwc_requests/{qbwc/request/v07/estimate.rb → estimate/v07/add.rb} +5 -4
  11. data/lib/qbwc_requests/estimate/v07/query.rb +9 -0
  12. data/lib/qbwc_requests/factory.rb +32 -0
  13. data/lib/qbwc_requests/general_detail_report/v07/query.rb +9 -0
  14. data/lib/qbwc_requests/{qbwc/request/v07/invoice.rb → invoice/v07/add.rb} +5 -5
  15. data/lib/qbwc_requests/invoice/v07/query.rb +9 -0
  16. data/lib/qbwc_requests/item/v07/query.rb +9 -0
  17. data/lib/qbwc_requests/{qbwc/request/v07/item_discount.rb → item_discount/v07/add.rb} +5 -4
  18. data/lib/qbwc_requests/item_discount/v07/query.rb +9 -0
  19. data/lib/qbwc_requests/{qbwc/request/v07/item_group.rb → item_group/v07/add.rb} +4 -3
  20. data/lib/qbwc_requests/item_group/v07/query.rb +9 -0
  21. data/lib/qbwc_requests/{qbwc/request/v07/item_non_inventory.rb → item_non_inventory/v07/add.rb} +5 -4
  22. data/lib/qbwc_requests/item_non_inventory/v07/query.rb +9 -0
  23. data/lib/qbwc_requests/{qbwc/request/v07/item_other_charge.rb → item_other_charge/v07/add.rb} +4 -3
  24. data/lib/qbwc_requests/item_other_charge/v07/query.rb +9 -0
  25. data/lib/qbwc_requests/{qbwc/request/v07/item_payment.rb → item_payment/v07/add.rb} +4 -3
  26. data/lib/qbwc_requests/item_payment/v07/query.rb +9 -0
  27. data/lib/qbwc_requests/{qbwc/request/v07/item_service.rb → item_service/v07/add.rb} +4 -3
  28. data/lib/qbwc_requests/item_service/v07/query.rb +9 -0
  29. data/lib/qbwc_requests/{qbwc/request/v07/item_subtotal.rb → item_subtotal/v07/add.rb} +5 -4
  30. data/lib/qbwc_requests/item_subtotal/v07/query.rb +9 -0
  31. data/lib/qbwc_requests/ordered_fields.rb +81 -0
  32. data/lib/qbwc_requests/purchase_order/v07/add.rb +33 -0
  33. data/lib/qbwc_requests/{qbwc/request/v07/purchase_order.rb → purchase_order/v07/mod.rb} +10 -14
  34. data/lib/qbwc_requests/purchase_order/v07/query.rb +9 -0
  35. data/lib/qbwc_requests/sub_models/address.rb +27 -0
  36. data/lib/qbwc_requests/vendor/v07/add.rb +44 -0
  37. data/lib/qbwc_requests/vendor/v07/mod.rb +44 -0
  38. data/lib/qbwc_requests/vendor/v07/query.rb +9 -0
  39. data/lib/qbwc_requests/vendor/v13/add.rb +44 -0
  40. data/lib/qbwc_requests/vendor/v13/mod.rb +44 -0
  41. data/lib/qbwc_requests/vendor/v13/query.rb +9 -0
  42. data/lib/qbwc_requests/version.rb +1 -1
  43. data/lib/qbwc_requests/{qbwc/xml_actions.rb → xml_actions.rb} +2 -9
  44. data/lib/qbwc_requests.rb +51 -5
  45. data/qbwc_requests.gemspec +4 -2
  46. data/quickbook/dtd/qbxmlops60.dtd +3043 -0
  47. data/quickbook/dtd/qbxmlops60_2.dtd +3019 -0
  48. data/scripts/dtd_to_classes.rb +3 -0
  49. data/spec/account_qbxml_spec.rb +42 -0
  50. data/spec/{qbwc/request/v07/bill_spec.rb → bill_qbxml_spec.rb} +10 -5
  51. data/spec/customer_qbxml_spec.rb +57 -0
  52. data/spec/{qbwc/request/v07/estimate_spec.rb → estimate_qbxml_spec.rb} +19 -8
  53. data/spec/general_detail_report_qbxml_spec.rb +9 -0
  54. data/spec/{qbwc/request/v07/invoice_spec.rb → invoice_qbxml_spec.rb} +11 -9
  55. data/spec/{qbwc/request/v07/item_discount_spec.rb → item_discount_qbxml_spec.rb} +10 -8
  56. data/spec/{qbwc/request/v07/item_group_spec.rb → item_group_qbxml_spec.rb} +9 -7
  57. data/spec/{qbwc/request/v07/item_non_inventory_spec.rb → item_non_inventory_qbxml_spec.rb} +9 -7
  58. data/spec/{qbwc/request/v07/item_other_charge_spec.rb → item_other_charge_qbxml_spec.rb} +10 -8
  59. data/spec/{qbwc/request/v07/item_payment_spec.rb → item_payment_qbxml_spec.rb} +10 -7
  60. data/spec/item_qbxml_spec.rb +9 -0
  61. data/spec/{qbwc/request/v07/item_service_spec.rb → item_service_qbxml_spec.rb} +9 -7
  62. data/spec/{qbwc/request/v07/item_subtotal_spec.rb → item_subtotal_qbxml_spec.rb} +12 -10
  63. data/spec/job_report_qbxml_spec.rb +7 -0
  64. data/spec/{qbwc/request/v07/purchase_orders_spec.rb → purchase_order_qbxml_spec.rb} +11 -10
  65. data/spec/spec_helper.rb +5 -0
  66. data/spec/support/expectations/field_validations.rb +2 -2
  67. data/spec/support/expectations/xml_equal.rb +4 -2
  68. data/spec/support/shared_examples_for_xml_requests.rb +18 -20
  69. data/spec/vendor_qbxml_spec.rb +111 -0
  70. metadata +113 -68
  71. data/lib/qbwc_requests/qbwc/ordered_fields.rb +0 -35
  72. data/lib/qbwc_requests/qbwc/qbwc.rb +0 -2
  73. data/lib/qbwc_requests/qbwc/request/base.rb +0 -77
  74. data/lib/qbwc_requests/qbwc/request/v07/bill.rb +0 -9
  75. data/lib/qbwc_requests/qbwc/request/v07/customer.rb +0 -29
  76. data/lib/qbwc_requests/qbwc/request/v07/general_detail_report.rb +0 -11
  77. data/lib/qbwc_requests/qbwc/request/v07/item.rb +0 -11
  78. data/lib/qbwc_requests/qbwc/request/v07/job_report.rb +0 -3
  79. data/lib/qbwc_requests/qbwc/request/v07/vendor.rb +0 -31
  80. data/lib/qbwc_requests/qbwc/request/v07/vendor_address.rb +0 -17
  81. data/spec/qbwc/request/base_spec.rb +0 -61
  82. data/spec/qbwc/request/v07/account_spec.rb +0 -32
  83. data/spec/qbwc/request/v07/customer_spec.rb +0 -32
  84. data/spec/qbwc/request/v07/general_detail_report_spec.rb +0 -7
  85. data/spec/qbwc/request/v07/item_spec.rb +0 -7
  86. data/spec/qbwc/request/v07/job_report_spec.rb +0 -7
  87. data/spec/qbwc/request/v07/vendor_spec.rb +0 -31
  88. data/spec/qbwc/request/xml_actions_spec.rb +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c63cbac1d987efa9d56e8e33cb66891d3ff6e06
4
- data.tar.gz: 3b4fba0e3fc2e5937c97dbae9278411007e71705
3
+ metadata.gz: 55e98a7c49505aa0fe9b0fac41e7073849a55636
4
+ data.tar.gz: d272895bce72dfa14c73e32040ffc40773b59658
5
5
  SHA512:
6
- metadata.gz: eafc791de78e5d6cce44843b6b5636fba7f47d4447111dc303206378609cd4b47389a534f1a193fa5eb6aa0169f61acd379784051b76ce1e78cc8f06995f3fe8
7
- data.tar.gz: 1e52e9188decebbbab7ec7d77cac097306fd31e6c3ebd44aaf18da894cda85c762100d3fcac6d95fc1d4f71e11843558c4757bc215dce70f1690d78ef577bcff
6
+ metadata.gz: 10dc09cfdeac01e7f944bd673e54f73dc381ba63b74a8fcf6a3790ed007e9063f269e29914ad4448780669431e19a99c97e26278ea2ef02f60d9c05b41b26dc3
7
+ data.tar.gz: 2d30beb012534d3fe8ad7f511636315ac7f809ab6e1921bcf239575b1aa9f4172339022d7ab6e4d297a3454df1522a4260762c1a7a4743db67dc8d86e979a0a1
data/README.md CHANGED
@@ -3,6 +3,8 @@
3
3
  With qbwc_requests you have an easy way to create Qbxml requests.
4
4
 
5
5
  [![Build Status](https://semaphoreci.com/api/v1/projects/c357ba42-3d3e-4061-985e-6c3c9c68a9b4/557601/badge.svg)](https://semaphoreci.com/apotema/qbwc_requests)
6
+ [![Code Climate](https://codeclimate.com/github/apotema/qbwc_requests/badges/gpa.svg)](https://codeclimate.com/github/apotema/qbwc_requests)
7
+ [![Test Coverage](https://codeclimate.com/github/apotema/qbwc_requests/badges/coverage.svg)](https://codeclimate.com/github/apotema/qbwc_requests/coverage)
6
8
 
7
9
  ## Installation
8
10
 
@@ -29,7 +31,7 @@ Or install it yourself as:
29
31
  result
30
32
 
31
33
  ```xml
32
- <?xml version='1.0' encoding='utf-8'?>
34
+ <?xml version="1.0" encoding="ISO-8859-1"?>
33
35
  <?qbxml version="7.0"?>
34
36
  <QBXML>
35
37
  <QBXMLMsgsRq onError="stopOnError">
@@ -51,7 +53,7 @@ That will create an Account query for the qbxml version 7.0
51
53
  result
52
54
 
53
55
  ```xml
54
- <?xml version='1.0' encoding='utf-8'?>
56
+ <?xml version="1.0" encoding="ISO-8859-1"?>
55
57
  <?qbxml version="7.0"?>
56
58
  <QBXML>
57
59
  <QBXMLMsgsRq onError="stopOnError">
@@ -1,7 +1,7 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module Account
3
3
  module V07
4
- class Account < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
6
  field :name
7
7
 
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module Account
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,76 @@
1
+ module QbwcRequests
2
+ class Base
3
+
4
+ include QbwcRequests::OrderedFields
5
+ include QbwcRequests::XmlActions
6
+
7
+ def to_xml request_id
8
+ self.valid? ? xml(request_id, self.class.name.demodulize) : self
9
+ end
10
+
11
+ def initialize(attributes = {})
12
+ @attributes = compact(attributes)
13
+ @attributes.each do |name, value|
14
+ self.instance_variable_set("@#{name}", value) if value.present?
15
+ end
16
+ end
17
+
18
+ def self.qbxml hash
19
+ Qbxml.new(:qb, "#{version.to_i}.0").to_qbxml(hash)
20
+ end
21
+
22
+ def class_name
23
+ self.class.underscore(self.class.name.split("::")[1].gsub("Qbxml",""))
24
+ end
25
+
26
+ def self.version
27
+ self.name.split("::")[2].gsub("V","")
28
+ end
29
+
30
+ def persisted?
31
+ false
32
+ end
33
+
34
+ private
35
+
36
+ def self.underscore string
37
+ string.gsub(/::/, '/').
38
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
39
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
40
+ tr("-", "_").
41
+ downcase
42
+ end
43
+
44
+ def compact opts={}
45
+ # I pass two times to avoid {v: '1',k: {}}, gotta find a better algorithm (recursive)
46
+ return {} if opts.nil?
47
+ proc = Proc.new { |k, v| v.kind_of?(Hash) ? (v.delete_if(&proc); nil) : (v == nil || (v.respond_to?(:empty) && v.empty?)) };
48
+ hash = opts.delete_if(&proc)
49
+ hash.delete_if { |k, v| (v == nil || (v.respond_to?(:empty) && v.empty?)) }
50
+ end
51
+
52
+ def xml request_id, action
53
+ req = XmlActions.header
54
+ if action != "Query"
55
+ req['qbxml']['qbxml_msgs_rq']["#{class_name}_#{action}_rq"] = {"xml_attributes"=>
56
+ {"requestID"=>"#{request_id}"},
57
+ "#{class_name}_#{action}"=> self.ordered_fields
58
+ }
59
+ else
60
+ req['qbxml']= {
61
+ 'qbxml_msgs_rq' => {
62
+ "xml_attributes" => {
63
+ "onError"=>"stopOnError"
64
+ },
65
+ "#{class_name}_query_rq" => {
66
+ "xml_attributes" => {
67
+ "requestID" => "#{request_id}"}
68
+ }.merge(self.ordered_fields)
69
+ }
70
+ }
71
+ end
72
+ self.class.qbxml(req)
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,11 @@
1
+ module QbwcRequests
2
+ module Bill
3
+ module V07
4
+ class Add < QbwcRequests::Base
5
+
6
+ ref_to :vendor, 41
7
+
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module Bill
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,39 @@
1
+ module QbwcRequests
2
+ module Customer
3
+ module V07
4
+ class Add < QbwcRequests::Base
5
+
6
+ field :name
7
+ field :is_active
8
+ ref_to :parent, 1000
9
+ field :company_name
10
+ field :salutation
11
+ field :first_name
12
+ field :middle_name
13
+ field :last_name
14
+ field :bill_address
15
+ field :ship_address
16
+ field :phone
17
+ field :alt_phone
18
+ field :fax
19
+ field :email
20
+ field :contact
21
+ field :alt_contact
22
+
23
+ validates :name, presence: true, length: { maximum: 41 }
24
+ validates :company_name, length: { maximum: 41 }
25
+ validates :salutation, length: { maximum: 15 }
26
+ validates :first_name, length: { maximum: 25 }
27
+ validates :middle_name, length: { maximum: 5 }
28
+ validates :last_name, length: { maximum: 25 }
29
+ validates :phone, length: { maximum: 21 }
30
+ validates :alt_phone, length: { maximum: 21 }
31
+ validates :fax, length: { maximum: 21 }
32
+ validates :email, length: { maximum: 1023 }
33
+ validates :contact, length: { maximum: 41 }
34
+ validates :alt_contact, length: { maximum: 41 }
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module Customer
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,13 +1,14 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module Estimate
3
3
  module V07
4
- class Estimate < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
- field :customer_ref
6
+ ref_to :customer, 209
7
7
  field :estimate_line_add
8
8
 
9
9
  validates :customer_ref, presence: true
10
10
  validates :estimate_line_add, presence: true
11
+
11
12
  end
12
13
  end
13
14
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module Estimate
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,32 @@
1
+ module QbwcRequests
2
+ module Factory
3
+
4
+ class Instantiator
5
+
6
+ def initialize module_name, klass
7
+ @module_name = module_name
8
+ @klass = klass
9
+ end
10
+
11
+ def factory params = {}, version = nil
12
+ final_version = version || QbwcRequests.QBXML_VERSION
13
+ object = Object.const_get("QbwcRequests::#{@module_name}::V#{final_version}::#{@klass}")
14
+ object.new(params)
15
+ end
16
+
17
+ def name
18
+ @module_name
19
+ end
20
+
21
+ end
22
+
23
+
24
+ def const_missing(name)
25
+ if [:Mod, :Add, :Query].include?(name)
26
+ Instantiator.new(self.name.gsub("Qbxml",""),name)
27
+ else
28
+ raise "NameError: uninitialized constant #{name}"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module GeneralDetailReport
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,14 +1,14 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module Invoice
3
3
  module V07
4
- class Invoice < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
- field :customer_ref
6
+ ref_to :customer, 209
7
7
  field :invoice_line_add
8
8
 
9
9
  validates :customer_ref, presence: true
10
10
  validates :invoice_line_add, presence: true
11
-
11
+
12
12
  end
13
13
  end
14
14
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module Invoice
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module Item
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,14 +1,15 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module ItemDiscount
3
3
  module V07
4
- class ItemDiscount < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
6
  field :name
7
7
  field :is_active
8
- field :account_ref
8
+ ref_to :account, 159
9
9
  field :discount_rate
10
10
 
11
11
  validates :name, presence: true
12
+
12
13
  end
13
14
  end
14
15
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module ItemDiscount
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,13 +1,14 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module ItemGroup
3
3
  module V07
4
- class ItemGroup < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
6
  field :name
7
7
  field :is_active
8
8
  field :item_desc
9
9
 
10
10
  validates :name, presence: true
11
+
11
12
  end
12
13
  end
13
14
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module ItemGroup
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,14 +1,15 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module ItemNonInventory
3
3
  module V07
4
- class ItemNonInventory < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
6
  field :name
7
7
  field :is_active
8
8
  field :pricetype
9
- field :parent_ref
9
+ ref_to :parent, 1000
10
10
 
11
11
  validates :name, presence: true
12
+
12
13
  end
13
14
  end
14
15
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module ItemNonInventory
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,7 +1,7 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module ItemOtherCharge
3
3
  module V07
4
- class ItemOtherCharge < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
6
  field :name
7
7
  field :is_active
@@ -10,6 +10,7 @@ module Qbwc
10
10
 
11
11
  validates :sales_or_purchase, presence: true
12
12
  validates :name, presence: true, length: { maximum: 41 }
13
+
13
14
  end
14
15
  end
15
16
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module ItemOtherCharge
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,13 +1,14 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module ItemPayment
3
3
  module V07
4
- class ItemPayment < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
6
  field :name
7
7
  field :is_active
8
8
  field :item_desc
9
9
 
10
10
  validates :name, presence: true
11
+
11
12
  end
12
13
  end
13
14
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module ItemPayment
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,7 +1,7 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module ItemService
3
3
  module V07
4
- class ItemService < Qbwc::Request::Base
4
+ class Add < QbwcRequests::Base
5
5
 
6
6
  field :name
7
7
  field :is_active
@@ -9,6 +9,7 @@ module Qbwc
9
9
  field :sales_or_purchase
10
10
 
11
11
  validates :name, presence: true
12
+
12
13
  end
13
14
  end
14
15
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module ItemService
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,14 +1,15 @@
1
- module Qbwc
2
- module Request
1
+ module QbwcRequests
2
+ module ItemSubtotal
3
3
  module V07
4
- class ItemSubtotal < Qbwc::Request::Base
5
-
4
+ class Add < QbwcRequests::Base
5
+
6
6
  field :name
7
7
  field :is_active
8
8
  field :item_desc
9
9
  field :bar_code
10
10
 
11
11
  validates :name, presence: true
12
+
12
13
  end
13
14
  end
14
15
  end
@@ -0,0 +1,9 @@
1
+ module QbwcRequests
2
+ module ItemSubtotal
3
+ module V07
4
+ class Query < QbwcRequests::Base
5
+ field :max_returned
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,81 @@
1
+ module QbwcRequests
2
+ module OrderedFields
3
+ module ClassMethods
4
+ def field attribute_name
5
+ @attr_order ||= Set.new
6
+ @attr_order << attribute_name
7
+ attr_accessor attribute_name
8
+ end
9
+ def has_one attribute_name, klass
10
+ @attr_order ||= Set.new
11
+ @attr_order << attribute_name
12
+ attr_accessor attribute_name
13
+ validates_each attribute_name do |record, attribute, value|
14
+ if !value.blank? and value.class != klass
15
+ record.errors.add(attribute, "must be of type #{klass}")
16
+ end
17
+ end
18
+ end
19
+ def ref_to attribute_prefix, name_length
20
+ attribute_name = "#{attribute_prefix}_ref".to_sym
21
+ @attr_order ||= Set.new
22
+ @attr_order << attribute_name
23
+ attr_accessor attribute_name
24
+ validates_each attribute_name do |record, attribute, value|
25
+ if value.present?
26
+ if value.is_a?(Hash)
27
+ if !(value[:list_id].present? ^ value[:full_name].present?)
28
+ record.errors.add(attribute, "Must have list_id or full_name")
29
+ elsif value.fetch(:full_name, "").length > name_length
30
+ record.errors.add(attribute, "- maximum 'full name' length is: #{name_length}")
31
+ end
32
+ else
33
+ record.errors.add(attribute, "Must have the format {list_id: 'value'} or {full_name: 'value'}")
34
+ end
35
+ end
36
+ end
37
+ end
38
+ def attr_order
39
+ @attr_order
40
+ end
41
+ end
42
+
43
+ class SubModelsValidator < ActiveModel::Validator
44
+ def validate record
45
+ return true if record.class.attr_order.blank?
46
+ for field in record.class.attr_order
47
+ value = record.send(field)
48
+ if value.respond_to?(:valid?) and value.invalid?
49
+ for error in value.errors
50
+ record.errors.add("#{field}##{error}", value.errors.messages[error] )
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def self.included(base)
58
+ base.extend(ActiveModel::Naming)
59
+ base.include(ActiveModel::Validations)
60
+ base.include(ActiveModel::Conversion)
61
+ base.extend(ClassMethods)
62
+ base.validates_with(SubModelsValidator)
63
+ end
64
+
65
+ def ordered_fields
66
+ return {} if self.class.attr_order.blank?
67
+ new_hash = {}
68
+ for attribute in self.class.attr_order
69
+ value = send(attribute)
70
+ if value.present?
71
+ if value.respond_to?(:ordered_fields)
72
+ new_hash[attribute] = value.ordered_fields
73
+ else
74
+ new_hash[attribute] = value
75
+ end
76
+ end
77
+ end
78
+ new_hash
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,33 @@
1
+ module QbwcRequests
2
+ module PurchaseOrder
3
+ module V07
4
+ class Add < QbwcRequests::Base
5
+
6
+ ref_to :vendor, 41
7
+ ref_to :class, 159
8
+ ref_to :ship_to_entity, 209
9
+ ref_to :template, 31
10
+ field :txn_date
11
+ field :ref_number
12
+ field :vendor_address
13
+ field :ship_address
14
+ ref_to :terms, 31
15
+ field :due_date
16
+ field :expected_date
17
+ ref_to :ship_method, 15
18
+ field :FOB
19
+ field :memo
20
+ field :vendor_msg
21
+ field :is_to_be_printed
22
+ field :is_to_be_emailed
23
+ field :is_tax_included
24
+ ref_to :sales_tax_code, 3
25
+ field :other1
26
+ field :other2
27
+ field :purchase_order_line_add
28
+ field :purchase_order_line_group_add
29
+
30
+ end
31
+ end
32
+ end
33
+ end