quickbooks 0.0.5 → 0.0.7

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 (294) hide show
  1. data/LICENSE +1 -1
  2. data/Rakefile +4 -2
  3. data/doc/classes/Array.html +333 -40
  4. data/doc/classes/Array.src/M000037.html +18 -0
  5. data/doc/classes/Array.src/M000038.html +21 -0
  6. data/doc/classes/Array.src/M000039.html +18 -0
  7. data/doc/classes/Array.src/M000040.html +19 -0
  8. data/doc/classes/Array.src/M000041.html +18 -0
  9. data/doc/classes/Array.src/{M000004.html → M000042.html} +1 -1
  10. data/doc/classes/Array.src/M000043.html +18 -0
  11. data/doc/classes/Array.src/M000044.html +18 -0
  12. data/doc/classes/Array.src/{M000001.html → M000045.html} +1 -1
  13. data/doc/classes/Array.src/{M000002.html → M000046.html} +1 -1
  14. data/doc/classes/Array.src/{M000003.html → M000047.html} +1 -1
  15. data/doc/classes/Array.src/M000048.html +23 -0
  16. data/doc/classes/Array.src/{M000005.html → M000049.html} +1 -1
  17. data/doc/classes/Array.src/{M000006.html → M000050.html} +2 -2
  18. data/doc/classes/Array.src/{M000007.html → M000051.html} +1 -1
  19. data/doc/classes/Array.src/{M000008.html → M000052.html} +1 -1
  20. data/doc/classes/Array.src/M000053.html +18 -0
  21. data/doc/classes/Array.src/M000054.html +20 -0
  22. data/doc/classes/Array.src/M000055.html +18 -0
  23. data/doc/classes/Array.src/M000056.html +34 -0
  24. data/doc/classes/Array.src/M000057.html +19 -0
  25. data/doc/classes/Array.src/M000058.html +29 -0
  26. data/doc/classes/Array.src/M000059.html +18 -0
  27. data/doc/classes/Array.src/M000060.html +20 -0
  28. data/doc/classes/Array.src/M000061.html +18 -0
  29. data/doc/classes/Array.src/M000062.html +18 -0
  30. data/doc/classes/Array.src/M000063.html +19 -0
  31. data/doc/classes/Class.html +25 -6
  32. data/doc/classes/Class.src/M000075.html +18 -0
  33. data/doc/classes/Class.src/M000076.html +18 -0
  34. data/doc/classes/Hash.html +329 -103
  35. data/doc/classes/Hash.src/M000004.html +18 -0
  36. data/doc/classes/Hash.src/M000005.html +21 -0
  37. data/doc/classes/Hash.src/M000006.html +18 -0
  38. data/doc/classes/Hash.src/M000007.html +21 -0
  39. data/doc/classes/Hash.src/M000008.html +18 -0
  40. data/doc/classes/Hash.src/M000009.html +6 -4
  41. data/doc/classes/Hash.src/M000010.html +4 -7
  42. data/doc/classes/Hash.src/M000011.html +8 -4
  43. data/doc/classes/Hash.src/M000012.html +4 -7
  44. data/doc/classes/Hash.src/M000013.html +7 -4
  45. data/doc/classes/Hash.src/M000014.html +4 -7
  46. data/doc/classes/Hash.src/M000015.html +6 -12
  47. data/doc/classes/Hash.src/M000016.html +4 -6
  48. data/doc/classes/Hash.src/M000017.html +7 -4
  49. data/doc/classes/Hash.src/M000018.html +4 -6
  50. data/doc/classes/Hash.src/M000019.html +5 -22
  51. data/doc/classes/Hash.src/M000020.html +14 -5
  52. data/doc/classes/Hash.src/M000021.html +7 -5
  53. data/doc/classes/Hash.src/M000022.html +5 -7
  54. data/doc/classes/Hash.src/M000023.html +7 -5
  55. data/doc/classes/Hash.src/M000024.html +5 -5
  56. data/doc/classes/Hash.src/M000025.html +4 -4
  57. data/doc/classes/Hash.src/M000026.html +4 -8
  58. data/doc/classes/Hash.src/M000027.html +22 -0
  59. data/doc/classes/Hash.src/M000028.html +18 -0
  60. data/doc/classes/Hash.src/M000029.html +20 -0
  61. data/doc/classes/Hash.src/M000030.html +18 -0
  62. data/doc/classes/Hash.src/M000031.html +30 -0
  63. data/doc/classes/Hash.src/M000032.html +19 -0
  64. data/doc/classes/Hash.src/M000033.html +19 -0
  65. data/doc/classes/Hash.src/M000034.html +18 -0
  66. data/doc/classes/Hash.src/M000035.html +18 -0
  67. data/doc/classes/Hash.src/M000036.html +21 -0
  68. data/doc/classes/Object.html +75 -39
  69. data/doc/classes/Object.src/M000077.html +24 -0
  70. data/doc/classes/Object.src/M000078.html +19 -0
  71. data/doc/classes/Object.src/{M000028.html → M000079.html} +1 -1
  72. data/doc/classes/Object.src/{M000029.html → M000080.html} +1 -1
  73. data/doc/classes/Object.src/{M000030.html → M000081.html} +1 -1
  74. data/doc/classes/Object.src/{M000031.html → M000082.html} +1 -1
  75. data/doc/classes/Object.src/{M000032.html → M000083.html} +1 -1
  76. data/doc/classes/Object.src/{M000033.html → M000084.html} +2 -2
  77. data/doc/classes/OrderedArray.html +178 -0
  78. data/doc/classes/OrderedArray.src/M000001.html +18 -0
  79. data/doc/classes/OrderedArray.src/M000002.html +18 -0
  80. data/doc/classes/OrderedArray.src/M000003.html +18 -0
  81. data/doc/classes/OrderedHash.html +324 -0
  82. data/doc/classes/OrderedHash.src/M000064.html +19 -0
  83. data/doc/classes/OrderedHash.src/M000065.html +18 -0
  84. data/doc/classes/OrderedHash.src/M000066.html +18 -0
  85. data/doc/classes/OrderedHash.src/M000067.html +18 -0
  86. data/doc/classes/OrderedHash.src/M000068.html +18 -0
  87. data/doc/classes/OrderedHash.src/M000069.html +18 -0
  88. data/doc/classes/OrderedHash.src/M000070.html +20 -0
  89. data/doc/classes/OrderedHash.src/M000071.html +18 -0
  90. data/doc/classes/OrderedHash.src/M000072.html +18 -0
  91. data/doc/classes/OrderedHash.src/M000073.html +19 -0
  92. data/doc/classes/OrderedHash.src/M000074.html +24 -0
  93. data/doc/classes/{Quickbooks/Qbxml.html → Qbxml.html} +11 -13
  94. data/doc/classes/{Quickbooks/Qbxml → Qbxml}/Request.html +32 -22
  95. data/doc/classes/Qbxml/Request.src/M000184.html +65 -0
  96. data/doc/classes/Qbxml/Request.src/M000185.html +19 -0
  97. data/doc/classes/Qbxml/Request.src/M000186.html +83 -0
  98. data/doc/classes/{Quickbooks/Qbxml → Qbxml}/RequestSet.html +32 -26
  99. data/doc/classes/{Quickbooks/Connection.src/M000104.html → Qbxml/RequestSet.src/M000187.html} +7 -5
  100. data/doc/classes/Qbxml/RequestSet.src/M000188.html +26 -0
  101. data/doc/classes/Qbxml/RequestSet.src/M000189.html +18 -0
  102. data/doc/classes/Qbxml/RequestSet.src/M000190.html +22 -0
  103. data/doc/classes/{Quickbooks/Qbxml → Qbxml}/Response.html +51 -51
  104. data/doc/classes/Qbxml/Response.src/M000175.html +24 -0
  105. data/doc/classes/Qbxml/Response.src/M000176.html +19 -0
  106. data/doc/classes/Qbxml/Response.src/M000177.html +55 -0
  107. data/doc/classes/{Quickbooks/Connection.src/M000097.html → Qbxml/Response.src/M000178.html} +4 -4
  108. data/doc/classes/Qbxml/Response.src/M000179.html +18 -0
  109. data/doc/classes/Qbxml/Response.src/M000180.html +18 -0
  110. data/doc/classes/{Quickbooks/Connection.src/M000100.html → Qbxml/Response.src/M000181.html} +4 -4
  111. data/doc/classes/{Quickbooks/Connection.src/M000101.html → Qbxml/Response.src/M000182.html} +4 -4
  112. data/doc/classes/Qbxml/Response.src/M000183.html +63 -0
  113. data/doc/classes/{Quickbooks/Qbxml → Qbxml}/ResponseSet.html +47 -41
  114. data/doc/classes/Qbxml/ResponseSet.src/M000168.html +22 -0
  115. data/doc/classes/Qbxml/ResponseSet.src/M000169.html +26 -0
  116. data/doc/classes/Qbxml/ResponseSet.src/M000170.html +24 -0
  117. data/doc/classes/Qbxml/ResponseSet.src/M000171.html +20 -0
  118. data/doc/classes/Qbxml/ResponseSet.src/M000172.html +27 -0
  119. data/doc/classes/Qbxml/ResponseSet.src/M000173.html +18 -0
  120. data/doc/classes/Qbxml/ResponseSet.src/M000174.html +18 -0
  121. data/doc/classes/Quickbooks.html +24 -10
  122. data/doc/classes/Quickbooks/Address.html +5 -5
  123. data/doc/classes/Quickbooks/Address.src/{M000107.html → M000150.html} +0 -0
  124. data/doc/classes/Quickbooks/Base.html +133 -120
  125. data/doc/classes/Quickbooks/Base.src/{M000080.html → M000131.html} +1 -1
  126. data/doc/classes/Quickbooks/Base.src/M000132.html +20 -0
  127. data/doc/classes/Quickbooks/Base.src/M000133.html +19 -0
  128. data/doc/classes/Quickbooks/Base.src/{M000082.html → M000134.html} +1 -1
  129. data/doc/classes/Quickbooks/Base.src/{M000083.html → M000135.html} +2 -2
  130. data/doc/classes/Quickbooks/Base.src/M000136.html +30 -0
  131. data/doc/classes/Quickbooks/Base.src/{M000085.html → M000137.html} +1 -1
  132. data/doc/classes/Quickbooks/Base.src/{M000086.html → M000138.html} +2 -2
  133. data/doc/classes/Quickbooks/Base.src/{M000087.html → M000139.html} +2 -2
  134. data/doc/classes/Quickbooks/Base.src/{M000088.html → M000140.html} +2 -2
  135. data/doc/classes/Quickbooks/Base.src/{M000089.html → M000141.html} +1 -1
  136. data/doc/classes/Quickbooks/Base.src/{M000090.html → M000142.html} +1 -1
  137. data/doc/classes/Quickbooks/Base.src/{M000091.html → M000143.html} +1 -1
  138. data/doc/classes/Quickbooks/Base.src/{M000092.html → M000144.html} +3 -3
  139. data/doc/classes/Quickbooks/Base.src/{M000093.html → M000145.html} +2 -2
  140. data/doc/classes/Quickbooks/Base.src/{M000094.html → M000146.html} +2 -2
  141. data/doc/classes/Quickbooks/Base.src/{M000095.html → M000147.html} +1 -1
  142. data/doc/classes/Quickbooks/{Qbxml/ResponseSetArrayExt.html → Deleted.html} +14 -6
  143. data/doc/classes/Quickbooks/ListDeleted.html +139 -0
  144. data/doc/classes/Quickbooks/ListDeleted.src/M000149.html +18 -0
  145. data/doc/classes/Quickbooks/ListItem.html +11 -11
  146. data/doc/classes/Quickbooks/ListItem.src/M000129.html +19 -0
  147. data/doc/classes/Quickbooks/ListItem.src/{M000079.html → M000130.html} +4 -4
  148. data/doc/classes/Quickbooks/Model.html +110 -110
  149. data/doc/classes/Quickbooks/Model.src/{M000059.html → M000109.html} +4 -3
  150. data/doc/classes/Quickbooks/Model.src/{M000060.html → M000110.html} +2 -2
  151. data/doc/classes/Quickbooks/Model.src/{M000061.html → M000111.html} +2 -2
  152. data/doc/classes/Quickbooks/Model.src/{M000062.html → M000112.html} +3 -2
  153. data/doc/classes/Quickbooks/Model.src/{M000063.html → M000113.html} +1 -1
  154. data/doc/classes/Quickbooks/Model.src/M000114.html +22 -0
  155. data/doc/classes/Quickbooks/Model.src/{M000065.html → M000115.html} +2 -2
  156. data/doc/classes/Quickbooks/Model.src/{M000066.html → M000116.html} +2 -2
  157. data/doc/classes/Quickbooks/Model.src/{M000067.html → M000117.html} +1 -1
  158. data/doc/classes/Quickbooks/Model.src/{M000068.html → M000118.html} +1 -1
  159. data/doc/classes/Quickbooks/Model.src/{M000069.html → M000119.html} +1 -1
  160. data/doc/classes/Quickbooks/Model.src/{M000070.html → M000120.html} +1 -1
  161. data/doc/classes/Quickbooks/Model.src/{M000071.html → M000121.html} +1 -1
  162. data/doc/classes/Quickbooks/Model.src/{M000072.html → M000122.html} +1 -1
  163. data/doc/classes/Quickbooks/Model.src/{M000073.html → M000123.html} +2 -2
  164. data/doc/classes/Quickbooks/Model.src/{M000074.html → M000124.html} +3 -3
  165. data/doc/classes/Quickbooks/Model.src/{M000075.html → M000125.html} +3 -3
  166. data/doc/classes/Quickbooks/Model.src/{M000076.html → M000126.html} +1 -1
  167. data/doc/classes/Quickbooks/Model.src/{M000077.html → M000127.html} +1 -1
  168. data/doc/classes/{QBHelpers.html → Quickbooks/OleAdapter.html} +19 -9
  169. data/doc/classes/Quickbooks/{Connection.html → OleAdapter/Connection.html} +80 -106
  170. data/doc/classes/Quickbooks/{Qbxml/Response.src/M000044.html → OleAdapter/Connection.src/M000094.html} +4 -4
  171. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000095.html +19 -0
  172. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000096.html +24 -0
  173. data/doc/classes/Quickbooks/{Qbxml/Response.src/M000047.html → OleAdapter/Connection.src/M000097.html} +4 -4
  174. data/doc/classes/Quickbooks/{Qbxml/Response.src/M000048.html → OleAdapter/Connection.src/M000098.html} +4 -4
  175. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000099.html +21 -0
  176. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000100.html +24 -0
  177. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000101.html +20 -0
  178. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000102.html +24 -0
  179. data/doc/classes/Quickbooks/OleAdapter/Connection.src/M000103.html +24 -0
  180. data/doc/classes/{QBHelpers → Quickbooks/OleAdapter}/Ole.html +24 -24
  181. data/doc/classes/Quickbooks/OleAdapter/Ole.src/M000104.html +21 -0
  182. data/doc/classes/Quickbooks/OleAdapter/Ole.src/M000105.html +22 -0
  183. data/doc/classes/Quickbooks/OleAdapter/Ole.src/M000106.html +18 -0
  184. data/doc/classes/Quickbooks/{Qbxml/RequestSetArrayExt.html → QbxmlDebugAdapter.html} +11 -5
  185. data/doc/classes/Quickbooks/QbxmlDebugAdapter/Connection.html +139 -0
  186. data/doc/classes/Quickbooks/{Qbxml/RequestSet.src/M000055.html → QbxmlDebugAdapter/Connection.src/M000093.html} +4 -4
  187. data/doc/classes/Quickbooks/Ref.html +5 -5
  188. data/doc/classes/Quickbooks/Ref.src/{M000096.html → M000148.html} +0 -0
  189. data/doc/classes/Quickbooks/Transaction.html +10 -10
  190. data/doc/classes/Quickbooks/Transaction.src/{M000057.html → M000107.html} +0 -0
  191. data/doc/classes/Quickbooks/Transaction.src/{M000058.html → M000108.html} +0 -0
  192. data/doc/classes/Quickbooks/TxnDeleted.html +139 -0
  193. data/doc/classes/Quickbooks/TxnDeleted.src/M000128.html +18 -0
  194. data/doc/classes/SlashedArray.html +226 -0
  195. data/doc/classes/SlashedArray.src/M000161.html +23 -0
  196. data/doc/classes/SlashedArray.src/M000162.html +18 -0
  197. data/doc/classes/SlashedArray.src/M000163.html +18 -0
  198. data/doc/classes/SlashedArray.src/M000164.html +22 -0
  199. data/doc/classes/SlashedArray.src/M000165.html +22 -0
  200. data/doc/classes/SlashedArray.src/M000166.html +18 -0
  201. data/doc/classes/SlashedArray.src/M000167.html +22 -0
  202. data/doc/classes/SlashedHash.html +193 -0
  203. data/doc/classes/SlashedHash.src/M000156.html +22 -0
  204. data/doc/classes/SlashedHash.src/M000157.html +18 -0
  205. data/doc/classes/SlashedHash.src/M000158.html +18 -0
  206. data/doc/classes/SlashedHash.src/M000159.html +27 -0
  207. data/doc/classes/SlashedHash.src/M000160.html +22 -0
  208. data/doc/classes/String.html +269 -0
  209. data/doc/classes/String.src/M000085.html +18 -0
  210. data/doc/classes/String.src/M000086.html +18 -0
  211. data/doc/classes/String.src/M000087.html +18 -0
  212. data/doc/classes/String.src/M000088.html +18 -0
  213. data/doc/classes/String.src/M000089.html +18 -0
  214. data/doc/classes/String.src/M000090.html +18 -0
  215. data/doc/classes/String.src/M000091.html +18 -0
  216. data/doc/classes/String.src/M000092.html +97 -0
  217. data/doc/classes/UniqueArray.html +193 -0
  218. data/doc/classes/UniqueArray.src/M000151.html +25 -0
  219. data/doc/classes/UniqueArray.src/M000152.html +18 -0
  220. data/doc/classes/UniqueArray.src/M000153.html +20 -0
  221. data/doc/classes/UniqueArray.src/M000154.html +20 -0
  222. data/doc/classes/UniqueArray.src/M000155.html +20 -0
  223. data/doc/created.rid +1 -1
  224. data/doc/files/LICENSE.html +2 -2
  225. data/doc/files/lib/{quickbooks/connection_rb.html → qbxml/request_rb.html} +6 -6
  226. data/doc/files/lib/{quickbooks/qbxml_rb.html → qbxml/response_rb.html} +6 -6
  227. data/doc/files/lib/{quickbooks/qbxml/request_rb.html → qbxml/support_rb.html} +6 -7
  228. data/doc/files/lib/qbxml_rb.html +109 -0
  229. data/doc/files/lib/quickbooks/{qbxml/response_rb.html → adapters/ole_adapter_rb.html} +5 -5
  230. data/doc/files/lib/quickbooks/adapters/qbxml_debug_adapter_rb.html +108 -0
  231. data/doc/files/lib/quickbooks/base_rb.html +2 -4
  232. data/doc/files/lib/quickbooks/model_rb.html +2 -1
  233. data/doc/files/lib/quickbooks/models/customer_rb.html +1 -1
  234. data/doc/files/lib/quickbooks/models/deleted_rb.html +101 -0
  235. data/doc/files/lib/quickbooks/models/list_item_rb.html +1 -1
  236. data/doc/files/lib/quickbooks/ruby_magic_rb.html +9 -1
  237. data/doc/files/lib/quickbooks/{ole_helper_rb.html → structure_rb.html} +20 -7
  238. data/doc/files/lib/quickbooks_rb.html +2 -3
  239. data/doc/fr_class_index.html +19 -10
  240. data/doc/fr_file_index.html +8 -5
  241. data/doc/fr_method_index.html +190 -110
  242. data/lib/qbxml.rb +2 -0
  243. data/lib/qbxml/request.rb +205 -0
  244. data/lib/qbxml/response.rb +197 -0
  245. data/lib/qbxml/support.rb +130 -0
  246. data/lib/quickbooks.rb +1 -2
  247. data/lib/quickbooks/adapters/ole_adapter.rb +148 -0
  248. data/lib/quickbooks/adapters/qbxml_debug_adapter.rb +10 -0
  249. data/lib/quickbooks/base.rb +33 -24
  250. data/lib/quickbooks/model.rb +20 -13
  251. data/lib/quickbooks/models/customer.rb +1 -1
  252. data/lib/quickbooks/models/deleted.rb +22 -0
  253. data/lib/quickbooks/models/list_item.rb +29 -27
  254. data/lib/quickbooks/ruby_magic.rb +31 -28
  255. data/lib/quickbooks/structure.rb +393 -0
  256. metadata +242 -127
  257. data/doc/classes/Class.src/M000027.html +0 -18
  258. data/doc/classes/QBHelpers/Ole.src/M000108.html +0 -21
  259. data/doc/classes/QBHelpers/Ole.src/M000109.html +0 -22
  260. data/doc/classes/QBHelpers/Ole.src/M000110.html +0 -18
  261. data/doc/classes/Quickbooks/Base.src/M000081.html +0 -18
  262. data/doc/classes/Quickbooks/Base.src/M000084.html +0 -23
  263. data/doc/classes/Quickbooks/Connection.src/M000098.html +0 -19
  264. data/doc/classes/Quickbooks/Connection.src/M000099.html +0 -24
  265. data/doc/classes/Quickbooks/Connection.src/M000102.html +0 -21
  266. data/doc/classes/Quickbooks/Connection.src/M000103.html +0 -24
  267. data/doc/classes/Quickbooks/Connection.src/M000105.html +0 -24
  268. data/doc/classes/Quickbooks/Connection.src/M000106.html +0 -24
  269. data/doc/classes/Quickbooks/ListItem.src/M000078.html +0 -19
  270. data/doc/classes/Quickbooks/Model.src/M000064.html +0 -18
  271. data/doc/classes/Quickbooks/Qbxml/Request.src/M000050.html +0 -34
  272. data/doc/classes/Quickbooks/Qbxml/Request.src/M000051.html +0 -19
  273. data/doc/classes/Quickbooks/Qbxml/Request.src/M000052.html +0 -81
  274. data/doc/classes/Quickbooks/Qbxml/RequestSet.src/M000053.html +0 -22
  275. data/doc/classes/Quickbooks/Qbxml/RequestSet.src/M000054.html +0 -26
  276. data/doc/classes/Quickbooks/Qbxml/RequestSet.src/M000056.html +0 -22
  277. data/doc/classes/Quickbooks/Qbxml/Response.src/M000041.html +0 -24
  278. data/doc/classes/Quickbooks/Qbxml/Response.src/M000042.html +0 -19
  279. data/doc/classes/Quickbooks/Qbxml/Response.src/M000043.html +0 -44
  280. data/doc/classes/Quickbooks/Qbxml/Response.src/M000045.html +0 -18
  281. data/doc/classes/Quickbooks/Qbxml/Response.src/M000046.html +0 -18
  282. data/doc/classes/Quickbooks/Qbxml/Response.src/M000049.html +0 -63
  283. data/doc/classes/Quickbooks/Qbxml/ResponseSet.src/M000034.html +0 -22
  284. data/doc/classes/Quickbooks/Qbxml/ResponseSet.src/M000035.html +0 -26
  285. data/doc/classes/Quickbooks/Qbxml/ResponseSet.src/M000036.html +0 -24
  286. data/doc/classes/Quickbooks/Qbxml/ResponseSet.src/M000037.html +0 -18
  287. data/doc/classes/Quickbooks/Qbxml/ResponseSet.src/M000038.html +0 -27
  288. data/doc/classes/Quickbooks/Qbxml/ResponseSet.src/M000039.html +0 -18
  289. data/doc/classes/Quickbooks/Qbxml/ResponseSet.src/M000040.html +0 -18
  290. data/lib/quickbooks/connection.rb +0 -105
  291. data/lib/quickbooks/ole_helper.rb +0 -47
  292. data/lib/quickbooks/qbxml.rb +0 -2
  293. data/lib/quickbooks/qbxml/request.rb +0 -169
  294. data/lib/quickbooks/qbxml/response.rb +0 -185
