ledger_sync 1.3.2 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (988) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +13 -2
  3. data/.rubocop.yml +14 -1
  4. data/.rubocop_todo.yml +0 -3
  5. data/.travis.yml +7 -2
  6. data/Dockerfile +2 -2
  7. data/Gemfile.lock +61 -55
  8. data/LICENSE.txt +5 -21
  9. data/README.md +9 -393
  10. data/bin/quickbooks_online_oauth_server.rb +102 -0
  11. data/docs/CNAME +1 -0
  12. data/docs/assets/css/brands.min.css +5 -0
  13. data/docs/assets/css/fontawesome.min.css +5 -0
  14. data/docs/assets/css/main.css +1924 -0
  15. data/docs/assets/css/monokai.css +441 -0
  16. data/docs/assets/js/main.js +214 -0
  17. data/docs/assets/js/plugins.js +22 -0
  18. data/docs/assets/js/prism.js +9 -0
  19. data/docs/assets/webfonts/fa-brands-400.eot +0 -0
  20. data/docs/assets/webfonts/fa-brands-400.svg +3452 -0
  21. data/docs/assets/webfonts/fa-brands-400.ttf +0 -0
  22. data/docs/assets/webfonts/fa-brands-400.woff +0 -0
  23. data/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
  24. data/docs/blog/index.html +282 -0
  25. data/docs/guides/architecture/clients/index.html +458 -0
  26. data/docs/guides/architecture/index.html +435 -0
  27. data/docs/guides/architecture/operations/index.html +465 -0
  28. data/docs/guides/architecture/resources/index.html +461 -0
  29. data/docs/guides/architecture/results/index.html +426 -0
  30. data/docs/guides/architecture/searchers/index.html +446 -0
  31. data/docs/guides/architecture/serialization/index.html +476 -0
  32. data/docs/guides/community/index.html +412 -0
  33. data/docs/guides/contribute/console/index.html +424 -0
  34. data/docs/guides/contribute/deployment/index.html +434 -0
  35. data/docs/guides/contribute/documentation/index.html +450 -0
  36. data/docs/guides/contribute/index.html +434 -0
  37. data/docs/guides/contribute/qa/index.html +436 -0
  38. data/docs/guides/contribute/testing/index.html +424 -0
  39. data/docs/guides/customization/custom_resources/index.html +461 -0
  40. data/docs/guides/customization/custom_serializers/index.html +460 -0
  41. data/docs/guides/customization/index.html +431 -0
  42. data/docs/guides/customization/resource_converters/index.html +491 -0
  43. data/docs/guides/getting-started/get-help/index.html +427 -0
  44. data/docs/guides/getting-started/index.html +421 -0
  45. data/docs/guides/getting-started/installation/index.html +433 -0
  46. data/docs/guides/getting-started/quick-start/index.html +531 -0
  47. data/docs/guides/index.html +428 -0
  48. data/docs/guides/ledgers/index.html +429 -0
  49. data/docs/guides/ledgers/netsuite/index.html +424 -0
  50. data/docs/guides/ledgers/netsuite_soap/index.html +424 -0
  51. data/docs/guides/ledgers/quickbooks_online/index.html +424 -0
  52. data/docs/guides/ledgers/stripe/index.html +424 -0
  53. data/docs/guides/modern-treasury/index.html +411 -0
  54. data/docs/guides/tips_and_more/index.html +471 -0
  55. data/docs/images/1.jpg +0 -0
  56. data/docs/images/10.jpg +0 -0
  57. data/docs/images/2.jpg +0 -0
  58. data/docs/images/3.jpg +0 -0
  59. data/docs/images/4.jpg +0 -0
  60. data/docs/images/5.jpg +0 -0
  61. data/docs/images/6.jpg +0 -0
  62. data/docs/images/7.jpg +0 -0
  63. data/docs/images/8.jpg +0 -0
  64. data/docs/images/9.jpg +0 -0
  65. data/docs/images/logo.svg +8 -0
  66. data/docs/index.html +379 -0
  67. data/docs/overview/index.html +409 -0
  68. data/docs/posts/introducing-docs/index.html +270 -0
  69. data/docs/posts/netsuite-authentication/index.html +624 -0
  70. data/docs/reference/architecture/clients/index.html +332 -0
  71. data/docs/reference/architecture/index.html +311 -0
  72. data/docs/reference/architecture/operations/index.html +302 -0
  73. data/docs/reference/architecture/resources/index.html +335 -0
  74. data/docs/reference/architecture/results/index.html +302 -0
  75. data/docs/reference/architecture/searchers/index.html +302 -0
  76. data/docs/reference/architecture/serialization/index.html +302 -0
  77. data/docs/reference/index.html +281 -0
  78. data/docs/reference/netsuite/authentication/index.html +392 -0
  79. data/docs/reference/netsuite/authentication/token_based_authentication/index.html +486 -0
  80. data/docs/reference/netsuite/index.html +388 -0
  81. data/docs/reference/netsuite/resources/account/index.html +484 -0
  82. data/docs/reference/netsuite/resources/check/index.html +492 -0
  83. data/docs/reference/netsuite/resources/check_line_item/index.html +460 -0
  84. data/docs/reference/netsuite/resources/currency/index.html +476 -0
  85. data/docs/reference/netsuite/resources/customer/index.html +488 -0
  86. data/docs/reference/netsuite/resources/customer_deposit/index.html +480 -0
  87. data/docs/reference/netsuite/resources/department/index.html +484 -0
  88. data/docs/reference/netsuite/resources/deposit/index.html +468 -0
  89. data/docs/reference/netsuite/resources/deposit_line_item/index.html +460 -0
  90. data/docs/reference/netsuite/resources/index.html +436 -0
  91. data/docs/reference/netsuite/resources/invoice/index.html +468 -0
  92. data/docs/reference/netsuite/resources/invoice_line_item/index.html +456 -0
  93. data/docs/reference/netsuite/resources/item/index.html +444 -0
  94. data/docs/reference/netsuite/resources/journal_entry/index.html +488 -0
  95. data/docs/reference/netsuite/resources/journal_entry_line_item/index.html +464 -0
  96. data/docs/reference/netsuite/resources/ledger_class/index.html +484 -0
  97. data/docs/reference/netsuite/resources/location/index.html +468 -0
  98. data/docs/reference/netsuite/resources/resource/index.html +440 -0
  99. data/docs/reference/netsuite/resources/subsidiary/index.html +448 -0
  100. data/docs/reference/netsuite/resources/vendor/index.html +492 -0
  101. data/docs/reference/netsuite_soap/index.html +303 -0
  102. data/docs/reference/netsuite_soap/resources/customer/index.html +364 -0
  103. data/docs/reference/netsuite_soap/resources/index.html +316 -0
  104. data/docs/reference/netsuite_soap/resources/resource/index.html +336 -0
  105. data/docs/reference/netsuite_soap/resources/subsidiary/index.html +356 -0
  106. data/docs/reference/quickbooks_online/authentication/index.html +442 -0
  107. data/docs/reference/quickbooks_online/errors/index.html +395 -0
  108. data/docs/reference/quickbooks_online/index.html +393 -0
  109. data/docs/reference/quickbooks_online/resources/account/index.html +530 -0
  110. data/docs/reference/quickbooks_online/resources/bill/index.html +534 -0
  111. data/docs/reference/quickbooks_online/resources/bill_line_item/index.html +496 -0
  112. data/docs/reference/quickbooks_online/resources/bill_payment/index.html +550 -0
  113. data/docs/reference/quickbooks_online/resources/bill_payment_line_item/index.html +488 -0
  114. data/docs/reference/quickbooks_online/resources/currency/index.html +492 -0
  115. data/docs/reference/quickbooks_online/resources/customer/index.html +514 -0
  116. data/docs/reference/quickbooks_online/resources/department/index.html +518 -0
  117. data/docs/reference/quickbooks_online/resources/deposit/index.html +526 -0
  118. data/docs/reference/quickbooks_online/resources/deposit_line_item/index.html +500 -0
  119. data/docs/reference/quickbooks_online/resources/expense/index.html +538 -0
  120. data/docs/reference/quickbooks_online/resources/expense_line_item/index.html +496 -0
  121. data/docs/reference/quickbooks_online/resources/index.html +484 -0
  122. data/docs/reference/quickbooks_online/resources/invoice/index.html +526 -0
  123. data/docs/reference/quickbooks_online/resources/invoice_sales_line_item/index.html +496 -0
  124. data/docs/reference/quickbooks_online/resources/item/index.html +484 -0
  125. data/docs/reference/quickbooks_online/resources/journal_entry/index.html +518 -0
  126. data/docs/reference/quickbooks_online/resources/journal_entry_line_item/index.html +504 -0
  127. data/docs/reference/quickbooks_online/resources/ledger_class/index.html +518 -0
  128. data/docs/reference/quickbooks_online/resources/payment/index.html +538 -0
  129. data/docs/reference/quickbooks_online/resources/payment_line_item/index.html +488 -0
  130. data/docs/reference/quickbooks_online/resources/preferences/index.html +526 -0
  131. data/docs/reference/quickbooks_online/resources/primary_email_addr/index.html +484 -0
  132. data/docs/reference/quickbooks_online/resources/primary_phone/index.html +484 -0
  133. data/docs/reference/quickbooks_online/resources/resource/index.html +480 -0
  134. data/docs/reference/quickbooks_online/resources/subsidiary/index.html +488 -0
  135. data/docs/reference/quickbooks_online/resources/transfer/index.html +522 -0
  136. data/docs/reference/quickbooks_online/resources/vendor/index.html +526 -0
  137. data/docs/reference/quickbooks_online/webhooks/index.html +427 -0
  138. data/docs/reference/stripe/index.html +293 -0
  139. data/docs/reference/stripe/resources/customer/index.html +366 -0
  140. data/docs/reference/stripe/resources/index.html +309 -0
  141. data/docs/reference/stripe/resources/resource/index.html +330 -0
  142. data/docs/style-guide/index.html +375 -0
  143. data/documentation/build.sh +8 -0
  144. data/documentation/generate.rb +32 -0
  145. data/documentation/generators/generator.rb +80 -0
  146. data/documentation/generators/guides/generator.rb +36 -0
  147. data/documentation/generators/reference/generator.rb +76 -0
  148. data/documentation/generators/reference/ledger/generator.rb +74 -0
  149. data/documentation/generators/template.rb +22 -0
  150. data/documentation/helper_methods.rb +17 -0
  151. data/documentation/site/CNAME +1 -0
  152. data/documentation/site/Gemfile +11 -0
  153. data/documentation/site/Gemfile.lock +69 -0
  154. data/documentation/site/LICENSE.md +40 -0
  155. data/documentation/site/README.md +8 -0
  156. data/documentation/site/_config.yml +119 -0
  157. data/documentation/site/_data/guides_sections.yml +10 -0
  158. data/documentation/site/_data/reference_sections.yml +5 -0
  159. data/documentation/site/_includes/action_link.html +11 -0
  160. data/documentation/site/_includes/alerts/base.html +3 -0
  161. data/documentation/site/_includes/alerts/danger.html +1 -0
  162. data/documentation/site/_includes/alerts/info.html +1 -0
  163. data/documentation/site/_includes/alerts/success.html +1 -0
  164. data/documentation/site/_includes/alerts/warning.html +1 -0
  165. data/documentation/site/_includes/cta_buttons.html +4 -0
  166. data/documentation/site/_includes/example.md +8 -0
  167. data/documentation/site/_includes/footer.html +20 -0
  168. data/documentation/site/_includes/getting_help.md +8 -0
  169. data/documentation/site/_includes/guides_menu.html +29 -0
  170. data/documentation/site/_includes/guides_submenu.html +7 -0
  171. data/documentation/site/_includes/header.html +35 -0
  172. data/documentation/site/_includes/installation_instructions.md +17 -0
  173. data/documentation/site/_includes/ledgers/Stripe_summary.md +1 -0
  174. data/documentation/site/_includes/ledgers/netsuite_soap_summary.md +1 -0
  175. data/documentation/site/_includes/ledgers/netsuite_summary.md +1 -0
  176. data/documentation/site/_includes/ledgers/netsuite_summary_shared.md +1 -0
  177. data/documentation/site/_includes/ledgers/quickbooks_online_summary.md +1 -0
  178. data/documentation/site/_includes/reference/netsuite/authentication/_token_based_authentication.md +99 -0
  179. data/documentation/site/_includes/reference/netsuite/authentication/index.md +15 -0
  180. data/documentation/site/_includes/reference/netsuite/authentication/token_based_authentication.md +6 -0
  181. data/documentation/site/_includes/reference/netsuite/index.md +25 -0
  182. data/documentation/site/_includes/reference/netsuite_soap/index.md +11 -0
  183. data/documentation/site/_includes/reference/quickbooks_online/authentication/index.md +55 -0
  184. data/documentation/site/_includes/reference/quickbooks_online/errors/index.md +9 -0
  185. data/documentation/site/_includes/reference/quickbooks_online/index.md +6 -0
  186. data/documentation/site/_includes/reference/quickbooks_online/webhooks/index.md +42 -0
  187. data/documentation/site/_includes/reference/stripe/index.md +6 -0
  188. data/documentation/site/_includes/section_content.html +34 -0
  189. data/documentation/site/_includes/section_cta.html +28 -0
  190. data/documentation/site/_includes/section_grid.html +60 -0
  191. data/documentation/site/_includes/section_guides.html +35 -0
  192. data/documentation/site/_includes/section_hero.html +28 -0
  193. data/documentation/site/_includes/submenu.html +8 -0
  194. data/documentation/site/_layouts/advanced.html +9 -0
  195. data/documentation/site/_layouts/base.html +34 -0
  196. data/documentation/site/_layouts/blog.html +51 -0
  197. data/documentation/site/_layouts/body.html +11 -0
  198. data/documentation/site/_layouts/guides.html +46 -0
  199. data/documentation/site/_layouts/page.html +26 -0
  200. data/documentation/site/_layouts/post.html +52 -0
  201. data/documentation/site/_layouts/reference.html +46 -0
  202. data/documentation/site/_layouts/reference_netsuite.html +46 -0
  203. data/documentation/site/_layouts/reference_netsuite_soap.html +46 -0
  204. data/documentation/site/_layouts/reference_quickbooks_online.html +46 -0
  205. data/documentation/site/_layouts/reference_stripe.html +46 -0
  206. data/documentation/site/_plugins/filters.rb +122 -0
  207. data/documentation/site/_plugins/hooks.rb +9 -0
  208. data/documentation/site/_posts/2020-06-01-introducing-docs.md +17 -0
  209. data/documentation/site/_posts/2020-06-10-netsuite-authentication.md +382 -0
  210. data/documentation/site/_sass/imports/_animations.scss +19 -0
  211. data/documentation/site/_sass/imports/_footer.scss +94 -0
  212. data/documentation/site/_sass/imports/_functions.scss +69 -0
  213. data/documentation/site/_sass/imports/_general.scss +687 -0
  214. data/documentation/site/_sass/imports/_guides.scss +300 -0
  215. data/documentation/site/_sass/imports/_header.scss +358 -0
  216. data/documentation/site/_sass/imports/_icons.scss +90 -0
  217. data/documentation/site/_sass/imports/_post-navigation.scss +67 -0
  218. data/documentation/site/_sass/imports/_posts-pages.scss +165 -0
  219. data/documentation/site/_sass/imports/_prism.scss +174 -0
  220. data/documentation/site/_sass/imports/_reset.scss +210 -0
  221. data/documentation/site/_sass/imports/_sections.scss +370 -0
  222. data/documentation/site/_sass/imports/_structure.scss +44 -0
  223. data/documentation/site/_templates/_layouts/reference_ledger.html.erb +46 -0
  224. data/documentation/site/_templates/guides/ledger.md.erb +9 -0
  225. data/documentation/site/_templates/reference/resources/index.md.erb +9 -0
  226. data/documentation/site/_templates/reference/resources/resource.md.erb +27 -0
  227. data/documentation/site/assets/css/brands.min.css +5 -0
  228. data/documentation/site/assets/css/fontawesome.min.css +5 -0
  229. data/documentation/site/assets/css/main.scss +45 -0
  230. data/documentation/site/assets/css/monokai.css +441 -0
  231. data/documentation/site/assets/js/main.js +214 -0
  232. data/documentation/site/assets/js/plugins.js +22 -0
  233. data/documentation/site/assets/js/prism.js +9 -0
  234. data/documentation/site/assets/webfonts/fa-brands-400.eot +0 -0
  235. data/documentation/site/assets/webfonts/fa-brands-400.svg +3452 -0
  236. data/documentation/site/assets/webfonts/fa-brands-400.ttf +0 -0
  237. data/documentation/site/assets/webfonts/fa-brands-400.woff +0 -0
  238. data/documentation/site/assets/webfonts/fa-brands-400.woff2 +0 -0
  239. data/documentation/site/blog/index.md +6 -0
  240. data/documentation/site/guides/architecture/clients.md +35 -0
  241. data/documentation/site/guides/architecture/index.md +14 -0
  242. data/documentation/site/guides/architecture/operations.md +45 -0
  243. data/documentation/site/guides/architecture/resources.md +40 -0
  244. data/documentation/site/guides/architecture/results.md +6 -0
  245. data/documentation/site/guides/architecture/searchers.md +28 -0
  246. data/documentation/site/guides/architecture/serialization.md +59 -0
  247. data/documentation/site/guides/community/index.md +8 -0
  248. data/documentation/site/guides/contribute/console.md +6 -0
  249. data/documentation/site/guides/contribute/deployment.md +17 -0
  250. data/documentation/site/guides/contribute/documentation.md +37 -0
  251. data/documentation/site/guides/contribute/index.md +18 -0
  252. data/documentation/site/guides/contribute/qa.md +16 -0
  253. data/documentation/site/guides/contribute/testing.md +6 -0
  254. data/documentation/site/guides/customization/custom_resources.md +50 -0
  255. data/documentation/site/guides/customization/custom_serializers.md +47 -0
  256. data/documentation/site/guides/customization/index.md +15 -0
  257. data/documentation/site/guides/customization/resource_converters.md +79 -0
  258. data/documentation/site/guides/getting-started/get-help.md +7 -0
  259. data/documentation/site/guides/getting-started/index.md +8 -0
  260. data/documentation/site/guides/getting-started/installation.md +7 -0
  261. data/documentation/site/guides/getting-started/quick-start.md +123 -0
  262. data/documentation/site/guides/index.md +16 -0
  263. data/documentation/site/guides/ledgers/index.md +12 -0
  264. data/documentation/site/guides/ledgers/netsuite.md +9 -0
  265. data/documentation/site/guides/ledgers/netsuite_soap.md +9 -0
  266. data/documentation/site/guides/ledgers/quickbooks_online.md +9 -0
  267. data/documentation/site/guides/ledgers/stripe.md +9 -0
  268. data/documentation/site/guides/modern-treasury/index.md +14 -0
  269. data/documentation/site/guides/tips_and_more/index.md +76 -0
  270. data/documentation/site/images/1.jpg +0 -0
  271. data/documentation/site/images/10.jpg +0 -0
  272. data/documentation/site/images/2.jpg +0 -0
  273. data/documentation/site/images/3.jpg +0 -0
  274. data/documentation/site/images/4.jpg +0 -0
  275. data/documentation/site/images/5.jpg +0 -0
  276. data/documentation/site/images/6.jpg +0 -0
  277. data/documentation/site/images/7.jpg +0 -0
  278. data/documentation/site/images/8.jpg +0 -0
  279. data/documentation/site/images/9.jpg +0 -0
  280. data/documentation/site/images/logo.svg +8 -0
  281. data/documentation/site/index.md +99 -0
  282. data/documentation/site/overview.md +21 -0
  283. data/documentation/site/reference/architecture/clients.md +33 -0
  284. data/documentation/site/reference/architecture/index.md +14 -0
  285. data/documentation/site/reference/architecture/operations.md +6 -0
  286. data/documentation/site/reference/architecture/resources.md +38 -0
  287. data/documentation/site/reference/architecture/results.md +6 -0
  288. data/documentation/site/reference/architecture/searchers.md +6 -0
  289. data/documentation/site/reference/architecture/serialization.md +6 -0
  290. data/documentation/site/reference/index.md +6 -0
  291. data/documentation/site/reference/netsuite/authentication/_token_based_authentication.md +99 -0
  292. data/documentation/site/reference/netsuite/authentication/index.md +15 -0
  293. data/documentation/site/reference/netsuite/authentication/token_based_authentication.md +6 -0
  294. data/documentation/site/reference/netsuite/index.md +25 -0
  295. data/documentation/site/reference/netsuite/resources/account.md +38 -0
  296. data/documentation/site/reference/netsuite/resources/check.md +49 -0
  297. data/documentation/site/reference/netsuite/resources/check_line_item.md +23 -0
  298. data/documentation/site/reference/netsuite/resources/currency.md +45 -0
  299. data/documentation/site/reference/netsuite/resources/customer.md +48 -0
  300. data/documentation/site/reference/netsuite/resources/customer_deposit.md +46 -0
  301. data/documentation/site/reference/netsuite/resources/department.md +47 -0
  302. data/documentation/site/reference/netsuite/resources/deposit.md +25 -0
  303. data/documentation/site/reference/netsuite/resources/deposit_line_item.md +23 -0
  304. data/documentation/site/reference/netsuite/resources/index.md +25 -0
  305. data/documentation/site/reference/netsuite/resources/invoice.md +25 -0
  306. data/documentation/site/reference/netsuite/resources/invoice_line_item.md +22 -0
  307. data/documentation/site/reference/netsuite/resources/item.md +19 -0
  308. data/documentation/site/reference/netsuite/resources/journal_entry.md +48 -0
  309. data/documentation/site/reference/netsuite/resources/journal_entry_line_item.md +24 -0
  310. data/documentation/site/reference/netsuite/resources/ledger_class.md +47 -0
  311. data/documentation/site/reference/netsuite/resources/location.md +43 -0
  312. data/documentation/site/reference/netsuite/resources/resource.md +18 -0
  313. data/documentation/site/reference/netsuite/resources/subsidiary.md +20 -0
  314. data/documentation/site/reference/netsuite/resources/vendor.md +49 -0
  315. data/documentation/site/reference/netsuite_soap/index.md +11 -0
  316. data/documentation/site/reference/netsuite_soap/resources/customer.md +34 -0
  317. data/documentation/site/reference/netsuite_soap/resources/index.md +9 -0
  318. data/documentation/site/reference/netsuite_soap/resources/resource.md +18 -0
  319. data/documentation/site/reference/netsuite_soap/resources/subsidiary.md +32 -0
  320. data/documentation/site/reference/quickbooks_online/authentication/index.md +55 -0
  321. data/documentation/site/reference/quickbooks_online/errors/index.md +9 -0
  322. data/documentation/site/reference/quickbooks_online/index.md +6 -0
  323. data/documentation/site/reference/quickbooks_online/resources/account.md +44 -0
  324. data/documentation/site/reference/quickbooks_online/resources/bill.md +45 -0
  325. data/documentation/site/reference/quickbooks_online/resources/bill_line_item.md +22 -0
  326. data/documentation/site/reference/quickbooks_online/resources/bill_payment.md +49 -0
  327. data/documentation/site/reference/quickbooks_online/resources/bill_payment_line_item.md +20 -0
  328. data/documentation/site/reference/quickbooks_online/resources/currency.md +21 -0
  329. data/documentation/site/reference/quickbooks_online/resources/customer.md +40 -0
  330. data/documentation/site/reference/quickbooks_online/resources/department.md +41 -0
  331. data/documentation/site/reference/quickbooks_online/resources/deposit.md +43 -0
  332. data/documentation/site/reference/quickbooks_online/resources/deposit_line_item.md +23 -0
  333. data/documentation/site/reference/quickbooks_online/resources/expense.md +46 -0
  334. data/documentation/site/reference/quickbooks_online/resources/expense_line_item.md +22 -0
  335. data/documentation/site/reference/quickbooks_online/resources/index.md +33 -0
  336. data/documentation/site/reference/quickbooks_online/resources/invoice.md +43 -0
  337. data/documentation/site/reference/quickbooks_online/resources/invoice_sales_line_item.md +22 -0
  338. data/documentation/site/reference/quickbooks_online/resources/item.md +19 -0
  339. data/documentation/site/reference/quickbooks_online/resources/journal_entry.md +41 -0
  340. data/documentation/site/reference/quickbooks_online/resources/journal_entry_line_item.md +24 -0
  341. data/documentation/site/reference/quickbooks_online/resources/ledger_class.md +41 -0
  342. data/documentation/site/reference/quickbooks_online/resources/payment.md +46 -0
  343. data/documentation/site/reference/quickbooks_online/resources/payment_line_item.md +20 -0
  344. data/documentation/site/reference/quickbooks_online/resources/preferences.md +34 -0
  345. data/documentation/site/reference/quickbooks_online/resources/primary_email_addr.md +19 -0
  346. data/documentation/site/reference/quickbooks_online/resources/primary_phone.md +19 -0
  347. data/documentation/site/reference/quickbooks_online/resources/resource.md +18 -0
  348. data/documentation/site/reference/quickbooks_online/resources/subsidiary.md +20 -0
  349. data/documentation/site/reference/quickbooks_online/resources/transfer.md +42 -0
  350. data/documentation/site/reference/quickbooks_online/resources/vendor.md +43 -0
  351. data/documentation/site/reference/quickbooks_online/webhooks/index.md +42 -0
  352. data/documentation/site/reference/stripe/index.md +6 -0
  353. data/documentation/site/reference/stripe/resources/customer.md +45 -0
  354. data/documentation/site/reference/stripe/resources/index.md +8 -0
  355. data/documentation/site/reference/stripe/resources/resource.md +18 -0
  356. data/documentation/site/style-guide.md +137 -0
  357. data/ledger_sync.gemspec +3 -2
  358. data/lib/ledger_sync.rb +46 -58
  359. data/lib/ledger_sync/core_ext/resonad.rb +2 -3
  360. data/lib/ledger_sync/deserializer.rb +108 -0
  361. data/lib/ledger_sync/error.rb +48 -0
  362. data/lib/ledger_sync/error/ledger_errors.rb +72 -0
  363. data/lib/ledger_sync/error/operation_errors.rb +0 -10
  364. data/lib/ledger_sync/error/resource_errors.rb +48 -19
  365. data/lib/ledger_sync/ledger_configuration.rb +61 -0
  366. data/lib/ledger_sync/ledger_configuration_store.rb +56 -0
  367. data/lib/ledger_sync/ledgers/client.rb +112 -0
  368. data/lib/ledger_sync/ledgers/contract.rb +16 -0
  369. data/lib/ledger_sync/ledgers/dashboard_url_helper.rb +23 -0
  370. data/lib/ledger_sync/ledgers/mixins/infer_client_mixin.rb +28 -0
  371. data/lib/ledger_sync/ledgers/mixins/infer_resource_class_mixin.rb +25 -0
  372. data/lib/ledger_sync/ledgers/mixins/infer_serializer_mixin.rb +52 -0
  373. data/lib/ledger_sync/ledgers/mixins/infer_validation_contract_mixin.rb +27 -0
  374. data/lib/ledger_sync/ledgers/mixins/offset_and_limit_pagination_searcher_mixin.rb +37 -0
  375. data/lib/ledger_sync/ledgers/mixins/serialization_mixin.rb +41 -0
  376. data/lib/ledger_sync/ledgers/netsuite/account/deserializer.rb +23 -0
  377. data/lib/ledger_sync/ledgers/netsuite/account/operations/create.rb +28 -0
  378. data/lib/ledger_sync/ledgers/netsuite/account/operations/find.rb +28 -0
  379. data/lib/ledger_sync/ledgers/netsuite/account/searcher.rb +12 -0
  380. data/lib/ledger_sync/ledgers/netsuite/account/searcher_deserializer.rb +29 -0
  381. data/lib/ledger_sync/ledgers/netsuite/account/serializer.rb +21 -0
  382. data/lib/ledger_sync/ledgers/netsuite/check/deserializer.rb +29 -0
  383. data/lib/ledger_sync/ledgers/netsuite/check/operations/create.rb +27 -0
  384. data/lib/ledger_sync/ledgers/netsuite/check/operations/delete.rb +27 -0
  385. data/lib/ledger_sync/ledgers/netsuite/check/operations/find.rb +27 -0
  386. data/lib/ledger_sync/ledgers/netsuite/check/operations/update.rb +27 -0
  387. data/lib/ledger_sync/ledgers/netsuite/check/searcher.rb +15 -0
  388. data/lib/ledger_sync/ledgers/netsuite/check/searcher_deserializer.rb +16 -0
  389. data/lib/ledger_sync/ledgers/netsuite/check/serializer.rb +51 -0
  390. data/lib/ledger_sync/ledgers/netsuite/check_line_item/deserializer.rb +17 -0
  391. data/lib/ledger_sync/ledgers/netsuite/check_line_item/serializer.rb +25 -0
  392. data/lib/ledger_sync/ledgers/netsuite/client.rb +184 -0
  393. data/lib/ledger_sync/ledgers/netsuite/config.rb +5 -0
  394. data/lib/ledger_sync/ledgers/netsuite/currency/deserializer.rb +23 -0
  395. data/lib/ledger_sync/ledgers/netsuite/currency/operations/create.rb +25 -0
  396. data/lib/ledger_sync/ledgers/netsuite/currency/operations/delete.rb +23 -0
  397. data/lib/ledger_sync/ledgers/netsuite/currency/operations/find.rb +23 -0
  398. data/lib/ledger_sync/ledgers/netsuite/currency/operations/update.rb +23 -0
  399. data/lib/ledger_sync/ledgers/netsuite/currency/serializer.rb +21 -0
  400. data/lib/ledger_sync/ledgers/netsuite/customer/deserializer.rb +22 -0
  401. data/lib/ledger_sync/ledgers/netsuite/customer/operations/create.rb +26 -0
  402. data/lib/ledger_sync/ledgers/netsuite/customer/operations/delete.rb +26 -0
  403. data/lib/ledger_sync/ledgers/netsuite/customer/operations/find.rb +26 -0
  404. data/lib/ledger_sync/ledgers/netsuite/customer/operations/update.rb +26 -0
  405. data/lib/ledger_sync/ledgers/netsuite/customer/searcher.rb +12 -0
  406. data/lib/ledger_sync/ledgers/netsuite/customer/searcher_deserializer.rb +18 -0
  407. data/lib/ledger_sync/ledgers/netsuite/customer/serializer.rb +29 -0
  408. data/lib/ledger_sync/ledgers/netsuite/customer_deposit/deserializer.rb +20 -0
  409. data/lib/ledger_sync/ledgers/netsuite/customer_deposit/operations/create.rb +24 -0
  410. data/lib/ledger_sync/ledgers/netsuite/customer_deposit/operations/delete.rb +24 -0
  411. data/lib/ledger_sync/ledgers/netsuite/customer_deposit/operations/find.rb +24 -0
  412. data/lib/ledger_sync/ledgers/netsuite/customer_deposit/operations/update.rb +24 -0
  413. data/lib/ledger_sync/ledgers/netsuite/customer_deposit/searcher.rb +12 -0
  414. data/lib/ledger_sync/ledgers/netsuite/customer_deposit/searcher_deserializer.rb +16 -0
  415. data/lib/ledger_sync/ledgers/netsuite/customer_deposit/serializer.rb +25 -0
  416. data/lib/ledger_sync/ledgers/netsuite/dashboard_url_helper.rb +28 -0
  417. data/lib/ledger_sync/ledgers/netsuite/department/deserializer.rb +15 -0
  418. data/lib/ledger_sync/ledgers/netsuite/department/operations/create.rb +25 -0
  419. data/lib/ledger_sync/ledgers/netsuite/department/operations/delete.rb +25 -0
  420. data/lib/ledger_sync/ledgers/netsuite/department/operations/find.rb +25 -0
  421. data/lib/ledger_sync/ledgers/netsuite/department/operations/update.rb +25 -0
  422. data/lib/ledger_sync/ledgers/netsuite/department/searcher.rb +12 -0
  423. data/lib/ledger_sync/ledgers/netsuite/department/searcher_deserializer.rb +19 -0
  424. data/lib/ledger_sync/ledgers/netsuite/department/serializer.rb +13 -0
  425. data/lib/ledger_sync/ledgers/netsuite/deserializer.rb +18 -0
  426. data/lib/ledger_sync/ledgers/netsuite/error.rb +18 -0
  427. data/lib/ledger_sync/ledgers/netsuite/journal_entry/deserializer.rb +31 -0
  428. data/lib/ledger_sync/ledgers/netsuite/journal_entry/operations/create.rb +26 -0
  429. data/lib/ledger_sync/ledgers/netsuite/journal_entry/operations/delete.rb +26 -0
  430. data/lib/ledger_sync/ledgers/netsuite/journal_entry/operations/find.rb +26 -0
  431. data/lib/ledger_sync/ledgers/netsuite/journal_entry/operations/update.rb +30 -0
  432. data/lib/ledger_sync/ledgers/netsuite/journal_entry/serializer.rb +36 -0
  433. data/lib/ledger_sync/ledgers/netsuite/journal_entry_line_item/deserializer.rb +23 -0
  434. data/lib/ledger_sync/ledgers/netsuite/journal_entry_line_item/serializer.rb +21 -0
  435. data/lib/ledger_sync/ledgers/netsuite/ledger_class/deserializer.rb +15 -0
  436. data/lib/ledger_sync/ledgers/netsuite/ledger_class/operations/create.rb +25 -0
  437. data/lib/ledger_sync/ledgers/netsuite/ledger_class/operations/delete.rb +25 -0
  438. data/lib/ledger_sync/ledgers/netsuite/ledger_class/operations/find.rb +25 -0
  439. data/lib/ledger_sync/ledgers/netsuite/ledger_class/operations/update.rb +25 -0
  440. data/lib/ledger_sync/ledgers/netsuite/ledger_class/searcher.rb +12 -0
  441. data/lib/ledger_sync/ledgers/netsuite/ledger_class/searcher_deserializer.rb +19 -0
  442. data/lib/ledger_sync/ledgers/netsuite/ledger_class/serializer.rb +13 -0
  443. data/lib/ledger_sync/ledgers/netsuite/location/deserializer.rb +15 -0
  444. data/lib/ledger_sync/ledgers/netsuite/location/operations/create.rb +21 -0
  445. data/lib/ledger_sync/ledgers/netsuite/location/operations/delete.rb +21 -0
  446. data/lib/ledger_sync/ledgers/netsuite/location/operations/find.rb +21 -0
  447. data/lib/ledger_sync/ledgers/netsuite/location/operations/update.rb +21 -0
  448. data/lib/ledger_sync/ledgers/netsuite/location/searcher.rb +12 -0
  449. data/lib/ledger_sync/ledgers/netsuite/location/serializer.rb +13 -0
  450. data/lib/ledger_sync/ledgers/netsuite/operation.rb +40 -0
  451. data/lib/ledger_sync/ledgers/netsuite/operation/create.rb +58 -0
  452. data/lib/ledger_sync/ledgers/netsuite/operation/delete.rb +49 -0
  453. data/lib/ledger_sync/ledgers/netsuite/operation/find.rb +60 -0
  454. data/lib/ledger_sync/ledgers/netsuite/operation/update.rb +61 -0
  455. data/lib/ledger_sync/ledgers/netsuite/record/http_method.rb +33 -0
  456. data/lib/ledger_sync/ledgers/netsuite/record/metadata.rb +105 -0
  457. data/lib/ledger_sync/ledgers/netsuite/record/parameter.rb +20 -0
  458. data/lib/ledger_sync/ledgers/netsuite/record/property.rb +22 -0
  459. data/lib/ledger_sync/ledgers/netsuite/reference/serializer.rb +13 -0
  460. data/lib/ledger_sync/ledgers/netsuite/resource.rb +10 -0
  461. data/lib/ledger_sync/ledgers/netsuite/resources/account.rb +44 -0
  462. data/lib/ledger_sync/ledgers/netsuite/resources/check.rb +23 -0
  463. data/lib/ledger_sync/ledgers/netsuite/resources/check_line_item.rb +15 -0
  464. data/lib/ledger_sync/ledgers/netsuite/resources/currency.rb +13 -0
  465. data/lib/ledger_sync/ledgers/netsuite/resources/customer.rb +19 -0
  466. data/lib/ledger_sync/ledgers/netsuite/resources/customer_deposit.rb +15 -0
  467. data/lib/ledger_sync/ledgers/netsuite/resources/department.rb +16 -0
  468. data/lib/ledger_sync/ledgers/netsuite/resources/deposit.rb +28 -0
  469. data/lib/ledger_sync/ledgers/netsuite/resources/deposit_line_item.rb +25 -0
  470. data/lib/ledger_sync/ledgers/netsuite/resources/invoice.rb +28 -0
  471. data/lib/ledger_sync/ledgers/netsuite/resources/invoice_line_item.rb +21 -0
  472. data/lib/ledger_sync/ledgers/netsuite/resources/item.rb +11 -0
  473. data/lib/ledger_sync/ledgers/netsuite/resources/journal_entry.rb +26 -0
  474. data/lib/ledger_sync/ledgers/netsuite/resources/journal_entry_line_item.rb +24 -0
  475. data/lib/ledger_sync/ledgers/netsuite/resources/ledger_class.rb +16 -0
  476. data/lib/ledger_sync/ledgers/netsuite/resources/location.rb +11 -0
  477. data/lib/ledger_sync/ledgers/netsuite/resources/subsidiary.rb +12 -0
  478. data/lib/ledger_sync/ledgers/netsuite/resources/vendor.rb +23 -0
  479. data/lib/ledger_sync/ledgers/netsuite/searcher.rb +64 -0
  480. data/lib/ledger_sync/ledgers/netsuite/serializer.rb +13 -0
  481. data/lib/ledger_sync/ledgers/netsuite/subsidiary/deserializer.rb +17 -0
  482. data/lib/ledger_sync/ledgers/netsuite/subsidiary/searcher.rb +12 -0
  483. data/lib/ledger_sync/ledgers/netsuite/subsidiary/searcher_deserializer.rb +15 -0
  484. data/lib/ledger_sync/ledgers/netsuite/subsidiary/serializer.rb +15 -0
  485. data/lib/ledger_sync/ledgers/netsuite/token.rb +158 -0
  486. data/lib/ledger_sync/ledgers/netsuite/type/deserializer_active_type.rb +32 -0
  487. data/lib/ledger_sync/ledgers/netsuite/type/deserializer_customer_type.rb +33 -0
  488. data/lib/ledger_sync/ledgers/netsuite/type/deserializer_entity_type.rb +30 -0
  489. data/lib/ledger_sync/ledgers/netsuite/type/deserializer_subsidiary_type.rb +33 -0
  490. data/lib/ledger_sync/ledgers/netsuite/vendor/deserializer.rb +30 -0
  491. data/lib/ledger_sync/ledgers/netsuite/vendor/operations/create.rb +27 -0
  492. data/lib/ledger_sync/ledgers/netsuite/vendor/operations/delete.rb +27 -0
  493. data/lib/ledger_sync/ledgers/netsuite/vendor/operations/find.rb +27 -0
  494. data/lib/ledger_sync/ledgers/netsuite/vendor/operations/update.rb +27 -0
  495. data/lib/ledger_sync/ledgers/netsuite/vendor/searcher.rb +12 -0
  496. data/lib/ledger_sync/ledgers/netsuite/vendor/searcher_deserializer.rb +21 -0
  497. data/lib/ledger_sync/ledgers/netsuite/vendor/serializer.rb +30 -0
  498. data/lib/ledger_sync/ledgers/netsuite_soap/client.rb +92 -0
  499. data/lib/ledger_sync/ledgers/netsuite_soap/config.rb +5 -0
  500. data/lib/ledger_sync/ledgers/netsuite_soap/customer/operations/create.rb +64 -0
  501. data/lib/ledger_sync/ledgers/netsuite_soap/customer/operations/find.rb +49 -0
  502. data/lib/ledger_sync/ledgers/netsuite_soap/operation.rb +40 -0
  503. data/lib/ledger_sync/ledgers/netsuite_soap/operation/create.rb +29 -0
  504. data/lib/ledger_sync/ledgers/netsuite_soap/operation/find.rb +15 -0
  505. data/lib/ledger_sync/ledgers/netsuite_soap/resource.rb +10 -0
  506. data/lib/ledger_sync/ledgers/netsuite_soap/resources/customer.rb +29 -0
  507. data/lib/ledger_sync/ledgers/netsuite_soap/resources/subsidiary.rb +12 -0
  508. data/lib/ledger_sync/ledgers/netsuite_soap/subsidiary/operations/create.rb +42 -0
  509. data/lib/ledger_sync/ledgers/netsuite_soap/subsidiary/operations/find.rb +38 -0
  510. data/lib/ledger_sync/ledgers/operation.rb +181 -0
  511. data/lib/ledger_sync/ledgers/quickbooks_online/account/deserializer.rb +43 -0
  512. data/lib/ledger_sync/ledgers/quickbooks_online/account/operations/create.rb +26 -0
  513. data/lib/ledger_sync/ledgers/quickbooks_online/account/operations/find.rb +26 -0
  514. data/lib/ledger_sync/ledgers/quickbooks_online/account/operations/update.rb +30 -0
  515. data/lib/ledger_sync/ledgers/quickbooks_online/account/searcher.rb +15 -0
  516. data/lib/ledger_sync/ledgers/quickbooks_online/account/serializer.rb +37 -0
  517. data/lib/ledger_sync/ledgers/quickbooks_online/bill/deserializer.rb +45 -0
  518. data/lib/ledger_sync/ledgers/quickbooks_online/bill/operations/create.rb +27 -0
  519. data/lib/ledger_sync/ledgers/quickbooks_online/bill/operations/find.rb +27 -0
  520. data/lib/ledger_sync/ledgers/quickbooks_online/bill/operations/update.rb +27 -0
  521. data/lib/ledger_sync/ledgers/quickbooks_online/bill/searcher.rb +14 -0
  522. data/lib/ledger_sync/ledgers/quickbooks_online/bill/serializer.rb +44 -0
  523. data/lib/ledger_sync/ledgers/quickbooks_online/bill_line_item/deserializer.rb +25 -0
  524. data/lib/ledger_sync/ledgers/quickbooks_online/bill_line_item/serializer.rb +29 -0
  525. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/deserializer.rb +59 -0
  526. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/operations/create.rb +33 -0
  527. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/operations/find.rb +33 -0
  528. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/operations/update.rb +33 -0
  529. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/serializer.rb +77 -0
  530. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment_line_item/deserializer.rb +18 -0
  531. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment_line_item/serializer.rb +18 -0
  532. data/lib/ledger_sync/ledgers/quickbooks_online/client.rb +258 -0
  533. data/lib/ledger_sync/ledgers/quickbooks_online/config.rb +8 -0
  534. data/lib/ledger_sync/ledgers/quickbooks_online/currency/deserializer.rb +17 -0
  535. data/lib/ledger_sync/ledgers/quickbooks_online/currency/serializer.rb +16 -0
  536. data/lib/ledger_sync/ledgers/quickbooks_online/customer/deserializer.rb +19 -0
  537. data/lib/ledger_sync/ledgers/quickbooks_online/customer/operations/create.rb +26 -0
  538. data/lib/ledger_sync/ledgers/quickbooks_online/customer/operations/find.rb +26 -0
  539. data/lib/ledger_sync/ledgers/quickbooks_online/customer/operations/update.rb +26 -0
  540. data/lib/ledger_sync/ledgers/quickbooks_online/customer/searcher.rb +13 -0
  541. data/lib/ledger_sync/ledgers/quickbooks_online/customer/serializer.rb +19 -0
  542. data/lib/ledger_sync/ledgers/quickbooks_online/dashboard_url_helper.rb +34 -0
  543. data/lib/ledger_sync/ledgers/quickbooks_online/department/deserializer.rb +28 -0
  544. data/lib/ledger_sync/ledgers/quickbooks_online/department/operations/create.rb +23 -0
  545. data/lib/ledger_sync/ledgers/quickbooks_online/department/operations/find.rb +23 -0
  546. data/lib/ledger_sync/ledgers/quickbooks_online/department/operations/update.rb +25 -0
  547. data/lib/ledger_sync/ledgers/quickbooks_online/department/searcher.rb +17 -0
  548. data/lib/ledger_sync/ledgers/quickbooks_online/department/serializer.rb +49 -0
  549. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/deserializer.rb +39 -0
  550. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/operations/create.rb +25 -0
  551. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/operations/find.rb +25 -0
  552. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/operations/update.rb +27 -0
  553. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/searcher.rb +13 -0
  554. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/serializer.rb +39 -0
  555. data/lib/ledger_sync/ledgers/quickbooks_online/deposit_line_item/deserializer.rb +38 -0
  556. data/lib/ledger_sync/ledgers/quickbooks_online/deposit_line_item/serializer.rb +41 -0
  557. data/lib/ledger_sync/ledgers/quickbooks_online/deserializer.rb +98 -0
  558. data/lib/ledger_sync/ledgers/quickbooks_online/expense/deserializer.rb +58 -0
  559. data/lib/ledger_sync/ledgers/quickbooks_online/expense/operations/create.rb +28 -0
  560. data/lib/ledger_sync/ledgers/quickbooks_online/expense/operations/find.rb +28 -0
  561. data/lib/ledger_sync/ledgers/quickbooks_online/expense/operations/update.rb +28 -0
  562. data/lib/ledger_sync/ledgers/quickbooks_online/expense/searcher.rb +14 -0
  563. data/lib/ledger_sync/ledgers/quickbooks_online/expense/serializer.rb +59 -0
  564. data/lib/ledger_sync/ledgers/quickbooks_online/expense_line_item/deserializer.rb +25 -0
  565. data/lib/ledger_sync/ledgers/quickbooks_online/expense_line_item/serializer.rb +27 -0
  566. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/deserializer.rb +35 -0
  567. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/operations/create.rb +27 -0
  568. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/operations/find.rb +25 -0
  569. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/operations/update.rb +25 -0
  570. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/serializer.rb +35 -0
  571. data/lib/ledger_sync/ledgers/quickbooks_online/invoice_sales_line_item/deserializer.rb +25 -0
  572. data/lib/ledger_sync/ledgers/quickbooks_online/invoice_sales_line_item/serializer.rb +29 -0
  573. data/lib/ledger_sync/ledgers/quickbooks_online/item/deserializer.rb +13 -0
  574. data/lib/ledger_sync/ledgers/quickbooks_online/item/serializer.rb +12 -0
  575. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/deserializer.rb +33 -0
  576. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/operations/create.rb +23 -0
  577. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/operations/find.rb +23 -0
  578. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/operations/update.rb +23 -0
  579. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/searcher.rb +14 -0
  580. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/serializer.rb +33 -0
  581. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry_line_item/deserializer.rb +32 -0
  582. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry_line_item/serializer.rb +36 -0
  583. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/deserializer.rb +29 -0
  584. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/operations/create.rb +23 -0
  585. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/operations/find.rb +23 -0
  586. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/operations/update.rb +25 -0
  587. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/searcher.rb +15 -0
  588. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/serializer.rb +24 -0
  589. data/lib/ledger_sync/ledgers/quickbooks_online/oauth_client.rb +93 -0
  590. data/lib/ledger_sync/ledgers/quickbooks_online/operation.rb +61 -0
  591. data/lib/ledger_sync/ledgers/quickbooks_online/operation/create.rb +26 -0
  592. data/lib/ledger_sync/ledgers/quickbooks_online/operation/find.rb +25 -0
  593. data/lib/ledger_sync/ledgers/quickbooks_online/operation/full_update.rb +44 -0
  594. data/lib/ledger_sync/ledgers/quickbooks_online/operation/sparse_update.rb +29 -0
  595. data/lib/ledger_sync/ledgers/quickbooks_online/payment/deserializer.rb +48 -0
  596. data/lib/ledger_sync/ledgers/quickbooks_online/payment/operations/create.rb +30 -0
  597. data/lib/ledger_sync/ledgers/quickbooks_online/payment/operations/find.rb +28 -0
  598. data/lib/ledger_sync/ledgers/quickbooks_online/payment/operations/update.rb +28 -0
  599. data/lib/ledger_sync/ledgers/quickbooks_online/payment/serializer.rb +48 -0
  600. data/lib/ledger_sync/ledgers/quickbooks_online/payment_line_item/deserializer.rb +18 -0
  601. data/lib/ledger_sync/ledgers/quickbooks_online/payment_line_item/serializer.rb +18 -0
  602. data/lib/ledger_sync/ledgers/quickbooks_online/preferences/deserializer.rb +43 -0
  603. data/lib/ledger_sync/ledgers/quickbooks_online/preferences/operations/find.rb +30 -0
  604. data/lib/ledger_sync/ledgers/quickbooks_online/preferences/serializer.rb +43 -0
  605. data/lib/ledger_sync/ledgers/quickbooks_online/request.rb +98 -0
  606. data/lib/ledger_sync/ledgers/quickbooks_online/resource.rb +10 -0
  607. data/lib/ledger_sync/ledgers/quickbooks_online/resources/account.rb +355 -0
  608. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill.rb +31 -0
  609. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill_line_item.rb +21 -0
  610. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill_payment.rb +42 -0
  611. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill_payment_line_item.rb +19 -0
  612. data/lib/ledger_sync/ledgers/quickbooks_online/resources/currency.rb +13 -0
  613. data/lib/ledger_sync/ledgers/quickbooks_online/resources/customer.rb +19 -0
  614. data/lib/ledger_sync/ledgers/quickbooks_online/resources/department.rb +16 -0
  615. data/lib/ledger_sync/ledgers/quickbooks_online/resources/deposit.rb +28 -0
  616. data/lib/ledger_sync/ledgers/quickbooks_online/resources/deposit_line_item.rb +25 -0
  617. data/lib/ledger_sync/ledgers/quickbooks_online/resources/expense.rb +40 -0
  618. data/lib/ledger_sync/ledgers/quickbooks_online/resources/expense_line_item.rb +21 -0
  619. data/lib/ledger_sync/ledgers/quickbooks_online/resources/invoice.rb +28 -0
  620. data/lib/ledger_sync/ledgers/quickbooks_online/resources/invoice_sales_line_item.rb +21 -0
  621. data/lib/ledger_sync/ledgers/quickbooks_online/resources/item.rb +11 -0
  622. data/lib/ledger_sync/ledgers/quickbooks_online/resources/journal_entry.rb +24 -0
  623. data/lib/ledger_sync/ledgers/quickbooks_online/resources/journal_entry_line_item.rb +29 -0
  624. data/lib/ledger_sync/ledgers/quickbooks_online/resources/ledger_class.rb +16 -0
  625. data/lib/ledger_sync/ledgers/quickbooks_online/resources/payment.rb +31 -0
  626. data/lib/ledger_sync/ledgers/quickbooks_online/resources/payment_line_item.rb +19 -0
  627. data/lib/ledger_sync/ledgers/quickbooks_online/resources/preferences.rb +24 -0
  628. data/lib/ledger_sync/ledgers/quickbooks_online/resources/primary_email_addr.rb +11 -0
  629. data/lib/ledger_sync/ledgers/quickbooks_online/resources/primary_phone.rb +11 -0
  630. data/lib/ledger_sync/ledgers/quickbooks_online/resources/subsidiary.rb +12 -0
  631. data/lib/ledger_sync/ledgers/quickbooks_online/resources/transfer.rb +24 -0
  632. data/lib/ledger_sync/ledgers/quickbooks_online/resources/vendor.rb +23 -0
  633. data/lib/ledger_sync/ledgers/quickbooks_online/searcher.rb +60 -0
  634. data/lib/ledger_sync/ledgers/quickbooks_online/serialization/type/amount_float_to_integer_type.rb +21 -0
  635. data/lib/ledger_sync/ledgers/quickbooks_online/serialization/type/deserialize_transaction_reference_type.rb +30 -0
  636. data/lib/ledger_sync/ledgers/quickbooks_online/serialization/type/integer_to_amount_float_type.rb +21 -0
  637. data/lib/ledger_sync/ledgers/quickbooks_online/serialization/type/serialize_transaction_reference_type.rb +30 -0
  638. data/lib/ledger_sync/ledgers/quickbooks_online/serializer.rb +71 -0
  639. data/lib/ledger_sync/ledgers/quickbooks_online/serialziation/type/mapping_type.rb +25 -0
  640. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/deserializer.rb +34 -0
  641. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/operations/create.rb +24 -0
  642. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/operations/find.rb +24 -0
  643. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/operations/update.rb +26 -0
  644. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/serializer.rb +34 -0
  645. data/lib/ledger_sync/ledgers/quickbooks_online/util/error_matcher.rb +54 -0
  646. data/lib/ledger_sync/ledgers/quickbooks_online/util/error_parser.rb +27 -0
  647. data/lib/ledger_sync/ledgers/quickbooks_online/util/ledger_error_parser.rb +103 -0
  648. data/lib/ledger_sync/ledgers/quickbooks_online/util/operation_error_parser.rb +99 -0
  649. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/deserializer.rb +25 -0
  650. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/operations/create.rb +27 -0
  651. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/operations/find.rb +27 -0
  652. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/operations/update.rb +27 -0
  653. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/searcher.rb +15 -0
  654. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/serializer.rb +25 -0
  655. data/lib/ledger_sync/ledgers/quickbooks_online/webhook.rb +58 -0
  656. data/lib/ledger_sync/ledgers/quickbooks_online/webhook_event.rb +79 -0
  657. data/lib/ledger_sync/ledgers/quickbooks_online/webhook_notification.rb +42 -0
  658. data/lib/ledger_sync/ledgers/request.rb +57 -0
  659. data/lib/ledger_sync/ledgers/response.rb +55 -0
  660. data/lib/ledger_sync/ledgers/searcher.rb +73 -0
  661. data/lib/ledger_sync/ledgers/stripe/client.rb +37 -0
  662. data/lib/ledger_sync/ledgers/stripe/config.rb +5 -0
  663. data/lib/ledger_sync/ledgers/stripe/customer/operations/create.rb +44 -0
  664. data/lib/ledger_sync/ledgers/stripe/customer/operations/delete.rb +35 -0
  665. data/lib/ledger_sync/ledgers/stripe/customer/operations/find.rb +44 -0
  666. data/lib/ledger_sync/ledgers/stripe/customer/operations/update.rb +43 -0
  667. data/lib/ledger_sync/ledgers/stripe/dashboard_url_helper.rb +21 -0
  668. data/lib/ledger_sync/ledgers/stripe/operation.rb +35 -0
  669. data/lib/ledger_sync/ledgers/stripe/operation/create.rb +17 -0
  670. data/lib/ledger_sync/ledgers/stripe/operation/delete.rb +17 -0
  671. data/lib/ledger_sync/ledgers/stripe/operation/find.rb +15 -0
  672. data/lib/ledger_sync/ledgers/stripe/operation/update.rb +17 -0
  673. data/lib/ledger_sync/ledgers/stripe/resource.rb +10 -0
  674. data/lib/ledger_sync/ledgers/stripe/resources/customer.rb +13 -0
  675. data/lib/ledger_sync/operation.rb +23 -0
  676. data/lib/ledger_sync/resource.rb +22 -10
  677. data/lib/ledger_sync/resource_adaptor.rb +52 -0
  678. data/lib/ledger_sync/resource_attribute.rb +31 -9
  679. data/lib/ledger_sync/resource_attribute/dirty_mixin.rb +4 -0
  680. data/lib/ledger_sync/resource_attribute/mixin.rb +14 -24
  681. data/lib/ledger_sync/resource_attribute/reference/many.rb +21 -23
  682. data/lib/ledger_sync/resource_attribute/reference/one.rb +16 -5
  683. data/lib/ledger_sync/resource_attribute_set.rb +3 -7
  684. data/lib/ledger_sync/result.rb +3 -3
  685. data/lib/ledger_sync/serialization/attribute.rb +41 -0
  686. data/lib/ledger_sync/serialization/attribute_set_mixin.rb +27 -0
  687. data/lib/ledger_sync/serialization/deserializer_attribute.rb +78 -0
  688. data/lib/ledger_sync/serialization/deserializer_attribute_set.rb +22 -0
  689. data/lib/ledger_sync/serialization/mixin.rb +70 -0
  690. data/lib/ledger_sync/serialization/serializer_attribute.rb +64 -0
  691. data/lib/ledger_sync/serialization/serializer_attribute_set.rb +22 -0
  692. data/lib/ledger_sync/serialization/type/deserializer_references_many_type.rb +26 -0
  693. data/lib/ledger_sync/serialization/type/deserializer_references_one_type.rb +12 -0
  694. data/lib/ledger_sync/serialization/type/deserializer_type.rb +29 -0
  695. data/lib/ledger_sync/serialization/type/format_date_type.rb +23 -0
  696. data/lib/ledger_sync/serialization/type/mapping_type.rb +23 -0
  697. data/lib/ledger_sync/serialization/type/parse_date_type.rb +23 -0
  698. data/lib/ledger_sync/serialization/type/serializer_references_many_type.rb +21 -0
  699. data/lib/ledger_sync/serialization/type/serializer_references_one_type.rb +12 -0
  700. data/lib/ledger_sync/serialization/type/serializer_type.rb +23 -0
  701. data/lib/ledger_sync/serializer.rb +95 -0
  702. data/lib/ledger_sync/type/boolean.rb +2 -0
  703. data/lib/ledger_sync/type/date.rb +3 -1
  704. data/lib/ledger_sync/type/float.rb +2 -0
  705. data/lib/ledger_sync/type/hash.rb +38 -0
  706. data/lib/ledger_sync/type/id.rb +8 -2
  707. data/lib/ledger_sync/type/integer.rb +2 -0
  708. data/lib/ledger_sync/type/reference_many.rb +15 -5
  709. data/lib/ledger_sync/type/reference_one.rb +9 -18
  710. data/lib/ledger_sync/type/string.rb +2 -0
  711. data/lib/ledger_sync/type/string_from_set.rb +43 -0
  712. data/lib/ledger_sync/type/value_mixin.rb +37 -7
  713. data/lib/ledger_sync/util/mixins/delegate_iterable_methods_mixin.rb +43 -0
  714. data/lib/ledger_sync/util/mixins/dupable_mixin.rb +13 -0
  715. data/lib/ledger_sync/util/mixins/resource_registerable_mixin.rb +29 -0
  716. data/lib/ledger_sync/util/read_only_object.rb +54 -0
  717. data/lib/ledger_sync/util/resource_converter.rb +113 -0
  718. data/lib/ledger_sync/util/resource_converter/attribute.rb +131 -0
  719. data/lib/ledger_sync/util/resource_converter/attribute_set.rb +42 -0
  720. data/lib/ledger_sync/util/resource_converter/type/references_many_type.rb +27 -0
  721. data/lib/ledger_sync/util/resource_converter/type/references_one_type.rb +14 -0
  722. data/lib/ledger_sync/util/resource_converter/type/resource_converter_type.rb +26 -0
  723. data/lib/ledger_sync/util/resources_builder.rb +19 -11
  724. data/lib/ledger_sync/util/string_helpers.rb +3 -3
  725. data/lib/ledger_sync/util/url_helpers.rb +38 -0
  726. data/lib/ledger_sync/util/validator.rb +3 -1
  727. data/lib/ledger_sync/version.rb +1 -1
  728. data/licenses/BSL.txt +97 -0
  729. data/licenses/documentation_site.txt +7 -0
  730. metadata +712 -263
  731. data/_config.yml +0 -1
  732. data/lib/ledger_sync/adaptor_configuration.rb +0 -61
  733. data/lib/ledger_sync/adaptor_configuration_store.rb +0 -56
  734. data/lib/ledger_sync/adaptors/adaptor.rb +0 -74
  735. data/lib/ledger_sync/adaptors/contract.rb +0 -16
  736. data/lib/ledger_sync/adaptors/ledger_serializer.rb +0 -151
  737. data/lib/ledger_sync/adaptors/ledger_serializer_attribute.rb +0 -178
  738. data/lib/ledger_sync/adaptors/ledger_serializer_attribute_set.rb +0 -58
  739. data/lib/ledger_sync/adaptors/ledger_serializer_type/mapping_type.rb +0 -41
  740. data/lib/ledger_sync/adaptors/ledger_serializer_type/references_many_type.rb +0 -24
  741. data/lib/ledger_sync/adaptors/ledger_serializer_type/references_one_type.rb +0 -22
  742. data/lib/ledger_sync/adaptors/ledger_serializer_type/value_type.rb +0 -17
  743. data/lib/ledger_sync/adaptors/mixins/infer_adaptor_class_mixin.rb +0 -24
  744. data/lib/ledger_sync/adaptors/mixins/infer_ledger_serializer_mixin.rb +0 -31
  745. data/lib/ledger_sync/adaptors/mixins/infer_resource_class_mixin.rb +0 -22
  746. data/lib/ledger_sync/adaptors/mixins/offset_and_limit_pagination_searcher_mixin.rb +0 -37
  747. data/lib/ledger_sync/adaptors/netsuite/account/ledger_deserializer.rb +0 -24
  748. data/lib/ledger_sync/adaptors/netsuite/account/ledger_serializer.rb +0 -22
  749. data/lib/ledger_sync/adaptors/netsuite/account/operations/create.rb +0 -28
  750. data/lib/ledger_sync/adaptors/netsuite/account/operations/find.rb +0 -28
  751. data/lib/ledger_sync/adaptors/netsuite/account/searcher.rb +0 -28
  752. data/lib/ledger_sync/adaptors/netsuite/adaptor.rb +0 -145
  753. data/lib/ledger_sync/adaptors/netsuite/config.rb +0 -6
  754. data/lib/ledger_sync/adaptors/netsuite/currency/deledger_serializer.rb +0 -28
  755. data/lib/ledger_sync/adaptors/netsuite/currency/ledger_serializer.rb +0 -25
  756. data/lib/ledger_sync/adaptors/netsuite/currency/operations/create.rb +0 -25
  757. data/lib/ledger_sync/adaptors/netsuite/currency/operations/delete.rb +0 -23
  758. data/lib/ledger_sync/adaptors/netsuite/currency/operations/find.rb +0 -23
  759. data/lib/ledger_sync/adaptors/netsuite/currency/operations/update.rb +0 -23
  760. data/lib/ledger_sync/adaptors/netsuite/customer/ledger_deserializer.rb +0 -27
  761. data/lib/ledger_sync/adaptors/netsuite/customer/ledger_serializer.rb +0 -38
  762. data/lib/ledger_sync/adaptors/netsuite/customer/operations/create.rb +0 -24
  763. data/lib/ledger_sync/adaptors/netsuite/customer/operations/delete.rb +0 -24
  764. data/lib/ledger_sync/adaptors/netsuite/customer/operations/find.rb +0 -24
  765. data/lib/ledger_sync/adaptors/netsuite/customer/operations/update.rb +0 -24
  766. data/lib/ledger_sync/adaptors/netsuite/ledger_serializer.rb +0 -30
  767. data/lib/ledger_sync/adaptors/netsuite/ledger_serializer_type/reference_type.rb +0 -24
  768. data/lib/ledger_sync/adaptors/netsuite/ledger_serializer_type/subsidiary_type.rb +0 -22
  769. data/lib/ledger_sync/adaptors/netsuite/operation.rb +0 -25
  770. data/lib/ledger_sync/adaptors/netsuite/operation/create.rb +0 -65
  771. data/lib/ledger_sync/adaptors/netsuite/operation/delete.rb +0 -49
  772. data/lib/ledger_sync/adaptors/netsuite/operation/find.rb +0 -56
  773. data/lib/ledger_sync/adaptors/netsuite/operation/update.rb +0 -68
  774. data/lib/ledger_sync/adaptors/netsuite/record/http_method.rb +0 -38
  775. data/lib/ledger_sync/adaptors/netsuite/record/metadata.rb +0 -75
  776. data/lib/ledger_sync/adaptors/netsuite/record/property.rb +0 -45
  777. data/lib/ledger_sync/adaptors/netsuite/searcher.rb +0 -17
  778. data/lib/ledger_sync/adaptors/netsuite/token.rb +0 -162
  779. data/lib/ledger_sync/adaptors/netsuite/vendor/ledger_deserializer.rb +0 -32
  780. data/lib/ledger_sync/adaptors/netsuite/vendor/ledger_serializer.rb +0 -35
  781. data/lib/ledger_sync/adaptors/netsuite/vendor/operations/create.rb +0 -27
  782. data/lib/ledger_sync/adaptors/netsuite/vendor/operations/delete.rb +0 -27
  783. data/lib/ledger_sync/adaptors/netsuite/vendor/operations/find.rb +0 -27
  784. data/lib/ledger_sync/adaptors/netsuite/vendor/operations/update.rb +0 -27
  785. data/lib/ledger_sync/adaptors/netsuite_soap/adaptor.rb +0 -92
  786. data/lib/ledger_sync/adaptors/netsuite_soap/config.rb +0 -5
  787. data/lib/ledger_sync/adaptors/netsuite_soap/customer/ledger_serializer.rb +0 -13
  788. data/lib/ledger_sync/adaptors/netsuite_soap/customer/operations/create.rb +0 -64
  789. data/lib/ledger_sync/adaptors/netsuite_soap/customer/operations/find.rb +0 -49
  790. data/lib/ledger_sync/adaptors/netsuite_soap/ledger_serializer.rb +0 -25
  791. data/lib/ledger_sync/adaptors/netsuite_soap/operation.rb +0 -40
  792. data/lib/ledger_sync/adaptors/netsuite_soap/operation/create.rb +0 -29
  793. data/lib/ledger_sync/adaptors/netsuite_soap/operation/find.rb +0 -15
  794. data/lib/ledger_sync/adaptors/netsuite_soap/subsidiary/operations/create.rb +0 -42
  795. data/lib/ledger_sync/adaptors/netsuite_soap/subsidiary/operations/find.rb +0 -38
  796. data/lib/ledger_sync/adaptors/operation.rb +0 -215
  797. data/lib/ledger_sync/adaptors/quickbooks_online/account/ledger_serializer.rb +0 -37
  798. data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/create.rb +0 -26
  799. data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/find.rb +0 -26
  800. data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/update.rb +0 -30
  801. data/lib/ledger_sync/adaptors/quickbooks_online/account/searcher.rb +0 -15
  802. data/lib/ledger_sync/adaptors/quickbooks_online/adaptor.rb +0 -258
  803. data/lib/ledger_sync/adaptors/quickbooks_online/bill/ledger_serializer.rb +0 -43
  804. data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/create.rb +0 -26
  805. data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/find.rb +0 -26
  806. data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/update.rb +0 -26
  807. data/lib/ledger_sync/adaptors/quickbooks_online/bill/searcher.rb +0 -14
  808. data/lib/ledger_sync/adaptors/quickbooks_online/bill_line_item/ledger_serializer.rb +0 -27
  809. data/lib/ledger_sync/adaptors/quickbooks_online/config.rb +0 -8
  810. data/lib/ledger_sync/adaptors/quickbooks_online/currency/ledger_serializer.rb +0 -17
  811. data/lib/ledger_sync/adaptors/quickbooks_online/customer/ledger_serializer.rb +0 -23
  812. data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/create.rb +0 -22
  813. data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/find.rb +0 -22
  814. data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/update.rb +0 -24
  815. data/lib/ledger_sync/adaptors/quickbooks_online/customer/searcher.rb +0 -13
  816. data/lib/ledger_sync/adaptors/quickbooks_online/dashboard_url_helper.rb +0 -57
  817. data/lib/ledger_sync/adaptors/quickbooks_online/department/ledger_serializer.rb +0 -38
  818. data/lib/ledger_sync/adaptors/quickbooks_online/department/operations/create.rb +0 -23
  819. data/lib/ledger_sync/adaptors/quickbooks_online/department/operations/find.rb +0 -23
  820. data/lib/ledger_sync/adaptors/quickbooks_online/department/operations/update.rb +0 -25
  821. data/lib/ledger_sync/adaptors/quickbooks_online/department/searcher.rb +0 -17
  822. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/ledger_serializer.rb +0 -40
  823. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/create.rb +0 -25
  824. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/find.rb +0 -25
  825. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/update.rb +0 -27
  826. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/searcher.rb +0 -13
  827. data/lib/ledger_sync/adaptors/quickbooks_online/deposit_line_item/ledger_serializer.rb +0 -31
  828. data/lib/ledger_sync/adaptors/quickbooks_online/expense/ledger_serializer.rb +0 -49
  829. data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/create.rb +0 -27
  830. data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/find.rb +0 -27
  831. data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/update.rb +0 -27
  832. data/lib/ledger_sync/adaptors/quickbooks_online/expense/searcher.rb +0 -14
  833. data/lib/ledger_sync/adaptors/quickbooks_online/expense_line_item/ledger_serializer.rb +0 -27
  834. data/lib/ledger_sync/adaptors/quickbooks_online/invoice/ledger_serializer.rb +0 -36
  835. data/lib/ledger_sync/adaptors/quickbooks_online/invoice/operations/create.rb +0 -27
  836. data/lib/ledger_sync/adaptors/quickbooks_online/invoice/operations/find.rb +0 -25
  837. data/lib/ledger_sync/adaptors/quickbooks_online/invoice/operations/update.rb +0 -25
  838. data/lib/ledger_sync/adaptors/quickbooks_online/invoice_sales_line_item/ledger_serializer.rb +0 -30
  839. data/lib/ledger_sync/adaptors/quickbooks_online/item/ledger_serializer.rb +0 -13
  840. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/ledger_serializer.rb +0 -34
  841. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/create.rb +0 -23
  842. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/find.rb +0 -23
  843. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/update.rb +0 -23
  844. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/searcher.rb +0 -14
  845. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry_line_item/ledger_serializer.rb +0 -31
  846. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_class/ledger_serializer.rb +0 -25
  847. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_class/operations/create.rb +0 -23
  848. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_class/operations/find.rb +0 -23
  849. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_class/operations/update.rb +0 -25
  850. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_class/searcher.rb +0 -15
  851. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer.rb +0 -131
  852. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/account_sub_type.rb +0 -305
  853. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/account_type.rb +0 -51
  854. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/amount_type.rb +0 -23
  855. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/classification_type.rb +0 -23
  856. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/date_type.rb +0 -23
  857. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/entity_reference_type.rb +0 -49
  858. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/journal_entry_line_item_type.rb +0 -20
  859. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/payment_type.rb +0 -21
  860. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/transaction_reference_type.rb +0 -49
  861. data/lib/ledger_sync/adaptors/quickbooks_online/oauth_client.rb +0 -93
  862. data/lib/ledger_sync/adaptors/quickbooks_online/operation.rb +0 -60
  863. data/lib/ledger_sync/adaptors/quickbooks_online/operation/create.rb +0 -26
  864. data/lib/ledger_sync/adaptors/quickbooks_online/operation/find.rb +0 -31
  865. data/lib/ledger_sync/adaptors/quickbooks_online/operation/full_update.rb +0 -45
  866. data/lib/ledger_sync/adaptors/quickbooks_online/operation/sparse_update.rb +0 -29
  867. data/lib/ledger_sync/adaptors/quickbooks_online/payment/ledger_serializer.rb +0 -50
  868. data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/create.rb +0 -30
  869. data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/find.rb +0 -28
  870. data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/update.rb +0 -28
  871. data/lib/ledger_sync/adaptors/quickbooks_online/payment_line_item/ledger_serializer.rb +0 -19
  872. data/lib/ledger_sync/adaptors/quickbooks_online/request.rb +0 -98
  873. data/lib/ledger_sync/adaptors/quickbooks_online/searcher.rb +0 -61
  874. data/lib/ledger_sync/adaptors/quickbooks_online/transfer/ledger_serializer.rb +0 -36
  875. data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/create.rb +0 -24
  876. data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/find.rb +0 -24
  877. data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/update.rb +0 -26
  878. data/lib/ledger_sync/adaptors/quickbooks_online/util/adaptor_error_parser.rb +0 -103
  879. data/lib/ledger_sync/adaptors/quickbooks_online/util/error_matcher.rb +0 -54
  880. data/lib/ledger_sync/adaptors/quickbooks_online/util/error_parser.rb +0 -27
  881. data/lib/ledger_sync/adaptors/quickbooks_online/util/operation_error_parser.rb +0 -99
  882. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/ledger_serializer.rb +0 -25
  883. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/create.rb +0 -27
  884. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/find.rb +0 -27
  885. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/update.rb +0 -27
  886. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/searcher.rb +0 -15
  887. data/lib/ledger_sync/adaptors/quickbooks_online/webhook.rb +0 -58
  888. data/lib/ledger_sync/adaptors/quickbooks_online/webhook_event.rb +0 -79
  889. data/lib/ledger_sync/adaptors/quickbooks_online/webhook_notification.rb +0 -42
  890. data/lib/ledger_sync/adaptors/request.rb +0 -53
  891. data/lib/ledger_sync/adaptors/response.rb +0 -55
  892. data/lib/ledger_sync/adaptors/searcher.rb +0 -68
  893. data/lib/ledger_sync/adaptors/stripe/adaptor.rb +0 -45
  894. data/lib/ledger_sync/adaptors/stripe/config.rb +0 -6
  895. data/lib/ledger_sync/adaptors/stripe/customer/operations/create.rb +0 -44
  896. data/lib/ledger_sync/adaptors/stripe/customer/operations/delete.rb +0 -35
  897. data/lib/ledger_sync/adaptors/stripe/customer/operations/find.rb +0 -44
  898. data/lib/ledger_sync/adaptors/stripe/customer/operations/update.rb +0 -43
  899. data/lib/ledger_sync/adaptors/stripe/operation.rb +0 -35
  900. data/lib/ledger_sync/adaptors/stripe/operation/create.rb +0 -17
  901. data/lib/ledger_sync/adaptors/stripe/operation/delete.rb +0 -17
  902. data/lib/ledger_sync/adaptors/stripe/operation/find.rb +0 -15
  903. data/lib/ledger_sync/adaptors/stripe/operation/update.rb +0 -17
  904. data/lib/ledger_sync/adaptors/test/account/operations/create.rb +0 -57
  905. data/lib/ledger_sync/adaptors/test/account/operations/find.rb +0 -42
  906. data/lib/ledger_sync/adaptors/test/account/operations/invalid.rb +0 -26
  907. data/lib/ledger_sync/adaptors/test/account/operations/update.rb +0 -56
  908. data/lib/ledger_sync/adaptors/test/account/operations/valid.rb +0 -32
  909. data/lib/ledger_sync/adaptors/test/account/searcher.rb +0 -40
  910. data/lib/ledger_sync/adaptors/test/adaptor.rb +0 -47
  911. data/lib/ledger_sync/adaptors/test/config.rb +0 -6
  912. data/lib/ledger_sync/adaptors/test/customer/operations/create.rb +0 -52
  913. data/lib/ledger_sync/adaptors/test/customer/operations/find.rb +0 -38
  914. data/lib/ledger_sync/adaptors/test/customer/operations/invalid.rb +0 -22
  915. data/lib/ledger_sync/adaptors/test/customer/operations/update.rb +0 -22
  916. data/lib/ledger_sync/adaptors/test/customer/operations/valid.rb +0 -24
  917. data/lib/ledger_sync/adaptors/test/customer/searcher.rb +0 -40
  918. data/lib/ledger_sync/adaptors/test/error/adaptor_error/operations/throttle_error.rb +0 -28
  919. data/lib/ledger_sync/adaptors/test/expense/operations/create.rb +0 -29
  920. data/lib/ledger_sync/adaptors/test/expense/operations/find.rb +0 -29
  921. data/lib/ledger_sync/adaptors/test/expense/operations/update.rb +0 -27
  922. data/lib/ledger_sync/adaptors/test/ledger_serializer.rb +0 -64
  923. data/lib/ledger_sync/adaptors/test/operation/create.rb +0 -27
  924. data/lib/ledger_sync/adaptors/test/operation/find.rb +0 -29
  925. data/lib/ledger_sync/adaptors/test/operation/update.rb +0 -34
  926. data/lib/ledger_sync/adaptors/test/payment/operations/create.rb +0 -51
  927. data/lib/ledger_sync/adaptors/test/payment/operations/find.rb +0 -44
  928. data/lib/ledger_sync/adaptors/test/payment/operations/update.rb +0 -28
  929. data/lib/ledger_sync/adaptors/test/transfer/operations/create.rb +0 -24
  930. data/lib/ledger_sync/adaptors/test/transfer/operations/find.rb +0 -24
  931. data/lib/ledger_sync/adaptors/test/transfer/operations/update.rb +0 -24
  932. data/lib/ledger_sync/adaptors/test/vendor/operations/create.rb +0 -56
  933. data/lib/ledger_sync/adaptors/test/vendor/operations/find.rb +0 -43
  934. data/lib/ledger_sync/adaptors/test/vendor/operations/invalid.rb +0 -27
  935. data/lib/ledger_sync/adaptors/test/vendor/operations/update.rb +0 -27
  936. data/lib/ledger_sync/adaptors/test/vendor/operations/valid.rb +0 -33
  937. data/lib/ledger_sync/adaptors/test/vendor/searcher.rb +0 -41
  938. data/lib/ledger_sync/error/adaptor_errors.rb +0 -72
  939. data/lib/ledger_sync/resources/account.rb +0 -17
  940. data/lib/ledger_sync/resources/bill.rb +0 -25
  941. data/lib/ledger_sync/resources/bill_line_item.rb +0 -15
  942. data/lib/ledger_sync/resources/currency.rb +0 -9
  943. data/lib/ledger_sync/resources/customer.rb +0 -25
  944. data/lib/ledger_sync/resources/department.rb +0 -14
  945. data/lib/ledger_sync/resources/deposit.rb +0 -24
  946. data/lib/ledger_sync/resources/deposit_line_item.rb +0 -19
  947. data/lib/ledger_sync/resources/expense.rb +0 -31
  948. data/lib/ledger_sync/resources/expense_line_item.rb +0 -15
  949. data/lib/ledger_sync/resources/invoice.rb +0 -24
  950. data/lib/ledger_sync/resources/invoice_sales_line_item.rb +0 -17
  951. data/lib/ledger_sync/resources/item.rb +0 -5
  952. data/lib/ledger_sync/resources/journal_entry.rb +0 -20
  953. data/lib/ledger_sync/resources/journal_entry_line_item.rb +0 -16
  954. data/lib/ledger_sync/resources/ledger_class.rb +0 -14
  955. data/lib/ledger_sync/resources/payment.rb +0 -27
  956. data/lib/ledger_sync/resources/payment_line_item.rb +0 -15
  957. data/lib/ledger_sync/resources/subsidiary.rb +0 -8
  958. data/lib/ledger_sync/resources/transfer.rb +0 -20
  959. data/lib/ledger_sync/resources/vendor.rb +0 -19
  960. data/lib/ledger_sync/util/debug.rb +0 -16
  961. data/qa/env_spec.rb +0 -5
  962. data/qa/netsuite/account_spec.rb +0 -20
  963. data/qa/netsuite/currency_spec.rb +0 -16
  964. data/qa/netsuite/customer.rb +0 -76
  965. data/qa/netsuite/customer_spec.rb +0 -21
  966. data/qa/netsuite/vendor.rb +0 -76
  967. data/qa/netsuite/vendor_spec.rb +0 -23
  968. data/qa/netsuite_soap/customer_spec.rb +0 -21
  969. data/qa/netsuite_soap/subsidiary_spec.rb +0 -0
  970. data/qa/netsuite_test.rb +0 -42
  971. data/qa/qa_helper.rb +0 -58
  972. data/qa/quickbooks_online/account_spec.rb +0 -14
  973. data/qa/quickbooks_online/customer_spec.rb +0 -13
  974. data/qa/quickbooks_online/expense_spec.rb +0 -31
  975. data/qa/quickbooks_online/vendor_spec.rb +0 -13
  976. data/qa/stripe/customers_spec.rb +0 -15
  977. data/qa/support/adaptor_helpers.rb +0 -99
  978. data/qa/support/adaptor_support_setup.rb +0 -23
  979. data/qa/support/netsuite_helpers.rb +0 -33
  980. data/qa/support/netsuite_shared_examples.rb +0 -30
  981. data/qa/support/netsuite_soap_helpers.rb +0 -33
  982. data/qa/support/netsuite_soap_shared_examples.rb +0 -10
  983. data/qa/support/quickbooks_online_helpers.rb +0 -42
  984. data/qa/support/quickbooks_online_shared_examples.rb +0 -82
  985. data/qa/support/shared_examples.rb +0 -127
  986. data/qa/support/stripe_helpers.rb +0 -22
  987. data/qa/support/stripe_shared_examples.rb +0 -10
  988. data/qa/test.rb +0 -67
