fishbowl 0.0.1 → 1.0.2

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 (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