@@ -0,0 +1,10 @@
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
@@ -67,10 +67,8 @@
67
67
  # - VehicleMileage
68
68
  # - VendorCredit
69
69
 
70
- require 'activesupport'
71
- require 'quickbooks/connection'
72
70
  require 'quickbooks/model'
73
- require 'quickbooks/qbxml'
71
+ require 'qbxml'
74
72
 
75
73
  module Quickbooks
76
74
  # Base is just base for ListItem and Transaction. It inherits from Model, just as Ref does.
@@ -78,7 +76,7 @@ module Quickbooks
78
76
 
79
77
  self.filter_aliases = {:limit => :max_returned}
80
78
 
81
- # Stores a log of Quickbooks::Qbxml::Response objects that were a result of methods performed on this object.
79
+ # Stores a log of Qbxml::Response objects that were a result of methods performed on this object.
82
80
  attr_accessor :response_log
83
81
  def response_log #:nodoc:
84
82
  @response_log || (@response_log = [])
@@ -93,13 +91,16 @@ module Quickbooks
93
91
  end
94
92
  class << self
95
93
 
96
- # def inherited(klass)
97
- # super
98
- # end
94
+ def use_adapter(adapter)
95
+ # Should complain if the adapter doesn't exist.
96
+ require "#{File.dirname(__FILE__)}/adapters/#{adapter.to_s}_adapter"
97
+ @@connection_adapter = Object.module_eval("::Quickbooks::#{adapter.to_s.camelize}Adapter::Connection", __FILE__, __LINE__)
98
+ end
99
99
 
