aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/assets/stylesheets/main/validations.css.scss200
-rw-r--r--app/controllers/compliance_check_controller.rb0
-rw-r--r--app/controllers/compliance_checks_controller.rb0
-rw-r--r--app/controllers/validation_results_controller.rb35
-rw-r--r--app/controllers/validations_controller.rb10
-rw-r--r--app/helpers/validation_results_helper.rb71
-rw-r--r--app/models/export.rb1
-rw-r--r--app/models/export_report.rb1
-rw-r--r--app/models/import.rb2
-rw-r--r--app/models/import_report.rb1
-rw-r--r--app/models/import_task.rb1
-rw-r--r--app/models/validation.rb55
-rw-r--r--app/models/validation_export.rb54
-rw-r--r--app/models/validation_report.rb117
-rw-r--r--app/views/compliance_check_tasks/show.html.erb2
-rw-r--r--app/views/exports/_export.erb4
-rw-r--r--app/views/imports/_import.erb4
-rw-r--r--app/views/shared/_header.erb2
-rw-r--r--app/views/validation_results/_validation_result.erb21
-rw-r--r--app/views/validation_results/index.html.erb75
-rw-r--r--app/views/validation_results/index.js.coffee8
-rw-r--r--app/views/validations/_validation.erb4
-rw-r--r--app/views/validations/detailed_errors_index.csv.erb2
-rw-r--r--app/views/validations/show.html.erb60
-rw-r--r--app/views/validations/show.js.coffee75
-rw-r--r--app/views/validations/summary_errors_index.csv.erb3
-rw-r--r--config/locales/exports.yml8
-rw-r--r--config/locales/imports.yml4
-rw-r--r--config/locales/validation_reports.yml690
-rw-r--r--config/locales/validations.yml22
-rw-r--r--config/routes.rb8
-rw-r--r--db/schema.rb24
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"