ng-bank-parser 0.1.4 → 0.1.5

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: 19849fae342789d9fc403b205e4c2b476dff411a
4
- data.tar.gz: 06509361c35618a53005cd7952521731dccf1119
3
+ metadata.gz: 6521c62889ffd5475c6f76e04f79b01aa0d744bc
4
+ data.tar.gz: a8b6dd72ce1d0b64872fa4e46b4e1ac9b1859360
5
5
  SHA512:
6
- metadata.gz: f6cf9a75e0f1ce3b40406852cb0a36678b32e8e03e20f4ce23dcf1283ee6be8b30bdd1aba797c13c544b7180447657733ca321cde9fff7539738ec859fe417ac
7
- data.tar.gz: 30fece1d8504473ea6074ac278bd189def9b2936ab1646e753f24a2be25e3dfa0c3ceb9ac354e365666b5a06ac64012e6c6618be26acdc5158850f2f004bd136
6
+ metadata.gz: 15818a961c4c2745f6e6fc3ffffeffa20ff0e124c4caed2f6a8515abfebd4dbfc8516e6954f7599f3b72665d5cf55ee14d75d266d585eb006bd28f4f2aea64b6
7
+ data.tar.gz: 194188f43d96f693f8cdedfc38730bb5aa2f97ef0dd42505230e0c247ce5d06fd9c16b1c2bddc07a118410bec25e76f2f43cfc061066bbaa75d1e546fbda81ea
data/.gitignore CHANGED
@@ -33,3 +33,7 @@ build/
33
33
 
34
34
  # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
35
35
  .rvmrc
36
+
37
+
38
+ .idea
39
+ .DS_Store
data/README.md CHANGED
@@ -29,7 +29,7 @@ Using the gem is pretty straightforward and simple.
29
29
  result = NgBankParser::Router.parse(bank_key, file_path, password)
30
30
  ```
31
31
 
32
- `bank_name` is the name key of the bank that statement is from. There's a list of supported banks and formats below.
32
+ `bank_key` is the key of the bank that provides the statement. There's a [list of supported banks and formats](#list-of-supported-banks) below, therefore use the key provided for each bank.
33
33
 
34
34
  `file_path` is obviously where the file you're trying to parse exists.
35
35
 
@@ -71,27 +71,31 @@ transaction = {
71
71
  remarks: remarks,
72
72
  ref: reference_id, # as provided by the statment
73
73
  }
74
-
74
+
75
75
  ```
76
76
 
77
77
  ## List of Supported Banks
78
78
 
79
- United Bank for Africa:
79
+ United Bank for Africa:
80
80
  - key: uba
81
81
  - supported formats: pdf
82
82
 
83
- Guaranty Trust Bank:
83
+ Guaranty Trust Bank:
84
84
  - key: gtb
85
85
  - supported formats: xls, xlsx
86
-
87
- First Bank:
86
+
87
+ First Bank:
88
88
  - key: firstbank
89
89
  - supported formats: pdf
90
90
 
91
+ Heritage Bank:
92
+ - key: hb
93
+ - supported formats: pdf
94
+
91
95
  ## Contributing
92
96
 
93
97
  Documentation on contribution can be found in the contribution wiki
94
98
 
95
99
  ## License
96
100
 
97
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
101
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -4,7 +4,9 @@ require "ng-bank-parser/router"
4
4
  require "ng-bank-parser/pdf-unlocker"
5
5
  require "ng-bank-parser/parsers/gtb-excel-parser"
6
6
  require "ng-bank-parser/parsers/uba-pdf-parser"
7
+ require "ng-bank-parser/parsers/hb-pdf-parser"
7
8
  require "ng-bank-parser/parsers/firstbank-pdf-parser"
9
+ require "ng-bank-parser/parsers/accessbank-pdf-parser"
8
10
 
9
11
  module NgBankParser
10
12
  # Your code goes here...
@@ -4,30 +4,48 @@ module NgBankParser
4
4
  key: "gtb",
5
5
  name: "Guaranty Trust Bank",
