Class: SEPA::Message

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Validations
Defined in:
lib/sepa_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.


24
25
26
27
# File 'lib/sepa_king/message.rb', line 24

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

Instance Attribute Details

#accountObject (readonly)

Returns the value of attribute account.


15
16
17
# File 'lib/sepa_king/message.rb', line 15

def 
  @account
end

#grouped_transactionsObject (readonly)

Returns the value of attribute grouped_transactions.


15
16
17
# File 'lib/sepa_king/message.rb', line 15

def grouped_transactions
  @grouped_transactions
end

Instance Method Details

#add_transaction(options) ⇒ Object

Raises:

  • (ArgumentError)

29
30
31
32
33
34
# File 'lib/sepa_king/message.rb', line 29

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


58
59
60
# File 'lib/sepa_king/message.rb', line 58

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


106
107
108
109
110
111
112
# File 'lib/sepa_king/message.rb', line 106

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


114
115
116
# File 'lib/sepa_king/message.rb', line 114

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)


100
101
102
# File 'lib/sepa_king/message.rb', line 100

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)

90
91
92
93
94
95
96
97
# File 'lib/sepa_king/message.rb', line 90

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)


84
85
86
# File 'lib/sepa_king/message.rb', line 84

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

#message_identification=(value) ⇒ Object

Set unique identifer for the message

Raises:

  • (ArgumentError)

74
75
76
77
78
79
80
81
# File 'lib/sepa_king/message.rb', line 74

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)

62
63
64
65
66
67
68
69
70
71
# File 'lib/sepa_king/message.rb', line 62

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_002_03, PAIN_008_002_02, PAIN_001_001_03, PAIN_001_001_03_CH_02
      .bic.present? && transactions.all? { |t| t.schema_compatible?(schema_name) }
    when PAIN_001_003_03, PAIN_008_003_02, PAIN_008_001_02
      transactions.all? { |t| t.schema_compatible?(schema_name) }
  end
end

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

Returns xml.

Returns:

  • (String)

    xml

Raises:


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/sepa_king/message.rb', line 41

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

  builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') 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


36
37
38
# File 'lib/sepa_king/message.rb', line 36

def transactions
  grouped_transactions.values.flatten
end