coop_to_ofx 1.0.1 → 1.1.0
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.
- 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>
|