Class: Mblox::SmsReceipt

Inherits:
Object
  • Object
show all
Defined in:
lib/mblox/sms_receipt.rb

Constant Summary collapse

ATTRIBUTES =
[:batch_id, :subscriber_number, :msg_reference, :status, :timestamp, :reason, :operator]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ SmsReceipt

Returns a new instance of SmsReceipt.

Raises:

  • (::ArgumentError)
[View source]

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/mblox/sms_receipt.rb', line 9

def initialize args
  args = args.symbolize_keys
  ATTRIBUTES.each do |attr|
    __send__("#{attr}=", args[attr])
    args.delete(attr)
  end
  raise ::ArgumentError, "Unrecognized attributes: #{args.inspect}" unless args.empty?
  missing_fields = ATTRIBUTES.reject { |attr| [:timestamp, :reason, :operator].include?(attr) || __send__(attr) }
  if 1 == missing_fields.count
    raise ValidationError, "#{missing_fields.first} cannot be blank"
  elsif missing_fields.count > 1
    raise ValidationError, "The following fields cannot be blank: #{missing_fields.join(', ')}"
  end
  raise ValidationError, "batch_id must be a Fixnum" unless batch_id.is_a?(Fixnum)
  raise ValidationError, "reason must be a Fixnum" unless reason.nil? || reason.is_a?(Fixnum)
  raise ValidationError, "timestamp must be a DateTime" unless timestamp.nil? || timestamp.is_a?(DateTime)
end

Class Method Details

.from_xml(xml) ⇒ Object

[View source]

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/mblox/sms_receipt.rb', line 30

def from_xml(xml)
  args = {}
  data = Mblox.from_xml(xml).xpath '//NotificationService'
  raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationService' node, but was #{xml}" if data.blank?

  data = data.xpath '//NotificationList'
  raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationService' -> 'NotificationList' node, but was #{xml}" if data.blank?

  data = data.xpath '//Notification'
  raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationService' -> 'NotificationList' -> 'Notification' node, but was #{xml}" if data.blank?
  args[:batch_id]= data.attribute('BatchID').value.to_i

  data = data.xpath '//Subscriber'
  raise MissingExpectedXmlContentError, "Xml should have contained a 'NotificationService' -> 'NotificationList' -> 'Notification' -> 'Subscriber' node, but was #{xml}" if data.blank?

  args[:subscriber_number] = value_at(:SubscriberNumber, data)
  args[:subscriber_number] = args[:subscriber_number][1..-1] if '1' == args[:subscriber_number][0]

  timestamp = value_at(:TimeStamp, data)
  unless timestamp.blank?
    args[:timestamp] = begin
      Time.strptime("#{timestamp}+0000", '%Y%m%d%H%M%z')
    rescue ArgumentError
      nil
    end
  end

  args[:timestamp] = args[:timestamp].to_datetime if args[:timestamp]
  args[:msg_reference] = value_at(:MsgReference, data)
  args[:status] = value_at(:Status, data)
  reason = value_at(:Reason, data)
  args[:reason] = reason.blank? ? nil : reason.to_i
  data = data.xpath('//Tags').xpath('//Tag')
  unless data.empty?
    data.each do |d|
      args[:operator] = d.child.content.to_i if "Operator" == data.attribute('Name').content
      break if args[:operator]
    end
  end
  new(args)
end