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