Consum gasolina - Observatori de la mobilitat a Catalunya (OMC)
Consum gasolina
Consum de gasolina (automoció)
Unitat: ktep
Freqüència: Mensual
Àmbit: Catalunya; Província Barcelona
Font: CORES (Ministerio de Industria, Turismo y Comercio)
S'ha produït un error mentre es processava la plantilla.
The following has evaluated to null or missing: ==> NombreAbreviado [in template "20097#20123#88725" at line 762, column 36] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${NombreAbreviado.getData()} [in template "20097#20123#88725" at line 762, column 34] ----
1<#if (SinGrafico?? && SinGrafico.getData() == "true") >
2
3<#else >
4 <#assign eje=''>
5 <#if ejex?? && ejex.getData()!='' >
6 <#assign eje=ejex.getData()>
7 </#if>
8
9 <#assign journalArticleId = .vars['reserved-article-id'].data>
10 <#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
11 <#assign journalArticleResourceLocalServiceUtil = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")>
12 <#assign assetCategoryLocalServiceUtil = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
13 <#assign assetVocabularyLocalServiceUtil = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")>
14
15 <#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)/>
16 <#assign categoryList=assetCategoryLocalServiceUtil.getCategories("com.liferay.journal.model.JournalArticle",articleResourcePK) >
17 <#assign asset = assetEntryLocalService.getEntry('com.liferay.journal.model.JournalArticle', articleResourcePK) >
18
19 <#if (themeDisplay.getLanguageId() == 'es_ES')>
20 <#assign tabla_de_datos = 'Tabla de datos'/>
21 <#assign exportar_csv = 'Exportar CSV'>
22 <#assign ocultar_tabla_datos = 'Ocultar tabla de datos'>
23 <#assign indicador_por = 'Indicador por: '>
24 <#assign enero = 'Enero'>
25 <#assign febrero = 'Febrero'>
26 <#assign marzo = 'Marzo'>
27 <#assign abril = 'Abril'>
28 <#assign mayo = 'Mayo'>
29 <#assign junio = 'Junio'>
30 <#assign julio = 'Julio'>
31 <#assign agosto = 'Agosto'>
32 <#assign septiembre = 'Septiembre'>
33 <#assign octubre = 'Octubre'>
34 <#assign noviembre = 'Noviembre'>
35 <#assign diciembre = 'Diciembre'>
36 <#assign aeropuerto='aeropuerto'>
37 <#assign puerto= 'puerto'>
38 <#assign viaAccesoBcn='via acceso bcn'>
39 <#assign ambito='ámbito'>
40 <#assign ambitoterritorial='ámbito territorial'>
41 <#assign viapeaje='Vía Peaje'>
42 <#assign vialibrepeaje='vía libre peaje'>
43 <#assign estacion="estación">
44 <#assign tiposAportacion='Tipos de aportación'>
45 <#assign organismo="organismo">
46 <#assign año='año'>
47 <#assign mes='mes'>
48 <#assign motivo='motivo'>
49 <#assign genero='género'>
50 <#assign origendestino='origen/destino'>
51 <#assign recursoparamoverse='recurso para moverse'>
52 <#assign periodicidad='periodicidad'>
53 <#assign operador='operador'>
54 <#assign lineaferroviaria='linea ferroviária'>
55 <#assign empresaoperadora='empresa operadora'>
56 <#assign tipodeingreso='tipo de ingreso'>
57 <#assign tipodegasto='tipo de gasto'>
58 <#assign movilidadpoblacion='movilidad de la población'>
59 <#assign rangoedad='rango de edad'>
60 <#assign multimodalidad='multimodalidad'>
61 <#assign repartomodal='reparto modal'>
62 <#assign repartomodaldesagregado='reparto modal desagregado'>
63 <#assign motivodesagregado='motivo desagregado'>
64 <#assign discapacidad='discapacidad'>
65 <#assign gradodiscapacidad='grado de discapacidad'>
66 <#assign recursomovimiento='recurso para moverse'>
67 <#assign usotransportepublico='uso del transporte público'>
68 <#assign capitulos='capítulos'>
69 <#assign tipodecostes='tipo costes'>
70 <#assign hasta22='Hasta 22'>
71 <#assign hasta35='Hasta 35'>
72 <#assign hasta55='Hasta 55'>
73 <#assign mas55='Más de 55'>
74 <#assign hasta='Hasta'>
75 <#assign comarca='Comarca'>
76 <#assign ambitoterritorialcomarca='ámbito territorial_Comarca'>
77 <#assign ambitoterritorialsti= 'ámbito territorial_STI'>
78 <#assign urbanos='URBANOS'>
79 <#assign autopista='autopista'>
80 <#assign subcategoriadecostos="subcategoria de costos">
81 <#assign nombreparada="nombre parada">
82 <#assign administracion="administració">
83 <#assign porcentagedefinanciacion="porcentaje de financiación">
84
85 </#if>
86 <#if (themeDisplay.getLanguageId() == 'ca_ES')>
87 <#assign tabla_de_datos = 'Taula de dades'/>
88 <#assign exportar_csv = 'Exportar CSV'>
89 <#assign ocultar_tabla_datos = 'Amagar taula de dades'>
90 <#assign indicador_por = 'Indicador per: '>
91 <#assign enero = 'Gener'>
92 <#assign febrero = 'Febrer'>
93 <#assign marzo = 'Març'>
94 <#assign abril = 'Abril'>
95 <#assign mayo = 'Maig'>
96 <#assign junio = 'Juny'>
97 <#assign julio = 'Juliol'>
98 <#assign agosto = 'Agost'>
99 <#assign septiembre = 'Setembre'>
100 <#assign octubre = 'Octubre'>
101 <#assign noviembre = 'Novembre'>
102 <#assign diciembre = 'Desembre'>
103 <#assign aeropuerto='Aeroport'>
104 <#assign ambito='àmbit'>
105 <#assign ambitoterritorial='àmbit territorial'>
106 <#assign puerto= 'port'>
107 <#assign viaAccesoBcn='Via acces BCN'>
108 <#assign viapeaje='Via Peatge'>
109 <#assign vialibrepeaje='Via lliure peatge'>
110 <#assign estacion="Estació">
111 <#assign tiposAportacion='tipus d aportació'>
112 <#assign organismo="organisme">
113 <#assign año='any'>
114 <#assign mes='mes'>
115 <#assign motivo='motiu'>
116 <#assign genero='gènere'>
117 <#assign origendestino='origen/destinació'>
118 <#assign recursoparamoverse='recurs per moures'>
119 <#assign periodicidad='periodicitat'>
120 <#assign operador='operador'>
121 <#assign lineaferroviaria='línia ferroviària'>
122 <#assign empresaoperadora='empresa operadora'>
123 <#assign tipodeingreso="tipus d'ingrés">
124 <#assign tipodegasto='tipus de despesa'>
125 <#assign movilidadpoblacion='mobilitat de la població'>
126 <#assign rangoedad="rang d'edat">
127 <#assign multimodalidad='multimodalitat'>
128 <#assign repartomodal='repartiment modal'>
129 <#assign repartomodaldesagregado='repartiment modal desagregat'>
130 <#assign motivodesagregado='motiu desagregat'>
131 <#assign gradodiscapacidad='rang grau discapacitat'>
132 <#assign recursomovimiento='recurs per moures'>
133 <#assign usotransportepublico='ús del transport públic'>
134 <#assign capitulos='capítols'>
135 <#assign tipodecostes='tipus costos'>
136 <#assign discapacidad="discapacitat">
137 <#assign hasta22= 'Fins a 22'>
138 <#assign hasta35='Fins a 35'>
139 <#assign hasta55='Fins a 55'>
140 <#assign mas55='Més de 55'>
141 <#assign hasta='Fins'>
142 <#assign comarca='Comarca'>
143 <#assign ambitoterritorialcomarca='àmbit territorial_Comarca'>
144 <#assign ambitoterritorialsti= 'àmbit territorial_STI'>
145 <#assign urbanos='URBANES'>
146 <#assign autopista='autopista'>
147 <#assign subcategoriadecostos="subcategoria de costos">
148 <#assign nombreparada="nom parada">
149 <#assign administracion="administració">
150 <#assign porcentagedefinanciacion="percentatge de Finançament">
151 </#if>
152 <#if (themeDisplay.getLanguageId() == 'en_US')>
153 <#assign tabla_de_datos = 'Data table'/>
154 <#assign exportar_csv = 'Export CSV'>
155 <#assign ocultar_tabla_datos = 'Hide Data Table'>
156 <#assign indicador_por = 'Indicator by: '>
157 <#assign enero = 'January'>
158 <#assign febrero = 'February'>
159 <#assign marzo = 'March'>
160 <#assign abril = 'April'>
161 <#assign mayo = 'May'>
162 <#assign junio = 'June'>
163 <#assign julio = 'July'>
164 <#assign agosto = 'August'>
165 <#assign septiembre = 'September'>
166 <#assign octubre = 'October'>
167 <#assign noviembre = 'November'>
168 <#assign diciembre = 'December'>
169 <#assign aeropuerto= 'airport'>
170 <#assign puerto= 'port'>
171 <#assign viaAccesoBcn='access route bcn'>
172 <#assign ambito='scope'>
173 <#assign ambitoterritorial='territorial scope'>
174 <#assign viapeaje='Via toll'>
175 <#assign vialibrepeaje='Via toll free'>
176 <#assign estacion="station">
177 <#assign tiposAportacion='Assignment types'>
178 <#assign organismo="organism">
179 <#assign año='year'>
180 <#assign mes='month'>
181 <#assign motivo='motive'>
182 <#assign genero='gender'>
183 <#assign origendestino='origin/destination'>
184 <#assign recursoparamoverse='resource to move'>
185 <#assign periodicidad='periodicity'>
186 <#assign operador='operator'>
187 <#assign lineaferroviaria='railway line'>
188 <#assign empresaoperadora='operating company'>
189 <#assign tipodeingreso="type of income">
190 <#assign tipodegasto='type of expenditure'>
191 <#assign movilidadpoblacion='population mobility'>
192 <#assign rangoedad='age range'>
193 <#assign multimodalidad='multimodality'>
194 <#assign repartomodal='modal distribution'>
195 <#assign repartomodaldesagregado='disaggregated modal distribution'>
196 <#assign motivodesagregado='Disaggregated reason'>
197 <#assign discapacidad='disability'>
198 <#assign gradodiscapacidad='degree of disability'>
199 <#assign recursomovimiento='resource to move'>
200 <#assign usotransportepublico='use of public transport'>
201 <#assign capitulos='chapters'>
202 <#assign tipodecostes='types of costs'>
203 <#assign hasta22= 'Up to 22'>
204 <#assign hasta35='Up to 35'>
205 <#assign hasta55='Up to 55'>
206 <#assign mas55='Over 55'>
207 <#assign hasta='to'>
208 <#assign comarca='Region'>
209 <#assign ambitoterritorialcomarca='territorial scope_Region'>
210 <#assign ambitoterritorialsti= 'territorial scope_STI'>
211 <#assign urbanos='URBANES'>
212 <#assign autopista='highway'>
213 <#assign subcategoriadecostos="cost subcategory">
214 <#assign nombreparada="stop name">
215 <#assign administracion="administration">
216 <#assign porcentagedefinanciacion="percentage of financing">
217 </#if>
218
219
220 <#list categoryList as category>
221 <#--pre-- <#if category.categoryId ==88497>-->
222 <#if category.categoryId ==784011>
223 <#if (UrlIframeGráfica.getData()!="" && UrlIframeGráfica.getData()??)>
224
225 <#if UrlIframeGráfica.getData()?contains("https://datastudio.google.com")>
226 <div class="container mt-0 contanierIframe" id="contanierIframe">
227 <iframe src="${UrlIframeGráfica.getData()?replace("https://datastudio.google.com", "https://datastudio.google.com/embed")}" height="500" width="800" name="urlAlternativa">
228
229 </iframe>
230 </div>
231
232 <#else>
233 <div class="container mt-0 contanierIframe" id="contanierIframe">
234 <iframe src="${UrlIframeGráfica.getData()}" height="400" width="800" name="urlAlternativa">
235
236 </iframe>
237 </div>
238 </#if>
239
240 <#else>
241 <#if DocumentosYMultimediamepd?? >
242 <div class="container mt-0">
243<!-------tablas--- barras-------->
244 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
245<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
246<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.10.0/bootstrap-table.js"></script>
247<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.9.1/extensions/export/bootstrap-table-export.js"></script>
248<script src="https://rawgit.com/hhurz/tableExport.jquery.plugin/master/tableExport.js"></script>
249<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.9.1/extensions/filter-control/bootstrap-table-filter-control.js"></script>
250
251<div class="container">
252<div id="divBarras"></div>
253</div>
254<#assign url2=DocumentosYMultimediamepd.getData() />
255<script defer>
256
257function csvJSON(csv){
258
259 var lines=csv.split("\n");
260
261 var result = [];
262
263 // NOTE: If your columns contain commas in their values, you'll need
264 // to deal with those before doing the next step
265 // (you might convert them to &&& or something, then covert them back later)
266 // jsfiddle showing the issue https://jsfiddle.net/
267 var headers=lines[0].split(";");
268for (var i = 0; i < headers.length; i+=1) {
269if(headers[i].includes("valor") || headers[i].includes("Valor") ){
270 headers[i]="Valor"
271}
272}
273 for(var i=1;i<lines.length;i++){
274
275 var obj = {};
276 var currentline=lines[i].split(";");
277
278 for(var j=0;j<headers.length;j++){
279 if(currentline[j]!='' || currentline[j]!=null){
280 obj[headers[j]] = currentline[j];
281 }
282 }
283
284 result.push(obj);
285
286 }
287
288 //return result; //JavaScript object
289 return (result); //JSON
290}
291
292
293 async function throwfetch () {
294
295
296
297 await fetch(
298 "${url2}"
299 )
300 .then((response) => response.text())
301 .then((data) => genera_tabla(data))
302 .catch((error) => console.error("Error al obtener los datos:", error));
303 }
304 function genera_tabla(data) {
305
306
307 data = csvJSON(data);
308
309 // Obtener la referencia del elemento body
310 var body = document.getElementById("divBarras");
311 // Crea un elemento <table> añadiendole los atributos de la tabla y un elemento <tbody>
312 var tabla = document.createElement("table");
313 tabla.setAttribute("id", "table1");
314 tabla.setAttribute("data-toggle", "table");
315 tabla.setAttribute("data-search", "true");
316 tabla.setAttribute("data-filter-control", "true");
317 tabla.setAttribute("data-show-export", "true");
318 tabla.setAttribute("data-click-to-select", "true");
319 tabla.setAttribute("data-toolbar", "#toolbar");
320 tabla.setAttribute("data-pagination", "true");
321 tabla.classList.add("table-responsive");
322 var tbHead = document.createElement("thead");
323 var tr = document.createElement("tr");
324
325 var claves = Object.keys(data[0]);
326 claves.forEach((cabecera) => {
327 var th = document.createElement("th");
328 th.setAttribute("data-field", cabecera);
329 th.setAttribute("data-filter-control", "input");
330 th.setAttribute("data-sortable", true);
331 th.textContent = cabecera;
332 // Agregar la celda de cabecera a la fila de cabecera
333 tr.appendChild(th);
334 });
335 tbHead.appendChild(tr);
336 tabla.appendChild(tbHead);
337
338 var tblBody = document.createElement("tbody");
339 data.forEach((dato) => {
340 const fila = document.createElement("tr");
341 tblBody.appendChild(fila);
342
343 claves.forEach((cabecera) => {
344 const celda = document.createElement("td");
345 celda.textContent = dato[cabecera];
346 fila.appendChild(celda);
347 });
348 });
349 tabla.appendChild(tblBody);
350 // Agrega <table> dentro del <body>
351 body.appendChild(tabla);
352
353 var $table = $("#table1");
354 $table.bootstrapTable();
355 $(".export").click(function () {
356 $table.bootstrapTable("refreshOptions", {
357 exportDataType: "all",
358 });
359 });
360 }
361
362 $(function () {
363 throwfetch();
364
365 });
366</script>
367
368<link
369 rel="stylesheet"
370 href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.10.0/bootstrap-table.min.css"
371/>
372<link
373 rel="stylesheet"
374 href="https://rawgit.com/vitalets/x-editable/master/dist/bootstrap3-editable/css/bootstrap-editable.css"
375/>
376
377
378<style>
379 /* Ocultamos el buscador general */
380 .pull-right.search{
381 display: none;
382 }
383 #table1{
384 display: table;
385 }
386</style>
387
388
389
390 <!------fin tabla----------->
391 <div class="btn_container mb-3">
392 <!--<button id="viewDataTable" class="exportTable" >${tabla_de_datos}</button>
393 <button id="exportAsCSV" class="exportCsv">${exportar_csv}</button>-->
394 </div>
395 <div id="table_container_bar_sub" style="width: 100%;margin: 0 auto;margin: 0 auto;
396 overflow: auto" id="chartdata"></div>
397
398
399 <div id="container_select_bar_sub" class="none align-items-center d-flex">
400 <select id="select_any" class="select-grafic" >
401 </select>
402 <select id="select_ambit_territorial" class="none" >
403 </select>
404
405 </div>
406
407 <div id="chartdiv" style="width: 95%; height: 900px;margin:0 auto;margin-top: 20px;"></div>
408 <div id="legenddiv"></div>
409 </div>
410
411 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
412 <script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/4.1.2/papaparse.js"></script>
413 <script src="https://cdn.amcharts.com/lib/4/core.js"></script>
414 <script src="https://cdn.amcharts.com/lib/4/charts.js"></script>
415 <script src="https://cdn.amcharts.com/lib/4/themes/animated.js"></script>
416 <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/0.10.0/lodash.min.js"></script>
417 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
418 <script src="https://cdn.jsdelivr.net/npm/file-saver@2.0.2/dist/FileSaver.min.js"></script>
419
420 <script>
421
422
423
424 var dataOriginal
425 var subcategorias="${Subcategoria.getData()}".toLocaleLowerCase()
426 if(subcategorias!=''){
427 subcategorias=subcategorias.split(',')
428 }
429 var sub=[]
430 var any=''
431 var mes=''
432 var año='${año}'
433
434 if(subcategorias.length>0){
435 subcategorias.forEach(i=>{
436 if(i=='aeroport'||i=='aeropuerto'||i=='airport'){
437 sub.push('${aeropuerto}')
438 }else
439 if(i=='port'||i=='puerto'){
440 sub.push('${puerto}')
441 }else
442 if(i=='via acces bcn'||i=='via bcn access'||i=='vía acceso bcn'){
443 sub.push('${viaAccesoBcn}')
444 }else
445 if(i=='àmbit'||i=='ámbito'||i=='scope'){
446 sub.push('${ambito}')
447 } else
448 if(i=='àmbit territorial'||i=='territorial scope'||i=='ámbito territorial'){
449 sub.push('${ambitoterritorial}')
450 }else if(i=='via peatge'||i=='via peaje'||i=='via tolls'){
451 sub.push('${viapeaje}')
452 }else if(i=='via lliure peatge'|| i=='free toll road'||i=='vía libre peaje'){
453 sub.push('${vialibrepeaje}')
454 }else if(i=='estació'||i=='estación'||i=='station'){
455 sub.push('${estacion}')
456 } else if(i=='tipus d aportació'||i=='tipos de aportacion'||i=='types of contribution'){
457 sub.push('${tiposAportacion}')
458 }else if(i=='organisme'|| i=='organismo'|| i=='organism'){
459 sub.push('${organismo}')
460 }else if(i=='motiu'|| i=='motivo'|| i=='motive'){
461 sub.push('${motivo}')
462 }else if(i=='stop name'|| i=='nom parada'|| i=='nombre parada'){
463 sub.push('${nombreparada}')
464 }else{
465 sub.push(i)
466 }
467 })
468 }
469 subcategorias=sub
470 var csv
471
472
473
474 //creacion de selectores dinámicos
475 function generateSelector(val){
476 var values = val
477 var select = document.createElement("select");
478 select.name = "category";
479 select.id = "category"
480 select.classList.add("select-grafic");
481
482 for (const val of values) {
483 var option = document.createElement("option");
484 option.value = val;
485 option.text = val.charAt(0).toUpperCase() + val.slice(1);
486 select.appendChild(option);
487 }
488
489 var label = document.createElement("label");
490 label.innerHTML = "${indicador_por}"
491 label.htmlFor = "subtipo";
492 label.classList.add("d-flex");
493 label.classList.add("align-items-center");
494 label.classList.add("mb-0");
495
496 document.getElementById("container_select_bar_sub").appendChild(label).appendChild(select);
497 }
498
499 generateSelector(subcategorias)
500 //
501 var objData,myChart,dataFormat
502 var categoria_valor =document.getElementById('category')
503 var anio_valor =document.getElementById('select_any')
504
505 function arrayToTable(tableData) {
506 var table = $('<table class="table" style="border: 1px solid lightgray;"></table>');
507 $(tableData).each(function (i, rowData) {
508 var row = $('<tr></tr>');
509 $(rowData).each(function (j, cellData) {
510 row.append($('<td>'+cellData+'</td>'));
511 });
512 table.append(row);
513 });
514 return table;
515 }
516
517 var url='${DocumentosYMultimediamepd.getData()}'
518 var ambitoTerritorial=''
519 if (url!=undefined){
520 $.ajax({
521 type: "GET",
522 url: '${DocumentosYMultimediamepd.getData()}',
523 success: function (data) {
524
525 console.log("barras")
526 // $('#table_container').append(arrayToTable(Papa.parse(data).data));
527 // myChart=[Papa.parse(data).data]
528 objData= convertObj(data)
529 csv=data
530 objData.splice(objData.length-1, 1)
531 any=Object.keys(objData[0]).find(i=>{return(i=='año'||i=='any'||i=='year')})
532 ambitoTerritorial=Object.keys(objData[0]).find(i=>{return(i=='ámbito territorial'||i=='àmbit territorial'|| i=='territorial scope')})
533 valor=Object.keys(objData[0]).find(i=>{return(i=='valor'||i=='value')})
534 mes=Object.keys(objData[0]).find(i=>{return(i=='mes'||i=='month')})
535 objData.forEach((e)=>{
536 //e.valor=parseFloat(e.valor);
537 if(e[valor].includes('.')){
538 e[valor]=e[valor].replaceAll('.','')
539 }
540 })
541 objData.forEach((e)=>{
542 //e.valor=parseFloat(e.valor);
543 if(e[valor].includes(',')){
544 e[valor]=e[valor].replace(',','.')
545 }
546 })
547 console.log('bar-sub')
548 chartLine(objData)
549
550 }
551 });
552 }
553
554 function convertObj(data){
555 var arr=data.split('\n')
556 arr[0]=arr[0].toLowerCase()
557 var jsonObj = [];
558 var headers = arr[0].split(';');
559 for(var i = 1; i < arr.length; i++) {
560 var data = arr[i].split(';');
561 var obj = {};
562 for(var j = 0; j < data.length; j++) {
563 obj[headers[j].trim()] = data[j].trim();
564 }
565 jsonObj.push(obj);
566 }
567
568 return jsonObj
569
570 }
571 var columnsFiltered
572
573 function chartLine(objData){
574 var data=objData
575 //nombre de las columnas
576 var nameColumns=Object.getOwnPropertyNames(objData[0])
577 /*var indexCol
578 nameColumns.forEach((e)=>{
579 if(e!='any' && e!='génere' && e!='valor'){
580 indexCol=nameColumns.indexOf(e)
581 }
582 })*/
583 //convert months
584 var found = nameColumns.find(element => element=='mes');
585 if(found!=undefined){
586 objData.forEach(dat=>{
587 convertMonth(dat)
588 })
589 }else{
590 found = nameColumns.find(element => element=='${mes}');
591 if(found!=undefined){
592 objData.forEach(dat=>{
593 convertMonth(dat)
594 })
595 }
596 }
597 var foundAeroport=nameColumns.find(element=>element=='aeroport')
598 if(foundAeroport!=undefined){
599 objData.forEach(dat=>{
600 convertKey(dat,'aeroport','${aeropuerto}')
601 })
602 }
603 var foundPort=nameColumns.find(element=>element=='port')
604 if(foundPort!=undefined){
605 objData.forEach(dat=>{
606 convertKey(dat,'port','${puerto}')
607 })
608 }
609 var foundAccesoBcn=nameColumns.find(element=>element=='via acces bcn')
610 if(foundAccesoBcn!=undefined){
611 objData.forEach(dat=>{
612 convertKey(dat,'via acces bcn','${viaAccesoBcn}')
613 })
614 }
615 var foundAmbit=nameColumns.find(element=>element=='àmbit')
616 if(foundAmbit!=undefined){
617 objData.forEach(dat=>{
618 convertKey(dat,'àmbit','${ambito}')
619 })
620 }
621 var foundAmbitTerr=nameColumns.find(element=>element=='àmbit territorial')
622 if(foundAmbitTerr!=undefined){
623 objData.forEach(dat=>{
624 convertKey(dat,'àmbit territorial','${ambitoterritorial}')
625 })
626 }
627 var viaPeaje=nameColumns.find(element=>element=='via peatge')
628 if(viaPeaje!=undefined){
629 objData.forEach(dat=>{
630 convertKey(dat,'via peatge','${viapeaje}')
631 })
632 }
633 var vialibrePeaje=nameColumns.find(element=>element=='via lliure peatge')
634 if(vialibrePeaje!=undefined){
635 objData.forEach(dat=>{
636 convertKey(dat,'via lliure peatge','${vialibrepeaje}')
637 })
638 }
639 var estacion=nameColumns.find(element=>element=='estació')
640 if(estacion!=undefined){
641 objData.forEach(dat=>{
642 convertKey(dat,'estació','${estacion}')
643 })
644 }
645 var tipoAportacion=nameColumns.find(element=>element=='tipus d aportació')
646 if(tipoAportacion!=undefined){
647 objData.forEach(dat=>{
648 convertKey(dat,'tipus d aportació','${tiposAportacion}')
649 })
650 }
651 var organismo=nameColumns.find(element=>element=='organisme')
652 if(organismo!=undefined){
653 objData.forEach(dat=>{
654 convertKey(dat,'organisme','${organismo}')
655 })
656 }
657 var motivo=nameColumns.find(element=>element=='motiu')
658 if(motivo!=undefined){
659 objData.forEach(dat=>{
660 convertKey(dat,'motiu','${motivo}')
661 })
662 }
663 columnsFiltered=nameColumns
664 var indice = columnsFiltered.indexOf(any); // obtenemos el indice
665 columnsFiltered.splice(indice, 1);
666 var indice2 = columnsFiltered.indexOf(valor); // obtenemos el indice
667 columnsFiltered.splice(indice2, 1);
668
669
670
671 console.log(objData)
672 const unique = [...new Set(objData.map(item => item[any]))];
673 console.log(unique)
674 unique.sort((a,b)=>b-a);
675
676 var unique2= [...new Set(objData.map(item => item[ambitoTerritorial]))];
677 unique.sort((a,b)=>b-a);
678//si hay distintos años necesitamos un selector
679 if(unique.length>=1){
680 var selectcont=document.getElementById('container_select_bar_sub')
681 selectcont.className='d-flex align-items-center'
682 let sel = document.getElementById('select_any');
683 for (i = 0; i<=unique.length-1; i++) {
684 sel.innerHTML += '<option value="'+unique[i]+'">'+unique[i]+'</option>'
685 }
686
687 }
688
689 if(unique2[0]!=undefined){
690 var selectcont=document.getElementById('container_select_bar_sub')
691 selectcont.className='d-flex align-items-center'
692 let sel = document.getElementById('select_ambit_territorial');
693 sel.className='select-grafic'
694 for (i = 0; i<=unique2.length-1; i++) {
695 sel.innerHTML += '<option value="'+unique2[i]+'">'+unique2[i]+'</option>'
696 }
697
698 }
699
700//objeto separados por años
701 var newArrData
702 dataOriginal=data
703//var categoria_valor =document.getElementById('category')
704//var anio_valor =document.getElementById('select_any')
705 var data1=[]
706 if(anio_valor.value!=''&& anio_valor.value!=undefined){
707
708 newArrData=dataOriginal.filter((e)=>{
709 return e[any]==anio_valor.value
710 })
711 if(select_ambit_territorial.value!=''){
712 newArrData=newArrData.filter((e)=>{
713 return e['${ambitoterritorial}']==select_ambit_territorial.value
714 })
715 }
716 }
717 else{
718 newArrData =dataOriginal
719 }
720 var arrn=[];
721 newArrData.forEach((val)=>{
722 val[valor]=val[valor].replace(',','.');
723 arrn.push(val)
724 })
725 newArrData=arrn
726
727 let b= _.groupBy(newArrData,categoria_valor.value.toLowerCase());
728 var p=[];
729 var v={}
730 for (var key in b) {
731 var val={type:key,'data':(b[key])};
732 p.push(val)
733
734 }
735
736
737 var arrdata1= p.filter(x => x.type === selectAmbitoTerr.value);
738 if(arrdata1!=undefined&& arrdata1.length>0){
739 data1=arrdata1
740 }else{
741 data1=p
742 }
743
744
745
746
747 Bars(data1,categoria_valor.value,valor)
748
749 }
750
751 function Bars(arrd,category,valor){
752
753 console.log(arrd)
754 var newarr=[]
755 var objnew={}
756 //categorias posibles
757 var catobj=subcategorias.filter((e)=>{return e!=categoria_valor.value})
758 if (catobj.length==0){
759 catobj=columnsFiltered.filter((e)=>{return e!=categoria_valor.value})
760
761 }
762 if( '${NombreAbreviado.getData()}'=='TranAcces') {
763 if (categoria_valor.value == 'mes' || categoria_valor.value == 'month' || categoria_valor.value == '${viaAccesoBcn}') {
764 if (categoria_valor.value == 'mes' || categoria_valor.value == 'month') {
765 if (Object.keys(objData[0]).find(i => {
766 return (i == '${viaAccesoBcn}')
767 }) != undefined) {
768
769 valorName = Object.keys(objData[0]).find(i => {
770 return (i == 'valor' || i == 'value')
771 })
772 arrd.forEach((e) => {
773 objnew = {type: e.type}
774 for (var i = 0; i <= e.data.length - 1; i++) {
775 var cat = categoria_valor.value
776 _.groupBy(e.data, '${viaAccesoBcn}')
777 var arrGroup = Object.keys(_.groupBy(e.data, '${viaAccesoBcn}')).map(k => _.groupBy(e.data, '${viaAccesoBcn}')[k]);
778
779 arrGroup.forEach(t => {
780 var valorDa = 0
781 var name = t[0]['${viaAccesoBcn}']
782 t.forEach(name => {
783 valorDa += parseFloat(name[valorName]).toFixed(2)
784 })
785 var objkeys = {[name]: valorDa}
786 objnew = Object.assign(objnew, objkeys)
787
788 })
789
790 }
791 newarr.push(objnew)
792 })
793 }
794
795 } else if (categoria_valor.value == '${viaAccesoBcn}') {
796 if (Object.keys(objData[0]).find(i => {
797 return (i == '${viaAccesoBcn}')
798 }) != undefined) {
799
800 valorName = Object.keys(objData[0]).find(i => {
801 return (i == 'valor' || i == 'value')
802 })
803 arrd.forEach((e) => {
804 objnew = {type: e.type}
805 for (var i = 0; i <= e.data.length - 1; i++) {
806 var cat = categoria_valor.value
807 _.groupBy(e.data, '${mes}')
808 var arrGroup = Object.keys(_.groupBy(e.data, '${mes}')).map(k => _.groupBy(e.data, '${mes}')[k]);
809
810 arrGroup.forEach(t => {
811 var valorDa = 0
812 var name = t[0]['${mes}']
813 t.forEach(name => {
814 valorDa += parseFloat(name[valorName]).toFixed(2)
815 })
816 var objkeys = {[name]: valorDa}
817 objnew = Object.assign(objnew, objkeys)
818
819 })
820
821 }
822 newarr.push(objnew)
823 })
824 }
825 }
826 }
827 }else
828 {
829
830 arrd.forEach((e) => {
831 objnew = {type: e.type}
832 console.log(e.data)
833 for (var i = 0; i <= e.data.length - 1; i++) {
834 //objeto a array
835 var cat = categoria_valor.value
836 var t = Object.entries(e.data[i])
837 //nos qudamos con el resto de datos del objeto
838 var u = t.filter((e) => {
839 return e[0] != cat
840 })
841 var text = ''
842 var val = 0
843 catobj.forEach((key) => {
844 for (var a = 0; a <= u.length - 1; a++) {
845 if (key == u[a][0]) {
846 if (text != '') {
847 text = text + ' ' + u[a][1]
848 } else {
849
850 if (key != '${mes}') {
851 text = u[a][1]
852 } else {
853 text = u[a][1]
854 }
855 }
856 }
857 if (u[a][0] == [valor]) {
858 val = u[a][1] // val=parseInt(u[a][1] )
859 }
860 }
861 })
862 var objkeys = {[text]: val}
863 objnew = Object.assign(objnew, objkeys)
864 }
865 newarr.push(objnew)
866 })
867 }
868 console.log(newarr)
869 var returnedTarget={}
870 var ob=[]
871 newarr.forEach((e)=>{
872 /*var obj={zero:0};
873 return e=Object.assign(e,obj)*/
874 var o =Object.keys(e)
875 for (const key of Object.keys(e)) {
876 if( key!='type'){
877 ob.push(key)
878 }
879 }
880 returnedTarget = Object.assign(returnedTarget,ob);
881 })
882
883 //var t=Object.keys(newarr[0])
884 var t=returnedTarget
885 //removeItemFromArr( t, 'type' );
886 //removeItemFromArr( t, 'zero' );
887 var columns=[]
888 for (var [key, value] of Object.entries(t)) {
889 console.log(key + ' ' + value);
890 if(value=='type'){
891 delete t[key];
892 }else{
893 columns.push(value)
894 }
895 }
896
897 t=columns
898 for(var i = t.length -1; i >=0; i--){
899 if(t.indexOf(t[i]) !== i) t.splice(i,1);
900 }
901 //values inside obj
902 var obj2=[],lengthCat=[],uniqueValues=[]
903 catobj.forEach((e)=>{
904 uniqueValues=''
905 arrd.forEach(d=>{ //para cuando tengamos mas group
906 var r=[...new Set(d.data.map(item => item[e]))]
907 //uniqueValues.push(r)
908 uniqueValues=uniqueValues+r.join()+','
909 })
910 uniqueValues=uniqueValues+','
911 uniqueValues=uniqueValues.split(',')
912 uniqueValues= [...new Set(uniqueValues)];
913 var textUnique=uniqueValues.toString()
914 lengthCat.push( textUnique)
915
916 /*uniqueValues =[...new Set(arrd[0].data.map(item => item[e]))];
917 var textUnique=uniqueValues.toString()
918 lengthCat.push( textUnique)*/
919 })
920
921 for(var i=0;i<=lengthCat.length-1;i++){
922 var tval=lengthCat[i].split(',')
923 var o={val:tval.length,index:i}
924 obj2.push(o)
925 }
926
927
928 obj2.sort( compare );
929 //group series
930 var groupSeries=lengthCat[obj2[0].index]
931 if(groupSeries[0]=='${enero}'){
932 groupSeries="${enero},${febrero},${marzo},${abril},${mayo},${junio},${julio},${agosto},${septiembre},${octubre},${noviembre},${diciembre}"
933 }
934
935 if(groupSeries.includes('${hasta}')){
936 groupSeries="'${hasta22}','${hasta35}','${hasta55}','${mas55}'"
937 }
938
939 if(groupSeries=='${comarca}'){
940 var neObj=[]
941 newarr.forEach(d=>{
942 var obj
943 if(d['${ambitoterritorialcomarca}']!=undefined){
944 obj={'type':d.type, [valor]:d['${ambitoterritorialcomarca}']}
945 neObj.push(obj)
946 }else if(d['${ambitoterritorialsti}']!=undefined){
947 obj={'type':d.type, [valor]:d['${ambitoterritorialsti}']}
948 neObj.push(obj)
949 }
950
951
952 })
953 console.log(neObj)
954 newarr=neObj
955 }
956 if(groupSeries.includes('${urbanos}')){
957 var neObj=[]
958 newarr.forEach(d=>{
959 var obj
960 if(d.type=='undefined'){
961 d.type="${tipodeingreso}"
962 }
963
964
965 })
966 }
967
968 // Themes begin
969 am4core.useTheme(am4themes_animated);
970 // Themes end
971 am4core.addLicense("CH333277446");
972 // Create chart instance
973 var chart = am4core.create("chartdiv", am4charts.XYChart);
974
975 // Add data
976 /* if(newArrWithMonts.length>0){
977 chart.data = newArrWithMonts
978 }else{
979 chart.data = newarr
980 }*/
981 chart.data = newarr;
982 myChart=[chart]
983
984 // Create axes
985 var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
986 categoryAxis.dataFields.category = "type";
987 // Room for sub-category labels
988
989 categoryAxis.renderer.labels.template.marginTop = 20;
990 categoryAxis.renderer.grid.template.location = 0;
991 categoryAxis.tooltip.label.wrap = true;
992
993 /*
994 categoryAxis.events.on("sizechanged", function(ev) {
995 let axis = ev.target;
996 let cellWidth = axis.pixelWidth / (axis.endIndex - axis.startIndex);
997 axis.renderer.labels.template.maxWidth = cellWidth;
998 });*/
999 var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
1000 var eje0= '${eje}'
1001
1002 if(eje0!=null && eje0!=undefined && eje0!=''){
1003 valueAxis.min = parseInt(eje0);
1004
1005 valueAxis.strictMinMax = true;
1006 }
1007 //valueAxis.min = 0;
1008
1009
1010 // Configure axis label
1011 // var label = categoryAxis.renderer.labels.template;
1012 //label.wrap = true;
1013
1014 // label.maxWidth = 300;
1015 //label.wrap = true;
1016
1017 // label.maxWidth="Auto sizing text";
1018
1019 var labelIndicador = categoryAxis.renderer.labels.template;
1020 labelIndicador.wrap = true;
1021 labelIndicador.maxWidth = 120;
1022 // Create series
1023 function createSeries(field, name, stacked) {
1024 var series = chart.series.push(new am4charts.ColumnSeries());
1025 series.dataFields.valueY = field;
1026 series.dataFields.categoryX = "type";
1027 series.name = name;
1028
1029 if(series.name!=''){
1030 series.name=series.name[0].toUpperCase() + series.name.slice(1);
1031 }
1032 series.columns.template.tooltipText = "{name}: [bold]{valueY}[/]";
1033 series.stacked = stacked;
1034 }
1035
1036
1037 function createLabelSeries(name) {
1038 var series = chart.series.push(new am4charts.ColumnSeries());
1039 series.dataFields.valueY = name;//series.dataFields.valueY = "zero";
1040 series.dataFields.categoryX = "type";
1041 series.name = name;
1042 if(series.name!=''){
1043 series.name=series.name[0].toUpperCase() + series.name.slice(1);
1044 }
1045 series.hiddenInLegend = true;
1046
1047 var bullet = series.bullets.push(new am4charts.LabelBullet());
1048 // bullet.label.text = "{name}";
1049 bullet.label.hideOversized = false;
1050 bullet.label.paddingTop = 30;
1051 }
1052
1053 chart.maskBullets = false;
1054 chart.scrollbarX = new am4core.Scrollbar();
1055 chart.scrollbarY = new am4core.Scrollbar();
1056
1057 groupSeries=groupSeries.split(',')
1058
1059 if(groupSeries[0]=='${enero}'){
1060
1061 if(groupSeries[0]=='Comarca'){
1062 newarr.forEach(p=>{
1063 createSeries(p.valor, p.type,false);
1064 })
1065
1066 }else{
1067 t.forEach((serie)=>{
1068 //createLabelSeries(serie);
1069 // var tipo= ['motivo de viaje', 'medio de transporte', 'ámbito territorial', 'provincia']
1070 // ['reason for travel', 'mean of transport', 'territorial scope', 'province']
1071 // ['motiu de viatje', 'mode de transport', 'àmbit territorial', 'àmbit']
1072
1073 if(columnsFiltered.includes('motiu de viatje') && columnsFiltered.includes('mode de transport')
1074 ||columnsFiltered.includes('reason for travel') && columnsFiltered.includes('mean of transport')
1075 ||columnsFiltered.includes('motivo de viaje') && columnsFiltered.includes('medio de transporte') ){
1076 createSeries(serie, serie, true);
1077 }else
1078 createSeries(serie, serie, false);
1079 })
1080 }
1081 }else{
1082 //groupSeries.foreach
1083 t.forEach((serie)=>{
1084 if(serie!=''){
1085 //createLabelSeries(serie)
1086 createSeries(serie, serie, false);
1087 }
1088
1089 })
1090
1091 }
1092
1093 // Add legend
1094 chart.legend = new am4charts.Legend();
1095
1096 }
1097
1098 function removeItemFromArr ( arr, item ) {
1099 var i = arr.indexOf( item );
1100 arr.splice( i, 1 );
1101 }
1102 function compare( a, b ) {
1103 if ( a.val < b.val ){
1104 return -1;
1105 }
1106 if ( a.val > b.val ){
1107 return 1;
1108 }
1109 return 0;
1110 }
1111 function sumObjectsByKey(...objs) {
1112 return objs.reduce((a, b) => {
1113 for (let k in b) {
1114 if (b.hasOwnProperty(k))
1115 a[k] = (a[k] || 0) + b[k];
1116 }
1117 return a;
1118 }, {});
1119 }
1120 //select años
1121 var selectAny=document.getElementById("select_any");
1122 selectAny.addEventListener('change',
1123 function(){
1124 console.log(selectAny)
1125 any=Object.keys(objData[0]).find(i=>{return(i=='año'||i=='any'||i=='year')})
1126 var t=dataOriginal.filter((e)=>{return e[any]==selectAny.value})
1127 var amb=t.filter(x => x['${ambitoterritorial}']===selectAmbitoTerr.value )
1128 if(amb!=undefined && amb.length>0){
1129 t=amb
1130 }
1131 let b= _.groupBy(t, selectCategory.value); // repartiment modal n1
1132 var p=[];
1133 var v={}
1134 for (var key in b) {
1135 var val={type:key,'data':(b[key])};
1136
1137 p.push(val)
1138 }
1139 var data1=p
1140
1141 data1.forEach((val)=>{
1142 val.data.forEach(d=>{
1143 d[valor]=d[valor].replace(',','.');
1144 })
1145 })
1146
1147 Bars(data1,'category',valor)
1148 }
1149 )
1150
1151 //Select category
1152 var selectCategory=document.getElementById("category");
1153 selectCategory.addEventListener('change',
1154 function(){
1155 var selectAny=document.getElementById("select_any");
1156 console.log(selectAny)
1157 var t=dataOriginal.filter((e)=>{return e[año]==selectAny.value})
1158
1159 if(selectAmbitoTerr.value){
1160 var a=t.filter(x => x['${ambitoterritorial}']===selectAmbitoTerr.value )
1161 t=a
1162 }
1163
1164 let b= _.groupBy(t, selectCategory.value); // repartiment modal n1
1165 var p=[];
1166 var v={}
1167 for (var key in b) {
1168 var val={type:key,'data':(b[key])};
1169
1170 p.push(val)
1171 }
1172 var data1=p
1173
1174 Bars(data1,'category',valor)
1175 }
1176 )
1177 //select ambito territorial
1178 var selectAmbitoTerr=document.getElementById("select_ambit_territorial");
1179 selectAmbitoTerr.addEventListener('change',
1180 function(){
1181 console.log(selectAmbitoTerr)
1182 var t=dataOriginal.filter((e)=>{return e[año]==selectAny.value})
1183 b=t.filter(x => x['${ambitoterritorial}']===selectAmbitoTerr.value )
1184
1185 let b2= _.groupBy(b, selectCategory.value); // repartiment modal n1
1186 var p=[];
1187 var v={}
1188 for (var key in b2) {
1189 var val={type:key,'data':(b2[key])};
1190
1191 p.push(val)
1192 }
1193 var data1=p
1194
1195 data1.forEach((val)=>{
1196 val.data.forEach(d=>{
1197 d[valor]=d[valor].replace(',','.');
1198 })
1199 })
1200
1201 Bars(data1,categoria_valor.value,valor)
1202 }
1203 )
1204
1205 function convertMonth(data){
1206 if(data[mes]=='1'){
1207 data[mes]='${enero}'
1208 }
1209 if(data[mes]=='2'){
1210 data[mes]='${febrero}'
1211 }
1212 if(data[mes]=='3'){
1213 data[mes]='${marzo}'
1214 }
1215 if(data[mes]=='4'){
1216 data[mes]='${abril}'
1217 }
1218 if(data[mes]=='5'){
1219 data[mes]='${mayo}'
1220 }
1221 if(data[mes]=='6'){
1222 data[mes]='${junio}'
1223 }
1224 if(data[mes]=='7'){
1225 data[mes]='${julio}'
1226 }
1227 if(data[mes]=='8'){
1228 data[mes]='${agosto}'
1229 }
1230 if(data[mes]=='9'){
1231 data[mes]='${septiembre}'
1232 }
1233 if(data[mes]=='10'){
1234 data[mes]='${octubre}'
1235 }
1236 if(data[mes]=='11'){
1237 data[mes]='${noviembre}'
1238 }
1239 if(data[mes]=='12'){
1240 data[mes]='${diciembre}'
1241 }
1242 }
1243 function convertKey(data,oldName,newName) {
1244
1245 data[newName] = data[oldName];
1246 if(newName!=oldName){
1247 delete data[oldName];
1248 }
1249 }
1250 function downloadCSV (data2) {
1251 let data = data2
1252 var titulo="${Título.getData()}"+'.csv'
1253 let result = data;
1254
1255 var blob = new Blob(["\uFEFF"+csv], {
1256 type: 'text/csv; charset=utf-18',
1257 name: titulo
1258 });
1259
1260
1261 saveAs(blob, titulo);
1262 }
1263 //export dataTable and view table
1264
1265 var viewDataTable=document.getElementById("viewDataTable");
1266 viewDataTable.addEventListener('click',
1267 function(){
1268 var chartdata=document.getElementById("chartdata");
1269 if(chartdata.style.height==''){
1270 viewDataTable.textContent='${ocultar_tabla_datos}'
1271 chartdata.style.height='200px'
1272 chartdata.style.display=''
1273
1274 }else if(chartdata.style.height='auto'){
1275 chartdata.style.height=''
1276 chartdata.style.display='none'
1277 viewDataTable.textContent='${tabla_de_datos}'
1278 }
1279
1280 var data = csv
1281
1282 var lines = data.split("\n"),
1283 output = [],
1284 i;
1285 for (i = 0; i < lines.length; i++)
1286 output.push("<tr><td>" + lines[i].split(";").join("</td><td>") + "</td></tr>");
1287 output = "<table class='table table-striped table-hover table-sm'>" + output.join("") + "</table>";
1288
1289
1290 var div = document.getElementById('chartdata');
1291 div.innerHTML = output;
1292 div.className="tableStyle"
1293
1294 })
1295 var exportTable=document.getElementById("exportAsCSV");
1296 exportTable.addEventListener('click',
1297 function(){
1298 downloadCSV(csv)
1299 /*myChart.map((mychart, index) => {
1300 mychart.exporting.export("csv");
1301 }); */
1302 }
1303 )
1304
1305 </script>
1306
1307 </#if>
1308 </#if>
1309 </#if>
1310
1311 </#list>
1312</#if>
Vols reportar una incidència en les dades?
Si creus que hi ha informació incorrecta o dades equivocades, pots reportar la incidència perquè l’equip de l’OMC la revisi i procedeixi a la correcció de la mateixa.
Informar incidènciaCopiat