82 lines
4.4 KiB
Python
82 lines
4.4 KiB
Python
#!/usr/bin/env python3
|
|
path = "/var/www/html/wevia-ia/wevia-admin-crm-v68.php"
|
|
with open(path, "r", encoding="utf-8") as f:
|
|
c = f.read()
|
|
|
|
if 'data-p="weval"' in c:
|
|
print("ALREADY_PATCHED")
|
|
exit(0)
|
|
|
|
# 1. Add WEVAL CRM tab (between Twenty and Lookup)
|
|
old_tab = '<div class="tab" data-p="lookup">🔍 Triple Lookup</div>'
|
|
new_tabs = '<div class="tab" data-p="weval">💼 WEVAL CRM Deals</div>\n <div class="tab" data-p="lookup">🔍 Quadruple Lookup</div>'
|
|
c = c.replace(old_tab, new_tabs, 1)
|
|
|
|
# 2. Add WEVAL CRM pane (before Lookup pane)
|
|
old_pane = '<!-- Lookup -->'
|
|
new_pane = '''<!-- WEVAL CRM -->
|
|
<div class="pane" id="p-weval">
|
|
<div class="grid" id="weval-stats"><div class="loading">⏳</div></div>
|
|
<div class="section">
|
|
<h2><span class="bl"></span>Deals Pipeline (6 deals, 104k€ weighted)</h2>
|
|
<table><thead><tr><th>Title</th><th>Company</th><th>Stage</th><th>Value</th><th>Prob</th><th>Partner</th></tr></thead>
|
|
<tbody id="weval-deals-body"><tr><td colspan="6" class="loading">⏳</td></tr></tbody></table>
|
|
</div>
|
|
<div class="section">
|
|
<h2><span class="bl"></span>Breakdown by Stage</h2>
|
|
<div id="weval-stages"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Lookup -->'''
|
|
c = c.replace(old_pane, new_pane, 1)
|
|
|
|
# 3. Add loadWeval to loadPane switcher and loadWeval function
|
|
old_loader = "if (p === 'twenty') loadTwenty();"
|
|
new_loader = """if (p === 'twenty') loadTwenty();
|
|
if (p === 'weval') loadWeval();"""
|
|
c = c.replace(old_loader, new_loader, 1)
|
|
|
|
# 4. Add loadWeval function (before doLookup)
|
|
old_doLookup = "async function doLookup() {"
|
|
new_weval_fn = """async function loadWeval() {
|
|
const r = await fetch(API + '&action=weval_crm_deals').then(r => r.json());
|
|
document.getElementById('weval-stats').innerHTML = `
|
|
<div class="card c-pri"><div class="v">${r.deals.length}</div><div class="l">Deals total</div></div>
|
|
<div class="card c-info"><div class="v">${r.companies_count}</div><div class="l">Companies</div></div>
|
|
<div class="card c-suc"><div class="v">${r.contacts_count}</div><div class="l">Contacts</div></div>
|
|
<div class="card c-warn"><div class="v">${Math.round(r.pipeline_weighted).toLocaleString()}</div><div class="l">Pipeline pondéré</div></div>
|
|
<div class="card c-neu"><div class="v">${r.won}</div><div class="l">Won</div></div>`;
|
|
const stageColors = {prospect:'#94a3b8', qualified:'#22d3ee', proposal:'#a78bfa', negotiation:'#f59e0b', won:'#10b981', lost:'#ef4444'};
|
|
document.getElementById('weval-deals-body').innerHTML = r.deals.map(d => `<tr>
|
|
<td><strong>${d.title}</strong></td>
|
|
<td>${d.company_name||'-'}</td>
|
|
<td><span class="badge" style="background:${stageColors[d.stage]||'#888'}22;color:${stageColors[d.stage]||'#888'}">${d.stage}</span></td>
|
|
<td><strong>${Number(d.value).toLocaleString()} ${d.currency}</strong></td>
|
|
<td>${d.probability}%</td>
|
|
<td>${d.partner||'-'}</td>
|
|
</tr>`).join('');
|
|
document.getElementById('weval-stages').innerHTML = r.stats_by_stage.map(s => `
|
|
<div class="circle-bar">
|
|
<div class="lbl"><span class="badge" style="background:${stageColors[s.stage]||'#888'}22;color:${stageColors[s.stage]||'#888'}">${s.stage}</span></div>
|
|
<div class="bar-wrap"><div class="bar" style="width:${(s.v / 500000)*100}%;background:${stageColors[s.stage]||'#888'}"></div></div>
|
|
<div class="val">${Number(s.v).toLocaleString()} · ${s.c} deals</div>
|
|
</div>`).join('<div style="height:6px"></div>');
|
|
}
|
|
|
|
async function doLookup() {"""
|
|
c = c.replace(old_doLookup, new_weval_fn, 1)
|
|
|
|
# 5. Add weval_crm section to doLookup result (after forms)
|
|
old_result = "${r.forms.length ? `<h3 style=\"margin-top:14px;font-size:13px;color:#22d3ee\">📝 Form submissions"
|
|
new_result = """${r.weval_crm && r.weval_crm.length ? `<h3 style="margin-top:14px;font-size:13px;color:#f59e0b">💼 WEVAL CRM Deals (${r.weval_crm.length})</h3>
|
|
${r.weval_crm.map(d=>`<div class="mini" style="padding:8px;background:rgba(255,255,255,.02);border-radius:6px;margin-top:6px">
|
|
<strong>${d.title}</strong> · ${d.company} · Stage: ${d.stage} · ${Number(d.value).toLocaleString()} ${d.currency} · Prob: ${d.probability}% · Partner: ${d.partner||'-'}
|
|
</div>`).join('')}`:''}
|
|
${r.forms.length ? `<h3 style="margin-top:14px;font-size:13px;color:#22d3ee">📝 Form submissions"""
|
|
c = c.replace(old_result, new_result, 1)
|
|
|
|
with open(path, "w", encoding="utf-8") as f:
|
|
f.write(c)
|
|
print(f"PATCHED ok - size now {len(c)}")
|