|
|
@@ -0,0 +1,199 @@ |
|
|
|
require 'lib/models' |
|
|
|
require 'fastercsv' |
|
|
|
|
|
|
|
# Before running this script with a CSV file, prepare it so: |
|
|
|
# - There is only a single line of column headings on the first line of the file |
|
|
|
# - There are no spaces before or after the column headings |
|
|
|
# - The column headings correspond with the key names in the columns{} hash below |
|
|
|
# - The data starts on line 2 |
|
|
|
|
|
|
|
def slugify(name) |
|
|
|
output = name.gsub(/[^\w\s-]/, '').gsub(/\s+/, '-').downcase |
|
|
|
output.gsub(/---/, '-') |
|
|
|
end |
|
|
|
|
|
|
|
columns = () |
|
|
|
directorate_column = nil |
|
|
|
service_name_column = nil |
|
|
|
vendor_name_column = nil |
|
|
|
date_column = nil |
|
|
|
|
|
|
|
directorate_replacements = |
|
|
|
[ |
|
|
|
[ "Childrens Services", "Children's Services" ], |
|
|
|
[ "Policy,Performance and Planning", "Policy, Performance and Planning" ] |
|
|
|
] |
|
|
|
|
|
|
|
service_replacements = |
|
|
|
[ |
|
|
|
[ "Corporate Performance and Developmt", "Corporate Performance and Development" ], |
|
|
|
[ "ISB", "ISB - Individual Schools Budget" ], |
|
|
|
[ "Library and Information Services", "Libraries and Information Services" ], |
|
|
|
[ "On Street Parking", "On-Street Parking" ] |
|
|
|
] |
|
|
|
|
|
|
|
count = 0 |
|
|
|
|
|
|
|
if ARGV[0].nil? |
|
|
|
puts "Specify the filename of the CSV file to import on the command line" |
|
|
|
exit |
|
|
|
end |
|
|
|
|
|
|
|
date_format = ARGV[1].upcase |
|
|
|
|
|
|
|
if date_format != 'DMY' && date_format != 'MDY' |
|
|
|
puts "Specify the date format as DMY or MDY as the second argument on the command line" |
|
|
|
exit |
|
|
|
end |
|
|
|
|
|
|
|
Setting.first_or_create( |
|
|
|
:id => 1, |
|
|
|
:site_name => 'Cotswold District Council Armchair Auditor', |
|
|
|
:site_tagline => 'moinkles', |
|
|
|
:site_url => 'http://cotswold.chard.org/', |
|
|
|
:org_name => 'Cotswolds', |
|
|
|
:org_url => 'http://www.cotswold.gov.uk/', |
|
|
|
:data_url => 'http://www.cotswold.gov.uk/nqcontent.cfm?a_id=13293#files' |
|
|
|
) |
|
|
|
|
|
|
|
FasterCSV.foreach(ARGV[0]) do |row| |
|
|
|
|
|
|
|
count += 1 |
|
|
|
|
|
|
|
if (count > 1) # skip first line that doesn't contain data |
|
|
|
|
|
|
|
p row |
|
|
|
|
|
|
|
if not directorate_column.nil? |
|
|
|
directorate_name = row[columns[directorate_column]].strip.gsub(/&/, "and") |
|
|
|
directorate = Directorate.first_or_create(:name => directorate_name, :slug => slugify(directorate_name)) |
|
|
|
unless directorate.save |
|
|
|
puts "ERROR: Failed to save directorate" |
|
|
|
puts directorate.errors.inspect |
|
|
|
end |
|
|
|
end |
|
|
|
service_name = row[columns[service_name_column]].strip.gsub(/&/, "and") |
|
|
|
supplier_name = row[columns[vendor_name_column]].strip.gsub(/&/, "and") |
|
|
|
|
|
|
|
|
|
|
|
#for replacement in directorate_replacements |
|
|
|
#if directorate_name == replacement[0] |
|
|
|
#directorate_name = replacement[1] |
|
|
|
#end |
|
|
|
#end |
|
|
|
|
|
|
|
for replacement in service_replacements |
|
|
|
if service_name == replacement[0] |
|
|
|
service_name = replacement[1] |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
service = Service.first_or_create(:name => service_name, :directorate => directorate, :slug => slugify(service_name)) |
|
|
|
unless service.save |
|
|
|
puts "ERROR: Failed to save service" |
|
|
|
puts service.errors.inspect |
|
|
|
end |
|
|
|
supplier = Supplier.first_or_create(:name => supplier_name, :slug => slugify(supplier_name)) |
|
|
|
unless supplier.save |
|
|
|
puts "ERROR: Failed to save supplier" |
|
|
|
puts supplier.errors.inspect |
|
|
|
end |
|
|
|
|
|
|
|
if row[columns[date_column]].nil? |
|
|
|
if ARGV[2].nil? |
|
|
|
puts "ERROR: missing payment dates; specify date on command line" |
|
|
|
exit |
|
|
|
end |
|
|
|
dt = ARGV[2].strip.split('/') |
|
|
|
else |
|
|
|
dt = row[columns[date_column]].strip.split('/') |
|
|
|
end |
|
|
|
|
|
|
|
# Date.new takes YMD params |
|
|
|
if date_format == 'DMY' |
|
|
|
d = Date.new(dt[2].to_i, dt[1].to_i, dt[0].to_i) |
|
|
|
elsif date_format == 'MDY' |
|
|
|
d = Date.new(dt[2].to_i, dt[0].to_i, dt[1].to_i) |
|
|
|
elsif date_format == 'YMD' |
|
|
|
d = Date.new(dt[0].to_i, dt[1].to_i, dt[2].to_i) |
|
|
|
end |
|
|
|
|
|
|
|
payment = Payment.first_or_new( |
|
|
|
'service' => service, |
|
|
|
'supplier' => supplier, |
|
|
|
'amount' => row[columns['Amount']].strip.gsub(/,/, ''), |
|
|
|
'd' => d |
|
|
|
) |
|
|
|
|
|
|
|
unless payment.save |
|
|
|
puts "ERROR: Failed to save payment" |
|
|
|
puts payment.errors.inspect |
|
|
|
payment.errors.each do |e| |
|
|
|
puts e |
|
|
|
end |
|
|
|
end |
|
|
|
else |
|
|
|
# Get the column headings |
|
|
|
position = 0 |
|
|
|
|
|
|
|
# Annoyingly, CDC has changed its column names, and we want to support |
|
|
|
# both types of file. Even more annoyingly, directorates aren't |
|
|
|
# specified any more. |
|
|
|
if row.include? 'Vendor Name' |
|
|
|
service_name_column = 'Service Area' |
|
|
|
vendor_name_column = 'Vendor Name' |
|
|
|
date_column = 'Payment Date' |
|
|
|
|
|
|
|
columns = |
|
|
|
{ |
|
|
|
'Body name' => nil, |
|
|
|
'Body' => nil, |
|
|
|
'Number' => nil, |
|
|
|
'Invoice Ref.' => nil, |
|
|
|
'Vendor Name' => nil, |
|
|
|
'Expense' => nil, |
|
|
|
'Expense Type' => nil, |
|
|
|
'Cost Centre' => nil, |
|
|
|
'Payment Date' => nil, |
|
|
|
'Amount' => nil, |
|
|
|
'Service Area' => nil, |
|
|
|
} |
|
|
|
else |
|
|
|
directorate_column = 'Service Area Categorisation' |
|
|
|
service_name_column = 'Service Division Categorisation' |
|
|
|
vendor_name_column = 'Supplier Name' |
|
|
|
if row.include? 'Invoice Date' |
|
|
|
date_column = 'Invoice Date' |
|
|
|
else |
|
|
|
date_column = 'Date' |
|
|
|
end |
|
|
|
|
|
|
|
columns = |
|
|
|
{ |
|
|
|
'Body Name' => nil, |
|
|
|
'Body' => nil, |
|
|
|
'Service Area Categorisation' => nil, |
|
|
|
'Service Division Categorisation' => nil, |
|
|
|
'Responsible Unit' => nil, |
|
|
|
'Expenses type' => nil, |
|
|
|
'Detailed expenses type' => nil, |
|
|
|
'Expenses code' => nil, |
|
|
|
'Narrative' => nil, |
|
|
|
date_column => nil, |
|
|
|
'Transaction Number' => nil, |
|
|
|
'Amount' => nil, |
|
|
|
'Revenue/Capital' => nil, |
|
|
|
'Supplier Name' => nil, |
|
|
|
'Supplier ID' => nil, |
|
|
|
'Contract ID' => nil, |
|
|
|
'Notes' => nil |
|
|
|
} |
|
|
|
end |
|
|
|
|
|
|
|
for column in row |
|
|
|
columns[column] = position |
|
|
|
position += 1 |
|
|
|
end |
|
|
|
puts columns.inspect |
|
|
|
end |
|
|
|
end |