100
100
  # Establishes a connection to the Quickbooks RDS Server for all Model Classes
101
- def establish_connection(application_name='RubyApplication', file='', user='', password='', connection_type='localQBD', connection_mode='DoNotCare')
102
- @@connection = Connection.new(application_name, file, user, password, connection_type, connection_mode)
101
+ def establish_connection(*args)
102
+ @@connection_adapter ||= use_adapter(:ole)
103
+ @@connection = @@connection_adapter.new(*args)
103
104
  end
104
105
 
105
106
  # Returns the current Connection
@@ -113,25 +114,32 @@ module Quickbooks
113
114
  # you can use this method to explicitly set the connection in a class that inherits from Quickbooks::Base.
114
115
  # Quickbooks::Models::Base.connection = Quickbooks::Connection.new('My Test App', 'C:\\Some File.QBW', 'user', 'pass')
115
116
  def connection=(conn)
116
- raise ArgumentError, "Cannot set connection to anything but a Quickbooks::Connection object" unless conn.is_a?(Quickbooks::Connection)
117
+ raise ArgumentError, "Cannot set connection to anything but a (*)Adapter::Connection object" unless conn.class.name =~ /Adapter::Connection$/
117
118
  @connection = conn
118
119
  end
119
120
 
120
- # Generates a request by sending *args to Quickbooks::Qbxml::Request.new, sends the request over the current connection,
121
- # and interprets the response using Quickbooks::Qbxml::ResponseSet.
121
+ # Generates a request by sending *args to Qbxml::Request.new, sends the request over the current connection,
122
+ # and interprets the response using Qbxml::ResponseSet.
122
123
  # The response is then instantiated into an object or an array of objects.
