# Ecriture et execution de script

Afin d'être exécuté de manière correcte, il est préférable que les scripts soient écrits dans des fichiers (.rb) afin d'être joué en étant importé depuis une console rails.

## Execution de script

Exemple d'exécution d'un script avec le contenu suivant :
```ruby
# script_v1.rb

puts 'Hello world !'
```

Se connecter sur la machine cible et effectuer les actions suivantes :
```shell
su - webapp                           # Si pas connecté avec l'utilisateur wepapp
cd /opt/plugandwork/apps/rce/current  # Pour se déplacer dans le répertoire de l'application
nano script_v1.rb                     # Pour créer un fichier nommé script_v1.rb
CTRL-V                                # Pour copier le contenu du script
CTRL+X                                # Pour quitter nano
y                                     # Pour sauvegarder
ENTER                                 # Pour valider et revenir en ligne de commande
bundle exec rails c -e production     # Pour lancer une console rails
require_relative './script_v1'        # Pour executer le script

Hello world !
```

## Récupération des logs
### Chemin
Par défaut, les logs de sortie des scripts seront écrits dans le répertoire de l'application rails soit `'/opt/plugandwork/apps/rce/current'` S'il est nécessaire d'écrire le fichier log dans un autre répertoire, veuillez modifier la variable `FILE_PATH` dans le script afin d'indiquer le chemin souhaité (ex `FILE_PATH = "/home/logs"`).
### Fichier

Exemple pour un script nommé `script_1234_v1.rb` executé en recette le 25 nov 2020 à 14h22, le fichier de sorite sortie sera `REC-2020-11-25-14:22-script_1234_v1.csv`

## Ecriture de script
Afin de suivre les règles et conventions de nommages, merci de bien vouloir écrire les scripts à partir du template suivante :

```ruby
raise 'You need to load this script througth a require' unless __FILE__
# Replace following variables if need
FILE_TYPE = 'csv'
FILE_PATH = "."

def file_log(file, line)
  file << line
  puts line.join('; ')
end 

def run_script(skip)
  start_time = Time.now
  formated_t = start_time.strftime('%Y-%m-%d-%H:%M')
  puts "Start script at #{start_time}"
  file_name   = "#{HERMES_CONFIG['environment']}-#{formated_t}-#{__FILE__.split('/').last.gsub('.rb', ".#{FILE_TYPE}")}"
  file_class  = FILE_TYPE == 'csv' ? CSV : File
  file        = file_class.open("#{FILE_PATH}/#{file_name}", 'ab', {:col_sep => ";"})
  ##############################################################################
  ##################################__SCRIPT__##################################
  # write the content of the script bellow
  r = Hermes::HousingRequest.where(
    is_active: true, 
    :reference_tax_revenues.ne => nil, 
    :monthly_revenues.ne => nil, 
    :request_status.ne => 'SATISFAITE'
  )
  count = r.count

  r.skip(skip).batch_size(5).no_timeout.each_with_index do |hr, i|
    begin
      puts "#{i+1+skip}/#{count}"

      old_eligibility = hr.main_applicant.eligibility_query
      hr.update_applicant_eligbility # ligne à commenter pour mode sans modification

      line = [
        hr.id,  
        hr.als_id,
        hr.unique_numbers.last,
        hr.request_status,
        hr.reference_tax_revenues,
        hr.monthly_revenues,
        hr.main_applicant_id,
        old_eligibility,
        hr.main_applicant.reload.eligibility_query
      ]
      
      file_log(file, line)
    rescue Exception => e
      line = [app.id, "Erreur de traitement: #{e}\n"]
      file_log(file, line)
    end
  end

  ##############################################################################
  ##############################################################################
  file.close
  stop_time = Time.now
  puts "Start end at #{stop_time}"
  puts "Executed in #{(stop_time - start_time).seconds}"
  puts "Filename: #{file_name}"
end
run_script(0)
```

Exemple de script qui parcours un CSV

```ruby

  table = CSV.parse(File.read("entry_file.csv"), headers: true, col_sep:  ";" )
  count = table.length  

  table.each_with_index do |row, i|
    begin
      puts "#{i+1+skip}/#{count}"
      
      # ...

      file_log(file, line)
    rescue Exception => e
      line = [row['id'], "Erreur de traitement: #{e}\n"]
      file_log(file, line)
    end
  end
```