Gestión de operaciones

La histórica interacción unidireccional entre las gestoras y los clientes está cambiando rápidamente a una bidireccional y dinámica, que afecta a sus operaciones con nuevos retos. Las soluciones de Itron para la gestión de operaciones le ayudan a obtener una visibilidad de sus operaciones mejor que nunca y, gracias a la tecnología conectada de forma inteligente en todo el sistema de distribución, nuestras soluciones también le ofrecen más control que nunca.

Filter Products

Clear
Se ha producido un error al procesar la plantilla.
For "." left-hand operand: Expected a hash, but this has evaluated to a string (wrapper: f.t.SimpleScalar):
==> categoryFilterOptions  [in template "44616#44647#3220475" at line 18, column 6]

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #if categoryFilterOptions.items?has_c...  [in template "44616#44647#3220475" at line 18, column 1]
----
1<#assign 
2				 categoryURLMap = themeDisplay.getURLCurrent()?split("/") 
3				 firstItem = true 
4				 categoryFilterOptionMap = [] 
5				 categoryFilterOptions = "" 
6				 /> 
7 
8<#if (categoryURLMap?size >= 3)>  
9	<#assign 
10				 catIndex = categoryURLMap?size - 1 
11				 categoryURL = categoryURLMap[catIndex]?split("?")[0] 
12				 categoryURL = categoryURL?lower_case 
13			   categoryFilterOptions = restClient.get("/c/leveltwocategories/?fields=categoryLiferayId&filter=categoryURL%20eq%20%27"+ categoryURL + "%27&pageSize=200") 
14	/> 
15</#if> 
16 
17<#if categoryFilterOptions?has_content> 
18<#if categoryFilterOptions.items?has_content> 
19	<#assign categoryFilterOptionsItems = categoryFilterOptions.items /> 
20	<#list categoryFilterOptionsItems as categoryFilterOptionsItem > 
21	    <#assign  
22					categoryFilterOptionsItemData = jsonFactoryUtil.createJSONObject(categoryFilterOptionsItem)		  
23			    categoryFilterCategoryId = categoryFilterOptionsItemData.categoryLiferayId 
24					categoryFilterOptionMap = [ categoryFilterCategoryId?string ] + categoryFilterOptionMap 
25					/> 
26	</#list> 
27</#if> 
28</#if> 
29 
30<#macro treeview_item 
31	cssClassTreeItem = "" 
32	frequency = 0 
33	id = "" 
34	frequencyVisible = true 
35	name = "" 
36	selectable = false 
37	selected = false 
38	termDisplayContexts = "" 
39
40 
41<#if categoryFilterOptionMap?seq_contains(id) || firstItem> 
42	<#assign firstItem = false /> 
43	<li class="treeview-item" role="none"> 
44		<#if name?has_content> 
45			<div 
46				aria-controls="${namespace}treeItem${id}" 
47				aria-expanded="true" 
48				class="treeview-link ${cssClassTreeItem}" 
49				data-target="#${namespace}treeItem${id}" 
50				data-toggle="collapse" 
51				onClick="${namespace}toggleTreeItem('${namespace}treeItem${id}');" 
52				role="treeitem" 
53				tabindex="0" 
54
55				<span class="c-inner" tabindex="-2"> 
56					<span class="autofit-row"> 
57						<#if selectable> 
58							<span class="autofit-col autofit-col-expand"> 
59								<div class="custom-checkbox custom-control"> 
60									<label> 
61										<input 
62											autocomplete="off" 
63											${selected?then("checked", "")} 
64											class="custom-control-input facet-term" 
65											data-term-id=${id} 
66											disabled 
67											onChange="Liferay.Search.FacetUtil.changeSelection(event);" 
68											type="checkbox" 
69										/> 
70 
71										<span class="custom-control-label"> 
72											<span class="custom-control-label-text"> 
73												${name} 
74 
75												<#if frequencyVisible> 
76													(${frequency}) 
77												</#if> 
78											</span> 
79										</span> 
80									</label> 
81								</div> 
82							</span> 
83						<#else> 
84							<span class="autofit-col autofit-col-expand"> 
85								<span class="component-text"> 
86									<span 
87										class="text-truncate-inline" 
88										title="${name}" 
89
90										<span class="text-truncate"> 
91											${name} 
92 
93											<#if frequencyVisible> 
94												(${frequency}) 
95											</#if> 
96										</span> 
97									</span> 
98								</span> 
99							</span> 
100						</#if> 
101					</span> 
102				</span> 
103			</div> 
104		</#if> 
105 
106		<#if termDisplayContexts?has_content> 
107			<div class="collapse show" id="${namespace}treeItem${id}"> 
108				<ul class="treeview-group" role="group"> 
109					<#list termDisplayContexts as termDisplayContext> 
110						<@treeview_item 
111							cssClassTreeItem="tree-item-category" 
112							frequency=termDisplayContext.getFrequency() 
113							frequencyVisible=termDisplayContext.isFrequencyVisible() 
114							id=termDisplayContext.getFilterValue() 
115							name=htmlUtil.escape(termDisplayContext.getBucketText()) 
116							selectable=true 
117							selected=termDisplayContext.isSelected() 
118						/> 
119					</#list> 
120				</ul> 
121			</div> 
122		</#if> 
123	</li> 
124</#if> 
125</#macro> 
126 
127<@liferay_ui["panel-container"] 
128	extended=true 
129	id="${namespace + 'facetAssetCategoriesPanelContainer'}" 
130	markupView="lexicon" 
131	persistState=true 
132
133	<#assign vocabularyNames = assetCategoriesSearchFacetDisplayContext.getVocabularyNames() /> 
134 
135	<@liferay_ui.panel 
136		collapsible=true 
137		cssClass="search-facet search-facet-display-vocabulary" 
138		id="${namespace + 'facetAssetCategoriesPanel'}" 
139		markupView="lexicon" 
140		persistState=true 
141		title="${(vocabularyNames?size == 1)?then('Category', 'Category')}" 
142
143		<#if vocabularyNames?has_content> 
144			<ul class="treeview treeview-light treeview-nested treeview-vocabulary-display" role="tree"> 
145				<#list vocabularyNames as vocabularyName> 
146					<@treeview_item 
147						cssClassTreeItem="tree-item-vocabulary" 
148						frequencyVisible=false 
149						id=vocabularyName + vocabularyName?index 
150						name="${(vocabularyNames?size == 1)?then('', htmlUtil.escape(vocabularyName))}" 
151						termDisplayContexts=assetCategoriesSearchFacetDisplayContext.getBucketDisplayContexts(vocabularyName) 
152					/> 
153				</#list> 
154			</ul> 
155		</#if> 
156 
157	</@> 
158</@> 
159<style> 
160.collapse-icon .collapse-icon-open { 
161    display: none; 
162
163</style> 
164<@liferay_aui.script> 
165	function ${namespace}toggleTreeItem(dataTarget) { 
166		const dataTargetElements = document.querySelectorAll("[data-target=\"#" + dataTarget + "\"]"); 
167 
168		dataTargetElements.forEach( 
169			element => { 
170				if (element.classList.contains('collapsed')) { 
171					element.classList.remove('collapsed'); 
172					element.setAttribute('aria-expanded', true); 
173
174				else { 
175					element.classList.add('collapsed'); 
176					element.setAttribute('aria-expanded', false); 
177
178
179		); 
180 
181		const subtreeCategoryTreeElement = document.getElementById(dataTarget); 
182 
183		if (subtreeCategoryTreeElement) { 
184			if (subtreeCategoryTreeElement.classList.contains('show')) { 
185				subtreeCategoryTreeElement.classList.remove('show'); 
186
187			else { 
188				subtreeCategoryTreeElement.classList.add('show'); 
189
190
191
192</@> 
Se ha producido un error al procesar la plantilla.
Java method "com.liferay.commerce.product.content.web.internal.helper.CPContentHelperImpl.getFriendlyURL(com.liferay.commerce.product.catalog.CPCatalogEntry, com.liferay.portal.kernel.theme.ThemeDisplay)" threw an exception when invoked on com.liferay.commerce.product.content.web.internal.helper.CPContentHelperImpl object "com.liferay.commerce.product.content.web.internal.helper.CPContentHelperImpl@6aa2bd9f"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: friendlyURL = cpContentHelper.getFrie...  [in template "44616#44647#3220178" at line 33, column 25]
----
1<div class="grid-list-view-wrap"> 
2	<ul class="grid-list-view-list"> 
3		<li> 
4			<button class="grid-view on" aria-current="true" type="button"> 
5				<svg aria-hidden="true" class="grid-view-icon" focusable="false"> 
6					<use href="/documents/d/global/sprite#gridViewIcon"></use> 
7				</svg>      
8				<span class="visually-hidden"> 
9					Grid view 
10				</span>  
11			</button>    
12		</li> 
13		<li> 
14			<button class="list-view" aria-current="false" type="button"> 
15				<span class="list-view-icon"> 
16					<span class="visually-hidden"> 
17						List view 
18					</span>  
19				</span>  
20			</button>                 
21		</li>                        
22	</ul>  
23</div>   
24<ul class="product-catalog-list grid-view"> 
25	<#if entries?has_content> 
26		<#list entries ?sort_by("name") as curCPCatalogEntry> 
27			 
28			<#assign 
29			cpDefinitionId = curCPCatalogEntry.getCPDefinitionId() 
30			productName = curCPCatalogEntry.getName() 
31			productShortDescription = curCPCatalogEntry.getShortDescription() 
32			productDescription = curCPCatalogEntry.getDescription() 
33			friendlyURL = cpContentHelper.getFriendlyURL(curCPCatalogEntry, themeDisplay) 
34			commerceContext = renderRequest.getAttribute("COMMERCE_CONTEXT") 
35			/> 
36			<#attempt> 
37			<#if curCPCatalogEntry.getDefaultImageFileUrl()?has_content> 
38				<#assign defaultImageURL = curCPCatalogEntry.getDefaultImageFileUrl() /> 
39			</#if> 
40				    
41			<#recover> 
42					 <#assign  
43				    images = cpContentHelper.getImages(cpDefinitionId, false, themeDisplay)  
44				    /> 
45				<#list images as image> 
46				    <#assign  
47						defaultImageURL = image.getURL() 
48				    /> 
49			  </#list> 
50			</#attempt> 
51 
52			<li class="product-catalog-list-item"> 
53				<a href="${friendlyURL}" class="product-catalog-list-item-link"> 
54					<div class="product-catalog-list-item-img-wrap"> 
55						<img src="${defaultImageURL}" class="product-catalog-list-item-img" alt="${productName}" /> 
56					</div> 
57					<div class="product-catalog-list-desc"> 
58						<h2 class="product-catalog-list-item-title" title="${productName}"> 
59								${productName} 
60						</h2> 
61						<p class="product-catalog-list-item-desc">${productShortDescription}</p> 
62					</div> 
63				</a> 
64			</li> 
65		</#list> 
66	</#if> 
67</ul>