fishbowl 0.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +9 -4
  4. data/Gemfile +9 -2
  5. data/Guardfile +13 -0
  6. data/README.md +25 -5
  7. data/fishbowl.gemspec +5 -5
  8. data/lib/fishbowl/configuration.rb +9 -0
  9. data/lib/fishbowl/connection.rb +100 -0
  10. data/lib/fishbowl/errors.rb +18 -8
  11. data/lib/fishbowl/ext.rb +15 -0
  12. data/lib/fishbowl/objects/account.rb +8 -12
  13. data/lib/fishbowl/objects/address.rb +86 -0
  14. data/lib/fishbowl/objects/base_object.rb +42 -9
  15. data/lib/fishbowl/objects/carrier.rb +15 -0
  16. data/lib/fishbowl/objects/carton.rb +54 -0
  17. data/lib/fishbowl/objects/uom.rb +47 -0
  18. data/lib/fishbowl/objects/user.rb +15 -0
  19. data/lib/fishbowl/objects.rb +5 -0
  20. data/lib/fishbowl/requests/add_inventory.rb +34 -0
  21. data/lib/fishbowl/requests/add_sales_order_item.rb +42 -0
  22. data/lib/fishbowl/requests/adjust_inventory.rb +28 -0
  23. data/lib/fishbowl/requests/get_account_balance.rb +15 -0
  24. data/lib/fishbowl/requests/get_account_list.rb +13 -0
  25. data/lib/fishbowl/requests/get_carrier_list.rb +14 -0
  26. data/lib/fishbowl/requests/get_customer_list.rb +12 -0
  27. data/lib/fishbowl/requests/get_customer_name_list.rb +12 -0
  28. data/lib/fishbowl/requests/get_export_list.rb +12 -0
  29. data/lib/fishbowl/requests/get_import_list.rb +12 -0
  30. data/lib/fishbowl/requests/get_location_group_list.rb +12 -0
  31. data/lib/fishbowl/requests/get_location_list.rb +12 -0
  32. data/lib/fishbowl/requests/get_product.rb +18 -0
  33. data/lib/fishbowl/requests/get_product_price.rb +21 -0
  34. data/lib/fishbowl/requests/get_uom_list.rb +12 -0
  35. data/lib/fishbowl/requests/get_vendor_list.rb +12 -0
  36. data/lib/fishbowl/requests/get_vendor_name_list.rb +12 -0
  37. data/lib/fishbowl/requests/get_work_order_list.rb +12 -0
  38. data/lib/fishbowl/requests/inventory_quantity.rb +17 -0
  39. data/lib/fishbowl/requests/load_sales_order.rb +21 -0
  40. data/lib/fishbowl/requests/make_payment.rb +32 -0
  41. data/lib/fishbowl/requests/save_sales_order.rb +86 -0
  42. data/lib/fishbowl/requests/total_inventory.rb +18 -0
  43. data/lib/fishbowl/requests/void_sales_order.rb +18 -0
  44. data/lib/fishbowl/requests.rb +5 -0
  45. data/lib/fishbowl/version.rb +1 -1
  46. data/lib/fishbowl.rb +12 -95
  47. data/lib/status_codes.yml +183 -0
  48. data/spec/connection_spec.rb +99 -99
  49. data/spec/errors_spec.rb +11 -9
  50. data/spec/examples/account.xml +6 -0
  51. data/spec/examples/address.xml +30 -0
  52. data/spec/examples/carrier.xml +3 -0
  53. data/spec/examples/carton.xml +93 -0
  54. data/spec/examples/contact_information.xml +5 -0
  55. data/spec/examples/contacts.xml +7 -0
  56. data/spec/examples/credit_card.xml +10 -0
  57. data/spec/examples/customer.xml +54 -0
  58. data/spec/examples/location.xml +14 -0
  59. data/spec/examples/location_group.xml +5 -0
  60. data/spec/examples/location_group_string.xml +1 -0
  61. data/spec/examples/order_history.xml +8 -0
  62. data/spec/examples/part.xml +105 -0
  63. data/spec/examples/payment.xml +6 -0
  64. data/spec/examples/pick.xml +265 -0
  65. data/spec/examples/pick_item.xml +236 -0
  66. data/spec/examples/product.xml +159 -0
  67. data/spec/examples/purchase_order.xml +53 -0
  68. data/spec/examples/receipt.xml +146 -0
  69. data/spec/examples/report.xml +10 -0
  70. data/spec/examples/report_tree.xml +7 -0
  71. data/spec/examples/sales_order.xml +47 -0
  72. data/spec/examples/sales_order_item.xml +32 -0
  73. data/spec/examples/shipping.xml +127 -0
  74. data/spec/examples/tag.xml +28 -0
  75. data/spec/examples/tax_rate.xml +10 -0
  76. data/spec/examples/tracking.xml +14 -0
  77. data/spec/examples/tracking_item.xml +12 -0
  78. data/spec/examples/transfer_order.xml +257 -0
  79. data/spec/examples/transfer_order_item.xml +147 -0
  80. data/spec/examples/uom.xml +26 -0
  81. data/spec/examples/uom_conversion.xml +8 -0
  82. data/spec/examples/user.xml +8 -0
  83. data/spec/examples/vendor.xml +19 -0
  84. data/spec/examples/vendor_part_number.xml +3 -0
  85. data/spec/examples/work_order.xml +228 -0
  86. data/spec/examples/work_order_item.xml +172 -0
  87. data/spec/objects/account_spec.rb +33 -27
  88. data/spec/objects/address_information_spec.rb +18 -0
  89. data/spec/objects/address_spec.rb +36 -0
  90. data/spec/objects/base_object_spec.rb +67 -23
  91. data/spec/objects/carrier_spec.rb +15 -0
  92. data/spec/objects/carton_spec.rb +23 -0
  93. data/spec/objects/country_spec.rb +16 -0
  94. data/spec/objects/shipping_item_spec.rb +21 -0
  95. data/spec/objects/state_spec.rb +17 -0
  96. data/spec/objects/uom_conversion_spec.rb +20 -0
  97. data/spec/objects/uom_spec.rb +20 -0
  98. data/spec/objects/user_spec.rb +20 -0
  99. data/spec/requests/add_inventory_spec.rb +79 -0
  100. data/spec/requests/add_sales_order_item_spec.rb +85 -0
  101. data/spec/requests/adjust_inventory_spec.rb +62 -0
  102. data/spec/requests/calculate_sales_order_spec.rb +48 -0
  103. data/spec/requests/close_short_sales_order_spec.rb +45 -0
  104. data/spec/requests/cycle_count_spec.rb +49 -0
  105. data/spec/requests/delete_sales_order_spec.rb +45 -0
  106. data/spec/requests/export_spec.rb +45 -0
  107. data/spec/requests/get_account_balance_spec.rb +52 -0
  108. data/spec/requests/get_account_list_spec.rb +51 -0
  109. data/spec/requests/get_carrier_list_spec.rb +54 -0
  110. data/spec/requests/get_customer_list_spec.rb +51 -0
  111. data/spec/requests/get_customer_name_list_spec.rb +45 -0
  112. data/spec/requests/get_customer_spec.rb +45 -0
  113. data/spec/requests/get_export_list_spec.rb +45 -0
  114. data/spec/requests/get_import_list_spec.rb +45 -0
  115. data/spec/requests/get_inventory_quantity_spec.rb +65 -0
  116. data/spec/requests/get_light_part_list_spec.rb +51 -0
  117. data/spec/requests/get_location_group_list_spec.rb +45 -0
  118. data/spec/requests/get_location_list_spec.rb +45 -0
  119. data/spec/requests/get_next_number_spec.rb +45 -0
  120. data/spec/requests/get_part_cost_spec.rb +45 -0
  121. data/spec/requests/get_part_information_spec.rb +45 -0
  122. data/spec/requests/get_part_list_spec.rb +65 -0
  123. data/spec/requests/get_pick_spec.rb +45 -0
  124. data/spec/requests/get_product_information_spec.rb +46 -0
  125. data/spec/requests/get_purchase_order_list_spec.rb +45 -0
  126. data/spec/requests/get_receipt_spec.rb +49 -0
  127. data/spec/requests/get_receiving_list_spec.rb +49 -0
  128. data/spec/requests/get_sales_order_list_spec.rb +49 -0
  129. data/spec/requests/get_ship_list_spec.rb +49 -0
  130. data/spec/requests/get_ship_now_list_spec.rb +48 -0
  131. data/spec/requests/get_shipment_spec.rb +45 -0
  132. data/spec/requests/get_system_property_spec.rb +45 -0
  133. data/spec/requests/get_total_inventory_spec.rb +46 -0
  134. data/spec/requests/get_transfer_order_list_spec.rb +45 -0
  135. data/spec/requests/get_uom_list_spec.rb +45 -0
  136. data/spec/requests/get_user_property_spec.rb +45 -0
  137. data/spec/requests/get_vendor_list_spec.rb +45 -0
  138. data/spec/requests/get_vendor_name_list_spec.rb +45 -0
  139. data/spec/requests/get_vendor_spec.rb +48 -0
  140. data/spec/requests/get_work_order_list_spec.rb +45 -0
  141. data/spec/requests/get_work_order_spec.rb +45 -0
  142. data/spec/requests/import_spec.rb +49 -0
  143. data/spec/requests/issues_sales_order_spec.rb +45 -0
  144. data/spec/requests/load_sales_order_spec.rb +45 -0
  145. data/spec/requests/load_transfer_order_spec.rb +45 -0
  146. data/spec/requests/location_query_spec.rb +49 -0
  147. data/spec/requests/make_payment_spec.rb +50 -0
  148. data/spec/requests/move_spec.rb +49 -0
  149. data/spec/requests/part_query_spec.rb +46 -0
  150. data/spec/requests/pick_query_spec.rb +49 -0
  151. data/spec/requests/print_report_spec.rb +48 -0
  152. data/spec/requests/product_query_spec.rb +46 -0
  153. data/spec/requests/quick_ship_spec.rb +45 -0
  154. data/spec/requests/quickbooks_export_spec.rb +43 -0
  155. data/spec/requests/save_customer_spec.rb +48 -0
  156. data/spec/requests/save_discount_spec.rb +48 -0
  157. data/spec/requests/save_pick_spec.rb +48 -0
  158. data/spec/requests/save_purchase_order_spec.rb +48 -0
  159. data/spec/requests/save_receipt_spec.rb +48 -0
  160. data/spec/requests/save_report_spec.rb +49 -0
  161. data/spec/requests/save_sales_order_spec.rb +48 -0
  162. data/spec/requests/save_shipment_spec.rb +48 -0
  163. data/spec/requests/save_tax_rate_spec.rb +48 -0
  164. data/spec/requests/save_transfer_order_spec.rb +48 -0
  165. data/spec/requests/save_upc_spec.rb +48 -0
  166. data/spec/requests/save_vendor_spec.rb +48 -0
  167. data/spec/requests/save_work_order_spec.rb +48 -0
  168. data/spec/requests/set_default_part_location_spec.rb +48 -0
  169. data/spec/requests/set_system_property_spec.rb +48 -0
  170. data/spec/requests/set_user_property_spec.rb +48 -0
  171. data/spec/requests/ship_spec.rb +48 -0
  172. data/spec/requests/void_sales_order_spec.rb +43 -0
  173. data/spec/spec_helper.rb +48 -16
  174. data/spec/support/examples_loader.rb +5 -0
  175. data/spec/support/response_mocks.rb +27 -0
  176. metadata +304 -35
  177. data/spec/support/fake_login.rb +0 -15
