cmxl 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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