Files
musadaq-saas/app/Modules/Dashboard/DashboardController.php

69 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Modules\Dashboard;
use App\Core\{Request, Response, Database};
final class DashboardController
{
public function getStats(Request $request): void
{
$tenantId = $request->tenantId;
$role = $request->user->role ?? 'viewer';
$assignedCompanyId = $request->user->assigned_company_id ?? null;
$db = Database::getInstance();
$companyScope = '';
$params = [$tenantId];
if ($role === 'accountant' && $assignedCompanyId) {
$companyScope = ' AND i.company_id = ?';
$params[] = $assignedCompanyId;
}
// Total this month
$stmt = $db->prepare("SELECT COUNT(*) FROM invoices i
WHERE i.tenant_id = ? {$companyScope} AND MONTH(i.created_at) = MONTH(CURDATE()) AND YEAR(i.created_at) = YEAR(CURDATE()) AND i.deleted_at IS NULL");
$stmt->execute($params);
$thisMonth = (int)$stmt->fetchColumn();
// Status distribution
$stmt = $db->prepare("SELECT status, COUNT(*) as count FROM invoices i
WHERE i.tenant_id = ? {$companyScope} AND i.deleted_at IS NULL GROUP BY status");
$stmt->execute($params);
$statusDistribution = $stmt->fetchAll();
// Subscription usage
$stmt = $db->prepare("SELECT max_invoices_per_month, invoices_used_this_month FROM subscriptions WHERE tenant_id = ?");
$stmt->execute([$tenantId]);
$sub = $stmt->fetch();
$usagePct = $sub && $sub['max_invoices_per_month'] > 0
? round(($sub['invoices_used_this_month'] / $sub['max_invoices_per_month']) * 100)
: 0;
// Recent invoices
$stmt = $db->prepare("SELECT i.id, i.invoice_number, i.invoice_date, i.grand_total, i.status, i.created_at, c.name as company_name, i.ai_confidence_score
FROM invoices i
JOIN companies c ON i.company_id = c.id
WHERE i.tenant_id = ? {$companyScope} AND i.deleted_at IS NULL
ORDER BY i.created_at DESC LIMIT 10");
$stmt->execute($params);
$recent = $stmt->fetchAll();
// Pending extraction (from queue)
$stmt = $db->prepare("SELECT COUNT(*) FROM queue_jobs WHERE tenant_id = ? AND status = 'pending' AND job_type = 'ExtractInvoiceJob'");
$stmt->execute([$tenantId]);
$pendingExtraction = (int)$stmt->fetchColumn();
Response::json([
'success' => true,
'data' => [
'total_this_month' => $thisMonth,
'subscription_usage' => $usagePct,
'status_distribution' => $statusDistribution,
'recent_invoices' => $recent,
'pending_extraction' => $pendingExtraction
]
]);
}
}