Durant tot el 2023 es mantenen les tarifes de 2022 i també la reducció dels preus de la T-4 i de totes les tipologies de T-usual, de T-jove i T-70/90 FM/FN.
Per a més informació, consulta la pàgina Reducció de preus de títols de transport.
T-usual bonificada
Error on line 41, column 1 in 20155#20195#51237 typeSelector.selectSingleNode(rootElement) is undefined. It cannot be assigned to option
1<#assign images_folder = request["theme-display"]["path-theme-images"]>
2<#assign apiTool = utilLocator.findUtil("tmb-hook", "cat.tmb.web.hook.service.TmbClientServiceTool")>
3<#attempt>
4 <#assign jTitlePrices = apiTool.getTarifesBitllet(groupId, codi_bitllet.getData())>
5 <#assign jTitle = jsonFactoryUtil.createJSONObject(jTitlePrices).getJSONObject("data").getJSONArray("titols").getJSONObject(0).getString("descripcioExtesa")>
6<#recover>
7 <#assign jTitlePrices = "">
8 <#assign jTitle = "">
9</#attempt>
10<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.portlet.journal.service.JournalArticleLocalService")>
11<#assign journalStructureLocalService = serviceLocator.findService("com.liferay.portlet.journal.service.JournalStructureLocalService")>
12<#assign structureService = serviceLocator.findService("com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalService")>
13<#assign classNameService = serviceLocator.findService("com.liferay.portal.service.ClassNameLocalService")>
14<#assign imagesFolder = request["theme-display"]["path-theme-images"]>
15<#assign groupId = getterUtil.getLong(groupId)>
16<#assign group = serviceLocator.findService("com.liferay.portal.service.GroupLocalService").getGroup(groupId)>
17<#assign domain = group.getExpandoBridge().getAttribute("MAPS_TMB_DOMAIN")>
18<#assign api_id = group.getExpandoBridge().getAttribute("API_ID")>
19<#assign api_key = group.getExpandoBridge().getAttribute("API_KEY")>
20<#assign equipmentCode = group.getExpandoBridge().getAttribute("ECOMMERCE_EQUIPMENT_CODE")>
21<#assign ecommerceDomain = group.getExpandoBridge().getAttribute("ECOMMERCE_DOMAIN")>
22<#assign ecommerceEndpoint = group.getExpandoBridge().getAttribute("ECOMMERCE_ENDPOINT")>
23<#assign urlCompra = languageUtil.get(locale, "context.ecommerce.url")>
24<#assign structureClassNameId = classNameService.getClassNameId("com.liferay.portlet.journal.model.JournalArticle")>
25<#assign curArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].getData())>
26<#assign structureId = getterUtil.getString(curArticle.getStructureId())>
27<#assign structure = structureService.fetchStructure(groupId, structureClassNameId, structureId)>
28<#--DDMStructure
29-->
30<#assign localizedFields = structure.getPersistentFieldsMap(locale)>
31<#assign document = saxReaderUtil.read(structure.getCompleteXsd())>
32<#-- Document
33-->
34<#assign rootElement = document.getRootElement()>
35<#-- Element
36-->
37<#assign xPathExpression = "//dynamic-element[@name='validesa_bitllet']/dynamic-element[@value='" + validesa_bitllet.getData() + "']/meta-data[@locale='" + locale + "']">
38<#assign typeSelector = saxReaderUtil.createXPath(xPathExpression)>
39<#-- XPath
40-->
41<#assign option = typeSelector.selectSingleNode(rootElement)>
42<#-- Node
43-->
44<#assign portalURL = request["theme-display"]["portal-url"]>
45<#assign DLAppServiceUtil = serviceLocator.findService("com.liferay.portlet.documentlibrary.service.DLAppService")>
46<#assign lang = locale.getLanguage()>
47<#assign String = "">
48
49<script type="text/javascript">
50 $(document).ready(function() {
51 Analytics.EnhancedEcommerce.loadEC();
52
53 var jsonResponse = JSON.parse('${jTitlePrices}');
54 if (jQuery.isEmptyObject(jsonResponse.data.titols)) {
55 $('#hdr_preus_zona, #preus_zona').hide();
56 }
57 else {
58 $('#hdr_preus_zona, #preus_zona').show();
59 }
60
61 jsonCallback2(jsonResponse);
62 <#if compra_online.is_compra_online.getData() != "true"> loadEcommerceDetall();
63 </#if>
64 $('.ticket-unit__actions .button').click(function() {
65 Analytics.EnhancedEcommerce.addProduct($(this).attr("data-code"), $(this).attr("data-name-bitllet"), 1, 'Detall del bitllet ' + $(this).attr("data-name-bitllet"));
66
67 Analytics.Ecommerce.eventPurchase.purchase('JOTMBE / Detall de bitllet', $(this).attr("data-name-bitllet"));
68 <#if saleTmobilitat?has_content && getterUtil.getBoolean(saleTmobilitat.getData())> var ecommerceURL = '${ecommerceDomain}/${lang}';
69 window.location.href = ecommerceURL;
70 <#else> var ecommerceURL = '${ecommerceDomain}/${lang}/${urlCompra}/${codi_bitllet.getData()}';
71 window.location.href = ecommerceURL;
72 </#if> });
73 });
74
75 function initCompraOnlineDetall(versionCode){
76 var bitlletCode = '${codi_bitllet.getData()}';
77 var ecommerceActive = false;
78 var ocultaBotoCompraOnline = '<#if oculta_compra?has_content>${oculta_compra.getData()}</#if>';
79
80 jQuery.ajax({
81 url : "${domain}/${ecommerceEndpoint}/v2/business-parameters/"+versionCode+"/catalog/product/parent-variants?equipmentCode=${equipmentCode}&app_id=${api_id}&app_key=${api_key}",
82 type : "GET",
83 dataType: "json",
84 success: function(data) {
85 var productsNoVariants = data.productsWithoutVariants;
86 var productsWithVariants = data.productsWithVariants;
87
88 for(var i in productsNoVariants){
89 var product = productsNoVariants[i];
90 var ticketCode = product.ticketCode;
91 var productCode = product.code;
92 if(bitlletCode == ticketCode){
93 $('.ticket-unit__actions .button.button--a').attr('data-name-bitllet', product.originalName);
94 $('.ticket-unit__actions .button.button--a').attr('data-code', productCode);
95 Analytics.EnhancedEcommerce.addImpression(productCode, product.originalName, 1, 'Detall del bitllet ' + product.originalName);
96 if(product.withPermissionToSell && ocultaBotoCompraOnline != 'true'){
97 $('.ticket-unit__actions').show();
98 ecommerceActive = true;
99 break;
100 }
101 }
102
103 }
104
105 if(!ecommerceActive){
106 for(var pv in productsWithVariants){
107 var productVariants = productsWithVariants[pv];
108 var productParentVariants = productVariants.productParentVariants;
109 for(var ppv in productParentVariants){
110 var productParent = productParentVariants[ppv];
111 var productWVCode = productParent.variantFieldGroupingValue;
112
113 if(bitlletCode == productWVCode){
114 var productVariantLanguages = productParent.parentProductVariantLanguages;
115 for(var pvl in productVariantLanguages){
116 var language = productVariantLanguages[pvl];
117 if(language.languageCode == "CAT"){
118 $('.ticket-unit__actions .button.button--a').attr('data-name-bitllet', language.shortName);
119 $('.ticket-unit__actions .button.button--a').attr('data-code', productWVCode);
120 Analytics.EnhancedEcommerce.addImpression(productWVCode, language.shortName, 1, 'Detall del bitllet ' + language.shortName);
121 break;
122 }
123 }
124
125 var showBtn = true;
126 for(var i in productParent.products){
127 var item = productParent.products[i];
128 if(!item.withPermissionToSell){
129 showBtn = false;
130 break;
131 }
132 }
133 if(showBtn && ocultaBotoCompraOnline != 'true'){
134 $('.ticket-unit__actions').show();
135 ecommerceActive = true;
136 break;
137 }
138 }
139 }
140 }
141 }
142
143
144 },
145 error : function(error) {
146 console.log(error);
147 }
148 });
149 }
150
151 function loadEcommerceDetall() {
152 jQuery.ajax({
153 url : "${domain}/${ecommerceEndpoint}/v2/business-parameters/versions?equipmentCode=${equipmentCode}&app_id=${api_id}&app_key=${api_key}",
154 type : "GET",
155 dataType: "json",
156 success: function(data) {
157 if(data.length > 0){
158 initCompraOnlineDetall(data[0].versionCode);
159 }
160 },
161 error : function(error) {
162 console.log(error);
163 }
164 });
165 }
166
167 function textCurrency(valor){
168 var preu;
169 if(valor != null && !isNaN(parseFloat(valor)) && isFinite(valor)){
170 if (valor % 1 == 0) {
171 preu = Math.floor(valor).toString();
172 } else {
173 preu = valor.toFixed(2);
174 }
175 if ('${lang}' == 'en') {
176 preu = '€' + preu;
177 } else {
178 preu = preu.replace('.',',') + ' €';
179 }
180 }else{
181 preu = "";
182 }
183 return preu;
184 }
185
186 function jsonCallback2(json){
187 var titolZones = json.data.titols[0].titolZones;
188 var valor = titolZones[0].preu;
189 var iszero = false;
190
191 if(valor==0) iszero = true;
192
193 var preu = textCurrency(valor);
194 if(preu!=""){
195 var isAbonament = '${is_abonament.getData()}' ? true : false;
196 var preuHtml = '';
197 if(!iszero){
198 preuHtml = '<strong><@liferay.language key="label.price"/>: </strong>' + (isAbonament ? "1 <@liferay.language key="label.zone"/> / " : "") + '<strong class="ticket-unit__data__price">'+ preu +'</strong>';
199 }
200 $("#preu").html(preuHtml);
201 }
202 if(titolZones.length>1 && !iszero){
203 $("#hdr_preus_zona").show();
204 $("#preus_zona").show();
205 mostraTaulaZonaPreus(titolZones);
206 $("totsElsPreus").show();
207 mostraLinkTotsPreus();
208 }else{
209 $("#hdr_preus_zona").hide();
210 $("#preus_zona").hide();
211 $("#totsElsPreus").hide();
212 }
213 }
214
215 function mostraTaulaZonaPreus(zones){
216 var textHeader = [];
217 for(i=0; i<zones.length; i++){
218 var numZona = zones[i].numeroZones;
219 textHeader[i] = numZona+((numZona==1)?' <@liferay.language key="label.zone"/>':' <@liferay.language key="label.zones"/>');
220 }
221
222 var taula = ' <div class="tablesaw-bar mode-stack"></div>'+'\n'+
223 ' <table class="table tablesaw tablesaw-stack u-collapse--bottom" data-tablesaw-mode="stack" summary="Sumari de la taula" id="table-6043" width="100%">'+'\n'+
224 ' <caption class="table__caption"><@liferay.language key="label.prices.area"/></caption>'+'\n'+
225 ' <thead class="table__head">'+'\n'+
226 ' <tr>'+'\n';
227
228 var today = new Date();
229 today.setHours(0);
230 today.setMinutes(0);
231 today.setSeconds(0);
232 today.setMilliseconds(0);
233
234 var isFirst = <#if saleTmobilitat?has_content>${getterUtil.getBoolean(saleTmobilitat.getData())?string("true", "false")}<#else>false</#if>;
235 var saleTmob = <#if saleTmobilitat?has_content>${getterUtil.getBoolean(saleTmobilitat.getData())?string("true", "false")}<#else>false</#if>;
236 var width = Math.trunc(100/zones.length);
237 var zonesTmob = saleTmob && <#if saleTmobilitat?has_content>${saleTmobilitat.getSiblings()?has_content?string("true", "false")}<#else>false</#if> ? <#if saleTmobilitat?has_content && saleTmobilitat.getSiblings()[0].zonesTmobilitat?has_content><#assign count = 1>[<#foreach item in saleTmobilitat.getSiblings()[0].zonesTmobilitat.options>${item}<#if count < saleTmobilitat.getSiblings()[0].zonesTmobilitat.options?size>,</#if><#assign count = count + 1></#foreach>]<#else>""</#if> : false;
238
239 for(i=0; i<zones.length; i++){
240 var dataInici = new Date(zones[i].dataInici);
241 var isDate = !isNaN(dataInici.getTime());
242 if(isDate){
243 dataInici.setHours(0);
244 dataInici.setMinutes(0);
245 dataInici.setSeconds(0);
246 dataInici.setMilliseconds(0);
247 }
248 if(isFirst){
249 isFirst = false;
250 taula += ' <th class="smallSizeTh" scope="col" >'+textHeader[i]+'</th>'+'\n';
251 taula += ' <th class="bigSizeTh" scope="col" width="'+width+'%"><div style = "display: flex;align-items: center;">'+textHeader[i]+'<img src="${images_folder}/gallery_pages/28px/svg/Suport_T-m Copy@1,5x.svg" style="margin-left:15%"></div></th>'+'\n';
252 }
253 else if((dataInici<=today && isDate) || !isDate){
254 if(saleTmob && zonesTmob.includes(i+1)) {
255 taula += ' <th class="smallSizeTh" scope="col" >'+textHeader[i]+'</th>'+'\n';
256 taula += ' <th class="bigSizeTh" scope="col" width="'+width+'%"><div style = "display: flex;align-items: center;">'+textHeader[i]+'<img src="${images_folder}/gallery_pages/28px/svg/Suport_T-m Copy@1,5x.svg" style="margin-left:15%"></div></th>'+'\n';
257 } else {
258 taula += ' <th class="bigSizeTh" scope="col" width="'+width+'%">'+textHeader[i]+'</th>'+'\n';
259 taula += ' <th class="smallSizeTh" scope="col" >'+textHeader[i]+'</th>'+'\n';
260 }
261 }
262 }
263 taula += ' </tr>'+'\n'+
264 ' </thead>'+'\n'+
265 ' <tbody class="table__body">'+'\n'+
266 ' <tr>'+'\n';
267 isFirst = <#if saleTmobilitat?has_content>${getterUtil.getBoolean(saleTmobilitat.getData())?string("true", "false")}<#else>false</#if>;
268 for(i=0; i<zones.length; i++){
269 if(!isNaN(zones[i].preu)){
270 var preuZona = textCurrency(zones[i].preu);
271 var dataInici = new Date(zones[i].dataInici);
272 var isDate = !isNaN(dataInici.getTime());
273 if(isDate){
274 dataInici.setHours(0);
275 dataInici.setMinutes(0);
276 dataInici.setSeconds(0);
277 dataInici.setMilliseconds(0);
278 }
279 if((dataInici<=today && isDate) || !isDate ){
280 if(isFirst){
281 isFirst = false;
282 taula += '<td><span aria-hidden="true" class="tablesaw-cell-label"><div style = "display: flex;align-items: center;">'+textHeader[i]+'<img src="${images_folder}/gallery_pages/28px/svg/Suport_T-m Copy@1,5x.svg" style="margin-left:15%"></div></span><span class="tablesaw-cell-content">'+preuZona+'</span></td>'+'\n';
283 } else {
284 if(saleTmob && zonesTmob.includes(i+1)) {
285 taula += '<td><span aria-hidden="true" class="tablesaw-cell-label"><div style = "display: flex;align-items: center;">'+textHeader[i]+'<img src="${images_folder}/gallery_pages/28px/svg/Suport_T-m Copy@1,5x.svg" style="margin-left:15%"></div></span><span class="tablesaw-cell-content">'+preuZona+'</span></td>'+'\n';
286 } else {
287 taula += '<td><span aria-hidden="true" class="tablesaw-cell-label">'+textHeader[i]+'</span><span class="tablesaw-cell-content">'+preuZona+'</span></td>'+'\n';
288 }
289 }
290
291 }
292 }
293 }
294 taula += ' </tr>'+'\n'+
295 ' </tbody>'+'\n'+
296 ' </table>'+'\n'+
297 getTableFooter() +
298 ' <ul class="list list--links list--links-a u-content--right">'+'\n'+
299 ' <li class="list__item"><a class="list__label" href="${link_mapa_zones.getFriendlyUrl()}" href="${en_titol_mapa_de_zones.getData()}"><@liferay.language key="label.see.zone.map"/></a></li>'+'\n'+
300 ' </ul>'+'\n';
301
302 $("#preus_zona").html(taula);
303 }
304
305 function mostraLinkTotsPreus(){
306 var totsElsPreus = '<ul class="list list--links list--links-a">'+'\n'+
307 ' <li class="list__item"><a class="list__label" href="#hdr_preus_zona"><@liferay.language key="label.see.prices"/></a></li>'+'\n'+
308 '</ul>';
309 $("#totsElsPreus").html(totsElsPreus);
310 }
311
312 function getTableFooter() {
313 <#if zones_footer?has_content && zones_footer.getData()?has_content>
314 var footer = '<div style="padding-top:5px; padding-bottom: 15px;">'+'\n'+
315 '<span style="font-size:small;">'+'\n'+
316 '${zones_footer.getData()}'+'\n'+
317 '</span>'+'\n'+
318 '</div>'+'\n';
319 return footer;
320 <#else> return "";
321 </#if> }
322
323 function showCode(path) {
324 var imagePath = "https://${portalURL}"+path;
325 var text = '<a target="_blank" href="'+imagePath+'"><img src="'+imagePath+'"/></a>';
326 $("#content-see-code .list__label").click();
327 $("#dialog .dialog__container").html('<p>'+htmlEscape(text)+'</p>');
328 }
329
330 function htmlEscape(str) {
331 return str
332 .replace(/&/g, '&')
333 .replace(/"/g, '"')
334 .replace(/'/g, ''')
335 .replace(/</g, '<')
336 .replace(/>/g, '>');
337 }
338</script>
339
340
341<!-- Columna dreta -->
342<div class="ticket-unit">
343 <div class="ticket-unit__container">
344 <div class="ticket-unit__media">
345 <#if !imatge_bitllet.getData()?has_content>
346 <img class="ticket-unit__image" src="${imagesFolder}/figures/img-avis.png" alt="">
347 <#else>
348 <img class="ticket-unit__image" src="${imatge_bitllet.getData()}" alt="${alt_imatge_bitllet.getData()}">
349 </#if>
350 </div>
351 <div class="ticket-unit__content" data-bitllet-code="${codi_bitllet.getData()}">
352 <ul class="ticket-unit__data">
353 <#if num_viatges.getData() != "null">
354 <li class="ticket-unit__data__item">
355 <strong>
356 <@liferay.language key="label.number.trips"/>
357 : </strong>
358 ${num_viatges.getData()}</li>
359 </#if>
360 <#if validesa_bitllet?has_content && validesa_bitllet.getData()?has_content>
361 <li class="ticket-unit__data__item">
362 <strong>
363 <@liferay.language key="label.validity"/>
364 : </strong>
365 ${option.getStringValue()}</li>
366 </#if>
367 <li id="preu" class="ticket-unit__data__item">
368 </li>
369 <#if saleTmobilitat?has_content && getterUtil.getBoolean(saleTmobilitat.getData())>
370 <#if tmobilitat_available.getData()?has_content && tmobilitat_available.getData()?trim?has_content>
371 <li class="ticket-unit__data__item">
372 ${tmobilitat_available.getData()}</li>
373 </#if>
374 <li class="ticket-unit__data__item">
375 <div class="container-applestore-image-elements">
376 <img src="${images_folder}/basic/24px/svg/ico-apple-store-black.svg" alt="App Store">
377 <div class="text-applestore-image">
378 <span class="Available-on-the">
379 <@liferay.language key="label.tickets.available-at-store"/>
380 </span>
381 <span class="App-Store">
382 App Store</span>
383 </div>
384 <div class="Rectangle">
385 </div>
386 <img src="${images_folder}/basic/24px/svg/ico-google-play.svg" alt="Google Play">
387 <div class="text-applestore-image">
388 <span class="Available-on-the">
389 <@liferay.language key="label.tickets.available-at-store"/>
390 </span>
391 <span class="App-Store">
392 Google Play</span>
393 </div>
394 </div>
395 </li>
396 <#if tmobilitat_info.getData()?has_content && tmobilitat_info.getData()?trim?has_content>
397 <li class="ticket-unit__data__item">
398 ${tmobilitat_info.getData()}</li>
399 </#if>
400 </#if>
401 </ul>
402 <#if compra_online.is_compra_online.getData() == "true">
403 <div class="ticket-unit__actions">
404 <p class="ticket-unit__note">
405 ${compra_online.text_descompte.getData()}</p>
406 <a class="button button--a" href="#"
407 title="${Visible_Title.getData()}" data-name-bitllet="" data-code="" rel="nofollow">
408 <@liferay.language key="label.buy.online"/>
409 </a>
410 </div>
411 <#else>
412 <div class="ticket-unit__actions" style="display: none";>
413 <p class="ticket-unit__note">
414 ${compra_online.text_descompte.getData()}</p>
415 <a class="button button--a" title="${Visible_Title.getData()}" rel="nofollow">
416 <@liferay.language key="label.buy.online"/>
417 </a>
418 </div>
419 </#if>
420 </div>
421 </div>
422</div>
423<#assign sortingFields = []>
424<#if ordre?has_content && ordre.descripcio_ordre.getData()?is_number>
425 <#assign sortField = ordre.descripcio_ordre.getData()?number>
426<#else>
427 <#assign sortField = 1000>
428</#if>
429<#assign sortingFields = sortingFields + [ { "title" : "descripcio", "sortingField" : sortField } ] >
430
431<#if ordre?has_content && ordre.avantatges_ordre.getData()?is_number>
432 <#assign sortField = ordre.avantatges_ordre.getData()?number>
433<#else>
434 <#assign sortField = 1000>
435</#if>
436<#assign sortingFields = sortingFields + [ { "title" : "avantatges", "sortingField" : sortField } ] >
437
438<#if ordre?has_content && ordre.requisits_ordre.getData()?is_number>
439 <#assign sortField = ordre.requisits_ordre.getData()?number>
440<#else>
441 <#assign sortField = 1000>
442</#if>
443<#assign sortingFields = sortingFields + [ { "title" : "requisits", "sortingField" : sortField } ] >
444
445<#if ordre?has_content && ordre.mapazones_ordre.getData()?is_number>
446 <#assign sortField = ordre.mapazones_ordre.getData()?number>
447<#else>
448 <#assign sortField = 1000>
449</#if>
450<#assign sortingFields = sortingFields + [ { "title" : "mapazones", "sortingField" : sortField } ] >
451
452<#if ordre?has_content && ordre.puntsdevenda_ordre.getData()?is_number>
453 <#assign sortField = ordre.puntsdevenda_ordre.getData()?number>
454<#else>
455 <#assign sortField = 1000>
456</#if>
457<#assign sortingFields = sortingFields + [ { "title" : "puntsdevenda", "sortingField" : sortField } ] >
458
459<#if ordre?has_content && ordre.altrestitols_ordre.getData()?is_number>
460 <#assign sortField = ordre.altrestitols_ordre.getData()?number>
461<#else>
462 <#assign sortField = 1000>
463</#if>
464<#assign sortingFields = sortingFields + [ { "title" : "altrestitols", "sortingField" : sortField } ] >
465
466<#foreach field in sortingFields?sort_by("sortingField")>
467 <#if field.title == "descripcio">
468 <#if descripcio_bitllet?has_content && descripcio_bitllet.getData()?has_content>
469 <#if descripcio_title?has_content && descripcio_title.getData()?has_content>
470 <h2 class="title title--2">
471 ${descripcio_title.getData()}</h2>
472 <#else>
473 <h2 class="title title--2">
474 <@liferay.language key="label.overview"/>
475 </h2>
476 </#if>
477 <div class="content u-spaced--bottom">
478 <p>
479 ${descripcio_bitllet.getData()}</p>
480 </div>
481 </#if>
482 <#elseif field.title == "avantatges">
483 <#if avantatges_bitllet.avantatge_bitllet.getSiblings()[0].getData()?has_content>
484 <#if avantatges_titol?has_content && avantatges_titol.getData()?has_content>
485 <h2 class="title title--2">
486 ${avantatges_titol.getData()}</h2>
487 <#else>
488 <h2 class="title title--2">
489 <@liferay.language key="label.benefits"/>
490 </h2>
491 </#if>
492 <div class="content u-spaced--bottom">
493 <ul class="list list--standard">
494 <#foreach avantatge in avantatges_bitllet.avantatge_bitllet.getSiblings()>
495 <li class="list__item">
496 ${avantatge.getData()}</li>
497 </#foreach>
498 </ul>
499 </div>
500 </#if>
501 <#elseif field.title == "requisits">
502 <#if requisits_bitllet?has_content && requisits_bitllet.getData()?has_content>
503 <#if requisits_titol?has_content && requisits_titol.getData()?has_content>
504 <h2 class="title title--2">
505 ${requisits_titol.getData()}</h2>
506 <#else>
507 <h2 class="title title--2">
508 <@liferay.language key="label.requirements"/>
509 </h2>
510 </#if>
511 <div class="content u-spaced--bottom">
512 <p>
513 ${requisits_bitllet.getData()}</p>
514 </div>
515 </#if>
516 <#if HTML_Structure_Content?has_content && HTML_Structure_Content.getData()?has_content>
517 <div class="content">
518 ${HTML_Structure_Content.getData()}
519 </div>
520 </#if>
521 <div id="content-see-code" style="display: none">
522 <a class="list__label" href="#" data-size="dialog--medium" data-dismiss="<@liferay.language key="label.close"/>
523 " data-src="http://example.com" data-rel="dialog" >
524 Dialog</a>
525 </div>
526 <ul class="list list--files">
527 <#assign knownFormats = ["pdf", "doc", "jpg", "mov", "zip"]>
528 <#if Document.getSiblings()?has_content>
529 <#foreach cur_docfile in Document.getSiblings()>
530 <#if cur_docfile.Document_URL?has_content && cur_docfile.Document_URL.getData()?has_content>
531 <#assign docUrlList = cur_docfile.Document_URL.getData()?split("/")>
532 <#assign docUrlUuidNum = getterUtil.getInteger(docUrlList?size)-1>
533 <#assign docUrlNameNum = getterUtil.getInteger(docUrlList?size)-2>
534 <#assign docClassUuid = docUrlList[docUrlUuidNum]>
535 <#assign docClassUuidData = docClassUuid?split("?")>
536 <#assign codeHTML = cur_docfile.HTML_Code.getData()>
537 <#if getterUtil.getInteger(docClassUuidData?size)>0>
538 <#assign docClassUuid = docClassUuidData[0]>
539 </#if>
540 <#assign fileExtension = "">
541 <#assign fileSize = "">
542 <#assign fileEntry = "">
543 <#if cur_docfile.Visible_Name.getData()?has_content>
544 <#assign docName = cur_docfile.Visible_Name.getData()>
545 <#else>
546 <#assign docName = docUrlList[docUrlNameNum]>
547 <#assign docName = stringUtil?replace(docName, "+", " ")>
548 </#if>
549 <#assign fileEntry = DLAppServiceUtil.getFileEntryByUuidAndGroupId(docClassUuid, groupId)>
550 <#assign fileSize = fileEntry.getSize()/1024>
551 <#assign fileVersion = fileEntry.getFileVersion()>
552 <#assign fileExtension = fileEntry.getExtension()?lower_case>
553 <#if knownFormats?seq_contains(fileExtension) && codeHTML != "true">
554 <#assign iconClass = "icon--file-" + fileExtension>
555 <#else>
556 <#assign iconClass = "icon--file-generic">
557 </#if>
558 <#assign accessibleDocName = "">
559 <#if !cur_docfile.Accessible_Name.getData() == "">
560 <#assign accessibleDocName = cur_docfile.Accessible_Name.getData()>
561 </#if>
562 <li class="list__item">
563 <#if codeHTML == "true">
564 <a onclick="showCode('${cur_docfile.Document_URL.getData()}')" class="file" href="#" title="${accessibleDocName}">
565 <span class="icon ${iconClass}">
566 </span>
567 <span class="file__name">
568 ${docName}</span>
569 <#if fileExtension?has_content && fileSize?has_content>
570 <span class="file__data">
571 [${fileExtension?upper_case}: ${fileSize} KB]</span>
572 </#if>
573 </a>
574 <#else>
575 <a class="file" href="${cur_docfile.Document_URL.getData()}" title="${accessibleDocName}" rel="external" target="_blank">
576 <span class="icon ${iconClass}">
577 </span>
578 <span class="file__name">
579 ${docName}</span>
580 <#if fileExtension?has_content && fileSize?has_content>
581 <span class="file__data">
582 [${fileExtension?upper_case}: ${fileSize} KB]</span>
583 </#if>
584 </a>
585 </#if>
586 </li>
587 </#if>
588 </#foreach>
589 </#if>
590 </ul>
591 <#elseif field.title == "mapazones">
592 <!-- s'omple per web service -->
593 <h2 id="hdr_preus_zona" class="title title--2" style="display: none">
594 <#if Visible_Title?has_content && Visible_Title.getData()?has_content>
595 ${languageUtil.format(locale, "label.prices.area.name", Visible_Title.getData())}
596 <#else>
597 ${languageUtil.get(locale, "label.prices.area")}
598 </#if>
599 </h2>
600 <div id="preus_zona" class="content u-spaced--bottom">
601 </div>
602 <#elseif field.title == "puntsdevenda">
603 <#if punts_de_venda.getSiblings()[0].element_text.getData()?has_content>
604 <#if puntsvenda_titol?has_content && puntsvenda_titol.getData()?has_content>
605 <h2 class="title title--2">
606 ${puntsvenda_titol.getData()}</h2>
607 <#else>
608 <h2 class="title title--2">
609 <@liferay.language key="label.points.sale"/>
610 </h2>
611 </#if>
612 <div class="content u-spaced--bottom">
613 <ul class="list list--standard u-collapse--bottom">
614 <#foreach punt in punts_de_venda.getSiblings()>
615 <#if !punt.external_url.getData()?has_content && !punt.internal_url.getData()?has_content>
616 <li class="list__item">
617 ${punt.element_text.getData()}</li>
618 </#if>
619 </#foreach>
620 </ul>
621 <ul class="list list--links-a">
622 <#foreach punt in punts_de_venda.getSiblings()>
623 <#if punt.external_url.getData()?has_content>
624 <li class="list__item">
625 <a class="list__label" href="${punt.external_url.getData()}" rel="external">
626 ${punt.element_text.getData()}</a>
627 </li>
628 <#elseif punt.internal_url.getData()?has_content>
629 <li class="list__item">
630 <a class="list__label" href="${punt.internal_url.getFriendlyUrl()}" title="${punt.en_titol.getData()}">
631 ${punt.element_text.getData()}</a>
632 </li>
633 </#if>
634 </#foreach>
635 </ul>
636 </div>
637 </#if>
638 <#elseif field.title == "altrestitols">
639 <#if other_titles.getSiblings()[0].text_other_title.getData()?has_content>
640 <#if altrestitols_titol?has_content && altrestitols_titol.getData()?has_content>
641 <h2 class="title title--2">
642 ${altrestitols_titol.getData()}</h2>
643 <#else>
644 <h2 class="title title--2">
645 <@liferay.language key="label.more.installments"/>
646 </h2>
647 </#if>
648 <div class="content u-spaced--bottom">
649 <ul class="list list--links-a">
650 <#foreach title in other_titles.getSiblings()>
651 <li class="list__item">
652 <a class="list__label" title="${title.en_altres_titols.getData()}" href="${title.url_other_title.getFriendlyUrl()}">
653 ${title.text_other_title.getData()}</a>
654 </li>
655 </#foreach>
656 </ul>
657 </div>
658 </#if>
659 </#if>
660</#foreach>
661<!-- Columna dreta -->
662<style>
663@media (max-width: 768px) {
664 .smallSizeTh{
665 display: block !important;
666 }
667
668 .bigSizeTh{
669 display: none !important;
670 }
671}
672@media (min-width: 768px) {
673 .smallSizeTh{
674 display: none !important;
675 }
676
677 .bigSizeTh{
678 display: table-cell !important;
679 }
680}
681</style>
Requisits
Per comprar la T-usual bonificada has d'anar personalment a un Punt TMB o als punts autoritzats d'altres operadors i presentar-hi l'original del DNI, NIE o passaport i el certificat que correspongui.
Has d'estar en situació d’atur i complir com a mínim una de les condicions següents:
Rebre un subsidi del Servei Públic d’Ocupació Estatal (SEPE) per import brut inferior a l'SMI
- Consulta quines prestacions o subsidis del Servei Públic d’Ocupació Estatal (SEPE) donen dret a comprar i a fer servir la T-usual bonificada per a persones en situació d’atur.
- Sol·licita un certificat on consti l'import mensual brut que cobres i fins quan tens dret a rebre la prestació a través de Certificats de prestacions. La data de finalització de la prestació ha de ser posterior a la data de la compra de la T-usual bonificada.
- La resta de pensions, subsidis i prestacions de la Seguretat Social no donen dret a adquirir ni a utilitzar la T-usual bonificada per aquest supòsit.
Ser en un procés actiu de cerca de feina i no cobrar cap ajut o cobrar-ne un d’import brut inferior a l'SMI
- Cal que hagis estat inscrit o inscrita com a demandant d’ocupació durant un mínim de 12 mesos en els darrers 2 anys i
- que estiguis en un procés actiu de cerca de feina en un programa del Servei d’Ocupació de Catalunya (SOC).
- Si cobres algun ajut, ha de tenir un import brut inferior al salari mínim interprofessional (SMI).
Si compleixes aquests requisits, l’Oficina de Treball emet, de forma digital, el certificat necessari perquè puguis comprar la T-usual bonificada del nombre de zones que necessitis (el preu és el mateix per a totes les zones). El SOC envia aquest certificat digital a l’Autoritat del Transport Metropolità (ATM). Per tant, només cal que aportis el document acreditatiu de la teva identitat.
Rebre ajuts dels serveis socials del municipi i no rebre'n cap de l'estat
- Si vius a un municipi de l’àmbit de l’Autoritat del Transport Metropolità de Barcelona i hi estàs empadronat o empadronada,
- et trobes en situació d’atur i en cerca activa de feina i
- reps algun ajut dels serveis socials del municipi.
Has de demanar, al teu ajuntament, un certificat on constin el teu nom complet, el DNI, NIE o passaport i que et trobes a l’atur i reps un ajut dels serveis socials d’aquell ajuntament. També has d'aportar el certificat del SOC (DARDO), on consta que et trobes en cerca activa de feina.
Pots consultar si el teu municipi pertany a l’àmbit de l’Autoritat del Transport Metropolità de Barcelona a la llista de municipis que hi ha a la pàgina Mapa per zones.
Més informació del teu interès
SMI
El salari mínim interprofessional (SMI) vigent és de 1080 € bruts al mes.
Cada quant cal aportar un nou certificat?
Tots els certificats s'han de presentar en un punt de venda de la T-usual abans que passin 30 dies naturals des de la data d'expedició.
Cada certificat dona dret a comprar un màxim de 3 T-usual bonificades en el termini de 105 dies des de la data d’expedició.
Cada quant i on es pot comprar la T-usual bonificada?
Entre la compra d’una T-usual bonificada i la següent han de passar 27 dies com a mínim.
La pèrdua o la sostracció de la T-usual no dona dret a rebre cap bescanvi ni a escurçar el termini mínim entre compra i compra.
Cada cop que compris una T-usual bonificada has de presentar el DNI, el NIE o el passaport original.
Pots comprar la T-usual en qualsevol punt de venda autoritzat, encara que no sigui el centre d’atenció al client on vas lliurar el certificat original.
Compra online i avantatges de gestió
Si t'has acreditat en un Punt TMB, també la pots comprar online, a TMB Tickets i a TMB App.
Sol·licita-la des del teu PC o qualsevol dispositiu mòbil. En dos dies feiners, rebràs la confirmació de compra, prèvia comprovació administrativa.
L’avantatge principal és que no caldrà que acudeixis a un Punt TMB a comprar, de forma presencial, la T-usual bonificada.
Quan disposis del perfil bonificat i compris online una T-usual bonificada per a persones en situació d'atur, rebràs un voucher (bitllet magnètic de compra digital i recollida en màquines expenedores) en el termini de 48 h. La compra online de la T-usual bonificada per a persones en situació d'atur es deshabilita uns dies abans del canvi de tarifes.
¿Puc autoritzar una altra persona perquè compri la T-usual bonificada per a mi?
No, la T-usual bonificada només la pot comprar la persona que té dret a utilitzar aquesta targeta.