Files
wevia-brain/s89-arsenal-screens/cvc-vault.html
2026-04-12 23:01:36 +02:00

275 lines
19 KiB
HTML
Executable File

<!DOCTYPE html><html lang="fr" data-theme="dark"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>WEVADS - CVC Vault</title>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=DM+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--m:#475569;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6}
body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;padding:20px}
.mono{font-family:'JetBrains Mono',monospace}
.hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;flex-wrap:wrap;gap:12px}
h1{font-size:24px;font-weight:700}h2{font-size:16px;font-weight:700;margin-bottom:12px}
.back{color:var(--d);text-decoration:none;font-size:12px;padding:6px 14px;border:1px solid var(--b);border-radius:8px}
.back:hover{border-color:var(--cy);color:var(--cy)}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px;margin-bottom:20px}
.sc{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:16px}
.sv{font-size:26px;font-weight:700;font-family:'JetBrains Mono',monospace}
.sl{font-size:10px;color:var(--d);text-transform:uppercase;letter-spacing:.5px;margin-top:4px}
.panel{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:16px;margin-bottom:16px}
table{width:100%;border-collapse:collapse;font-size:12px}
th{text-align:left;color:var(--d);font-size:10px;text-transform:uppercase;padding:8px 10px;border-bottom:1px solid var(--b)}
td{padding:8px 10px;border-bottom:1px solid rgba(30,41,59,.5)}
tr:hover{background:rgba(34,211,238,.03)}
.badge{padding:2px 8px;border-radius:6px;font-size:9px;font-weight:700;text-transform:uppercase}
.badge-ok{background:rgba(52,211,153,.15);color:var(--gn)}.badge-warn{background:rgba(251,191,36,.15);color:var(--am)}.badge-err{background:rgba(248,113,113,.15);color:var(--rd)}.badge-used{background:rgba(167,139,250,.15);color:var(--pu)}
.btn{padding:6px 14px;border-radius:8px;font-size:11px;font-weight:600;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;transition:all .2s;text-decoration:none;display:inline-block}
.btn:hover{border-color:var(--cy);color:var(--cy)}
.btn-p{background:rgba(34,211,238,.15);border-color:var(--cy);color:var(--cy)}
.btn-d{background:rgba(248,113,113,.1);border-color:var(--rd);color:var(--rd)}
.btn-sm{padding:3px 8px;font-size:10px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:900px){.grid2{grid-template-columns:1fr}}
input,select,textarea{background:var(--s2);border:1px solid var(--b);border-radius:8px;padding:8px 12px;color:var(--t);font-size:12px;width:100%}
input:focus,select:focus{outline:none;border-color:var(--cy)}
.tabs{display:flex;gap:4px;margin-bottom:16px;border-bottom:1px solid var(--b);padding-bottom:8px}
.tab{padding:6px 16px;border-radius:8px 8px 0 0;font-size:12px;font-weight:600;cursor:pointer;color:var(--d)}
.tab.active{color:var(--cy);background:rgba(34,211,238,.08);border-bottom:2px solid var(--cy)}
/* Credit card visual */
.card-visual{background:linear-gradient(135deg,#1a1a2e 0%,#16213e 50%,#0f3460 100%);border-radius:14px;padding:20px;width:320px;height:190px;position:relative;overflow:hidden;margin:10px auto;box-shadow:0 8px 32px rgba(0,0,0,.4)}
.card-visual::after{content:'';position:absolute;top:-50%;right:-50%;width:100%;height:100%;background:radial-gradient(circle,rgba(255,255,255,.05) 0%,transparent 70%);border-radius:50%}
.card-chip{width:40px;height:30px;background:linear-gradient(135deg,#c9a84c,#f0d68a,#c9a84c);border-radius:6px;margin-bottom:16px}
.card-number{font-family:'JetBrains Mono',monospace;font-size:18px;letter-spacing:3px;margin-bottom:16px;color:#fff}
.card-bottom{display:flex;justify-content:space-between;align-items:end}
.card-name{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:rgba(255,255,255,.7)}
.card-exp{font-size:11px;color:rgba(255,255,255,.7)}.card-exp span{display:block;font-size:8px;text-transform:uppercase;margin-bottom:2px}
.card-brand{position:absolute;bottom:20px;right:20px;font-size:24px;font-weight:700;color:rgba(255,255,255,.3)}
.fr{display:flex;gap:10px;margin-bottom:10px;align-items:end}.fr>div{flex:1}
.fr label{display:block;font-size:10px;color:var(--d);text-transform:uppercase;margin-bottom:4px;letter-spacing:.5px}
</style><style>.light{--bg:#f0f2f5;--s:#ffffff;--s2:#f8fafc;--b:#e2e8f0;--t:#1e293b;--d:#64748b}.light input,.light select,.light textarea{background:#f8fafc;border-color:#e2e8f0;color:#1e293b}</style>
<style id="weval-theme-system">
/* Day/Night Theme Toggle */
[data-theme="light"] { --bg:#f0f2f5!important; --s:#ffffff!important; --s2:#f8fafc!important; --b:#e2e8f0!important; --t:#1e293b!important; --d:#64748b!important; }
[data-theme="light"] input, [data-theme="light"] select, [data-theme="light"] textarea {
background:#f8fafc!important; border-color:#e2e8f0!important; color:#1e293b!important;
}
[data-theme="light"] .hdr, [data-theme="light"] header, [data-theme="light"] nav {
background:#ffffff!important; border-color:#e2e8f0!important;
}
[data-theme="light"] table, [data-theme="light"] th, [data-theme="light"] td {
border-color:#e2e8f0!important;
}
[data-theme="light"] th { background:#f8fafc!important; }
[data-theme="light"] .sc, [data-theme="light"] .card, [data-theme="light"] [class*="card"] {
background:#ffffff!important; border-color:#e2e8f0!important;
}
.weval-theme-btn {
position:fixed; bottom:16px; right:16px; z-index:9999;
width:40px; height:40px; border-radius:50%;
border:1px solid var(--b, #1e293b);
background:var(--s, #0c1220);
color:var(--t, #e2e8f0);
cursor:pointer; font-size:18px;
display:flex; align-items:center; justify-content:center;
box-shadow:0 2px 8px rgba(0,0,0,0.3);
transition:all 0.2s;
}
.weval-theme-btn:hover { transform:scale(1.1); }
</style>
</head><body>
<div class="hdr">
<div><h1>💳 CVC Vault</h1><div style="color:var(--d);font-size:12px;margin-top:2px">Systeme d'Identite → Cartes virtuelles pour personas et comptes</div></div>
<div style="display:flex;gap:8px"><a class="back" href="menu.html">← Menu</a><a class="back" href="mail-personas.html">Personas</a><a class="back" href="account-creator.html">Account Creator</a></div>
</div>
<div class="stats">
<div class="sc"><div class="sv" style="color:var(--cy)">2,847</div><div class="sl">Total Cards</div></div>
<div class="sc"><div class="sv" style="color:var(--gn)">2,134</div><div class="sl">Active</div></div>
<div class="sc"><div class="sv" style="color:var(--pu)">489</div><div class="sl">Assigned</div></div>
<div class="sc"><div class="sv" style="color:var(--am)">1,645</div><div class="sl">Available</div></div>
<div class="sc"><div class="sv" style="color:var(--rd)">224</div><div class="sl">Expired/Declined</div></div>
<div class="sc"><div class="sv" style="color:var(--bl)">$12,340</div><div class="sl">Total Spent</div></div>
</div>
<div class="tabs">
<div class="tab active" onclick="showTab('cards')">Card Inventory</div>
<div class="tab" onclick="showTab('gen')">+ Generate Cards</div>
<div class="tab" onclick="showTab('assign')">Assign to Persona</div>
<div class="tab" onclick="showTab('providers')">Providers</div>
<div class="tab" onclick="showTab('audit')">Audit Log</div>
</div>
<!-- CARDS TAB -->
<div id="tab-cards">
<div class="grid2">
<div class="panel">
<h2>Card Inventory</h2>
<div style="display:flex;gap:8px;margin-bottom:12px">
<select style="width:auto"><option>All Types</option><option>Visa</option><option>Mastercard</option><option>Amex</option></select>
<select style="width:auto"><option>All Status</option><option>Active</option><option>Assigned</option><option>Expired</option></select>
<input type="text" placeholder="Search BIN, last 4, persona..." style="width:200px">
</div>
<table>
<tr><th>Card</th><th>Type</th><th>BIN</th><th>Exp</th><th>Status</th><th>Persona</th><th></th></tr>
<tr><td class="mono">**** 4821</td><td>Visa</td><td class="mono">424242</td><td class="mono">03/27</td><td><span class="badge badge-ok">ACTIVE</span></td><td>Jean Dupont</td><td><button class="btn btn-sm">Details</button></td></tr>
<tr><td class="mono">**** 7734</td><td>MC</td><td class="mono">512345</td><td class="mono">08/26</td><td><span class="badge badge-used">ASSIGNED</span></td><td>Marie Bernard</td><td><button class="btn btn-sm">Details</button></td></tr>
<tr><td class="mono">**** 1290</td><td>Visa</td><td class="mono">489312</td><td class="mono">12/27</td><td><span class="badge badge-ok">ACTIVE</span></td><td></td><td><button class="btn btn-sm">Assign</button></td></tr>
<tr><td class="mono">**** 5543</td><td>Amex</td><td class="mono">371449</td><td class="mono">05/26</td><td><span class="badge badge-ok">ACTIVE</span></td><td>Pierre Martin</td><td><button class="btn btn-sm">Details</button></td></tr>
<tr><td class="mono">**** 8821</td><td>Visa</td><td class="mono">424242</td><td class="mono">01/26</td><td><span class="badge badge-err">EXPIRED</span></td><td>Luc Moreau</td><td><button class="btn btn-sm btn-d">Remove</button></td></tr>
<tr><td class="mono">**** 3398</td><td>MC</td><td class="mono">543210</td><td class="mono">11/27</td><td><span class="badge badge-ok">ACTIVE</span></td><td></td><td><button class="btn btn-sm">Assign</button></td></tr>
<tr><td class="mono">**** 6612</td><td>Visa</td><td class="mono">476123</td><td class="mono">07/27</td><td><span class="badge badge-used">ASSIGNED</span></td><td>Sophie Klein</td><td><button class="btn btn-sm">Details</button></td></tr>
<tr><td class="mono">**** 9945</td><td>MC</td><td class="mono">512345</td><td class="mono">02/27</td><td><span class="badge badge-warn">LOW BAL</span></td><td>Thomas Weber</td><td><button class="btn btn-sm">Top up</button></td></tr>
</table>
<div style="margin-top:10px;display:flex;gap:8px">
<button class="btn">Export CSV</button>
<button class="btn btn-d">Purge Expired</button>
</div>
</div>
<div>
<!-- CARD PREVIEW -->
<div class="panel">
<h2>Card Preview</h2>
<div class="card-visual">
<div class="card-chip"></div>
<div class="card-number">4242 •••• •••• 4821</div>
<div class="card-bottom">
<div><div class="card-name">Jean Dupont</div></div>
<div class="card-exp"><span>Expires</span>03/27</div>
</div>
<div class="card-brand">VISA</div>
</div>
<div style="margin-top:12px;text-align:center;font-size:11px;color:var(--d)">
CVC: <span class="mono" style="color:var(--am)">•••</span> · Balance: <span class="mono" style="color:var(--gn)">$245.00</span> · Created: 2025-12-15
</div>
</div>
<!-- STATS BY TYPE -->
<div class="panel">
<h2>Distribution</h2>
<table>
<tr><th>Provider</th><th>Cards</th><th>Active</th><th>Spend</th></tr>
<tr><td><b>Visa Virtual</b></td><td class="mono">1,420</td><td class="mono" style="color:var(--gn)">1,180</td><td class="mono">$6,800</td></tr>
<tr><td><b>Mastercard</b></td><td class="mono">890</td><td class="mono" style="color:var(--gn)">720</td><td class="mono">$3,200</td></tr>
<tr><td><b>Amex</b></td><td class="mono">340</td><td class="mono" style="color:var(--gn)">234</td><td class="mono">$1,890</td></tr>
<tr><td><b>Prepaid/Gift</b></td><td class="mono">197</td><td class="mono" style="color:var(--am)">120</td><td class="mono">$450</td></tr>
</table>
</div>
<div class="panel">
<h2>Quick Actions</h2>
<div style="display:flex;flex-wrap:wrap;gap:8px">
<button class="btn btn-p" onclick="showTab('gen')">Generate Cards</button>
<button class="btn" onclick="alert('Auto-assigning to unlinked personas...')">Auto-Assign</button>
<button class="btn" onclick="alert('Checking all active cards...')">Health Check</button>
<a class="btn" href="mail-personas.html">Personas</a>
<a class="btn" href="account-creator.html">Account Creator</a>
</div>
</div>
</div>
</div>
</div>
<!-- GENERATE TAB -->
<div id="tab-gen" style="display:none">
<div class="panel">
<h2>Generate Virtual Cards</h2>
<div class="fr">
<div><label>Provider</label><select id="gen-provider"><option>Privacy.com</option><option>Revolut Virtual</option><option>Wise Virtual</option><option>Stripe Issuing</option><option>Custom BIN</option></select></div>
<div><label>Card Type</label><select><option>Visa</option><option>Mastercard</option><option>Amex</option></select></div>
<div><label>Quantity</label><input type="number" value="50" placeholder="Cards to generate"></div>
<div><label>Initial Balance</label><input type="text" value="$25.00" placeholder="Per card"></div>
</div>
<div class="fr">
<div><label>BIN Prefix</label><input type="text" placeholder="424242 (auto from provider)"></div>
<div><label>Country</label><select><option>US</option><option>UK</option><option>FR</option><option>DE</option><option>Random EU</option></select></div>
<div><label>Expiry Range</label><select><option>12 months</option><option>24 months</option><option>36 months</option></select></div>
<div><label>Auto-Assign</label><select><option>No - Pool only</option><option selected>Yes - To available personas</option></select></div>
</div>
<div class="fr">
<div style="flex:2"><label>Billing Address Source</label><select><option selected>From assigned persona</option><option>Random (Lookalike Engine)</option><option>Custom address</option></select></div>
<div><label>Spending Limit/mo</label><input type="text" value="$100.00"></div>
</div>
<div style="display:flex;gap:8px;margin-top:8px">
<button class="btn btn-p" onclick="alert('Generating 50 Visa virtual cards via Privacy.com...')">Generate 50 Cards</button>
<button class="btn" onclick="alert('Test: generating 1 card...')">Test (1 card)</button>
</div>
</div>
</div>
<!-- ASSIGN TAB -->
<div id="tab-assign" style="display:none">
<div class="panel">
<h2>Assign Cards to Personas</h2>
<div style="margin-bottom:12px;font-size:12px;color:var(--d)">
<b style="color:var(--am)">1,645</b> cards available · <b style="color:var(--pu)">489</b> already assigned · <b style="color:var(--cy)">863</b> personas without card
</div>
<div class="fr">
<div><label>Assignment Mode</label><select><option selected>Auto (1 card per persona)</option><option>Manual selection</option><option>Batch by ISP</option></select></div>
<div><label>Target Personas</label><select><option selected>All without card (863)</option><option>Gmail personas only</option><option>O365 personas only</option><option>European personas</option></select></div>
<div><label>Card Pool</label><select><option selected>Available Visa (1,180)</option><option>Available MC (720)</option><option>Any available</option></select></div>
</div>
<div style="display:flex;gap:8px;margin-top:8px">
<button class="btn btn-p" onclick="alert('Auto-assigning 863 cards to personas...')">Auto-Assign All</button>
<button class="btn" onclick="alert('Preview assignments...')">Preview</button>
</div>
<div style="margin-top:16px;padding:12px;background:var(--s2);border-radius:8px;font-size:11px;color:var(--d)">
<b>Flux:</b> CVC Vault → Persona Factory → Account Creator → O365/GSuite registration<br>
Chaque persona recoit une carte unique pour verification de compte et abonnements.
</div>
</div>
</div>
<!-- PROVIDERS TAB -->
<div id="tab-providers" style="display:none">
<div class="panel">
<h2>Card Providers</h2>
<table>
<tr><th>Provider</th><th>API Status</th><th>Cards Created</th><th>Success Rate</th><th>Cost/Card</th><th></th></tr>
<tr><td><b>Privacy.com</b></td><td><span class="badge badge-ok">CONNECTED</span></td><td class="mono">1,420</td><td class="mono" style="color:var(--gn)">98%</td><td class="mono">$0.00</td><td><button class="btn btn-sm">Config</button></td></tr>
<tr><td><b>Revolut Business</b></td><td><span class="badge badge-ok">CONNECTED</span></td><td class="mono">640</td><td class="mono" style="color:var(--gn)">95%</td><td class="mono">$0.50</td><td><button class="btn btn-sm">Config</button></td></tr>
<tr><td><b>Wise Virtual</b></td><td><span class="badge badge-warn">API KEY</span></td><td class="mono">320</td><td class="mono" style="color:var(--am)">89%</td><td class="mono">$0.30</td><td><button class="btn btn-sm">Setup</button></td></tr>
<tr><td><b>Stripe Issuing</b></td><td><span class="badge badge-err">NOT SET</span></td><td class="mono">0</td><td class="mono"></td><td class="mono">$1.00</td><td><button class="btn btn-sm btn-p">Connect</button></td></tr>
</table>
<div style="margin-top:12px">
<div class="fr">
<div><label>API Key</label><input type="password" placeholder="pk_live_..."></div>
<div><label>Webhook URL</label><input type="text" value="http://89.167.40.150:5825/api/cvc-webhook.php" readonly></div>
<div style="flex:0"><label>&nbsp;</label><button class="btn btn-p">Save</button></div>
</div>
</div>
</div>
</div>
<!-- AUDIT TAB -->
<div id="tab-audit" style="display:none">
<div class="panel">
<h2>Audit Log</h2>
<table>
<tr><th>Time</th><th>Action</th><th>Card</th><th>Persona</th><th>Details</th></tr>
<tr><td class="mono" style="color:var(--d)">22:24:10</td><td>ASSIGNED</td><td class="mono">****4821</td><td>Jean Dupont</td><td style="color:var(--gn)">Auto-assigned from pool</td></tr>
<tr><td class="mono" style="color:var(--d)">22:23:45</td><td>GENERATED</td><td class="mono">****3398</td><td></td><td>50 cards batch via Privacy.com</td></tr>
<tr><td class="mono" style="color:var(--d)">22:20:12</td><td>CHARGED</td><td class="mono">****7734</td><td>Marie Bernard</td><td style="color:var(--am)">$4.99 - O365 subscription</td></tr>
<tr><td class="mono" style="color:var(--d)">22:18:30</td><td>DECLINED</td><td class="mono">****8821</td><td>Luc Moreau</td><td style="color:var(--rd)">Insufficient balance</td></tr>
<tr><td class="mono" style="color:var(--d)">22:15:00</td><td>TOPPED UP</td><td class="mono">****9945</td><td>Thomas Weber</td><td style="color:var(--gn)">+$50.00</td></tr>
<tr><td class="mono" style="color:var(--d)">22:10:44</td><td>EXPIRED</td><td class="mono">****2210</td><td></td><td style="color:var(--rd)">Auto-removed from pool</td></tr>
</table>
</div>
</div>
<script>
function showTab(n){document.querySelectorAll('[id^="tab-"]').forEach(t=>t.style.display='none');document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));document.getElementById('tab-'+n).style.display='block';event.target.classList.add('active');}
</script>
<script>function toggleTheme(){var b=document.body,t=document.getElementById("theme-toggle");if(b.classList.contains("light")){b.classList.remove("light");t.textContent="🌙";localStorage.setItem("wevads-theme","dark")}else{b.classList.add("light");t.textContent="☀️";localStorage.setItem("wevads-theme","light")}}if(localStorage.getItem("wevads-theme")==="light"){document.body.classList.add("light");var tb=document.getElementById("theme-toggle");if(tb)tb.textContent="☀️"}</script><script src="arsenal-common.js"></script>
<button class="weval-theme-btn" id="weval-theme-toggle" onclick="(function(){
var h=document.documentElement;
var c=h.getAttribute('data-theme')||'dark';
var n=c==='dark'?'light':'dark';
h.setAttribute('data-theme',n);
localStorage.setItem('weval-theme',n);
document.getElementById('weval-theme-toggle').textContent=n==='dark'?'☀️':'🌙';
})()">☀️</button>