123
124
  #
124
125
  # This method is used mostly internally, but it is the yoke of this library - use it to perform custom requests.
125
- def request_and_instantiate(obj_or_args,*args)
126
+ def query(obj_or_args,*args)
126
127
  # If an object is sent, we need to reinstantiate the response into that object
127
- reinstantiate = obj_or_args.is_a?(Quickbooks::Base) ? obj_or_args : nil
128
+ reinstantiate = if obj_or_args.is_a?(Quickbooks::Base)
129
+ obj_or_args
130
+ elsif obj_or_args.is_a?(Class)
131
+ nil
132
+ else
133
+ args.unshift(obj_or_args)
134
+ nil
135
+ end
128
136
  objects = [] # This will hold and return the instantiated objects from the quickbooks response
129
137
  # The following is subject to bugginess, IF the response contains more than one object: it will instantiate only the last one.
130
- self.request(obj_or_args, *args).each { |response| objects << response.instantiate(reinstantiate) } # Does not instantiate if it's an error, but simply records response into response_log
138
+ 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
131
139
  objects.length == 1 ? objects[0] : objects
132
140
  end
133
141
 
134
- # Generates a request using Quickbooks::Qbxml::Request, sends it, and returns a Quickbooks::Qbxml::ResponseSet object containing the response(s).
142
+ # Generates a request using Qbxml::Request, sends it, and returns a Qbxml::ResponseSet object containing the response(s).
135
143
  def request(*args)
