Advertisement
Guest User

Untitled

a guest
Apr 29th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.63 KB | None | 0 0
  1. require 'qbwc'
  2.  
  3. module Spree::QuickbooksDesktopIntegration
  4. extend ActiveSupport::Concern
  5. #
  6. # Quickbooks Desktop Integration
  7. #
  8. # settings_key: qbd
  9. #
  10. # value: {
  11. # username,
  12. # password,
  13. # group_sync,
  14. # match_with_name,
  15. # send_as_invoice,
  16. # create_related_objects
  17. # sweet_is_master
  18. # }
  19.  
  20. def qbd_methods
  21. {
  22. download_qwc: { title: "Download", class: "btn btn-info" },
  23. }
  24. end
  25.  
  26. def qbd_callbacks
  27. {
  28.  
  29. }
  30. end
  31.  
  32. def qbd_generate_defaults
  33. self.qbd_username = self.vendor.name.titleize.tr(' ', '').underscore
  34. self.qbd_password = SecureRandom.hex(6)
  35. self.qbd_match_with_name = true
  36. self.qbd_send_as_invoice = true
  37. self.qbd_send_order_changes_as_memo = false
  38. self.qbd_create_related_objects = true
  39. self.qbd_sweet_is_master = false
  40. self.qbd_use_multi_site_inventory = false
  41. end
  42.  
  43. # form fields
  44.  
  45. def qbd_username
  46. self.settings['qbd']['username'] rescue ''
  47. end
  48. def qbd_username=(value)
  49. self.settings = {} unless self.settings
  50. self.settings['qbd'] = {} unless self.settings['qbd']
  51. self.settings['qbd']['username'] = value
  52. end
  53. def qbd_password
  54. self.settings['qbd']['password'] rescue ''
  55. end
  56. def qbd_password=(value)
  57. self.settings = {} unless self.settings
  58. self.settings['qbd'] = {} unless self.settings['qbd']
  59. self.settings['qbd']['password'] = value
  60. end
  61. def qbd_group_sync
  62. ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['group_sync']) rescue false
  63. end
  64. def qbd_group_sync=(value)
  65. self.settings = {} unless self.settings
  66. self.settings['qbd'] = {} unless self.settings['qbd']
  67. self.settings['qbd']['group_sync'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
  68. end
  69. def qbd_match_with_name
  70. ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['match_with_name']) rescue false
  71. end
  72. def qbd_match_with_name=(value)
  73. self.settings = {} unless self.settings
  74. self.settings['qbd'] = {} unless self.settings['qbd']
  75. self.settings['qbd']['match_with_name'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
  76. end
  77. def qbd_send_as_invoice
  78. ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['send_as_invoice']) rescue false
  79. end
  80. def qbd_send_as_invoice=(value)
  81. self.settings = {} unless self.settings
  82. self.settings['qbd'] = {} unless self.settings['qbd']
  83. self.settings['qbd']['send_as_invoice'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
  84. end
  85. def qbd_send_order_changes_as_memo
  86. ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['send_order_changes_as_memo']) rescue false
  87. end
  88. def qbd_send_order_changes_as_memo=(value)
  89. self.settings = {} unless self.settings
  90. self.settings['qbd'] = {} unless self.settings['qbd']
  91. self.settings['qbd']['send_order_changes_as_memo'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
  92. end
  93. def qbd_create_related_objects
  94. ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['create_related_objects']) rescue false
  95. end
  96. def qbd_create_related_objects=(value)
  97. self.settings = {} unless self.settings
  98. self.settings['qbd'] = {} unless self.settings['qbd']
  99. self.settings['qbd']['create_related_objects'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
  100. end
  101. def qbd_sweet_is_master
  102. ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['sweet_is_master']) rescue false
  103. end
  104. def qbd_sweet_is_master=(value)
  105. self.settings = {} unless self.settings
  106. self.settings['qbd'] = {} unless self.settings['qbd']
  107. self.settings['qbd']['sweet_is_master'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
  108. end
  109. def qbd_use_multi_site_inventory
  110. ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['use_multi_site_inventory']) rescue false
  111. end
  112. def qbd_use_multi_site_inventory=(value)
  113. self.settings = {} unless self.settings
  114. self.settings['qbd'] = {} unless self.settings['qbd']
  115. self.settings['qbd']['use_multi_site_inventory'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
  116. end
  117.  
  118. def qbd_name
  119. self.settings.fetch('qbd', {}).fetch('username', '')
  120. end
  121.  
  122. # action methods
  123.  
  124. def qbd_download_qwc(params, integration_url)
  125. builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
  126. xml.QBWCXML {
  127. xml.AppName "Sweet Management App"
  128. xml.AppID "#{Rails.application.class.parent_name}-#{Time.now.strftime('%Y%m%d%H%M%S')}"
  129. xml.AppURL ""# TBD
  130. xml.AppDescription ""
  131. xml.AppSupport ""# TBD
  132. xml.UserName "#{self.qbd_username}"
  133. xml.OwnerID "#{QBWC.owner_id}"
  134. xml.FileID "{#{SecureRandom.uuid}}"
  135. xml.QBType "QBFS"
  136. xml.Scheduler {
  137. xml.RunEveryNMinutes 60
  138. }
  139. xml.Style "Document"
  140. xml.IsReadOnly false
  141. }
  142. end
  143. { file_data: builder.to_xml, file_name: 'Sweet_QBDesktopSetup.qwc' }
  144. end
  145.  
  146. # execute method
  147.  
  148. def qbd_execute(integrationable_id, integrationable_type, integration_action)
  149. if Rails.env == "production" || Rails.env == "staging"
  150. case integrationable_type
  151. when 'Spree::Order'
  152. self.qbd_synchronize_order(integrationable_id, integration_action)
  153. when 'Spree::Account'
  154. self.qbd_synchronize_account(integrationable_id, integration_action)
  155. when 'Spree::Variant'
  156. self.qbd_synchronize_variant(integrationable_id, integration_action)
  157. else
  158. { status: false, log: 'Unknown Integrationable Type' }
  159. end
  160. else
  161. { status: false, log: 'NOTIFICATION WARNING: QuickBooks Desktop notifications are enabled in Production Only!'}
  162. end
  163. end
  164.  
  165. def qbd_synchronize_order(order_id, integration_action)
  166. # add code to synchronize order to QBWC invoice or sales order
  167. if response.try(:code) == "200"
  168. { status: nil, log: response.try(:body) }
  169. else
  170. { status: false, log: response.fetch(:body) }
  171. end
  172. end
  173.  
  174. def qbd_synchronize_account(customer_id, integration_action)
  175. # add code to synchronize account to QBWC customer
  176. if response.try(:code) == "200"
  177. { status: nil, log: response.try(:body) }
  178. else
  179. { status: false, log: response.fetch(:body) }
  180. end
  181. end
  182.  
  183. def qbd_synchronize_variant(variant_id, integration_action)
  184. # add code to synchronize variant to QBWC item
  185. if response.try(:code) == "200"
  186. { status: nil, log: response.try(:body) }
  187. else
  188. { status: false, log: response.fetch(:body) }
  189. end
  190. end
  191.  
  192. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement