cmxl 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b17be399c322a9f5cc766a97e87e91911c7957e
4
- data.tar.gz: 2450cd1657a24d0f751f14f2f00aa63f82fee42d
3
+ metadata.gz: e6c1cc630ddfa936396515babfa8c5d6ee77b0d0
4
+ data.tar.gz: 89940db8aa878f76b1658997702f690db182377d
5
5
  SHA512:
6
- metadata.gz: bba37265a6a5560d1c2f23d1e2cb59dd33b14fead78c07a1c03e8e65a2ab369849c37f49336a82ce53c3ef19da2b8a639821a6a6c027d7eac4f55402d7c2f205
7
- data.tar.gz: c700614ac6bba9ed30e334685129cbd006cc559e57f64bd9c487e46f9ac9bd7c35d635ba35695a368b5b44f5d52cad0f4cd8d7b72a505f8f59fd2819b73a77f2
6
+ metadata.gz: 8d6749415fb5ebee5f8e98f49a337d0000e19556500b5682546783de3835ec33e09fc59235dd87e800b792bd6928f6b1e05d204f8e705ef169f9f6e0c7231c74
7
+ data.tar.gz: 18358ac839e9cf4c65357b651c33cb5d6c670a334ae50a56c0e8060d3a9688bc5e63f3f24f64eba0cc8034f41389107675261fbeec73353151762a97a65903ac
data/lib/cmxl/field.rb CHANGED
@@ -16,6 +16,8 @@ module Cmxl
16
16
  def self.parsers; @@parsers; end
17
17
 
18
18
  class << self; attr_accessor :parser; end
19
+ self.parser = /(?<source>.*)/ # default parser
20
+
19
21
  def self.tag=(tag)
20
22
  @tag = tag.to_s
21
23
  @@parsers[tag.to_s] = self
@@ -55,7 +57,7 @@ module Cmxl
55
57
  end
56
58
 
57
59
  def to_date(date, year=nil)
58
- if match = date.match(DATE)
60
+ if match = date.to_s.match(DATE)
59
61
  year ||= "20#{match['year']}"
60
62
  month = match['month']
61
63
  day = match['day']
@@ -67,6 +69,14 @@ module Cmxl
67
69
  date
68
70
  end
69
71
 
72
+ def to_amount_in_cents(value)
73
+ value.gsub(/[,|\.](\d*)/) { $1.ljust(2, '0') }.to_i
74
+ end
75
+
76
+ def to_amount(value)
77
+ value.gsub(',','.').to_f
78
+ end
79
+
70
80
  def method_missing(m, *value)
71
81
  if m =~ /=\z/
72
82
  self.data[m] = value.first
@@ -17,7 +17,7 @@ module Cmxl
17
17
  end
18
18
 
19
19
  def amount
20
- self.data['amount'].gsub(',','.').to_f * self.sign
20
+ to_amount(self.data['amount'])
21
21
  end
22
22
 
23
23
  def sign
@@ -25,7 +25,7 @@ module Cmxl
25
25
  end
26
26
 
27
27
  def amount_in_cents
28
- self.data['amount'].gsub(',', '').gsub('.','').to_i * self.sign
28
+ to_amount_in_cents(self.data['amount'])
29
29
  end
30
30
 
31
31
  def to_h
@@ -5,15 +5,20 @@ module Cmxl
5
5
  self.parser = /(?<transaction_code>\w{3})(?<details>(?<seperator>.).*)/
6
6
 
7
7
  def sub_fields
