|
- 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
|