fishbowl 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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>