{"id":1088,"date":"2025-09-30T12:47:00","date_gmt":"2025-09-30T10:47:00","guid":{"rendered":"https:\/\/comercialcostas.com\/?page_id=1088"},"modified":"2025-12-19T12:04:39","modified_gmt":"2025-12-19T11:04:39","slug":"buscador-tarifas","status":"publish","type":"page","link":"https:\/\/comercialcostas.com\/pt\/buscador-tarifas\/","title":{"rendered":"Buscador de Tarifas"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"1088\" class=\"elementor elementor-1088\">\n\t\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5976d6e elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"5976d6e\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2ff1d9c\" data-id=\"2ff1d9c\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5c64fea elementor-widget elementor-widget-html\" data-id=\"5c64fea\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!--\n  Buscador de productos \/ referencias \u2014 Producci\u00f3n (ajuste columnas)\n  Fuente: CSV final https:\/\/comercialcostas.com\/wp-content\/uploads\/2025\/10\/TARIFAS_VTA.csv\n  Columnas a mostrar: B (C\u00f3digo), C (Nombre), F (Clasificaci\u00f3n), H (Precio)\n  Cambios: eliminadas columnas I (Descuento) y K (PVP)\n-->\n\n<div id=\"buscador-dataset\" class=\"bd-card\">\n  <div class=\"bd-header\">\n    <h2 class=\"bd-title\">Buscador de productos \/ referencias<\/h2>\n    <p class=\"bd-subtitle\">Introduce tu b\u00fasqueda y te mostraremos los resultados al instante. Puedes buscar por <strong>C\u00f3digo<\/strong>, <strong>Nombre<\/strong> o <strong>Clasificaci\u00f3n<\/strong>. Coincidencias parciales permitidas.<\/p>\n  <\/div>\n\n  <div class=\"bd-controls\" aria-live=\"polite\">\n    <div class=\"bd-search-row\">\n      <input id=\"bd-search\" type=\"search\" placeholder=\"Escribe para buscar\u2026 (p. ej. &quot;escuadra&quot;, &quot;gas&quot;, &quot;1320009&quot;)\" \/>\n      <button id=\"bd-btn-buscar\" class=\"bd-btn\" type=\"button\" title=\"Buscar\">Buscar<\/button>\n      <button id=\"bd-limpiar\" class=\"bd-ghost\" type=\"button\" title=\"Limpiar b\u00fasqueda\">Limpiar<\/button>\n    <\/div>\n    <div class=\"bd-meta\">\n      <span id=\"bd-info\">Cargando datos\u2026<\/span>\n      <div class=\"bd-toggles\">\n        <label class=\"bd-switch\">\n          <input type=\"checkbox\" id=\"bd-exacto\" \/>\n          <span>Coincidencia exacta<\/span>\n        <\/label>\n        <label class=\"bd-switch\">\n          <input type=\"checkbox\" id=\"bd-diacriticos\" checked \/>\n          <span>Ignorar acentos<\/span>\n        <\/label>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div id=\"bd-resultados\" class=\"bd-results\" role=\"region\" aria-live=\"polite\" aria-busy=\"false\"><\/div>\n  <div id=\"bd-alert\" class=\"bd-alert\" hidden><\/div>\n\n  <div class=\"bd-footer\">\n    <small id=\"bd-footnote\"><\/small>\n  <\/div>\n<\/div>\n\n<style>\n  #buscador-dataset { --bd-bg: #0f172a; --bd-card: #111827; --bd-soft: #1f2937; --bd-soft-2:#334155; --bd-text:#e5e7eb; --bd-muted:#94a3b8; --bd-accent:#38bdf8; --bd-ring:#22d3ee; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial; color: var(--bd-text); background: var(--bd-bg); padding: 24px; border-radius: 18px; box-shadow: 0 10px 30px rgba(0,0,0,.25);} \n  #buscador-dataset * { box-sizing: border-box; }\n  .bd-card { max-width: 1100px; margin: 0 auto; }\n  .bd-header { margin-bottom: 16px; }\n  .bd-title { margin: 0 0 6px; font-size: 1.5rem; line-height: 1.2; }\n  .bd-subtitle { margin: 0; color: var(--bd-muted); }\n  .bd-alert{ margin-top:10px; padding:12px 14px; border-radius:12px; background: rgba(239,68,68,.12); border:1px solid rgba(239,68,68,.35); color:#fecaca; }\n  .bd-btn { padding: 12px 16px; border-radius: 12px; background: linear-gradient(180deg, var(--bd-accent), #0ea5e9); color: #081018; font-weight: 700; border: none; cursor: pointer; }\n  .bd-ghost { padding: 10px 14px; border-radius: 10px; background: transparent; border: 1px solid var(--bd-soft-2); color: var(--bd-text); cursor:pointer; }\n  .bd-controls { margin-top: 18px; background: var(--bd-card); border: 1px solid var(--bd-soft); border-radius: 14px; padding: 14px; }\n  .bd-search-row{ display:flex; gap: 10px; }\n  #bd-search { flex:1; padding: 12px 14px; border-radius: 12px; border: 1px solid var(--bd-soft-2); background: #0b1220; color: var(--bd-text); outline: none; }\n  #bd-search:focus{ border-color: var(--bd-ring); box-shadow: 0 0 0 3px rgba(34,211,238,.25); }\n  .bd-meta{ margin-top:10px; display:flex; flex-wrap:wrap; gap:10px; justify-content:space-between; align-items:center; }\n  .bd-toggles{ display:flex; gap:14px; align-items:center; }\n  .bd-switch{ display:flex; gap:10px; align-items:center; color: var(--bd-muted); font-size:.95rem; }\n  .bd-results{ margin-top: 16px; }\n  .bd-results .bd-stats{ color: var(--bd-muted); margin-bottom: 8px; }\n  .bd-table-wrap{ overflow:auto; border: 1px solid var(--bd-soft); border-radius: 12px; }\n  table.bd-table{ width:100%; border-collapse: collapse; min-width: 680px; }\n  .bd-table th, .bd-table td{ padding: 10px 12px; border-bottom: 1px solid var(--bd-soft); text-align: left; vertical-align: top; white-space: nowrap; }\n  .bd-table th{ position: sticky; top:0; background: #0b1220; z-index:1; font-weight:700; }\n  .bd-highlight { background: rgba(34,211,238,.25); border-radius: 4px; padding: 0 2px; }\n\n  \/* Overrides de paginaci\u00f3n solicitados: botones a la derecha con separaci\u00f3n\n     y selector de registros alineado a la derecha; responsive con stack *\/\n  .bd-pagination{ display:flex; flex-direction:column; align-items:flex-end; gap:12px; padding-top:10px; }\n  .bd-page-controls{ display:flex; gap:12px; }\n  .bd-page-info{ color: var(--bd-muted); text-align:right; }\n  @media (min-width:640px){\n    .bd-pagination{ flex-direction:row; align-items:center; justify-content:flex-end; gap:14px; }\n  }\n<\/style>\n\n<script>\n(function(){\n  const FIXED_URL = 'https:\/\/comercialcostas.com\/wp-content\/uploads\/2025\/10\/TARIFAS_VTA.csv';\n  \/\/ Columnas a mostrar: B, C, F, H\n  const KEEP_INDEX = [1,2,5,7];\n  const HEADERS_ALIAS = ['C\u00f3digo','Nombre','Clasificaci\u00f3n','Precio'];\n\n  const APP_VERSION = 'v1.2';\n  const state = { data: [], headers: [], filtered: [], page:1, pageSize:20, query:'', exact:false, ignoreDiacritics:true };\n\n  const $ = (s, c=document)=>c.querySelector(s); const $$=(s,c=document)=>Array.from(c.querySelectorAll(s));\n  const root = document.getElementById('buscador-dataset');\n  const elSearch=$('#bd-search',root), btnSearch=$('#bd-btn-buscar',root), btnClear=$('#bd-limpiar',root), elInfo=$('#bd-info',root), elExact=$('#bd-exacto',root), elDia=$('#bd-diacriticos',root), elResults=$('#bd-resultados',root), elAlert=$('#bd-alert',root);\n\n  const normalize=(v)=>{ if(v==null) return ''; let s=String(v); if(state.ignoreDiacritics) s=s.normalize('NFD').replace(\/\\p{Diacritic}+\/gu,''); return s.toLowerCase(); };\n  const escapeHtml=(s)=>String(s).replace(\/[&<>\"']\/g,m=>({ '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;','\\'':'&#39;' }[m]));\n  const euroFmt = new Intl.NumberFormat('es-ES', { style: 'currency', currency: 'EUR' });\n\n  \/\/ \u2705 FIX v1.2: parseo robusto para precios con decimal en \".\" o \",\"\n  const parseNum = (val) => {\n    if (val == null || val === '') return null;\n    let s = String(val).trim();\n\n    \/\/ Limpia espacios \/ s\u00edmbolos (\u20ac, etc.)\n    s = s.replace(\/\\s\/g, '').replace(\/[^\\d.,+-]\/g, '');\n\n    const hasComma = s.includes(',');\n    const hasDot = s.includes('.');\n\n    if (hasComma && hasDot) {\n      \/\/ Decide el decimal por el \u00faltimo separador\n      const lastComma = s.lastIndexOf(',');\n      const lastDot = s.lastIndexOf('.');\n      if (lastComma > lastDot) {\n        \/\/ ES: 214.042,00 -> miles '.' decimal ','\n        s = s.replace(\/\\.\/g, '').replace(',', '.');\n      } else {\n        \/\/ EN: 21,404.20 -> miles ',' decimal '.'\n        s = s.replace(\/,\/g, '');\n      }\n    } else if (hasComma && !hasDot) {\n      \/\/ Solo coma -> coma decimal\n      s = s.replace(',', '.');\n    } else if (!hasComma && hasDot) {\n      \/\/ Solo punto -> punto decimal (NO eliminar puntos)\n      s = s.replace(\/,\/g, '');\n    }\n\n    const n = parseFloat(s);\n    return Number.isFinite(n) ? n : null;\n  };\n\n  const debounce=(fn,w=160)=>{ let t; return (...a)=>{ clearTimeout(t); t=setTimeout(()=>fn(...a),w); } };\n\n  async function ensurePapa(){ if(window.Papa) return true; const cdns=[\n    'https:\/\/cdn.jsdelivr.net\/npm\/papaparse@5.4.1\/papaparse.min.js',\n    'https:\/\/unpkg.com\/papaparse@5.4.1\/papaparse.min.js'\n  ]; for(const src of cdns){ try{ await new Promise((res,rej)=>{ const s=document.createElement('script'); s.src=src; s.async=true; s.onload=res; s.onerror=rej; document.head.appendChild(s); }); if(window.Papa) return true; }catch(e){} } return false; }\n  function splitCSVLine(line, delim){ const out=[]; let cur='', inQ=false; for(let i=0;i<line.length;i++){ const ch=line[i]; if(ch==='\"'){ if(inQ && line[i+1]==='\"'){ cur+='\"'; i++; } else inQ=!inQ; } else if(ch===delim && !inQ){ out.push(cur); cur=''; } else { cur+=ch; } } out.push(cur); return out; }\n  function parseCSVFallback(text){\n    const clean=text.replace(\/\\r\\n\/g,'\\n').replace(\/\\r\/g,'\\n'); const lines=clean.split('\\n').filter(l=>l.length>0);\n    const d=';'; const headers=splitCSVLine(lines[0],d).map(h=>h.replace(\/^\\ufeff\/,'').replace(\/^\\\"|\\\"$\/g,'').trim());\n    const data=lines.slice(1).map(line=>{ const cells=splitCSVLine(line,d); const row={}; headers.forEach((h,i)=> row[h]=(cells[i]??'').replace(\/^\\\"|\\\"$\/g,'').trim()); return row; });\n    return { headers, data };\n  }\n\n  async function loadCSV(){\n    try{\n      elInfo.textContent='Cargando datos\u2026';\n      const csvUrl = FIXED_URL + (FIXED_URL.includes('?') ? '&' : '?') + 'cb=' + Date.now();\n      const res = await fetch(csvUrl, { cache:'no-store', credentials:'same-origin' });\n      if(!res.ok) throw new Error('HTTP '+res.status);\n      const text = await res.text();\n\n      let rows=[], headers=[]; let ok=false;\n      if(await ensurePapa()){\n        const tryDelims=[';','\\t',',','|'];\n        for(const d of tryDelims){\n          const parsed = window.Papa.parse(text, { header:true, delimiter:d, skipEmptyLines:'greedy', dynamicTyping:false, transformHeader:h=>String(h||'').replace(\/^\\ufeff\/,'').trim() });\n          const hs = (parsed.meta && parsed.meta.fields) || [];\n          if(hs.length>1){ rows=parsed.data.map(o=>o||{}); headers=hs; ok=true; break; }\n        }\n      }\n      if(!ok){ const p=parseCSVFallback(text); rows=p.data; headers=p.headers; }\n      finalizeLoad(headers, rows);\n    }catch(e){ console.error('Error al cargar CSV', e); elInfo.textContent='Error al cargar datos'; }\n  }\n\n  function finalizeLoad(headers, rows){\n    headers = headers.map(h=>String(h||'').replace(\/^\\ufeff\/,'').replace(\/^\\\"|\\\"$\/g,'').trim());\n    const keep = KEEP_INDEX.map(i=>headers[i]).filter(Boolean);\n    state.headers = keep.length ? keep : headers;\n\n    state.data = rows.map(r=>{ \n      const o={}; \n      state.headers.forEach((h,idx)=>{ \n        let v = r[h]; \n        if(h==null) v=''; \n        const alias = HEADERS_ALIAS[idx]||''; \n        if(alias==='Precio'){ \n          const n=parseNum(v); \n          v = n==null? '' : euroFmt.format(n); \n        } \n        o[h] = v==null? '' : String(v); \n      }); \n      return o; \n    });\n\n    state.page=1; render();\n    elInfo.textContent = `Datos cargados: ${state.data.length} filas. Usa Buscar o pulsa Enter.`;\n    updateFootnote();\n  }\n\n  function applyFilter(){ const q=normalize(state.query); if(!q){ state.filtered=state.data; return; } const terms=state.exact?[q]:q.split(\/\\s+\/).filter(Boolean); state.filtered=state.data.filter(row=>{ const hay=state.headers.map(h=>normalize(row[h])); if(state.exact) return hay.some(v=>v.includes(q)); return terms.every(t=>hay.some(v=>v.includes(t))); }); }\n  function highlight(text){ if(!state.query) return escapeHtml(String(text??'')); const src=String(text??''); const q=state.ignoreDiacritics?state.query.normalize('NFD').replace(\/\\p{Diacritic}+\/gu,''):state.query; const terms=state.exact?[q]:q.split(\/\\s+\/).filter(Boolean); let out=src; try{ terms.forEach(term=>{ if(!term) return; const normSrc=state.ignoreDiacritics?src.normalize('NFD'):src; const normTerm=term.replace(\/[.*+?^${}()|[\\]\\\\]\/g,'\\\\$&'); const re=new RegExp(normTerm,'gi'); let m; const spans=[]; while((m=re.exec(normSrc))){ spans.push([m.index,m.index+m[0].length]); } if(spans.length){ let html='',i=0; spans.forEach(([a,b])=>{ html+=escapeHtml(src.slice(i,a))+'<span class=\"bd-highlight\">'+escapeHtml(src.slice(a,b))+'<\/span>'; i=b; }); html+=escapeHtml(src.slice(i)); out=html; } }); }catch(e){} return out; }\n\n  function render(){\n    applyFilter(); const total=state.filtered.length; const pages=Math.max(1,Math.ceil(total\/state.pageSize)); if(state.page>pages) state.page=pages; const start=(state.page-1)*state.pageSize; const slice=state.filtered.slice(start,start+state.pageSize);\n    let html='';\n    if(!state.headers.length){ html='<div class=\"bd-stats\">Cargando datos\u2026<\/div>'; }\n    else{\n      html+=`<div class=\"bd-stats\">${total} resultados \u00b7 mostrando ${slice.length} (p\u00e1gina ${state.page}\/${pages})<\/div>`;\n      html+='<div class=\"bd-table-wrap\"><table class=\"bd-table\"><thead><tr>'+\n        state.headers.map((_,i)=>`<th>${escapeHtml(HEADERS_ALIAS[i]||state.headers[i]||'')}<\/th>`).join('')+\n      '<\/tr><\/thead><tbody>';\n      slice.forEach(row=>{ html+='<tr>'+ state.headers.map(h=>`<td>${highlight(row[h])}<\/td>`).join('') + '<\/tr>'; });\n      html+='<\/tbody><\/table><\/div>';\n      html+='<div class=\"bd-pagination\">'+\n        '<div class=\"bd-page-controls\">'+\n        `<button class=\"bd-page-btn\" data-page=\"prev\" ${state.page===1?'disabled':''}>Anterior<\/button>`+\n        `<button class=\"bd-page-btn\" data-page=\"next\" ${state.page===pages?'disabled':''}>Siguiente<\/button>`+\n        '<\/div>'+`<div class=\"bd-page-info\">Registros por p\u00e1gina: <select id=\"bd-ps\"><option>10<\/option><option selected>20<\/option><option>50<\/option><option>100<\/option><\/select><\/div>`+\n      '<\/div>';\n    }\n    elResults.innerHTML=html;\n    const sel = document.querySelector('#bd-ps');\n    if(sel){ sel.value=String(state.pageSize); sel.addEventListener('change',()=>{ state.pageSize=parseInt(sel.value,10)||20; state.page=1; render(); }); }\n    document.querySelectorAll('.bd-page-btn').forEach(b=> b.addEventListener('click',()=>{ const dir=b.getAttribute('data-page'); if(dir==='prev'&&state.page>1) state.page--; else if(dir==='next') state.page++; render(); }));\n  }\n\n  const onInput = debounce(()=>{ state.query=elSearch.value; state.page=1; render(); }, 160);\n  elSearch.addEventListener('input', onInput);\n  btnSearch.addEventListener('click', ()=>{ state.query=elSearch.value; state.page=1; render(); });\n  elSearch.addEventListener('keydown', (e)=>{ if(e.key==='Enter'){ e.preventDefault(); btnSearch.click(); }});\n  btnClear.addEventListener('click', ()=>{ elSearch.value=''; state.query=''; state.page=1; render(); elSearch.focus(); });\n  elExact.addEventListener('change', ()=>{ state.exact=elExact.checked; state.page=1; render(); });\n  elDia.addEventListener('change', ()=>{ state.ignoreDiacritics=elDia.checked; state.page=1; render(); });\n\n  function updateFootnote(){ \n    const el=document.getElementById('bd-footnote'); if(!el) return; \n    const dt=new Date(); \n    const fecha=dt.toLocaleDateString('es-ES',{year:'numeric',month:'2-digit',day:'2-digit'}); \n    const hora=dt.toLocaleTimeString('es-ES',{hour:'2-digit',minute:'2-digit'}); \n    el.innerHTML=`Buscador CCF ${APP_VERSION} \u00b7 ${fecha} ${hora} \u00b7 Aplicaci\u00f3n desarrollada por <a href=\"https:\/\/www.sofycom.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Sofycom Soluciones Inform\u00e1ticas<\/a>`; \n  }\n\n  loadCSV(); updateFootnote();\n})();\n<\/script>\n\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Buscador de productos \/ referencias Introduce tu b\u00fasqueda y te mostraremos los resultados al instante. Puedes buscar por C\u00f3digo, Nombre o Clasificaci\u00f3n. Coincidencias parciales permitidas. Buscar Limpiar Cargando datos\u2026 Coincidencia exacta Ignorar acentos<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/template-pagebuilder-full-width.php","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":""},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Buscador de Tarifas - Comercial Costas<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/comercialcostas.com\/pt\/buscador-tarifas\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Buscador de Tarifas - Comercial Costas\" \/>\n<meta property=\"og:description\" content=\"Buscador de productos \/ referencias Introduce tu b\u00fasqueda y te mostraremos los resultados al instante. Puedes buscar por C\u00f3digo, Nombre o Clasificaci\u00f3n. Coincidencias parciales permitidas. Buscar Limpiar Cargando datos\u2026 Coincidencia exacta Ignorar acentos\" \/>\n<meta property=\"og:url\" content=\"https:\/\/comercialcostas.com\/pt\/buscador-tarifas\/\" \/>\n<meta property=\"og:site_name\" content=\"Comercial Costas\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/comercialcostasfernandez\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-19T11:04:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/comercialcostas.com\/buscador-tarifas\/\",\"url\":\"https:\/\/comercialcostas.com\/buscador-tarifas\/\",\"name\":\"Buscador de Tarifas - Comercial Costas\",\"isPartOf\":{\"@id\":\"https:\/\/comercialcostas.com\/#website\"},\"datePublished\":\"2025-09-30T10:47:00+00:00\",\"dateModified\":\"2025-12-19T11:04:39+00:00\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/comercialcostas.com\/buscador-tarifas\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/comercialcostas.com\/#website\",\"url\":\"https:\/\/comercialcostas.com\/\",\"name\":\"Comercial Costas\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/comercialcostas.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/comercialcostas.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/comercialcostas.com\/#organization\",\"name\":\"Comercial Costas\",\"url\":\"https:\/\/comercialcostas.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/comercialcostas.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/comercialcostas.com\/wp-content\/uploads\/2023\/01\/301683744_401473612108353_5137361906652368743_n.jpg\",\"contentUrl\":\"https:\/\/comercialcostas.com\/wp-content\/uploads\/2023\/01\/301683744_401473612108353_5137361906652368743_n.jpg\",\"width\":400,\"height\":333,\"caption\":\"Comercial Costas\"},\"image\":{\"@id\":\"https:\/\/comercialcostas.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/comercialcostasfernandez\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Buscador de Tarifas - Comercial Costas","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/comercialcostas.com\/pt\/buscador-tarifas\/","og_locale":"pt_PT","og_type":"article","og_title":"Buscador de Tarifas - Comercial Costas","og_description":"Buscador de productos \/ referencias Introduce tu b\u00fasqueda y te mostraremos los resultados al instante. Puedes buscar por C\u00f3digo, Nombre o Clasificaci\u00f3n. Coincidencias parciales permitidas. Buscar Limpiar Cargando datos\u2026 Coincidencia exacta Ignorar acentos","og_url":"https:\/\/comercialcostas.com\/pt\/buscador-tarifas\/","og_site_name":"Comercial Costas","article_publisher":"https:\/\/www.facebook.com\/comercialcostasfernandez\/","article_modified_time":"2025-12-19T11:04:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/comercialcostas.com\/buscador-tarifas\/","url":"https:\/\/comercialcostas.com\/buscador-tarifas\/","name":"Buscador de Tarifas - Comercial Costas","isPartOf":{"@id":"https:\/\/comercialcostas.com\/#website"},"datePublished":"2025-09-30T10:47:00+00:00","dateModified":"2025-12-19T11:04:39+00:00","inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/comercialcostas.com\/buscador-tarifas\/"]}]},{"@type":"WebSite","@id":"https:\/\/comercialcostas.com\/#website","url":"https:\/\/comercialcostas.com\/","name":"Comercial Costas","description":"","publisher":{"@id":"https:\/\/comercialcostas.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/comercialcostas.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/comercialcostas.com\/#organization","name":"Comercial Costas","url":"https:\/\/comercialcostas.com\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/comercialcostas.com\/#\/schema\/logo\/image\/","url":"https:\/\/comercialcostas.com\/wp-content\/uploads\/2023\/01\/301683744_401473612108353_5137361906652368743_n.jpg","contentUrl":"https:\/\/comercialcostas.com\/wp-content\/uploads\/2023\/01\/301683744_401473612108353_5137361906652368743_n.jpg","width":400,"height":333,"caption":"Comercial Costas"},"image":{"@id":"https:\/\/comercialcostas.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/comercialcostasfernandez\/"]}]}},"_links":{"self":[{"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/pages\/1088"}],"collection":[{"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/comments?post=1088"}],"version-history":[{"count":56,"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/pages\/1088\/revisions"}],"predecessor-version":[{"id":1155,"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/pages\/1088\/revisions\/1155"}],"wp:attachment":[{"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/media?parent=1088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}