6
6
  parsers: [{
7
- format: "excel",
8
- valid: "lib/ng-bank-parser/fixtures/gtb-excel-valid.xlsx",
9
- invalid: "lib/ng-bank-parser/fixtures/gtb-excel-invalid.pdf",
10
- extensions: ["xls","xlsx"]
7
+ format: "excel",
8
+ valid: "lib/ng-bank-parser/fixtures/gtb-excel-valid.xlsx",
9
+ invalid: "lib/ng-bank-parser/fixtures/gtb-excel-invalid.pdf",
10
+ extensions: ["xls","xlsx"]
11
11
  }]
12
12
  },{
13
+ key: "hb",
14
+ name: "Heritage Bank",
15
+ parsers: [{
16
+ format: "pdf",
17
+ valid: "lib/ng-bank-parser/fixtures/hb-pdf-valid.pdf",
18
+ invalid: "lib/ng-bank-parser/fixtures/hb-pdf-invalid.pdf",
19
+ extensions: ["pdf"]
20
+ }]
21
+ },{
13
22
  key: "uba",
14
23
  name: "United Bank for Africa",
15
24
  parsers: [{
16
- format: "pdf",
17
- valid: "lib/ng-bank-parser/fixtures/uba-pdf-valid.pdf",
18
- invalid: "lib/ng-bank-parser/fixtures/uba-pdf-invalid.pdf",
19
- extensions: ["pdf"]
20
- }]
25
+ format: "pdf",
26
+ valid: "lib/ng-bank-parser/fixtures/uba-pdf-valid.pdf",
27
+ invalid: "lib/ng-bank-parser/fixtures/uba-pdf-invalid.pdf",
28
+ extensions: ["pdf"]
29
+ }]
21
30
  },{
22
- key: "firstbank",
23
- name: "First Bank",
24
- parsers: [{
25
- format: "pdf",
26
- valid: "lib/ng-bank-parser/fixtures/firstbank-pdf-valid.pdf",
27
- fixture_password: 19856,
28
- invalid: "lib/ng-bank-parser/fixtures/firstbank-pdf-invalid.pdf",
29
- extensions: ["pdf"]
30
- }]
31
- }]
31
+ key: "firstbank",
32
+ name: "First Bank",
33
+ parsers: [{
34
+ format: "pdf",
35
+ valid: "lib/ng-bank-parser/fixtures/firstbank-pdf-valid.pdf",
36
+ fixture_password: 19856,
37
+ invalid: "lib/ng-bank-parser/fixtures/firstbank-pdf-invalid.pdf",
38
+ extensions: ["pdf"]
39
+ }]
40
+ },{
41
+ key: "accessbank",
42
+ name: "Access Bank Plc",
43
+ parsers: [{
44
+ format: "pdf",
45
+ valid: "lib/ng-bank-parser/fixtures/accessbank-pdf-valid.pdf",
46
+ invalid: "lib/ng-bank-parser/fixtures/accessbank-pdf-invalid.pdf",
47
+ extensions: ["pdf"]
48
+ }]
49
+ }]
32
50
  end
