fishbowl 0.0.1 → 0.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 (77) hide show
  1. data/.travis.yml +9 -4
  2. data/Gemfile +10 -1
  3. data/Guardfile +13 -0
  4. data/lib/fishbowl.rb +13 -15
  5. data/lib/fishbowl/ext.rb +15 -0
  6. data/lib/fishbowl/objects.rb +5 -0
  7. data/lib/fishbowl/objects/account.rb +24 -2
  8. data/lib/fishbowl/objects/address.rb +86 -0
  9. data/lib/fishbowl/objects/base_object.rb +34 -5
  10. data/lib/fishbowl/objects/carrier.rb +15 -0
  11. data/lib/fishbowl/objects/carton.rb +54 -0
  12. data/lib/fishbowl/objects/uom.rb +47 -0
  13. data/lib/fishbowl/objects/user.rb +15 -0
  14. data/lib/fishbowl/requests.rb +6 -0
  15. data/lib/fishbowl/requests/add_inventory.rb +34 -0
  16. data/lib/fishbowl/requests/add_sales_order_item.rb +42 -0
  17. data/lib/fishbowl/requests/adjust_inventory.rb +28 -0
  18. data/lib/fishbowl/requests/get_carrier_list.rb +12 -0
  19. data/lib/fishbowl/version.rb +1 -1
  20. data/spec/examples/account.xml +6 -0
  21. data/spec/examples/address.xml +30 -0
  22. data/spec/examples/carrier.xml +3 -0
  23. data/spec/examples/carton.xml +93 -0
  24. data/spec/examples/contact_information.xml +5 -0
  25. data/spec/examples/contacts.xml +7 -0
  26. data/spec/examples/credit_card.xml +10 -0
  27. data/spec/examples/customer.xml +54 -0
  28. data/spec/examples/location.xml +14 -0
  29. data/spec/examples/location_group.xml +5 -0
  30. data/spec/examples/location_group_string.xml +1 -0
  31. data/spec/examples/order_history.xml +8 -0
  32. data/spec/examples/part.xml +105 -0
  33. data/spec/examples/payment.xml +6 -0
  34. data/spec/examples/pick.xml +265 -0
  35. data/spec/examples/pick_item.xml +236 -0
  36. data/spec/examples/product.xml +159 -0
  37. data/spec/examples/purchase_order.xml +53 -0
  38. data/spec/examples/receipt.xml +146 -0
  39. data/spec/examples/report.xml +10 -0
  40. data/spec/examples/report_tree.xml +7 -0
  41. data/spec/examples/sales_order.xml +47 -0
  42. data/spec/examples/sales_order_item.xml +32 -0
  43. data/spec/examples/shipping.xml +127 -0
  44. data/spec/examples/tag.xml +28 -0
  45. data/spec/examples/tax_rate.xml +10 -0
  46. data/spec/examples/tracking.xml +14 -0
  47. data/spec/examples/tracking_item.xml +12 -0
  48. data/spec/examples/transfer_order.xml +257 -0
  49. data/spec/examples/transfer_order_item.xml +147 -0
  50. data/spec/examples/uom.xml +26 -0
  51. data/spec/examples/uom_conversion.xml +8 -0
  52. data/spec/examples/user.xml +8 -0
  53. data/spec/examples/vendor.xml +19 -0
  54. data/spec/examples/vendor_part_number.xml +3 -0
  55. data/spec/examples/work_order.xml +228 -0
  56. data/spec/examples/work_order_item.xml +172 -0
  57. data/spec/objects/account_spec.rb +53 -6
  58. data/spec/objects/address_information_spec.rb +18 -0
  59. data/spec/objects/address_spec.rb +36 -0
  60. data/spec/objects/base_object_spec.rb +67 -23
  61. data/spec/objects/carrier_spec.rb +15 -0
  62. data/spec/objects/carton_spec.rb +23 -0
  63. data/spec/objects/country_spec.rb +16 -0
  64. data/spec/objects/shipping_item_spec.rb +21 -0
  65. data/spec/objects/state_spec.rb +17 -0
  66. data/spec/objects/uom_conversion_spec.rb +20 -0
  67. data/spec/objects/uom_spec.rb +20 -0
  68. data/spec/objects/user_spec.rb +20 -0
  69. data/spec/requests/add_inventory_spec.rb +79 -0
  70. data/spec/requests/add_sales_order_item_spec.rb +85 -0
  71. data/spec/requests/adjust_inventory_spec.rb +62 -0
  72. data/spec/requests/get_carrier_list_spec.rb +54 -0
  73. data/spec/spec_helper.rb +41 -11
  74. data/spec/support/examples_loader.rb +5 -0
  75. data/spec/support/response_mocks.rb +27 -0
  76. metadata +122 -6
  77. data/spec/support/fake_login.rb +0 -15
