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.



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

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

Instance Attribute Details

#accountObject (readonly)

Returns the value of attribute account.



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

def 
  @account
end

#grouped_transactionsObject (readonly)

Returns the value of attribute grouped_transactions.



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

def grouped_transactions
  @grouped_transactions
end

Instance Method Details

#add_transaction(options) ⇒ Object

Raises:

  • (ArgumentError)


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

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



54
55
56
# File 'lib/sepa_king/message.rb', line 54

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



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

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



94
95
96
# File 'lib/sepa_king/message.rb', line 94

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

#message_identificationObject

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



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

def message_identification
  @message_identification ||= "SEPA-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/sepa_king/message.rb', line 70

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

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

  @message_identification = value
end

#schema_compatible?(schema_name) ⇒ Boolean

Returns:

  • (Boolean)

Raises:

  • (ArgumentError)


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

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
      .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:

  • (RuntimeError)


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

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

  builder = Builder::XmlMarkup.new indent: 2
  builder.instruct!
  builder.Document(xml_schema(schema_name)) do
    builder.__send__(xml_main_tag) do
      build_group_header(builder)
      build_payment_informations(builder)
    end
  end
end

#transactionsObject



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

def transactions
  grouped_transactions.values.flatten
end