33
- end
51
+ end
@@ -0,0 +1,160 @@
1
+ %PDF-1.3
2
+ 3 0 obj
3
+ <</Type /Page
4
+ /Parent 1 0 R
5
+ /Resources 2 0 R
6
+ /Contents 4 0 R>>
7
+ endobj
8
+ 4 0 obj
9
+ <</Length 165>>
10
+ stream
11
+ 0.57 w
12
+ 0 G
13
+ BT
14
+ /F1 16 Tf
15
+ 16 TL
16
+ 0 g
17
+ 56.69 785.20 Td
18
+ (Hello world!) Tj
19
+ ET
20
+ BT
21
+ /F1 16 Tf
22
+ 16 TL
23
+ 0 g
24
+ 56.69 756.85 Td
25
+ (This a random PDF file for testing our parsers.) Tj
26
+ ET
27
+ endstream
28
+ endobj
29
+ 1 0 obj
30
+ <</Type /Pages
31
+ /Kids [3 0 R ]
32
+ /Count 1
33
+ /MediaBox [0 0 595.28 841.89]
34
+ >>
35
+ endobj
36
+ 5 0 obj
37
+ <</BaseFont/Helvetica/Type/Font
38
+ /Encoding/WinAnsiEncoding
39
+ /Subtype/Type1>>
40
+ endobj
41
+ 6 0 obj
42
+ <</BaseFont/Helvetica-Bold/Type/Font
43
+ /Encoding/WinAnsiEncoding
44
+ /Subtype/Type1>>
45
+ endobj
46
+ 7 0 obj
47
+ <</BaseFont/Helvetica-Oblique/Type/Font
48
+ /Encoding/WinAnsiEncoding
49
+ /Subtype/Type1>>
50
+ endobj
51
+ 8 0 obj
52
+ <</BaseFont/Helvetica-BoldOblique/Type/Font
53
+ /Encoding/WinAnsiEncoding
54
+ /Subtype/Type1>>
55
+ endobj
56
+ 9 0 obj
57
+ <</BaseFont/Courier/Type/Font
58
+ /Encoding/WinAnsiEncoding
59
+ /Subtype/Type1>>
60
+ endobj
61
+ 10 0 obj
62
+ <</BaseFont/Courier-Bold/Type/Font
63
+ /Encoding/WinAnsiEncoding
64
+ /Subtype/Type1>>
65
+ endobj
66
+ 11 0 obj
67
+ <</BaseFont/Courier-Oblique/Type/Font
68
+ /Encoding/WinAnsiEncoding
69
+ /Subtype/Type1>>
70
+ endobj
71
+ 12 0 obj
72
+ <</BaseFont/Courier-BoldOblique/Type/Font
73
+ /Encoding/WinAnsiEncoding
74
+ /Subtype/Type1>>
75
+ endobj
76
+ 13 0 obj
77
+ <</BaseFont/Times-Roman/Type/Font
78
+ /Encoding/WinAnsiEncoding
79
+ /Subtype/Type1>>
80
+ endobj
81
+ 14 0 obj
82
+ <</BaseFont/Times-Bold/Type/Font
83
+ /Encoding/WinAnsiEncoding
84
+ /Subtype/Type1>>
85
+ endobj
86
+ 15 0 obj
87
+ <</BaseFont/Times-Italic/Type/Font
88
+ /Encoding/WinAnsiEncoding
89
+ /Subtype/Type1>>
90
+ endobj
91
+ 16 0 obj
92
+ <</BaseFont/Times-BoldItalic/Type/Font
93
+ /Encoding/WinAnsiEncoding
94
+ /Subtype/Type1>>
95
+ endobj
96
+ 2 0 obj
97
+ <<
98
+ /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
99
+ /Font <<
100
+ /F1 5 0 R
101
+ /F2 6 0 R
102
+ /F3 7 0 R
103
+ /F4 8 0 R
104
+ /F5 9 0 R
105
+ /F6 10 0 R
106
+ /F7 11 0 R
107
+ /F8 12 0 R
108
+ /F9 13 0 R
109
+ /F10 14 0 R
110
+ /F11 15 0 R
111
+ /F12 16 0 R
112
+ >>
113
+ /XObject <<
114
+ >>
115
+ >>
116
+ endobj
117
+ 17 0 obj
118
+ <<
119
+ /Producer (jsPDF 20120619)
120
+ /CreationDate (D:20150829130726)
121
+ >>
122
+ endobj
123
+ 18 0 obj
124
+ <<
125
+ /Type /Catalog
126
+ /Pages 1 0 R
127
+ /OpenAction [3 0 R /FitH null]
128
+ /PageLayout /OneColumn
129
+ >>
130
+ endobj
131
+ xref
132
+ 0 19
133
+ 0000000000 65535 f
134
+ 0000000301 00000 n
135
+ 0000001530 00000 n
136
+ 0000000009 00000 n
137
+ 0000000087 00000 n
138
+ 0000000388 00000 n
139
+ 0000000478 00000 n
140
+ 0000000573 00000 n
141
+ 0000000671 00000 n
142
+ 0000000773 00000 n
143
+ 0000000861 00000 n
144
+ 0000000955 00000 n
145
+ 0000001052 00000 n
146
+ 0000001153 00000 n
147
+ 0000001246 00000 n
148
+ 0000001338 00000 n
149
+ 0000001432 00000 n
150
+ 0000001754 00000 n
151
+ 0000001836 00000 n
152
+ trailer
153
+ <<
154
+ /Size 19
155
+ /Root 18 0 R
156
+ /Info 17 0 R
157
+ >>
158
+ startxref
159
+ 1940
160
+ %%EOF
@@ -0,0 +1,66 @@
1
+ require 'pdf-reader'
2
+ require 'open-uri'
3
+ require_relative 'accessbank-pdf-parser/helpers'
4
+ require_relative '../pdf-unlocker.rb'
5
+
6
+ module NgBankParser
7
+ class AccessbankPdf
8
+ extend AccessbankPdfHelpers
9
+
10
+ def self.parse(path, password=nil)
11
+
12
+ unless File.extname(path) == '.pdf'
13
+ return error('This file format is not supported yet. Please try uploading a pdf')
14
+ end
15
+
16
+ @pdf = open_pdf(path, password)
17
+
18
+ if @pdf
19
+ pdf_as_array = pdf_to_a(@pdf)
20
+
21
+ unless has_valid_details?(pdf_as_array)
22
+ return error("Couldn't fetch account details from pdf")
23
+ end
24
+
25
+ response = get_details(pdf_as_array)
26
+ return success(response)
27
+ else
28
+ return error("Couldn't open the pdf file passed")
29
+ end
30
+ end
31
+
32
+
33
+
34
+ def self.open_pdf(path, password)
35
+ begin
36
+ file = open(path)
37
+ @pdf = PDF::Reader.new(file)
38
+ rescue PDF::Reader::EncryptedPDFError
39
+ if password
40
+ return unlock_pdf(path, password)
41
+ else
42
+ return nil
43
+ end
44
+ rescue
45
+ return nil
46
+ end
47
+ end
48
+
49
+
50
+ def self.unlock_pdf(path, password)
51
+ unlocker = PDFUnlocker.new
52
+ response = unlocker.unlock(path, password)
53
+
54
+ return nil unless response
55
+
56
+ if response.include? 'Unlock Failed'
57
+ return nil
58
+ else
59
+ temp = StringIO.new
60
+ temp.write(response)
61
+ return PDF::Reader.new(temp)
62
+ end
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,167 @@
1
+ module AccessbankPdfHelpers
2
+
3
+ def pdf_to_a(pdf)
4
+ lines = []
5
+
6
+ pdf.pages.each do |page|
7
+ remove_line_spacing(page.text).each do |line|
8
+ lines << line.strip.split(/\s\s+/)
9
+ end
10
+ end
11
+
12
+ return lines
13
+ end
14
+
15
+
16
+ def get_details(pdf_array)
17
+
18
+ details = Hash.new
19
+
20
+ details[:bank_name] = 'Access Bank'
21
+ details[:account_number] = get_account_number(pdf_array)
22
+ details[:account_name] = get_account_name(pdf_array)
23
+
24
+ date_range = get_date_range(pdf_array)
25
+
26
+ details[:from_date] = string_with_slash_to_date(date_range[:from])
27
+ details[:to_date] = string_with_slash_to_date(date_range[:to])
28
+ details[:transactions] = get_transactions(pdf_array)
29
+
30
+ return details
31
+ end
32
+
33
+
34
+ def has_valid_details?(pdf_array)
35
+ return (get_account_number(pdf_array) and get_account_name(pdf_array) and get_date_range(pdf_array))
36
+ end
37
+
38
+
39
+ def get_account_name(pdf_array)
40
+
41
+ pdf_array.each do |row|
42
+ row.each_with_index do |cell, index|
43
+ if cell == 'Account Name'
44
+ return row[index + 1]
45
+ end
46
+ end
47
+ end
48
+
49
+ return nil
50
+ end
51
+
52
+
53
+ def get_account_number(pdf_array)
54
+
55
+ pdf_array.each do |row|
56
+ row.each do |cell|
57
+ if cell =~ /[0-9]{10}/
58
+ return cell
59
+ end
60
+ end
61
+ end
62
+
63
+ return nil
64
+ end
65
+
66
+
67
+ def get_date_range(pdf_array)
68
+ pdf_array.each_with_index do |row, index|
69
+ if row.count == 1
70
+ if row.first =~ /([0-3][0-9])[\/]([0-1][0-9])[\/]([0-9]{4})/ and pdf_array[index + 1].first =~ /([0-3][0-9])[\/]([0-1][0-9])[\/]([0-9]{4})/
71
+ return { from: row.first, to: pdf_array[index + 1].first }
72
+ end
73
+ end
74
+ end
75
+
76
+ return nil
77
+ end
78
+
79
+
80
+ def get_transactions(pdf_array)
81
+ start_index = get_first_line_of_transactions(pdf_array)
82
+ transactions = []
83
+
84
+ opening_balance = pdf_array[1][1]
85
+
86
+ pdf_array[start_index..-1].each do |transaction|
87
+ if valid_transaction?(transaction)
88
+
89
+ transaction_hash= Hash.new
90
+ transaction_hash[:date] = string_with_dash_to_date(transaction[0])
91
+ transaction_hash[:remarks] = transaction[2]
92
+
93
+ if transaction.count == 6 # ref code present
94
+ transaction_hash[:ref] = transaction[3]
95
+ transaction_hash[:amount] = amount_to_f(transaction[4])
96
+ transaction_hash[:balance] = amount_to_f(transaction[5])
97
+ transaction_hash[:type] = transaction_type(transaction_hash[:balance], opening_balance)
98
+ else #no ref code
99
+ transaction_hash[:ref] = ''
100
+ transaction_hash[:amount] = amount_to_f(transaction[3])
101
+ transaction_hash[:balance] = amount_to_f(transaction[4])
102
+ transaction_hash[:type] = transaction_type(transaction_hash[:balance], opening_balance)
103
+ end
104
+
105
+ opening_balance = transaction_hash[:balance]
106
+ transactions << transaction_hash
107
+ end
108
+ end
109
+
110
+ return transactions
111
+ end
112
+
113
+
114
+
115
+
116
+ def error(msg)
117
+ { status: 0, message: msg }
118
+ end
119
+
120
+ def success(data)
121
+ { status: 1, data: data }
122
+ end
123
+
124
+
125
+
126
+ private
127
+ def remove_line_spacing(str)
128
+ str.gsub(/^$\n/, '').lines
129
+ end
130
+
131
+
132
+ def transaction_type(current_balance, former_balance)
133
+ former_balance = amount_to_f(former_balance) if former_balance.is_a?(String)
134
+
135
+ current_balance - former_balance > 1 ? 'credit' : 'debit'
136
+ end
137
+
138
+
139
+ def amount_to_f(amount)
140
+ amount.gsub(/[^\d\.]/, '').to_f
141
+ end
142
+
143
+
144
+ def get_first_line_of_transactions(pdf_array)
145
+ start = -1
146
+
147
+ pdf_array.each_with_index do |row, index|
148
+ start = index + 1 if row[0] == 'Date'
149
+ end
150
+
151
+ return start
152
+ end
153
+
154
+
155
+ def valid_transaction?(line)
156
+ line[0] =~ /([0-3][0-9])[\-]([a-zA-Z]+)[\-](1[0-9])/ #first column matches access bank transaction date pattern
157
+ end
158
+
159
+
160
+ def string_with_dash_to_date(date_str)
161
+ Date.strptime(date_str, '%d-%b-%y')
162
+ end
163
+
164
+ def string_with_slash_to_date(date_str)
165
+ Date.strptime(date_str, '%d/%m/%Y')
166
+ end
167
+ end
@@ -0,0 +1,77 @@
1
+ require 'pdf-reader'
2
+ require 'open-uri'
3
+ require_relative 'hb-pdf-parser/hb_transaction_helpers'
4
+
5
+ module NgBankParser
6
+ class HbPdf
7
+
8
+ extend HbTransactionHelpers
9
+
10
+ class << self
11
+ def parse(url, password = nil)
12
+ unless ACCEPTED_FORMATS.include? File.extname(url)
13
+ return INVALID_FILE_FORMAT_STRING
14
+ end
15
+
16
+ file = open(url)
17
+
18
+ @reader = PDF::Reader.new(file)
19
+
20
+ if pdf_is_valid? file
21
+ generate_parse
22
+
23
+ return account_statement_payload
24
+ else
25
+ return invalid_payload
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def generate_parse
32
+ set_account_name
33
+ set_account_number
34
+ set_end_date
35
+ set_start_date
36
+ extract_transactions
37
+ end
38
+
39
+ def extract_transactions
40
+ @transactions = []
41
+
42
+ @reader.pages.each do |page|
43
+ page.text.remove_empty_lines.lines.each do |line|
44
+ transaction_items_list = transaction_items(line)
45
+ if transaction_items_list[TRANSACTION_DATE_INDEX].is_date?
46
+ if transaction_is_a_debit?(transaction_items_list, line)
47
+ create_transaction(line, 'debit')
48
+ elsif transaction_is_a_credit?(transaction_items_list, line)
49
+ create_transaction(line, 'credit')
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ def account_statement_payload
57
+ return {
58
+ status: VALID_ACCOUNT_STATUS,
59
+ data: {
60
+ bank_name: $Banks[1][:name],
61
+ account_number: @account_number,
62
+ account_name: @account_name,
63
+ from_date: @start_date,
64
+ to_date: @end_date,
65
+ transactions: @transactions
66
+ # reader: @reader
67
+ }
68
+ }
69
+ end
70
+
71
+ def invalid_payload
72
+ {status: INVALID_ACCOUNT_STATUS,
73
+ message: INVALID_ACCOUNT_STATEMENT}
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,44 @@
1
+ module NgBankParser
2
+ module HbConstants
3
+ ACCEPTED_FORMATS = ['.pdf']
4
+
5
+ INVALID_ACCOUNT_STATUS = 0
6
+ VALID_ACCOUNT_STATUS = 1
7
+
8
+ SECOND_PAGE_INDEX = 1
9
+ DURATION_DATE_LINE_INDEX = 3
10
+ ACCOUNT_NAME_LINE_INDEX = 5
11
+ ACCOUNT_NUMBER_LINE_INDEX = 6
12
+ TRANSACTION_HEADER_INDEX = 11
13
+ TRANSACTION_DATE_INDEX = 0
14
+ TRANSACTION_DEBIT_INDEX = -3
15
+ TRANSACTION_CREDIT_INDEX = -2
16
+ TRANSACTION_BALANCE = 131
17
+ TRANSACTION_BALANCE_END = 155
18
+ TRANSACTION_REMARKS = 32
19
+ TRANSACTION_REMARKS_END = 92
20
+ TRANSACTION_REFERENCE = 20
21
+ TRANSACTION_REFERENCE_END = 30
22
+ TRANSACTION_DEBIT = 92
23
+ TRANSACTION_DEBIT_END = 105
24
+ TRANSACTION_CREDIT = 110
25
+ TRANSACTION_CREDIT_END = 130
26
+
27
+
28
+ ACCOUNT_NAME_FIRST_MAKER = 'name'
29
+ ACCOUNT_NAME_SECOND_MAKER = 'debit turnover'
30
+ ACCOUNT_NUMBER_MAKER = 'account number'
31
+ END_DATE_MAKER = '-'
32
+
33
+ INVALID_FILE_FORMAT_STRING = 'File Format Not Valid'
34
+ INVALID_ACCOUNT_STATEMENT = 'File Is Not A Valid Heritage Bank Account Statement'
35
+
36
+ CORRECT_RC_NUMBER = 'RC No 9868'
37
+
38
+ COLUMN_ARRANGEMENT = 'valuedatereferencenarrationdebitcreditbalance'
39
+
40
+
41
+
42
+
43
+ end
44
+ end
@@ -0,0 +1,112 @@
1
+ require_relative 'hb_constants'
2
+
3
+ module NgBankParser
4
+ module HbTransactionHelpers
5
+ include HbConstants
6
+ def pdf_is_valid?(file)
7
+ has_transaction_page? && has_transaction_columns? && has_correct_rc_number? && !has_encryption?(file)
8
+ end
9
+
10
+ private
11
+
12
+ def has_transaction_page?
13
+ @reader.pages[SECOND_PAGE_INDEX].present?
14
+ end
15
+
16
+ def has_correct_rc_number?
17
+ @reader.pages.first.text.remove_empty_lines.lines.first.strip == CORRECT_RC_NUMBER
18
+ end
19
+
20
+ def has_transaction_columns?
21
+ @reader.pages[SECOND_PAGE_INDEX].text.remove_empty_lines.lines[TRANSACTION_HEADER_INDEX].remove_white_spaces == COLUMN_ARRANGEMENT
22
+ end
23
+
24
+ def has_encryption?(file)
25
+ begin
26
+ @reader = PDF::Reader.new(file)
27
+ false
28
+ rescue PDF::Reader::EncryptedPDFError
29
+ true
30
+ end
31
+ end
32
+
33
+ def set_account_name
34
+ @account_name = @reader.pages[SECOND_PAGE_INDEX].text.remove_empty_lines.lines[ACCOUNT_NAME_LINE_INDEX].get_text_between_markers(ACCOUNT_NAME_FIRST_MAKER, ACCOUNT_NAME_SECOND_MAKER).remove_white_spaces
35
+ end
36
+
37
+ def set_account_number
38
+ @account_number = @reader.pages[SECOND_PAGE_INDEX].text.remove_empty_lines.lines[ACCOUNT_NUMBER_LINE_INDEX].strip.get_text_after_marker(ACCOUNT_NUMBER_MAKER).remove_white_spaces
39
+ end
40
+
41
+ def set_end_date
42
+ @end_date = Date.parse(@reader.pages[SECOND_PAGE_INDEX].text.remove_empty_lines.lines[DURATION_DATE_LINE_INDEX].get_text_after_marker(END_DATE_MAKER).remove_white_spaces)
43
+ end
44
+
45
+ def set_start_date
46
+ @start_date = Date.parse(@reader.pages[SECOND_PAGE_INDEX].text.remove_empty_lines.lines[DURATION_DATE_LINE_INDEX].get_text_between_markers(' ', END_DATE_MAKER).remove_white_spaces)
47
+ end
48
+
49
+ def set_transaction_attr(line)
50
+ transaction_object = {}
51
+ transaction_object[:date] = transaction_date(line)
52
+
53
+ transaction_object[:balance] = transaction_balance(line)
54
+ transaction_object[:remarks] = transaction_remarks(line)
55
+ transaction_object[:ref] = transaction_reference(line)
56
+ transaction_object
57
+ end
58
+
59
+ def transaction_is_a_debit?(transaction_items_list, line)
60
+ transaction_items_list[TRANSACTION_DEBIT_INDEX] && debit_amount(line) > 0.00
61
+ end
62
+
63
+ def transaction_is_a_credit?(transaction_items_list, line)
64
+ transaction_items_list[TRANSACTION_CREDIT_INDEX] && credit_amount(line) > 0.00
65
+ end
66
+
67
+ def create_transaction(line, type)
68
+ transaction = set_transaction_attr(line)
69
+ set_transaction_type(transaction, type, line)
70
+ @transactions << transaction
71
+ end
72
+
73
+ def set_transaction_type(transaction, type, line)
74
+ if type == 'debit'
75
+ transaction[:amount] = debit_amount(line)
76
+ transaction[:type] = type
77
+ elsif type == 'credit'
78
+ transaction[:amount] = credit_amount(line)
79
+ transaction[:type] = type
80
+ end
81
+ end
82
+
83
+ def transaction_date(line)
84
+ Date.parse(line[0..19].remove_white_spaces)
85
+ end
86
+
87
+ def transaction_balance(line)
88
+ line[TRANSACTION_BALANCE..TRANSACTION_BALANCE_END].get_numbers
89
+ end
90
+
91
+ def transaction_remarks(line)
92
+ line[TRANSACTION_REMARKS..TRANSACTION_REMARKS_END].remove_white_spaces
93
+ end
94
+
95
+ def transaction_reference(line)
96
+ line[TRANSACTION_REFERENCE..TRANSACTION_REFERENCE_END].remove_white_spaces
97
+ end
98
+
99
+ def debit_amount(line)
100
+ line[TRANSACTION_DEBIT..TRANSACTION_DEBIT_END].get_numbers
101
+ end
102
+
103
+ def credit_amount(line)
104
+ line[TRANSACTION_CREDIT..TRANSACTION_CREDIT_END].get_numbers
105
+ end
106
+
107
+
108
+ def transaction_items(line)
109
+ line.strip.split(" ").reject(&:empty?)
110
+ end
111
+ end
112
+ end
@@ -53,4 +53,8 @@ class String
53
53
  Date.strptime(self, '%d-%b-%Y')