8
- @sub_fields ||= self.data['details'].split(/#{Regexp.escape(self.data['seperator'])}(\d{2})/).reject(&:empty?).each_slice(2).to_h
8
+ @sub_fields ||= if self.data['details'] =~ /#{Regexp.escape(self.data['seperator'])}(\d{2})/
9
+ self.data['details'].split(/#{Regexp.escape(self.data['seperator'])}(\d{2})/).reject(&:empty?).each_slice(2).to_h
10
+ else
11
+ {}
12
+ end
9
13
  end
10
14
 
11
15
  def description
12
- self.sub_fields['00']
16
+ self.sub_fields['00'] || self.data['details']
13
17
  end
14
18
 
15
19
  def information
16
- (20..29).to_a.collect {|i| self.sub_fields[i.to_s] }.join('')
20
+ info = (20..29).to_a.collect {|i| self.sub_fields[i.to_s] }.join('')
21
+ info.empty? ? self.description : info
17
22
  end
18
23
 
19
24
  def sepa
@@ -2,7 +2,7 @@ module Cmxl
2
2
  module Fields
3
3
  class StatementLine < Field
4
4
  self.tag = 61
5
- self.parser = /\A(?<date>\d{6})(?<entry_date>\d{4})?(?<funds_code>[a-zA-Z])(?<currency_letter>[a-zA-Z])\D?(?<amount>\d{1,12},\d{0,2})(?<swift_code>(?:N|F).{3})(?<reference>NONREF|.{0,16})(?:$|\/\/)(?<bank_reference>.*)/i
5
+ self.parser = /^(?<date>\d{6})(?<entry_date>\d{4})?(?<funds_code>[a-zA-Z])(?<currency_letter>[a-zA-Z])?(?<amount>\d{1,12},\d{0,2})(?<swift_code>(?:N|F).{3})(?<reference>NONREF|.{0,16})(?:$|\/\/)(?<bank_reference>.*)/i
6
6
 
7
7
  def credit?
8
8
  self.data['funds_code'].to_s.upcase == 'C'
@@ -28,7 +28,7 @@ module Cmxl
28
28
  to_date(self.data['date'])
29
29
  end
30
30
  def entry_date
31
- to_date(self.data['entry_date'], self.date.year)
31
+ to_date(self.data['entry_date'], self.date.year) if self.data['entry_date'] && self.date
32
32
  end
33
33
 
34
34
  def to_h
data/lib/cmxl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cmxl
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cmxl::Field do
4
+ subject { Cmxl::Field.new('D140829EUR000000000147,64') }
5
+
6
+ it { expect(Cmxl::Field.parser).to eql(/(?<source>.*)/) } # default must be set
7
+
8
+ it { expect(subject.to_amount('123.')).to eql(123.00) }
9
+ it { expect(subject.to_amount('123.1')).to eql(123.10) }
10
+ it { expect(subject.to_amount('123.11')).to eql(123.11) }
11
+ it { expect(subject.to_amount('123,1')).to eql(123.10) }
12
+ it { expect(subject.to_amount('123,11')).to eql(123.11) }
13
+
14
+ it { expect(subject.to_amount_in_cents('123.')).to eql(12300) }
15
+ it { expect(subject.to_amount_in_cents('123.1')).to eql(12310) }
16
+ it { expect(subject.to_amount_in_cents('123.11')).to eql(12311) }
17
+ it { expect(subject.to_amount_in_cents('123,1')).to eql(12310) }
18
+ it { expect(subject.to_amount_in_cents('123,11')).to eql(12311) }
19
+
20
+ it { expect(subject.to_date('invalid')).to eql('invalid') }
21
+ it { expect(subject.to_date('140914')).to eql(Date.new(2014,9,14)) }
22
+ it { expect(subject.to_date('140914', 2013)).to eql(Date.new(2013,9,14)) }
23
+
24
+ end
@@ -33,8 +33,8 @@ describe Cmxl::Fields::AccountBalance do
33
33
  it { expect(subject).to be_debit }
34
34
  it { expect(subject.currency).to eql('EUR') }
35
35
 
36
- it { expect(subject.amount).to eql(-147.64) }
37
- it { expect(subject.amount_in_cents).to eql(-14764) }
36
+ it { expect(subject.amount).to eql(147.64) }
37
+ it { expect(subject.amount_in_cents).to eql(14764) }
38
38
  it { expect(subject.sign).to eql(-1) }
39
39
  end
40
40
 
@@ -9,8 +9,8 @@ describe Cmxl::Fields::AvailableBalance do
9
9
  it { expect(subject).to be_debit }
10
10
  it { expect(subject.currency).to eql('EUR') }
11
11
 
12
- it { expect(subject.amount).to eql(-3.66) }
13
- it { expect(subject.amount_in_cents).to eql(-366) }
12
+ it { expect(subject.amount).to eql(3.66) }
13
+ it { expect(subject.amount_in_cents).to eql(366) }
14
14
  it { expect(subject.sign).to eql(-1) }
15
15
 
16
16
  end
@@ -8,6 +8,11 @@ describe 'parsing a statement' do
8
8
  it { expect(subject.closing_balance.amount_in_cents).to eql(8443704) }
9
9
  it { expect(subject.generation_date).to eql(Date.new(2013, 11, 10)) }
10
10
  it { expect(subject.transactions.count).to eql(11) }
11
+
12
+ it { expect(subject.transactions.first.description).to eql('PN5477SCHECK-NR. 0000016703074') }
13
+ it { expect(subject.transactions.first.information).to eql('PN5477SCHECK-NR. 0000016703074') }
14
+ it { expect(subject.transactions.first.sepa).to eql({}) }
15
+ it { expect(subject.transactions.first.bic).to eql(nil) }
11
16
  end
12
17
 
13
18
  context 'second example' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cmxl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bumann
@@ -79,6 +79,7 @@ files:
79
79
  - lib/cmxl/statement.rb
80
80
  - lib/cmxl/transaction.rb
81
81
  - lib/cmxl/version.rb
82
+ - spec/field_spec.rb
82
83
  - spec/fields/account_balance_spec.rb
83
84
  - spec/fields/account_identification_spec.rb
84
85
  - spec/fields/available_balance_spec.rb
@@ -128,6 +129,7 @@ signing_key:
128
129
  specification_version: 4
129
130
  summary: Cmxl is your friendly MT940 bank statement parser
130
131
  test_files:
132
+ - spec/field_spec.rb
131
133
  - spec/fields/account_balance_spec.rb
132
134
  - spec/fields/account_identification_spec.rb
133
135
  - spec/fields/available_balance_spec.rb