module NetSuiteRails::RecordSync::InstanceMethods

Attributes

netsuite_manual_fields[W]

Public Instance Methods

netsuite_async_jobs?() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 139
def netsuite_async_jobs?
  self.netsuite_sync_options[:sync_mode] == :async || (self.netsuite_sync_options[:sync_mode].blank? && NetSuiteRails::Configuration.netsuite_sync_mode == :async)
end
netsuite_custom_record?() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 239
def netsuite_custom_record?
  self.netsuite_record_class == NetSuite::Records::CustomRecord
end
netsuite_execute_callbacks(list, record) click to toggle source

TODO this should be protected; it needs to be pushed down to the Push/Pull manager level

# File lib/netsuite_rails/record_sync.rb, line 245
def netsuite_execute_callbacks(list, record)
  list.each do |callback|
    if callback.is_a?(Symbol)
      self.send(callback, record)
    else
      instance_exec(record, &callback)
    end
  end
end
netsuite_extract_from_record(netsuite_record) click to toggle source

TODO move this login into separate service object

# File lib/netsuite_rails/record_sync.rb, line 171
def netsuite_extract_from_record(netsuite_record)
  Rails.logger.info "NetSuite: Pull #{netsuite_record.class} #{netsuite_record.internal_id}"

  @netsuite_pulling = true

  field_hints = self.netsuite_field_hints

  custom_field_list = self.netsuite_field_map[:custom_field_list] || {}

  all_field_list = self.netsuite_field_map.except(:custom_field_list) || {}
  all_field_list.merge!(custom_field_list)

  # TODO should have a helper module for common push/pull methods
  reflection_attributes = NetSuiteRails::RecordSync::PushManager.relationship_attributes_list(self)

  # handle non-collection associations
  association_keys = reflection_attributes.values.reject(&:collection?).map(&:name)

  all_field_list.each do |local_field, netsuite_field|
    is_custom_field = custom_field_list.keys.include?(local_field)

    if netsuite_field.is_a?(Proc)
      netsuite_field.call(self, netsuite_record, :pull)
      next
    end

    field_value = if is_custom_field
      netsuite_record.custom_field_list.send(netsuite_field).value rescue ""
    else
      netsuite_record.send(netsuite_field)
    end

    if field_value.nil?
      # TODO possibly nil out the local value?
      next
    end

    if association_keys.include?(local_field)
      field_value = reflection_attributes[local_field].
        klass.
        where(netsuite_id: field_value.internal_id).
        first_or_initialize
    elsif is_custom_field
      field_value = NetSuiteRails::RecordSync::PullManager.extract_custom_field_value(field_value)
    else
      # then it's not a custom field
    end

    # TODO should we just check for nil? vs present?

    if field_hints.has_key?(local_field) && !field_value.nil?
      field_value = NetSuiteRails::Transformations.transform(field_hints[local_field], field_value, :pull)
    end

    self.send(:"#{local_field}=", field_value)
  end

  netsuite_execute_callbacks(self.class.after_netsuite_pull, netsuite_record)

  @netsuite_pulling = false
  @netsuite_pulled = true
end
netsuite_field_hints() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 125
def netsuite_field_hints
  self.class.netsuite_field_hints
end
netsuite_field_map() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 121
def netsuite_field_map
  self.class.netsuite_field_map
end
netsuite_manual_fields() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 103
def netsuite_manual_fields
  @netsuite_manual_fields ||= []
end
netsuite_pull(opts = {}) click to toggle source

TODO need to support the opts hash

# File lib/netsuite_rails/record_sync.rb, line 144
def netsuite_pull(opts = {})
  netsuite_extract_from_record(netsuite_pull_record)

  if self.netsuite_async_jobs?
    # without callbacks?
    self.save
  end
end
netsuite_pull_record() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 153
def netsuite_pull_record
  # TODO support use_external_id / netsuite_external_id

  if netsuite_custom_record?
    NetSuite::Records::CustomRecord.get(
      internal_id: self.netsuite_id,
      type_id: self.class.netsuite_custom_record_type_id
    )
  else
    self.netsuite_record_class.get(self.netsuite_id)
  end
end
netsuite_pulled?() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 135
def netsuite_pulled?
  @netsuite_pulled ||= false
end
netsuite_pulling?() click to toggle source

assumes netsuite_id field on activerecord

# File lib/netsuite_rails/record_sync.rb, line 131
def netsuite_pulling?
  @netsuite_pulling ||= false
end
netsuite_push(opts = {}) click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 166
def netsuite_push(opts = {})
  NetSuiteRails::RecordSync::PushManager.push(self, opts)
end
netsuite_record_class() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 117
def netsuite_record_class
  self.class.netsuite_record_class
end
netsuite_sync() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 113
def netsuite_sync
  self.class.netsuite_sync
end
netsuite_sync_options() click to toggle source

these methods are here for easy model override

# File lib/netsuite_rails/record_sync.rb, line 109
def netsuite_sync_options
  self.class.netsuite_sync_options
end
new_netsuite_record?() click to toggle source
# File lib/netsuite_rails/record_sync.rb, line 235
def new_netsuite_record?
  self.netsuite_id.blank?
end