Module: NetSuite::Utilities

Extended by:
Utilities
Included in:
Utilities
Defined in:
lib/netsuite/utilities.rb

Instance Method Summary collapse

Instance Method Details

#backoff(options = {}) ⇒ Object

TODO need structured logger for various statements



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/netsuite/utilities.rb', line 7

def backoff(options = {})
  count = 0
  begin
    count += 1
    yield
  rescue options[:exception] || Savon::SOAPFault => e
    if !e.message.include?("Only one request may be made against a session at a time")
      raise e
    end
    if count >= (options[:attempts] || 8)
      raise e
    end
    # log.warn("concurrent request failure", sleep: count, attempt: count)
    sleep(count)
    retry
  end
end

#data_center_url(netsuite_account) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/netsuite/utilities.rb', line 95

def data_center_url()
  begin
    data_center_call_response = NetSuite::Configuration.connection({}, {
      email: '',
      password: '',
      account: ''
    }).call(:get_data_center_urls, message: {
      'platformMsgs:account' => 
    })

    if data_center_call_response.success?
      return data_center_call_response.body[:get_data_center_urls_response][:get_data_center_urls_result][:data_center_urls][:webservices_domain]
    else
      # log.error "error getting data center url"
    end
  rescue Exception => e
    # log.error "error determining correct datacenter for account #{netsuite_account}. #{e.message}"

    # TODO silence this later: for now we need to investigate when this would occur
    raise(e)
  end
end

#find_record(record, names, opts = {}) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/netsuite/utilities.rb', line 55

def find_record(record, names, opts = {})
  field_name = opts[:field_name]

  names = [ names ] if names.is_a?(String)

  # FIXME: Records that have the same name but different types will break
  # the cache
  names.each do |name|
    @netsuite_find_record_cache ||= {}

    if @netsuite_find_record_cache.has_key?(name)
      return @netsuite_find_record_cache[name]
    end

    # sniff for an email-like input; useful for employee/customer searches
    if !field_name && /@.*\./ =~ name
      field_name = 'email'
    end

    field_name ||= 'name'

    # TODO remove backoff when it's built-in to search
    search = backoff { record.search({
      basic: [
        {
          field: field_name,
          operator: 'contains',
          value: name,
        }
      ]
    }) }

    if search.results.first
      return @netsuite_find_record_cache[name] = search.results.first
    end
  end

  nil
end

#get_record(record_klass, id, opts = {}) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/netsuite/utilities.rb', line 38

def get_record(record_klass, id, opts = {})
  opts[:external_id] ||= false

  begin
    # log.debug("get record", netsuite_record_type: record_klass.name, netsuite_record_id: id)

    if opts[:external_id]
      return backoff { record_klass.get(external_id: id) }
    else
      return backoff { record_klass.get(id) }
    end
  rescue ::NetSuite::RecordNotFound
    # log.warn("record not found", ns_record_type: record_klass.name, ns_record_id: id)
    return nil
  end
end

#normalize_datetime_from_netsuite(datetime) ⇒ Object

use when displaying times from a NS record



139
140
141
142
143
144
145
# File 'lib/netsuite/utilities.rb', line 139

def normalize_datetime_from_netsuite(datetime)
  # the code below eliminates the TimeZone offset then shifts the date forward 2 hours (7200 seconds)
  # this ensures that ActiveRecord is given a UTC0 DateTime with the exact hour that
  # was displayed in the NS UI (CST time zone), which will result in the correct display on the web side

  datetime.new_offset(0) + datetime.offset + Rational(2, 24)
end

#normalize_datetime_to_netsuite(datetime) ⇒ Object

use when sending times to NS



128
129
130
131
132
133
134
135
136
# File 'lib/netsuite/utilities.rb', line 128

def normalize_datetime_to_netsuite(datetime)
  # normalize the time to UCT0
  # add 6 hours (21600 seconds) of padding (CST offset)
  # to force the same time to be displayed in the NS UI

  is_dst = Time.parse(datetime.to_s).dst?

  datetime.new_offset(0) + datetime.offset + Rational(is_dst ? 5 : 6, 24)
end

#request_failed?(ns_object) ⇒ Boolean

Returns:

  • (Boolean)


25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/netsuite/utilities.rb', line 25

def request_failed?(ns_object)
  return false if ns_object.errors.nil? || ns_object.errors.empty?

  warnings = ns_object.errors.select { |x| x.type == "WARN" }
  errors = ns_object.errors.select { |x| x.type == "ERROR" }

  # warnings.each do |warn|
  #   log.warn(warn.message, code: warn.code)
  # end

  return errors.size > 0
end