Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'qbwc'
- module Spree::QuickbooksDesktopIntegration
- extend ActiveSupport::Concern
- #
- # Quickbooks Desktop Integration
- #
- # settings_key: qbd
- #
- # value: {
- # username,
- # password,
- # group_sync,
- # match_with_name,
- # send_as_invoice,
- # create_related_objects
- # sweet_is_master
- # }
- def qbd_methods
- {
- download_qwc: { title: "Download", class: "btn btn-info" },
- }
- end
- def qbd_callbacks
- {
- }
- end
- def qbd_generate_defaults
- self.qbd_username = self.vendor.name.titleize.tr(' ', '').underscore
- self.qbd_password = SecureRandom.hex(6)
- self.qbd_match_with_name = true
- self.qbd_send_as_invoice = true
- self.qbd_send_order_changes_as_memo = false
- self.qbd_create_related_objects = true
- self.qbd_sweet_is_master = false
- self.qbd_use_multi_site_inventory = false
- end
- # form fields
- def qbd_username
- self.settings['qbd']['username'] rescue ''
- end
- def qbd_username=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['username'] = value
- end
- def qbd_password
- self.settings['qbd']['password'] rescue ''
- end
- def qbd_password=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['password'] = value
- end
- def qbd_group_sync
- ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['group_sync']) rescue false
- end
- def qbd_group_sync=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['group_sync'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
- end
- def qbd_match_with_name
- ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['match_with_name']) rescue false
- end
- def qbd_match_with_name=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['match_with_name'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
- end
- def qbd_send_as_invoice
- ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['send_as_invoice']) rescue false
- end
- def qbd_send_as_invoice=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['send_as_invoice'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
- end
- def qbd_send_order_changes_as_memo
- ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['send_order_changes_as_memo']) rescue false
- end
- def qbd_send_order_changes_as_memo=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['send_order_changes_as_memo'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
- end
- def qbd_create_related_objects
- ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['create_related_objects']) rescue false
- end
- def qbd_create_related_objects=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['create_related_objects'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
- end
- def qbd_sweet_is_master
- ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['sweet_is_master']) rescue false
- end
- def qbd_sweet_is_master=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['sweet_is_master'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
- end
- def qbd_use_multi_site_inventory
- ActiveRecord::Type::Boolean.new.type_cast_from_database(self.settings['qbd']['use_multi_site_inventory']) rescue false
- end
- def qbd_use_multi_site_inventory=(value)
- self.settings = {} unless self.settings
- self.settings['qbd'] = {} unless self.settings['qbd']
- self.settings['qbd']['use_multi_site_inventory'] = ActiveRecord::Type::Boolean.new.type_cast_from_database(value)
- end
- def qbd_name
- self.settings.fetch('qbd', {}).fetch('username', '')
- end
- # action methods
- def qbd_download_qwc(params, integration_url)
- builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
- xml.QBWCXML {
- xml.AppName "Sweet Management App"
- xml.AppID "#{Rails.application.class.parent_name}-#{Time.now.strftime('%Y%m%d%H%M%S')}"
- xml.AppURL ""# TBD
- xml.AppDescription ""
- xml.AppSupport ""# TBD
- xml.UserName "#{self.qbd_username}"
- xml.OwnerID "#{QBWC.owner_id}"
- xml.FileID "{#{SecureRandom.uuid}}"
- xml.QBType "QBFS"
- xml.Scheduler {
- xml.RunEveryNMinutes 60
- }
- xml.Style "Document"
- xml.IsReadOnly false
- }
- end
- { file_data: builder.to_xml, file_name: 'Sweet_QBDesktopSetup.qwc' }
- end
- # execute method
- def qbd_execute(integrationable_id, integrationable_type, integration_action)
- if Rails.env == "production" || Rails.env == "staging"
- case integrationable_type
- when 'Spree::Order'
- self.qbd_synchronize_order(integrationable_id, integration_action)
- when 'Spree::Account'
- self.qbd_synchronize_account(integrationable_id, integration_action)
- when 'Spree::Variant'
- self.qbd_synchronize_variant(integrationable_id, integration_action)
- else
- { status: false, log: 'Unknown Integrationable Type' }
- end
- else
- { status: false, log: 'NOTIFICATION WARNING: QuickBooks Desktop notifications are enabled in Production Only!'}
- end
- end
- def qbd_synchronize_order(order_id, integration_action)
- # add code to synchronize order to QBWC invoice or sales order
- if response.try(:code) == "200"
- { status: nil, log: response.try(:body) }
- else
- { status: false, log: response.fetch(:body) }
- end
- end
- def qbd_synchronize_account(customer_id, integration_action)
- # add code to synchronize account to QBWC customer
- if response.try(:code) == "200"
- { status: nil, log: response.try(:body) }
- else
- { status: false, log: response.fetch(:body) }
- end
- end
- def qbd_synchronize_variant(variant_id, integration_action)
- # add code to synchronize variant to QBWC item
- if response.try(:code) == "200"
- { status: nil, log: response.try(:body) }
- else
- { status: false, log: response.fetch(:body) }
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement