diff options
32 files changed, 1408 insertions, 156 deletions
diff --git a/app/assets/stylesheets/main/validations.css.scss b/app/assets/stylesheets/main/validations.css.scss new file mode 100644 index 000000000..6fea56818 --- /dev/null +++ b/app/assets/stylesheets/main/validations.css.scss @@ -0,0 +1,200 @@ +#workspace.validations.index +{ +} + +#workspace.validations.show { + + .status { + margin-left: 10px; + } + + .status_failed { color: #a94442;} + .status_pending { color: #31708f;} + .status_processing { color: #31708f;} + .status_completed { color: #3c763d;} + + .links{ + margin: 0px 0 20px 0; + + img{ margin: 0 5px 0 15px; } + } + + .order{ + margin-bottom: 10px; + padding: 5px; + border-top: 1px solid #e4e4e4; + border-bottom: 1px solid #e4e4e4; + } + + .status_ok_error { color: #8fc861; } + .status_nok_error { color: #e22b1b; } + .status_na_error { color: #898e7f; } + + .status_ok_warning { color: #8fc861; } + .status_nok_warning { color: #ffbd2b; } + .status_na_warning { color: #898e7f; } + + .resume { + &:after{ + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + + .col1 { + float: left; + width: 45%; + } + + .col2 { + margin-left: 10px; + float: left; + width: 45%; + } + + .graph { height: 200px; } + + .caption { + text-align :center; + font-weight: bold; + } + } + + .report{ + .table { margin-top: 20px; } + + } + + .severity__improvment, .severity_warning, .severity_error { + border: 1px solid; + margin: 10px 0px; + padding:10px 10px 10px 10px; + background-repeat: no-repeat; + background-position: 10px center;-moz-border-radius:.5em; + -webkit-border-radius:.5em; + border-radius:.5em; + height: 100%; + + &:after{ + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + + .status_icon { + float: left; + width: 20%; + height: auto; + + img { + vertical-align: middle; + width: 48px; + height: 48px; + } + } + + .status_text{ + float: left; + width: 70%; + + .code{ + font-size: 12px; + font-weight: bold; + } + + .severity { + font-size: 10px; + } + + .explanation{ + display: none; + font-size: 12px; + margin: 5px 0 0 0; + } + + .attributes{ + font-size: 10px; + font-weight: bold; + margin: 5px 0 0px 0; + } + } + + } + + .severity_improvment { + color: black; + background-color: #c5cf4c; + } + + .severity_warning { + color: black; + background-color: #f1dd30; + } + + .severity_error { + color: black; + background-color: #ff9a0c; + } + + .td_error { + width: 30%; + + .title_error i { margin-right: 5px; } + + div.details_error{ + margin: 0px 0px 0px 3px !important; + display: none; + + p.detail_error{ + margin: 0px 0px 5px 0px !important; + } + + .file_error{ + margin-left: 26px; + font-size: 10px; + color: #898e7f; + } + } + } +} + +#workspace.validations.new, #workspace.validations.create +{ + padding: 0; + margin-top: -0.3em; + margin-bottom: 1em; + + + + .inputs ol { + margin-top: -0.3em; + margin-bottom: 1em; + padding: 0; + width: 100%; + } + .inputs ol li { padding : 0.3em 0; } + + .inputs ol li textarea { + width: 54%; + } + .inputs ol li label { + width: 40%; + margin-top: -0.3em; + } + + .inputs ol li.fl label { width: 40%; margin-top: -0.3em; } + .inputs ol li.fl input { width: 21%; padding: 0; } + + .inputs ol li.fl1 {float: left; width: 70% ;} + .inputs ol li.fl1 label {width: 57%; margin-top: -0.3em; } + .inputs ol li.fl1 input { width: 30%; } + + .inputs ol li.fl2 {float: left; width: 25% ;} + .inputs ol li.fl2 label {width: 10%; margin-top: -0.3em;} + .inputs ol li.fl2 input { width: 85%; } + +} diff --git a/app/controllers/compliance_check_controller.rb b/app/controllers/compliance_check_controller.rb deleted file mode 100644 index e69de29bb..000000000 --- a/app/controllers/compliance_check_controller.rb +++ /dev/null diff --git a/app/controllers/compliance_checks_controller.rb b/app/controllers/compliance_checks_controller.rb deleted file mode 100644 index e69de29bb..000000000 --- a/app/controllers/compliance_checks_controller.rb +++ /dev/null diff --git a/app/controllers/validation_results_controller.rb b/app/controllers/validation_results_controller.rb new file mode 100644 index 000000000..dde9bcbd2 --- /dev/null +++ b/app/controllers/validation_results_controller.rb @@ -0,0 +1,35 @@ +class ValidationResultsController < ChouetteController + + defaults :resource_class => ValidationReport + + respond_to :json + respond_to :js, :only => :index + + def index + index! do |format| + format.html { render :layout => false } + end + end + + protected + + def validation_service + ValidationService.new(@referential) + end + + def validation + @validation ||= validation_service.find( params[:validation_id] ) + end + + def validation_report + @validation_report ||= validation.report + end + + def collection + @validation_results ||= validation_report.all(params[:status], params[:severity]) #.paginate(:page => params[:page]) + end + + def rule_parameter_set + @rule_parameter_set = RuleParameterSet.new.tap { |rps| rps.parameters = resource.parameter_set } + end +end diff --git a/app/controllers/validations_controller.rb b/app/controllers/validations_controller.rb index e07a51f7f..f25e8763b 100644 --- a/app/controllers/validations_controller.rb +++ b/app/controllers/validations_controller.rb @@ -72,9 +72,17 @@ class ValidationsController < ChouetteController redirect_to referential_path(@referential) end end + + def export + respond_to do |format| + format.zip { send_file ValidationExport.new(resource, @referential.id, request).export, :type => :zip } + end + end protected + alias_method :validation, :resource + def validation_service ValidationService.new(@referential) end @@ -84,7 +92,7 @@ class ValidationsController < ChouetteController end def resource - @validation ||= validation_service.find( params[:id] ) + @validation ||= validation_service.find(params[:id] ) end def collection diff --git a/app/helpers/validation_results_helper.rb b/app/helpers/validation_results_helper.rb new file mode 100644 index 000000000..c225039a2 --- /dev/null +++ b/app/helpers/validation_results_helper.rb @@ -0,0 +1,71 @@ +module ValidationResultsHelper + + def status_icon( validation_result_result, validation_result_severity ) + if validation_result_result == "UNCHECK" + ("<i class='fa fa-ban status_na_" + validation_result_severity.downcase + "'></i>").html_safe + elsif validation_result_result == "OK" + ("<i class='fa fa-check status_ok_" + validation_result_severity.downcase + "'></i>").html_safe + else + ("<i class='fa fa-times status_nok_" + validation_result_severity.downcase + "'></i>").html_safe + end + end + + def test_definition (validation_result_code) + Rails.application.config.validation_spec + I18n.locale.to_s + "/" + validation_result_code +".html" + end + + def object_url (referential_id, error) + location = "/referentials/" + referential_id.to_s + if error[:source].object_path.kind_of?(Array) + error[:source].object_path.reverse.each { |sub_path| location = location + "/" + sub_path["type"].to_s.pluralize + "/" + sub_path["id"].to_s } + else + location = location + "/" + error[:source].object_path.type.to_s + "s/" + error[:source].object_path.id.to_s + end + return location + end + + def object_labels_hash (error) + ### THE error HASH STRUCTURE + # 1. error[:source] + # 0..1 file + # 1 filename + # 0..1 line_number + # 0..1 column_number + # 0..1 objectid + # 0..1 label + # 0.. object_path + # 1 type + # 1 id + # 0.. error[:target] + # 0..1 error[:error_value] + # 0..1 error[:reference_value] + object_labels_hash = Hash.new + object_labels_hash[:source_objectid] = error[:source].objectid if error[:source].objectid.present? + object_labels_hash[:source_label] = error[:source].label if error[:source].label.present? + if error[:source].file.present? + object_labels_hash[:filename] = error[:source].file.filename + object_labels_hash[:line_number] = error[:source].file.line_number if error[:source].file.line_number.present? + object_labels_hash[:column_number] = error[:source].file.column_number if error[:source].file.column_number.present? + end + + if error[:target].present? + if error[:target].kind_of?(Array) + error[:target].each_with_index do |target, index| + object_labels_hash["target_#{index}_objectid".to_sym] = target[:objectid] if target[:objectid] + object_labels_hash["target_#{index}_label".to_sym] = target[:label] if target[:label] + end + else + object_labels_hash[:target_0_objectid] = error[:target][:objectid] if error[:target][:objectid] + object_labels_hash[:target_0_label] = error[:target][:label] if error[:target][:label] + end + end + if error[:error_value].present? + object_labels_hash[:error_value] = error[:error_value] + end + if error[:reference_value].present? + object_labels_hash[:reference_value] = error[:reference_value] + end + return object_labels_hash + end + +end diff --git a/app/models/export.rb b/app/models/export.rb index 5cd0db17e..95317504a 100644 --- a/app/models/export.rb +++ b/app/models/export.rb @@ -1,6 +1,7 @@ class Export extend Enumerize extend ActiveModel::Naming + extend ActiveModel::Translation include ActiveModel::Model attr_reader :datas diff --git a/app/models/export_report.rb b/app/models/export_report.rb index f739bf1a9..a843d8148 100644 --- a/app/models/export_report.rb +++ b/app/models/export_report.rb @@ -1,5 +1,6 @@ class ExportReport extend ActiveModel::Naming + extend ActiveModel::Translation include ActiveModel::Model attr_reader :datas, :errors, :metadatas diff --git a/app/models/import.rb b/app/models/import.rb index 9629881d3..f596fe82a 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -1,6 +1,7 @@ class Import extend Enumerize extend ActiveModel::Naming + extend ActiveModel::Translation include ActiveModel::Model # enumerize :status, in: %w{started scheduled terminated canceled aborted}, default: "created", predicates: true @@ -10,6 +11,7 @@ class Import def initialize( response ) @datas = response + Validation.new(response) # @status = @datas.status.downcase if @datas.status? # @format = @datas.type.downcase if @datas.type? end diff --git a/app/models/import_report.rb b/app/models/import_report.rb index fff209e8e..803460fb8 100644 --- a/app/models/import_report.rb +++ b/app/models/import_report.rb @@ -1,5 +1,6 @@ class ImportReport extend ActiveModel::Naming + extend ActiveModel::Translation include ActiveModel::Model attr_reader :datas diff --git a/app/models/import_task.rb b/app/models/import_task.rb index d53c04766..dc1ab1ba7 100644 --- a/app/models/import_task.rb +++ b/app/models/import_task.rb @@ -3,6 +3,7 @@ require "zip" class ImportTask extend Enumerize extend ActiveModel::Naming + extend ActiveModel::Translation include ActiveModel::Validations include ActiveModel::Conversion diff --git a/app/models/validation.rb b/app/models/validation.rb index d674c79dc..d97d854cc 100644 --- a/app/models/validation.rb +++ b/app/models/validation.rb @@ -1,29 +1,50 @@ class Validation extend Enumerize extend ActiveModel::Naming + extend ActiveModel::Translation include ActiveModel::Model # enumerize :status, in: %w{created scheduled terminated canceled aborted}, default: "created", predicates: true # enumerize :format, in: %w{neptune netex gtfs}, default: "neptune", predicates: true attr_reader :datas - - def initialize( response ) + + def initialize(response) @datas = response - # @status = @datas.status.downcase if @datas.status? - # @format = @datas.type.downcase if @datas.type? end def report - report_path = datas.links.select{ |link| link["rel"] == "action_report"}.first.href + report_path = datas.links.select{ |link| link["rel"] == "validation_report"}.first.href if report_path response = Ievkit.get(report_path) ValidationReport.new(response) else raise Ievkit::IevError("Impossible to access report path link for validation") end - end + end + + def import + if datas.action == "importer" + Import.new(Ievkit.scheduled_job(referential_name, id, { :action => "importer" }) ) + end + end + + def export + if datas.action == "exporter" + Export.new(Ievkit.scheduled_job(referential_name, id, { :action => "exporter" }) ) + end + end + def rule_parameter_set + rule_parameter_set = datas.links.select{ |link| link["rel"] == "validation_params"}.first.href + if rule_parameter_set + response = Ievkit.get(rule_parameter_set) + rule_parameter_set = RuleParameterSet.new.tap { |rps| rps.parameters = response.validation } + else + raise Ievkit::Error("Impossible to access rule parameter set link for validation") + end + end + def compliance_check compliance_check_path = datas.links.select{ |link| link["rel"] == "validation_report"}.first.href if compliance_check_path @@ -57,7 +78,23 @@ class Validation end def status - datas.status + # pending processing completed failed + # CREATED, SCHEDULED, STARTED, TERMINATED, CANCELED, ABORTED, DELETED + if datas.status == "CREATED" + "pending" + elsif datas.status == "SCHEDULED" + "pending" + elsif datas.status == "STARTED" + "processing" + elsif datas.status == "TERMINATED" + "completed" + elsif datas.status == "CANCELED" + "failed" + elsif datas.status == "ABORTED" + "failed" + elsif datas.status == "DELETED" + "failed" + end end def format @@ -81,6 +118,10 @@ class Validation 20 end end + + def referential_id + Referential.where(:slug => referential_name).id + end def referential_name datas.referential diff --git a/app/models/validation_export.rb b/app/models/validation_export.rb new file mode 100644 index 000000000..86ff2c477 --- /dev/null +++ b/app/models/validation_export.rb @@ -0,0 +1,54 @@ +require 'tempfile' + +class ValidationExport + include ERB::Util + include ValidationResultsHelper + + require 'zip' + + attr_accessor :template, :detailed_errors_template, :request + attr_reader :validation + + def initialize(validation, referential_id, request) + @request = request + @validation = validation + @referential_id = referential_id + @template = File.open('app/views/validations/summary_errors_index.csv.erb' ) { |f| f.read } + @detailed_errors_template = File.open('app/views/validations/detailed_errors_index.csv.erb' ) { |f| f.read } + end + + def export + begin + Dir.mktmpdir("#{I18n.t('validation_results.file.zip_name_prefix')}_#{@referential_id}_#{@validation.id}_", Dir.tmpdir) { |temp_dir| + + File.open(temp_dir + "/#{I18n.t('validation_results.file.summary_errors_file_prefix')}" , "a") do |f| + f.write(render) + f.flush + end + + File.open(temp_dir + "/#{I18n.t('validation_results.file.detailed_errors_file_prefix')}" , "a") do |f| + f.write(detailed_errors_render) + f.flush + end + + zip_file = Tempfile.new(["#{I18n.t('validation_results.file.zip_name_prefix')}_#{@referential_id}_#{@validation.id}_", ".zip"]) + + ::Zip::File.open(zip_file.path, ::Zip::File::CREATE) do |zipfile| + Dir[File.join(temp_dir, '*.csv')].each do |f| + zipfile.add(File.basename(f), f) + end + end + return zip_file + } + end + end + + def render() + ERB.new(@template).result(binding) + end + + def detailed_errors_render() + ERB.new(@detailed_errors_template).result(binding) + end + +end diff --git a/app/models/validation_report.rb b/app/models/validation_report.rb index 6c98776cd..7f9b8366d 100644 --- a/app/models/validation_report.rb +++ b/app/models/validation_report.rb @@ -1,111 +1,64 @@ class ValidationReport extend ActiveModel::Naming + extend ActiveModel::Translation include ActiveModel::Model attr_reader :datas - def initialize( response ) - @datas = response[:action_report] + def initialize(response) + @datas = response[:validation_report].tests.sort_by { |hash| [ hash[:severity], hash[:result], hash[:test_id]] } end - def zip_file - datas.zip_file - end - - def error_files - datas.files.select{ |file| file[:status] == "ERROR"} - end - - def ignored_files - datas.files.select{ |file| file[:status] == "IGNORED"} - end - - def ok_files - datas.files.select{ |file| file[:status] == "OK"} - end - - def files - datas.files - end - - def line_items - [].tap do |line_items| - datas.lines.each do |line| - line_items << LineItem.new(line) - end - end - end - - def lines - datas.stats.line_count if datas.stats.line_count? + def ok_error + @datas.select { |test| (test[:result] == "OK" && test[:severity] == "ERROR") } end - def routes - datas.stats.route_count if datas.stats.route_count? + def nok_error + @datas.select { |test| (test[:result] == "NOK" && test[:severity] == "ERROR")} end - def connection_links - datas.stats.connection_link_count if datas.stats.connection_link_count? + def na_error + @datas.select { |test| (test[:result] == "UNCHECK" && test[:severity] == "ERROR")} end - - def time_tables - datas.stats.time_table_count if datas.stats.time_table_count? - end - - def stop_areas - datas.stats.stop_area_count if datas.stats.stop_area_count? + + def ok_warning + @datas.select { |test| (test[:result] == "OK" && test[:severity] == "WARNING")} end - def access_points - datas.stats.access_point_count if datas.stats.access_point_count? + def nok_warning + @datas.select { |test| (test[:result] == "NOK" && test[:severity] == "WARNING")} end - def vehicle_journeys - datas.stats.vehicle_journey_count if datas.stats.vehicle_journey_count? + def na_warning + @datas.select { |test| (test[:result] == "UNCHECK" && test[:severity] == "WARNING")} end - def journey_patterns - datas.stats.journey_pattern_count if datas.stats.journey_pattern_count? + def mandatory_tests + @datas.select { |test| test[:severity] == "ERROR"} end - - class LineItem - attr_reader :name, :status, :stats - - def initialize( options = Hashie::Mash.new ) - @name = options.name if options.name? - @status = options.status if options.status? - @stats = options.stats if options.stats? - end - - def routes - stats.route_count - end - def connection_links - stats.connection_link_count - end + def optional_tests + @datas.select { |test| test[:severity] == "WARNING"} + end - def time_tables - stats.time_table_count - end + def ok_tests + @datas.select { |test| test[:result] == "OK"} + end - def stop_areas - stats.stop_area_count - end + def nok_tests + @datas.select { |test| test[:result] == "NOK"} + end - def access_points - stats.access_point_count - end - - def vehicle_journeys - stats.vehicle_journey_count - end + def uncheck_tests + @datas.select { |test| test[:result] == "UNCHECK"} + end - def journey_patterns - stats.journey_pattern_count - end + def all(status, severity) + @datas.select { |test| ( test[:result] == status && test[:severity] == severity ) } + end + def validation_results + return @datas end end - diff --git a/app/views/compliance_check_tasks/show.html.erb b/app/views/compliance_check_tasks/show.html.erb index d41e0da1d..a59844378 100644 --- a/app/views/compliance_check_tasks/show.html.erb +++ b/app/views/compliance_check_tasks/show.html.erb @@ -30,7 +30,7 @@ </div> </div> <div class="order" style="display: none;"> - Filtre : <%= select_tag "order", ("<option value='severity'>" + ComplianceCheckResult.human_attribute_name(:severity) +"</option><option value='status'>" + ComplianceCheckResult.human_attribute_name(:status) + "</option>").html_safe, :include_blank => false %> + Filtre : <!-- %= select_tag "order", ("<option value='severity'>" + ComplianceCheckResult.human_attribute_name(:severity) +"</option><option value='status'>" + ComplianceCheckResult.human_attribute_name(:status) + "</option>").html_safe, :include_blank => false % --> </div> <div class="report"></div> diff --git a/app/views/exports/_export.erb b/app/views/exports/_export.erb index 1477c63bc..c5d8b7002 100644 --- a/app/views/exports/_export.erb +++ b/app/views/exports/_export.erb @@ -2,7 +2,9 @@ <div class="panel-heading"> <div class="panel-title clearfix"> <span class="pull-right"> - <% location = export.datas.links.select { |link| link["rel"] == "location" }.first.href %> + <% location = export.datas.links.select { |link| link["rel"] == "location" } %> + <% location = location.first if location %> + <% location = location.href if location %> <%= link_to "#{location}", :method => :delete, :data => {:confirm => t('exports.actions.destroy_confirm')}, :class => "btn btn-danger btn-sm" do %> <span class="fa fa-trash-o"></span> <% end %> diff --git a/app/views/imports/_import.erb b/app/views/imports/_import.erb index 8245e23e3..14e29cb32 100644 --- a/app/views/imports/_import.erb +++ b/app/views/imports/_import.erb @@ -2,7 +2,9 @@ <div class="panel-heading"> <div class="panel-title clearfix"> <span class="pull-right"> - <% location = import.datas.links.select { |link| link["rel"] == "location" }.first.href %> + <% location = import.datas.links.select { |link| link["rel"] == "location" } %> + <% location = location.first if location %> + <% location = location.href if location %> <%= link_to referential_import_path(@referential, import.id), :method => :delete, :data => {:confirm => t('import_tasks.actions.destroy_confirm')}, :class => "btn btn-danger btn-sm" do %> <span class="fa fa-trash-o"></span> <% end %> diff --git a/app/views/shared/_header.erb b/app/views/shared/_header.erb index d90117859..1d8b3ca66 100644 --- a/app/views/shared/_header.erb +++ b/app/views/shared/_header.erb @@ -69,7 +69,7 @@ </li> <li><%= link_to Referential.human_attribute_name("imports"), referential_imports_path(@referential) %></li> <li><%= link_to Referential.human_attribute_name("export_tasks"), referential_exports_path(@referential) %></li> - <li><%= link_to Referential.human_attribute_name("compliance_check_tasks"), referential_compliance_check_tasks_path(@referential) %></li> + <li><%= link_to Referential.human_attribute_name("validations"), referential_validations_path(@referential) %></li> <% end %> </ul> <ul class="nav navbar-nav navbar-right"> diff --git a/app/views/validation_results/_validation_result.erb b/app/views/validation_results/_validation_result.erb new file mode 100644 index 000000000..43baf0a0e --- /dev/null +++ b/app/views/validation_results/_validation_result.erb @@ -0,0 +1,21 @@ + <div class="severity_<%= validation_result.severity %> status_<%= validation_result.status %>"> + <div class="status_icon"> + <%= image_tag "icons/status_#{validation_result.status}.png", :class => "status" %> + </div> + <div class="status_text"> + <div class="code"> + <%= validation_result.rule_code %> + </div> + <div class="severity"> + [ <%= ValidationReport.human_attribute_name(:severity) %> : <%= t validation_result.severity, :scope => "validation_result.severities" %> ] + </div> + <div class="explanation"> + <%= ValidationReport.human_attribute_name(validation_result.rule_code) %> + </div> + <div class="attributes"> + <% if validation_result.violation_count > 0 %> + <%= ValidationReport.human_attribute_name(:violation_count) %> : + <% end %> + </div> + </div> +</div> diff --git a/app/views/validation_results/index.html.erb b/app/views/validation_results/index.html.erb new file mode 100644 index 000000000..c93f8f2bd --- /dev/null +++ b/app/views/validation_results/index.html.erb @@ -0,0 +1,75 @@ +<table class="table table-hover"> + <thead> + <tr> + <th>#</th> + <th><%= t("activemodel.attributes.validation_result.status") %></th> + <th><%= t("activemodel.attributes.validation_result.severity") %></th> + <th><%= t("activemodel.attributes.validation_result.rule_code") %></th> + <% if @validation_results && @validation_results.first.result == "NOK" %> + <th><%= t("activemodel.attributes.validation_result.detail") %></th> + <% end %> + </tr> + </thead> + <tbody> + <% @validation_results.each_with_index do |validation_result, index| %> + <tr> + <td><%= index + 1 %></td> + <td><%= status_icon( validation_result.result, validation_result.severity ) %> </td> + <td><%= t("validation_result.severities." + validation_result.severity.downcase + "_txt") %></td> + <td> + <% data_content = t ( "activemodel.attributes.validation_result." + validation_result.test_id ) %> + <% data_title = t ( "activemodel.attributes.validation_result.title" ) %> + <button data-content='<%= data_content %>' data-title='<%= data_title %>' rel="popover" data-toggle="popover" class="notice btn btn-info btn-xs" > + <i class="fa fa-info"></i> + </button> + <%= link_to validation_result.test_id, test_definition(validation_result.test_id), :title => ValidationReport.human_attribute_name(validation_result.test_id), :target => "validation" %> + </td> + <% if @validation_results && @validation_results.first.result == "NOK" %> + <td class="td_error"> + <% if validation_result.errors.present? %> + <span class="title_error"> + <i class="fa fa-plus-square"></i> + <%= validation_result.error_count.to_s + " " + ValidationReport.human_attribute_name("validation_result.violation_count") %> + </span> + <div class="details_error"> + <% validation_result.errors.first(10).each do |error| %> + <p class="detail_error"> + <% if error[:source].objectid %> + <!-- % data_content_1 = ValidationReport.human_attribute_name(validation_result.test_id) + t("validation_result.details." + error[:error_id]) % --> <!--, error[:source].objectid ) % --> + <% data_content_1 = t("activemodel.attributes.validation_result." + validation_result.test_id) + ". " + + t("validation_result.details.detail_" + error[:error_id], object_labels_hash(error) ) %> + <% data_title_1 = t("activemodel.attributes.validation_result.detail") %> + |- <button data-content='<%= data_content_1 %>' data-title='<%= data_title_1 %>' data-toggle="popover" class="notice btn btn-info btn-xs"><i class="fa fa-info"></i></button> + <% else %> + <!-- % data_content_2 = ValidationReport.human_attribute_name(validation_result.test_id) + t("validation_result.detailss." + error[:error_id] ) % --> + <% data_content_2 = ValidationReport.human_attribute_name(validation_result.test_id) + t("validation_result.details." + error[:error_id] ) %> + <% data_title_2 = t("activemodel.attributes.validation_result.detail") %> + |- <button data-content='<%= data_content_2 %>' data-title='<%= data_title_2 %>' data-toggle="popover" class="notice btn btn-info btn-xs"><i class="fa fa-info"></i></button> + <% end %> + <% if error[:source].object_path.present? %> + <%= link_to error[:source].label, object_url(@referential.id, error) %> + <% end %> + <!-- %= link_to error["objectId"], referential_path(@referential) + "/" + error["location"]["url"] % --> + <!-- % elsif error["location"]["filename"].present? % --> + <!-- %= error["objectId"] % --><br> + <span class="file_error"> + <%= error[:source].objectid %> + <!-- %= File.basename(error["location"]["filename"]) % --> + <!-- %= t("validation_results.index.column") % -->: + <!-- %= error["location"]["columnNumber"] % -->, + <!-- %= t("validation_results.index.line") % -->: + <!-- %= error["location"]["lineNumber"] % --> + </span> + <!-- % end % --> + </p> + <% end %> + </div> + <% end %> + </td> + <% end %> + </tr> + <% end %> + </tbody> +</table> +<%= javascript_include_tag referential_validation_validation_results_path(@referential, @validation.id, :format => :js) %> + diff --git a/app/views/validation_results/index.js.coffee b/app/views/validation_results/index.js.coffee new file mode 100644 index 000000000..10821a031 --- /dev/null +++ b/app/views/validation_results/index.js.coffee @@ -0,0 +1,8 @@ +jQuery -> + $(".notice").popover({ container: "body", html: false, trigger: "focus", placement: "bottom" }) + + # Hide and show error details + $(".title_error").each -> + $( this ).click -> + $(this).next(".details_error").toggle() + $(this).children("i").toggleClass("fa-plus-square fa-minus-square")
\ No newline at end of file diff --git a/app/views/validations/_validation.erb b/app/views/validations/_validation.erb index d288c8b7e..85e1b3101 100644 --- a/app/views/validations/_validation.erb +++ b/app/views/validations/_validation.erb @@ -2,7 +2,9 @@ <div class="panel-heading"> <div class="panel-title clearfix"> <span class="pull-right"> - <% location = validation.datas.links.select { |link| link["rel"] == "location" }.first.href %> + <% location = validation.datas.links.select { |link| link["rel"] == "location" } %> + <% location = location.first if location %> + <% location = location.href if location %> <%= link_to "#{location}", :method => :delete, :data => {:confirm => t('validation_tasks.actions.destroy_confirm')}, :class => "btn btn-danger btn-sm" do %> <span class="fa fa-trash-o"></span> <% end %> diff --git a/app/views/validations/detailed_errors_index.csv.erb b/app/views/validations/detailed_errors_index.csv.erb new file mode 100644 index 000000000..3c727f9a4 --- /dev/null +++ b/app/views/validations/detailed_errors_index.csv.erb @@ -0,0 +1,2 @@ +<%= I18n.t("activemodel.attributes.validation_result.severity") %>;<%= I18n.t("activemodel.attributes.validation_result.rule_code") %>;<%= I18n.t("activemodel.attributes.validation_result.object") %>;<%= I18n.t("activemodel.attributes.validation_result.resource") %>;<%= I18n.t("activemodel.attributes.validation_result.title") %>;<%= I18n.t("activemodel.attributes.validation_result.detail") %> +<% @validation.report.validation_results.each do |r| %><% if r.errors.present? %><% r.errors.first(10).each do |error| %><% case r.severity %><% when "WARNING" %><%= I18n.t "validation_result.severities.warning_txt" %><% when "ERROR" %><%= I18n.t "validation_result.severities.error_txt" %><% end %>;<%= r.test_id %>;<% if error["source"].present? %><%= error["source"]["objectid"] if error["source"]["objectid"].present? %>;<% if error["source"]["object_path"].present? %><%= object_url(@referential_id, error) %><% elsif error["source"]["file"].present? %><%= File.basename(error["source"]["file"]["filename"]) +" - " %><%= I18n.t "validation_results.index.column" %>:<%= error["source"]["file"]["column_number"] %>,<%= I18n.t "validation_results.index.line" %>:<%= error["source"]["file"]["line_number"] %><% end %>;<% else %>;;<% end %><%= I18n.t("activemodel.attributes.validation_result."+r.test_id) %>;<%= I18n.t("validation_result.details.detail_" + error["error_id"], object_labels_hash(error) )%><%= "\n" %><% end %><% end %><% end %>
\ No newline at end of file diff --git a/app/views/validations/show.html.erb b/app/views/validations/show.html.erb index b7b655850..d0537c81b 100644 --- a/app/views/validations/show.html.erb +++ b/app/views/validations/show.html.erb @@ -1,15 +1,63 @@ -<div class="test"> - <% title = @validation.no_save ? "": "<i class='fa fa-save'></i>" %> - <%= title_tag "#{title} #{@validation.name} <span class='status status_#{@validation.status}'>#{ t('validations.statuses.'+ @validation.status) }</span>" %> -</div> +<%= title_tag "#{@validation.name} <span class='status status_#{@validation.status}'>#{ t('validations.show.'+@validation.status) }</span>" %> +<% @title = "#{@validation.name}" %> <div class="validation_show"> - <%= render( :partial => "results_dashboard", :locals => { :referential => @referential} ) %> + <div class="links"> + <% if @validation.import %> + <%= link_to image_tag('icons/link_page.png') + t("compliance_check_tasks.import_task"), referential_import_path(@referential, @validation.import) %> + <% elsif @validation.export %> + <%= link_to image_tag('icons/link_page.png') + t("compliance_check_tasks.export_task"), referential_export_path(@referential, @validation.export) %> + <% end %> + <%= link_to image_tag('icons/link_page.png') + t("compliance_check_tasks.rule_parameter_set"), organisation_rule_parameter_set_path(@referential.organisation, @validation.rule_parameter_set) %> + <div class="btn-group pull-right"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + <%= t(".export") %> <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><%= link_to t(".export_csv"), export_referential_validation_path(@referential, @validation.id) %></li> + </ul> + </div> + + <!-- % if @validation.status == 'completed'% --> + <div class="resume"> + <div class="col1"> + <div class="caption"> + <%= t "validation_result.severities.error" %> + </div> + <div class="graph" id="error"> + </div> + </div> + <div class="col2"> + <div class="caption"> + <%= t "validation_result.severities.warning" %> + </div> + <div class="graph" id="warning"> + </div> + </div> + </div> + <div class="order" style="display: none;"> + Filtre : <%= select_tag "order", ("<option value='severity'>" + ComplianceCheckResult.human_attribute_name(:severity) +"</option><option value='status'>" + ComplianceCheckResult.human_attribute_name(:status) + "</option>").html_safe, :include_blank => false %> + </div> + + <div class="report"> + </div> + <!-- % end % --> + <%= javascript_include_tag referential_validation_path(@referential, @validation.id, :format => :js) %> + </div> </div> + +<!-- div class="validation_show" --> + <!-- %= render( :partial => "results_dashboard", :locals => { :referential => @referential} ) % --> +<!-- /div --> + <% content_for :sidebar do %> <ul class="actions"> - <li><%= link_to t('validations.actions.destroy'), referential_validation_path(@referential, @validation.id), :method => :delete, :data => {:confirm => t('validations.actions.destroy_confirm')}, :class => "remove" %></li> + <li> + <% unless (@validation.import || @validation.export) %> + <%= link_to t('validations.actions.destroy'), referential_validation_path(@referential, @validation.id), :method => :delete, :data => {:confirm => t('validations.actions.destroy_confirm')}, :class => "remove" %> + <% end %> + </li> </ul> <%= history_tag(@validation) %> diff --git a/app/views/validations/show.js.coffee b/app/views/validations/show.js.coffee index e74612354..19455f4c7 100644 --- a/app/views/validations/show.js.coffee +++ b/app/views/validations/show.js.coffee @@ -1,45 +1,50 @@ jQuery -> - - get_validation_results = (html_container, html_element) -> - html_container.children().each -> - if( $( this ).is(html_element) ) - $( this ).show() - else - $( this ).hide() + + get_validation_results = (html_container, status, severity) -> + h = new Object() + h["status"] = status if status + h["severity"] = severity if severity + + $.get( + "<%= @validation.id %>/validation_results", + h, + update = (data) -> + html_container.empty() + html_container.append(data) + ) Morris.Donut({ - element: 'files_statistics', + element: 'error', data: [ - {label: "<%= t 'validations.show.graph.files.error' %>", value: <%= @validation.report.error_files.count %> }, - {label: "<%= t 'validations.show.graph.files.ignored' %>", value: <%= @validation.report.ignored_files.count %> }, - {label: "<%= t 'validations.show.graph.files.ok' %>", value: <%= @validation.report.ok_files.count %> } + {label: "<%= t 'nok', :scope => 'validation_result.statuses' %>", value: <%= @validation.report.nok_error.count %>}, + {label: "<%= t 'na', :scope => 'validation_result.statuses' %>", value: <%= @validation.report.na_error.count %>}, + {label: "<%= t 'ok', :scope => 'validation_result.statuses' %>", value: <%= @validation.report.ok_error.count %>} ] colors: [ "#e22b1b", "#898e7f", "#8fc861" ] }).on('click', update = (i, row) -> - switch i - when 0 then get_validation_results( $(".report"), $(".files_error")) - when 1 then get_validation_results( $(".report"), $(".files_ignored")) - when 2 then get_validation_results( $(".report"), $(".files_ok")) - else console.log "Error no other value for donut chart") + switch i + when 0 then get_validation_results( $(".report"), "NOK", "ERROR") + when 1 then get_validation_results( $(".report"), "UNCHECK", "ERROR") + when 2 then get_validation_results( $(".report"), "OK", "ERROR") + else console.log "Error no other value for donut chart") - Morris.Bar({ - element: 'objects_statistics', + Morris.Donut({ + element: 'warning', data: [ - { object: "<%= t("validations.show.graph.lines.lines_stats").html_safe %>", value: <%= @validation.report.lines %> }, - { object: "<%= t("validations.show.graph.lines.routes_stats").html_safe %>", value: <%= @validation.report.routes %> }, - { object: "<%= t("validations.show.graph.lines.connection_links_stats").html_safe %>", value: <%= @validation.report.connection_links %> }, - { object: "<%= t("validations.show.graph.lines.time_tables_stats").html_safe %>", value: <%= @validation.report.time_tables %> }, - { object: "<%= t("validations.show.graph.lines.stop_areas_stats").html_safe %>", value: <%= @validation.report.stop_areas %> }, - { object: "<%= t("validations.show.graph.lines.access_points_stats").html_safe %>", value: <%= @validation.report.access_points %> }, - { object: "<%= t("validations.show.graph.lines.vehicle_journeys_stats").html_safe %>", value: <%= @validation.report.vehicle_journeys %> }, - { object: "<%= t("validations.show.graph.lines.journey_patterns_stats").html_safe %>", value: <%= @validation.report.journey_patterns %> }, - ], - xkey: 'object', - ykeys: ['value'], - labels: ['<%= t "validations.show.graph.lines.objects_label" %>'] - xLabelAngle: 40, - xAxisLabelTopPadding: 7, - padding: 40, - hideHover: true + {label: "<%= t 'nok', :scope => 'validation_result.statuses' %>", value: <%= @validation.report.nok_warning.count %>}, + {label: "<%= t 'na', :scope => 'validation_result.statuses' %>", value: <%= @validation.report.na_warning.count %>}, + {label: "<%= t 'ok', :scope => 'validation_result.statuses' %>", value: <%= @validation.report.ok_warning.count %>} + ] + colors: [ "#ffbd2b", "#898e7f", "#8fc861" ] }).on('click', update = (i, row) -> - get_validation_results( $(".report"), $(".lines")) )
\ No newline at end of file + switch i + when 0 then get_validation_results( $(".report"), "NOK", "WARNING") + when 1 then get_validation_results( $(".report"), "UNCHECK", "WARNING") + when 2 then get_validation_results( $(".report"), "OK", "WARNING") + else console.log "Error no other value for donut chart") + + $(".resume .col1 .caption").click -> + get_validation_results( $(".report"), null, "ERROR") + + $(".resume .col2 .caption").click -> + get_validation_results( $(".report"), null, "warning") diff --git a/app/views/validations/summary_errors_index.csv.erb b/app/views/validations/summary_errors_index.csv.erb new file mode 100644 index 000000000..cec4d2e09 --- /dev/null +++ b/app/views/validations/summary_errors_index.csv.erb @@ -0,0 +1,3 @@ +<%= I18n.t("activemodel.attributes.validation_result.severity") %>;<%= I18n.t("activemodel.attributes.validation_result.status") %>;<%= I18n.t("activemodel.attributes.validation_result.rule_code") %>;<%= I18n.t("activemodel.attributes.validation_result.title") %>;<%= I18n.t("activemodel.attributes.validation_result.url") %>;<%= I18n.t("activemodel.attributes.validation_result.violation_count_txt") %>;<%= I18n.t("activemodel.attributes.validation_result.objects") %> +<% @validation.report.validation_results.each do |r| %><% case r.severity %><% when "WARNING" %><%= I18n.t "validation_result.severities.warning_txt" %><% when "ERROR" %><%= I18n.t "validation_result.severities.error_txt" %><% end %>;<%= r.result %>;<%= r.test_id %>;<%= I18n.t("activemodel.attributes.validation_result."+r.test_id) %>;<%= Rails.application.config.validation_spec + I18n.locale.to_s + "/" + r.test_id + ".html" %>;<%= r.error_count %><% if r.error_count > 0 %><% if r.errors.present? %>;<% r.errors.first(10).each do |error| %><% if error["source"] %><%= error["source"]["objectid"] + " " %><% else %><%= " " %><% end %><% end %><% end %><% end %> +<% end %>
\ No newline at end of file diff --git a/config/locales/exports.yml b/config/locales/exports.yml index daa48afe3..83af97332 100644 --- a/config/locales/exports.yml +++ b/config/locales/exports.yml @@ -53,7 +53,7 @@ en: warning: "Warning" error: "Error" fatal: "Fatal" - activerecord: + activemodel: models: export: zero: "export" @@ -164,7 +164,7 @@ fr: warning: "Alerte" error: "Erreur" fatal: "Fatal" - activerecord: + activemodel: models: export: zero: "export" @@ -295,7 +295,7 @@ en: warning: "Warning" error: "Error" fatal: "Fatal" - activerecord: + activemodel: models: export: one: "export" @@ -426,7 +426,7 @@ fr: warning: "Alerte" error: "Erreur" fatal: "Fatal" - activerecord: + activemodel: models: export: one: "export" diff --git a/config/locales/imports.yml b/config/locales/imports.yml index 57d28d9d7..5b78bf02c 100644 --- a/config/locales/imports.yml +++ b/config/locales/imports.yml @@ -48,7 +48,7 @@ en: warning: "Warning" error: "Error" fatal: "Fatal" - activerecord: + activemodel: models: import: zero: "import" @@ -154,7 +154,7 @@ fr: warning: "Alerte" error: "Erreur" fatal: "Fatal" - activerecord: + activemodel: models: import: zero: "import" diff --git a/config/locales/validation_reports.yml b/config/locales/validation_reports.yml new file mode 100644 index 000000000..57b159d19 --- /dev/null +++ b/config/locales/validation_reports.yml @@ -0,0 +1,690 @@ +en: + validation_results: + file: + zip_name_prefix: "validation_results" + summary_errors_file_prefix: "summary_of_tests.csv" + detailed_errors_file_prefix: "detail_of_errors.csv" + index: + line: "Li" + column: "Col" + validation_result: + severities: + error: "Required" + warning: "Optional" + error_txt: "Required" + warning_txt: "Optional" + statuses: + nok: "Error" + na: "Unavailable" + ok: "Success" + details: + #### level 1 + ## NEPTUNE + detail_1_neptune_xml_1: "%{source_label} : %{error_value}" + detail_1_neptune_xml_2: "%{source_label} : %{error_value}" + #### level 2 + ## NEPTUNE + detail_2_neptune_common_1: "L'élément %{source_objectid} a des attributs qui diffèrent entre les différents fichiers qui le définissent" + detail_2_neptune_common_2: "L'élément %{source_objectid} partage l'attribut RegistrationNumber = %{error_value} avec un autre objet de même type" + detail_2_neptune_network_1: "La ligne %{source_objectid} est absente de la liste des lignes du réseau %{target_0_objectid}" + detail_2_neptune_groupofline_1: "La ligne %{source_objectid} est absente de la liste des lignes du du groupe de lignes %{target_0_objectid}" + detail_2_neptune_stoparea_1: "Le fils (contains = %{error_value}) de l'arrêt %{source_objectid} n'est pas de type StopArea ni StopPoint" + detail_2_neptune_stoparea_2: "L'arrêt %{source_objectid} de type %{reference_value} ne peut contenir que des arrêts de type StopPlace ou CommercialStopPoint, or un des arrêts contenus (contains = %{target_0_objectid}) est de type %{error_value}" + detail_2_neptune_stoparea_3: "L'arrêt %{source_objectid} de type %{reference_value} ne peut contenir que des arrêts de type BoardingPosition ou Quay, or un des arrêts contenus (contains = %{target_0_objectid}) est de type %{error_value}" + detail_2_neptune_stoparea_4: "L'arrêt %{source_objectid} de type %{reference_value} ne peut contenir que des points d'arrêt de séquence, or un des arrêts contenus (contains = %{target_0_objectid}) est un StopArea arrêt de type %{error_value}" + detail_2_neptune_stoparea_5: "L'arrêt %{source_objectid} référence une position géographique (centroidOfArea = %{error_value}) inexistante" + detail_2_neptune_stoparea_6: "L'arrêt %{source_objectid} référence une position géographique (centroidOfArea = %{target_0_objectid}) qui ne le référence pas en retour (containedIn = %{error_value})" + detail_2_neptune_itl_1: "Le fils (contains = %{target_0_objectid}) de type %{error_value} ne peut pas être contenu dans l'arrêt %{source_objectid} de type %{reference_value}" + detail_2_neptune_itl_2: "L'arrêt de type ITL %{source_objectid} n'est pas utilisé" + detail_2_neptune_itl_3: "L'arrêt areaId = %{error_value} référencé par l'ITL %{source_objectid} n'existe pas" + detail_2_neptune_itl_4: "L'arrêt areaId = %{target_0_objectid} référencé par l'ITL %{source_objectid} devrait être de type ITL et non de type %{error_value}" + detail_2_neptune_itl_5: "La référence lineIdShortCut = %{error_value} de l'ITL %{source_objectid} n'est pas cohérente avec la ligne %{target_0_objectid}" + detail_2_neptune_areacentroid_1: "La position géographique <AreaCentroid> %{source_objectid} référence un arrêt (containedIn = %{error_value}) inexistant" + detail_2_neptune_areacentroid_2: "La position géographique <AreaCentroid> %{source_objectid} utilise un référentiel géographique (longLatType = %{error_value}) invalide" + detail_2_neptune_connectionlink_1: "La correspondance %{source_objectid} référence 2 arrêts inexistants" + detail_2_neptune_accesspoint_1: "L'accès %{source_objectid} référence un arrêt parent (containedIn = %{error_value}) inexistant" + detail_2_neptune_accesspoint_2: "L'accès %{source_objectid} référence un arrêt parent (containedIn = %{target_0_objectid}) de type invalide (ITL)" + detail_2_neptune_accesspoint_3: "L'accès %{source_objectid} n'a pas de lien d'accès" + detail_2_neptune_accesspoint_4: "L'accès %{source_objectid} de type In a des liens d'accès sortants" + detail_2_neptune_accesspoint_5: "L'accès %{source_objectid} de type Out a des liens d'accès entrants" + detail_2_neptune_accesspoint_6: "L'accès %{source_objectid} de type InOut n'a que des liens d'accès entrants ou sortants" + detail_2_neptune_accesspoint_7: "L'accès %{source_objectid} utilise un référentiel géographique (longLatType = %{error_value}) invalide" + detail_2_neptune_accesslink_1: "La liaison d'accès %{source_objectid} référence %{error_value} qui n'existe pas" + detail_2_neptune_accesslink_2: "Sur la liaison d'accès %{source_objectid}, les références startOfLink = %{error_value} et endOfLink = %{reference_value} sont de même type" + detail_2_neptune_line_1: "La ligne %{source_objectid} référence un réseau (ptNetworkIdShortcut = %{error_value} inexistant" + detail_2_neptune_line_2: "La ligne %{source_objectid} référence un point d'arrêt <StopPoint> (lineEnd = %{error_value}) inexistant " + detail_2_neptune_line_3: "La ligne %{source_objectid} référence un point d'arrêt (lineEnd = %{error_value}) qui n'est pas terminus d'une séquence d'arrêts" + detail_2_neptune_line_4: "La ligne %{source_objectid} référence une séquence d'arrêt (routeId = %{error_value}) inexistante" + detail_2_neptune_line_5: "La séquence d'arrêts (routeId = %{target_0_objectid}) n'est pas référencée par la ligne %{source_objectid}" + detail_2_neptune_route_1: "La séquence d'arrêts %{source_objectid} référence une mission (journeyPatternId = %{error_value}) inexistante" + detail_2_neptune_route_2: "La séquence d'arrêts %{source_objectid} référence un tronçon (ptLinkId = %{error_value}) inexistant" + detail_2_neptune_route_3: "La séquence retour (waybackRouteId = %{error_value}) de la séquence d'arrêts %{source_objectid} n'existe pas" + detail_2_neptune_route_4: "Le tronçon (ptLinkId = %{error_value}) référencé par la séquence d'arrêt %{source_objectid} est partagé avec %{target_0_objectid}" + detail_2_neptune_route_5: "Le tronçon %{source_objectid} partage un %{reference_value} : %{error_value} avec un autre tronçon" + detail_2_neptune_route_6_1: "La séquence d'arrêts %{source_objectid} n'est pas une séquence linéaire, le chainage des tronçons forme un anneau" + detail_2_neptune_route_6_2: "La séquence d'arrêts %{source_objectid} n'est pas une séquence linéaire, le chainage des tronçons est rompu au tronçon %{target_0_objectid}" + detail_2_neptune_route_7: "La séquence d'arrêts %{source_objectid} ne référence pas la mission %{target_0_objectid} alors que cette mission référence la séquence d'arrêt" + detail_2_neptune_route_8: "La mission journeyPatternId = %{target_0_objectid} de la séquence d'arrêts %{source_objectid} utilise des points d'arrêts hors séquence" + detail_2_neptune_route_9: "Le point d'arrêt (stopPointId = %{target_0_objectid}) de la séquence d'arrêts %{source_objectid} n'est utilisé dans aucune mission" + detail_2_neptune_route_10: "La séquence retour (waybackRouteId = %{target_0_objectid}) ne référence pas la séquence d'arrêts %{source_objectid} comme retour" + detail_2_neptune_route_11: "Le sens (%{reference_value}) de la séquence d'arrêt %{source_objectid} n'est pas compatible avec celui (%{error_value}) de la séquence opposée %{target_0_objectid}" + detail_2_neptune_route_12: "Le départ dans la zone %{reference_value}) de la séquence d'arrêts %{source_objectid} n'est pas dans la même zone que l'arrivée (zone %{error_value} de la séquence retour %{target_0_objectid}" + detail_2_neptune_ptlink_1: "Le tronçon %{source_objectid} reférence un %{reference_value} = %{error_value} inexistant" + detail_2_neptune_journeypattern_1: "La mission %{source_objectid} référence une séquence d'arrêts (routeId = %{error_value}) inexistante" + detail_2_neptune_journeypattern_2: "La mission %{source_objectid} référence un point d'arrêt (stopPointId = %{error_value}) inexistant" + detail_2_neptune_journeypattern_3: "La mission %{source_objectid} référence une ligne (lineIdShortcut = %{error_value}) inexistante" + detail_2_neptune_stoppoint_1: "Le point d'arrêt %{source_objectid} référence une ligne (lineIdShortcut = %{error_value}) inexistante" + detail_2_neptune_stoppoint_2: "Le point d'arrêt %{source_objectid} référence un réseau (ptNetworkIdShortcut = %{error_value}) inexistant" + detail_2_neptune_stoppoint_3: "Le point d'arrêt %{source_objectid} référence un arrêt (containedIn = %{error_value}) inexistant" + detail_2_neptune_stoppoint_4: "Le point d'arrêt %{source_objectid} utilise un référentiel géographique (longLatType = %{error_value}) invalide" + detail_2_neptune_timetable_1: "Le calendrier (<Timetable>) %{source_objectid} ne référence aucune course existante" + detail_2_neptune_timetable_2: "La course %{source_objectid} n'est référencée dans aucun calendrier (<Timetable>)" + detail_2_neptune_vehiclejourney_1: "La course %{source_objectid} référence une séquence d'arrêts (routeId = %{error_value}) inexistante" + detail_2_neptune_vehiclejourney_2: "La course %{source_objectid} référence une mission (journeyPatternId = %{error_value}) inexistante" + detail_2_neptune_vehiclejourney_3: "La course %{source_objectid} référence une ligne (lineIdShortcut = %{error_value}) inexistante" + detail_2_neptune_vehiclejourney_4: "La course %{source_objectid} référence un opérateur (operatorId = %{error_value}) inexistant" + detail_2_neptune_vehiclejourney_5: "La course %{source_objectid} référence une fréquence horaire (timeSlotId = %{error_value}) inexistante" + detail_2_neptune_vehiclejourney_6: "La course %{source_objectid} référence une mission %{error_value} incompatible de la séquence d'arrêts %{reference_value}" + detail_2_neptune_vehiclejourney_7: "La mission %{source_objectid} n'est référencée par aucune course" + detail_2_neptune_vehiclejourneyatstop_1: "La course %{source_objectid} fournit un horaire sur un point d'arrêt (stopPointId = %{error_value}) inexistant" + detail_2_neptune_vehiclejourneyatstop_2: "Un horaire de la course %{source_objectid} référence une autre course : vehicleJourneyId = %{error_value}" + detail_2_neptune_vehiclejourneyatstop_3: "La course %{source_objectid} ne fournit pas les horaires des points d'arrêts selon l'ordre de la séquence d'arrêts %{error_value}" + detail_2_neptune_vehiclejourneyatstop_4: "La course %{source_objectid} ne fournit pas les horaires des points d'arrêts de sa mission %{error_value}" + detail_2_neptune_facility_1: "L'équipement %{source_objectid} est situé sur un arrêt inexistant (containedId = %{error_value})" + detail_2_neptune_facility_2: "L'équipement %{source_objectid} référence un arrêt (stopAreaId = %{error_value}) inexistant" + detail_2_neptune_facility_3: "L'équipement %{source_objectid} référence une ligne (lineId = %{error_value} inexistante" + detail_2_neptune_facility_4: "L'équipement %{source_objectid} référence une correspondance (connectionLinkId = %{error_value} inexistante" + detail_2_neptune_facility_5: "L'équipement %{source_objectid} référence un point d'arrêt (stopPointId = %{error_value} inexistant" + detail_2_neptune_facility_6: "L'équipement %{source_objectid} utilise un référentiel géographique (longLatType = %{error_value}) invalide" + #### level 3 + detail_3_stoparea_1: "L'arrêt %{source_label} (%{source_objectid}) n'est pas géolocalisé" + detail_3_stoparea_2: "L'arrêt %{source_label} (%{source_objectid}) est localisé trop près de l'arrêt %{target_0_label} (%{target_0_objectid}) : distance %{error_value} < %{reference_value}" + detail_3_stoparea_3: "Les arrêts %{source_label} (%{source_objectid} et %{target_0_objectid}) sont desservis par les mêmes lignes" + detail_3_stoparea_4: "L'arrêt %{source_label} (%{source_objectid}) est en dehors du périmètre de contrôle" + detail_3_stoparea_5: "L'arrêt %{source_label} (%{source_objectid}) est localisé trop loin de son parent %{target_0_label} (%{target_0_objectid}) : distance %{error_value} > %{reference_value}" + detail_3_accesspoint_1: "L'accès %{source_label} (%{source_objectid}) n'est pas géolocalisé" + detail_3_accesspoint_2: "L'accès %{source_label} (%{source_objectid}) est localisé trop près de l'accès %{target_0_label} (%{target_0_objectid}) : distance %{error_value} < %{reference_value}" + detail_3_accesspoint_3: "L'accès %{source_label} (%{source_objectid}) est localisé trop loin de son parent %{target_0_label} (%{target_0_objectid}) : distance %{error_value} > %{reference_value}" + detail_3_connectionlink_1: "Sur la correspondance %{source_label} (%{source_objectid}), la distance entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid}) est trop grande : distance %{error_value} > %{reference_value}" + detail_3_connectionlink_2: "Sur la correspondance %{source_label} (%{source_objectid}), la distance entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid}) : %{error_value} est supérieure à la longueur du lien : %{reference_value}" + detail_3_connectionlink_3_1: "Sur la correspondance %{source_label} (%{source_objectid}), la vitesse par défaut %{error_value} est supérieure à %{reference_value} km/h" + detail_3_connectionlink_3_2: "Sur la correspondance %{source_label} (%{source_objectid}), la vitesse pour un voyageur occasionnel %{error_value} est supérieure à %{reference_value} km/h" + detail_3_connectionlink_3_3: "Sur la correspondance %{source_label} (%{source_objectid}), la vitesse pour un voyageur habitué %{error_value} est supérieure à %{reference_value} km/h" + detail_3_connectionlink_3_4: "Sur la correspondance %{source_label} (%{source_objectid}), la vitesse pour un voyageur à mobilité réduite %{error_value} est supérieure à %{reference_value} km/h" + detail_3_accesslink_1: "Sur le lien d'accès %{source_label} (%{source_objectid}), la distance entre l'arrêt %{target_0_label} (%{target_0_objectid}) et l'accès %{target_1_label} (%{target_1_objectid}) est trop grande : distance %{error_value} > %{reference_value}" + detail_3_accesslink_2: "Sur le lien d'accès %{source_label} (%{source_objectid}), la distance entre l'arrêt %{target_0_label} (%{target_0_objectid}) et l'accès %{target_1_label} (%{target_1_objectid}) : %{error_value} est supérieure à la longueur du lien : %{reference_value}" + detail_3_accesslink_3_1: "Sur le lien d'accès %{source_label} (%{source_objectid}), la vitesse par défaut %{error_value} est supérieure à %{reference_value} km/h" + detail_3_accesslink_3_2: "Sur le lien d'accès %{source_label} (%{source_objectid}), la vitesse pour un voyageur occasionnel %{error_value} est supérieure à %{reference_value} km/h" + detail_3_accesslink_3_3: "Sur le lien d'accès %{source_label} (%{source_objectid}), la vitesse pour un voyageur habitué %{error_value} est supérieure à %{reference_value} km/h" + detail_3_accesslink_3_4: "Sur le lien d'accès %{source_label} (%{source_objectid}), la vitesse pour un voyageur à mobilité réduite %{error_value} est supérieure à %{reference_value} km/h" + detail_3_line_1: "La ligne %{source_label} (%{source_objectid}) a une ligne homonyme sur le même réseau %{target_0_label} (%{target_0_objectid})" + detail_3_line_2: "La ligne %{source_label} (%{source_objectid}) n'a pas de séquence d'arrêts" + detail_3_route_1: "Sur la séquence d'arrêt %{source_label} (%{source_objectid}), l'arrêt %{target_0_label} (%{target_0_objectid}) est desservi 2 fois consécutivement" + detail_3_route_2: "Les terminus de la séquence d'arrêt %{source_label} (%{source_objectid}) ne sont pas cohérent avec ceux de sa séquence opposée : l'une part de %{target_0_label} (%{target_0_objectid}) et l'autre arrive à %{target_1_label} (%{target_1_objectid})" + detail_3_route_3_1: "Sur la séquence d'arrêt %{source_label} (%{source_objectid}), entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid}), distance %{error_value} < %{reference_value} " + detail_3_route_3_2: "Sur la séquence d'arrêt %{source_label} (%{source_objectid}), entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid}), distance %{error_value} > %{reference_value} " + detail_3_route_4: "La séquence d'arrêt %{source_label} (%{source_objectid}) utilise la même liste ordonnée d'arrêts que la séquence d'arrêts %{target_0_label} (%{target_0_objectid})" + detail_3_route_5: "La séquence d'arrêt %{source_label} (%{source_objectid}) peut admettre la séquence %{target_0_label} (%{target_0_objectid}) comme séquence opposée" + detail_3_route_6: "La séquence d'arrêt %{source_label} (%{source_objectid}) doit avoir un minimum de 2 arrêts" + detail_3_route_7: "La séquence d'arrêt %{source_label} (%{source_objectid}) n'a pas de mission" + detail_3_route_8: "La séquence d'arrêt %{source_label} (%{source_objectid}) a %{error_value} arrêts non utilisés par des missions" + detail_3_route_9: "La séquence d'arrêt %{source_label} (%{source_objectid}) n'a pas de mission desservant l'ensemble de ses arrêts" + detail_3_journeypattern_1: "La mission %{source_label} (%{source_objectid}) utilise les mêmes arrêts que la mission %{target_0_label} (%{target_0_objectid}) - nombre d'arrêts = %{error_value}" + detail_3_vehiclejourney_1: "Arrêt %{target_0_label} (%{target_0_objectid}) : durée d'arrêt mesurée %{error_value} > %{reference_value}" + detail_3_vehiclejourney_2_1: "La course %{source_label} (%{source_objectid}) a des horaires décroissants entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid})" + detail_3_vehiclejourney_2_2: "La course %{source_label} (%{source_objectid}) a une vitesse %{error_value} < %{reference_value} km/h entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid})" + detail_3_vehiclejourney_2_3: "La course %{source_label} (%{source_objectid}) a une vitesse %{error_value} > %{reference_value} km/h entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid})" + detail_3_vehiclejourney_3: "La course %{source_label} (%{source_objectid}) a une variation de progression entre les arrêts %{target_1_label} (%{target_1_objectid}) et %{target_2_label} (%{target_2_objectid}) %{error_value} > %{reference_value} avec la course %{target_0_label} (%{target_0_objectid})" + detail_3_vehiclejourney_4: "La course %{source_label} (%{source_objectid}) n'a pas de calendrier d'application" + detail_3_facility_1: "L'équipement %{source_label} (%{source_objectid}) n'est pas géolocalisé" + detail_3_facility_2: "L'équipement %{source_label} (%{source_objectid}) est localisé trop loin de son parent %{areaName} (%{areaId}) : distance %{error_value} > %{reference_value}" + + detail_4_network_1_min_size: "L'attribut %{reference_value} du réseau %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value}) " + detail_4_network_1_max_size: "L'attribut %{reference_value} du réseau %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_network_1_pattern: "L'attribut %{reference_value} du réseau %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_network_1_unique: "L'attribut %{reference_value} du réseau %{source_label} (%{source_objectid}) a une valeur partagée avec le réseau %{target_0_label} (%{target_0_objectid})" + detail_4_company_1_min_size: "L'attribut %{reference_value} du transporteur %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_company_1_max_size: "L'attribut %{reference_value} du transporteur %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_company_1_pattern: "L'attribut %{reference_value} du transporteur %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_company_1_unique: "L'attribut %{reference_value} du transporteur %{source_label} (%{source_objectid}) a une valeur partagée avec le transporteur %{target_0_label} (%{target_0_objectid})" + detail_4_groupofline_1_min_size: "L'attribut %{reference_value} du groupe de lignes %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_groupofline_1_max_size: "L'attribut %{reference_value} du groupe de lignes %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_groupofline_1_pattern: "L'attribut %{reference_value} du groupe de lignes %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_groupofline_1_unique: "L'attribut %{reference_value} du groupe de lignes %{source_label} (%{source_objectid}) a une valeur partagée avec le groupe de lignes %{target_0_label} (%{target_0_objectid})" + detail_4_stoparea_1_min_size: "L'attribut %{reference_value} de l'arrêt %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_stoparea_1_max_size: "L'attribut %{reference_value} de l'arrêt %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_stoparea_1_pattern: "L'attribut %{reference_value} de l'arrêt %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_stoparea_1_unique: "L'attribut %{reference_value} de l'arrêt %{source_label} (%{source_objectid}) a une valeur partagée avec l'arrêt %{target_0_label} (%{target_0_objectid})" + detail_4_stoparea_2: "L'arrêt physique %{source_label} (%{source_objectid}) n'a pas de parent" + detail_4_accesspoint_1_min_size: "L'attribut %{reference_value} du point d'accès %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_accesspoint_1_max_size: "L'attribut %{reference_value} du point d'accès %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_accesspoint_1_pattern: "L'attribut %{reference_value} du point d'accès %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_accesspoint_1_unique: "L'attribut %{reference_value} du point d'accès %{source_label} (%{source_objectid}) a une valeur partagée avec le point d'accès %{target_0_label} (%{target_0_objectid})" + detail_4_accesslink_1_min_size: "L'attribut %{reference_value} du lien d'accès %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_accesslink_1_max_size: "L'attribut %{reference_value} du lien d'accès %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_accesslink_1_pattern: "L'attribut %{reference_value} du lien d'accès %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_accesslink_1_unique: "L'attribut %{reference_value} du lien d'accès %{source_label} (%{source_objectid}) a une valeur partagée avec le lien d'accès %{target_0_label} (%{target_0_objectid})" + detail_4_connectionlink_1_min_size: "L'attribut %{reference_value} de la correspondance %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_connectionlink_1_max_size: "L'attribut %{reference_value} de la correspondance %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_connectionlink_1_pattern: "L'attribut %{reference_value} de la correspondance %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_connectionlink_1_unique: "L'attribut %{reference_value} de la correspondance %{source_label} (%{source_objectid}) a une valeur partagée avec la correspondance %{target_0_label} (%{target_0_objectid})" + detail_4_connectionlink_2: "Sur la correspondance %{source_label} (%{source_objectid}) au moins l'un des arrêts %{startName} (%{startId}) et %{endName} (%{endId}) n'est pas un arrêt physique" + detail_4_timetable_1_min_size: "L'attribut %{reference_value} du calendrier %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_timetable_1_max_size: "L'attribut %{reference_value} du calendrier %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_timetable_1_pattern: "L'attribut %{reference_value} du calendrier %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_timetable_1_unique: "L'attribut %{reference_value} du calendrier %{source_label} (%{source_objectid}) a une valeur partagée avec le calendrier %{target_0_label} (%{target_0_objectid})" + detail_4_line_1_min_size: "L'attribut %{reference_value} de la ligne %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_line_1_max_size: "L'attribut %{reference_value} de la ligne %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_line_1_pattern: "L'attribut %{reference_value} de la ligne %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_line_1_unique: "L'attribut %{reference_value} de la ligne %{source_label} (%{source_objectid}) a une valeur partagée avec la ligne %{target_0_label} (%{target_0_objectid})" + detail_4_line_2: "La ligne %{source_label} (%{source_objectid}) a un mode de transport interdit %{error_value}" + detail_4_line_3_1: "La ligne %{source_label} (%{source_objectid}) n'a pas de groupe de lignes" + detail_4_line_3_2: "La ligne %{source_label} (%{source_objectid}) a plusieurs groupes de lignes" + detail_4_line_4_1: "La ligne %{source_label} (%{source_objectid}) n'a pas de séquence d'arrêts" + detail_4_line_4_2: "La ligne %{source_label} (%{source_objectid}) a trop de séquences d'arrêts non associées (%{error_value})" + detail_4_route_1_min_size: "L'attribut %{reference_value} de la séquence d'arrêts %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_route_1_max_size: "L'attribut %{reference_value} de la séquence d'arrêts %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_route_1_pattern: "L'attribut %{reference_value} de la séquence d'arrêts %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_route_1_unique: "L'attribut %{reference_value} de la séquence d'arrêts %{source_label} (%{source_objectid}) a une valeur partagée avec la séquence d'arrêts %{target_0_label} (%{target_0_objectid})" + detail_4_journeypattern_1_min_size: "L'attribut %{reference_value} de la mission %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_journeypattern_1_max_size: "L'attribut %{reference_value} de la mission %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_journeypattern_1_pattern: "L'attribut %{reference_value} de la mission %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_journeypattern_1_unique: "L'attribut %{reference_value} de la mission %{source_label} (%{source_objectid}) a une valeur partagée avec la mission %{target_0_label} (%{target_0_objectid})" + detail_4_vehiclejourney_1_min_size: "L'attribut %{reference_value} de la course %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_vehiclejourney_1_max_size: "L'attribut %{reference_value} de la course %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_vehiclejourney_1_pattern: "L'attribut %{reference_value} de la course %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_vehiclejourney_1_unique: "L'attribut %{reference_value} de la course %{source_label} (%{source_objectid}) a une valeur partagée avec la course %{target_0_label} (%{target_0_objectid})" + detail_4_vehiclejourney_2: "La course %{source_label} (%{source_objectid}) a un mode de transport interdit %{error_value}" + activemodel: + models: + validation_result: + zero: "Validation" + one: "Validation" + other: "Validation" + attributes: + validation_result: + 1-NEPTUNE-XML-1: "Conformité à la syntaxe XML suivant les recommandations du W3C." + 1-NEPTUNE-XML-2: "Conformité au schéma défini par la XSD du profil TRIDENT/NEPTUNE." + 2-NEPTUNE-Common-1: "Unicité des éléments objectId des différents objets d'un lot de fichiers Neptune." + 2-NEPTUNE-Common-2: "Unicité des éléments regitrationNumber des différents objets d'un lot de fichiers Neptune." + 2-NEPTUNE-Network-1: "Correcte référence à des lignes <Line> dans version du réseau <PTNetwork>." + 2-NEPTUNE-GroupOfLine-1: "Correcte référence à des lignes <Line> dans groupe de lignes <GroupOfLine>." + 2-NEPTUNE-StopArea-1: "Correcte référence à des arrêts <StopArea> et/ou à des points d'arrêt sur parcours <StopPoint> dans les arrêts <StopArea>." + 2-NEPTUNE-StopArea-2: "Correcte référence à des arrêts <StopArea> dans les arrêts <StopArea> de type StopPlace." + 2-NEPTUNE-StopArea-3: "Correcte référence à des arrêts <StopArea> dans les arrêts <StopArea> de type CommercialStopPoint." + 2-NEPTUNE-StopArea-4: "Correcte référence à des points d'arrêt sur parcours <StopPoint> dans les arrêts <StopArea> de type BoardingPosition ou Quay." + 2-NEPTUNE-StopArea-5: "Correcte référence à une position géographique <AreaCentroid> dans les arrêts <StopArea> de tout type StopPlace, CommercialStopPoint, BoardingPosition et Quay." + 2-NEPTUNE-StopArea-6: "référenceréciproque d'une position géographique <AreaCentroid> dans les arrêts <StopArea> de tout type StopPlace, CommercialStopPoint, BoardingPosition et Quay." + 2-NEPTUNE-ITL-1: "Correcte référence à des arrêts <StopArea> dans les arrêts <StopArea> de type ITL." + 2-NEPTUNE-ITL-2: "Correcte référence à des arrêts <StopArea> de type ITL dans la classe d’objets <ITL>." + 2-NEPTUNE-ITL-3: "Correcte référence à des arrêts <StopArea> dans la classe d’objets <ITL>." + 2-NEPTUNE-ITL-4: "Vérification du type de référence à des arrêts <StopArea> type ITL dans la classe d’objets <ITL>." + 2-NEPTUNE-ITL-5: "Bonne référence à la ligne <Line> dans la classe d’objets <ITL>." + 2-NEPTUNE-AreaCentroid-1: "Correcte référence à des arrêts <StopArea> dans la classe d’objets <AreaCentroid>." + 2-NEPTUNE-AreaCentroid-2: "Vérification du modèle de projection de référence utilisé." + 2-NEPTUNE-ConnectionLink-1: "Correcte référence aux arrêts <StopArea> définissant des tronçons de correspondance <ConnectionLink>." + 2-NEPTUNE-AccessPoint-1: "Correcte référence à un arrêt <StopArea> dans les accès <AccessPoint>." + 2-NEPTUNE-AccessPoint-2: "Correcte référence à un arrêt <StopArea> dans les accès <AccessPoint>." + 2-NEPTUNE-AccessPoint-3: "Existence de liens d'accès <AccessLink> sur les accès <AccessPoint>." + 2-NEPTUNE-AccessPoint-4: "Existence de liens d'accès <AccessLink> sur les accès <AccessPoint> de type 'in'." + 2-NEPTUNE-AccessPoint-5: "Existence de liens d'accès <AccessLink> sur les accès <AccessPoint> sur les accès de type 'out'." + 2-NEPTUNE-AccessPoint-6: "Existence de liens d'accès <AccessLink> sur les accès <AccessPoint> sur les accès de type 'inout'." + 2-NEPTUNE-AccessPoint-7: "Vérification du modèle de projection de référence utilisé." + 2-NEPTUNE-AccessLink-1: "Correcte référence aux arrêts <StopArea> et accès <AccessPoint> définissant des liens d'accès <AccessLink>." + 2-NEPTUNE-AccessLink-2: "Correcte référence aux arrêts <StopArea> et accès <AccessPoint> définissant des liens d'accès <AccessLink>." + 2-NEPTUNE-Line-1: "Correcte référence au réseau dans l'objet ligne <Line>." + 2-NEPTUNE-Line-2: "Correcte référence à un point d'arrêt sur parcours <StopPoint> comme terminus de ligne <Line>." + 2-NEPTUNE-Line-3: "Correcte référence à un point d'arrêt sur parcours <StopPoint> comme terminus de ligne <Line>." + 2-NEPTUNE-Line-4: "Correcte référence aux séquences d'arrêts <ChouetteRoute> dans l'objet ligne <Line>." + 2-NEPTUNE-Line-5: "Correcte référence aux séquences d'arrêts <ChouetteRoute> dans l'objet ligne <Line>." + 2-NEPTUNE-Route-1: "Existence des missions <JourneyPattern> référencées par la séquence d'arrêt <ChouetteRoute>." + 2-NEPTUNE-Route-2: "Existence des tronçons commerciaux <PtLink> référencés par la séquence d'arrêt <ChouetteRoute>." + 2-NEPTUNE-Route-3: "Existence de la séquence opposée <ChouetteRoute> référencée par la séquence d'arrêt <ChouetteRoute>." + 2-NEPTUNE-Route-4: "Correcte référence à un tronçon commercial <PtLink> dans une séquence d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-5: "Vérification que tous les points d'arrêts sur parcours sont rattachés à une séquence d'arrêts <ChouetteRoute> au départ d'un tronçon commercial <PtLink> et/ou à l'arrivée d'un autre tronçon commercial <PtLink> de la même séquence d'arrêts." + 2-NEPTUNE-Route-6: "Vérification du correct ordonnancement des points d'arrêts sur parcours <StopPoint> dans le chainage des tronçons <PtLink> d'une séquence d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-7: "référence mutuelle des missions <JourneyPattern> et des séquences d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-8: "Cohérence des références aux points d'arrêt des missions <JourneyPattern> et des séquences d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-9: "Utilité des points d'arrêts sur parcours des séquences d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-10: "référence d'une séquence d'arrêts <ChouetteRoute> à une séquence d'arrêts opposée." + 2-NEPTUNE-Route-11: "Cohérence des sens de la référence d'une séquence d'arrêts <ChouetteRoute> à une séquence d'arrêts opposée." + 2-NEPTUNE-Route-12: "Cohérence des terminus de la référence d'une séquence d'arrêts <ChouetteRoute> à une séquence d'arrêts opposée." + 2-NEPTUNE-PtLink-1: "Existence des arrêts <StopPoint> référencés par les tronçons commerciaux <PTLink>." + 2-NEPTUNE-JourneyPattern-1: "Existence de la séquence d'arrêt <ChouetteRoute> référencée par la mission <JourneyPattern>." + 2-NEPTUNE-JourneyPattern-2: "Existence des arrêts <StopPoint> référencés par la mission <JourneyPattern>." + 2-NEPTUNE-JourneyPattern-3: "Existence de la ligne <Line> référencée par la mission <JourneyPattern>." + 2-NEPTUNE-StopPoint-1: "Existence de la ligne <Line> référencée par l'arrêt <StopPoint>." + 2-NEPTUNE-StopPoint-2: "Existence du réseau <PTNetwork> référence par l'arrêt <StopPoint>." + 2-NEPTUNE-StopPoint-3: "Existence de l'arrêt <StopArea> référencé par l'arrêt <StopPoint>." + 2-NEPTUNE-StopPoint-4: "Vérification du modèle de projection de référence utilisé." + 2-NEPTUNE-Timetable-1: "Utilité des calendriers." + 2-NEPTUNE-Timetable-2: "Utilité des calendriers." + 2-NEPTUNE-VehicleJourney-1: "Existence de la séquence d'arrêt <ChouetteRoute> référencée par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-2: "Existence de la mission <JourneyPattern> référencée par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-3: "Existence de la ligne <Line> référencée par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-4: "Existence de l'opérateur <Company> référencé par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-5: "Existence de la tranche horaire <TimeSlot> référencée par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-6: "Cohérence entre la course, la mission et la séquence d'arrêts." + 2-NEPTUNE-VehicleJourney-7: "Utilité des missions" + 2-NEPTUNE-VehicleJourneyAtStop-1: "Existence de l'arrêt <StopPoint> référencé par l'horaire <VehicleJourneyAtStop>." + 2-NEPTUNE-VehicleJourneyAtStop-2: "Existence de la course <VehicleJourney> référenceé par l'horaire <VehicleJourneyAtStop>." + 2-NEPTUNE-VehicleJourneyAtStop-3: "adéquation des horaires de la course à la séquence d'arrêts." + 2-NEPTUNE-VehicleJourneyAtStop-4: "adéquation des horaires de la course à la mission." + 2-NEPTUNE-Facility-1: "Existence de l'arrêt <StopArea> référencé par l'équipement <Facility>." + 2-NEPTUNE-Facility-2: "Existence de l'arrêt <StopArea> référencé par l'équipement <Facility>." + 2-NEPTUNE-Facility-3: "Existence de la ligne <Line> référencée par l'équipement <Facility>." + 2-NEPTUNE-Facility-4: "Existence de la correspondance <ConnectionLink> référencée par l'équipement <Facility>." + 2-NEPTUNE-Facility-5: "Existence de l'arrêt <StopPoint> référencé par l'équipement <Facility>." + 2-NEPTUNE-Facility-6: "Vérification du modèle de projection de référence utilisé." + 3-StopArea-1: "Vérification de la géolocalisation de tous les arrêts hors ITL" + 3-StopArea-2: "Vérification que 2 arrêts de noms différents en dehors d'un même regroupement d'arrêts ne sont pas trop proches" + 3-StopArea-3: "Vérification de l'unicité des arrêts" + 3-StopArea-4: "Vérification de la géolocalisation des arrêts" + 3-StopArea-5: "Vérification de la position relative des arrêts et de leur parent" + 3-AccessPoint-1: "Vérification de la géolocalisation de tous les accès" + 3-AccessPoint-2: "Vérification que deux accès de nom différents ne sont pas trop proches" + 3-AccessPoint-3: "Vérification de la proximité entre les accès et leur arrêt de rattachement" + 3-ConnectionLink-1: "Vérification de la proximité entre les deux arrêts d'une correspondance" + 3-ConnectionLink-2: "Vérification de la cohérence entre la distance fournie sur la correspondance et la distance géographique entre les deux arrêts de la correspondance" + 3-ConnectionLink-3: "Vérification de la vitesse de parcours entre les deux arrêts d'une correspondance" + 3-AccessLink-1: "Vérification de la proximité entre les deux extrémités d'un lien d'accès" + 3-AccessLink-2: "Vérification de la cohérence entre la distance fournie sur le lien d'accès et la distance géographique entre les deux extrémités du lien d'accès" + 3-AccessLink-3: "Vérification de la vitesse de parcours entre les deux extrémités d'un lien d'accès" + 3-Line-1: "Vérification de la non homonymie des lignes" + 3-Line-2: "Vérification de la présence de séquences d'arrêts sur la ligne" + 3-Route-1: "Vérification de la succession des arrêts de la séquence" + 3-Route-2: "Vérification de la séquence inverse" + 3-Route-3: "Vérification de la distance entre deux arrêts successifs de la séquence" + 3-Route-4: "Vérification de double définition de séquences" + 3-Route-5: "Vérification de séquences sans séquence opposée" + 3-Route-6: "Vérification de la présence d'arrêts dans la séquence" + 3-Route-7: "Vérification de la présence de missions" + 3-Route-8: "Vérification de l'utilisation des arrêts par les missions" + 3-Route-9: "Vérification de l’existence d’une mission passant par tous les arrêts de la séquence" + 3-JourneyPattern-1: "Vérification de double définition de missions" + 3-VehicleJourney-1: "Vérification de la chronologie des horaires de passage à un arrêt" + 3-VehicleJourney-2: "Vérification de la vitesse de transfert entre deux arrêts" + 3-VehicleJourney-3: "Vérification de la cohérence des courses successives desservant deux mêmes arrêts" + 3-VehicleJourney-4: "Vérification de l'affectation des courses à un calendrier" + 3-Facility-1: "Vérification de la géolocalisation de tous les accès" + 3-Facility-2: "Vérification de la proximité entre les équipements et leur arrêt de rattachement" + 4-Network-1: "Vérification de contraintes sur les attributs des réseaux" + 4-Company-1: "Vérification de contraintes sur les attributs des transporteurs" + 4-GroupOfLine-1: "Vérification de contraintes sur les attributs des groupes de lignes" + 4-StopArea-1: "Vérification de contraintes sur les attributs des arrêts" + 4-StopArea-2: "Vérification de l'existance d'un arrêt commercial pour les arrêts physiques" + 4-StopArea-3: "Vérification de la cohérence entre les noms de communes et leur code INSEE" + 4-AccessPoint-1: "Vérification de contraintes sur les attributs des accès" + 4-AccessLink-1: "Vérification de contraintes sur les attributs des liens d'accès" + 4-ConnectionLink-1: "Vérification de contraintes sur les attributs des correspondances" + 4-ConnectionLink-2: "Vérification des type d'arrêts en correspondance" + 4-Timetable-1: "Vérification de contraintes sur les attributs des calendiers" + 4-Line-1: "Vérification de contraintes sur les attributs des lignes" + 4-Line-2: "Vérification des modes de transport des lignes" + 4-Line-3: "Vérification des groupes de lignes d'une ligne" + 4-Line-4: "Vérification des séquences d'arrêts d'une ligne" + 4-Route-1: "Vérification de contraintes sur les attributs des séquences d'arrêt" + 4-JourneyPattern-1: "Vérification de contraintes sur les attributs des missions" + 4-VehicleJourney-1: "Vérification de contraintes sur les attributs des courses" + 4-VehicleJourney-2: "Vérification des modes de transport des courses" + severity: "Severity" + status: "Status" + rule_level: "Level" + rule_target: "Object" + rule_number: "Step" + rule_code: "Code" + violation_count: "errors" + violation_count_txt: "Number of errors" + objects: "Objects in violations" + detail: "Detail" + title: "Test title" + object: "Error object" + resource: "Resources of the error object" + url: "URL" + first_violations: "First violations" +fr: + validation_results: + file: + zip_name_prefix: "resultats_de_validation" + summary_errors_file_prefix: "sommaire_des_tests.csv" + detailed_errors_file_prefix: "details_des_erreurs.csv" + index: + line: "Li" + column: "Col" + validation_result: + severities: + error: "Obligatoires" + warning: "Optionnels" + error_txt: "Obligatoire" + warning_txt: "Optionnel" + statuses: + nok: "Erreur" + na: "Absent" + ok: "Succès" + details: + #### level 1 + ## NEPTUNE + detail_1_neptune_xml_1: "%{source_label} : %{error_value}" + detail_1_neptune_xml_2: "%{source_label} : %{error_value}" + #### level 2 + ## NEPTUNE + detail_2_neptune_common_1: "L'élément %{source_objectid} a des attributs qui diffèrent entre les différents fichiers qui le définissent" + detail_2_neptune_common_2: "L'élément %{source_objectid} partage l'attribut RegistrationNumber = %{error_value} avec un autre objet de même type" + detail_2_neptune_network_1: "La ligne %{source_objectid} est absente de la liste des lignes du réseau %{target_0_objectid}" + detail_2_neptune_groupofline_1: "La ligne %{source_objectid} est absente de la liste des lignes du du groupe de lignes %{target_0_objectid}" + detail_2_neptune_stoparea_1: "Le fils (contains = %{error_value}) de l'arrêt %{source_objectid} n'est pas de type StopArea ni StopPoint" + detail_2_neptune_stoparea_2: "L'arrêt %{source_objectid} de type %{reference_value} ne peut contenir que des arrêts de type StopPlace ou CommercialStopPoint, or un des arrêts contenus (contains = %{target_0_objectid}) est de type %{error_value}" + detail_2_neptune_stoparea_3: "L'arrêt %{source_objectid} de type %{reference_value} ne peut contenir que des arrêts de type BoardingPosition ou Quay, or un des arrêts contenus (contains = %{target_0_objectid}) est de type %{error_value}" + detail_2_neptune_stoparea_4: "L'arrêt %{source_objectid} de type %{reference_value} ne peut contenir que des points d'arrêt de séquence, or un des arrêts contenus (contains = %{target_0_objectid}) est un StopArea arrêt de type %{error_value}" + detail_2_neptune_stoparea_5: "L'arrêt %{source_objectid} référence une position géographique (centroidOfArea = %{error_value}) inexistante" + detail_2_neptune_stoparea_6: "L'arrêt %{source_objectid} référence une position géographique (centroidOfArea = %{target_0_objectid}) qui ne le référence pas en retour (containedIn = %{error_value})" + detail_2_neptune_itl_1: "Le fils (contains = %{target_0_objectid}) de type %{error_value} ne peut pas être contenu dans l'arrêt %{source_objectid} de type %{reference_value}" + detail_2_neptune_itl_2: "L'arrêt de type ITL %{source_objectid} n'est pas utilisé" + detail_2_neptune_itl_3: "L'arrêt areaId = %{error_value} référencé par l'ITL %{source_objectid} n'existe pas" + detail_2_neptune_itl_4: "L'arrêt areaId = %{target_0_objectid} référencé par l'ITL %{source_objectid} devrait être de type ITL et non de type %{error_value}" + detail_2_neptune_itl_5: "La référence lineIdShortCut = %{error_value} de l'ITL %{source_objectid} n'est pas cohérente avec la ligne %{target_0_objectid}" + detail_2_neptune_areacentroid_1: "La position géographique <AreaCentroid> %{source_objectid} référence un arrêt (containedIn = %{error_value}) inexistant" + detail_2_neptune_areacentroid_2: "La position géographique <AreaCentroid> %{source_objectid} utilise un référentiel géographique (longLatType = %{error_value}) invalide" + detail_2_neptune_connectionlink_1: "La correspondance %{source_objectid} référence 2 arrêts inexistants" + detail_2_neptune_accesspoint_1: "L'accès %{source_objectid} référence un arrêt parent (containedIn = %{error_value}) inexistant" + detail_2_neptune_accesspoint_2: "L'accès %{source_objectid} référence un arrêt parent (containedIn = %{target_0_objectid}) de type invalide (ITL)" + detail_2_neptune_accesspoint_3: "L'accès %{source_objectid} n'a pas de lien d'accès" + detail_2_neptune_accesspoint_4: "L'accès %{source_objectid} de type In a des liens d'accès sortants" + detail_2_neptune_accesspoint_5: "L'accès %{source_objectid} de type Out a des liens d'accès entrants" + detail_2_neptune_accesspoint_6: "L'accès %{source_objectid} de type InOut n'a que des liens d'accès entrants ou sortants" + detail_2_neptune_accesspoint_7: "L'accès %{source_objectid} utilise un référentiel géographique (longLatType = %{error_value}) invalide" + detail_2_neptune_accesslink_1: "La liaison d'accès %{source_objectid} référence %{error_value} qui n'existe pas" + detail_2_neptune_accesslink_2: "Sur la liaison d'accès %{source_objectid}, les références startOfLink = %{error_value} et endOfLink = %{reference_value} sont de même type" + detail_2_neptune_line_1: "La ligne %{source_objectid} référence un réseau (ptNetworkIdShortcut = %{error_value} inexistant" + detail_2_neptune_line_2: "La ligne %{source_objectid} référence un point d'arrêt <StopPoint> (lineEnd = %{error_value}) inexistant " + detail_2_neptune_line_3: "La ligne %{source_objectid} référence un point d'arrêt (lineEnd = %{error_value}) qui n'est pas terminus d'une séquence d'arrêts" + detail_2_neptune_line_4: "La ligne %{source_objectid} référence une séquence d'arrêt (routeId = %{error_value}) inexistante" + detail_2_neptune_line_5: "La séquence d'arrêts (routeId = %{target_0_objectid}) n'est pas référencée par la ligne %{source_objectid}" + detail_2_neptune_route_1: "La séquence d'arrêts %{source_objectid} référence une mission (journeyPatternId = %{error_value}) inexistante" + detail_2_neptune_route_2: "La séquence d'arrêts %{source_objectid} référence un tronçon (ptLinkId = %{error_value}) inexistant" + detail_2_neptune_route_3: "La séquence retour (waybackRouteId = %{error_value}) de la séquence d'arrêts %{source_objectid} n'existe pas" + detail_2_neptune_route_4: "Le tronçon (ptLinkId = %{error_value}) référencé par la séquence d'arrêt %{source_objectid} est partagé avec %{target_0_objectid}" + detail_2_neptune_route_5: "Le tronçon %{source_objectid} partage un %{reference_value} : %{error_value} avec un autre tronçon" + detail_2_neptune_route_6_1: "La séquence d'arrêts %{source_objectid} n'est pas une séquence linéaire, le chainage des tronçons forme un anneau" + detail_2_neptune_route_6_2: "La séquence d'arrêts %{source_objectid} n'est pas une séquence linéaire, le chainage des tronçons est rompu au tronçon %{target_0_objectid}" + detail_2_neptune_route_7: "La séquence d'arrêts %{source_objectid} ne référence pas la mission %{target_0_objectid} alors que cette mission référence la séquence d'arrêt" + detail_2_neptune_route_8: "La mission journeyPatternId = %{target_0_objectid} de la séquence d'arrêts %{source_objectid} utilise des points d'arrêts hors séquence" + detail_2_neptune_route_9: "Le point d'arrêt (stopPointId = %{target_0_objectid}) de la séquence d'arrêts %{source_objectid} n'est utilisé dans aucune mission" + detail_2_neptune_route_10: "La séquence retour (waybackRouteId = %{target_0_objectid}) ne référence pas la séquence d'arrêts %{source_objectid} comme retour" + detail_2_neptune_route_11: "Le sens (%{reference_value}) de la séquence d'arrêt %{source_objectid} n'est pas compatible avec celui (%{error_value}) de la séquence opposée %{target_0_objectid}" + detail_2_neptune_route_12: "Le départ dans la zone %{reference_value}) de la séquence d'arrêts %{source_objectid} n'est pas dans la même zone que l'arrivée (zone %{error_value} de la séquence retour %{target_0_objectid}" + detail_2_neptune_ptlink_1: "Le tronçon %{source_objectid} reférence un %{reference_value} = %{error_value} inexistant" + detail_2_neptune_journeypattern_1: "La mission %{source_objectid} référence une séquence d'arrêts (routeId = %{error_value}) inexistante" + detail_2_neptune_journeypattern_2: "La mission %{source_objectid} référence un point d'arrêt (stopPointId = %{error_value}) inexistant" + detail_2_neptune_journeypattern_3: "La mission %{source_objectid} référence une ligne (lineIdShortcut = %{error_value}) inexistante" + detail_2_neptune_stoppoint_1: "Le point d'arrêt %{source_objectid} référence une ligne (lineIdShortcut = %{error_value}) inexistante" + detail_2_neptune_stoppoint_2: "Le point d'arrêt %{source_objectid} référence un réseau (ptNetworkIdShortcut = %{error_value}) inexistant" + detail_2_neptune_stoppoint_3: "Le point d'arrêt %{source_objectid} référence un arrêt (containedIn = %{error_value}) inexistant" + detail_2_neptune_stoppoint_4: "Le point d'arrêt %{source_objectid} utilise un référentiel géographique (longLatType = %{error_value}) invalide" + detail_2_neptune_timetable_1: "Le calendrier (<Timetable>) %{source_objectid} ne référence aucune course existante" + detail_2_neptune_timetable_2: "La course %{source_objectid} n'est référencée dans aucun calendrier (<Timetable>)" + detail_2_neptune_vehiclejourney_1: "La course %{source_objectid} référence une séquence d'arrêts (routeId = %{error_value}) inexistante" + detail_2_neptune_vehiclejourney_2: "La course %{source_objectid} référence une mission (journeyPatternId = %{error_value}) inexistante" + detail_2_neptune_vehiclejourney_3: "La course %{source_objectid} référence une ligne (lineIdShortcut = %{error_value}) inexistante" + detail_2_neptune_vehiclejourney_4: "La course %{source_objectid} référence un opérateur (operatorId = %{error_value}) inexistant" + detail_2_neptune_vehiclejourney_5: "La course %{source_objectid} référence une fréquence horaire (timeSlotId = %{error_value}) inexistante" + detail_2_neptune_vehiclejourney_6: "La course %{source_objectid} référence une mission %{error_value} incompatible de la séquence d'arrêts %{reference_value}" + detail_2_neptune_vehiclejourney_7: "La mission %{source_objectid} n'est référencée par aucune course" + detail_2_neptune_vehiclejourneyatstop_1: "La course %{source_objectid} fournit un horaire sur un point d'arrêt (stopPointId = %{error_value}) inexistant" + detail_2_neptune_vehiclejourneyatstop_2: "Un horaire de la course %{source_objectid} référence une autre course : vehicleJourneyId = %{error_value}" + detail_2_neptune_vehiclejourneyatstop_3: "La course %{source_objectid} ne fournit pas les horaires des points d'arrêts selon l'ordre de la séquence d'arrêts %{error_value}" + detail_2_neptune_vehiclejourneyatstop_4: "La course %{source_objectid} ne fournit pas les horaires des points d'arrêts de sa mission %{error_value}" + detail_2_neptune_facility_1: "L'équipement %{source_objectid} est situé sur un arrêt inexistant (containedId = %{error_value})" + detail_2_neptune_facility_2: "L'équipement %{source_objectid} référence un arrêt (stopAreaId = %{error_value}) inexistant" + detail_2_neptune_facility_3: "L'équipement %{source_objectid} référence une ligne (lineId = %{error_value} inexistante" + detail_2_neptune_facility_4: "L'équipement %{source_objectid} référence une correspondance (connectionLinkId = %{error_value} inexistante" + detail_2_neptune_facility_5: "L'équipement %{source_objectid} référence un point d'arrêt (stopPointId = %{error_value} inexistant" + detail_2_neptune_facility_6: "L'équipement %{source_objectid} utilise un référentiel géographique (longLatType = %{error_value}) invalide" + #### level 3 + detail_3_stoparea_1: "L'arrêt %{source_label} (%{source_objectid}) n'est pas géolocalisé" + detail_3_stoparea_2: "L'arrêt %{source_label} (%{source_objectid}) est localisé trop près de l'arrêt %{target_0_label} (%{target_0_objectid}) : distance %{error_value} < %{reference_value}" + detail_3_stoparea_3: "Les arrêts %{source_label} (%{source_objectid} et %{target_0_objectid}) sont desservis par les mêmes lignes" + detail_3_stoparea_4: "L'arrêt %{source_label} (%{source_objectid}) est en dehors du périmètre de contrôle" + detail_3_stoparea_5: "L'arrêt %{source_label} (%{source_objectid}) est localisé trop loin de son parent %{target_0_label} (%{target_0_objectid}) : distance %{error_value} > %{reference_value}" + detail_3_accesspoint_1: "L'accès %{source_label} (%{source_objectid}) n'est pas géolocalisé" + detail_3_accesspoint_2: "L'accès %{source_label} (%{source_objectid}) est localisé trop près de l'accès %{target_0_label} (%{target_0_objectid}) : distance %{error_value} < %{reference_value}" + detail_3_accesspoint_3: "L'accès %{source_label} (%{source_objectid}) est localisé trop loin de son parent %{target_0_label} (%{target_0_objectid}) : distance %{error_value} > %{reference_value}" + detail_3_connectionlink_1: "Sur la correspondance %{source_label} (%{source_objectid}), la distance entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid}) est trop grande : distance %{error_value} > %{reference_value}" + detail_3_connectionlink_2: "Sur la correspondance %{source_label} (%{source_objectid}), la distance entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid}) : %{error_value} est supérieure à la longueur du lien : %{reference_value}" + detail_3_connectionlink_3_1: "Sur la correspondance %{source_label} (%{source_objectid}), la vitesse par défaut %{error_value} est supérieure à %{reference_value} km/h" + detail_3_connectionlink_3_2: "Sur la correspondance %{source_label} (%{source_objectid}), la vitesse pour un voyageur occasionnel %{error_value} est supérieure à %{reference_value} km/h" + detail_3_connectionlink_3_3: "Sur la correspondance %{source_label} (%{source_objectid}), la vitesse pour un voyageur habitué %{error_value} est supérieure à %{reference_value} km/h" + detail_3_connectionlink_3_4: "Sur la correspondance %{source_label} (%{source_objectid}), la vitesse pour un voyageur à mobilité réduite %{error_value} est supérieure à %{reference_value} km/h" + detail_3_accesslink_1: "Sur le lien d'accès %{source_label} (%{source_objectid}), la distance entre l'arrêt %{target_0_label} (%{target_0_objectid}) et l'accès %{target_1_label} (%{target_1_objectid}) est trop grande : distance %{error_value} > %{reference_value}" + detail_3_accesslink_2: "Sur le lien d'accès %{source_label} (%{source_objectid}), la distance entre l'arrêt %{target_0_label} (%{target_0_objectid}) et l'accès %{target_1_label} (%{target_1_objectid}) : %{error_value} est supérieure à la longueur du lien : %{reference_value}" + detail_3_accesslink_3_1: "Sur le lien d'accès %{source_label} (%{source_objectid}), la vitesse par défaut %{error_value} est supérieure à %{reference_value} km/h" + detail_3_accesslink_3_2: "Sur le lien d'accès %{source_label} (%{source_objectid}), la vitesse pour un voyageur occasionnel %{error_value} est supérieure à %{reference_value} km/h" + detail_3_accesslink_3_3: "Sur le lien d'accès %{source_label} (%{source_objectid}), la vitesse pour un voyageur habitué %{error_value} est supérieure à %{reference_value} km/h" + detail_3_accesslink_3_4: "Sur le lien d'accès %{source_label} (%{source_objectid}), la vitesse pour un voyageur à mobilité réduite %{error_value} est supérieure à %{reference_value} km/h" + detail_3_line_1: "La ligne %{source_label} (%{source_objectid}) a une ligne homonyme sur le même réseau %{target_0_label} (%{target_0_objectid})" + detail_3_line_2: "La ligne %{source_label} (%{source_objectid}) n'a pas de séquence d'arrêts" + detail_3_route_1: "Sur la séquence d'arrêt %{source_label} (%{source_objectid}), l'arrêt %{target_0_label} (%{target_0_objectid}) est desservi 2 fois consécutivement" + detail_3_route_2: "Les terminus de la séquence d'arrêt %{source_label} (%{source_objectid}) ne sont pas cohérent avec ceux de sa séquence opposée : l'une part de %{target_0_label} (%{target_0_objectid}) et l'autre arrive à %{target_1_label} (%{target_1_objectid})" + detail_3_route_3_1: "Sur la séquence d'arrêt %{source_label} (%{source_objectid}), entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid}), distance %{error_value} < %{reference_value} " + detail_3_route_3_2: "Sur la séquence d'arrêt %{source_label} (%{source_objectid}), entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid}), distance %{error_value} > %{reference_value} " + detail_3_route_4: "La séquence d'arrêt %{source_label} (%{source_objectid}) utilise la même liste ordonnée d'arrêts que la séquence d'arrêts %{target_0_label} (%{target_0_objectid})" + detail_3_route_5: "La séquence d'arrêt %{source_label} (%{source_objectid}) peut admettre la séquence %{target_0_label} (%{target_0_objectid}) comme séquence opposée" + detail_3_route_6: "La séquence d'arrêt %{source_label} (%{source_objectid}) doit avoir un minimum de 2 arrêts" + detail_3_route_7: "La séquence d'arrêt %{source_label} (%{source_objectid}) n'a pas de mission" + detail_3_route_8: "La séquence d'arrêt %{source_label} (%{source_objectid}) a %{error_value} arrêts non utilisés par des missions" + detail_3_route_9: "La séquence d'arrêt %{source_label} (%{source_objectid}) n'a pas de mission desservant l'ensemble de ses arrêts" + detail_3_journeypattern_1: "La mission %{source_label} (%{source_objectid}) utilise les mêmes arrêts que la mission %{target_0_label} (%{target_0_objectid}) - nombre d'arrêts = %{error_value}" + detail_3_vehiclejourney_1: "Arrêt %{target_0_label} (%{target_0_objectid}) : durée d'arrêt mesurée %{error_value} > %{reference_value}" + detail_3_vehiclejourney_2_1: "La course %{source_label} (%{source_objectid}) a des horaires décroissants entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid})" + detail_3_vehiclejourney_2_2: "La course %{source_label} (%{source_objectid}) a une vitesse %{error_value} < %{reference_value} km/h entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid})" + detail_3_vehiclejourney_2_3: "La course %{source_label} (%{source_objectid}) a une vitesse %{error_value} > %{reference_value} km/h entre les arrêts %{target_0_label} (%{target_0_objectid}) et %{target_1_label} (%{target_1_objectid})" + detail_3_vehiclejourney_3: "La course %{source_label} (%{source_objectid}) a une variation de progression entre les arrêts %{target_1_label} (%{target_1_objectid}) et %{target_2_label} (%{target_2_objectid}) %{error_value} > %{reference_value} avec la course %{target_0_label} (%{target_0_objectid})" + detail_3_vehiclejourney_4: "La course %{source_label} (%{source_objectid}) n'a pas de calendrier d'application" + detail_3_facility_1: "L'équipement %{source_label} (%{source_objectid}) n'est pas géolocalisé" + detail_3_facility_2: "L'équipement %{source_label} (%{source_objectid}) est localisé trop loin de son parent %{areaName} (%{areaId}) : distance %{error_value} > %{reference_value}" + + detail_4_network_1_min_size: "L'attribut %{reference_value} du réseau %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value}) " + detail_4_network_1_max_size: "L'attribut %{reference_value} du réseau %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_network_1_pattern: "L'attribut %{reference_value} du réseau %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_network_1_unique: "L'attribut %{reference_value} du réseau %{source_label} (%{source_objectid}) a une valeur partagée avec le réseau %{target_0_label} (%{target_0_objectid})" + detail_4_company_1_min_size: "L'attribut %{reference_value} du transporteur %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_company_1_max_size: "L'attribut %{reference_value} du transporteur %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_company_1_pattern: "L'attribut %{reference_value} du transporteur %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_company_1_unique: "L'attribut %{reference_value} du transporteur %{source_label} (%{source_objectid}) a une valeur partagée avec le transporteur %{target_0_label} (%{target_0_objectid})" + detail_4_groupofline_1_min_size: "L'attribut %{reference_value} du groupe de lignes %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_groupofline_1_max_size: "L'attribut %{reference_value} du groupe de lignes %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_groupofline_1_pattern: "L'attribut %{reference_value} du groupe de lignes %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_groupofline_1_unique: "L'attribut %{reference_value} du groupe de lignes %{source_label} (%{source_objectid}) a une valeur partagée avec le groupe de lignes %{target_0_label} (%{target_0_objectid})" + detail_4_stoparea_1_min_size: "L'attribut %{reference_value} de l'arrêt %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_stoparea_1_max_size: "L'attribut %{reference_value} de l'arrêt %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_stoparea_1_pattern: "L'attribut %{reference_value} de l'arrêt %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_stoparea_1_unique: "L'attribut %{reference_value} de l'arrêt %{source_label} (%{source_objectid}) a une valeur partagée avec l'arrêt %{target_0_label} (%{target_0_objectid})" + detail_4_stoparea_2: "L'arrêt physique %{source_label} (%{source_objectid}) n'a pas de parent" + detail_4_accesspoint_1_min_size: "L'attribut %{reference_value} du point d'accès %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_accesspoint_1_max_size: "L'attribut %{reference_value} du point d'accès %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_accesspoint_1_pattern: "L'attribut %{reference_value} du point d'accès %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_accesspoint_1_unique: "L'attribut %{reference_value} du point d'accès %{source_label} (%{source_objectid}) a une valeur partagée avec le point d'accès %{target_0_label} (%{target_0_objectid})" + detail_4_accesslink_1_min_size: "L'attribut %{reference_value} du lien d'accès %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_accesslink_1_max_size: "L'attribut %{reference_value} du lien d'accès %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_accesslink_1_pattern: "L'attribut %{reference_value} du lien d'accès %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_accesslink_1_unique: "L'attribut %{reference_value} du lien d'accès %{source_label} (%{source_objectid}) a une valeur partagée avec le lien d'accès %{target_0_label} (%{target_0_objectid})" + detail_4_connectionlink_1_min_size: "L'attribut %{reference_value} de la correspondance %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_connectionlink_1_max_size: "L'attribut %{reference_value} de la correspondance %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_connectionlink_1_pattern: "L'attribut %{reference_value} de la correspondance %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_connectionlink_1_unique: "L'attribut %{reference_value} de la correspondance %{source_label} (%{source_objectid}) a une valeur partagée avec la correspondance %{target_0_label} (%{target_0_objectid})" + detail_4_connectionlink_2: "Sur la correspondance %{source_label} (%{source_objectid}) au moins l'un des arrêts %{startName} (%{startId}) et %{endName} (%{endId}) n'est pas un arrêt physique" + detail_4_timetable_1_min_size: "L'attribut %{reference_value} du calendrier %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_timetable_1_max_size: "L'attribut %{reference_value} du calendrier %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_timetable_1_pattern: "L'attribut %{reference_value} du calendrier %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_timetable_1_unique: "L'attribut %{reference_value} du calendrier %{source_label} (%{source_objectid}) a une valeur partagée avec le calendrier %{target_0_label} (%{target_0_objectid})" + detail_4_line_1_min_size: "L'attribut %{reference_value} de la ligne %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_line_1_max_size: "L'attribut %{reference_value} de la ligne %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_line_1_pattern: "L'attribut %{reference_value} de la ligne %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_line_1_unique: "L'attribut %{reference_value} de la ligne %{source_label} (%{source_objectid}) a une valeur partagée avec la ligne %{target_0_label} (%{target_0_objectid})" + detail_4_line_2: "La ligne %{source_label} (%{source_objectid}) a un mode de transport interdit %{error_value}" + detail_4_line_3_1: "La ligne %{source_label} (%{source_objectid}) n'a pas de groupe de lignes" + detail_4_line_3_2: "La ligne %{source_label} (%{source_objectid}) a plusieurs groupes de lignes" + detail_4_line_4_1: "La ligne %{source_label} (%{source_objectid}) n'a pas de séquence d'arrêts" + detail_4_line_4_2: "La ligne %{source_label} (%{source_objectid}) a trop de séquences d'arrêts non associées (%{error_value})" + detail_4_route_1_min_size: "L'attribut %{reference_value} de la séquence d'arrêts %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_route_1_max_size: "L'attribut %{reference_value} de la séquence d'arrêts %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_route_1_pattern: "L'attribut %{reference_value} de la séquence d'arrêts %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_route_1_unique: "L'attribut %{reference_value} de la séquence d'arrêts %{source_label} (%{source_objectid}) a une valeur partagée avec la séquence d'arrêts %{target_0_label} (%{target_0_objectid})" + detail_4_journeypattern_1_min_size: "L'attribut %{reference_value} de la mission %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_journeypattern_1_max_size: "L'attribut %{reference_value} de la mission %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_journeypattern_1_pattern: "L'attribut %{reference_value} de la mission %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_journeypattern_1_unique: "L'attribut %{reference_value} de la mission %{source_label} (%{source_objectid}) a une valeur partagée avec la mission %{target_0_label} (%{target_0_objectid})" + detail_4_vehiclejourney_1_min_size: "L'attribut %{reference_value} de la course %{source_label} (%{source_objectid}) n'est pas renseigné ou trop petit (%{error_value})" + detail_4_vehiclejourney_1_max_size: "L'attribut %{reference_value} de la course %{source_label} (%{source_objectid}) est trop grand (%{error_value})" + detail_4_vehiclejourney_1_pattern: "L'attribut %{reference_value} de la course %{source_label} (%{source_objectid}) n'est pas au bon format (%{error_value})" + detail_4_vehiclejourney_1_unique: "L'attribut %{reference_value} de la course %{source_label} (%{source_objectid}) a une valeur partagée avec la course %{target_0_label} (%{target_0_objectid})" + detail_4_vehiclejourney_2: "La course %{source_label} (%{source_objectid}) a un mode de transport interdit %{error_value}" + activemodel: + models: + validation_result: + zero: "Validation" + one: "Validation" + other: "Validations" + attributes: + validation_result: + 1-NEPTUNE-XML-1: "Conformité à la syntaxe XML suivant les recommandations du W3C." + 1-NEPTUNE-XML-2: "Conformité au schéma défini par la XSD du profil TRIDENT/NEPTUNE." + 2-NEPTUNE-Common-1: "Unicité des éléments objectId des différents objets d'un lot de fichiers Neptune." + 2-NEPTUNE-Common-2: "Unicité des éléments regitrationNumber des différents objets d'un lot de fichiers Neptune." + 2-NEPTUNE-Network-1: "Correcte référence à des lignes <Line> dans version du réseau <PTNetwork>." + 2-NEPTUNE-GroupOfLine-1: "Correcte référence à des lignes <Line> dans groupe de lignes <GroupOfLine>." + 2-NEPTUNE-StopArea-1: "Correcte référence à des arrêts <StopArea> et/ou à des points d'arrêt sur parcours <StopPoint> dans les arrêts <StopArea>." + 2-NEPTUNE-StopArea-2: "Correcte référence à des arrêts <StopArea> dans les arrêts <StopArea> de type StopPlace." + 2-NEPTUNE-StopArea-3: "Correcte référence à des arrêts <StopArea> dans les arrêts <StopArea> de type CommercialStopPoint." + 2-NEPTUNE-StopArea-4: "Correcte référence à des points d'arrêt sur parcours <StopPoint> dans les arrêts <StopArea> de type BoardingPosition ou Quay." + 2-NEPTUNE-StopArea-5: "Correcte référence à une position géographique <AreaCentroid> dans les arrêts <StopArea> de tout type StopPlace, CommercialStopPoint, BoardingPosition et Quay." + 2-NEPTUNE-StopArea-6: "référenceréciproque d'une position géographique <AreaCentroid> dans les arrêts <StopArea> de tout type StopPlace, CommercialStopPoint, BoardingPosition et Quay." + 2-NEPTUNE-ITL-1: "Correcte référence à des arrêts <StopArea> dans les arrêts <StopArea> de type ITL." + 2-NEPTUNE-ITL-2: "Correcte référence à des arrêts <StopArea> de type ITL dans la classe d’objets <ITL>." + 2-NEPTUNE-ITL-3: "Correcte référence à des arrêts <StopArea> dans la classe d’objets <ITL>." + 2-NEPTUNE-ITL-4: "Vérification du type de référence à des arrêts <StopArea> type ITL dans la classe d’objets <ITL>." + 2-NEPTUNE-ITL-5: "Bonne référence à la ligne <Line> dans la classe d’objets <ITL>." + 2-NEPTUNE-AreaCentroid-1: "Correcte référence à des arrêts <StopArea> dans la classe d’objets <AreaCentroid>." + 2-NEPTUNE-AreaCentroid-2: "Vérification du modèle de projection de référence utilisé." + 2-NEPTUNE-ConnectionLink-1: "Correcte référence aux arrêts <StopArea> définissant des tronçons de correspondance <ConnectionLink>." + 2-NEPTUNE-AccessPoint-1: "Correcte référence à un arrêt <StopArea> dans les accès <AccessPoint>." + 2-NEPTUNE-AccessPoint-2: "Correcte référence à un arrêt <StopArea> dans les accès <AccessPoint>." + 2-NEPTUNE-AccessPoint-3: "Existence de liens d'accès <AccessLink> sur les accès <AccessPoint>." + 2-NEPTUNE-AccessPoint-4: "Existence de liens d'accès <AccessLink> sur les accès <AccessPoint> de type 'in'." + 2-NEPTUNE-AccessPoint-5: "Existence de liens d'accès <AccessLink> sur les accès <AccessPoint> sur les accès de type 'out'." + 2-NEPTUNE-AccessPoint-6: "Existence de liens d'accès <AccessLink> sur les accès <AccessPoint> sur les accès de type 'inout'." + 2-NEPTUNE-AccessPoint-7: "Vérification du modèle de projection de référence utilisé." + 2-NEPTUNE-AccessLink-1: "Correcte référence aux arrêts <StopArea> et accès <AccessPoint> définissant des liens d'accès <AccessLink>." + 2-NEPTUNE-AccessLink-2: "Correcte référence aux arrêts <StopArea> et accès <AccessPoint> définissant des liens d'accès <AccessLink>." + 2-NEPTUNE-Line-1: "Correcte référence au réseau dans l'objet ligne <Line>." + 2-NEPTUNE-Line-2: "Correcte référence à un point d'arrêt sur parcours <StopPoint> comme terminus de ligne <Line>." + 2-NEPTUNE-Line-3: "Correcte référence à un point d'arrêt sur parcours <StopPoint> comme terminus de ligne <Line>." + 2-NEPTUNE-Line-4: "Correcte référence aux séquences d'arrêts <ChouetteRoute> dans l'objet ligne <Line>." + 2-NEPTUNE-Line-5: "Correcte référence aux séquences d'arrêts <ChouetteRoute> dans l'objet ligne <Line>." + 2-NEPTUNE-Route-1: "Existence des missions <JourneyPattern> référencées par la séquence d'arrêt <ChouetteRoute>." + 2-NEPTUNE-Route-2: "Existence des tronçons commerciaux <PtLink> référencés par la séquence d'arrêt <ChouetteRoute>." + 2-NEPTUNE-Route-3: "Existence de la séquence opposée <ChouetteRoute> référencée par la séquence d'arrêt <ChouetteRoute>." + 2-NEPTUNE-Route-4: "Correcte référence à un tronçon commercial <PtLink> dans une séquence d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-5: "Vérification que tous les points d'arrêts sur parcours sont rattachés à une séquence d'arrêts <ChouetteRoute> au départ d'un tronçon commercial <PtLink> et/ou à l'arrivée d'un autre tronçon commercial <PtLink> de la même séquence d'arrêts." + 2-NEPTUNE-Route-6: "Vérification du correct ordonnancement des points d'arrêts sur parcours <StopPoint> dans le chainage des tronçons <PtLink> d'une séquence d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-7: "référence mutuelle des missions <JourneyPattern> et des séquences d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-8: "Cohérence des références aux points d'arrêt des missions <JourneyPattern> et des séquences d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-9: "Utilité des points d'arrêts sur parcours des séquences d'arrêts <ChouetteRoute>." + 2-NEPTUNE-Route-10: "référence d'une séquence d'arrêts <ChouetteRoute> à une séquence d'arrêts opposée." + 2-NEPTUNE-Route-11: "Cohérence des sens de la référence d'une séquence d'arrêts <ChouetteRoute> à une séquence d'arrêts opposée." + 2-NEPTUNE-Route-12: "Cohérence des terminus de la référence d'une séquence d'arrêts <ChouetteRoute> à une séquence d'arrêts opposée." + 2-NEPTUNE-PtLink-1: "Existence des arrêts <StopPoint> référencés par les tronçons commerciaux <PTLink>." + 2-NEPTUNE-JourneyPattern-1: "Existence de la séquence d'arrêt <ChouetteRoute> référencée par la mission <JourneyPattern>." + 2-NEPTUNE-JourneyPattern-2: "Existence des arrêts <StopPoint> référencés par la mission <JourneyPattern>." + 2-NEPTUNE-JourneyPattern-3: "Existence de la ligne <Line> référencée par la mission <JourneyPattern>." + 2-NEPTUNE-StopPoint-1: "Existence de la ligne <Line> référencée par l'arrêt <StopPoint>." + 2-NEPTUNE-StopPoint-2: "Existence du réseau <PTNetwork> référence par l'arrêt <StopPoint>." + 2-NEPTUNE-StopPoint-3: "Existence de l'arrêt <StopArea> référencé par l'arrêt <StopPoint>." + 2-NEPTUNE-StopPoint-4: "Vérification du modèle de projection de référence utilisé." + 2-NEPTUNE-Timetable-1: "Utilité des calendriers." + 2-NEPTUNE-Timetable-2: "Utilité des calendriers." + 2-NEPTUNE-VehicleJourney-1: "Existence de la séquence d'arrêt <ChouetteRoute> référencée par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-2: "Existence de la mission <JourneyPattern> référencée par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-3: "Existence de la ligne <Line> référencée par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-4: "Existence de l'opérateur <Company> référencé par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-5: "Existence de la tranche horaire <TimeSlot> référencée par la course <VehicleJourney>." + 2-NEPTUNE-VehicleJourney-6: "Cohérence entre la course, la mission et la séquence d'arrêts." + 2-NEPTUNE-VehicleJourney-7: "Utilité des missions" + 2-NEPTUNE-VehicleJourneyAtStop-1: "Existence de l'arrêt <StopPoint> référencé par l'horaire <VehicleJourneyAtStop>." + 2-NEPTUNE-VehicleJourneyAtStop-2: "Existence de la course <VehicleJourney> référenceé par l'horaire <VehicleJourneyAtStop>." + 2-NEPTUNE-VehicleJourneyAtStop-3: "adéquation des horaires de la course à la séquence d'arrêts." + 2-NEPTUNE-VehicleJourneyAtStop-4: "adéquation des horaires de la course à la mission." + 2-NEPTUNE-Facility-1: "Existence de l'arrêt <StopArea> référencé par l'équipement <Facility>." + 2-NEPTUNE-Facility-2: "Existence de l'arrêt <StopArea> référencé par l'équipement <Facility>." + 2-NEPTUNE-Facility-3: "Existence de la ligne <Line> référencée par l'équipement <Facility>." + 2-NEPTUNE-Facility-4: "Existence de la correspondance <ConnectionLink> référencée par l'équipement <Facility>." + 2-NEPTUNE-Facility-5: "Existence de l'arrêt <StopPoint> référencé par l'équipement <Facility>." + 2-NEPTUNE-Facility-6: "Vérification du modèle de projection de référence utilisé." + 3-StopArea-1: "Vérification de la géolocalisation de tous les arrêts hors ITL" + 3-StopArea-2: "Vérification que 2 arrêts de noms différents en dehors d'un même regroupement d'arrêts ne sont pas trop proches" + 3-StopArea-3: "Vérification de l'unicité des arrêts" + 3-StopArea-4: "Vérification de la géolocalisation des arrêts" + 3-StopArea-5: "Vérification de la position relative des arrêts et de leur parent" + 3-AccessPoint-1: "Vérification de la géolocalisation de tous les accès" + 3-AccessPoint-2: "Vérification que deux accès de nom différents ne sont pas trop proches" + 3-AccessPoint-3: "Vérification de la proximité entre les accès et leur arrêt de rattachement" + 3-ConnectionLink-1: "Vérification de la proximité entre les deux arrêts d'une correspondance" + 3-ConnectionLink-2: "Vérification de la cohérence entre la distance fournie sur la correspondance et la distance géographique entre les deux arrêts de la correspondance" + 3-ConnectionLink-3: "Vérification de la vitesse de parcours entre les deux arrêts d'une correspondance" + 3-AccessLink-1: "Vérification de la proximité entre les deux extrémités d'un lien d'accès" + 3-AccessLink-2: "Vérification de la cohérence entre la distance fournie sur le lien d'accès et la distance géographique entre les deux extrémités du lien d'accès" + 3-AccessLink-3: "Vérification de la vitesse de parcours entre les deux extrémités d'un lien d'accès" + 3-Line-1: "Vérification de la non homonymie des lignes" + 3-Line-2: "Vérification de la présence de séquences d'arrêts sur la ligne" + 3-Route-1: "Vérification de la succession des arrêts de la séquence" + 3-Route-2: "Vérification de la séquence inverse" + 3-Route-3: "Vérification de la distance entre deux arrêts successifs de la séquence" + 3-Route-4: "Vérification de double définition de séquences" + 3-Route-5: "Vérification de séquences sans séquence opposée" + 3-Route-6: "Vérification de la présence d'arrêts dans la séquence" + 3-Route-7: "Vérification de la présence de missions" + 3-Route-8: "Vérification de l'utilisation des arrêts par les missions" + 3-Route-9: "Vérification de l’existence d’une mission passant par tous les arrêts de la séquence" + 3-JourneyPattern-1: "Vérification de l'utilisation des arrêts par les missions" + 3-JourneyPattern-2: "Vérification de l’existence d’une mission passant par tous les arrêts de la séquence" + 3-JourneyPattern-3: "Vérification de double définition de missions" + 3-VehicleJourney-1: "Vérification de la chronologie des horaires de passage à un arrêt" + 3-VehicleJourney-2: "Vérification de la vitesse de transfert entre deux arrêts" + 3-VehicleJourney-3: "Vérification de la cohérence des courses successives desservant deux mêmes arrêts" + 3-VehicleJourney-4: "Vérification de l'affectation des courses à un calendrier" + 3-Facility-1: "Vérification de la géolocalisation de tous les accès" + 3-Facility-2: "Vérification de la proximité entre les équipements et leur arrêt de rattachement" + 4-Network-1: "Vérification de contraintes sur les attributs des réseaux" + 4-Company-1: "Vérification de contraintes sur les attributs des transporteurs" + 4-GroupOfLine-1: "Vérification de contraintes sur les attributs des groupes de lignes" + 4-StopArea-1: "Vérification de contraintes sur les attributs des arrêts" + 4-StopArea-2: "Vérification de l'existance d'un arrêt commercial pour les arrêts physiques" + 4-AccessPoint-1: "Vérification de contraintes sur les attributs des accès" + 4-AccessLink-1: "Vérification de contraintes sur les attributs des liens d'accès" + 4-ConnectionLink-1: "Vérification de contraintes sur les attributs des correspondances" + 4-ConnectionLink-2: "Vérification des type d'arrêts en correspondance" + 4-Timetable-1: "Vérification de contraintes sur les attributs des calendiers" + 4-Line-1: "Vérification de contraintes sur les attributs des lignes" + 4-Line-2: "Vérification des modes de transport des lignes" + 4-Line-3: "Vérification des groupes de lignes d'une ligne" + 4-Line-4: "Vérification des séquences d'arrêts d'une ligne" + 4-Route-1: "Vérification de contraintes sur les attributs des séquences d'arrêt" + 4-JourneyPattern-1: "Vérification de contraintes sur les attributs des missions" + 4-VehicleJourney-1: "Vérification de contraintes sur les attributs des courses" + 4-VehicleJourney-2: "Vérification des modes de transport des courses" + severity: "Sévérité" + status: "Statut" + rule_level: "Niveau" + rule_target: "Objet" + rule_number: "Etape" + rule_code: "Code" + violation_count: "erreurs" + violation_count_txt: "Nombre d'erreurs" + objects: "Objets en erreur" + detail: "Détail" + title: "Titre du test" + object: "Objet en erreur" + resource: "Ressource de l'objet en erreur" + url: "URL" + first_violations: "Premières violations" + diff --git a/config/locales/validations.yml b/config/locales/validations.yml index 64fb381a3..241f6b323 100644 --- a/config/locales/validations.yml +++ b/config/locales/validations.yml @@ -16,6 +16,14 @@ en: show: report: "Report" validated_file: "Validated file" + title: "Neptune Validation" + summary: "Rapport de conformité à la norme NEPTUNE" + completed: "[ Completed ]" + failed: "[ Failed ]" + pending: "[ In the treatment queue ]" + processing: "[ In progress... ]" + export: "Download test report" + export_csv: "CSV format" graph: files: title_zip: "Validation results for files in zip" @@ -48,7 +56,7 @@ en: warning: "Warning" error: "Error" fatal: "Fatal" - activerecord: + activemodel: models: validation: zero: "validation" @@ -108,6 +116,16 @@ fr: show: report: "Rapport" validated_file: "Fichier validé" + title: "Validation Neptune" + summary: "Rapport de conformité à la norme NEPTUNE" + details: "Détails" + parameters: "Paramètres des tests" + completed: "[ Terminé ]" + failed: "[ Echoué ]" + pending: "[ En file d'attente ]" + processing: "[ En progression... ]" + export: "Télécharger les résultats" + export_csv: "Format CSV" graph: files: title_zip: "Résultat de validation des fichiers du zip" @@ -154,7 +172,7 @@ fr: warning: "Alerte" error: "Erreur" fatal: "Fatal" - activerecord: + activemodel: models: validation: zero: "validation" diff --git a/config/routes.rb b/config/routes.rb index d2d24dfe3..af126e0e5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -94,9 +94,17 @@ ChouetteIhm::Application.routes.draw do end resources :validations do + member do + get 'export', defaults: { format: 'zip' } + end + member do + get 'rule_parameter_set' + end collection do get 'references' end + + resources :validation_results end resources :compliance_check_tasks do diff --git a/db/schema.rb b/db/schema.rb index 2db2e8c17..d83924c0a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -70,8 +70,8 @@ ActiveRecord::Schema.define(version: 20150413071835) do t.integer "referential_id" t.string "token" t.string "name" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "companies", force: true do |t| @@ -128,8 +128,8 @@ ActiveRecord::Schema.define(version: 20150413071835) do t.datetime "failed_at" t.string "locked_by" t.string "queue" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree @@ -281,8 +281,8 @@ ActiveRecord::Schema.define(version: 20150413071835) do create_table "organisations", force: true do |t| t.string "name" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "data_format" end @@ -304,8 +304,8 @@ ActiveRecord::Schema.define(version: 20150413071835) do create_table "referentials", force: true do |t| t.string "name" t.string "slug" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "prefix" t.string "projection_type" t.string "time_zone" @@ -342,8 +342,8 @@ ActiveRecord::Schema.define(version: 20150413071835) do create_table "rule_parameter_sets", force: true do |t| t.text "parameters" t.string "name" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.integer "organisation_id", limit: 8 end @@ -481,8 +481,8 @@ ActiveRecord::Schema.define(version: 20150413071835) do t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.integer "organisation_id" t.string "name" t.string "confirmation_token" |