@@ -0,0 +1,15 @@
1
+ module Fishbowl::Objects
2
+ class User < BaseObject
3
+ attr_accessor :db_id, :user_name, :first_name, :last_name, :initials, :active
4
+
5
+ def self.attributes
6
+ %w{ID UserName FirstName LastName Initials Active}
7
+ end
8
+
9
+ def initialize(user_xml)
10
+ @xml = user_xml
11
+ parse_attributes
12
+ self
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ module Fishbowl; module Requests; end; end
2
+
3
+ require 'fishbowl/requests/add_inventory'
4
+ require 'fishbowl/requests/add_sales_order_item'
5
+ require 'fishbowl/requests/adjust_inventory'
6
+ require 'fishbowl/requests/get_carrier_list'
@@ -0,0 +1,34 @@
1
+ module Fishbowl::Requests
2
+ def self.add_inventory(options = {})
3
+ options = options.symbolize_keys
4
+
5
+ %w{part_number quantity uom_id cost location_tag_number tag_number}.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_add_inventory_request(options)
12
+ Fishbowl::Objects::BaseObject.new.send_request(request, 'AddInventoryRs')
13
+ end
14
+
15
+ private
16
+
17
+ def self.format_add_inventory_request(options)
18
+ Nokogiri::XML::Builder.new do |xml|
19
+ xml.request {
20
+ xml.AddInventoryRq {
21
+ xml.PartNum options[:part_number]
22
+ xml.Quantity options[:quantity]
23
+ xml.UOMID options[:uom_id]
24
+ xml.Cost options[:cost]
25
+ xml.Note options[:note] unless options[:note].nil?
26
+ xml.Tracking options[:tracking] unless options[:tracking].nil?
27
+ xml.LocationTagNum options[:location_tag_number]
28
+ xml.TagNum options[:tag_number]
29
+ }
30
+ }
31
+ end
32
+ end
33
+
34
+ end
@@ -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,12 @@
1
+ module Fishbowl::Requests
2
+ def self.get_carrier_list
3
+ _, _, response = Fishbowl::Objects::BaseObject.new.send_request('CarrierListRq', 'CarrierListRs')
4
+
5
+ results = []
6
+ response.xpath("//Carrier").each do |carrier_xml|
7
+ results << Fishbowl::Objects::Carrier.new(carrier_xml)
8
+ end
9
+
10
+ results
11
+ end
12
+ end
@@ -1,3 +1,3 @@
1
1
  module Fishbowl # :nodoc:
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,6 @@
1
+ <Account>
2
+ <Name>Cost Variance</Name>
3
+ <AccountingID>8000001B-1310422643</AccountingID>
4
+ <AccountType>12</AccountType>
5
+ <Balance>0</Balance>
6
+ </Account>
@@ -0,0 +1,30 @@
1
+ <Address>
2
+ <Temp-Account>
3
+ <Type>10</Type>
4
+ </Temp-Account>
5
+ <Name>Main Office</Name>
6
+ <Attn>Attn</Attn>
7
+ <Street>123 Neverland dr.</Street>
8
+ <City>Murray</City>
9
+ <Zip>84121</Zip>
10
+ <Default>true</Default>
11
+ <Residential>false</Residential>
12
+ <Type>Main Office</Type>
13
+ <State>
14
+ <Name>Utah</Name>
15
+ <Code>UT</Code>
16
+ <CountryID>2</CountryID>
17
+ </State>
18
+ <Country>
19
+ <Name>United States</Name>
20
+ <Code>US</Code>
21
+ </Country>
22
+ <AddressInformationList>
23
+ <AddressInformation>
24
+ <Name>Main Office</Name>
25
+ <Data>Address Data</Data>
26
+ <Default>true</Default>
27
+ <Type>Home</Type>
28
+ </AddressInformation>
29
+ </AddressInformationList>
30
+ </Address>
@@ -0,0 +1,3 @@
1
+ <Carrier>
2
+ <Name>Will Call</Name>
3
+ </Carrier>
@@ -0,0 +1,93 @@
1
+ <Carton>
2
+ <ID>64</ID>
3
+ <ShipID>63</ShipID>
4
+ <CartonNum>1</CartonNum>
5
+ <TrackingNum/>
6
+ <FreightWeight>1.2</FreightWeight>
7
+ <FreightAmount>0</FreightAmount>
8
+ <ShippingItems>
9
+ <ShippingItem>
10
+ <ShipItemID>169</ShipItemID>
11
+ <ProductNumber>B201</ProductNumber>
12
+ <ProductDescription>Heavy Duty Brake Cables</ProductDescription>
13
+ <QtyShipped>1</QtyShipped>
14
+ <UOM>
15
+ <UOMID>1</UOMID>
16
+ <Name>Each</Name>
17
+ <Code>ea</Code>
18
+ <Integral>true</Integral>
19
+ <Active>true</Active>
20
+ <Type>Count</Type>
21
+ <UOMConversions>
22
+ <UOMConversion>
23
+ <MainUOMID>1</MainUOMID>
24
+ <ToUOMID>17</ToUOMID>
25
+ <ToUOMCode>pr</ToUOMCode>
26
+ <ConversionMultiply>1.0</ConversionMultiply>
27
+ <ConversionFactor>2.0</ConversionFactor>
28
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
29
+ </UOMConversion>
30
+ <UOMConversion>
31
+ <MainUOMID>1</MainUOMID>
32
+ <ToUOMID>18</ToUOMID>
33
+ <ToUOMCode>pk</ToUOMCode>
34
+ <ConversionMultiply>1.0</ConversionMultiply>
35
+ <ConversionFactor>20.0</ConversionFactor>
36
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
37
+ </UOMConversion>
38
+ </UOMConversions>
39
+ </UOM>
40
+ <Cost>0</Cost>
41
+ <SKU/>
42
+ <UPC/>
43
+ <OrderItemID>160</OrderItemID>
44
+ <OrderLineItem>1</OrderLineItem>
45
+ <CartonName>1</CartonName>
46
+ <CartonID>64</CartonID>
47
+ <TagNum>694</TagNum>
48
+ <Weight>1.2</Weight>
49
+ <WeightUOM>
50
+ <UOM>
51
+ <UOMID>3</UOMID>
52
+ <Name>Pound</Name>
53
+ <Code>lbs</Code>
54
+ <Integral>false</Integral>
55
+ <Active>true</Active>
56
+ <Type>Weight</Type>
57
+ <UOMConversions>
58
+ <UOMConversion>
59
+ <MainUOMID>3</MainUOMID>
60
+ <ToUOMID>8</ToUOMID>
61
+ <ToUOMCode>kg</ToUOMCode>
62
+ <ConversionMultiply>1.0</ConversionMultiply>
63
+ <ConversionFactor>2.2046000957489014</ConversionFactor>
64
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
65
+ </UOMConversion>
66
+ </UOMConversions>
67
+ </UOM>
68
+ </WeightUOM>
69
+ <DisplayWeight>1.2</DisplayWeight>
70
+ <DisplayWeightUOM>
71
+ <UOM>
72
+ <UOMID>3</UOMID>
73
+ <Name>Pound</Name>
74
+ <Code>lbs</Code>
75
+ <Integral>false</Integral>
76
+ <Active>true</Active>
77
+ <Type>Weight</Type>
78
+ <UOMConversions>
79
+ <UOMConversion>
80
+ <MainUOMID>3</MainUOMID>
81
+ <ToUOMID>8</ToUOMID>
82
+ <ToUOMCode>kg</ToUOMCode>
83
+ <ConversionMultiply>1.0</ConversionMultiply>
84
+ <ConversionFactor>2.2046000957489014</ConversionFactor>
85
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
86
+ </UOMConversion>
87
+ </UOMConversions>
88
+ </UOM>
89
+ </DisplayWeightUOM>
90
+ <Tracking/>
91
+ </ShippingItem>
92
+ </ShippingItems>
93
+ </Carton>
@@ -0,0 +1,5 @@
1
+ <ContactInformation>
2
+ <ContactName>Josh Anderson</ContactName>
3
+ <Type>Web</Type>
4
+ <Data>http://www.joshanderson.com</Data>
5
+ </ContactInformation>
@@ -0,0 +1,7 @@
1
+ <Contacts>
2
+ <ContactInformation>
3
+ <ContactName>Josh Anderson</ContactName>
4
+ <Type>Web</Type>
5
+ <Data>http://www.joshanderson.com</Data>
6
+ </ContactInformation>
7
+ </Contacts>
@@ -0,0 +1,10 @@
1
+ <CreditCard>
2
+ <CardNumber>411111111111111</CardNumber>
3
+ <CardExpMonth>02</CardExpMonth>
4
+ <CardExpYear>19</CardExpYear>
5
+ <SecurityCode>523</SecurityCode>
6
+ <NameOnCard>John Doe</NameOnCard>
7
+ <CardAddress>123 S Riverdale Road</CardAddress>
8
+ <CardZipCode>84172</CardZipCode>
9
+ <CardCountryCode>US</CardCountryCode>
10
+ </CreditCard>
@@ -0,0 +1,54 @@
1
+ <Customer>
2
+ <Status>Normal</Status>
3
+ <DefPaymentTerms>COD</DefPaymentTerms>
4
+ <DefShipTerms>Prepaid</DefShipTerms>
5
+ <TaxRate>None</TaxRate>
6
+ <Name>Sam Ball</Name>
7
+ <CreditLimit>1000000.00</CreditLimit>
8
+ <TaxExempt>true</TaxExempt>
9
+ <TaxExemptNumber>12345</TaxExemptNumber>
10
+ <Note>Hello World</Note>
11
+ <ActiveFlag>true</ActiveFlag>
12
+ <DefaultSalesman>jen</DefaultSalesman>
13
+ <DefaultCarrier>USPS</DefaultCarrier>
14
+ <JobDepth>1</JobDepth>
15
+ <Addresses>
16
+ <Address>
17
+ <Temp-Account>
18
+ <Type>10</Type>
19
+ </Temp-Account>
20
+ <Name>Main Office</Name>
21
+ <Attn>Attention</Attn>
22
+ <Street>123 Neverland dr.</Street>
23
+ <City>Murray</City>
24
+ <Zip>84121</Zip>
25
+ <Default>true</Default>
26
+ <Residential>false</Residential>
27
+ <Type>Main Office</Type>
28
+ <State>
29
+ <Name>Utah</Name>
30
+ <Code>UT</Code>
31
+ <CountryID>2</CountryID>
32
+ </State>
33
+ <Country>
34
+ <Name>United States</Name>
35
+ <Code>US</Code>
36
+ </Country>
37
+ <AddressInformationList>
38
+ <AddressInformation>
39
+ <Name>Main Office</Name>
40
+ <Data>Address Data</Data>
41
+ <Default>true</Default>
42
+ <Type>Home</Type>
43
+ </AddressInformation>
44
+ </AddressInformationList>
45
+ </Address>
46
+ </Addresses>
47
+ <CustomFields>
48
+ <CustomField>
49
+ <Type>CFT_TEXT</Type>
50
+ <Name>Custom1</Name>
51
+ <Info>Custom Data</Info>
52
+ </CustomField>
53
+ </CustomFields>
54
+ </Customer>
@@ -0,0 +1,14 @@
1
+ <Location>
2
+ <LocationID>0</LocationID>
3
+ <TypeID>0</TypeID>
4
+ <Name/>
5
+ <Description/>
6
+ <CountedAsAvailable>true</CountedAsAvailable>
7
+ <Active>true</Active>
8
+ <Pickable>true</Pickable>
9
+ <Receivable>true</Receivable>
10
+ <LocationGroupID>0</LocationGroupID>
11
+ <LocationGroupName/>
12
+ <TagID>-1</TagID>
13
+ <TagNumber>-1</TagNumber>
14
+ </Location>
@@ -0,0 +1,5 @@
1
+ <LocationGroup>
2
+ <LocationGroupID>1</LocationGroupID>
3
+ <LocationGroupName>SLC</LocationGroupName>
4
+ <DefaultQBClassID>2</DefaultQBClassID>
5
+ </LocationGroup>
@@ -0,0 +1 @@
1
+ <LocationGroup>SLC</LocationGroup>
@@ -0,0 +1,8 @@
1
+ <OrderHistory>
2
+ <ID>314</ID>
3
+ <UserName>admin</UserName>
4
+ <DateCreated>2011-08-08T11:15:16</DateCreated>
5
+ <Comment>Receipt Created</Comment>
6
+ <TableID>-2001398668</TableID>
7
+ <RecordID>91</RecordID>
8
+ </OrderHistory>
@@ -0,0 +1,105 @@
1
+ <Part>
2
+ <PartID>60</PartID>
3
+ <PartClassID>0</PartClassID>
4
+ <TypeID>10</TypeID>
5
+ <UOM>
6
+ <UOMID>1</UOMID>
7
+ <Name>Each</Name>
8
+ <Code>ea</Code>
9
+ <Integral>true</Integral>
10
+ <Active>true</Active>
11
+ <Type>Count</Type>
12
+ <UOMConversions>
13
+ <UOMConversion>
14
+ <MainUOMID>1</MainUOMID>
15
+ <ToUOMID>17</ToUOMID>
16
+ <ToUOMCode>pr</ToUOMCode>
17
+ <ConversionMultiply>1.0</ConversionMultiply>
18
+ <ConversionFactor>2.0</ConversionFactor>
19
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
20
+ </UOMConversion>
21
+ <UOMConversion>
22
+ <MainUOMID>1</MainUOMID>
23
+ <ToUOMID>18</ToUOMID>
24
+ <ToUOMCode>pk</ToUOMCode>
25
+ <ConversionMultiply>1.0</ConversionMultiply>
26
+ <ConversionFactor>20.0</ConversionFactor>
27
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
28
+ </UOMConversion>
29
+ </UOMConversions>
30
+ </UOM>
31
+ <Num>BB2005</Num>
32
+ <Description>Custom Value Bike</Description>
33
+ <Details/>
34
+ <StandardCost>0</StandardCost>
35
+ <HasBOM>false</HasBOM>
36
+ <Configurable>true</Configurable>
37
+ <ActiveFlag>true</ActiveFlag>
38
+ <SerializedFlag>true</SerializedFlag>
39
+ <TrackingFlag>true</TrackingFlag>
40
+ <Weight>0</Weight>
41
+ <WeightUOM>
42
+ <UOM>
43
+ <UOMID>3</UOMID>
44
+ <Name>Pound</Name>
45
+ <Code>lbs</Code>
46
+ <Integral>false</Integral>
47
+ <Active>true</Active>
48
+ <Type>Weight</Type>
49
+ <UOMConversions>
50
+ <UOMConversion>
51
+ <MainUOMID>3</MainUOMID>
52
+ <ToUOMID>8</ToUOMID>
53
+ <ToUOMCode>kg</ToUOMCode>
54
+ <ConversionMultiply>1.0</ConversionMultiply>
55
+ <ConversionFactor>2.2046000957489014</ConversionFactor>
56
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
57
+ </UOMConversion>
58
+ </UOMConversions>
59
+ </UOM>
60
+ </WeightUOM>
61
+ <Width>0</Width>
62
+ <Height>0</Height>
63
+ <Len>0</Len>
64
+ <SizeUOM>
65
+ <UOM>
66
+ <UOMID>2</UOMID>
67
+ <Name>Foot</Name>
68
+ <Code>ft</Code>
69
+ <Integral>false</Integral>
70
+ <Active>true</Active>
71
+ <Type>Length</Type>
72
+ <UOMConversions>
73
+ <UOMConversion>
74
+ <MainUOMID>2</MainUOMID>
75
+ <ToUOMID>7</ToUOMID>
76
+ <ToUOMCode>in</ToUOMCode>
77
+ <ConversionMultiply>12.0</ConversionMultiply>
78
+ <ConversionFactor>1.0</ConversionFactor>
79
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
80
+ </UOMConversion>
81
+ <UOMConversion>
82
+ <MainUOMID>2</MainUOMID>
83
+ <ToUOMID>9</ToUOMID>
84
+ <ToUOMCode>m</ToUOMCode>
85
+ <ConversionMultiply>1.0</ConversionMultiply>
86
+ <ConversionFactor>3.2808001041412354</ConversionFactor>
87
+ <ToUOMIsIntegral>false</ToUOMIsIntegral>
88
+ </UOMConversion>
89
+ </UOMConversions>
90
+ </UOM>
91
+ </SizeUOM>
92
+ <UPC/>
93
+ <PartTrackingList>
94
+ <PartTracking>
95
+ <PartTrackingID>4</PartTrackingID>
96
+ <Name>Serial Number</Name>
97
+ <Abbr>SN(s)</Abbr>
98
+ <Description/>
99
+ <SortOrder>4</SortOrder>
100
+ <TrackingTypeID>40</TrackingTypeID>
101
+ <Active>true</Active>
102
+ <Primary>true</Primary>
103
+ </PartTracking>
104
+ </PartTrackingList>
105
+ </Part>