coop_to_ofx 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +22 -0
- data/Rakefile +0 -101
- data/bin/coop_to_ofx +3 -1
- data/lib/coop_scraper/base.rb +3 -1
- data/lib/coop_scraper/credit_card.rb +7 -8
- data/lib/coop_scraper/current_account.rb +12 -9
- data/spec/coop_scraper/base_spec.rb +4 -0
- data/spec/coop_scraper/credit_card_spec.rb +1 -1
- data/spec/coop_scraper/current_account_spec.rb +123 -1
- data/spec/fixtures/current_account/priv_savings_fixture.html +462 -0
- data/spec/fixtures/current_account/privilege_fixture.html +565 -0
- data/spec/ofx/statement/output/base_spec.rb +10 -10
- data/spec/ofx/statement/output/credit_card_spec.rb +5 -5
- data/spec/ofx/statement/output/current_account_spec.rb +5 -5
- data/spec/spec_helper.rb +3 -2
- metadata +126 -89
data/MIT-LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2009 Matt Patterson
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -2,7 +2,6 @@ require 'rake'
|
|
2
2
|
require 'rake/rdoctask'
|
3
3
|
gem 'rspec'
|
4
4
|
require 'spec/rake/spectask'
|
5
|
-
require 'lib/coop_scraper/version.rb'
|
6
5
|
|
7
6
|
desc 'Generate documentation for Co-op-to-OFX.'
|
8
7
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
@@ -39,103 +38,3 @@ namespace :spec do
|
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
42
|
-
require "rubygems"
|
43
|
-
require "rake/gempackagetask"
|
44
|
-
|
45
|
-
# This builds the actual gem. For details of what all these options
|
46
|
-
# mean, and other ones you can add, check the documentation here:
|
47
|
-
#
|
48
|
-
# http://rubygems.org/read/chapter/20
|
49
|
-
#
|
50
|
-
spec = Gem::Specification.new do |s|
|
51
|
-
|
52
|
-
# Change these as appropriate
|
53
|
-
s.name = "coop_to_ofx"
|
54
|
-
s.version = CoopScraper::Version()
|
55
|
-
s.summary = "Convert Co-operative bank HTML statements into OFX"
|
56
|
-
s.description = File.read('README.rdoc')
|
57
|
-
s.author = "Matt Patterson"
|
58
|
-
s.email = "matt@reprocessed.org"
|
59
|
-
s.homepage = "http://reprocessed.org/"
|
60
|
-
|
61
|
-
s.has_rdoc = true
|
62
|
-
s.extra_rdoc_files = %w(README.rdoc)
|
63
|
-
s.rdoc_options = %w(--main README.rdoc)
|
64
|
-
|
65
|
-
# Add any extra files to include in the gem
|
66
|
-
s.files = %w(Rakefile README.rdoc) + Dir.glob("{bin,spec,lib}/**/*")
|
67
|
-
s.executables = FileList["bin/**"].map { |f| File.basename(f) }
|
68
|
-
|
69
|
-
s.require_paths = ["lib"]
|
70
|
-
|
71
|
-
# If you want to depend on other gems, add them here, along with any
|
72
|
-
# relevant versions
|
73
|
-
s.add_dependency("hpricot", "~> 0.6.0")
|
74
|
-
s.add_dependency("builder", "~> 2.1.0")
|
75
|
-
|
76
|
-
s.add_development_dependency("rspec") # add any other gems for testing/development
|
77
|
-
|
78
|
-
# If you want to publish automatically to rubyforge, you'll may need
|
79
|
-
# to tweak this, and the publishing task below too.
|
80
|
-
s.rubyforge_project = "coop_to_ofx"
|
81
|
-
end
|
82
|
-
|
83
|
-
# This task actually builds the gem. We also regenerate a static
|
84
|
-
# .gemspec file, which is useful if something (i.e. GitHub) will
|
85
|
-
# be automatically building a gem for this project. If you're not
|
86
|
-
# using GitHub, edit as appropriate.
|
87
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
88
|
-
pkg.gem_spec = spec
|
89
|
-
|
90
|
-
# Generate the gemspec file for github.
|
91
|
-
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
92
|
-
File.open(file, "w") {|f| f << spec.to_ruby }
|
93
|
-
end
|
94
|
-
|
95
|
-
desc 'Clear out RDoc and generated packages'
|
96
|
-
task :clean => [:clobber_rdoc, :clobber_package] do
|
97
|
-
rm "#{spec.name}.gemspec"
|
98
|
-
end
|
99
|
-
|
100
|
-
# If you want to publish to RubyForge automatically, here's a simple
|
101
|
-
# task to help do that. If you don't, just get rid of this.
|
102
|
-
# Be sure to set up your Rubyforge account details with the Rubyforge
|
103
|
-
# gem; you'll need to run `rubyforge setup` and `rubyforge config` at
|
104
|
-
# the very least.
|
105
|
-
begin
|
106
|
-
require "rake/contrib/sshpublisher"
|
107
|
-
namespace :rubyforge do
|
108
|
-
|
109
|
-
desc "Release gem and RDoc documentation to RubyForge"
|
110
|
-
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
111
|
-
|
112
|
-
namespace :release do
|
113
|
-
desc "Release a new version of this gem"
|
114
|
-
task :gem => [:package] do
|
115
|
-
require 'rubyforge'
|
116
|
-
rubyforge = RubyForge.new
|
117
|
-
rubyforge.configure
|
118
|
-
rubyforge.login
|
119
|
-
rubyforge.userconfig['release_notes'] = spec.summary
|
120
|
-
path_to_gem = File.join(File.dirname(__FILE__), "pkg", "#{spec.name}-#{spec.version}.gem")
|
121
|
-
puts "Publishing #{spec.name}-#{spec.version.to_s} to Rubyforge..."
|
122
|
-
rubyforge.add_release(spec.rubyforge_project, spec.name, spec.version.to_s, path_to_gem)
|
123
|
-
end
|
124
|
-
|
125
|
-
desc "Publish RDoc to RubyForge."
|
126
|
-
task :docs => [:rdoc] do
|
127
|
-
config = YAML.load(
|
128
|
-
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
129
|
-
)
|
130
|
-
|
131
|
-
host = "#{config['username']}@rubyforge.org"
|
132
|
-
remote_dir = "/var/www/gforge-projects/coop_to_ofx/" # Should be the same as the rubyforge project name
|
133
|
-
local_dir = 'rdoc'
|
134
|
-
|
135
|
-
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
rescue LoadError
|
140
|
-
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
141
|
-
end
|
data/bin/coop_to_ofx
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
$:.push(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
3
|
+
# $:.push(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
4
|
+
require 'rubygems'
|
4
5
|
require 'optparse'
|
6
|
+
gem 'coop_to_ofx'
|
5
7
|
require 'coop_scraper/version'
|
6
8
|
|
7
9
|
options = {:format => :ofx2, :statement_type => :credit}
|
data/lib/coop_scraper/base.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module CoopScraper
|
2
2
|
module Base
|
3
3
|
def coop_date_to_time(coop_date)
|
4
|
-
|
4
|
+
date_match = coop_date.match(/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/)
|
5
|
+
return nil if date_match.nil?
|
6
|
+
day, month, year = date_match.captures
|
5
7
|
Time.utc(year, month, day)
|
6
8
|
end
|
7
9
|
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'hpricot'
|
1
|
+
require 'nokogiri'
|
3
2
|
|
4
3
|
require 'coop_scraper/base'
|
5
4
|
require 'ofx/statement'
|
@@ -42,9 +41,9 @@ module CoopScraper
|
|
42
41
|
transactions = []
|
43
42
|
current_transaction = {}
|
44
43
|
doc.search('tbody.contents tr').each do |statement_row|
|
45
|
-
date = statement_row.at('td.dataRowL').inner_text
|
46
|
-
unless date
|
47
|
-
current_transaction = extract_transaction(statement_row,
|
44
|
+
date = coop_date_to_time(statement_row.at('td.dataRowL').inner_text)
|
45
|
+
unless date.nil?
|
46
|
+
current_transaction = extract_transaction(statement_row, date)
|
48
47
|
transactions << current_transaction
|
49
48
|
else
|
50
49
|
transaction = extract_transaction(statement_row, statement.date)
|
@@ -67,14 +66,14 @@ module CoopScraper
|
|
67
66
|
|
68
67
|
def extract_transaction(statement_row, date)
|
69
68
|
details = statement_row.at('td.transData').inner_text.strip
|
70
|
-
credit = statement_row.
|
71
|
-
debit = statement_row.
|
69
|
+
credit = statement_row.css('td.moneyData').first.inner_text.match(/[0-9.]+/)
|
70
|
+
debit = statement_row.css('td.moneyData').last.inner_text.match(/[0-9.]+/)
|
72
71
|
amount = credit.nil? ? "-#{debit}" : credit.to_s
|
73
72
|
{:date => date, :amount => amount, :details => details}
|
74
73
|
end
|
75
74
|
|
76
75
|
def generate_statement(html_statement_io, server_response_time)
|
77
|
-
doc =
|
76
|
+
doc = Nokogiri::HTML(html_statement_io)
|
78
77
|
statement = OFX::Statement::CreditCard.new
|
79
78
|
|
80
79
|
statement.server_response_time = server_response_time
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'hpricot'
|
1
|
+
require 'nokogiri'
|
3
2
|
|
4
3
|
require 'coop_scraper/base'
|
5
4
|
require 'ofx/statement'
|
@@ -9,12 +8,16 @@ module CoopScraper
|
|
9
8
|
class << self
|
10
9
|
include CoopScraper::Base
|
11
10
|
|
11
|
+
def extract_account_details(doc)
|
12
|
+
doc.at_xpath("//h4[contains(., 'CURRENT ACCOUNT') or contains(., 'PRIVILEGE') or contains(., 'PRIV SAVINGS')]").inner_text
|
13
|
+
end
|
14
|
+
|
12
15
|
def extract_account_number(doc)
|
13
|
-
doc
|
16
|
+
extract_account_details(doc).match(/([0-9]{8})/)[1]
|
14
17
|
end
|
15
18
|
|
16
19
|
def extract_sort_code(doc)
|
17
|
-
doc
|
20
|
+
extract_account_details(doc).match(/([0-9]{2}-[0-9]{2}-[0-9]{2})/)[1].tr('-', '')
|
18
21
|
end
|
19
22
|
|
20
23
|
def extract_statement_date(doc)
|
@@ -23,7 +26,7 @@ module CoopScraper
|
|
23
26
|
|
24
27
|
def extract_transaction_rows(doc)
|
25
28
|
a_td = doc.at('td.transData')
|
26
|
-
a_td.parent.parent.
|
29
|
+
a_td.parent.parent.css('tr')
|
27
30
|
end
|
28
31
|
|
29
32
|
def determine_trntype(details)
|
@@ -49,8 +52,8 @@ module CoopScraper
|
|
49
52
|
transaction_rows.each do |statement_row|
|
50
53
|
date = statement_row.at('td.dataRowL').inner_text
|
51
54
|
details = statement_row.at('td.transData').inner_text.strip
|
52
|
-
credit = statement_row.
|
53
|
-
debit = statement_row.
|
55
|
+
credit = statement_row.css('td.moneyData')[0].inner_text.match(/[0-9.]+/)
|
56
|
+
debit = statement_row.css('td.moneyData')[1].inner_text.match(/[0-9.]+/)
|
54
57
|
amount = credit.nil? ? "-#{debit}" : credit.to_s
|
55
58
|
options = {}
|
56
59
|
trntype = determine_trntype(details)
|
@@ -61,7 +64,7 @@ module CoopScraper
|
|
61
64
|
end
|
62
65
|
|
63
66
|
def extract_closing_balance(doc)
|
64
|
-
final_transaction = extract_transaction_rows(doc).last.
|
67
|
+
final_transaction = extract_transaction_rows(doc).last.css('td.moneyData').last.inner_text
|
65
68
|
amount = final_transaction.match(/[0-9.]+/).to_s
|
66
69
|
sign = final_transaction.match(/[CD]R/).to_s
|
67
70
|
sign == "CR" ? amount : "-#{amount}"
|
@@ -72,7 +75,7 @@ module CoopScraper
|
|
72
75
|
end
|
73
76
|
|
74
77
|
def generate_statement(html_statement_io, server_response_time)
|
75
|
-
doc =
|
78
|
+
doc = Nokogiri::HTML(html_statement_io)
|
76
79
|
statement = OFX::Statement::CurrentAccount.new
|
77
80
|
|
78
81
|
statement.server_response_time = server_response_time
|
@@ -11,5 +11,9 @@ describe CoopScraper::Base do
|
|
11
11
|
it "should be able to turn a DD/MM/YYYY string into a YYYYMMDD one" do
|
12
12
|
@instance.coop_date_to_time('03/02/2009').should == Time.utc('2009', '2', '3')
|
13
13
|
end
|
14
|
+
|
15
|
+
it "returns nil if it's given something weird" do
|
16
|
+
@instance.coop_date_to_time(' ').should be_nil
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
@@ -7,7 +7,7 @@ describe CoopScraper::CreditCard do
|
|
7
7
|
|
8
8
|
describe "parsing the html components" do
|
9
9
|
def fixture_doc(fixture_file_name = 'cc_statement_fixture.html')
|
10
|
-
open(fixture_path(fixture_file_name)) { |f|
|
10
|
+
open(fixture_path(fixture_file_name)) { |f| Nokogiri::HTML(f) }
|
11
11
|
end
|
12
12
|
|
13
13
|
def fixture_with_interest_line_doc
|
@@ -7,7 +7,7 @@ describe CoopScraper::CurrentAccount do
|
|
7
7
|
|
8
8
|
describe "parsing the html components" do
|
9
9
|
def fixture_doc(name = 'current_account_fixture.html')
|
10
|
-
open(fixture_path(name)) { |f|
|
10
|
+
open(fixture_path(name)) { |f| Nokogiri::HTML(f) }
|
11
11
|
end
|
12
12
|
|
13
13
|
def normal_transaction_fixture_doc
|
@@ -150,5 +150,127 @@ describe CoopScraper::CurrentAccount do
|
|
150
150
|
CoopScraper::CurrentAccount.generate_statement(fixture, Time.utc('2009', '3', '6'))
|
151
151
|
end
|
152
152
|
end
|
153
|
+
|
154
|
+
describe "Non-current account statements (Privilege, savings, etc) which use the same HTML structure" do
|
155
|
+
describe "Privilege statements" do
|
156
|
+
it "should be able to extract the statement date" do
|
157
|
+
CoopScraper::CurrentAccount.extract_statement_date(fixture_doc('privilege_fixture.html')).should == Time.utc('2010', '8', '23')
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should be able to extract the account number" do
|
161
|
+
CoopScraper::CurrentAccount.extract_account_number(fixture_doc('privilege_fixture.html')).should == "12341234"
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should be able to extract the sort code" do
|
165
|
+
CoopScraper::CurrentAccount.extract_sort_code(fixture_doc('privilege_fixture.html')).should == "089273"
|
166
|
+
end
|
167
|
+
|
168
|
+
describe "transactions" do
|
169
|
+
before(:all) do
|
170
|
+
@transactions = CoopScraper::CurrentAccount.extract_transactions(fixture_doc('privilege_fixture.html'))
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should find the correct number of transactions" do
|
174
|
+
@transactions.size.should == 25
|
175
|
+
end
|
176
|
+
|
177
|
+
describe "processing a normal transaction" do
|
178
|
+
before(:each) do
|
179
|
+
@transaction = @transactions.first
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should pull out the date" do
|
183
|
+
@transaction.date.should == Time.utc('2010', '8', '6')
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should pull out the amount" do
|
187
|
+
@transaction.amount.should == '-20.00'
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should pull out the details" do
|
191
|
+
@transaction.name.should == 'OYSTER AUTOTOPUP'
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe "processing a transaction where money was put in" do
|
196
|
+
before(:each) do
|
197
|
+
@transaction = @transactions[10]
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should pull out the date" do
|
201
|
+
@transaction.date.should == Time.utc('2010', '8', '16')
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should pull out the amount" do
|
205
|
+
@transaction.amount.should == '1500.00'
|
206
|
+
end
|
207
|
+
|
208
|
+
it "should pull out the details" do
|
209
|
+
@transaction.name.should == 'TFR'
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
describe "Privilege Savings statements" do
|
216
|
+
it "should be able to extract the statement date" do
|
217
|
+
CoopScraper::CurrentAccount.extract_statement_date(fixture_doc('priv_savings_fixture.html')).should == Time.utc('2010', '7', '15')
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should be able to extract the account number" do
|
221
|
+
CoopScraper::CurrentAccount.extract_account_number(fixture_doc('priv_savings_fixture.html')).should == "43211234"
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should be able to extract the sort code" do
|
225
|
+
CoopScraper::CurrentAccount.extract_sort_code(fixture_doc('priv_savings_fixture.html')).should == "089273"
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "transactions" do
|
229
|
+
before(:all) do
|
230
|
+
@transactions = CoopScraper::CurrentAccount.extract_transactions(fixture_doc('priv_savings_fixture.html'))
|
231
|
+
end
|
232
|
+
|
233
|
+
it "should find the correct number of transactions" do
|
234
|
+
@transactions.size.should == 13
|
235
|
+
end
|
236
|
+
|
237
|
+
describe "processing a normal transaction" do
|
238
|
+
before(:each) do
|
239
|
+
@transaction = @transactions[1]
|
240
|
+
end
|
241
|
+
|
242
|
+
it "should pull out the date" do
|
243
|
+
@transaction.date.should == Time.utc('2010', '4', '27')
|
244
|
+
end
|
245
|
+
|
246
|
+
it "should pull out the amount" do
|
247
|
+
@transaction.amount.should == '-500.00'
|
248
|
+
end
|
249
|
+
|
250
|
+
it "should pull out the details" do
|
251
|
+
@transaction.name.should == 'TFR'
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
describe "processing a transaction where money was put in" do
|
256
|
+
before(:each) do
|
257
|
+
@transaction = @transactions.first
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should pull out the date" do
|
261
|
+
@transaction.date.should == Time.utc('2010', '4', '23')
|
262
|
+
end
|
263
|
+
|
264
|
+
it "should pull out the amount" do
|
265
|
+
@transaction.amount.should == '2000.00'
|
266
|
+
end
|
267
|
+
|
268
|
+
it "should pull out the details" do
|
269
|
+
@transaction.name.should == 'DEPOSIT'
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
153
275
|
end
|
154
276
|
end
|
@@ -0,0 +1,462 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
<html>
|
6
|
+
<head>
|
7
|
+
<TITLE>The Co-operative Bank p.l.c.</TITLE>
|
8
|
+
<link rel="stylesheet" href="https://welcome27.co-operativebank.co.uk/CBIBSImages/theme/Master.css" type="text/css">
|
9
|
+
<META content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
|
10
|
+
<META http-equiv="Content-Type" content="no-cache">
|
11
|
+
<META http-equiv="Pragma" content="no-cache">
|
12
|
+
<META http-equiv="Expires" content="-1">
|
13
|
+
<META http-equiv="Pragma-directive" content="no-cache">
|
14
|
+
<META http-equiv="cache-directive" content="no-cache">
|
15
|
+
</head>
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
<body>
|
21
|
+
<table width="100%" cellpadding="0" cellspacing="0">
|
22
|
+
<tr>
|
23
|
+
<td>
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
<table width="100%" cellpadding="0" border="0" cellspacing="0">
|
32
|
+
<tr>
|
33
|
+
<td class="pageheader" height="0" width="50%"> </td>
|
34
|
+
<td class="pageheader" width="20%"> </td>
|
35
|
+
<td class="pageheader" height="10" width="30%"> </td>
|
36
|
+
</tr>
|
37
|
+
<tr>
|
38
|
+
<td class="pageheader" valign="TOP" width="50%"><img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/coop_logo_top.gif" align="left" alt="Top of the co-operative bank logo"></td>
|
39
|
+
<TD class="pageheader" valign="baseline" align="left" width="20%">
|
40
|
+
<table border="0" cellspacing="0" cellpadding="0" width="100%"><!--Table is used for vertical alignment-->
|
41
|
+
<tr><td> </td></tr>
|
42
|
+
<tr>
|
43
|
+
<TD class="pageheader" valign="BOTTOM" align="right" width="100%" height="100%">
|
44
|
+
<a href="/CBIBSWeb/sidebar.do?action=logoff&org.apache.struts.taglib.html.TOKEN=Nan" title="Log Off" class="whiteLinks"><img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/logoffbutton.gif" align="middle" alt="Log Off"></a>
|
45
|
+
</TD>
|
46
|
+
</tr>
|
47
|
+
</table>
|
48
|
+
</TD>
|
49
|
+
|
50
|
+
<TD class="pageheader" valign="baseline" align="left" width="35%">
|
51
|
+
<table border="0" cellspacing="0" cellpadding="0" width="100%"><!--Table is used for vertical alignment-->
|
52
|
+
<tr><td> </td></tr><!--Used for alignment-->
|
53
|
+
<tr>
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
<td class="pageheadernew" valign="baseline" width="22.5%"><a href="http://www.co-operativebank.co.uk/helppages/cbibs/statements/currentAccountPreviousStatements.htm" target="_blank" class="whiteLinks" title="New Help Window Opened">
|
58
|
+
<img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/helpbutton.gif" align="left" alt="Help"></a></coop:HelpLinkTag>
|
59
|
+
</td>
|
60
|
+
<td class="pageheader" align="left" valign="baseline" width="77.5%"><a href="/CBIBSWeb/printstatementDomestic.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Printer Friendly Page" class="whiteLinks"><img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/printbutton.gif" align="left" alt="Print"></a>
|
61
|
+
</td>
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
</tr>
|
66
|
+
</table>
|
67
|
+
</td>
|
68
|
+
</tr>
|
69
|
+
<tr align="left">
|
70
|
+
<td>
|
71
|
+
<table width="100%" border="0">
|
72
|
+
<tr>
|
73
|
+
<td align="left"> </td>
|
74
|
+
<td align="left" valign="baseline" width="40%">Saturday 25 September 2010</td>
|
75
|
+
<td align="left" valign="baseline" width="60%"><span class="H4">MR M</span></td>
|
76
|
+
</tr>
|
77
|
+
<tr><td> </td></tr>
|
78
|
+
</table>
|
79
|
+
</td>
|
80
|
+
</tr>
|
81
|
+
</table>
|
82
|
+
</td>
|
83
|
+
</tr>
|
84
|
+
<tr valign="top" align="left">
|
85
|
+
<td class="sidebar" >
|
86
|
+
<table width="100%">
|
87
|
+
<tr valign="top" align="left">
|
88
|
+
<td width="20%" class="sidebar">
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
<table cellpadding="3" cellspacing="5" width="78%" border="0">
|
96
|
+
<tr>
|
97
|
+
<td valign="top" height="26"><br></td>
|
98
|
+
</tr>
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
<tr valign="top">
|
104
|
+
<td valign="top" class="sidebar">
|
105
|
+
<a href="/CBIBSWeb/backToAccountBalance.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Your Accounts" class="sidebar">Your Accounts</a>
|
106
|
+
</td>
|
107
|
+
</tr>
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
<tr valign="top">
|
113
|
+
<td valign="top" class="backgroundSelected">
|
114
|
+
<a href="/CBIBSWeb/prepareStatements.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Statements" class="sidebarSelected">Statements</a>
|
115
|
+
</td>
|
116
|
+
</tr>
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
<tr valign="top">
|
122
|
+
<td valign="top" class="sidebar">
|
123
|
+
<a href="/CBIBSWeb/billPaymentSummaryPrepare.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Pay Bills" class="sidebar">Pay Bills</a>
|
124
|
+
</td>
|
125
|
+
</tr>
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
<tr valign="top">
|
131
|
+
<td valign="top" class="sidebar">
|
132
|
+
<a href="/CBIBSWeb/standingOrderSummaryPrepare.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Standing Orders" class="sidebar">Standing Orders</a>
|
133
|
+
</td>
|
134
|
+
</tr>
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
<tr valign="top">
|
140
|
+
<td valign="top" class="sidebar">
|
141
|
+
<a href="/CBIBSWeb/fundsTransferSummaryPrepare.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Funds Transfers" class="sidebar">Funds Transfers</a>
|
142
|
+
</td>
|
143
|
+
</tr>
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
<tr valign="top">
|
149
|
+
<td valign="top" class="sidebar">
|
150
|
+
<a href="/CBIBSWeb/directDebitsSummaryPrepare.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Direct Debits" class="sidebar">Direct Debits</a>
|
151
|
+
</td>
|
152
|
+
</tr>
|
153
|
+
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
<tr valign="top">
|
158
|
+
<td valign="top" class="sidebar">
|
159
|
+
<a href="/CBIBSWeb/customerServicesSummary.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Customer Services" class="sidebar">Customer Services</a>
|
160
|
+
</td>
|
161
|
+
</tr>
|
162
|
+
|
163
|
+
<tr>
|
164
|
+
<td> </td>
|
165
|
+
</tr>
|
166
|
+
</table>
|
167
|
+
</td>
|
168
|
+
<td width="80%" class="sidebar" >
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
|
176
|
+
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
177
|
+
<tr>
|
178
|
+
<td class="field"><span class="H2">Statement<br>
|
179
|
+
</span></td>
|
180
|
+
</tr>
|
181
|
+
</table>
|
182
|
+
|
183
|
+
<table cellpadding="0" cellspacing="0" border="0" width="100%">
|
184
|
+
<tr>
|
185
|
+
<td bgcolor="#000000"><img src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/spacer.gif" height="1" width="1" alt=""></td>
|
186
|
+
</tr>
|
187
|
+
</table>
|
188
|
+
|
189
|
+
<table width="95%" border="0" cellspacing="0" cellpadding="0">
|
190
|
+
<tbody>
|
191
|
+
<tr><td><br/></td></tr>
|
192
|
+
<tr>
|
193
|
+
<td class="field">
|
194
|
+
<h4>PRIV SAVINGS
|
195
|
+
08-92-73
|
196
|
+
43211234
|
197
|
+
</h4>
|
198
|
+
</td>
|
199
|
+
</tr>
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
<tr>
|
204
|
+
<td align="left">
|
205
|
+
<table cellpadding="0" cellspacing="0" border="0">
|
206
|
+
<tbody>
|
207
|
+
<tr>
|
208
|
+
<td class="field">Page 15</td>
|
209
|
+
<td align="right">Date 15/07/2010</td>
|
210
|
+
</tr>
|
211
|
+
<tr>
|
212
|
+
<td colspan="2"><br/>
|
213
|
+
</td>
|
214
|
+
</tr>
|
215
|
+
<tr>
|
216
|
+
<td colspan="2" align="left">
|
217
|
+
<table align="left" cellpadding="0" cellspacing="0" border="1">
|
218
|
+
|
219
|
+
<thead>
|
220
|
+
<tr>
|
221
|
+
<th>Date</th>
|
222
|
+
<th>Transaction</th>
|
223
|
+
<th>Deposits</th>
|
224
|
+
<th>Withdrawals</th>
|
225
|
+
<th>Balance</th>
|
226
|
+
</tr>
|
227
|
+
</thead>
|
228
|
+
<tbody>
|
229
|
+
|
230
|
+
<tr>
|
231
|
+
<td class="dataRowL"> 15/04/2010 </td>
|
232
|
+
<td class="transData">BROUGHT FORWARD</td>
|
233
|
+
<td class="moneyData"> </td>
|
234
|
+
<td class="moneyData"> </td>
|
235
|
+
<td class="moneyData"> �1957.60 CR </td>
|
236
|
+
</tr>
|
237
|
+
|
238
|
+
<tr>
|
239
|
+
<td class="dataRowL"> 23/04/2010 </td>
|
240
|
+
<td class="transData">DEPOSIT</td>
|
241
|
+
<td class="moneyData"> �2000.00 </td>
|
242
|
+
<td class="moneyData"> </td>
|
243
|
+
<td class="moneyData"> �3957.60 CR </td>
|
244
|
+
</tr>
|
245
|
+
|
246
|
+
<tr>
|
247
|
+
<td class="dataRowL"> 27/04/2010 </td>
|
248
|
+
<td class="transData">TFR</td>
|
249
|
+
<td class="moneyData"> </td>
|
250
|
+
<td class="moneyData"> �500.00 </td>
|
251
|
+
<td class="moneyData"> �3457.60 CR </td>
|
252
|
+
</tr>
|
253
|
+
|
254
|
+
<tr>
|
255
|
+
<td class="dataRowL"> 27/04/2010 </td>
|
256
|
+
<td class="transData">TFR</td>
|
257
|
+
<td class="moneyData"> </td>
|
258
|
+
<td class="moneyData"> �1000.00 </td>
|
259
|
+
<td class="moneyData"> �2457.60 CR </td>
|
260
|
+
</tr>
|
261
|
+
|
262
|
+
<tr>
|
263
|
+
<td class="dataRowL"> 10/05/2010 </td>
|
264
|
+
<td class="transData">DEPOSIT</td>
|
265
|
+
<td class="moneyData"> �2000.00 </td>
|
266
|
+
<td class="moneyData"> </td>
|
267
|
+
<td class="moneyData"> �4457.60 CR </td>
|
268
|
+
</tr>
|
269
|
+
|
270
|
+
<tr>
|
271
|
+
<td class="dataRowL"> 19/05/2010 </td>
|
272
|
+
<td class="transData">TFR</td>
|
273
|
+
<td class="moneyData"> </td>
|
274
|
+
<td class="moneyData"> �1500.00 </td>
|
275
|
+
<td class="moneyData"> �2957.60 CR </td>
|
276
|
+
</tr>
|
277
|
+
|
278
|
+
<tr>
|
279
|
+
<td class="dataRowL"> 24/05/2010 </td>
|
280
|
+
<td class="transData">TFR</td>
|
281
|
+
<td class="moneyData"> </td>
|
282
|
+
<td class="moneyData"> �300.00 </td>
|
283
|
+
<td class="moneyData"> �2657.60 CR </td>
|
284
|
+
</tr>
|
285
|
+
|
286
|
+
<tr>
|
287
|
+
<td class="dataRowL"> 01/06/2010 </td>
|
288
|
+
<td class="transData">TFR</td>
|
289
|
+
<td class="moneyData"> </td>
|
290
|
+
<td class="moneyData"> �2100.00 </td>
|
291
|
+
<td class="moneyData"> �557.60 CR </td>
|
292
|
+
</tr>
|
293
|
+
|
294
|
+
<tr>
|
295
|
+
<td class="dataRowL"> 09/06/2010 </td>
|
296
|
+
<td class="transData">TFR</td>
|
297
|
+
<td class="moneyData"> �1800.00 </td>
|
298
|
+
<td class="moneyData"> </td>
|
299
|
+
<td class="moneyData"> �2357.60 CR </td>
|
300
|
+
</tr>
|
301
|
+
|
302
|
+
<tr>
|
303
|
+
<td class="dataRowL"> 11/06/2010 </td>
|
304
|
+
<td class="transData">TFR</td>
|
305
|
+
<td class="moneyData"> </td>
|
306
|
+
<td class="moneyData"> �300.00 </td>
|
307
|
+
<td class="moneyData"> �2057.60 CR </td>
|
308
|
+
</tr>
|
309
|
+
|
310
|
+
<tr>
|
311
|
+
<td class="dataRowL"> 11/06/2010 </td>
|
312
|
+
<td class="transData">TFR</td>
|
313
|
+
<td class="moneyData"> </td>
|
314
|
+
<td class="moneyData"> �500.00 </td>
|
315
|
+
<td class="moneyData"> �1557.60 CR </td>
|
316
|
+
</tr>
|
317
|
+
|
318
|
+
<tr>
|
319
|
+
<td class="dataRowL"> 21/06/2010 </td>
|
320
|
+
<td class="transData">TFR</td>
|
321
|
+
<td class="moneyData"> </td>
|
322
|
+
<td class="moneyData"> �1000.00 </td>
|
323
|
+
<td class="moneyData"> �557.60 CR </td>
|
324
|
+
</tr>
|
325
|
+
|
326
|
+
<tr>
|
327
|
+
<td class="dataRowL"> 21/06/2010 </td>
|
328
|
+
<td class="transData">DEPOSIT</td>
|
329
|
+
<td class="moneyData"> �2000.00 </td>
|
330
|
+
<td class="moneyData"> </td>
|
331
|
+
<td class="moneyData"> �2557.60 CR </td>
|
332
|
+
</tr>
|
333
|
+
|
334
|
+
<tr>
|
335
|
+
<td class="dataRowL"> 25/06/2010 </td>
|
336
|
+
<td class="transData">TFR</td>
|
337
|
+
<td class="moneyData"> </td>
|
338
|
+
<td class="moneyData"> �100.00 </td>
|
339
|
+
<td class="moneyData"> �2457.60 CR </td>
|
340
|
+
</tr>
|
341
|
+
|
342
|
+
</tbody>
|
343
|
+
|
344
|
+
</table>
|
345
|
+
</td>
|
346
|
+
</tr>
|
347
|
+
<tr>
|
348
|
+
<td> </td>
|
349
|
+
</tr>
|
350
|
+
<tr>
|
351
|
+
<td colspan="2" align="right">
|
352
|
+
|
353
|
+
|
354
|
+
<a href="/CBIBSWeb/paginateDomesticStatement.do?paginate=previous&org.apache.struts.taglib.html.TOKEN=Nan" title="previous"><span class="bodyhighlight">previous</span></a>
|
355
|
+
|
356
|
+
</td>
|
357
|
+
</tr>
|
358
|
+
|
359
|
+
</tbody>
|
360
|
+
</table>
|
361
|
+
</td>
|
362
|
+
</tr>
|
363
|
+
|
364
|
+
</tbody>
|
365
|
+
</table>
|
366
|
+
<table width="95%" cellspacing="0" cellpadding="0">
|
367
|
+
|
368
|
+
<tr>
|
369
|
+
<td class="field" colspan="2"><br/>
|
370
|
+
To view Recent Items click <a href="/CBIBSWeb/domesticRecentItems.do?org.apache.struts.taglib.html.TOKEN=Nan" title="Recent Items"><span class="bodyhighlight">Recent Items</span></a>.<br>
|
371
|
+
</td>
|
372
|
+
</tr>
|
373
|
+
<tr>
|
374
|
+
<td class="field" colspan="2"><BR> To select another service click the menu on the left. <BR><BR>
|
375
|
+
</td>
|
376
|
+
</tr>
|
377
|
+
<tr>
|
378
|
+
<td> </td>
|
379
|
+
</tr>
|
380
|
+
<tr>
|
381
|
+
<td colspan="2" align="left"> To view another account, please select from the list below </td>
|
382
|
+
</tr>
|
383
|
+
</table>
|
384
|
+
</td>
|
385
|
+
</tr>
|
386
|
+
<tr valign="top" align="left">
|
387
|
+
<td></td>
|
388
|
+
<td align="left">
|
389
|
+
|
390
|
+
|
391
|
+
|
392
|
+
<form name="viewAccountForm" method="post" action="/CBIBSWeb/prepareDomesticStatements.do"><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="Nan">
|
393
|
+
<table cellpadding="0" cellspacing="0" border="0">
|
394
|
+
<tr>
|
395
|
+
<td><label for="accounts" class="nodisplay">accounts</label></td>
|
396
|
+
</tr>
|
397
|
+
<tr valign="bottom">
|
398
|
+
<td class="field" width="56%">
|
399
|
+
<select name="selectedAccount" id="accounts">
|
400
|
+
<option value ="Select Account">Select Account</option>
|
401
|
+
<option value ="Nan">ACCOUNT</option>
|
402
|
+
|
403
|
+
</select>
|
404
|
+
</td>
|
405
|
+
<td class="field">
|
406
|
+
<input type="image" name="VIEW" src="https://welcome27.co-operativebank.co.uk/CBIBSImages/images/viewbutton.gif" title="view account" alt="view">
|
407
|
+
</td>
|
408
|
+
</tr>
|
409
|
+
<tr>
|
410
|
+
<td class="error" colspan="2"></td>
|
411
|
+
</tr>
|
412
|
+
<tr>
|
413
|
+
<td colspan="2"> </td>
|
414
|
+
</tr>
|
415
|
+
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
<tr>
|
420
|
+
<td colspan="2" align="left"><strong><font color="#216173">IBAN :</font></strong> GB15 CPBK 0891 0303 4693 05
|
421
|
+
|
422
|
+
<strong><font color="#216173">BIC :</font></strong> CPBK GB 22
|
423
|
+
</td>
|
424
|
+
</tr>
|
425
|
+
|
426
|
+
|
427
|
+
|
428
|
+
<tr>
|
429
|
+
<td colspan="2"> </td>
|
430
|
+
</tr>
|
431
|
+
|
432
|
+
|
433
|
+
|
434
|
+
|
435
|
+
|
436
|
+
|
437
|
+
|
438
|
+
|
439
|
+
|
440
|
+
|
441
|
+
|
442
|
+
|
443
|
+
|
444
|
+
|
445
|
+
|
446
|
+
|
447
|
+
</table>
|
448
|
+
</form>
|
449
|
+
</td>
|
450
|
+
</tr>
|
451
|
+
</table>
|
452
|
+
</td>
|
453
|
+
</tr>
|
454
|
+
<tr>
|
455
|
+
<td align="left"><table width="100%">
|
456
|
+
<tr><td/>
|
457
|
+
</tr>
|
458
|
+
</table></td>
|
459
|
+
</tr>
|
460
|
+
</table>
|
461
|
+
</body>
|
462
|
+
</html>
|