{"id":1088,"date":"2025-09-30T12:47:00","date_gmt":"2025-09-30T10:47:00","guid":{"rendered":"https:\/\/comercialcostas.com\/?page_id=1088"},"modified":"2026-09-22T12:20:58","modified_gmt":"2026-09-22T10:20:58","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\n  Fuente: https:\/\/comercialcostas.com\/wp-content\/uploads\/2025\/10\/TARIFAS_VTA.csv\n  Nuevo formato CSV: C\u00f3digo;Nombre;Clasificaci\u00f3n;Precio\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  .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\n  \/\/ El nuevo CSV tiene exactamente estas 4 columnas.\n  const EXPECTED_HEADERS = ['C\u00f3digo', 'Nombre', 'Clasificaci\u00f3n', 'Precio'];\n  const APP_VERSION = 'v1.3';\n\n  const state = {\n    data: [],\n    headers: [...EXPECTED_HEADERS],\n    filtered: [],\n    page: 1,\n    pageSize: 20,\n    query: '',\n    exact: false,\n    ignoreDiacritics: true\n  };\n\n  const $ = (s, c=document) => c.querySelector(s);\n  const root = document.getElementById('buscador-dataset');\n  const elSearch = $('#bd-search', root);\n  const btnSearch = $('#bd-btn-buscar', root);\n  const btnClear = $('#bd-limpiar', root);\n  const elInfo = $('#bd-info', root);\n  const elExact = $('#bd-exacto', root);\n  const elDia = $('#bd-diacriticos', root);\n  const elResults = $('#bd-resultados', root);\n  const elAlert = $('#bd-alert', root);\n\n  const normalize = (v) => {\n    if (v == null) return '';\n    let s = String(v);\n    if (state.ignoreDiacritics) {\n      s = s.normalize('NFD').replace(\/\\p{Diacritic}+\/gu, '');\n    }\n    return s.toLowerCase();\n  };\n\n  const normalizeHeader = (v) => String(v ?? '')\n    .replace(\/^\\ufeff\/, '')\n    .trim()\n    .normalize('NFD')\n    .replace(\/\\p{Diacritic}+\/gu, '')\n    .toLowerCase();\n\n  const escapeHtml = (s) => String(s).replace(\/[&<>\"']\/g, m => ({\n    '&':'&amp;', '<':'&lt;', '>':'&gt;', '\"':'&quot;', \"'\":'&#39;'\n  }[m]));\n\n  const euroFmt = new Intl.NumberFormat('es-ES', {\n    style: 'currency',\n    currency: 'EUR'\n  });\n\n  const parseNum = (val) => {\n    if (val == null || val === '') return null;\n    let s = String(val).trim();\n\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      const lastComma = s.lastIndexOf(',');\n      const lastDot = s.lastIndexOf('.');\n\n      if (lastComma > lastDot) {\n        s = s.replace(\/\\.\/g, '').replace(',', '.');\n      } else {\n        s = s.replace(\/,\/g, '');\n      }\n    } else if (hasComma) {\n      s = s.replace(',', '.');\n    }\n\n    const n = parseFloat(s);\n    return Number.isFinite(n) ? n : null;\n  };\n\n  const debounce = (fn, w=160) => {\n    let t;\n    return (...a) => {\n      clearTimeout(t);\n      t = setTimeout(() => fn(...a), w);\n    };\n  };\n\n  async function ensurePapa(){\n    if (window.Papa) return true;\n\n    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    ];\n\n    for (const src of cdns){\n      try{\n        await new Promise((res, rej) => {\n          const s = document.createElement('script');\n          s.src = src;\n          s.async = true;\n          s.onload = res;\n          s.onerror = rej;\n          document.head.appendChild(s);\n        });\n        if (window.Papa) return true;\n      }catch(e){}\n    }\n\n    return false;\n  }\n\n  \/\/ El CSV nuevo est\u00e1 guardado en Windows-1252.\n  \/\/ Primero probamos UTF-8 y, si no es v\u00e1lido, usamos Windows-1252.\n  function decodeCSV(buffer){\n    try{\n      return new TextDecoder('utf-8', { fatal:true }).decode(buffer);\n    }catch(e){\n      return new TextDecoder('windows-1252').decode(buffer);\n    }\n  }\n\n  function splitCSVLine(line, delim){\n    const out = [];\n    let cur = '';\n    let inQ = false;\n\n    for(let i=0; i<line.length; i++){\n      const ch = line[i];\n      if(ch === '\"'){\n        if(inQ && line[i+1] === '\"'){\n          cur += '\"';\n          i++;\n        }else{\n          inQ = !inQ;\n        }\n      }else if(ch === delim && !inQ){\n        out.push(cur);\n        cur = '';\n      }else{\n        cur += ch;\n      }\n    }\n\n    out.push(cur);\n    return out;\n  }\n\n  function parseCSVFallback(text){\n    const clean = text.replace(\/\\r\\n\/g, '\\n').replace(\/\\r\/g, '\\n');\n    const lines = clean.split('\\n').filter(l => l.trim().length > 0);\n    const delim = ';';\n\n    const headers = splitCSVLine(lines[0], delim).map(h =>\n      h.replace(\/^\\ufeff\/, '').replace(\/^\"|\"$\/g, '').trim()\n    );\n\n    const data = lines.slice(1).map(line => {\n      const cells = splitCSVLine(line, delim);\n      const row = {};\n      headers.forEach((h, i) => {\n        row[h] = (cells[i] ?? '').replace(\/^\"|\"$\/g, '').trim();\n      });\n      return row;\n    });\n\n    return { headers, data };\n  }\n\n  async function loadCSV(){\n    try{\n      elInfo.textContent = 'Cargando datos\u2026';\n      elAlert.hidden = true;\n      elAlert.textContent = '';\n      elResults.setAttribute('aria-busy', 'true');\n\n      const csvUrl = FIXED_URL + (FIXED_URL.includes('?') ? '&' : '?') + 'cb=' + Date.now();\n      const res = await fetch(csvUrl, {\n        cache: 'no-store',\n        credentials: 'same-origin'\n      });\n\n      if(!res.ok) throw new Error('HTTP ' + res.status);\n\n      const buffer = await res.arrayBuffer();\n      const text = decodeCSV(buffer);\n\n      let rows = [];\n      let headers = [];\n      let ok = false;\n\n      if(await ensurePapa()){\n        const parsed = window.Papa.parse(text, {\n          header: true,\n          delimiter: ';',\n          skipEmptyLines: 'greedy',\n          dynamicTyping: false,\n          transformHeader: h => String(h || '').replace(\/^\\ufeff\/, '').trim()\n        });\n\n        headers = (parsed.meta && parsed.meta.fields) || [];\n        rows = (parsed.data || []).map(o => o || {});\n        ok = headers.length > 1;\n      }\n\n      if(!ok){\n        const parsed = parseCSVFallback(text);\n        headers = parsed.headers;\n        rows = parsed.data;\n      }\n\n      finalizeLoad(headers, rows);\n    }catch(e){\n      console.error('Error al cargar CSV', e);\n      elInfo.textContent = 'Error al cargar datos';\n      elAlert.textContent = 'No se ha podido cargar o interpretar el archivo TARIFAS_VTA.csv.';\n      elAlert.hidden = false;\n      elResults.setAttribute('aria-busy', 'false');\n    }\n  }\n\n  function finalizeLoad(headers, rows){\n    const cleanHeaders = headers.map(h =>\n      String(h || '').replace(\/^\\ufeff\/, '').replace(\/^\"|\"$\/g, '').trim()\n    );\n\n    \/\/ Relacionamos las columnas por nombre y no por posici\u00f3n.\n    \/\/ As\u00ed el buscador queda preparado espec\u00edficamente para:\n    \/\/ C\u00f3digo;Nombre;Clasificaci\u00f3n;Precio\n    const headerMap = {};\n    cleanHeaders.forEach(h => {\n      headerMap[normalizeHeader(h)] = h;\n    });\n\n    const resolved = {};\n    EXPECTED_HEADERS.forEach(expected => {\n      resolved[expected] = headerMap[normalizeHeader(expected)] || null;\n    });\n\n    const missing = EXPECTED_HEADERS.filter(h => !resolved[h]);\n    if(missing.length){\n      throw new Error('Faltan columnas obligatorias: ' + missing.join(', '));\n    }\n\n    state.headers = [...EXPECTED_HEADERS];\n\n    state.data = rows.map(r => {\n      const precioRaw = r[resolved['Precio']];\n      const precioNum = parseNum(precioRaw);\n\n      return {\n        'C\u00f3digo': String(r[resolved['C\u00f3digo']] ?? '').trim(),\n        'Nombre': String(r[resolved['Nombre']] ?? '').trim(),\n        'Clasificaci\u00f3n': String(r[resolved['Clasificaci\u00f3n']] ?? '').trim(),\n        'Precio': precioNum == null ? '' : euroFmt.format(precioNum)\n      };\n    }).filter(row =>\n      row['C\u00f3digo'] || row['Nombre'] || row['Clasificaci\u00f3n'] || row['Precio']\n    );\n\n    state.page = 1;\n    render();\n\n    elInfo.textContent = `Datos cargados: ${state.data.length} filas. Usa Buscar o pulsa Enter.`;\n    elResults.setAttribute('aria-busy', 'false');\n    updateFootnote();\n  }\n\n  function applyFilter(){\n    const q = normalize(state.query);\n\n    if(!q){\n      state.filtered = state.data;\n      return;\n    }\n\n    const terms = state.exact ? [q] : q.split(\/\\s+\/).filter(Boolean);\n\n    state.filtered = state.data.filter(row => {\n      const hay = state.headers.map(h => normalize(row[h]));\n\n      if(state.exact){\n        return hay.some(v => v.includes(q));\n      }\n\n      return terms.every(t => hay.some(v => v.includes(t)));\n    });\n  }\n\n  function highlight(text){\n    if(!state.query) return escapeHtml(String(text ?? ''));\n\n    const src = String(text ?? '');\n    const q = state.ignoreDiacritics\n      ? state.query.normalize('NFD').replace(\/\\p{Diacritic}+\/gu, '')\n      : state.query;\n\n    const terms = state.exact ? [q] : q.split(\/\\s+\/).filter(Boolean);\n    let out = src;\n\n    try{\n      terms.forEach(term => {\n        if(!term) return;\n\n        const normSrc = state.ignoreDiacritics ? src.normalize('NFD') : src;\n        const normTerm = term.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&');\n        const re = new RegExp(normTerm, 'gi');\n        let m;\n        const spans = [];\n\n        while((m = re.exec(normSrc))){\n          spans.push([m.index, m.index + m[0].length]);\n        }\n\n        if(spans.length){\n          let html = '';\n          let i = 0;\n\n          spans.forEach(([a,b]) => {\n            html += escapeHtml(src.slice(i,a)) +\n              '<span class=\"bd-highlight\">' + escapeHtml(src.slice(a,b)) + '<\/span>';\n            i = b;\n          });\n\n          html += escapeHtml(src.slice(i));\n          out = html;\n        }\n      });\n    }catch(e){}\n\n    return out;\n  }\n\n  function render(){\n    applyFilter();\n\n    const total = state.filtered.length;\n    const pages = Math.max(1, Math.ceil(total \/ state.pageSize));\n\n    if(state.page > pages) state.page = pages;\n\n    const start = (state.page - 1) * state.pageSize;\n    const slice = state.filtered.slice(start, start + state.pageSize);\n\n    let html = '';\n\n    if(!state.headers.length){\n      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\n      html += '<div class=\"bd-table-wrap\"><table class=\"bd-table\"><thead><tr>' +\n        state.headers.map(h => `<th>${escapeHtml(h)}<\/th>`).join('') +\n        '<\/tr><\/thead><tbody>';\n\n      slice.forEach(row => {\n        html += '<tr>' +\n          state.headers.map(h => `<td>${highlight(row[h])}<\/td>`).join('') +\n          '<\/tr>';\n      });\n\n      html += '<\/tbody><\/table><\/div>';\n\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>' +\n        `<div class=\"bd-page-info\">Registros por p\u00e1gina: <select id=\"bd-ps\"><option>10<\/option><option>20<\/option><option>50<\/option><option>100<\/option><\/select><\/div>` +\n      '<\/div>';\n    }\n\n    elResults.innerHTML = html;\n\n    const sel = document.querySelector('#bd-ps');\n    if(sel){\n      sel.value = String(state.pageSize);\n      sel.addEventListener('change', () => {\n        state.pageSize = parseInt(sel.value, 10) || 20;\n        state.page = 1;\n        render();\n      });\n    }\n\n    document.querySelectorAll('.bd-page-btn').forEach(b =>\n      b.addEventListener('click', () => {\n        const dir = b.getAttribute('data-page');\n\n        if(dir === 'prev' && state.page > 1){\n          state.page--;\n        }else if(dir === 'next' && state.page < pages){\n          state.page++;\n        }\n\n        render();\n      })\n    );\n  }\n\n  const onInput = debounce(() => {\n    state.query = elSearch.value;\n    state.page = 1;\n    render();\n  }, 160);\n\n  elSearch.addEventListener('input', onInput);\n\n  btnSearch.addEventListener('click', () => {\n    state.query = elSearch.value;\n    state.page = 1;\n    render();\n  });\n\n  elSearch.addEventListener('keydown', (e) => {\n    if(e.key === 'Enter'){\n      e.preventDefault();\n      btnSearch.click();\n    }\n  });\n\n  btnClear.addEventListener('click', () => {\n    elSearch.value = '';\n    state.query = '';\n    state.page = 1;\n    render();\n    elSearch.focus();\n  });\n\n  elExact.addEventListener('change', () => {\n    state.exact = elExact.checked;\n    state.page = 1;\n    render();\n  });\n\n  elDia.addEventListener('change', () => {\n    state.ignoreDiacritics = elDia.checked;\n    state.page = 1;\n    render();\n  });\n\n  function updateFootnote(){\n    const el = document.getElementById('bd-footnote');\n    if(!el) return;\n\n    const dt = new Date();\n    const fecha = dt.toLocaleDateString('es-ES', {\n      year:'numeric', month:'2-digit', day:'2-digit'\n    });\n    const hora = dt.toLocaleTimeString('es-ES', {\n      hour:'2-digit', minute:'2-digit'\n    });\n\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();\n  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=\"2026-09-22T10:20:58+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=\"7 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\":\"2026-09-22T10:20:58+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":"2026-09-22T10:20:58+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 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":"2026-09-22T10:20:58+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":59,"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/pages\/1088\/revisions"}],"predecessor-version":[{"id":1170,"href":"https:\/\/comercialcostas.com\/pt\/wp-json\/wp\/v2\/pages\/1088\/revisions\/1170"}],"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}]}}