136
144
  Qbxml::ResponseSet.new(
137
145
  self.connection.send_xml(
@@ -154,19 +162,19 @@ module Quickbooks
154
162
  obj.original_values[key.to_s.underscore] = obj.instance_variable_get('@' + key.to_s.underscore).dup
155
163
  end
156
164
  end if attrs
157
- obj # Will be either a nice object, or a Quickbooks::Qbxml::Error object.
165
+ obj # Will be either a nice object, or a Qbxml::Error object.
158
166
  end
159
167
 
160
168
  # 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.
161
169
  def all(filters={})
162
170
  filters.reverse_merge!(:active_status => 'All')
163
- [request_and_instantiate(self, :query, filters)].flatten
171
+ [query(self, :query, filters)].flatten
164
172
  end
165
173
 
166
174
  # 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.
167
175
  def first(filters={})
168
176
  (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)
169
- request_and_instantiate(self, :query, filters)
177
+ query(self, :query, filters)
170
178
  end
171
179
 
172
180
  # 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.
@@ -194,7 +202,7 @@ module Quickbooks
194
202
  return false unless dirty?
195
203
  self.errors.clear # Clear out any errors: start with a clean slate!
196
204
  if new_record?
197
- self.class.request_and_instantiate(self, :add)
205
+ self.class.query(self, :add)
198
206
  ret = !dirty?
199
207
  @new_record = false if ret
200
208
  else
@@ -204,7 +212,7 @@ module Quickbooks
204
212
  # 3) Replace self's original_attributes with those just retrieved, and update the automatic attributes, like EditSequence and TimeModified
205
213
  # 4) Return false, return the object dirty but ready to save
206
214
  old_originals = original_values.dup # Save the old_originals so we can detect any attributes that changed since we last loaded the object
207
- ret = self.class.request_and_instantiate(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
215
+ 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
208
216
  # 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!
209
217
  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
210
218
  # 'Revert' fields I didn't modify to equal the values of the more up-to-date record just loaded.
@@ -223,12 +231,13 @@ module Quickbooks
223
231
 
224
232
  # Reloads the record from Quickbooks, discarding any changes that have been made to it.
225
233
  def reload
226
- self.class.request_and_instantiate(self, :query)
234
+ self.class.query(self, :query)
227
235
  end
228
236
 
229
- # Destroys a record in Quickbooks. Note that even though Quickbooks will destroy the record, the record's ListID and DeletedTime can be accessed by doing a query for deleted objects of the appropriate type.
237
+ # Destroys a record in Quickbooks. Note that even though Quickbooks will destroy the record,
238
+ # the record's ListID and DeletedTime can be accessed by doing a query for deleted objects of the appropriate type.
230
239
  def destroy
231
- self.class.request_and_instantiate(self, :delete).success?
240
+ self.class.query(self, :delete).success?
232
241
  end
233
242
 
234
243
  # Usual comparison (super), but add in false if either is a new record.
@@ -1,4 +1,5 @@
1
1
  require 'quickbooks/ruby_magic'
2
+ require 'quickbooks/structure'
2
3
  module Quickbooks
3
4
  CAMELIZE_EXCEPTIONS = {'list_id' => 'ListID', 'txn_id' => 'TxnID', 'owner_id' => 'OwnerID'}
4
5
  # These were all created from the info in qbxmlops70.xml, found in the docs in the QBSDK package.
@@ -7,28 +8,34 @@ module Quickbooks
7
8
 
8
9
  def inherited(klass)
9
10
  def klass.valid_filters
10
- superclass.valid_filters + (@valid_filters ||= [])
11
+ (superclass.valid_filters + (@valid_filters ||= [])).flatten_slashes
11
12
  end
12
13
  def klass.filter_aliases
13
- superclass.filter_aliases.merge(@filter_aliases ||= {})
14
+ seed = [superclass.filter_aliases].flatten_slashes.expand_slashes.flatten_slashes
15
+ (seed.empty? ? {} : seed).merge(@filter_aliases ||= {})
14
16
  end
15
17
  klass.instance_variable_set('@object_properties', {})
16
18
  end
17
19
 
18
20
  def valid_filters=(v)
19
- @valid_filters = v.stringify_values!
21
+ @valid_filters = v.stringify_values!.flatten_slashes
20
22
  end
21
23
  def valid_filters
22
- @valid_filters ||= []
24
+ (@valid_filters ||= []).flatten_slashes
23
25
  end
24
26
  def filter_aliases=(v)
25
- @filter_aliases = v.stringify_keys!.stringify_values!
27
+ al = [v].flatten_slashes.expand_slashes.flatten_slashes
28
+ @filter_aliases = al.empty? ? {} : al
26
29
  end
27
30
  def filter_aliases
28
31
  @filter_aliases ||= {}
29
32
  end
30
33
  def camelized_valid_filters
31
- valid_filters.camelize_values(Quickbooks::CAMELIZE_EXCEPTIONS)
34
+ cvf = []
35
+ valid_filters.each do |v|
36
+ cvf << (Quickbooks::CAMELIZE_EXCEPTIONS.has_key?(v) ? Quickbooks::CAMELIZE_EXCEPTIONS[v] : (v.is_a?(Symbol) ? v.to_s.camelize.to_sym : v.split('/').map {|e| e.camelize}.join('/')))
37
+ end
38
+ cvf
32
39
  end
33
40
 
34
41
  # Register multiple read/writable properties at once. For example:
@@ -36,7 +43,7 @@ module Quickbooks
36
43
  # For reference attributes (like parent_ref), use ParentRef - a class constant for that object.
37
44
  # _read_write_ will set the property setter and accessor accordingly.
38
45
  def read_write(*args)
39
- if args.blank?
46
+ if args.empty?
40
47
  @read_write || (@read_write = [])
41
48
  else
42
49
  args.each do |prop|
@@ -55,7 +62,7 @@ module Quickbooks
55
62
 
56
63
  # Read-only attributes: These are attributes, but not modifiable in Quickbooks
57
64
  def read_only(*args)
58
- if args.blank?
65
+ if args.empty?
59
66
  @read_only || (@read_only = [])
60
67
  else
61
68
  args.each do |prop|
@@ -118,7 +125,7 @@ module Quickbooks
118
125
  # Returns a hash of the attributes and their (new) values that have been changed since the object was last loaded or updated from Quickbooks.
119
126
  # If you send in some attributes, it will compare to those given instead of original_attributes.
120
127
  def dirty_attributes(compare={})
121
- compare = original_values if compare.blank?
128
+ compare = original_values if compare.empty?
122
129
  pairs = {}
123
130
  self.class.read_write.each do |column|
124
131
  value = instance_variable_get('@' + column.to_s)
@@ -134,12 +141,12 @@ module Quickbooks
134
141
  self.dirty_attributes.each do |key,value|
135
142
  if value.is_a?(Quickbooks::Model)
136
143
  h = value.to_dirty_hash
137
- hsh[key] = h unless h.blank?
144
+ hsh[key] = h unless h.empty?
138
145
  else
139
146
  hsh[key] = value
140
147
  end
141
148
  end
142
- hsh.order!(self.class.read_write.stringify_values)
149
+ hsh.ordered!(self.class.read_write.stringify_values)
143
150
  hsh
144
151
  end
145
152
 
@@ -148,12 +155,12 @@ module Quickbooks
148
155
  self.attributes(include_read_only).each do |key,value|
149
156
  if value.is_a?(Quickbooks::Model)
150
157
  h = value.to_hash(include_read_only)
151
- hsh[key] = h unless h.blank?
158
+ hsh[key] = h unless h.empty?
152
159
  else
153
160
  hsh[key] = value
154
161
  end
155
162
  end
156
- hsh.order!((include_read_only ? self.class.read_only + self.class.read_write : self.class.read_write).stringify_values)
163
+ hsh.ordered!((include_read_only ? self.class.read_only + self.class.read_write : self.class.read_write).stringify_values)
157
164
  hsh
158
165
  end
159
166
 
@@ -4,7 +4,7 @@ require 'quickbooks/models/customer/credit_card_info'
4
4
 
5
5
  module Quickbooks
6
6
  class Customer < ListItem
7
- self.valid_filters = [:active_status, :from_modified_date, :to_modified_date, :name_filter, :name_range_filter, :total_balance_filter]
7
+ self.valid_filters = ['active_status', 'from_modified_date', 'to_modified_date', 'name_filter', 'name_range_filter', 'total_balance_filter']
8
8
 
9
9
  # Properties are in the order required by QBXML
10
10
  read_write :name,
@@ -0,0 +1,22 @@
1
+ module Quickbooks
2
+ class Deleted < Base
3
+ self.filter_aliases = {'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,33 +1,35 @@
1
- class Quickbooks::ListItem < Quickbooks::Base
1
+ module Quickbooks
2
+ class ListItem < Base
2
3
 
3
- self.valid_filters = [:list_id, :full_name]
4
- self.filter_aliases = {:modified_after => :from_modified_date, :modified_before => :to_modified_date}
4
+ self.valid_filters = ['list_id', 'full_name']
5
+ self.filter_aliases = {'updated_after' => 'from_modified_date', 'updated_before' => 'to_modified_date'}
5
6
 
6
- def self.inherited(klass)
7
- super
8
- klass.read_only :list_id, :full_name, :edit_sequence, :time_created, :time_modified
9
- end
10
-
11
- class << self
12
- def ListOrTxn
13
- 'List'
7
+ def self.inherited(klass)
8
+ super
9
+ klass.read_only :list_id, :full_name, :edit_sequence, :time_created, :time_modified, :time_deleted # :time_deleted only comes from ListDeleted, but ListDeleted attributes can be instantiated into ListItems
14
10
  end
15
11
 
16
- # def child_types
17
- # [ "Account", "Account List", "BillingRate",
18
- # "Class", "Currency", "Customer",
19
- # "CustomerMessage", "CustomerType",
20
- # "DateDrivenTerms", "Employee", "ItemDiscount",
21
- # "ItemFixedAsset", "ItemGroup", "ItemInventory",
22
- # "ItemInventoryAssembly", "ItemNonInventory",
23
- # "ItemOtherCharge", "ItemPayment", "ItemSalesTax",
24
- # "ItemSalesTaxGroup", "ItemService", "ItemSubtotal",
25
- # "JobType", "OtherName", "PaymentMethod",
26
- # "PayrollItemNonWage", "PayrollItemWage", "PriceLevel",
27
- # "SalesRep", "SalesTaxCode", "ShipMethod",
28
- # "StandardTerms", "TaxCode", "Template", "ToDo",
29
- # "Vehicle", "Vendor", "VendorType"
30
- # ]
31
- # end
12
+ class << self
13
+ def ListOrTxn
14
+ 'List'
15
+ end
16
+
17
+ # def child_types
18
+ # [ "Account", "Account List", "BillingRate",
19
+ # "Class", "Currency", "Customer",
20
+ # "CustomerMessage", "CustomerType",
21
+ # "DateDrivenTerms", "Employee", "ItemDiscount",
22
+ # "ItemFixedAsset", "ItemGroup", "ItemInventory",
23
+ # "ItemInventoryAssembly", "ItemNonInventory",
24
+ # "ItemOtherCharge", "ItemPayment", "ItemSalesTax",
25
+ # "ItemSalesTaxGroup", "ItemService", "ItemSubtotal",
26
+ # "JobType", "OtherName", "PaymentMethod",
27
+ # "PayrollItemNonWage", "PayrollItemWage", "PriceLevel",
28
+ # "SalesRep", "SalesTaxCode", "ShipMethod",
29
+ # "StandardTerms", "TaxCode", "Template", "ToDo",
30
+ # "Vehicle", "Vendor", "VendorType"
31
+ # ]
32
+ # end
33
+ end
32
34
  end
33
35
  end
@@ -1,5 +1,7 @@
1
1
  # This file contains several little tidbits of magic that I've made to make certain things easier.
2
2
  # See Object, Class, and Hash.
3
+ require 'time'
4
+ require 'date'
3
5
 
4
6
  class Object
5
7
  # This allows one to effectively 'proxy' specific methods to be called on the return value of one of its methods.
@@ -39,17 +41,17 @@ class Object
39
41
  @errors ||= []
40
42
  end
41
43
  def error?
42
- !@errors.blank?
44
+ !@errors.empty?
43
45
  end
44
46
  end
45
47
 
46
48
  class Class
47
49
  # Returns the class name without the module names that precede it. I'm sure there's a builtin way to do this, but I couldn't find it and this works just as reliably!
48
50
  # Examples:
49
- # - Quickbooks::Qbxml::Request.class_leaf_name # => 'Request'
51
+ # - Qbxml::Request.class_leaf_name # => 'Request'
50
52
  # - Quickbooks::Customer.class_leaf_name # => 'Customer'
51
53
  def class_leaf_name
52
- self.name[self.parent.name.length+2,self.name.length-self.parent.name.length-2]
54
+ name.split('::')[-1]
53
55
  end
54
56
  end
55
57
 
@@ -65,6 +67,16 @@ class Hash
65
67
  self
66
68
  end
67
69
 
70
+ def stringify_keys(specials={})
71
+ self.dup.stringify_keys!(specials)
72
+ end
73
+ def stringify_keys!(specials={})
74
+ self.each_key do |k|
75
+ self[specials.has_key?(k) ? specials[k] : k.to_s] = self.delete(k)
76
+ end
77
+ self
78
+ end
79
+
68
80
  def underscore_keys(specials={})
69
81
  self.dup.underscore_keys!(specials)
70
82
  end
@@ -116,29 +128,11 @@ class Hash
116
128
  self
117
129
  end
118
130
 
119
- # Sets a static order for any group operations on the hash, specifically: keys, values, each, each_key, and each_value
120
- def order!(*keys_in_order)
121
- self.instance_variable_set('@keys_in_order', keys_in_order.flatten & self.keys) # (only the keys_in_order that are currently existing keys)
122
- class << self
123
- def keys
124
- @keys_in_order
125
- end
126
- def values
127
- self.keys.collect {|k| self[k]}
128
- end
129
- def each(&block)
130
- self.keys.each do |k|
131
- block.call(k, self[k])
132
- end
133
- end
134
- def each_key(&block)
135
- self.keys.each &block
136
- end
137
- def each_value(&block)
138
- self.values.each &block
139
- end
140
- end
141
- self
131
+ def reverse_merge(hsh)
132
+ hsh.dup.merge(self)
133
+ end
134
+ def reverse_merge!(hsh)
135
+ self.replace(hsh.merge(self))
142
136
  end
143
137
 
144
138
  def transform_keys(trans_hash)
@@ -169,7 +163,7 @@ class Array
169
163
  values.flatten!
170
164
  i = 0
171
165
  while i <= length-1 do
172
- self[i].is_one_of?(values) ? i += 1 : self.slice!(i)
166
+ (self[i].is_one_of?(values) || collect[i].is_one_of?(values)) ? i += 1 : self.slice!(i)
173
167
  end
174
168
  self
175
169
  end
@@ -179,7 +173,7 @@ class Array
179
173
  end
180
174
  def camelize_values!(specials={})
181
175
  self.each_with_index do |v,i|
182
- self[i] = specials.has_key?(v) ? specials[v] : (v.is_a?(Symbol) ? v.to_s.camelcase.to_sym : v.camelcase)
176
+ self[i] = specials.has_key?(v) ? specials[v] : (v.is_a?(Symbol) ? v.to_s.camelize.to_sym : v.camelize)
183
177
  end
184
178
  self
185
179
  end
@@ -191,3 +185,12 @@ class Array
191
185
  self.replace(ordered.flatten!.only!(self))
192
186
  end
193
187
  end
188
+
189
+ class String
190
+ def underscore
191
+ gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase
192
+ end
193
+ def camelize
194
+ gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
195
+ end
196
+ end