54
54
  end
55
55
 
56
+ def get_numbers
57
+ self.remove_commas.to_f
58
+ end
59
+
56
60
  end
@@ -1,5 +1,3 @@
1
- require 'net/http'
2
-
3
1
  module NgBankParser
4
2
  class Router
5
3
  @banks = $Banks
@@ -14,15 +12,11 @@ module NgBankParser
14
12
 
15
13
  if @selected_bank.nil?
16
14
  return {status: 0, message: "Your bank is not yet supported"}
17
- end
18
-
19
- unless file_exists(path)
20
- return {status: 0, message: "File does not exist or is not accesible"}
21
- end
22
-
23
- extensions = @selected_bank[:parsers].map {|e| e[:extensions]}
24
- @supported_extensions = extensions.reduce(:concat)
25
- pick_parser()
15
+ else
16
+ extensions = @selected_bank[:parsers].map {|e| e[:extensions]}
17
+ @supported_extensions = extensions.reduce(:concat)
18
+ pick_parser()
19
+ end
26
20
  end
27
21
 
28
22
  private
@@ -48,15 +42,5 @@ module NgBankParser
48
42
  parser_response = class_object.parse(@path, @password)
49
43
  end
50
44
 
51
- def self.file_exists(path)
52
- return true if File.exists?(path)
53
-
54
- uri = URI(path)
55
-
56
- request = Net::HTTP.new uri.host
57
- response= request.request_head uri.path
58
- return response.code.to_i == 200
59
- end
60
-
61
45
  end
