quickbooks 0.4.0 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (293) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.txt +23 -0
  3. data/License.txt +54 -0
  4. data/Manifest.txt +73 -0
  5. data/README.txt +79 -0
  6. data/Rakefile +17 -78
  7. data/lib/quickbooks.rb +153 -7
  8. data/lib/quickbooks/adaptability.rb +67 -0
  9. data/lib/quickbooks/adapters/http_adapter.rb +94 -0
  10. data/lib/quickbooks/adapters/https_adapter.rb +57 -0
  11. data/lib/quickbooks/adapters/ole_adapter.rb +141 -110
  12. data/lib/quickbooks/adapters/spew_adapter.rb +39 -0
  13. data/lib/quickbooks/adapters/tcp_adapter.rb +71 -0
  14. data/lib/quickbooks/adapters/test_adapter.rb +62 -0
  15. data/lib/quickbooks/element.rb +385 -0
  16. data/lib/quickbooks/element_collection.rb +105 -0
  17. data/lib/quickbooks/extlib.rb +8 -0
  18. data/lib/quickbooks/extlib/assertions.rb +8 -0
  19. data/lib/quickbooks/extlib/class.rb +98 -0
  20. data/lib/quickbooks/extlib/days_and_times.rb +10 -0
  21. data/lib/quickbooks/extlib/days_and_times/duration.rb +362 -0
  22. data/lib/quickbooks/extlib/days_and_times/numeric.rb +48 -0
  23. data/lib/quickbooks/extlib/days_and_times/object.rb +19 -0
  24. data/lib/quickbooks/extlib/days_and_times/time.rb +137 -0
  25. data/lib/quickbooks/extlib/hash.rb +327 -0
  26. data/lib/quickbooks/extlib/hook.rb +366 -0
  27. data/lib/quickbooks/extlib/inflection.rb +436 -0
  28. data/lib/quickbooks/extlib/logger.rb +202 -0
  29. data/lib/quickbooks/extlib/object.rb +162 -0
  30. data/lib/quickbooks/extlib/pathname.rb +15 -0
  31. data/lib/quickbooks/extlib/rubygems.rb +38 -0
  32. data/lib/quickbooks/extlib/string.rb +32 -0
  33. data/lib/quickbooks/extlib/time.rb +41 -0
  34. data/lib/quickbooks/model.rb +503 -121
  35. data/lib/quickbooks/option.rb +95 -0
  36. data/lib/quickbooks/property.rb +69 -0
  37. data/lib/quickbooks/ruby_ext.rb +251 -0
  38. data/lib/quickbooks/type.rb +75 -0
  39. data/lib/quickbooks/types.rb +58 -0
  40. data/lib/quickbooks/version.rb +10 -0
  41. data/lib/quickbooks/xsd.rb +243 -0
  42. data/lib/quickbooks/xsd/attribute.rb +57 -0
  43. data/lib/quickbooks/xsd/choice.rb +94 -0
  44. data/lib/quickbooks/xsd/complex_type.rb +77 -0
  45. data/lib/quickbooks/xsd/element.rb +214 -0
  46. data/lib/quickbooks/xsd/group.rb +94 -0
  47. data/lib/quickbooks/xsd/restriction.rb +51 -0
  48. data/lib/quickbooks/xsd/sequence.rb +85 -0
  49. data/lib/quickbooks/xsd/simple_type.rb +87 -0
  50. data/lib/quickbooks/xsd/union.rb +70 -0
  51. data/lib/quickbooks/xsd/validation.rb +89 -0
  52. data/lib/quickbooks/xsd/xml_parse.rb +80 -0
  53. data/quickbooks.gemspec +36 -0
  54. data/source/qbxml21_demo.xsd +2223 -0
  55. data/source/qbxmlops_demo.xsd +483 -0
  56. data/source/qbxmltypes.xsd +160 -0
  57. data/spec/association_spec.rb +5 -0
  58. data/spec/element_collection_spec.rb +8 -0
  59. data/spec/find_spec.rb +30 -0
  60. data/spec/lib/quickbooks/element_spec.rb +83 -0
  61. data/spec/lib/quickbooks/elements/sales_order_add_spec.rb +14 -0
  62. data/spec/lib/quickbooks/elements/vendor_add_spec.rb +78 -0
  63. data/spec/lib/quickbooks/model_spec.rb +89 -0
  64. data/spec/lib/quickbooks/models/customer_spec.rb +52 -0
  65. data/spec/lib/quickbooks/models/invoice_spec.rb +12 -0
  66. data/spec/lib/quickbooks/models/sales_order_line_spec.rb +0 -0
  67. data/spec/lib/quickbooks/models/sales_order_spec.rb +145 -0
  68. data/spec/lib/quickbooks/xsd/choice_spec.rb +18 -0
  69. data/spec/pending_spec.rb +11 -0
  70. data/spec/quickbooks_spec.rb +38 -0
  71. data/spec/repeatable_spec.rb +20 -0
  72. data/spec/requires_spec.rb +10 -0
  73. data/spec/spec_helper.rb +5 -0
  74. data/spec/validation_spec.rb +24 -0
  75. metadata +133 -285
  76. metadata.gz.sig +0 -0
  77. data/LICENSE +0 -16
  78. data/README +0 -49
  79. data/doc/classes/Array.html +0 -368
  80. data/doc/classes/Array.src/M000026.html +0 -18
  81. data/doc/classes/Array.src/M000027.html +0 -21
  82. data/doc/classes/Array.src/M000028.html +0 -18
  83. data/doc/classes/Array.src/M000029.html +0 -19
  84. data/doc/classes/Array.src/M000030.html +0 -18
  85. data/doc/classes/Array.src/M000031.html +0 -23
  86. data/doc/classes/Array.src/M000032.html +0 -18
  87. data/doc/classes/Array.src/M000033.html +0 -18
  88. data/doc/classes/Array.src/M000034.html +0 -18
  89. data/doc/classes/Array.src/M000035.html +0 -19
  90. data/doc/classes/Array.src/M000036.html +0 -18
  91. data/doc/classes/Array.src/M000037.html +0 -23
  92. data/doc/classes/Array.src/M000038.html +0 -18
  93. data/doc/classes/Array.src/M000039.html +0 -21
  94. data/doc/classes/Array.src/M000040.html +0 -18
  95. data/doc/classes/Array.src/M000041.html +0 -18
  96. data/doc/classes/Class.html +0 -171
  97. data/doc/classes/Class.src/M000042.html +0 -18
  98. data/doc/classes/Class.src/M000043.html +0 -18
  99. data/doc/classes/Hash.html +0 -516
  100. data/doc/classes/Hash.src/M000001.html +0 -18
  101. data/doc/classes/Hash.src/M000002.html +0 -21
  102. data/doc/classes/Hash.src/M000003.html +0 -18
  103. data/doc/classes/Hash.src/M000004.html +0 -21
  104. data/doc/classes/Hash.src/M000005.html +0 -18
  105. data/doc/classes/Hash.src/M000006.html +0 -20
  106. data/doc/classes/Hash.src/M000007.html +0 -18
  107. data/doc/classes/Hash.src/M000008.html +0 -22
  108. data/doc/classes/Hash.src/M000009.html +0 -18
  109. data/doc/classes/Hash.src/M000010.html +0 -21
  110. data/doc/classes/Hash.src/M000011.html +0 -24
  111. data/doc/classes/Hash.src/M000012.html +0 -18
  112. data/doc/classes/Hash.src/M000013.html +0 -21
  113. data/doc/classes/Hash.src/M000014.html +0 -18
  114. data/doc/classes/Hash.src/M000015.html +0 -21
  115. data/doc/classes/Hash.src/M000016.html +0 -18
  116. data/doc/classes/Hash.src/M000017.html +0 -21
  117. data/doc/classes/Hash.src/M000018.html +0 -27
  118. data/doc/classes/Hash.src/M000019.html +0 -20
  119. data/doc/classes/Hash.src/M000020.html +0 -18
  120. data/doc/classes/Hash.src/M000021.html +0 -18
  121. data/doc/classes/Hash.src/M000022.html +0 -18
  122. data/doc/classes/Hash.src/M000023.html +0 -18
  123. data/doc/classes/Hash.src/M000024.html +0 -18
  124. data/doc/classes/Hash.src/M000025.html +0 -28
  125. data/doc/classes/Object.html +0 -278
  126. data/doc/classes/Object.src/M000044.html +0 -24
  127. data/doc/classes/Object.src/M000045.html +0 -19
  128. data/doc/classes/Object.src/M000046.html +0 -24
  129. data/doc/classes/Object.src/M000047.html +0 -18
  130. data/doc/classes/Object.src/M000048.html +0 -19
  131. data/doc/classes/Object.src/M000049.html +0 -18
  132. data/doc/classes/Object.src/M000050.html +0 -18
  133. data/doc/classes/Object.src/M000051.html +0 -18
  134. data/doc/classes/Qbxml.html +0 -131
  135. data/doc/classes/Qbxml/Request.html +0 -224
  136. data/doc/classes/Qbxml/Request.src/M000132.html +0 -66
  137. data/doc/classes/Qbxml/Request.src/M000133.html +0 -19
  138. data/doc/classes/Qbxml/Request.src/M000134.html +0 -83
  139. data/doc/classes/Qbxml/RequestSet.html +0 -199
  140. data/doc/classes/Qbxml/RequestSet.src/M000135.html +0 -22
  141. data/doc/classes/Qbxml/RequestSet.src/M000136.html +0 -26
  142. data/doc/classes/Qbxml/RequestSet.src/M000137.html +0 -18
  143. data/doc/classes/Qbxml/RequestSet.src/M000138.html +0 -22
  144. data/doc/classes/Qbxml/Response.html +0 -302
  145. data/doc/classes/Qbxml/Response.src/M000123.html +0 -24
  146. data/doc/classes/Qbxml/Response.src/M000124.html +0 -19
  147. data/doc/classes/Qbxml/Response.src/M000125.html +0 -55
  148. data/doc/classes/Qbxml/Response.src/M000126.html +0 -18
  149. data/doc/classes/Qbxml/Response.src/M000127.html +0 -18
  150. data/doc/classes/Qbxml/Response.src/M000128.html +0 -18
  151. data/doc/classes/Qbxml/Response.src/M000129.html +0 -18
  152. data/doc/classes/Qbxml/Response.src/M000130.html +0 -18
  153. data/doc/classes/Qbxml/Response.src/M000131.html +0 -63
  154. data/doc/classes/Qbxml/ResponseSet.html +0 -244
  155. data/doc/classes/Qbxml/ResponseSet.src/M000116.html +0 -22
  156. data/doc/classes/Qbxml/ResponseSet.src/M000117.html +0 -26
  157. data/doc/classes/Qbxml/ResponseSet.src/M000118.html +0 -24
  158. data/doc/classes/Qbxml/ResponseSet.src/M000119.html +0 -20
  159. data/doc/classes/Qbxml/ResponseSet.src/M000120.html +0 -27
  160. data/doc/classes/Qbxml/ResponseSet.src/M000121.html +0 -18
  161. data/doc/classes/Qbxml/ResponseSet.src/M000122.html +0 -18
  162. data/doc/classes/Quickbooks.html +0 -196
  163. data/doc/classes/Quickbooks/Address.html +0 -139
  164. data/doc/classes/Quickbooks/Address.src/M000115.html +0 -19
  165. data/doc/classes/Quickbooks/Base.html +0 -567
  166. data/doc/classes/Quickbooks/Base.src/M000095.html +0 -18
  167. data/doc/classes/Quickbooks/Base.src/M000096.html +0 -20
  168. data/doc/classes/Quickbooks/Base.src/M000097.html +0 -19
  169. data/doc/classes/Quickbooks/Base.src/M000098.html +0 -18
  170. data/doc/classes/Quickbooks/Base.src/M000099.html +0 -19
  171. data/doc/classes/Quickbooks/Base.src/M000100.html +0 -30
  172. data/doc/classes/Quickbooks/Base.src/M000101.html +0 -22
  173. data/doc/classes/Quickbooks/Base.src/M000102.html +0 -30
  174. data/doc/classes/Quickbooks/Base.src/M000103.html +0 -19
  175. data/doc/classes/Quickbooks/Base.src/M000104.html +0 -19
  176. data/doc/classes/Quickbooks/Base.src/M000105.html +0 -18
  177. data/doc/classes/Quickbooks/Base.src/M000106.html +0 -18
  178. data/doc/classes/Quickbooks/Base.src/M000107.html +0 -19
  179. data/doc/classes/Quickbooks/Base.src/M000108.html +0 -18
  180. data/doc/classes/Quickbooks/Base.src/M000109.html +0 -45
  181. data/doc/classes/Quickbooks/Base.src/M000110.html +0 -18
  182. data/doc/classes/Quickbooks/Base.src/M000111.html +0 -18
  183. data/doc/classes/Quickbooks/Base.src/M000112.html +0 -20
  184. data/doc/classes/Quickbooks/BillAddress.html +0 -113
  185. data/doc/classes/Quickbooks/CreditCardInfo.html +0 -113
  186. data/doc/classes/Quickbooks/Customer.html +0 -113
  187. data/doc/classes/Quickbooks/CustomerTypeRef.html +0 -113
  188. data/doc/classes/Quickbooks/Deleted.html +0 -113
  189. data/doc/classes/Quickbooks/ItemSalesTaxRef.html +0 -113
  190. data/doc/classes/Quickbooks/JobTypeRef.html +0 -113
  191. data/doc/classes/Quickbooks/ListDeleted.html +0 -139
  192. data/doc/classes/Quickbooks/ListDeleted.src/M000114.html +0 -18
  193. data/doc/classes/Quickbooks/ListItem.html +0 -170
  194. data/doc/classes/Quickbooks/ListItem.src/M000093.html +0 -20
  195. data/doc/classes/Quickbooks/ListItem.src/M000094.html +0 -18
  196. data/doc/classes/Quickbooks/Model.html +0 -462
  197. data/doc/classes/Quickbooks/Model.src/M000073.html +0 -24
  198. data/doc/classes/Quickbooks/Model.src/M000074.html +0 -19
  199. data/doc/classes/Quickbooks/Model.src/M000075.html +0 -18
  200. data/doc/classes/Quickbooks/Model.src/M000076.html +0 -18
  201. data/doc/classes/Quickbooks/Model.src/M000077.html +0 -18
  202. data/doc/classes/Quickbooks/Model.src/M000078.html +0 -22
  203. data/doc/classes/Quickbooks/Model.src/M000079.html +0 -32
  204. data/doc/classes/Quickbooks/Model.src/M000080.html +0 -32
  205. data/doc/classes/Quickbooks/Model.src/M000081.html +0 -18
  206. data/doc/classes/Quickbooks/Model.src/M000082.html +0 -18
  207. data/doc/classes/Quickbooks/Model.src/M000083.html +0 -22
  208. data/doc/classes/Quickbooks/Model.src/M000084.html +0 -23
  209. data/doc/classes/Quickbooks/Model.src/M000085.html +0 -18
  210. data/doc/classes/Quickbooks/Model.src/M000086.html +0 -21
  211. data/doc/classes/Quickbooks/Model.src/M000087.html +0 -26
  212. data/doc/classes/Quickbooks/Model.src/M000088.html +0 -26
  213. data/doc/classes/Quickbooks/Model.src/M000089.html +0 -26
  214. data/doc/classes/Quickbooks/Model.src/M000090.html +0 -21
  215. data/doc/classes/Quickbooks/Model.src/M000091.html +0 -23
  216. data/doc/classes/Quickbooks/OleAdapter.html +0 -129
  217. data/doc/classes/Quickbooks/OleAdapter/Connection.html +0 -343
  218. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000058.html +0 -18
  219. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000059.html +0 -19
  220. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000060.html +0 -24
  221. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000061.html +0 -18
  222. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000062.html +0 -18
  223. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000063.html +0 -21
  224. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000064.html +0 -24
  225. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000065.html +0 -20
  226. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000066.html +0 -24
  227. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000067.html +0 -24
  228. data/doc/classes/Quickbooks/OleAdapter/Ole.html +0 -209
  229. data/doc/classes/Quickbooks/OleAdapter/Ole.src/M000068.html +0 -21
  230. data/doc/classes/Quickbooks/OleAdapter/Ole.src/M000069.html +0 -22
  231. data/doc/classes/Quickbooks/OleAdapter/Ole.src/M000070.html +0 -18
  232. data/doc/classes/Quickbooks/ParentRef.html +0 -113
  233. data/doc/classes/Quickbooks/PreferredPaymentMethodRef.html +0 -113
  234. data/doc/classes/Quickbooks/PriceLevelRef.html +0 -113
  235. data/doc/classes/Quickbooks/QbxmlDebugAdapter.html +0 -111
  236. data/doc/classes/Quickbooks/QbxmlDebugAdapter/Connection.html +0 -139
  237. data/doc/classes/Quickbooks/QbxmlDebugAdapter/Connection.src/M000057.html +0 -18
  238. data/doc/classes/Quickbooks/Ref.html +0 -146
  239. data/doc/classes/Quickbooks/Ref.src/M000113.html +0 -18
  240. data/doc/classes/Quickbooks/SalesRepRef.html +0 -113
  241. data/doc/classes/Quickbooks/SalesTaxCodeRef.html +0 -113
  242. data/doc/classes/Quickbooks/ShipAddress.html +0 -113
  243. data/doc/classes/Quickbooks/TermsRef.html +0 -113
  244. data/doc/classes/Quickbooks/Transaction.html +0 -154
  245. data/doc/classes/Quickbooks/Transaction.src/M000071.html +0 -19
  246. data/doc/classes/Quickbooks/Transaction.src/M000072.html +0 -18
  247. data/doc/classes/Quickbooks/TxnDeleted.html +0 -139
  248. data/doc/classes/Quickbooks/TxnDeleted.src/M000092.html +0 -18
  249. data/doc/classes/String.html +0 -203
  250. data/doc/classes/String.src/M000052.html +0 -18
  251. data/doc/classes/String.src/M000053.html +0 -18
  252. data/doc/classes/String.src/M000054.html +0 -18
  253. data/doc/classes/String.src/M000055.html +0 -18
  254. data/doc/classes/String.src/M000056.html +0 -18
  255. data/doc/created.rid +0 -1
  256. data/doc/files/LICENSE.html +0 -129
  257. data/doc/files/README.html +0 -225
  258. data/doc/files/lib/qbxml/request_rb.html +0 -110
  259. data/doc/files/lib/qbxml/response_rb.html +0 -109
  260. data/doc/files/lib/qbxml/support_rb.html +0 -101
  261. data/doc/files/lib/qbxml_rb.html +0 -122
  262. data/doc/files/lib/quickbooks/adapters/ole_adapter_rb.html +0 -108
  263. data/doc/files/lib/quickbooks/adapters/qbxml_debug_adapter_rb.html +0 -108
  264. data/doc/files/lib/quickbooks/base_rb.html +0 -327
  265. data/doc/files/lib/quickbooks/model_rb.html +0 -108
  266. data/doc/files/lib/quickbooks/models/common/address_rb.html +0 -101
  267. data/doc/files/lib/quickbooks/models/common/all_refs_rb.html +0 -101
  268. data/doc/files/lib/quickbooks/models/customer/credit_card_info_rb.html +0 -101
  269. data/doc/files/lib/quickbooks/models/customer_rb.html +0 -110
  270. data/doc/files/lib/quickbooks/models/deleted_rb.html +0 -101
  271. data/doc/files/lib/quickbooks/models/list_item_rb.html +0 -101
  272. data/doc/files/lib/quickbooks/models/transaction_rb.html +0 -101
  273. data/doc/files/lib/quickbooks/ruby_magic_rb.html +0 -120
  274. data/doc/files/lib/quickbooks_rb.html +0 -125
  275. data/doc/fr_class_index.html +0 -64
  276. data/doc/fr_file_index.html +0 -45
  277. data/doc/fr_method_index.html +0 -164
  278. data/doc/index.html +0 -24
  279. data/doc/rdoc-style.css +0 -208
  280. data/lib/qbxml.rb +0 -3
  281. data/lib/qbxml/request.rb +0 -207
  282. data/lib/qbxml/response.rb +0 -197
  283. data/lib/qbxml/support.rb +0 -130
  284. data/lib/quickbooks/adapters/qbxml_debug_adapter.rb +0 -10
  285. data/lib/quickbooks/base.rb +0 -277
  286. data/lib/quickbooks/models/common/address.rb +0 -14
  287. data/lib/quickbooks/models/common/all_refs.rb +0 -37
  288. data/lib/quickbooks/models/customer.rb +0 -70
  289. data/lib/quickbooks/models/customer/credit_card_info.rb +0 -5
  290. data/lib/quickbooks/models/deleted.rb +0 -22
  291. data/lib/quickbooks/models/list_item.rb +0 -41
  292. data/lib/quickbooks/models/transaction.rb +0 -49
  293. data/lib/quickbooks/ruby_magic.rb +0 -213
