{"id":2596,"date":"2026-04-15T10:25:51","date_gmt":"2026-04-15T10:25:51","guid":{"rendered":"https:\/\/buy-super.com\/?page_id=2596"},"modified":"2026-04-18T10:20:41","modified_gmt":"2026-04-18T10:20:41","slug":"lead-match","status":"publish","type":"page","link":"https:\/\/buy-super.com\/index.php\/lead-match\/","title":{"rendered":"Lead Match"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2596\" class=\"elementor elementor-2596\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8b174d7 e-flex e-con-boxed e-con e-parent\" data-id=\"8b174d7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9fce1c0 elementor-widget elementor-widget-html\" data-id=\"9fce1c0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/xlsx\/0.18.5\/xlsx.full.min.js\"><\/script>\r\n<script src=\"https:\/\/unpkg.com\/vue@3\/dist\/vue.global.prod.js\"><\/script>\r\n\r\n<style>\r\n    #merger-wrapper { all: initial; display: block; font-family: sans-serif; background: #f8fafc; padding: 25px; color: #333; }\r\n    #merger-wrapper * { box-sizing: border-box; }\r\n    .card { background: white; padding: 20px; border-radius: 8px; margin-bottom: 20px; border: 1px solid #e2e8f0; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1); }\r\n    .title { font-size: 20px; font-weight: bold; color: #1e293b; margin-bottom: 20px; border-bottom: 2px solid #3b82f6; padding-bottom: 10px; }\r\n    \r\n    .file-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }\r\n    .file-box { border: 2px dashed #cbd5e1; padding: 15px; border-radius: 8px; text-align: center; transition: 0.3s; }\r\n    .file-box.loaded { border-color: #10b981; background: #f0fdf4; }\r\n    \r\n    label { display: block; font-size: 12px; font-weight: bold; margin-bottom: 8px; color: #64748b; text-transform: uppercase; }\r\n    select, input { width: 100% !important; padding: 10px !important; border: 1px solid #cbd5e1 !important; border-radius: 6px !important; margin-bottom: 10px; background: white !important; }\r\n\r\n    .mapping-area { background: #eff6ff; padding: 15px; border-radius: 8px; border: 1px solid #bfdbfe; margin-top: 20px; }\r\n    .checkbox-group { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px; max-height: 200px; overflow-y: auto; background: white; padding: 15px; border: 1px solid #bfdbfe; border-radius: 4px; }\r\n    .checkbox-item { font-size: 12px; display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 5px; border-radius: 3px; }\r\n    .checkbox-item:hover { background: #f1f5f9; }\r\n\r\n    .btn { display: block; width: 100%; padding: 15px !important; border-radius: 6px !important; cursor: pointer !important; font-weight: bold !important; border: none !important; text-align: center; font-size: 15px; transition: 0.2s; color: white !important; }\r\n    .btn-process { background: #3b82f6 !important; margin-top: 20px; }\r\n    .btn-download { background: #059669 !important; margin-top: 10px; }\r\n\r\n    .status-msg { margin-top: 15px; padding: 10px; border-radius: 4px; font-size: 14px; border-left: 4px solid #3b82f6; background: #f1f5f9; }\r\n<\/style>\r\n\r\n<div id=\"merger-wrapper\">\r\n    <div id=\"merger-app\">\r\n        <div class=\"title\">\ud83d\udd0d Lead Matcher (Estrai dati da File B usando File A)<\/div>\r\n\r\n        <div class=\"file-grid\">\r\n            <div class=\"file-box\" :class=\"{loaded: fileA.data.length}\">\r\n                <label>1. FILE A (Leads da cercare, export da network)<\/label>\r\n                <input type=\"file\" @change=\"e => handleFile(e, 'A')\" accept=\".csv, .xlsx\">\r\n                <div v-if=\"fileA.data.length\" style=\"font-size:11px; color:#059669;\">{{fileA.data.length}} righe caricate<\/div>\r\n            <\/div>\r\n            <div class=\"file-box\" :class=\"{loaded: fileB.data.length}\">\r\n                <label>2. FILE B (Database Sorgente Dati, dati da submission)<\/label>\r\n                <input type=\"file\" @change=\"e => handleFile(e, 'B')\" accept=\".csv, .xlsx\">\r\n                <div v-if=\"fileB.data.length\" style=\"font-size:11px; color:#059669;\">{{fileB.data.length}} righe caricate<\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div v-if=\"fileA.data.length && fileB.data.length\" class=\"mapping-area\">\r\n            <div class=\"grid-row\" style=\"display:flex; gap:20px; margin-bottom:20px;\">\r\n                <div style=\"flex:1\">\r\n                    <label>Chiave di Match in FILE A<\/label>\r\n                    <select v-model=\"config.keyA\">\r\n                        <option value=\"\" disabled>Seleziona...<\/option>\r\n                        <option v-for=\"h in fileA.headers\" :value=\"h\">{{h}}<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n                <div style=\"flex:1\">\r\n                    <label>Chiave di Match in FILE B<\/label>\r\n                    <select v-model=\"config.keyB\">\r\n                        <option value=\"\" disabled>Seleziona...<\/option>\r\n                        <option v-for=\"h in fileB.headers\" :value=\"h\">{{h}}<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div v-if=\"fileB.headers.length\">\r\n                <label>Seleziona i campi da prelevare dal FILE B:<\/label>\r\n                <div class=\"checkbox-group\">\r\n                    <div v-for=\"h in fileB.headers\" :key=\"h\" class=\"checkbox-item\">\r\n                        <input type=\"checkbox\" :id=\"'field_'+h\" :value=\"h\" v-model=\"config.selectedFieldsB\">\r\n                        <label :for=\"'field_'+h\" style=\"margin:0; text-transform:none; font-weight:normal; cursor:pointer;\">{{h}}<\/label>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div v-if=\"statusMsg\" class=\"status-msg\">{{statusMsg}}<\/div>\r\n\r\n            <button v-if=\"!fileC\" @click=\"processFiles\" class=\"btn btn-process\">ESEGUI MATCH & ESTRAI DATI<\/button>\r\n            <button v-if=\"fileC\" @click=\"downloadFileC\" class=\"btn btn-download\">\ud83d\udcbe SCARICA FILE C (.CSV)<\/button>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function() {\r\n    const { createApp, ref, reactive } = Vue;\r\n    createApp({\r\n        setup() {\r\n            const fileA = reactive({ data: [], headers: [] });\r\n            const fileB = reactive({ data: [], headers: [] });\r\n            const fileC = ref(null);\r\n            const statusMsg = ref(\"\");\r\n            const config = reactive({ keyA: '', keyB: '', selectedFieldsB: [] });\r\n\r\n            const handleFile = (e, type) => {\r\n                const file = e.target.files[0];\r\n                const reader = new FileReader();\r\n                reader.onload = (evt) => {\r\n                    const wb = XLSX.read(evt.target.result, { type: 'binary' });\r\n                    const data = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], { defval: \"\" });\r\n                    if (type === 'A') {\r\n                        fileA.data = data;\r\n                        fileA.headers = Object.keys(data[0]);\r\n                    } else {\r\n                        fileB.data = data;\r\n                        fileB.headers = Object.keys(data[0]);\r\n                    }\r\n                    fileC.value = null; \/\/ Resetta se carichi nuovi file\r\n                };\r\n                reader.readAsBinaryString(file);\r\n            };\r\n\r\n            const processFiles = () => {\r\n                if (!config.keyA || !config.keyB) return alert(\"Seleziona le chiavi di match!\");\r\n                if (config.selectedFieldsB.length === 0) return alert(\"Seleziona almeno un campo da estrarre dal File B!\");\r\n\r\n                statusMsg.value = \"Confronto in corso...\";\r\n                \r\n                \/\/ Indicizziamo File B per velocit\u00e0\r\n                const indexB = new Map();\r\n                fileB.data.forEach(row => {\r\n                    const val = String(row[config.keyB]).trim().toLowerCase();\r\n                    if (val) indexB.set(val, row);\r\n                });\r\n\r\n                const result = [];\r\n                fileA.data.forEach(rowA => {\r\n                    const matchKey = String(rowA[config.keyA]).trim().toLowerCase();\r\n                    const rowB = indexB.get(matchKey);\r\n\r\n                    if (rowB) {\r\n                        const newRow = {};\r\n                        \/\/ Aggiungiamo sempre la chiave per riferimento\r\n                        newRow['Match_Key'] = rowA[config.keyA];\r\n                        \r\n                        \/\/ Estraiamo solo i campi scelti dal File B\r\n                        config.selectedFieldsB.forEach(field => {\r\n                            newRow[field] = rowB[field];\r\n                        });\r\n                        result.push(newRow);\r\n                    }\r\n                });\r\n\r\n                if (result.length === 0) {\r\n                    statusMsg.value = \"\u274c Nessuna corrispondenza trovata.\";\r\n                } else {\r\n                    fileC.value = result;\r\n                    statusMsg.value = `\u2705 Match riuscito! Trovate ${result.length} lead. Puoi scaricare il file.`;\r\n                }\r\n            };\r\n\r\n            const downloadFileC = () => {\r\n                const ws = XLSX.utils.json_to_sheet(fileC.value);\r\n                const csv = XLSX.utils.sheet_to_csv(ws);\r\n                const blob = new Blob([csv], { type: 'text\/csv;charset=utf-8;' });\r\n                const link = document.createElement(\"a\");\r\n                link.href = URL.createObjectURL(blob);\r\n                link.setAttribute(\"download\", \"estrazione_file_B.csv\");\r\n                link.click();\r\n            };\r\n\r\n            return { fileA, fileB, fileC, config, handleFile, processFiles, downloadFileC, statusMsg };\r\n        }\r\n    }).mount('#merger-app');\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\ud83d\udd0d Lead Matcher (Estrai dati da File B usando File A) 1. FILE A (Leads da cercare, export da network) handleFile(e, &#8216;B&#8217;)&#8221; accept=&#8221;.csv, .xlsx&#8221;> {{fileB.data.length}} righe caricate Chiave di Match in FILE A Seleziona&#8230;{{h}} Chiave di Match in FILE B Seleziona&#8230;{{h}} Seleziona i campi da prelevare dal FILE B: {{h}} {{statusMsg}} ESEGUI MATCH &#038; ESTRAI [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2596","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/buy-super.com\/index.php\/wp-json\/wp\/v2\/pages\/2596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buy-super.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/buy-super.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/buy-super.com\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/buy-super.com\/index.php\/wp-json\/wp\/v2\/comments?post=2596"}],"version-history":[{"count":10,"href":"https:\/\/buy-super.com\/index.php\/wp-json\/wp\/v2\/pages\/2596\/revisions"}],"predecessor-version":[{"id":2677,"href":"https:\/\/buy-super.com\/index.php\/wp-json\/wp\/v2\/pages\/2596\/revisions\/2677"}],"wp:attachment":[{"href":"https:\/\/buy-super.com\/index.php\/wp-json\/wp\/v2\/media?parent=2596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}