Class: SPS::Message

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Validations
Defined in:
lib/sps_king/message.rb

Direct Known Subclasses

CreditTransfer, DirectDebit

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(account_options = {}) ⇒ Message

Returns a new instance of Message.



19
20
21
22
# File 'lib/sps_king/message.rb', line 19

def initialize(={})
  @grouped_transactions = {}
  @account = .new()
end

Instance Attribute Details

#accountObject (readonly)

Returns the value of attribute account.



10
11
12
# File 'lib/sps_king/message.rb', line 10

def 
  @account
end

#grouped_transactionsObject (readonly)

Returns the value of attribute grouped_transactions.



10
11
12
# File 'lib/sps_king/message.rb', line 10

def grouped_transactions
  @grouped_transactions
end

Instance Method Details

#add_transaction(options) ⇒ Object

Raises:

  • (ArgumentError)


24
25
26
27
28
29
# File 'lib/sps_king/message.rb', line 24

def add_transaction(options)
  transaction = transaction_class.new(options)
  raise ArgumentError.new(transaction.errors.full_messages.join("\n")) unless transaction.valid?
  @grouped_transactions[transaction_group(transaction)] ||= []
  @grouped_transactions[transaction_group(transaction)] << transaction
end

#amount_total(selected_transactions = transactions) ⇒ Object



53
54
55
# File 'lib/sps_king/message.rb', line 53

def amount_total(selected_transactions=transactions)
  selected_transactions.inject(0) { |sum, t| sum + t.amount }
end

#batch_id(transaction_reference) ⇒ Object

Returns the id of the batch to which the given transaction belongs Identified based upon the reference of the transaction



102
103
104
105
106
107
108
# File 'lib/sps_king/message.rb', line 102

def batch_id(transaction_reference)
  grouped_transactions.each do |group, transactions|
    if transactions.select { |transaction| transaction.reference == transaction_reference }.any?
      return payment_information_identification(group)
    end
  end
end

#batchesObject



110
111
112
# File 'lib/sps_king/message.rb', line 110

def batches
  grouped_transactions.keys.collect { |group| payment_information_identification(group) }
end

#creation_date_timeObject

Get creation date time for the message (with fallback to Time.now.iso8601)



96
97
98
# File 'lib/sps_king/message.rb', line 96

def creation_date_time
  @creation_date_time ||= Time.now.iso8601
end

#creation_date_time=(value) ⇒ Object

Set creation date time for the message p.s. Rabobank in the Netherlands only accepts the more restricted format [0-9]4[0-9]2,2[0-9]2,2[0-9]2,2[0-9]2,2[0-9]2,2

Raises:

  • (ArgumentError)


86
87
88
89
90
91
92
93
# File 'lib/sps_king/message.rb', line 86

def creation_date_time=(value)
  raise ArgumentError.new('creation_date_time must be a string!') unless value.is_a?(String)

  regex = /[0-9]{4}[-][0-9]{2,2}[-][0-9]{2,2}(?:\s|T)[0-9]{2,2}[:][0-9]{2,2}[:][0-9]{2,2}/
  raise ArgumentError.new("creation_date_time does not match #{regex}!") unless value.match(regex)

  @creation_date_time = value
end

#message_identificationObject

Get unique identifer for the message (with fallback to a random string)



80
81
82
# File 'lib/sps_king/message.rb', line 80

def message_identification
  @message_identification ||= "SPS-KING/#{SecureRandom.hex(11)}"
end

#message_identification=(value) ⇒ Object

Set unique identifer for the message

Raises:

  • (ArgumentError)


70
71
72
73
74
75
76
77
# File 'lib/sps_king/message.rb', line 70

def message_identification=(value)
  raise ArgumentError.new('message_identification must be a string!') unless value.is_a?(String)

  regex = /\A([A-Za-z0-9]|[\+|\?|\/|\-|\:|\(|\)|\.|\,|\'|\ ]){1,35}\z/
  raise ArgumentError.new("message_identification does not match #{regex}!") unless value.match(regex)

  @message_identification = value
end

#schema_compatible?(schema_name) ⇒ Boolean

Returns:

  • (Boolean)

Raises:

  • (ArgumentError)


57
58
59
60
61
62
63
64
65
66
67
# File 'lib/sps_king/message.rb', line 57

def schema_compatible?(schema_name)
  raise ArgumentError.new("Schema #{schema_name} is unknown!") unless self.known_schemas.include?(schema_name)

  case schema_name
    when PAIN_001_001_03_CH_02
      transactions.all? { |t| t.schema_compatible?(schema_name) }
    when PAIN_008_001_02_CH_03
      transactions.all? { |t| t.schema_compatible?(schema_name) } &&
      !.iban.to_s.match(/^(CH|LI)/).nil? # Only allowed for switzerland or liechtenstein
  end
end

#to_xml(schema_name = self.known_schemas.first) ⇒ String

Returns xml.

Returns:

  • (String)

    xml

Raises:



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/sps_king/message.rb', line 36

def to_xml(schema_name=self.known_schemas.first)
  raise SPS::Error.new(errors.full_messages.join("\n")) unless valid?
  raise SPS::Error.new("Incompatible with schema #{schema_name}!") unless schema_compatible?(schema_name)

  builder = Nokogiri::XML::Builder.new do |builder|
    builder.Document(xml_schema(schema_name)) do
      builder.__send__(xml_main_tag) do
        build_group_header(builder)
        build_payment_informations(builder)
      end
    end
  end

  validate_final_document!(builder.doc, schema_name)
  builder.to_xml
end

#transactionsObject



31
32
33
# File 'lib/sps_king/message.rb', line 31

def transactions
  grouped_transactions.values.flatten
end