Um erro ocorreu enquanto processava o modelo.
The following has evaluated to null or missing:
==> PORTLET_NAME [in template "20102#20128#1144032" at line 51, column 28]
----
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: ${PORTLET_NAME} [in template "20102#20128#1144032" at line 51, column 26]
----
1<#if banner_label.getSiblings()?has_content>
2 <#assign desktop = "(min-width: 991px)" />
3 <#assign tablet = "(min-width: 767px)" />
4 <section class="banner-carousel internal-page" >
5 <div id="banner-carousel-${randomNamespace}" class="carousel slide row" data-ride="carousel">
6 <#if banner_label.getSiblings()?size gt 1>
7 <ol class="carousel-indicators">
8 <#list banner_label.getSiblings() as cur_bannerImg>
9 <li data-slide-to="${(cur_bannerImg?counter == 1)?then(0, (cur_bannerImg?counter - 1))}" data-target='#banner-carousel-${randomNamespace}' class="${(cur_bannerImg?counter == 1)?then('active', '')}"></li>
10 </#list>
11 </ol>
12 </#if>
13 <div class="carousel-inner">
14 <#list banner_label.getSiblings() as cur_banner>
15 <div class="carousel-item ${(cur_banner?counter == 1)?then('active', '')}">
16 <picture class="banner">
17 <source media='${desktop}' srcset='${cur_banner.banner_image_desktop.getData()}'/>
18 <source media='${tablet}' srcset='${cur_banner.banner_image_tablet.getData()}'/>
19 <img src='${cur_banner.banner_image_mobile.getData()}' class="w-100" />
20 </picture>
21 <div class="container carousel-caption">
22 <#if cur_banner.banner_position.getData()?has_content && cur_banner.banner_position.getData() != "">
23 <div class="vertical-align ${cur_banner.banner_position.getData()}">
24 <#else>
25 <div class="vertical-align left">
26 </#if>
27 <#if cur_banner.getData()?has_content && cur_banner.getData() != "">
28 <h2 class="title">${cur_banner.getData()}</h2>
29 </#if>
30 <#if cur_banner.banner_description.getData()?has_content && cur_banner.banner_description.getData() != "">
31 <p>${cur_banner.banner_description.getData()}</p>
32 </#if>
33
34 <#if cur_banner.banner_btn_link.getData()?has_content>
35 <a class="btn btn-primary" href="${cur_banner.banner_btn_link.getData()}" role="button" title="${cur_banner.banner_btn_description.getData()}" target="${banner_label.banner_link_target.getData()}">${cur_banner.banner_btn_description.getData()}</a>
36 </#if>
37
38 </div>
39 </div>
40 </div>
41 </#list>
42 </div>
43 </div>
44 </section>
45</#if>
46
47<!-- Fixer asset -->
48<script>
49(() => {
50 const PORTLET_NAME = 'com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet';
51 const PARAM_PREFIX = `_${PORTLET_NAME}_`;
52 const FRIENDLY_URL_BASE = '';
53
54 const getCurrentPath = () => window.location.pathname;
55
56 // Monta a URL "view_content.jsp" do Asset Publisher
57 const buildAssetUrl = (assetEntryId, assetType = 'content') => {
58 const params = new URLSearchParams();
59 params.set('p_p_id', PORTLET_NAME);
60 params.set('p_p_lifecycle', '0');
61 params.set('p_p_state', 'maximized');
62 params.set('p_p_mode', 'view');
63 params.set(`${PARAM_PREFIX}mvcPath`, '/view_content.jsp');
64 params.set(`${PARAM_PREFIX}assetEntryId`, assetEntryId);
65 params.set(`${PARAM_PREFIX}type`, assetType);
66 return `${getCurrentPath()}?${params.toString()}`;
67 };
68
69 // Considera "quebrado" todo link que volta pra própria página sem parâmetros de asset
70 const isBrokenAssetLink = (link) => {
71 if (!link.href) return false;
72 try {
73 const url = new URL(link.href, window.location.origin);
74 const sameHost = url.host === window.location.host;
75 const samePath = url.pathname === getCurrentPath();
76 const noAssetParam = !url.searchParams.has(`${PARAM_PREFIX}assetEntryId`);
77 return sameHost && samePath && noAssetParam;
78 } catch {
79 return false;
80 }
81 };
82
83 // Procura informações do asset no próprio <a> ou no contêiner do item (.asset-abstract, etc.)
84 const extractAssetInfo = (link) => {
85 const sources = [link, link.closest('[data-asset-entry-id], [data-assetentryid], .asset-abstract, .asset-entry, li, article')]
86 .filter(Boolean);
87
88 let id, type, friendlyUrl, friendlyPath;
89
90 for (const el of sources) {
91 const ds = el.dataset || {};
92 id = id || ds.assetEntryId || ds.assetentryid;
93 type = type || ds.assetType || ds.assettype;
94 friendlyUrl = friendlyUrl || ds.viewUrl || ds.friendlyUrl;
95 friendlyPath = friendlyPath || ds.urlTitle || ds.friendlyUrlTitle;
96 }
97
98 return {
99 id,
100 type: type || 'content',
101 friendlyUrl,
102 friendlyPath,
103 };
104 };
105
106 const fixLink = (link) => {
107 if (link.dataset.apFixed === 'true') return;
108 if (!isBrokenAssetLink(link)) return;
109
110 const { id, type, friendlyUrl, friendlyPath } = extractAssetInfo(link);
111
112 if (friendlyUrl) {
113 link.href = friendlyUrl;
114 } else if (FRIENDLY_URL_BASE && friendlyPath) {
115 link.href = `${FRIENDLY_URL_BASE}${friendlyPath}`;
116 } else if (id) {
117 link.href = buildAssetUrl(id, type);
118 } else {
119 return; // sem como reconstruir
120 }
121
122 link.dataset.apFixed = 'true';
123 };
124
125 const fixAll = () => {
126 const portlets = document.querySelectorAll(
127 `[id*="${PORTLET_NAME}"], .portlet-asset-publisher`
128 );
129 portlets.forEach((portlet) => {
130 portlet.querySelectorAll('a[href]').forEach(fixLink);
131 });
132 };
133
134 // Liferay SPA e portlet re-renders
135 const hookLiferay = () => {
136 if (!window.Liferay || typeof Liferay.on !== 'function') return;
137 Liferay.on('endNavigate', fixAll);
138 Liferay.on('portletReady', fixAll);
139 };
140
141 // Lazy load / paginação / AJAX
142 const observeMutations = () => {
143 const observer = new MutationObserver(() => fixAll());
144 observer.observe(document.body, { childList: true, subtree: true });
145 };
146
147 const start = () => {
148 fixAll();
149 hookLiferay();
150 observeMutations();
151 };
152
153 if (document.readyState === 'loading') {
154 document.addEventListener('DOMContentLoaded', start);
155 } else {
156 start();
157 }
158})();
159</script>
Sempre que você precisar, conte com o Sicoob
Investir nas melhores soluções para te atender de forma rápida e segura, garantindo o acesso aos serviços e às vantagens da sua cooperativa é uma prioridade para nós. Conheça todas elas e escolha a forma mais prática para realizar seus serviços financeiros.

O Sicoobcard tem um app com um monte de funcionalidades feitas para facilitar o seu dia a dia....
O Moob é o aplicativo do Sicoob que facilita e incentiva o contato entre o cooperado e sua...
Nossa cooperação também é digital.
A gente te ajuda a cuidar das suas finanças com toda...
Nossa cooperação também é digital.
A gente te ajuda a cuidar das suas finanças com toda...
O APP Sipag é mais uma opção para gerenciar o seu negócio. Com flexibilidade de acesso rápido...