65 lines
3.8 KiB
Python
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)}")
|