62
46
  end
@@ -1,3 +1,3 @@
1
1
  module NgBankParser
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ng-bank-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Opemipo Aikomo
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2015-08-29 00:00:00.000000000 Z
14
+ date: 2015-09-22 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -148,18 +148,27 @@ files:
148
148
  - bin/setup
149
149
  - lib/ng-bank-parser.rb
150
150
  - lib/ng-bank-parser/banks.rb
151
+ - lib/ng-bank-parser/fixtures/accessbank-pdf-invalid.pdf
152
+ - lib/ng-bank-parser/fixtures/accessbank-pdf-valid.pdf
151
153
  - lib/ng-bank-parser/fixtures/firstbank-pdf-invalid.pdf
152
154
  - lib/ng-bank-parser/fixtures/firstbank-pdf-valid.pdf
153
155
  - lib/ng-bank-parser/fixtures/gtb-excel-invalid.pdf
154
156
  - lib/ng-bank-parser/fixtures/gtb-excel-valid.xls
155
157
  - lib/ng-bank-parser/fixtures/gtb-excel-valid.xlsx
158
+ - lib/ng-bank-parser/fixtures/hb-pdf-invalid.pdf
159
+ - lib/ng-bank-parser/fixtures/hb-pdf-valid.pdf
156
160
  - lib/ng-bank-parser/fixtures/uba-pdf-invalid.pdf