@@ -0,0 +1,270 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+
6
+ <title>LedgerSync - Introducing Documentation - LedgerSync</title>
7
+ <meta charset="utf-8">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9
+ <meta name="description" content="Completely re-designed the documentation, including guides, ledger references, and the LedgerSync blog." />
10
+ <link href="https://fonts.googleapis.com/css?family=Lato:400,400i,700,700i%26display=swap" rel="stylesheet">
11
+ <link rel="stylesheet" href="/assets/css/main.css">
12
+
13
+ <!-- Global site tag (gtag.js) - Google Analytics -->
14
+ <script async src="https://www.googletagmanager.com/gtag/js?id=UA-152343827-1"></script>
15
+ <script>
16
+ window.dataLayer = window.dataLayer || [];
17
+ function gtag(){dataLayer.push(arguments);}
18
+ gtag('js', new Date());
19
+
20
+ gtag('config', 'UA-152343827-1');
21
+ </script>
22
+
23
+ </head>
24
+
25
+ <body>
26
+
27
+ <div id="page" class="site">
28
+ <header id="masthead" class="site-header outer">
29
+ <div class="inner">
30
+ <div class="site-header-inside">
31
+ <div class="site-branding">
32
+
33
+
34
+ <p class="site-logo"><a href="/"><img src="/images/logo.svg" alt="LedgerSync" /></a></p>
35
+
36
+ </div><!-- .site-branding -->
37
+
38
+
39
+ <nav id="main-navigation" class="site-navigation" aria-label="Main Navigation">
40
+ <div class="site-nav-inside">
41
+ <button id="menu-close" class="menu-toggle"><span class="screen-reader-text">Open Menu</span><span class="icon-close" aria-hidden="true"></span></button>
42
+ <ul class="menu">
43
+
44
+ <li class="menu-item">
45
+
46
+
47
+ <a class="" href="/" >
48
+
49
+ Home
50
+
51
+ </a>
52
+
53
+ </li>
54
+
55
+ <li class="menu-item">
56
+
57
+
58
+ <a class="" href="/guides/" >
59
+
60
+ Guides
61
+
62
+ </a>
63
+
64
+ </li>
65
+
66
+ <li class="menu-item has-children">
67
+
68
+
69
+ <a class="" href="/reference" >
70
+
71
+ Reference
72
+
73
+ </a>
74
+
75
+
76
+ <ul class="submenu">
77
+
78
+ <li class="menu-item">
79
+
80
+
81
+ <a class="" href="/reference/netsuite" >
82
+
83
+ NetSuite REST
84
+
85
+ </a>
86
+ </li>
87
+
88
+ <li class="menu-item">
89
+
90
+
91
+ <a class="" href="/reference/netsuite_soap" >
92
+
93
+ NetSuite SOAP
94
+
95
+ </a>
96
+ </li>
97
+
98
+ <li class="menu-item">
99
+
100
+
101
+ <a class="" href="/reference/quickbooks_online" >
102
+
103
+ QuickBooks Online
104
+
105
+ </a>
106
+ </li>
107
+
108
+ <li class="menu-item">
109
+
110
+
111
+ <a class="" href="/reference/stripe" >
112
+
113
+ Stripe
114
+
115
+ </a>
116
+ </li>
117
+
118
+ </ul>
119
+
120
+
121
+ </li>
122
+
123
+ <li class="menu-item">
124
+
125
+
126
+ <a class="" href="/blog" >
127
+
128
+ Blog
129
+
130
+ </a>
131
+
132
+ </li>
133
+
134
+ <li class="menu-item">
135
+
136
+
137
+ <a class="" href="/guides/contribute" >
138
+
139
+ Contribute
140
+
141
+ </a>
142
+
143
+ </li>
144
+
145
+ <li class="menu-item menu-button">
146
+
147
+
148
+ <a class="button" href="https://github.com/LedgerSync/ledger_sync" >
149
+
150
+ GitHub
151
+
152
+ </a>
153
+
154
+ </li>
155
+
156
+ </ul>
157
+ </div><!-- .site-nav-inside -->
158
+ </nav><!-- .site-navigation -->
159
+ <button id="menu-open" class="menu-toggle"><span class="screen-reader-text">Close Menu</span><span class="icon-menu" aria-hidden="true"></span></button>
160
+
161
+ </div><!-- .site-header-inside -->
162
+ </div><!-- .inner -->
163
+ </header><!-- .site-header -->
164
+
165
+ <main id="content" class="site-content">
166
+ <article class="post post-full">
167
+ <header class="post-header has-gradient outer">
168
+
169
+
170
+ <div class="inner-sm">
171
+ <div class="post-meta">
172
+ <time class="published" datetime="2020-06-01 00:00">June 01, 2020</time>
173
+ </div>
174
+ <h1 class="post-title">Introducing Documentation</h1>
175
+
176
+
177
+ </div>
178
+ </header>
179
+ <div class="inner-md outer">
180
+ <div class="post-content">
181
+ <p>LedgerSync has now grown to support three different ledgers! As LedgerSync grows, we want to ensure the library is easy
182
+ to use and understand. Our README was growing quite unwieldy, so we decided to generate this static website.</p>
183
+
184
+ <p>These docs contain a mix of manually and automatically generated content. We have developed scripts that keep our
185
+ docs in sync with the code. Our goal is to reduce the need to write documentation with each commit.</p>
186
+
187
+ <p>If you find any bugs or have any suggestions, please <a href="https://github.com/LedgerSync/ledger_sync/issues/new">open an issue on Github</a>.</p>
188
+
189
+ </div><!-- .post-content -->
190
+ </div><!-- .inner-md -->
191
+ </article><!-- .post -->
192
+
193
+ <!-- Next/previous post navigation TBD -->
194
+ <!--
195
+ <div class="inner-md outer">
196
+ <nav class="read-next">
197
+ <h2 class="read-next-title line-left">Read Next</h2>
198
+ <div class="nav-links">
199
+ <article class="post">
200
+ <div class="post-meta">
201
+ <time class="published" datetime="">Previous post date</time>
202
+ </div>
203
+ <h3 class="post-title"><a href="#" rel="bookmark">Previous Post Title</a></h3>
204
+ </article>
205
+ <article class="post">
206
+ <div class="post-meta">
207
+ <time class="published" datetime="">Next post date</time>
208
+ </div>
209
+ <h3 class="post-title"><a href="#" rel="bookmark">Next Post Title</a></h3>
210
+ </article>
211
+ </div>
212
+ </nav>
213
+ </div>
214
+ -->
215
+
216
+ </main><!-- .site-content -->
217
+ <footer id="colophon" class="site-footer outer">
218
+ <div class="inner">
219
+ <div class="site-footer-inside">
220
+ <p class="site-info">
221
+
222
+ <span class="copyright">&copy; Modern Treasury Inc. All rights reserved.</span>
223
+ <a class="" href="https://www.moderntreasury.com" target="_blank" rel="noopener" >
224
+
225
+ Maintained with ❤️ in San Francisco, CA by Modern Treasury
226
+
227
+ </a>
228
+ </p>
229
+ <!-- .site-info -->
230
+
231
+ <div class="social-links">
232
+
233
+ <a class="" href="https://www.netlify.com" target="_blank" rel="noopener" >
234
+
235
+ <img src="https://www.netlify.com/img/global/badges/netlify-dark.svg" alt="Deploys by Netlify" />
236
+
237
+ </a>
238
+ <a class="button button-icon" href="https://twitter.com/ModernTreasury" target="_blank" rel="noopener" >
239
+
240
+ <span class="icon fab fa-twitter" aria-hidden="true"></span><span class="screen-reader-text">Twitter</span>
241
+
242
+ </a>
243
+ <a class="button button-icon" href="https://www.linkedin.com/company/modern-treasury" target="_blank" rel="noopener" >
244
+
245
+ <span class="icon fab fa-linkedin" aria-hidden="true"></span><span class="screen-reader-text">LinkedIn</span>
246
+
247
+ </a>
248
+ <a class="button button-icon" href="https://github.com/LedgerSync/ledger_sync" target="_blank" rel="noopener" >
249
+
250
+ <span class="icon fab fa-github" aria-hidden="true"></span><span class="screen-reader-text">GitHub</span>
251
+
252
+ </a>
253
+ </div>
254
+ <!-- .social-links -->
255
+
256
+ </div>
257
+ <!-- .site-footer-inside -->
258
+ </div>
259
+ <!-- .inner -->
260
+ </footer>
261
+ <!-- .site-footer -->
262
+ </div><!-- .site -->
263
+
264
+ <!-- Scripts -->
265
+ <script src="/assets/js/plugins.js"></script>
266
+ <script src="/assets/js/prism.js" data-manual></script>
267
+ <script src="/assets/js/main.js"></script>
268
+ </body>
269
+
270
+ </html>
@@ -0,0 +1,624 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+
6
+ <title>LedgerSync - How to authenticate to NetSuite's SuiteTalk REST Web Services API - LedgerSync</title>
7
+ <meta charset="utf-8">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9
+ <meta name="description" content="A step-by-step guide to authenticating to the new NetSuite REST API." />
10
+ <link href="https://fonts.googleapis.com/css?family=Lato:400,400i,700,700i%26display=swap" rel="stylesheet">
11
+ <link rel="stylesheet" href="/assets/css/main.css">
12
+
13
+ <!-- Global site tag (gtag.js) - Google Analytics -->
14
+ <script async src="https://www.googletagmanager.com/gtag/js?id=UA-152343827-1"></script>
15
+ <script>
16
+ window.dataLayer = window.dataLayer || [];
17
+ function gtag(){dataLayer.push(arguments);}
18
+ gtag('js', new Date());
19
+
20
+ gtag('config', 'UA-152343827-1');
21
+ </script>
22
+
23
+ </head>
24
+
25
+ <body>
26
+
27
+ <div id="page" class="site">
28
+ <header id="masthead" class="site-header outer">
29
+ <div class="inner">
30
+ <div class="site-header-inside">
31
+ <div class="site-branding">
32
+
33
+
34
+ <p class="site-logo"><a href="/"><img src="/images/logo.svg" alt="LedgerSync" /></a></p>
35
+
36
+ </div><!-- .site-branding -->
37
+
38
+
39
+ <nav id="main-navigation" class="site-navigation" aria-label="Main Navigation">
40
+ <div class="site-nav-inside">
41
+ <button id="menu-close" class="menu-toggle"><span class="screen-reader-text">Open Menu</span><span class="icon-close" aria-hidden="true"></span></button>
42
+ <ul class="menu">
43
+
44
+ <li class="menu-item">
45
+
46
+
47
+ <a class="" href="/" >
48
+
49
+ Home
50
+
51
+ </a>
52
+
53
+ </li>
54
+
55
+ <li class="menu-item">
56
+
57
+
58
+ <a class="" href="/guides/" >
59
+
60
+ Guides
61
+
62
+ </a>
63
+
64
+ </li>
65
+
66
+ <li class="menu-item has-children">
67
+
68
+
69
+ <a class="" href="/reference" >
70
+
71
+ Reference
72
+
73
+ </a>
74
+
75
+
76
+ <ul class="submenu">
77
+
78
+ <li class="menu-item">
79
+
80
+
81
+ <a class="" href="/reference/netsuite" >
82
+
83
+ NetSuite REST
84
+
85
+ </a>
86
+ </li>
87
+
88
+ <li class="menu-item">
89
+
90
+
91
+ <a class="" href="/reference/netsuite_soap" >
92
+
93
+ NetSuite SOAP
94
+
95
+ </a>
96
+ </li>
97
+
98
+ <li class="menu-item">
99
+
100
+
101
+ <a class="" href="/reference/quickbooks_online" >
102
+
103
+ QuickBooks Online
104
+
105
+ </a>
106
+ </li>
107
+
108
+ <li class="menu-item">
109
+
110
+
111
+ <a class="" href="/reference/stripe" >
112
+
113
+ Stripe
114
+
115
+ </a>
116
+ </li>
117
+
118
+ </ul>
119
+
120
+
121
+ </li>
122
+
123
+ <li class="menu-item">
124
+
125
+
126
+ <a class="" href="/blog" >
127
+
128
+ Blog
129
+
130
+ </a>
131
+
132
+ </li>
133
+
134
+ <li class="menu-item">
135
+
136
+
137
+ <a class="" href="/guides/contribute" >
138
+
139
+ Contribute
140
+
141
+ </a>
142
+
143
+ </li>
144
+
145
+ <li class="menu-item menu-button">
146
+
147
+
148
+ <a class="button" href="https://github.com/LedgerSync/ledger_sync" >
149
+
150
+ GitHub
151
+
152
+ </a>
153
+
154
+ </li>
155
+
156
+ </ul>
157
+ </div><!-- .site-nav-inside -->
158
+ </nav><!-- .site-navigation -->
159
+ <button id="menu-open" class="menu-toggle"><span class="screen-reader-text">Close Menu</span><span class="icon-menu" aria-hidden="true"></span></button>
160
+
161
+ </div><!-- .site-header-inside -->
162
+ </div><!-- .inner -->
163
+ </header><!-- .site-header -->
164
+
165
+ <main id="content" class="site-content">
166
+ <article class="post post-full">
167
+ <header class="post-header has-gradient outer">
168
+
169
+
170
+ <div class="inner-sm">
171
+ <div class="post-meta">
172
+ <time class="published" datetime="2020-06-01 00:00">June 01, 2020</time>
173
+ </div>
174
+ <h1 class="post-title">How to authenticate to NetSuite's SuiteTalk REST Web Services API</h1>
175
+
176
+
177
+ </div>
178
+ </header>
179
+ <div class="inner-md outer">
180
+ <div class="post-content">
181
+ <p>Earlier this year, NetSuite released their new REST API called SuiteTalk REST Web Services. While still incomplete, this API provides a much friendlier interface for developers than its predecessors— the SOAP API and RESTlets. We chose to use the new REST API, because we believe it is the future for building integrations to NetSuite. The REST standard is much more intuitive, with many resources across many languages and frameworks.</p>
182
+
183
+ <div class="alert info">
184
+ <strong>Tip:</strong> We do our best to write comprehensive unit tests for the entire library. Tests are a great resource for examples on inputs, outputs, and usage, not all of which may be documented here.
185
+ </div>
186
+
187
+ <h2 id="options-for-authentication">Options for Authentication</h2>
188
+
189
+ <p>The REST API offers two types of authentication: Token-Based Authentication (TBA) and OAuth 2.0. We chose to use TBA for the REST client.</p>
190
+
191
+ <p>Simply put, TBA is based on OAuth 1.0. Ultimately, you need to generate a request header that includes a signature created using tokens retrieved from the NetSuite dashboard and the OAuth 1.0 standard. Unfortunately, at the time of development, we hit a few walls trying to authenticate:</p>
192
+
193
+ <ul>
194
+ <li>The NetSuite documentation was only for their SOAP API and RESTlets</li>
195
+ <li>There were no examples in Ruby</li>
196
+ <li>Code samples relied on libraries or packages, making it hard to understand what was actually happening under the hood.</li>
197
+ <li>The nonce and timestamp were not defined in the inputs of examples we found, so outputs would naturally vary given that these values are meant to change in practice.</li>
198
+ <li>There were very few examples that had both inputs and signature output to test against.</li>
199
+ </ul>
200
+
201
+ <p>In the end, the challenge of authenticating to NetSuite in the REST API was computing the signature. No examples we found worked for us, and regardless, we needed it in Ruby. Frustratingly, the only way to know if we were correct was to try API calls after making tweaks to our signature generation algorithm.</p>
202
+
203
+ <p>If you’re reading this post, hopefully this will save you a headache or two. We will clearly lay out our solution, break it down step-by-step, and we will give you some real examples. Let’s get going!</p>
204
+
205
+ <h2 id="our-solution">Our Solution</h2>
206
+
207
+ <p>Let’s start with the full solution, which can be found in the LedgerSync library class <code class="highlighter-rouge">LedgerSync::Ledgers::NetSuite::Token</code> (code can be found here). The Token handles creating the authorization header that will be used to sign the request. The request header looks something like this:</p>
208
+
209
+ <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Authorization: OAuth realm="TEST_REALM",oauth_consumer_key="ef40afdd8abaac111b13825dd5e5e2ddddb44f86d5a0dd6dcf38c20aae6b67e4",oauth_token="2b0ce516420110bcbd36b69e99196d1b7f6de3c6234c5afb799b73d87569f5cc",oauth_signature_method="HMAC-SHA256",oauth_timestamp="1508242306",oauth_nonce="fjaLirsIcCGVZWzBX0pg",oauth_version="1.0",oauth_signature="i7MEtGwhCTIZbTsTrNGw9LdcERn4wsjt5C7TxmKWIfU%3D"
210
+ </code></pre></div></div>
211
+
212
+ <h2 id="the-inputs">The Inputs</h2>
213
+
214
+ <p>To compute a signature, we need a few things first. Let’s walk through each one and how to find it:</p>
215
+
216
+ <h3 id="method"><code class="highlighter-rouge">method</code></h3>
217
+
218
+ <p>The request method will be one of the following:</p>
219
+
220
+ <ul>
221
+ <li><code class="highlighter-rouge">POST</code></li>
222
+ <li><code class="highlighter-rouge">PUT</code></li>
223
+ <li><code class="highlighter-rouge">PATCH</code></li>
224
+ <li><code class="highlighter-rouge">GET</code></li>
225
+ <li><code class="highlighter-rouge">DELETE</code></li>
226
+ </ul>
227
+
228
+ <h3 id="consumer_key-consumer_secret"><code class="highlighter-rouge">consumer_key</code>, <code class="highlighter-rouge">consumer_secret</code></h3>
229
+
230
+ <p>The consumer key and secret can be retrieved from NetSuite by creating an Integration Record. Note that these values are only shown once at the end of creating a new Integration Record. Once you navigate away, you will no longer be able to see these values. You can reset the key and secret on existing Integration Records should you need to generate a new pair.</p>
231
+
232
+ <h3 id="signature_method"><code class="highlighter-rouge">signature_method</code></h3>
233
+
234
+ <p>NetSuite supports multiple signature methods. Our library uses HMAC-SHA256.</p>
235
+
236
+ <h3 id="timestamp"><code class="highlighter-rouge">timestamp</code></h3>
237
+
238
+ <p>We need to include a current timestamp in the signature and header.</p>
239
+
240
+ <h3 id="nonce"><code class="highlighter-rouge">nonce</code></h3>
241
+
242
+ <p>We need to include a random alphanumeric string to be used in the signature and header.</p>
243
+
244
+ <h3 id="oauth_version"><code class="highlighter-rouge">oauth_version</code></h3>
245
+
246
+ <p>The OAuth Version is defaults to “1.0”</p>
247
+
248
+ <h3 id="realm"><code class="highlighter-rouge">realm</code></h3>
249
+
250
+ <p>The realm is the NetSuite account ID. You can find this in your account or in the URL:</p>
251
+
252
+ <p><code class="highlighter-rouge">https://&lt;ACCOUNT_ID&gt;.app.netsuite.com/app/center/card.nl</code></p>
253
+
254
+ <p>If you are using a sandbox or test drive account, your account ID will include a hyphen and some other characters. For example, it may look like this: <code class="highlighter-rouge">9876543-sb1</code>.</p>
255
+
256
+ <p>Once you have the account ID, we will need to transform it to the format the API expects. You replace any hyphens with underscores (a.k.a. <code class="highlighter-rouge">_</code>) and capitalize all letters. So <code class="highlighter-rouge">9876543-sb1</code> will become <code class="highlighter-rouge">9876543_SB1</code>.</p>
257
+
258
+ <h3 id="token_id-token_secret"><code class="highlighter-rouge">token_id</code>, <code class="highlighter-rouge">token_secret</code></h3>
259
+
260
+ <p>These values can be found in NetSuite when you <a href="https://system.netsuite.com/app/setup/accesstokens.nl">create an Access Token</a>. Like the Integration Record, these values are only visible at the end of creating the token and will not be shown again. You can also reset these values on existing Access Tokens.</p>
261
+
262
+ <h3 id="url"><code class="highlighter-rouge">url</code></h3>
263
+
264
+ <p>This is the URL of the request, which must include any query string parameters you intend to pass.</p>
265
+
266
+ <h2 id="example-values">Example Values</h2>
267
+
268
+ <p>For this guide, we will use the following values:</p>
269
+
270
+ <div class="responsive-table">
271
+ <table>
272
+ <caption>Input values</caption>
273
+ <thead>
274
+ <tr>
275
+ <th>Variable</th>
276
+ <th>Value</th>
277
+ </tr>
278
+ </thead>
279
+ <tbody>
280
+ <tr>
281
+ <td><code>method</code></td>
282
+ <td><code>"GET"</code></td>
283
+ </tr>
284
+ <tr>
285
+ <td><code>consumer_key</code></td>
286
+ <td><code>"CONSUMER_KEY_VALUE"</code></td>
287
+ </tr>
288
+ <tr>
289
+ <td><code>consumer_secret</code></td>
290
+ <td><code>"CONSUMER_SECRET_VALUE"</code></td>
291
+ </tr>
292
+ <tr>
293
+ <td><code>signature_method</code></td>
294
+ <td>default, <code>"HMAC-SHA256"</code></td>
295
+ </tr>
296
+ <tr>
297
+ <td><code>timestamp</code></td>
298
+ <td>Typically, you will leave this empty, but we will use <code>1234567890</code></td>
299
+ </tr>
300
+ <tr>
301
+ <td><code>nonce</code></td>
302
+ <td>Typically, you will leave this empty, but we will use <code>"asdfasdf"</code></td>
303
+ </tr>
304
+ <tr>
305
+ <td><code>oauth_version</code></td>
306
+ <td>default, <code>"1.0"</code></td>
307
+ </tr>
308
+ <tr>
309
+ <td><code>realm</code></td>
310
+ <td><code>"9876543_SB1"</code></td>
311
+ </tr>
312
+ <tr>
313
+ <td><code>token_id</code></td>
314
+ <td><code>"TOKEN_ID_VALUE"</code></td>
315
+ </tr>
316
+ <tr>
317
+ <td><code>token_secret</code></td>
318
+ <td><code>"TOKEN_SECRET_VALUE"</code></td>
319
+ </tr>
320
+ <tr>
321
+ <td><code>url</code></td>
322
+ <td><code>"https://9876543-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/customer/123?expandSubResources=true"</code></td>
323
+ </tr>
324
+ </tbody>
325
+ </table>
326
+ </div>
327
+
328
+ <div class="alert info">
329
+ <strong>Note:</strong>
330
+ The values for <code>nonce</code> and <code>timestamp</code> should be left <code>nil</code> or unpassed in practice. They are included here for purposes of having a consistent input and output, where typically they would be generated on the fly.
331
+
332
+ </div>
333
+
334
+ <p>Throughout this tutorial, examples will appear in the following style. You can copy and paste this code in sequence to get the same results.</p>
335
+
336
+ <div class="example-container">
337
+ <div class="content">
338
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">method</span> <span class="o">=</span> <span class="s1">'GET'</span>
339
+ <span class="n">consumer_key</span> <span class="o">=</span> <span class="s1">'CONSUMER_KEY_VALUE'</span>
340
+ <span class="n">consumer_secret</span> <span class="o">=</span> <span class="s1">'CONSUMER_SECRET_VALUE'</span>
341
+ <span class="n">nonce</span> <span class="o">=</span> <span class="s1">'asdfasdf'</span>
342
+ <span class="n">oauth_version</span> <span class="o">=</span> <span class="s1">'1.0'</span>
343
+ <span class="n">realm</span> <span class="o">=</span> <span class="s1">'9876543_SB1'</span>
344
+ <span class="n">signature_method</span> <span class="o">=</span> <span class="s1">'HMAC-SHA256'</span>
345
+ <span class="n">timestamp</span> <span class="o">=</span> <span class="mi">1_234_567_890</span>
346
+ <span class="n">token_id</span> <span class="o">=</span> <span class="s1">'TOKEN_ID_VALUE'</span>
347
+ <span class="n">token_secret</span> <span class="o">=</span> <span class="s1">'TOKEN_SECRET_VALUE'</span>
348
+ <span class="n">url</span> <span class="o">=</span> <span class="s1">'https://9876543-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/customer/123?expandSubResources=true'</span>
349
+ </code></pre></div> </div>
350
+ </div>
351
+
352
+ </div>
353
+
354
+ <h2 id="generating-the-header">Generating the header</h2>
355
+
356
+ <p>Now that we have our inputs, we can walk through computing the signature and header.</p>
357
+
358
+ <p>Before we dive in, please note that many values need to be escaped. If you see <code class="highlighter-rouge">escape(...)</code> being used below, it is shorthand for the following:</p>
359
+
360
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">escape</span><span class="p">(</span><span class="n">str</span><span class="p">)</span>
361
+ <span class="no">CGI</span><span class="p">.</span><span class="nf">escape</span><span class="p">(</span><span class="n">str</span><span class="p">.</span><span class="nf">to_s</span><span class="p">).</span><span class="nf">gsub</span><span class="p">(</span><span class="sr">/\+/</span><span class="p">,</span> <span class="s1">'%20'</span><span class="p">)</span>
362
+ <span class="k">end</span>
363
+ </code></pre></div></div>
364
+
365
+ <p>Now let’s walk through each step:</p>
366
+
367
+ <h3 id="1-build-data-string">1. Build data string</h3>
368
+
369
+ <p>We need to create a string that will be used to compute a digest (a.k.a. signature) from. Using our values above, we can retrieve the string using the following:</p>
370
+
371
+ <div class="example-container">
372
+ <div class="content">
373
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">token</span> <span class="o">=</span> <span class="no">LedgerSync</span><span class="o">::</span><span class="no">Ledgers</span><span class="o">::</span><span class="no">NetSuite</span><span class="o">::</span><span class="no">Token</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span>
374
+ <span class="ss">method: </span><span class="nb">method</span><span class="p">,</span>
375
+ <span class="ss">consumer_key: </span><span class="n">consumer_key</span><span class="p">,</span>
376
+ <span class="ss">consumer_secret: </span><span class="n">consumer_secret</span><span class="p">,</span>
377
+ <span class="ss">realm: </span><span class="n">realm</span><span class="p">,</span>
378
+ <span class="ss">token_id: </span><span class="n">token_id</span><span class="p">,</span>
379
+ <span class="ss">token_secret: </span><span class="n">token_secret</span><span class="p">,</span>
380
+ <span class="ss">url: </span><span class="n">url</span>
381
+ <span class="p">)</span>
382
+
383
+ <span class="nb">puts</span> <span class="n">token</span><span class="p">.</span><span class="nf">signature_data_string</span>
384
+ </code></pre></div> </div>
385
+ </div>
386
+
387
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"GET&amp;https%3A%2F%2F9876543-sb1.suitetalk.api.netsuite.com%2Fservices%2Frest%2Frecord%2Fv1%2Fcustomer%2F123&amp;expandSubResources%3Dtrue%26oauth_consumer_key%3DCONSUMER_KEY_VALUE%26oauth_nonce%3Dasdfasdf%26oauth_signature_method%3DHMAC-SHA256%26oauth_timestamp%3D1234567890%26oauth_token%3DTOKEN_ID_VALUE%26oauth_version%3D1.0"</span>
388
+ </code></pre></div> </div>
389
+
390
+ </div>
391
+
392
+ <p>But how is this created? It is composed of three values that are escaped and joined with <code class="highlighter-rouge">&amp;</code>. The values are as follows:</p>
393
+
394
+ <ul>
395
+ <li><code class="highlighter-rouge">method</code>: Described in the inputs above.</li>
396
+ <li><code class="highlighter-rouge">url_without_params</code>: The <code class="highlighter-rouge">url</code> with all query parameters removed. In our example, this would be <code class="highlighter-rouge">https://9876543-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/customer/123</code></li>
397
+ <li><code class="highlighter-rouge">parameters_string</code>: A string representation of all URL parameters as well as the oauth parameters.</li>
398
+ </ul>
399
+
400
+ <p>Let’s dive a level deeper and look into creating the <code class="highlighter-rouge">parameters</code> string.</p>
401
+
402
+ <h3 id="1a-build-parameters-string">1a. Build parameters string</h3>
403
+
404
+ <p>The parameters string is a sorted list of key/value pairs each joined with an ampersand (<code class="highlighter-rouge">&amp;</code>). The key/value pairs come from two sources:</p>
405
+
406
+ <ul>
407
+ <li>Query parameters parsed out of the URL, in our case <code class="highlighter-rouge">{ "expandSubResources" =&gt; "true }</code></li>
408
+ <li>OAuth parameters</li>
409
+ </ul>
410
+
411
+ <p>For our example, we would have the following:</p>
412
+
413
+ <div class="example-container">
414
+ <div class="content">
415
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">url_params</span> <span class="o">=</span> <span class="p">{</span>
416
+ <span class="s2">"expandSubResources"</span> <span class="o">=&gt;</span> <span class="s2">"true"</span>
417
+ <span class="p">}</span>
418
+
419
+ <span class="n">oauth_parameters_array</span> <span class="o">=</span> <span class="p">{</span>
420
+ <span class="ss">oauth_consumer_key: </span><span class="n">consumer_key</span><span class="p">,</span>
421
+ <span class="ss">oauth_nonce: </span><span class="n">nonce</span><span class="p">,</span>
422
+ <span class="ss">oauth_signature_method: </span><span class="n">signature_method</span><span class="p">,</span>
423
+ <span class="ss">oauth_timestamp: </span><span class="n">timestamp</span><span class="p">,</span>
424
+ <span class="ss">oauth_token: </span><span class="n">token_id</span><span class="p">,</span>
425
+ <span class="ss">oauth_version: </span><span class="n">oauth_version</span>
426
+ <span class="p">}.</span><span class="nf">to_a</span>
427
+
428
+ <span class="n">parameters_string</span> <span class="o">=</span> <span class="n">url_params</span><span class="p">.</span><span class="nf">to_a</span>
429
+ <span class="p">.</span><span class="nf">concat</span><span class="p">(</span><span class="n">oauth_parameters_array</span><span class="p">)</span>
430
+ <span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="o">|</span> <span class="p">[</span><span class="n">escape</span><span class="p">(</span><span class="n">k</span><span class="p">),</span> <span class="n">escape</span><span class="p">(</span><span class="n">v</span><span class="p">)]</span> <span class="p">}</span>
431
+ <span class="p">.</span><span class="nf">sort</span> <span class="p">{</span> <span class="o">|</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">|</span> <span class="n">a</span> <span class="o">&lt;=&gt;</span> <span class="n">b</span> <span class="p">}</span>
432
+ <span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">e</span><span class="o">|</span> <span class="s2">"</span><span class="si">#{</span><span class="n">e</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2">=</span><span class="si">#{</span><span class="n">e</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span> <span class="p">}</span>
433
+ <span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s1">'&amp;'</span><span class="p">)</span>
434
+
435
+ <span class="nb">puts</span> <span class="n">parameters_string</span>
436
+ </code></pre></div> </div>
437
+ </div>
438
+
439
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"expandSubResources=true&amp;oauth_consumer_key=CONSUMER_KEY_VALUE&amp;oauth_nonce=asdfasdf&amp;oauth_signature_method=HMAC-SHA256&amp;oauth_timestamp=1234567890&amp;oauth_token=TOKEN_ID_VALUE&amp;oauth_version=1.0"</span>
440
+ </code></pre></div> </div>
441
+
442
+ </div>
443
+
444
+ <h3 id="1b-put-it-together">1b. Put it together</h3>
445
+
446
+ <p>Now that we have our <code class="highlighter-rouge">parameters_string</code>, we can generate the following:</p>
447
+
448
+ <div class="example-container">
449
+ <div class="content">
450
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">url_without_params</span> <span class="o">=</span> <span class="s2">"https://9876543-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/customer/123"</span>
451
+
452
+ <span class="n">signature_data_string</span> <span class="o">=</span> <span class="p">[</span>
453
+ <span class="nb">method</span><span class="p">,</span>
454
+ <span class="n">escape</span><span class="p">(</span><span class="n">url_without_params</span><span class="p">),</span>
455
+ <span class="n">escape</span><span class="p">(</span><span class="n">parameters_string</span><span class="p">)</span>
456
+ <span class="p">].</span><span class="nf">join</span><span class="p">(</span><span class="s1">'&amp;'</span><span class="p">)</span>
457
+ </code></pre></div> </div>
458
+ </div>
459
+
460
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"GET&amp;https%3A%2F%2F9876543-sb1.suitetalk.api.netsuite.com%2Fservices%2Frest%2Frecord%2Fv1%2Fcustomer%2F123&amp;expandSubResources%3Dtrue%26oauth_consumer_key%3DCONSUMER_KEY_VALUE%26oauth_nonce%3Dasdfasdf%26oauth_signature_method%3DHMAC-SHA256%26oauth_timestamp%3D1234567890%26oauth_token%3DTOKEN_ID_VALUE%26oauth_version%3D1.0"</span>
461
+ </code></pre></div> </div>
462
+
463
+ </div>
464
+
465
+ <h2 id="2-build-signature-key">2. Build signature key</h2>
466
+
467
+ <p>The final piece needed to generate a signature is the key. Our key is made by joining our <code class="highlighter-rouge">consumer_secret</code> to <code class="highlighter-rouge">token_secret</code> with an ampersand (<code class="highlighter-rouge">&amp;</code>):</p>
468
+
469
+ <div class="example-container">
470
+ <div class="content">
471
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">key</span> <span class="o">||=</span> <span class="p">[</span>
472
+ <span class="n">consumer_secret</span><span class="p">,</span>
473
+ <span class="n">token_secret</span>
474
+ <span class="p">].</span><span class="nf">join</span><span class="p">(</span><span class="s1">'&amp;'</span><span class="p">)</span>
475
+ </code></pre></div> </div>
476
+ </div>
477
+
478
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"CONSUMER_SECRET_VALUE&amp;TOKEN_SECRET_VALUE"</span>
479
+ </code></pre></div> </div>
480
+
481
+ </div>
482
+
483
+ <h2 id="3-compute-signature">3. Compute signature</h2>
484
+
485
+ <p>Now with our <code class="highlighter-rouge">signature_data_string</code>, we will use the desired <code class="highlighter-rouge">signature_method</code> to compute a digest. We will assume we are using <code class="highlighter-rouge">HMAC-SHA256</code>.</p>
486
+
487
+ <div class="example-container">
488
+ <div class="content">
489
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">signature</span> <span class="o">||=</span> <span class="no">Base64</span><span class="p">.</span><span class="nf">encode64</span><span class="p">(</span>
490
+ <span class="no">OpenSSL</span><span class="o">::</span><span class="no">HMAC</span><span class="p">.</span><span class="nf">digest</span><span class="p">(</span>
491
+ <span class="no">OpenSSL</span><span class="o">::</span><span class="no">Digest</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s1">'sha256'</span><span class="p">),</span>
492
+ <span class="n">key</span><span class="p">,</span>
493
+ <span class="n">signature_data_string</span>
494
+ <span class="p">)</span>
495
+ <span class="p">).</span><span class="nf">strip</span>
496
+ </code></pre></div> </div>
497
+ </div>
498
+
499
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"cId0B3hP0sFVQw/gjQ/P6YiOSx76u0WfyO8umOlq3gg="</span>
500
+ </code></pre></div> </div>
501
+
502
+ </div>
503
+
504
+ <h2 id="4-generate-header">4. Generate Header</h2>
505
+
506
+ <p>Last but not least, we can now generate our header. The header is made by combining all of the inputs and our signature together in comma-separated, key-value pairs:</p>
507
+
508
+ <div class="example-container">
509
+ <div class="content">
510
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">authorization_parts</span> <span class="o">=</span> <span class="p">[</span>
511
+ <span class="p">[</span><span class="ss">:realm</span><span class="p">,</span> <span class="n">realm</span><span class="p">],</span>
512
+ <span class="p">[</span><span class="ss">:oauth_consumer_key</span><span class="p">,</span> <span class="n">escape</span><span class="p">(</span><span class="n">consumer_key</span><span class="p">)],</span>
513
+ <span class="p">[</span><span class="ss">:oauth_token</span><span class="p">,</span> <span class="n">escape</span><span class="p">(</span><span class="n">token_id</span><span class="p">)],</span>
514
+ <span class="p">[</span><span class="ss">:oauth_signature_method</span><span class="p">,</span> <span class="n">signature_method</span><span class="p">],</span>
515
+ <span class="p">[</span><span class="ss">:oauth_timestamp</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">],</span>
516
+ <span class="p">[</span><span class="ss">:oauth_nonce</span><span class="p">,</span> <span class="n">escape</span><span class="p">(</span><span class="n">nonce</span><span class="p">)],</span>
517
+ <span class="p">[</span><span class="ss">:oauth_version</span><span class="p">,</span> <span class="n">oauth_version</span><span class="p">],</span>
518
+ <span class="p">[</span><span class="ss">:oauth_signature</span><span class="p">,</span> <span class="n">escape</span><span class="p">(</span><span class="n">signature</span><span class="p">)]</span>
519
+ <span class="p">]</span>
520
+
521
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
522
+ <span class="s1">'Authorization'</span> <span class="o">=&gt;</span> <span class="s2">"OAuth </span><span class="si">#{</span><span class="n">authorization_parts</span><span class="p">.</span><span class="nf">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="o">|</span> <span class="s2">"</span><span class="si">#{</span><span class="n">k</span><span class="si">}</span><span class="s2">=</span><span class="se">\"</span><span class="si">#{</span><span class="n">v</span><span class="si">}</span><span class="se">\"</span><span class="s2">"</span> <span class="si">}</span><span class="s2">.join(',')}"</span>
523
+ <span class="p">}</span>
524
+
525
+ <span class="nb">puts</span> <span class="n">headers</span>
526
+ </code></pre></div> </div>
527
+
528
+ </div>
529
+
530
+ <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="s2">"Authorization"</span><span class="o">=&gt;</span><span class="s2">"OAuth realm=</span><span class="se">\"</span><span class="s2">9876543_SB1</span><span class="se">\"</span><span class="s2">,oauth_consumer_key=</span><span class="se">\"</span><span class="s2">CONSUMER_KEY_VALUE</span><span class="se">\"</span><span class="s2">,oauth_token=</span><span class="se">\"</span><span class="s2">TOKEN_ID_VALUE</span><span class="se">\"</span><span class="s2">,oauth_signature_method=</span><span class="se">\"</span><span class="s2">HMAC-SHA256</span><span class="se">\"</span><span class="s2">,oauth_timestamp=</span><span class="se">\"</span><span class="s2">1234567890</span><span class="se">\"</span><span class="s2">,oauth_nonce=</span><span class="se">\"</span><span class="s2">asdfasdf</span><span class="se">\"</span><span class="s2">,oauth_version=</span><span class="se">\"</span><span class="s2">1.0</span><span class="se">\"</span><span class="s2">,oauth_signature=</span><span class="se">\"</span><span class="s2">cId0B3hP0sFVQw%2FgjQ%2FP6YiOSx76u0WfyO8umOlq3gg%3D</span><span class="se">\"</span><span class="s2">"</span><span class="p">}</span>
531
+ </code></pre></div> </div>
532
+
533
+ </div>
534
+
535
+ <h2 id="wrapping-up">Wrapping up</h2>
536
+
537
+ <p>All that is left is to use this header in a request. You will need a new signature (and therefore new header) per-request. And that’s it!</p>
538
+
539
+ <p>While not difficult in practice, it was by trial-and-error we were ultimately able to authenticate to NetSuite. Hopefully this post saves you some time!</p>
540
+
541
+ <p>It is highly recommended that you write comprehensive unit tests for this code. We wrote some tests in RSpec. These test are a great resource for examples you can test against.</p>
542
+
543
+ </div><!-- .post-content -->
544
+ </div><!-- .inner-md -->
545
+ </article><!-- .post -->
546
+
547
+ <!-- Next/previous post navigation TBD -->
548
+ <!--
549
+ <div class="inner-md outer">
550
+ <nav class="read-next">
551
+ <h2 class="read-next-title line-left">Read Next</h2>
552
+ <div class="nav-links">
553
+ <article class="post">
554
+ <div class="post-meta">
555
+ <time class="published" datetime="">Previous post date</time>
556
+ </div>
557
+ <h3 class="post-title"><a href="#" rel="bookmark">Previous Post Title</a></h3>
558
+ </article>
559
+ <article class="post">
560
+ <div class="post-meta">
561
+ <time class="published" datetime="">Next post date</time>
562
+ </div>
563
+ <h3 class="post-title"><a href="#" rel="bookmark">Next Post Title</a></h3>
564
+ </article>
565
+ </div>
566
+ </nav>
567
+ </div>
568
+ -->
569
+
570
+ </main><!-- .site-content -->
571
+ <footer id="colophon" class="site-footer outer">
572
+ <div class="inner">
573
+ <div class="site-footer-inside">
574
+ <p class="site-info">
575
+
576
+ <span class="copyright">&copy; Modern Treasury Inc. All rights reserved.</span>
577
+ <a class="" href="https://www.moderntreasury.com" target="_blank" rel="noopener" >
578
+
579
+ Maintained with ❤️ in San Francisco, CA by Modern Treasury
580
+
581
+ </a>
582
+ </p>
583
+ <!-- .site-info -->
584
+
585
+ <div class="social-links">
586
+
587
+ <a class="" href="https://www.netlify.com" target="_blank" rel="noopener" >
588
+
589
+ <img src="https://www.netlify.com/img/global/badges/netlify-dark.svg" alt="Deploys by Netlify" />
590
+
591
+ </a>
592
+ <a class="button button-icon" href="https://twitter.com/ModernTreasury" target="_blank" rel="noopener" >
593
+
594
+ <span class="icon fab fa-twitter" aria-hidden="true"></span><span class="screen-reader-text">Twitter</span>
595
+
596
+ </a>
597
+ <a class="button button-icon" href="https://www.linkedin.com/company/modern-treasury" target="_blank" rel="noopener" >
598
+
599
+ <span class="icon fab fa-linkedin" aria-hidden="true"></span><span class="screen-reader-text">LinkedIn</span>
600
+
601
+ </a>
602
+ <a class="button button-icon" href="https://github.com/LedgerSync/ledger_sync" target="_blank" rel="noopener" >
603
+
604
+ <span class="icon fab fa-github" aria-hidden="true"></span><span class="screen-reader-text">GitHub</span>
605
+
606
+ </a>
607
+ </div>
608
+ <!-- .social-links -->
609
+
610
+ </div>
611
+ <!-- .site-footer-inside -->
612
+ </div>
613
+ <!-- .inner -->
614
+ </footer>
615
+ <!-- .site-footer -->
616
+ </div><!-- .site -->
617
+
618
+ <!-- Scripts -->
619
+ <script src="/assets/js/plugins.js"></script>
620
+ <script src="/assets/js/prism.js" data-manual></script>
621
+ <script src="/assets/js/main.js"></script>
622
+ </body>
623
+
624
+ </html>