320 lines
12 KiB
PHP
320 lines
12 KiB
PHP
<?php
|
|
|
|
class DashboardModel
|
|
{
|
|
protected static $db;
|
|
|
|
public static function setDb($pdo)
|
|
{
|
|
self::$db = $pdo;
|
|
}
|
|
|
|
/**
|
|
* კლიენტების სტატისტიკა
|
|
*/
|
|
public static function getClientStats()
|
|
{
|
|
$stats = [];
|
|
|
|
try {
|
|
// სულ კლიენტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM clients");
|
|
$stats['total'] = $stmt->fetchColumn();
|
|
|
|
// აქტიური კლიენტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM clients WHERE status = 'active'");
|
|
$stats['active'] = $stmt->fetchColumn();
|
|
|
|
// ამ თვის ახალი კლიენტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM clients WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')");
|
|
$stats['this_month'] = $stmt->fetchColumn();
|
|
|
|
// გუშინდელი ახალი კლიენტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM clients WHERE DATE(created_at) = CURDATE() - INTERVAL 1 DAY");
|
|
$stats['yesterday'] = $stmt->fetchColumn();
|
|
} catch (Exception $e) {
|
|
// თუ clients ცხრილი არ არსებობს
|
|
$stats = [
|
|
'total' => 0,
|
|
'active' => 0,
|
|
'this_month' => 0,
|
|
'yesterday' => 0
|
|
];
|
|
}
|
|
|
|
return $stats;
|
|
}
|
|
|
|
/**
|
|
* პროდუქტების სტატისტიკა
|
|
*/
|
|
public static function getProductStats()
|
|
{
|
|
$stats = [];
|
|
|
|
try {
|
|
// სულ პროდუქტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM products");
|
|
$stats['total'] = $stmt->fetchColumn();
|
|
|
|
// აქტიური პროდუქტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM products WHERE status = 'active'");
|
|
$stats['active'] = $stmt->fetchColumn();
|
|
|
|
// ამ თვის ახალი პროდუქტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM products WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')");
|
|
$stats['this_month'] = $stmt->fetchColumn();
|
|
} catch (Exception $e) {
|
|
// თუ products ცხრილი არ არსებობს
|
|
$stats['total'] = 0;
|
|
$stats['active'] = 0;
|
|
$stats['this_month'] = 0;
|
|
}
|
|
|
|
try {
|
|
// პროდუქტის ტიპები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM product_types WHERE is_active = 1");
|
|
$stats['types'] = $stmt->fetchColumn();
|
|
} catch (Exception $e) {
|
|
// თუ product_types ცხრილი არ არსებობს
|
|
$stats['types'] = 0;
|
|
}
|
|
|
|
return $stats;
|
|
}
|
|
|
|
/**
|
|
* ბილინგის სტატისტიკა
|
|
*/
|
|
public static function getBillingStats()
|
|
{
|
|
$stats = [];
|
|
|
|
try {
|
|
// სულ ინვოისები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM invoices");
|
|
$stats['total_invoices'] = $stmt->fetchColumn();
|
|
|
|
// გადახდილი ინვოისები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM invoices WHERE status = 'paid'");
|
|
$stats['paid_invoices'] = $stmt->fetchColumn();
|
|
|
|
// გადაუხდელი ინვოისები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM invoices WHERE status = 'pending'");
|
|
$stats['pending_invoices'] = $stmt->fetchColumn();
|
|
|
|
// სულ ტრანზაქციები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM transactions");
|
|
$stats['total_transactions'] = $stmt->fetchColumn();
|
|
|
|
// ამ თვის შემოსავალი
|
|
$stmt = self::$db->query("SELECT COALESCE(SUM(amount), 0) FROM transactions WHERE status = 'completed' AND created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')");
|
|
$stats['monthly_revenue'] = $stmt->fetchColumn();
|
|
|
|
// სულ შემოსავალი
|
|
$stmt = self::$db->query("SELECT COALESCE(SUM(amount), 0) FROM transactions WHERE status = 'completed'");
|
|
$stats['total_revenue'] = $stmt->fetchColumn();
|
|
} catch (Exception $e) {
|
|
// თუ billing ცხრილები არ არსებობს
|
|
$stats = [
|
|
'total_invoices' => 0,
|
|
'paid_invoices' => 0,
|
|
'pending_invoices' => 0,
|
|
'total_transactions' => 0,
|
|
'monthly_revenue' => 0,
|
|
'total_revenue' => 0
|
|
];
|
|
}
|
|
|
|
return $stats;
|
|
}
|
|
|
|
/**
|
|
* მომხმარებლების სტატისტიკა
|
|
*/
|
|
public static function getUserStats()
|
|
{
|
|
$stats = [];
|
|
|
|
// სულ მომხმარებლები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM users");
|
|
$stats['total'] = $stmt->fetchColumn();
|
|
|
|
// აქტიური მომხმარებლები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE is_active = 1");
|
|
$stats['active'] = $stmt->fetchColumn();
|
|
|
|
// ადმინისტრატორები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE role = 'admin'");
|
|
$stats['admins'] = $stmt->fetchColumn();
|
|
|
|
// ამ თვის ახალი მომხმარებლები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')");
|
|
$stats['this_month'] = $stmt->fetchColumn();
|
|
|
|
return $stats;
|
|
}
|
|
|
|
/**
|
|
* მარკეტინგის სტატისტიკა
|
|
*/
|
|
public static function getMarketingStats()
|
|
{
|
|
$stats = [];
|
|
|
|
try {
|
|
// სულ გაგზავნილი ელ.ფოსტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM email_logs");
|
|
$stats['total_emails'] = $stmt->fetchColumn();
|
|
|
|
// წარმატებით გაგზავნილი
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM email_logs WHERE status = 'sent'");
|
|
$stats['sent_emails'] = $stmt->fetchColumn();
|
|
|
|
// ვერ გაგზავნილი
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM email_logs WHERE status = 'failed'");
|
|
$stats['failed_emails'] = $stmt->fetchColumn();
|
|
|
|
// ამ თვის ელ.ფოსტები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM email_logs WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')");
|
|
$stats['this_month'] = $stmt->fetchColumn();
|
|
} catch (Exception $e) {
|
|
// თუ email_logs ცხრილი არ არსებობს
|
|
$stats = [
|
|
'total_emails' => 0,
|
|
'sent_emails' => 0,
|
|
'failed_emails' => 0,
|
|
'this_month' => 0
|
|
];
|
|
}
|
|
|
|
return $stats;
|
|
}
|
|
|
|
/**
|
|
* ბოლო აქტივობა
|
|
*/
|
|
public static function getRecentActivity()
|
|
{
|
|
$activities = [];
|
|
|
|
try {
|
|
// ბოლო კლიენტები
|
|
$stmt = self::$db->query("
|
|
SELECT 'client' as type, CONCAT(first_name, ' ', last_name) as title, created_at
|
|
FROM clients
|
|
ORDER BY created_at DESC
|
|
LIMIT 3
|
|
");
|
|
$activities = array_merge($activities, $stmt->fetchAll(PDO::FETCH_ASSOC));
|
|
} catch (Exception $e) {
|
|
// clients ცხრილი არ არსებობს
|
|
}
|
|
|
|
try {
|
|
// ბოლო ინვოისები
|
|
$stmt = self::$db->query("
|
|
SELECT 'invoice' as type, CONCAT('ინვოისი #', id) as title, created_at
|
|
FROM invoices
|
|
ORDER BY created_at DESC
|
|
LIMIT 3
|
|
");
|
|
$activities = array_merge($activities, $stmt->fetchAll(PDO::FETCH_ASSOC));
|
|
} catch (Exception $e) {
|
|
// invoices ცხრილი არ არსებობს
|
|
}
|
|
|
|
try {
|
|
// ბოლო ტრანზაქციები
|
|
$stmt = self::$db->query("
|
|
SELECT 'transaction' as type, CONCAT('ტრანზაქცია ', amount, ' ლარი') as title, created_at
|
|
FROM transactions
|
|
ORDER BY created_at DESC
|
|
LIMIT 3
|
|
");
|
|
$activities = array_merge($activities, $stmt->fetchAll(PDO::FETCH_ASSOC));
|
|
} catch (Exception $e) {
|
|
// transactions ცხრილი არ არსებობს
|
|
}
|
|
|
|
try {
|
|
// ბოლო მომხმარებლები
|
|
$stmt = self::$db->query("
|
|
SELECT 'user' as type, CONCAT(first_name, ' ', last_name, ' - მომხმარებელი') as title, created_at
|
|
FROM users
|
|
ORDER BY created_at DESC
|
|
LIMIT 3
|
|
");
|
|
$activities = array_merge($activities, $stmt->fetchAll(PDO::FETCH_ASSOC));
|
|
} catch (Exception $e) {
|
|
// users ცხრილი არ არსებობს
|
|
}
|
|
|
|
// დალაგება თარიღის მიხედვით
|
|
if (!empty($activities)) {
|
|
usort($activities, function($a, $b) {
|
|
return strtotime($b['created_at']) - strtotime($a['created_at']);
|
|
});
|
|
}
|
|
|
|
return array_slice($activities, 0, 10);
|
|
}
|
|
|
|
/**
|
|
* სისტემის ზოგადი სტატისტიკა
|
|
*/
|
|
public static function getSystemStats()
|
|
{
|
|
return [
|
|
'clients' => self::getClientStats(),
|
|
'products' => self::getProductStats(),
|
|
'billing' => self::getBillingStats(),
|
|
'users' => self::getUserStats(),
|
|
'marketing' => self::getMarketingStats(),
|
|
'server' => self::getServerStats(),
|
|
'recent_activity' => self::getRecentActivity()
|
|
];
|
|
}
|
|
|
|
/**
|
|
* სერვერის სტატისტიკა
|
|
*/
|
|
public static function getServerStats()
|
|
{
|
|
$stats = [];
|
|
|
|
// სერვერის ინფორმაცია
|
|
$stats['php_version'] = PHP_VERSION;
|
|
|
|
try {
|
|
$stats['mysql_version'] = self::$db->query("SELECT VERSION()")->fetchColumn();
|
|
} catch (Exception $e) {
|
|
$stats['mysql_version'] = 'N/A';
|
|
}
|
|
|
|
// მეხსიერება
|
|
$stats['memory_usage'] = round(memory_get_usage(true) / 1024 / 1024, 2); // MB
|
|
$stats['memory_limit'] = ini_get('memory_limit');
|
|
|
|
// დისკის ადგილი
|
|
$stats['disk_free'] = disk_free_space('.') ? round(disk_free_space('.') / 1024 / 1024 / 1024, 2) : 0; // GB
|
|
$stats['disk_total'] = disk_total_space('.') ? round(disk_total_space('.') / 1024 / 1024 / 1024, 2) : 0; // GB
|
|
|
|
// პროცესორი (load average) - Linux სისტემისთვის
|
|
if (is_readable('/proc/loadavg')) {
|
|
$load = file_get_contents('/proc/loadavg');
|
|
$load_avg = explode(' ', $load);
|
|
$stats['cpu_load'] = round(floatval($load_avg[0]), 2);
|
|
} else {
|
|
$stats['cpu_load'] = 0;
|
|
}
|
|
|
|
// უფრო ინფორმატიული სტატისტიკა
|
|
$stats['max_execution_time'] = ini_get('max_execution_time');
|
|
$stats['upload_max_filesize'] = ini_get('upload_max_filesize');
|
|
|
|
return $stats;
|
|
}
|
|
}
|
|
?>
|