157
161
  - lib/ng-bank-parser/fixtures/uba-pdf-valid.pdf
162
+ - lib/ng-bank-parser/parsers/accessbank-pdf-parser.rb
163
+ - lib/ng-bank-parser/parsers/accessbank-pdf-parser/helpers.rb
158
164
  - lib/ng-bank-parser/parsers/firstbank-pdf-parser.rb
159
165
  - lib/ng-bank-parser/parsers/firstbank-pdf-parser/helpers.rb
160
166
  - lib/ng-bank-parser/parsers/firstbank-pdf-parser/statement_utils.rb
161
167
  - lib/ng-bank-parser/parsers/gtb-excel-parser.rb
162
168
  - lib/ng-bank-parser/parsers/gtb-excel-parser/helpers.rb
169
+ - lib/ng-bank-parser/parsers/hb-pdf-parser.rb
170
+ - lib/ng-bank-parser/parsers/hb-pdf-parser/hb_constants.rb
171
+ - lib/ng-bank-parser/parsers/hb-pdf-parser/hb_transaction_helpers.rb
163
172
  - lib/ng-bank-parser/parsers/uba-pdf-parser.rb
164
173
  - lib/ng-bank-parser/parsers/uba-pdf-parser/classes/string.rb
165
174
  - lib/ng-bank-parser/parsers/uba-pdf-parser/classes/transaction.rb