null Determina n°528 del 10/10/2012
Si è verificato un errore nell'elaborarazione del modello.
Can't convert this string to number: "1930.00." The blamed expression: ==> str?number [in template "34140#34167#36811" at line 102, column 22] ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign x = str?number [in template "34140#34167#36811" in function "formatEuro" at line 102, column 9] - Reached through: ${formatEuro(amount.getData())} [in template "34140#34167#36811" at line 361, column 152] ----
1<#-- instanceId -->
2<#assign instanceId = themeDisplay.getPortletDisplay().getId()?keep_after("INSTANCE_") />
3
4<#-- etichette -->
5<#assign label_determina = languageUtil.get(locale, "label_determina") />
6<#assign label_numero = languageUtil.get(locale, "label_numero") />
7<#assign label_del = languageUtil.get(locale, "label_del") />
8<#assign label_date = languageUtil.get(locale, "label_date") />
9<#assign label_data_atto = languageUtil.get(locale, "label_data_atto") />
10<#assign label_data_ultima_modifica = languageUtil.get(locale, "label_data_ultima_modifica") />
11<#assign label_cup = languageUtil.get(locale, "label_cup") />
12<#assign label_cig = languageUtil.get(locale, "label_cig") />
13<#assign label_importo = languageUtil.get(locale, "label_importo") />
14<#assign label_documenti = languageUtil.get(locale, "label_documenti") />
15<#assign label_ulteriori_informazioni = languageUtil.get(locale, "label_ulteriori_informazioni") />
16<#assign label_ultimo_aggiornamento = languageUtil.get(locale, "label_ultimo_aggiornamento") />
17
18<#assign label_condividi = languageUtil.get(locale, "label_condividi") />
19<#assign label_vedi_azioni = languageUtil.get(locale, "label_vedi_azioni") />
20<#assign label_argomenti = languageUtil.get(locale, "label_argomenti") />
21<#assign label_facebook = languageUtil.get(locale, "label_facebook") />
22<#assign label_twitter = languageUtil.get(locale, "label_twitter") />
23<#assign label_linkedin = languageUtil.get(locale, "label_linkedin") />
24<#assign label_whatsapp = languageUtil.get(locale, "label_whatsapp") />
25<#assign label_stampa = languageUtil.get(locale, "label_stampa") />
26<#assign label_invia = languageUtil.get(locale, "label_invia") />
27<#assign label_indice_pagina = languageUtil.get(locale, "label_indice_pagina") />
28
29<#assign label_vai_sezione = languageUtil.get(locale, "label_vai_sezione") />
30<#assign label_vai_alla_pagina = languageUtil.get(locale, "label_vai_alla_pagina") />
31<#assign label_documento = languageUtil.get(locale, "label_documento") />
32<#assign label_data = languageUtil.get(locale, "label_data") />
33
34<#-- Ricavo servizi utili in seguito -->
35<#-- Servizo per ricavare le categorie -->
36<#assign catLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
37<#-- Servizio per ricavare dati del journal article -->
38<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
39<#-- Servizio per ricavare il nome del gruppo corrente -->
40<#assign groupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService") />
41<#-- Nome del sito -->
42<#assign currentGroupName = groupLocalService.getGroup(groupId).getName(locale) />
43<#-- Servizio per ricavare l'oggetto layout -->
44<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
45
46<#-- Ricavo alcuni meta dati associati all'articolo -->
47<#-- Ricavo article id -->
48<#assign articleId = .vars['reserved-article-id'].data />
49<#-- Ricavo il titolo -->
50<#assign titolo = .vars['reserved-article-title'].data />
51<#assign titolo = escapeExtraChar(titolo) />
52
53<#-- Altri dati associati all'articolo che ricavo tramite API -->
54<#assign article = journalArticleLocalService.getArticle( groupId, articleId ) />
55
56<#-- Data ultima modifica articolo -->
57<#assign articleModifiedDateObj = article.getModifiedDate() />
58<#if validator.isNotNull(articleModifiedDateObj)>
59 <#assign articleModifiedDate = dateUtil.getDate(articleModifiedDateObj, "dd/MM/yyyy, hh:mm", locale) />
60</#if>
61
62<#-- Url Title journal article -->
63<#assign articleUrlTitle = article.getUrlTitle() />
64<#-- Primary key journal article -->
65<#assign articlePrimKey = article.resourcePrimKey/>
66
67<#-- Se il carattere indicato è il prefisso della categoria, indica che la stessa non deve essere mostrata a video, ma viene solo usata per scopi funzionali -->
68<#assign PREFIX_SERVICE_CATEGORY = "_" />
69
70<#-- Ricavo tutte le categorie associate ad un articolo a meno di quelle che hanno un prefisso "_" -->
71<#function getCategoryByArticlePrimKey articlePrimKey>
72 <#assign tmp = "" />
73 <#assign articleCatNames = catLocalService.getCategories("com.liferay.journal.model.JournalArticle", getterUtil.getLong(articlePrimKey)) />
74 <#if (articleCatNames?size > 0)>
75 <#list articleCatNames as category>
76 <#if category.name?substring(0,1) != PREFIX_SERVICE_CATEGORY >
77 <#assign tmp = tmp + category.name + ", " />
78 </#if>
79 </#list>
80 <#assign tmp = tmp?keep_before_last(",") />
81 </#if>
82 <#return tmp>
83</#function>
84
85<#-- Variante: restituisce solo la lista di oggetti category -->
86<#function getListCategoryByArticlePrimKey articlePrimKey>
87 <#assign listCategories = [] />
88 <#assign articleCat = catLocalService.getCategories("com.liferay.journal.model.JournalArticle", getterUtil.getLong(articlePrimKey)) />
89 <#if (articleCat?size > 0)>
90 <#list articleCat as category>
91 <#if category.name?substring(0,1) != PREFIX_SERVICE_CATEGORY >
92 <#assign listCategories = listCategories + [category] />
93 </#if>
94 </#list>
95 </#if>
96 <#return listCategories>
97</#function>
98
99<#-- Funzione formatta euro -->
100<#function formatEuro amount>
101 <#assign str = amount?replace("\\.","" "r")?replace(",","." "r")>
102 <#assign x = str?number>
103 <#return x?string[",##0.00"]>
104</#function>
105
106<#-- Funzione escape su stringa -->
107<#function escapeExtraChar text>
108 <#return text?replace("\"",""", "r")?replace("'","’", "r")>
109</#function>
110
111<#-- Verifico se il primo elemento di una lista esiste -->
112<#function firstOfListNotEmpty list>
113 <#assign result = false />
114 <#if list?? && list?has_content && list.getSiblings()?has_content && list.getSiblings()?first.getData()?has_content>
115 <#assign result = true />
116 </#if>
117 <#return result>
118</#function>
119
120<#-- Verifico che ci sia almeno un elemento in lista -->
121<#function oneAtLeastOfListNotEmpty list>
122 <#assign esito = false />
123 <#if list?? && list?has_content && list.getSiblings()?has_content>
124 <#list list.getSiblings() as cur_elem>
125 <#if cur_elem.getData()?has_content>
126 <#assign esito = true />
127 <#break>
128 </#if>
129 </#list>
130 </#if>
131 <#return esito>
132</#function>
133
134<#-- parso tutte le date della struttura -->
135<#-- data dell'atto -->
136<#if validator.isNotNull(start_date) && validator.isNotNull(start_date.getData())>
137 <#assign start_date_string = getterUtil.getString(start_date.getData()) />
138 <#if validator.isNotNull(start_date_string) && start_date_string?trim != "">
139 <#assign start_date_DateObj = dateUtil.parseDate("yyyy-MM-dd", start_date.getData(), locale) />
140 <#assign start_date_res = dateUtil.getDate(start_date_DateObj, "dd MMMM yyyy", locale) />
141 <#assign start_date_compact = dateUtil.getDate(start_date_DateObj, "dd-MMM-yy", locale) />
142 </#if>
143</#if>
144
145<#-- data ultima modifica dell'atto -->
146<#if validator.isNotNull(last_modification_date) && validator.isNotNull(last_modification_date.getData())>
147 <#assign last_modification_date_string = getterUtil.getString(last_modification_date.getData()) />
148 <#if validator.isNotNull(last_modification_date_string) && last_modification_date_string?trim != "">
149 <#assign last_modification_date_DateObj = dateUtil.parseDate("yyyy-MM-dd", last_modification_date.getData(), locale) />
150 <#assign last_modification_date_res = dateUtil.getDate(last_modification_date_DateObj, "dd MMMM yyyy", locale) />
151 <#assign last_modification_date_compact = dateUtil.getDate(last_modification_date_DateObj, "dd-MMM-yy", locale) />
152 </#if>
153</#if>
154
155<#-- HTML -->
156<section class="comuni-scheda scheda-determina">
157 <div class="container">
158
159 <#-- intro scheda + funzionalita trasversali -->
160 <div class="row">
161 <div class="offset-lg-1 col-lg-6 col-md-8">
162 <section class="intro-sezione">
163 <#-- titolo scheda -->
164 <#assign titoloScheda = escapeExtraChar(titolo) />
165 <#if validator.isNotNull(title) && validator.isNotNull(title.getData())>
166 <h2 class="titolo-sezione">${title.getData()}</h2>
167 <#assign titoloScheda = escapeExtraChar(title.getData()) />
168 </#if>
169
170 <#if (validator.isNotNull(number) && validator.isNotNull(number.getData())) || start_date_res?has_content>
171 <div class="sottotitolo-sezione">
172 <#if validator.isNotNull(number) && validator.isNotNull(number.getData())><span>${label_numero}</span> <strong>${number.getData()}</strong></#if><#if start_date_res?has_content> <span>${label_del}</span> <strong>${start_date_res}</strong></#if>
173 </div>
174 </#if>
175 </section>
176 </div>
177
178 <#-- blocco funzionalita trasversali -->
179 <div class="offset-lg-1 col-lg-3 col-md-4">
180 <#-- condivisione sui social -->
181 <#assign currentPageURL = themeDisplay.getPortalURL()+themeDisplay.getURLCurrent() />
182 <#assign companyName = themeDisplay.getCompany().getName() />
183
184 <#assign twitterUrl = "http://twitter.com/share?text=${companyName} - ${titoloScheda} &url=${currentPageURL}" />
185 <#assign facebookUrl = "http://www.facebook.com/sharer/sharer.php?u=${currentPageURL}" />
186 <#assign linkedinUrl = "https://www.linkedin.com/shareArticle?mini=true&url=${currentPageURL}&title=${companyName} - ${titoloScheda}" />
187 <#assign whatsappUrl = "https://api.whatsapp.com/send?text=${companyName} - ${titoloScheda} - ${currentPageURL}" />
188
189 <#-- condivisione social -->
190 <div class="dropdown d-inline share-functions">
191 <button class="btn btn-dropdown dropdown-toggle btn-sm" type="button" id="shareActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
192 <svg class="icon">
193 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-share"></use>
194 </svg>
195 <span>${label_condividi}</span>
196 </button>
197
198 <div class="dropdown-menu shadow-lg" aria-labelledby="shareActions">
199 <div class="link-list-wrapper">
200 <ul class="link-list">
201 <li>
202 <a class="list-item" href="${facebookUrl}" target="_blank">
203 <svg class="icon icon-sm">
204 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-facebook"></use>
205 </svg>
206 <span>${label_facebook}</span>
207 </a>
208 </li>
209 <li>
210 <a class="list-item" href="${twitterUrl}" target="_blank">
211 <svg class="icon icon-sm">
212 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-twitter"></use>
213 </svg>
214 <span>${label_twitter}</span>
215 </a>
216 </li>
217 <li>
218 <a class="list-item" href="${linkedinUrl}" target="_blank">
219 <svg class="icon icon-sm">
220 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-linkedin"></use>
221 </svg>
222 <span>${label_linkedin}</span>
223 </a>
224 </li>
225 <li>
226 <a class="list-item" href="${whatsappUrl}" target="_blank">
227 <svg class="icon icon-sm">
228 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-whatsapp"></use>
229 </svg>
230 <span>${label_whatsapp}</span>
231 </a>
232 </li>
233 </ul>
234 </div>
235 </div>
236 </div>
237
238 <#-- stampa + invia via email -->
239 <#assign subjectEmail = companyName+" - "+titoloScheda />
240 <#assign bodyEmail = currentPageURL />
241
242 <div class="dropdown d-inline other-functions">
243 <button class="btn btn-dropdown dropdown-toggle btn-sm" type="button" id="viewActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
244 <svg class="icon">
245 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-more-items"></use>
246 </svg>
247 <span>${label_vedi_azioni}</span>
248 </button>
249 <div class="dropdown-menu shadow-lg" aria-labelledby="viewActions">
250 <div class="link-list-wrapper">
251 <ul class="link-list">
252 <li>
253 <a class="list-item" href="javascript:void(0);" onclick="window.print();">
254 <svg class="icon icon-sm">
255 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-print"></use>
256 </svg>
257 <span>${label_stampa}</span>
258 </a>
259 </li>
260 <li>
261 <a class="list-item" href="mailto:?subject=${subjectEmail}&body=${bodyEmail}">
262 <svg class="icon icon-sm">
263 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-mail"></use>
264 </svg>
265 <span>${label_invia}</span>
266 </a>
267 </li>
268 </ul>
269 </div>
270 </div>
271 </div>
272
273 <#-- categorie -->
274 <#assign categorie = [] />
275
276 <#-- recupero l'elenco delle categorie da visualizzare -->
277 <#assign categorie = getListCategoryByArticlePrimKey(articlePrimKey) />
278
279 <#if categorie?? && (categorie?size > 0)>
280 <div class="mt-4 mb-4">
281 <h6>${label_argomenti}</h6>
282 <#list categorie as cur_cat>
283 <#if validator.isNotNull(cur_cat) && cur_cat != "">
284 <div class="chip chip-simple chip-primary no-link">
285 <span class="chip-label">${cur_cat.getName()}</span>
286 </div>
287 </#if>
288 </#list>
289 </div>
290 </#if>
291 </div>
292 </div>
293 </div>
294
295 <#-- dettaglio scheda -->
296 <div class="container">
297 <div class="row">
298 <div class="col">
299 <section class="dettaglio-scheda border-top">
300 <div class="row">
301 <#-- menu ancore sinistra -->
302 <div class="col-lg-3 col-md-4">
303 <aside class="left-anchor-menu">
304
305 <h4 class="left-anchor-menu-header" id="${instanceId}_${articleId}_left-anchor-menu-header" data-toggle="collapse" data-target="#${instanceId}_${articleId}_left-anchor-menu" aria-expanded="true" aria-controls="${instanceId}_${articleId}_left-anchor-menu">
306 <span>${label_indice_pagina}</span>
307 <svg class="icon icon-sm">
308 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-arrow-up"></use>
309 </svg>
310 </h4>
311
312 <div class="left-anchor-menu-separator"><div class="left-anchor-menu-separator-inner"></div></div>
313
314 <div id="${instanceId}_${articleId}_left-anchor-menu" class="collapse show" aria-labelledby="${instanceId}_${articleId}_left-anchor-menu-header">
315 <div class="anchor-menu-wrapper">
316 <ul>
317 <#-- gia ricavato nella sezione principale della scheda -->
318 <#if start_date_compact?has_content || last_modification_date_compact?has_content>
319 <li class="anchor-item">
320 <a class="anchor-link" href="#${instanceId}_${articleId}_date" title="${label_vai_sezione} ${label_date}">${label_date}</a>
321 </li>
322 </#if>
323 <#-- sezione documenti -->
324 <#if oneAtLeastOfListNotEmpty(attachment)>
325 <li class="anchor-item">
326 <a class="anchor-link" href="#${instanceId}_${articleId}_attachments" title="${label_vai_sezione} ${label_documenti}">${label_documenti}</a>
327 </li>
328 </#if>
329 <#-- sezione ulteriori informazioni + ultimo aggiornamento -->
330 <li class="anchor-item">
331 <a class="anchor-link" href="#${instanceId}_${articleId}_further_information" title="${label_vai_sezione} ${label_ulteriori_informazioni}">${label_ulteriori_informazioni}</a>
332 </li>
333 </ul>
334 </div>
335 </div>
336 </aside>
337 </div>
338
339 <div class="col-lg-9 col-md-8">
340 <div class="border-left pl-md-4 pt-4">
341 <#-- sezione testo principale -->
342 <#if
343 (validator.isNotNull(description) && validator.isNotNull(description.getData())) ||
344 (validator.isNotNull(cup) && validator.isNotNull(cup.getData())) ||
345 (validator.isNotNull(amount) && validator.isNotNull(amount.getData()))
346 >
347 <article class="page-section">
348 <div class="row">
349 <div class="col-12">
350 <div class="page-section-text">
351 <#if validator.isNotNull(description) && validator.isNotNull(description.getData())>
352 ${description.getData()}
353 </#if>
354 <#if validator.isNotNull(cig) && validator.isNotNull(cig.getData())>
355 <div><strong>${label_cig} </strong>${cig.getData()}</div>
356 </#if>
357 <#if validator.isNotNull(cup) && validator.isNotNull(cup.getData())>
358 <div><strong>${label_cup} </strong>${cup.getData()}</div>
359 </#if>
360 <#if validator.isNotNull(amount) && validator.isNotNull(amount.getData())>
361 <div><strong>${label_importo} </strong>${formatEuro(amount.getData())} €</div>
362 </#if>
363 </div>
364 </div>
365 </div>
366 </article>
367 </#if>
368
369 <#-- sezione date dell' atto -->
370 <#if start_date_compact?has_content || last_modification_date_compact?has_content>
371 <article id="${instanceId}_${articleId}_date" class="page-section anchor-section">
372 <h4 class="h2">${label_date}</h4>
373 <div class="row">
374 <div class="col-12">
375 <div class="point-list-wrapper my-4">
376
377 <#-- data ultima modifica dell'atto -->
378 <#if last_modification_date_compact?has_content>
379 <#assign last_modification_date_split = last_modification_date_compact?split("-") />
380 <div class="point-list">
381 <div class="point-list-aside point-list-warning">
382 <div class="point-date">${last_modification_date_split[0]}</div>
383 <div class="point-month">${last_modification_date_split[1]}/${last_modification_date_split[2]}</div>
384 <#-- <div class="point-year">${last_modification_date_split[2]}</div> -->
385 </div>
386 <div class="point-list-content">
387 <div class="card m-0">
388 <div class="card-body">
389 <h5 class="h3 card-title m-0"><span>${label_data_ultima_modifica}</span></h5>
390 </div>
391 </div>
392 </div>
393 </div>
394 </#if>
395
396 <#-- data dell'atto -->
397 <#if start_date_compact?has_content>
398 <#assign start_date_split = start_date_compact?split("-") />
399 <div class="point-list">
400 <div class="point-list-aside point-list-warning">
401 <div class="point-date">${start_date_split[0]}</div>
402 <div class="point-month">${start_date_split[1]}/${start_date_split[2]}</div>
403 <#-- <div class="point-year">${start_date_split[2]}</div> -->
404 </div>
405 <div class="point-list-content">
406 <div class="card m-0">
407 <div class="card-body">
408 <h5 class="h3 card-title m-0"><span>${label_data_atto}</span></h5>
409 </div>
410 </div>
411 </div>
412 </div>
413 </#if>
414
415 </div>
416 </div>
417 </div>
418 </article>
419 </#if>
420
421 <#-- sezione documenti -->
422 <#if oneAtLeastOfListNotEmpty(attachment)>
423 <article id="${instanceId}_${articleId}_attachments" class="page-section anchor-section">
424 <h4 class="h2">${label_documenti}</h4>
425 <div class="row">
426 <#list attachment.getSiblings() as cur_attachment>
427 <#if validator.isNotNull(cur_attachment) && validator.isNotNull(cur_attachment.getData())>
428 <#attempt>
429
430 <#-- ricavo la size del documento -->
431 <#-- a partire dal link, lo splitto e ricavo il secondo ed il 5 argomento che mi servono per il metodo successivo -->
432 <#assign dlFileEntrySize = "" />
433 <#assign parts = (cur_attachment.getData())?split("/") />
434 <#assign groupId = parts[2] />
435 <#assign uuId = parts[5]?split("?")[0] />
436
437 <#assign dlFileEntryService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryLocalService') />
438 <#assign dlFileEntry = dlFileEntryService.getFileEntryByUuidAndGroupId(uuId,groupId?number) />
439
440 <#assign dlFileEntrySize = dlFileEntry.getSize() />
441 <#assign dlFileEntryExtension = dlFileEntry.getExtension()?upper_case?trim />
442
443 <#-- trasformo la dimensione in KB -->
444 <#if (dlFileEntrySize gt 0) >
445 <#assign dlFileEntrySize = (dlFileEntrySize / 1000) + " KB"/>
446 </#if>
447
448 <#-- ricavo il titolo dell'allegato: se nn c'è passo un titolo generico -->
449 <#assign attachment_header = label_documento />
450 <#if validator.isNotNull(cur_attachment.attachment_header) && validator.isNotNull(cur_attachment.attachment_header.getData()) >
451 <#assign attachment_header = cur_attachment.attachment_header.getData()?trim />
452 </#if>
453
454 <#-- visualizzo il link dell'allegato -->
455 <div class="col-lg-6">
456 <div class="card allegati-card">
457 <div class="card-body">
458 <div class="allegato d-flex">
459 <div class="icon-img-wrapper">
460 <svg class="icon">
461 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-clip"></use>
462 </svg>
463 </div>
464 <div class="text-wrapper pl-3">
465 <h5 class="h3 card-title m-0">
466 <a href="${cur_attachment.getData()}" target="_blank" title='File <#if dlFileEntryExtension != "">in formato ${dlFileEntryExtension}</#if> - ${dlFileEntrySize}'>
467 <strong>${attachment_header}</strong>
468 </a>
469 </h5>
470 <#if cur_attachment.attachment_description?? && validator.isNotNull(cur_attachment.attachment_description) && validator.isNotNull(cur_attachment.attachment_description.getData()) >
471 <div class="card-text"><small>${cur_attachment.attachment_description.getData()}</small></div>
472 </#if>
473 </div>
474 </div>
475 </div>
476 </div>
477 </div>
478 <#recover>
479 <#-- non visualizzo nulla -->
480 </#attempt>
481 </#if>
482 </#list>
483 </div>
484 </article>
485 </#if>
486
487 <#-- sezione ulteriori informazioni + data ultimo aggiornamento -->
488 <article id="${instanceId}_${articleId}_further_information" class="page-section anchor-section">
489 <h4 class="h2">${label_ulteriori_informazioni}</h4>
490 <#if validator.isNotNull(further_information) && validator.isNotNull(further_information.getData())>
491 <div class="row">
492 <div class="col-12">
493 <div class="callout">
494 <div class="callout-title">
495 <svg class="icon">
496 <use xlink:href="/o/comuni-theme/svg/sprite.svg#it-info-circle"></use>
497 </svg>
498 </div>
499 <div class="callout-text">
500 ${further_information.getData()}
501 </div>
502 </div>
503 </div>
504 </div>
505 </#if>
506 <#-- data ultimo aggiornamento -->
507 <div class="row">
508 <div class="col-12">
509 <p class="mb-0">${label_ultimo_aggiornamento}</p>
510 <p><strong>${articleModifiedDate}</strong></p>
511 </div>
512 </div>
513 </article>
514
515 </div>
516 </div>
517 </div>
518 </section>
519 </div>
520 </div>
521 </div>
522</section>