def import_do
if params[:file]
- # Enregistre le fichier localement (format = Date + nom du fichier)
- filename = DateTime.now.to_s.concat('-', params[:file].original_filename)
-
- # créer le répertoire temporaire s'ul n'existe pas déjà
- Dir.mkdir('public/excel') unless Dir.exist?('public/excel')
+ @stdout_stream = capture_stdout do
+ importer_xls(params)
+ end
- file_with_path = Rails.root.join('public', 'excel', filename)
- File.open(file_with_path, 'wb') do |file|
- file.write(params[:file].read)
+ # Garder une trace dans un fichier de log
+ if params[:enregistrer] == '1'
+ f = File.new("log/import_#{DateTime.now}.log", 'w')
+ f << @stdout_stream
+ f.close
end
+ end
+ end
- @importes = @errors = 0
- @messages = []
- index = 1
+ def importer_xls(params)
- # IMPORT XLS
- Spreadsheet.client_encoding = 'UTF-8'
- book = Spreadsheet.open file_with_path
- sheet1 = book.worksheet 0
- headers = Compte.xls_headers
-
- organisation = current_user.organisation
-
- sheet1.each 1 do |row|
- index += 1
-
- next unless row[0]
-
- # Structure => structure
- structure = organisation
- .structures
- .where("UPPER(nom) = ?", row[headers.index 'structure'].strip.upcase)
- .first_or_initialize do |s|
- s.nom = row[headers.index 'structure']
- end
-
- if structure.valid?
- @messages << "STRUCTURE #{structure.new_record? ? 'NOUVEAU' : 'MAJ'} => id:#{structure.id} changements:#{structure.changes}"
- structure.save if params[:enregistrer] == '1'
- else
- @messages << " || ERREURS: " + structure.errors.messages.map{|m| "#{m.first} => #{m.last}"}.join(',')
- end
-
- # Compte => nom_compte civilité adresse1 adresse2 cp ville num_allocataire mémo
- compte = structure
- .comptes
- .where('UPPER(nom) = ?', row[headers.index 'nom_compte'].strip.upcase)
- .first_or_initialize do |c|
- c.nom = row[headers.index 'nom_compte']
- c.civilité = row[headers.index 'civilité']
- c.adresse1 = row[headers.index 'adresse1']
- c.adresse2 = row[headers.index 'adresse2']
- c.cp = row[headers.index 'cp'].to_s
- c.ville = row[headers.index 'ville']
- c.num_allocataire = row[headers.index 'num_allocataire'].to_s
- c.mémo = row[headers.index 'mémo']
- end
-
- if compte.valid?
- @messages << "COMPTE #{compte.new_record? ? 'NOUVEAU' : 'MAJ'} => id:#{compte.id} changements:#{compte.changes}"
- compte.save if params[:enregistrer] == '1'
- else
- @messages << " || ERREURS: " + compte.errors.messages.map{|m| "#{m.first} => #{m.last}"}.join(',')
- end
-
- # Contact =>
+ # Enregistre le fichier localement (format = Date + nom du fichier)
+ filename = DateTime.now.to_s.concat('-', params[:file].original_filename)
+
+ # créer le répertoire temporaire s'ul n'existe pas déjà
+ Dir.mkdir('public/excel') unless Dir.exist?('public/excel')
+
+ file_with_path = Rails.root.join('public', 'excel', filename)
+ File.open(file_with_path, 'wb') do |file|
+ file.write(params[:file].read)
+ end
+
+ @importes = @errors = 0
+ @messages = []
+ index = 1
+ enregistrer = (params[:enregistrer] == '1')
+
+ # IMPORT XLS
+ Spreadsheet.client_encoding = 'UTF-8'
+ book = Spreadsheet.open file_with_path
+ sheet1 = book.worksheet 0
+ headers = Compte.xls_headers
+ organisation = current_user.organisation
+ puts "Organisation: #{organisation.id} (#{organisation.nom})"
+
+ sheet1.each 1 do |row|
+ index += 1
+
+ next unless row[0]
+
+ # Structure => nom
+ structure = organisation
+ .structures
+ .where("UPPER(nom) = ?", row[headers.index 'structure'].strip.upcase)
+ .first_or_initialize do |s|
+ s.nom = row[headers.index 'structure']
+ end
+
+ @messages << message_import_log(structure)
+ structure.save if structure.valid? && enregistrer
+
+ # Compte => nom_compte civilité adresse1 adresse2 cp ville num_allocataire mémo_compte
+ compte = structure
+ .comptes
+ .where('UPPER(nom) = ?', row[headers.index 'nom_compte'].strip.upcase)
+ .first_or_initialize do |c|
+ c.nom = row[headers.index 'nom_compte']
+ c.civilité = row[headers.index 'civilité']
+ c.adresse1 = row[headers.index 'adresse1']
+ c.adresse2 = row[headers.index 'adresse2']
+ c.cp = row[headers.index 'cp'].to_s
+ c.ville = row[headers.index 'ville']
+ c.num_allocataire = row[headers.index 'num_allocataire'].to_s
+ c.mémo = row[headers.index 'mémo_compte']
+ end
+
+ @messages << message_import_log(compte)
+ compte.save if compte.valid? && enregistrer
+
+ # Contact => nom_contact fixe portable email mémo_contact
+ contact = compte
+ .contacts
+ .where('UPPER(nom) = ?', row[headers.index 'nom_contact'].strip.upcase)
+ .first_or_initialize do |ct|
+ ct.nom = row[headers.index 'nom_contact']
+ ct.fixe = row[headers.index 'fixe']
+ ct.portable = row[headers.index 'portable']
+ ct.email = row[headers.index 'email']
+ ct.mémo = row[headers.index 'mémo_contact']
+ end
+
+ @messages << message_import_log(contact)
+ contact.save if contact.valid? && enregistrer
+
# Enfant => classroom nom_enfant prénom date_naissance menuSP menuALL tarif_type badge
- enfant = compte
- .enfants
- .where('UPPER(nom) = ?', row[headers.index 'nom_enfant'].strip.upcase)
- .where('UPPER(prénom) = ?', row[headers.index 'prénom'].strip.upcase)
- .first_or_initialize do |e|
- e.nom = row[headers.index 'nom_enfant']
- e.prénom = row[headers.index 'prénom']
- e.classroom = organisation
- .classrooms
- .where(nom: row[headers.index 'classe'])
- .first_or_create do |classe|
- classe.nom = row[headers.index 'classe']
- end
- e.date_naissance = row[headers.index 'date_naissance']
- e.menuSP = (row[headers.index 'menuSP'].strip.upcase == 'OUI')
- e.menuALL = (row[headers.index 'menuALL'].strip.upcase == 'OUI')
- e.tarif_type = organisation.tarif_types.find_by(nom: row[headers.index 'tarif_type'])
- e.badge = row[headers.index 'badge']
- end
-
- if enfant.valid?
- @messages << "ENFANT #{enfant.new_record? ? 'NOUVEAU' : 'MAJ'} => id:#{enfant.id} changements:#{enfant.changes}"
- enfant.save if params[:enregistrer] == '1'
- else
- @messages << " || ERREURS: " + enfant.errors.messages.map{|m| "#{m.first} => #{m.last}"}.join(',')
- end
-
- # Réservations
- # prestation_type début fin lundi mardi mercredi jeudi vendredi matin midi soir active hors_période_scolaire
- reservation = enfant
- .reservations
- .where(prestation_type: PrestationType.find_by(nom: row[headers.index 'prestation_type']))
- .where(début: row[headers.index 'début'])
- .where(fin: row[headers.index 'fin'])
- .first_or_initialize do |r|
- r.prestation_type = PrestationType.find_by(nom: row[headers.index 'prestation_type'])
- r.début = row[headers.index 'début']
- r.fin = row[headers.index 'fin']
- r.lundi = row[headers.index 'lundi']
- r.mardi = row[headers.index 'mardi']
- r.mercredi = row[headers.index 'mercredi']
- r.jeudi = row[headers.index 'jeudi']
- r.vendredi = row[headers.index 'vendredi']
- r.matin = (row[headers.index 'matin'].strip.upcase == 'OUI')
- r.midi = (row[headers.index 'midi'].strip.upcase == 'OUI')
- r.soir = (row[headers.index 'soir'].strip.upcase == 'OUI')
- r.active = (row[headers.index 'active'].strip.upcase == 'OUI')
- r.hors_période_scolaire = (row[headers.index 'hors_période_scolaire'].strip.upcase == 'OUI')
- end
-
- if reservation.valid?
- @messages << "RESERVATION #{reservation.new_record? ? 'NOUVEAU' : 'MAJ'} => id:#{reservation.id} changements:#{reservation.changes}"
- reservation.save if params[:enregistrer] == '1'
- else
- @messages << " || ERREURS: " + reservation.errors.messages.map{|m| "#{m.first} => #{m.last}"}.join(',')
- end
-
- enfant.valid? ? @importes += 1 : @errors += 1
-
- puts @messages
- end
+ enfant = compte
+ .enfants
+ .where('UPPER(nom) = ?', row[headers.index 'nom_enfant'].strip.upcase)
+ .where('UPPER(prénom) = ?', row[headers.index 'prénom'].strip.upcase)
+ .first_or_initialize do |e|
+ e.nom = row[headers.index 'nom_enfant']
+ e.prénom = row[headers.index 'prénom']
+ e.classroom = organisation
+ .classrooms
+ .where(nom: row[headers.index 'classe'])
+ .first_or_create do |classe|
+ classe.nom = row[headers.index 'classe']
+ end
+ e.date_naissance = row[headers.index 'date_naissance']
+ e.menuSP = (row[headers.index 'menuSP'].strip.upcase == 'OUI')
+ e.menuALL = (row[headers.index 'menuALL'].strip.upcase == 'OUI')
+ e.tarif_type = organisation.tarif_types.find_by(nom: row[headers.index 'tarif_type'])
+ e.badge = row[headers.index 'badge']
+ end
+
+ @messages << message_import_log(enfant)
+ enfant.save if enfant.valid? && enregistrer
+
+ # Réservations
+ # prestation_type début fin lundi mardi mercredi jeudi vendredi matin midi soir active hors_période_scolaire
+ reservation = enfant
+ .reservations
+ .where(prestation_type: PrestationType.find_by(nom: row[headers.index 'prestation_type']))
+ .where(début: row[headers.index 'début'])
+ .where(fin: row[headers.index 'fin'])
+ .first_or_initialize do |r|
+ r.prestation_type = PrestationType.find_by(nom: row[headers.index 'prestation_type'])
+ r.début = row[headers.index 'début']
+ r.fin = row[headers.index 'fin']
+ r.lundi = row[headers.index 'lundi']
+ r.mardi = row[headers.index 'mardi']
+ r.mercredi = row[headers.index 'mercredi']
+ r.jeudi = row[headers.index 'jeudi']
+ r.vendredi = row[headers.index 'vendredi']
+ r.matin = (row[headers.index 'matin'].strip.upcase == 'OUI')
+ r.midi = (row[headers.index 'midi'].strip.upcase == 'OUI')
+ r.soir = (row[headers.index 'soir'].strip.upcase == 'OUI')
+ r.active = (row[headers.index 'active'].strip.upcase == 'OUI')
+ r.hors_période_scolaire = (row[headers.index 'hors_période_scolaire'].strip.upcase == 'OUI')
+ end
- if @errors > 0
- puts "ERREUR ! #{@errors} lignes rejetées !"
- end
- end
+ @messages << message_import_log(reservation)
+ reservation.save if reservation.valid? && enregistrer
+
+ (structure.valid? && compte.valid? && contact.valid? && enfant.valid? && reservation.valid?) ? @importes += 1 : @errors += 1
+
+ puts @messages
+ end
+
+ if @errors > 0
+ puts "ERREUR ! #{@errors} lignes rejetées !"
+ end
end
def exemple_fichier_import_xls
send_file ("public/openCantine5-Exemple_de_fichier_import.xls")
end
+
+private
+ def message_import_log(model)
+ if model.valid?
+ "#{model.class.name.upcase} #{model.new_record? ? 'NOUVEAU' : 'MAJ'} => id:#{model.id} changements:#{model.changes}"
+ else
+ " !! ERREURS: " + model.errors.messages.map{|m| "#{m.first} => #{m.last}"}.join(',')
+ end
+ end
end