@@ -0,0 +1,42 @@
1
+ module Fishbowl::Requests
2
+ def self.add_sales_order_item(options = {})
3
+ options = options.symbolize_keys
4
+
5
+ %w{order_number id product_number sales_order_id description taxable
6
+ quantity product_price total_price uom_code item_type status
7
+ quickbooks_class_name new_item_flag}.each do |required_field|
8
+ raise ArgumentError if options[required_field.to_sym].nil?
9
+ end
10
+
11
+ request = format_add_sales_order_item_request(options)
12
+ Fishbowl::Objects::BaseObject.new.send_request(request, 'AddSOItemRs')
13
+ end
14
+
15
+ private
16
+
17
+ def self.format_add_sales_order_item_request(options)
18
+ Nokogiri::XML::Builder.new do |xml|
19
+ xml.request {
20
+ xml.AddSOItemRq {
21
+ xml.OrderNum options[:order_number]
22
+ xml.SalesOrderItem {
23
+ xml.ID options[:id]
24
+ xml.ProductNumber options[:product_number]
25
+ xml.SOID options[:sales_order_id]
26
+ xml.Description options[:description]
27
+ xml.Taxable options[:taxable]
28
+ xml.Quantity options[:quantity]
29
+ xml.ProductPrice options[:product_price]
30
+ xml.TotalPrice options[:total_price]
31
+ xml.UOMCode options[:uom_code]
32
+ xml.ItemType options[:item_type]
33
+ xml.Status options[:status]
34
+ xml.QuickBooksClassName options[:quickbooks_class_name]
35
+ xml.NewItemFlag options[:new_item_flag]
36
+ }
37
+ }
38
+ }
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,28 @@
1
+ module Fishbowl::Requests
2
+ def self.adjust_inventory(options = {})
3
+ options = options.symbolize_keys
4
+
5
+ %w{tag_number quantity}.each do |required_field|
6
+ raise ArgumentError if options[required_field.to_sym].nil?
7
+ end
8
+
9
+ raise ArgumentError unless options[:tracking].nil? || options[:tracking].is_a?(Fishbowl::Object::Tracking)
10
+
11
+ request = format_adjust_inventory_request(options)
12
+ Fishbowl::Objects::BaseObject.new.send_request(request, 'AdjustInventoryRs')
13
+ end
14
+
15
+ private
16
+
17
+ def self.format_adjust_inventory_request(options)
18
+ Nokogiri::XML::Builder.new do |xml|
19
+ xml.request {
20
+ xml.AdjustInventoryRq {
21
+ xml.TagNum options[:tag_number]
22
+ xml.Quantity options[:quantity]
23
+ xml.Tracking options[:tracking] unless options[:tracking].nil?
24
+ }
25
+ }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ module Fishbowl::Requests
2
+ def self.get_account_balance(account_name)
3
+ builder = Nokogiri::XML::Builder.new do |xml|
4
+ xml.request {
5
+ xml.GetAccountBalanceRq {
6
+ xml.Account (account.is_a?(Account) ? account.name : account)
7
+ }
8
+ }
9
+ end
10
+
11
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request(builder, "GetAccountBalanceRs")
12
+
13
+ response.xpath("//Account/Balance").first.inner_text
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Fishbowl::Requests
2
+ def self.get_account_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('GetAccountListRq', 'GetAccountListRs')
4
+
5
+ results = []
6
+
7
+ response.xpath("//Account").each do |account_xml|
8
+ results << Account.new(account_xml)
9
+ end
10
+
11
+ results
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Fishbowl::Requests
2
+ def self.get_carrier_list
3
+ puts "getting carriers"
4
+ code, response = Fishbowl::Objects::BaseObject.new.send_request('CarrierListRq', 'FbiMsgsRs/CarrierListRs')
5
+
6
+ results = []
7
+
8
+ response.xpath("//Carriers/Name").each do |carrier_xml|
9
+ results << Fishbowl::Objects::Carrier.new(carrier_xml)
10
+ end
11
+
12
+ results
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_customer_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('CustomerListRq', 'CustomerListRs')
4
+
5
+ results = []
6
+ response.xpath("//Customer").each do |customer_xml|
7
+ results << Fishbowl::Objects::Customer.new(customer_xml)
8
+ end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_customer_name_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('CustomerNameListRq', 'CustomerNameListRs')
4
+
5
+ results = []
6
+ response.xpath("//Customer/Name").each do |customer_xml|
7
+ results << customer_xml.inner_text
8
+ end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_export_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('ExportListRq', 'ExportListRs')
4
+
5
+ results = []
6
+ #response.xpath("//Customer/Name").each do |customer_xml|
7
+ # results << customer_xml.inner_text
8
+ #end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_import_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('ImportListRq', 'ImportListRs')
4
+
5
+ results = []
6
+ #response.xpath("//Customer/Name").each do |customer_xml|
7
+ # results << customer_xml.inner_text
8
+ #end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_location_group_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('LocationGroupRq', 'LocationGroupRs')
4
+
5
+ results = []
6
+ #response.xpath("//Customer/Name").each do |customer_xml|
7
+ # results << customer_xml.inner_text
8
+ #end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_location_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('LocationListRq', 'LocationListRs')
4
+
5
+ results = []
6
+ #response.xpath("//Customer/Name").each do |customer_xml|
7
+ # results << customer_xml.inner_text
8
+ #end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ module Fishbowl::Requests
2
+ def self.get_product(product_number)
3
+ raise ArgumentError if product_number.nil?
4
+
5
+ builder = Nokogiri::XML::Builder.new do |xml|
6
+ xml.request {
7
+ xml.ProductGetRq {
8
+ xml.Number product_number
9
+ xml.GetImage false
10
+ }
11
+ }
12
+ end
13
+
14
+ code, response = Fishbowl::Objects::BaseObject.new.send_request(builder, "ProductGetRs")
15
+
16
+ response.xpath("//FbiXml/FbiMsgsRs/ProductGetRs/Product")
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ module Fishbowl::Requests
2
+ def self.get_product_price(options)
3
+ options.symbolize_keys
4
+
5
+ %w{product_number customer_name qauntity date}.each do |required_field|
6
+ raise ArgumentError if options[required_field.to_sym].nil?
7
+ end
8
+
9
+ builder = Nokogiri::XML::Builder.new do |xml|
10
+ xml.request {
11
+ xml.ProductPriceRq {
12
+ xml.ProductNumber
13
+ }
14
+ }
15
+ end
16
+
17
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request(builder, "GetAccountBalanceRs")
18
+
19
+ response.xpath("//Account/Balance").first.inner_text
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_uom_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('UOMRq', 'UOMRs')
4
+
5
+ results = []
6
+ response.xpath("//UOM").each do |uom_xml|
7
+ results << Fishbowl::Objects::UOM.new(uom_xml)
8
+ end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_location_group_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('VendorListRq', 'VendorListRs')
4
+
5
+ results = []
6
+ response.xpath("//Vendor").each do |vendor_xml|
7
+ results << Fishbowl::Objects::Vendor.new(vendor_xml)
8
+ end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_location_group_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('VendorNameListRq', 'VendorNameListRs')
4
+
5
+ results = []
6
+ #response.xpath("//Customer/Name").each do |customer_xml|
7
+ # results << customer_xml.inner_text
8
+ #end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_work_order_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('WorkOrderListRq', 'WorkOrderListRs')
4
+
5
+ results = []
6
+ response.xpath("//WO").each do |work_order_xml|
7
+ results << Fishbowl::Objects::WorkOrder.new(work_order_xml)
8
+ end
9
+
10
+ results
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module Fishbowl::Requests
2
+ def self.inventory_quantity(part_num)
3
+ raise ArgumentError if part_num.nil?
4
+
5
+ builder = Nokogiri::XML::Builder.new do |xml|
6
+ xml.request {
7
+ xml.InvQtyRq {
8
+ xml.PartNum part_num
9
+ }
10
+ }
11
+ end
12
+
13
+ code, response = Fishbowl::Objects::BaseObject.new.send_request(builder, "InvQtyRs")
14
+
15
+ response.xpath("//FbiXml/FbiMsgsRs/InvQtyRs")
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module Fishbowl::Requests
2
+ def self.load_sales_order(order_number)
3
+ raise Fishbowl::Errors.ArgumentError if order_number.nil?
4
+ request = load_order_request(order_number)
5
+ Fishbowl::Objects::BaseObject.new.send_request(request, 'LoadSORs')
6
+ end
7
+
8
+ private
9
+
10
+ def self.load_order_request(order_number)
11
+ Nokogiri::XML::Builder.new do |xml|
12
+ xml.request {
13
+ xml.LoadSORq {
14
+ xml.Number order_number.to_s
15
+ }
16
+ }
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,32 @@
1
+ module Fishbowl::Requests
2
+ def self.make_payment(options)
3
+ # options = options.symbolize_keys
4
+ #
5
+ %w{amount so_number payment_method}.each do |required_field|
6
+ raise ArgumentError if options[required_field.to_sym].nil?
7
+ end
8
+
9
+ request = format_payment(options)
10
+ Fishbowl::Objects::BaseObject.new.send_request(request, 'MakePaymentRs')
11
+ end
12
+
13
+ private
14
+
15
+ def self.format_payment(payment)
16
+ Nokogiri::XML::Builder.new do |xml|
17
+ xml.request {
18
+ xml.MakePaymentRq {
19
+ xml.Payment {
20
+ xml.Amount payment[:amount] unless payment[:amount].nil?
21
+ xml.SalesOrderNumber payment[:so_number] unless payment[:so_number].nil?
22
+ xml.PaymentDate payment[:payment_date] unless payment[:payment_date].nil?
23
+ xml.PaymentMethod payment[:payment_method] unless payment[:payment_method].nil?
24
+ xml.TransactionID payment[:transaction_id] unless payment[:transaction_id].nil?
25
+ }
26
+ }
27
+ }
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,86 @@
1
+ module Fishbowl::Requests
2
+ def self.save_sales_order(options)
3
+ # options = options.symbolize_keys
4
+ #
5
+ # %w{number salesman customer_name status
6
+ # items}.each do |required_field|
7
+ # raise ArgumentError if options[required_field.to_sym].nil?
8
+ # end
9
+
10
+ request = format_sales_order(options)
11
+ Fishbowl::Objects::BaseObject.new.send_request(request, 'SaveSORs')
12
+ end
13
+
14
+ private
15
+
16
+ def self.format_sales_order(sales_order)
17
+ Nokogiri::XML::Builder.new do |xml|
18
+ xml.request {
19
+ xml.SOSaveRq {
20
+ xml.SalesOrder {
21
+ xml.Number sales_order[:number] unless sales_order[:number].nil?
22
+ xml.Salesman sales_order[:salesman] unless sales_order[:salesman].nil?
23
+ xml.CustomerName sales_order[:customer_name] unless sales_order[:customer_name].nil?
24
+ xml.Status "10" if sales_order[:status].nil?
25
+ xml.Status sales_order[:status] unless sales_order[:status].nil?
26
+ xml.Carrier sales_order[:carrier] unless sales_order[:carrier].nil?
27
+ xml.PaymentTerms sales_order[:payment_terms] unless sales_order[:payment_terms].nil?
28
+ xml.CustomerPO sales_order[:customer_po] unless sales_order[:customer_po].nil?
29
+ xml.VendorPO sales_order[:vendor_po] unless sales_order[:vendor_po].nil?
30
+ xml.QuickBooksClassName sales_order[:quick_books_class_name] unless sales_order[:quick_books_class_name].nil?
31
+ xml.BillTo {
32
+ xml.Name sales_order[:bill_to][:name] unless sales_order[:bill_to][:name].nil?
33
+ xml.AddressField sales_order[:bill_to][:address] unless sales_order[:bill_to][:address].nil?
34
+ xml.City sales_order[:bill_to][:city] unless sales_order[:bill_to][:city].nil?
35
+ xml.Zip sales_order[:bill_to][:zip] unless sales_order[:bill_to][:zip].nil?
36
+ xml.Country sales_order[:bill_to][:country] unless sales_order[:bill_to][:country].nil?
37
+ xml.State sales_order[:bill_to][:state] unless sales_order[:bill_to][:state].nil?
38
+ }
39
+ xml.Ship {
40
+ xml.Name sales_order[:ship_to][:name] unless sales_order[:ship_to][:name].nil?
41
+ xml.AddressField sales_order[:ship_to][:address] unless sales_order[:ship_to][:address].nil?
42
+ xml.City sales_order[:ship_to][:city] unless sales_order[:ship_to][:city].nil?
43
+ xml.Zip sales_order[:ship_to][:zip] unless sales_order[:ship_to][:zip].nil?
44
+ xml.Country sales_order[:ship_to][:country] unless sales_order[:ship_to][:country].nil?
45
+ xml.State sales_order[:ship_to][:state] unless sales_order[:ship_to][:state].nil?
46
+ }
47
+ xml.CustomFields {
48
+ sales_order[:custom_fields].each do |field|
49
+ xml.CustomField {
50
+ xml.ID field[:id] unless field[:id].nil?
51
+ xml.Name field[:name] unless field[:name].nil?
52
+ xml.Type field[:type] unless field[:type].nil?
53
+ xml.Info field[:info] unless field[:info].nil?
54
+ xml.Description field[:description] unless field[:description].nil?
55
+ }
56
+ end
57
+ } unless sales_order[:custom_fields].nil?
58
+ xml.Items {
59
+ sales_order[:items].each do |item|
60
+ xml.SalesOrderItem {
61
+ xml.ID item[:id] unless item[:id].nil?
62
+ xml.ProductNumber item[:product_number] unless item[:product_number].nil?
63
+ xml.ProductPrice item[:product_price] unless item[:product_price].nil?
64
+ xml.TotalPrice item[:total_price] unless item[:total_price].nil?
65
+ xml.Quantity item[:quantity] unless item[:quantity].nil?
66
+ xml.UOMCode item[:uom_code] unless item[:uom_code].nil?
67
+ xml.Description item[:description] unless item[:description].nil?
68
+ xml.LineNumber item[:line_number] unless item[:line_number].nil?
69
+ xml.QuickBooksClassName item[:quick_books_class_name] unless item[:quick_books_class_name].nil?
70
+ xml.NewItemFlag "false"
71
+ xml.ItemType item[:item_type] || "10"
72
+ xml.Status "10"
73
+ xml.AdjustPercentage item[:adjust_percentage] unless item[:adjust_percentage].nil?
74
+ } unless sales_order[:items].nil?
75
+ end
76
+ }
77
+ }
78
+ xml.IssueFlag "false"
79
+ xml.IgnoreItems "false"
80
+ }
81
+ }
82
+ end
83
+
84
+ end
85
+
86
+ end
@@ -0,0 +1,18 @@
1
+ module Fishbowl::Requests
2
+ def self.total_inventory(part_num, location_group)
3
+ raise ArgumentError if part_num.nil?
4
+
5
+ builder = Nokogiri::XML::Builder.new do |xml|
6
+ xml.request {
7
+ xml.GetTotalInventoryRq {
8
+ xml.PartNumber part_num
9
+ xml.LocationGroup location_group
10
+ }
11
+ }
12
+ end
13
+
14
+ code, response = Fishbowl::Objects::BaseObject.new.send_request(builder, "GetTotalInventoryRs")
15
+
16
+ response.xpath("//FbiXml/FbiMsgsRs/GetTotalInventoryRs")
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Fishbowl::Requests
2
+ def self.void_sales_order(number)
3
+ request = format_add_sales_order_item_request(number.to_s)
4
+ Fishbowl::Objects::BaseObject.new.send_request(request, 'VoidSORs')
5
+ end
6
+
7
+ private
8
+
9
+ def self.format_add_sales_order_item_request(number)
10
+ Nokogiri::XML::Builder.new do |xml|
11
+ xml.request {
12
+ xml.VoidSORq {
13
+ xml.SONumber number
14
+ }
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ module Fishbowl; module Requests; end; end
2
+
3
+ Dir.glob(File.join(File.expand_path("../requests/", __FILE__), "**.rb")).each do |file|
4
+ require file
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Fishbowl # :nodoc:
2
- VERSION = "0.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
data/lib/fishbowl.rb CHANGED
@@ -4,107 +4,24 @@ require 'singleton'
4
4
 
5
5
  require 'nokogiri'
6
6
 
7
+ require 'fishbowl/ext'
8
+
7
9
  require 'fishbowl/version'
8
10
  require 'fishbowl/errors'
11
+ require 'fishbowl/requests'
9
12
  require 'fishbowl/objects'
13
+ require 'fishbowl/connection'
14
+ require 'fishbowl/configuration'
10
15
 
11
16
  module Fishbowl # :nodoc:
12
- class Connection
13
- include Singleton
14
-
15
- def self.connect(options = {})
16
- raise Fishbowl::Errors::MissingHost if options[:host].nil?
17
-
18
- @host = options[:host]
19
- @port = options[:port].nil? ? 28192 : options[:port]
20
-
21
- @connection = TCPSocket.new @host, @port
22
-
23
- self.instance
24
- end
25
-
26
- def self.login(options = {})
27
- raise Fishbowl::Errors::ConnectionNotEstablished if @connection.nil?
28
- raise Fishbowl::Errors::MissingUsername if options[:username].nil?
29
- raise Fishbowl::Errors::MissingPassword if options[:password].nil?
30
-
31
- @username, @password = options[:username], options[:password]
32
-
33
- Fishbowl::Objects::BaseObject.new.send_request(login_request, true)
34
-
35
- code, message, _ = get_response('LoginRs')
36
-
37
- Fishbowl::Errors.confirm_success_or_raise(code, message)
38
-
39
- self.instance
40
- end
41
-
42
- def self.host
43
- @host
44
- end
45
-
46
- def self.port
47
- @port
48
- end
49
-
50
- def self.username
51
- @username
52
- end
53
17
 
54
- def self.password
55
- @password
56
- end
57
-
58
- def self.send(request)
59
- write(request)
60
- end
61
-
62
- def self.close
63
- @connection.close
64
- @connection = nil
65
- end
66
-
67
- def self.get_response(expectation = 'FbiMsgRs')
68
- response = read
69
-
70
- status_code = response.xpath("//#{expectation}/@statusCode").first.value
71
- status_message = response.xpath("//#{expectation}/@statusMessage").first.value
72
-
73
- [status_code, status_message, response]
74
- end
75
-
76
- private
77
-
78
- def self.login_request
79
- Nokogiri::XML::Builder.new do |xml|
80
- xml.request {
81
- xml.LoginRq {
82
- xml.IAID "fishbowl-ruby"
83
- xml.IAName "Fishbowl Ruby Gem"
84
- xml.IADescription "Fishbowl Ruby Gem"
85
- xml.UserName @username
86
- xml.UserPassword encoded_password
87
- }
88
- }
89
- end
90
- end
91
-
92
- def self.encoded_password
93
- Base64.encode64(@password)
94
- end
95
-
96
- def self.write(request)
97
- body = request.to_xml
98
- size = [body.size].pack("L>")
99
-
100
- @connection.write(size)
101
- @connection.write(body)
102
- end
103
-
104
- def self.read
105
- length = @connection.recv(3).unpack('L>').join('').to_i
106
- Nokogiri::XML.parse(@connection.recv(length))
107
- end
18
+ class << self
19
+ attr_accessor :configuration
20
+ end
108
21
 
22
+ def self.configure
23
+ self.configuration ||= Configuration.new
24
+ yield(configuration)
109
25
  end
26
+
110
27
  end