@@ -1,10 +0,0 @@
1
- # This is a fake adapter simply for testing Qbxml Requests.
2
- module Quickbooks
3
- module QbxmlDebugAdapter
4
- class Connection
5
- def send_xml(xml)
6
- puts "Sending XML: #{xml.to_s}"
7
- end
8
- end
9
- end
10
- end
@@ -1,277 +0,0 @@
1
- # Contains Quickbooks::Base, which inherits from Quickbooks::Model. Simple objects like BillAddress and CreditCardInfo also
2
- # inherit from Quickbooks::Model, but any objects that are stored as their own 'entity' are below Quickbooks::Base in the
3
- # inheritance tree. Two models inherit directly from Quickbooks::Base: ListItem and Transaction. All other whole-entity
4
- # models inherit from either of these. Only a couple are written so far, as I've had use for them. They're pretty easy to
5
- # write though -- take a look at customer.rb, for example: all that needs defining for most models is any filters (and aliases)
6
- # specific to that model, and a listing of that model's attributes. If you write a model, please send in your code to
7
- # gems@behindlogic.com!
8
- #
9
- # Inherits from ListItem:
10
- # - Account
11
- # - Account List
12
- # - BillingRate
13
- # - Class
14
- # - Currency
15
- # - Customer
16
- # - CustomerMessage
17
- # - CustomerType
18
- # - DateDrivenTerms
19
- # - Employee
20
- # - ItemDiscount
21
- # - ItemFixedAsset
22
- # - ItemGroup
23
- # - ItemInventory
24
- # - ItemInventoryAssembly
25
- # - ItemNonInventory
26
- # - ItemOtherCharge
27
- # - ItemPayment
28
- # - ItemSalesTax
29
- # - ItemSalesTaxGroup
30
- # - ItemService
31
- # - ItemSubtotal
32
- # - JobType
33
- # - OtherName
34
- # - PaymentMethod
35
- # - PayrollItemNonWage
36
- # - PayrollItemWage
37
- # - PriceLevel
38
- # - SalesRep
39
- # - SalesTaxCode
40
- # - ShipMethod
41
- # - StandardTerms
42
- # - TaxCode
43
- # - Template
44
- # - ToDo
45
- # - Vehicle
46
- # - Vendor
47
- # - VendorType
48
- # Inherits from Transaction:
49
- # - Bill
50
- # - BillPaymentCheck
51
- # - BillPaymentCreditCard
52
- # - BuildAssembly
53
- # - Charge
54
- # - Check
55
- # - CreditCardCharge
56
- # - CreditCardCredit
57
- # - CreditCardRefund
58
- # - CreditMemo
59
- # - Deposit
60
- # - Estimate
61
- # - InventoryAdjustment
62
- # - Invoice
63
- # - ItemReceipt
64
- # - JournalEntry
65
- # - PurchaseOrder
66
- # - ReceivePayment
67
- # - SalesOrder
68
- # - SalesReceipt
69
- # - SalesTaxPaymentCheck
70
- # - TimeTracking
71
- # - VehicleMileage
72
- # - VendorCredit
73
-
74
- require 'quickbooks/model'
75
- require 'qbxml'
76
-
77
- module Quickbooks
78
- # Base is just base for ListItem and Transaction. It inherits from Model, just as Ref does.
79
- #
80
- # Some Qbxml specifications require certain finder-options to be placed inside a containing entity, such as:
81
- # ...
82
- # <DeletedDateRangeFilter>
83
- # <FromDeletedDate>#{(Time.now - 5*60*60).xmlschema}</FromDeletedDate>
84
- # <ToDeletedDate>#{(Time.now - 3*60*60).xmlschema}</ToDeletedDate>
85
- # </DeletedDateRangeFilter>
86
- # ...
87
- # The Quickbooks Models define aliases to these "inside" options. The equivalent to the above [partial] request:
88
- # Quickbooks::Deleted.all(:deleted_after => (Time.now - 5*60*60).xmlschema, :deleted_before => (Time.now - 3*60*60).xmlschema)
89
- # (Type-casting hasn't made it in yet.)
90
- #
91
- # Qbxml makes a special allowance for Deleted items. Much of the time, we'd rather access a model's deleted items through that
92
- # model class instead of through the deleted class. So Qbxml allows any class to ask for its deleted items through a call like
93
- # this:
94
- # Quickbooks::Customer.deleted(:deleted_after => Time.now - 3*60*60)
95
- class Base < Model
96
-
97
- self.filter_aliases = {:limit => :max_returned}
98
-
99
- # Stores a log of Qbxml::Response objects that were a result of methods performed on this object.
100
- attr_accessor :response_log
101
- def response_log #:nodoc:
102
- @response_log || (@response_log = [])
103
- end
104
-
105
- # Returns success (true/false) status of the last quickbooks communication called from this object.
106
- def success?
107
- @response_log.last.success?
108
- end
109
- def inspect #:nodoc:
110
- "#<#{self.class.name}:#{self.object_id} #{instance_variables.reject {|i| i.is_one_of?('@response_log', '@original_values')}.map {|i| "#{i}=#{instance_variable_get(i).inspect}"}.join(' ')}>"
111
- end
112
- class << self
113
-
114
- def use_adapter(adapter)
115
- # Should complain if the adapter doesn't exist.
116
- require "#{File.dirname(__FILE__)}/adapters/#{adapter.to_s}_adapter"
117
- @@connection_adapter = Object.module_eval("::Quickbooks::#{adapter.to_s.camelize}Adapter::Connection", __FILE__, __LINE__)
118
- end
119
-
120
- # Establishes a connection to the Quickbooks RDS Server for all Model Classes
121
- def establish_connection(*args)
122
- @@connection_adapter ||= use_adapter(:ole)
123
- @@connection = @@connection_adapter.new(*args)
124
- end
125
-
126
- # Returns the current Connection
127
- def connection
128
- @connection || (@@connection ||= self.establish_connection())
129
- end
130
-
131
- # Sets the current Connection.
132
- #
133
- # This is normally not needed, but in the case that you may want to connect a separate connection to Quickbooks,
134
- # you can use this method to explicitly set the connection in a class that inherits from Quickbooks::Base.
135
- # Quickbooks::Models::Base.connection = Quickbooks::Connection.new('My Test App', 'C:\\Some File.QBW', 'user', 'pass')
136
- def connection=(conn)
137
- raise ArgumentError, "Cannot set connection to anything but a (*)Adapter::Connection object" unless conn.class.name =~ /Adapter::Connection$/
138
- @connection = conn
139
- end
140
-
141
- # Generates a request by sending *args to Qbxml::Request.new, sends the request over the current connection,
142
- # and interprets the response using Qbxml::ResponseSet.
143
- # The response is then instantiated into an object or an array of objects.
144
- #
145
- # This method is used mostly internally, but it is the yoke of this library - use it to perform custom requests.
146
- def query(obj_or_args,*args)
147
- # If an object is sent, we need to reinstantiate the response into that object
148
- reinstantiate = if obj_or_args.is_a?(Quickbooks::Base)
149
- obj_or_args
150
- elsif obj_or_args.is_a?(Class)
151
- nil
152
- else
153
- args.unshift(obj_or_args)
154
- nil
155
- end
156
- objects = [] # This will hold and return the instantiated objects from the quickbooks response
157
- # The following is subject to bugginess, IF the response contains more than one object: it will instantiate only the last one.
158
- self.request(reinstantiate || self, *args).each { |response| objects << response.instantiate(reinstantiate) } # Does not instantiate if it's an error, but simply records response into response_log
159
- objects.length == 1 ? objects[0] : objects
160
- end
161
-
162
- # Generates a request using Qbxml::Request, sends it, and returns a Qbxml::ResponseSet object containing the response(s).
163
- def request(*args)
164
- Qbxml::ResponseSet.new(
165
- self.connection.send_xml(
166
- Qbxml::Request.new(*args).to_xml
167
- )
168
- )
169
- end
170
-
171
- # Instantiate a new object with just attributes, or an existing object replacing the attributes
172
- def instantiate(obj_or_attrs={},attrs={})
173
- if obj_or_attrs.is_a?(Quickbooks::Base)
174
- obj = obj_or_attrs
175
- else
176
- obj = allocate
177
- attrs = obj_or_attrs
178
- end
179
- attrs.each do |key,value|
180
- if obj.respond_to?(key.to_s.underscore+'=')
181
- obj.send(key.to_s.underscore+'=', value)
182
- obj.original_values[key.to_s.underscore] = obj.instance_variable_get('@' + key.to_s.underscore).dup
183
- end
184
- end if attrs
185
- obj # Will be either a nice object, or a Qbxml::Error object.
186
- end
187
-
188
- # Queries Quickbooks for all of the objects of the current class's type. For example, Quickbooks::Customer.all will return an array of Quickbooks::Customer objects representing all customers.
189
- def all(filters={})
190
- filters.reverse_merge!(:active_status => 'All')
191
- [query(self, :query, filters)].flatten
192
- end
193
-
194
- # Queries Quickbooks for the first object of the current class's type. For example, Quickbooks::Customer.first will return a Quickbooks::Customer object representing the first customer.
195
- def first(filters={})
196
- (filters.merge!(:max_returned => 1) unless filters.keys.include?(:list_id) || filters.keys.include?(:txn_id) || filters.keys.include?(:full_name)) if filters.is_a?(Hash)
197
- query(self, :query, filters)
198
- end
199
-
200
- # Still in testing... these should be equivalent:
201
- # Quickbooks::Customer.deleted(:deleted_before => Time.now) == Quickbooks::Deleted.all(:type => 'Customer', :deleted_before => Time.now)
202
- def deleted(filters={})
203
- query(self, :deleted, filters)
204
- end
205
-
206
- # Creates a new object of the current class's type. For example, Quickbooks::Customer.create(:name => 'Tommy') will create a customer object with a Name of Tommy.
207
- def create(*args)
208
- new(*args).save
209
- end
210
- end
211
-
212
- # Generates a new object that can be saved into Quickbooks once the required attributes are set.
213
- def initialize(*args)
214
- super # from Quickbooks::Model - sets the *args into attributes
215
- @new_record = true
216
- end
217
-
218
- # Returns true if the object is a new object (that doesn't represent an existing object in Quickbooks).
219
- def new_record?
220
- @new_record
221
- end
222
-
223
- # Saves the attributes that have changed.
224
- #
225
- # If the EditSequence is out of date but none of the changes conflict, the object will be saved to Quickbooks.
226
- # But if there are conflicts, the updated values from Quickbooks will be written to the original_values, and false is returned.
227
- # This way you can deal with the differences (conflicts), if you so desire, and simply call save again to commit your changes.
228
- def save
229
- return false unless dirty?
230
- self.errors.clear # Clear out any errors: start with a clean slate!
231
- if new_record?
232
- self.class.query(self, :add)
233
- ret = !dirty?
234
- @new_record = false if ret
235
- else
236
- # Smart system that respects EditSequences and other people's changes.
237
- # 1) Try to save
238
- # 2) When we get a status of 3200, that means our EditSequence is not up to date
239
- # 3) Replace self's original_attributes with those just retrieved, and update the automatic attributes, like EditSequence and TimeModified
240
- # 4) Return false, return the object dirty but ready to save
241
- old_originals = original_values.dup # Save the old_originals so we can detect any attributes that changed since we last loaded the object
242
- ret = self.class.query(self, :mod).error? ? false : true # Saves if possible, if EditSequence is out of date, it will read the up-to-date object into original_values
243
- # If save failed (dirty?) because of old record (status 3200), but none of the fields conflict (attributes I've modified and are still different aren't the same attributes as any of the attributes someone else updated), then re-save!
244
- if dirty? && self.response_log.last.status == 3200 && (dirty_attributes.only(dirty_attributes(old_originals).keys).keys - self.class.read_only.stringify_values).length == (dirty_attributes(old_originals).keys - old_originals.diff(original_values).keys - self.class.read_only.stringify_values).length
245
- # 'Revert' fields I didn't modify to equal the values of the more up-to-date record just loaded.
246
- # Fields I didn't modify: dirty_attributes - dirty_attributes(old_originals).keys
247
- (dirty_attributes - dirty_attributes(old_originals).keys).each_key do |at|
248
- self.send(at + '=', original_values[at]) if respond_to?(at + '=')
249
- end
250
- ret = self.save
251
- end
252
- end
253
- # ret should be a false value if self has errors. Either way, ret gets the errors too.
254
- ret.errors << self.errors if self.error?
255
- # Should be true or false with an error attached.
256
- ret
257
- end
258
-
259
- # Reloads the record from Quickbooks, discarding any changes that have been made to it.
260
- def reload
261
- self.class.query(self, :query)
262
- end
263
-
264
- # Destroys a record in Quickbooks. Note that even though Quickbooks will destroy the record,
265
- # the record's ListID and DeletedTime can be accessed by doing a query for deleted objects of the appropriate type.
266
- def destroy
267
- self.class.query(self, :delete).nil?
268
- end
269
-
270
- # Usual comparison (super), but add in false if either is a new record.
271
- def ==(other)
272
- return false unless other.is_a?(self.class)
273
- return false if self.new_record? || other.new_record?
274
- super
275
- end
276
- end
277
- end
@@ -1,14 +0,0 @@
1
- module Quickbooks
2
- class Address < Model
3
- def self.inherited(klass)
4
- super
5
- klass.read_write :addr1, :addr2, :addr3, :addr4, :addr5, :city, :state, :postal_code, :country, :note
6
- end
7
- end
8
-
9
- class BillAddress < Address
10
- end
11
-
12
- class ShipAddress < Address
13
- end
14
- end
@@ -1,37 +0,0 @@
1
- module Quickbooks
2
- # A reference simply is a link to another object. These are mostly included in other models as attributes.
3
- class Ref < Model
4
- def self.inherited(klass)
5
- klass.read_only :list_id, :full_name
6
- end
7
-
8
- # Put in here the connector code for 'association' calls
9
- end
10
-
11
- class ParentRef < Ref
12
- end
13
-
14
- class CustomerTypeRef < Ref
15
- end
16
-
17
- class TermsRef < Ref
18
- end
19
-
20
- class SalesRepRef < Ref
21
- end
22
-
23
- class SalesTaxCodeRef < Ref
24
- end
25
-
26
- class ItemSalesTaxRef < Ref
27
- end
28
-
29
- class PreferredPaymentMethodRef < Ref
30
- end
31
-
32
- class JobTypeRef < Ref
33
- end
34
-
35
- class PriceLevelRef < Ref
36
- end
37
- end
@@ -1,70 +0,0 @@
1
- require 'quickbooks/models/common/all_refs'
2
- require 'quickbooks/models/common/address'
3
- require 'quickbooks/models/customer/credit_card_info'
4
-
5
- module Quickbooks
6
- class Customer < ListItem
7
- self.valid_filters = ['active_status', 'from_modified_date', 'to_modified_date', 'name_filter', 'name_range_filter', 'total_balance_filter']
8
-
9
- # Properties are in the order required by QBXML
10
- read_write :name,
11
- :is_active,
12
- ParentRef,
13
- :company_name,
14
- :salutation,
15
- :first_name,
16
- :middle_name,
17
- :last_name,
18
- :suffix,
19
- BillAddress,
20
- ShipAddress,
21
- :print_as,
22
- :phone,
23
- # :mobile, # only in QBOE
24
- :pager,
25
- :alt_phone,
26
- :fax,
27
- :email,
28
- :contact,
29
- :alt_contact,
30
- CustomerTypeRef,
31
- TermsRef,
32
- SalesRepRef,
33
- # :open_balance,
34
- # :open_balance_date,
35
- SalesTaxCodeRef,
36
- ItemSalesTaxRef,
37
- :sales_tax_country,
38
- :resale_nmber,
39
- :account_number,
40
- :credit_limit,
41
- PreferredPaymentMethodRef,
42
- CreditCardInfo,
43
- :job_status,
44
- :job_start_date,
45
- :job_projected_end_date,
46
- :job_end_date,
47
- :job_desc,
48
- JobTypeRef,
49
- :notes,
50
- :is_statement_with_parent,
51
- :delivery_method,
52
- PriceLevelRef
53
-
54
- # def initialize
55
- # @parent_ref = ListItem.new
56
- # @bill_address = Address.new
57
- # @terms_ref = ListItem.new
58
- # @sales_rep_ref = ListItem.new
59
- # @sales_tax_code_ref = ListItem.new
60
- # @item_sales_tax_ref = ListItem.new
61
- # @preferred_payment_method_ref = ListItem.new
62
- # @job_type_ref = ListItem.new
63
- # @price_live_ref = ListItem.new
64
- # @data_ext_ref = ListItem.new
65
- # @ship_address = Address.new
66
- # @customer_type_ref = ListItem.new
67
- # @credit_card_info = CreditCardInfo.new
68
- # end
69
- end
70
- end
@@ -1,5 +0,0 @@
1
- module Quickbooks
2
- class CreditCardInfo < Model
3
- read_write :credit_card_number, :expiration_month, :expiration_year, :name_on_card, :credit_card_address, :credit_card_postal_code
4
- end
5
- end
@@ -1,22 +0,0 @@
1
- module Quickbooks
2
- class Deleted < Base
3
- self.filter_aliases = {'type' => 'list_del_type', 'deleted_after' => 'deleted_date_range_filter/from_deleted_date', 'deleted_before' => 'deleted_date_range_filter/to_deleted_date'}
4
- end
5
-
6
- class ListDeleted < Deleted
7
- self.valid_filters = ['list_del_type', 'deleted_date_range_filter/from_deleted_date', 'deleted_date_range_filter/to_deleted_date']
8
- class << self
9
- def ListOrTxn
10
- 'List'
11
- end
12
- end
13
- end
14
- class TxnDeleted < Deleted
15
- self.valid_filters = ['txn_del_type' 'deleted_date_range_filter/from_deleted_date', 'deleted_date_range_filter/to_deleted_date']
16
- class << self
17
- def ListOrTxn
18
- 'Txn'
19
- end
20
- end
21
- end
22
- end
@@ -1,41 +0,0 @@
1
- module Quickbooks
2
- # A ListItem is identified in quickbooks by ListID. All ListItems also have a unique FullName, so if you know
3
- # what the FullName of a ListItem is, you can find it that way. Always use the underscore version of finders, such as:
4
- # Quickbooks::Customer.first(:list_id => '12345-6789-09876543')
5
- # Quickbooks::Deleted.all(:list_del_type => 'Customer', :deleted_after => Time.now - 24*60*60)
6
- # (See Deleted for specifics on those options.)
7
- class ListItem < Base
8
-
9
- self.valid_filters = ['list_id', 'full_name']
10
- self.filter_aliases = {'updated_after' => 'from_modified_date', 'updated_before' => 'to_modified_date'}
11
-
12
- def self.inherited(klass)
13
- super
14
- # :time_deleted only comes from ListDeleted, but that way all ListDeleted attributes can be instantiated into the respective ListItem model
15
- klass.read_only :list_id, :full_name, :edit_sequence, :time_created, :time_modified, :time_deleted
16
- end
17
-
18
- class << self
19
- def ListOrTxn
20
- 'List'
21
- end
22
-
23
- # def child_types
24
- # [ "Account", "Account List", "BillingRate",
25
- # "Class", "Currency", "Customer",
26
- # "CustomerMessage", "CustomerType",
27
- # "DateDrivenTerms", "Employee", "ItemDiscount",
28
- # "ItemFixedAsset", "ItemGroup", "ItemInventory",
29
- # "ItemInventoryAssembly", "ItemNonInventory",
30
- # "ItemOtherCharge", "ItemPayment", "ItemSalesTax",
31
- # "ItemSalesTaxGroup", "ItemService", "ItemSubtotal",
32
- # "JobType", "OtherName", "PaymentMethod",
33
- # "PayrollItemNonWage", "PayrollItemWage", "PriceLevel",
34
- # "SalesRep", "SalesTaxCode", "ShipMethod",
35
- # "StandardTerms", "TaxCode", "Template", "ToDo",
36
- # "Vehicle", "Vendor", "VendorType"
37
- # ]
38
- # end
39
- end
40
- end
41
- end