Files
weval-l99/patch_bridge_v69.py
2026-04-20 04:10:40 +02:00

65 lines
3.8 KiB
Python

#!/usr/bin/env python3
path = "/var/www/html/api/wevia-admin-crm-bridge-v68.php"
with open(path, "r", encoding="utf-8") as f:
c = f.read()
if "weval_crm_deals" in c:
print("ALREADY_PATCHED")
exit(0)
# 1) Add weval_crm_deals action
new_action = """
if ($action === 'weval_crm_deals') {
$deals = $local->query("SELECT d.id, d.title, d.stage, d.value::float as value, d.currency, d.probability, d.partner, d.expected_close, d.created_at, COALESCE(c.name, '-') as company_name FROM deals d LEFT JOIN companies c ON c.id = d.company_id ORDER BY d.value::float DESC")->fetchAll(PDO::FETCH_ASSOC);
$stats = $local->query("SELECT stage, COUNT(*) as c, SUM(value::float) as v FROM deals GROUP BY stage ORDER BY 3 DESC")->fetchAll(PDO::FETCH_ASSOC);
$companies_count = (int)$local->query("SELECT COUNT(*) FROM companies")->fetchColumn();
$contacts_count = (int)$local->query("SELECT COUNT(*) FROM contacts")->fetchColumn();
$won = (int)$local->query("SELECT COUNT(*) FROM deals WHERE stage='won'")->fetchColumn();
// Weighted pipeline (value * probability/100)
$weighted = (float)$local->query("SELECT COALESCE(SUM(value::float * probability::float/100), 0) FROM deals WHERE stage NOT IN ('won','lost')")->fetchColumn();
echo json_encode(['ok'=>true, 'deals'=>$deals, 'stats_by_stage'=>$stats, 'companies_count'=>$companies_count, 'contacts_count'=>$contacts_count, 'won'=>$won, 'pipeline_weighted'=>$weighted]);
exit;
}
"""
# Insert before the final 'unknown action' echo
marker = "echo json_encode(['error' => 'unknown'"
c_new = c.replace(marker, new_action + " " + marker, 1)
# 2) Update global_stats to include weval_crm
old_crm = "'twenty_opportunities' => (int)$tw->query(\"SELECT COUNT(*) FROM $TWENTY_WS.opportunity\")->fetchColumn()"
new_crm = """'twenty_opportunities' => (int)$tw->query("SELECT COUNT(*) FROM $TWENTY_WS.opportunity")->fetchColumn(),
'weval_crm_deals' => (int)$local->query("SELECT COUNT(*) FROM deals")->fetchColumn(),
'weval_crm_companies' => (int)$local->query("SELECT COUNT(*) FROM companies")->fetchColumn(),
'weval_crm_contacts' => (int)$local->query("SELECT COUNT(*) FROM contacts")->fetchColumn(),
'weval_crm_pipeline_weighted' => (float)$local->query("SELECT COALESCE(SUM(value::float * probability::float/100), 0) FROM deals WHERE stage NOT IN ('won','lost')")->fetchColumn()"""
c_new = c_new.replace(old_crm, new_crm, 1)
# 3) Update actions list
c_new = c_new.replace(
"'actions' => ['global_stats','visitors_rich','forms_rich','saas_chats','twenty_crm','crm_triple_lookup']",
"'actions' => ['global_stats','visitors_rich','forms_rich','saas_chats','twenty_crm','weval_crm_deals','crm_triple_lookup']"
)
# 4) Enrich crm_triple_lookup to check weval_crm deals too (by company name match)
old_lookup = '$res[\'forms\'] = $q->fetchAll(PDO::FETCH_ASSOC);'
new_lookup = """$res['forms'] = $q->fetchAll(PDO::FETCH_ASSOC);
// WEVAL CRM deals (by domain/company match)
$domain_part = substr(strrchr($email, "@"), 1);
if ($domain_part) {
$q = $local->prepare("SELECT d.id, d.title, d.stage, d.value::float as value, d.currency, d.probability, d.partner, c.name as company, c.domain FROM deals d LEFT JOIN companies c ON c.id = d.company_id WHERE c.domain ILIKE ? OR LOWER(c.name) ILIKE ?");
$q->execute(['%' . $domain_part . '%', '%' . strtolower(explode('.', $domain_part)[0]) . '%']);
$res['weval_crm'] = $q->fetchAll(PDO::FETCH_ASSOC);
if (count($res['weval_crm']) > 0) $res['found_in'][] = 'weval_crm';
} else {
$res['weval_crm'] = [];
}"""
c_new = c_new.replace(old_lookup, new_lookup, 1)
with open(path, "w", encoding="utf-8") as f:
f.write(c_new)
print(f"PATCHED - size {len(c)}{len(c_new)}")