86 lines
3.4 KiB
PHP
86 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use App\Core\Database;
|
|
use App\Core\Request;
|
|
use App\Core\Response;
|
|
use App\Services\CliqPaymentService;
|
|
|
|
class SuperAdminController
|
|
{
|
|
public function overview(Request $request, Response $response): void
|
|
{
|
|
CliqPaymentService::ensureSchema();
|
|
|
|
$counts = [
|
|
'total_directorates' => $this->count('directorates'),
|
|
'total_schools' => $this->count('schools'),
|
|
'total_students' => $this->count('students'),
|
|
'total_teachers' => $this->count('teachers'),
|
|
];
|
|
$payments = Database::selectOne(
|
|
"SELECT COALESCE(SUM(CASE WHEN verification_status = 'verified' THEN amount_jod ELSE 0 END), 0) AS inflow FROM cliq_payments"
|
|
);
|
|
$payouts = Database::selectOne(
|
|
"SELECT SUM(CASE WHEN status IN ('queued', 'processing') THEN 1 ELSE 0 END) AS pending_count,
|
|
COALESCE(SUM(CASE WHEN status = 'completed' THEN amount_jod ELSE 0 END), 0) AS paid_out
|
|
FROM payout_queue"
|
|
);
|
|
$inflow = (float)($payments['inflow'] ?? 0);
|
|
$paidOut = (float)($payouts['paid_out'] ?? 0);
|
|
|
|
$response->json([
|
|
'status' => 'success',
|
|
'data' => array_merge($counts, [
|
|
'gross_margin_percent' => $inflow > 0 ? round((($inflow - $paidOut) / $inflow) * 100, 2) : 0.0,
|
|
'treasury_balance_jod' => max(0, $inflow - $paidOut),
|
|
'total_cliq_inflow_jod' => $inflow,
|
|
'pending_payouts_count' => (int)($payouts['pending_count'] ?? 0),
|
|
'r2_cost_savings_jod' => 0.0,
|
|
'uptime_percent' => 0.0,
|
|
'measurement_notes' => [
|
|
'r2_cost_savings_jod' => 'يتطلب ربط Cloudflare Billing Analytics',
|
|
'uptime_percent' => 'يتطلب ربط مزود مراقبة خارجي',
|
|
],
|
|
]),
|
|
]);
|
|
}
|
|
|
|
public function payouts(Request $request, Response $response): void
|
|
{
|
|
CliqPaymentService::ensureSchema();
|
|
$items = Database::select(
|
|
"SELECT pq.id, t.full_name AS teacher_name, pq.teacher_cliq_alias AS cliq_alias,
|
|
pq.amount_jod, pq.created_at AS requested_at, pq.status
|
|
FROM payout_queue pq
|
|
JOIN teachers t ON t.id = pq.teacher_id
|
|
ORDER BY pq.id DESC LIMIT 100"
|
|
);
|
|
$response->json(['status' => 'success', 'data' => $items]);
|
|
}
|
|
|
|
public function aiNodes(Request $request, Response $response): void
|
|
{
|
|
$configured = trim((string)getenv('SAQEL_AI_NODES_JSON'));
|
|
$nodes = $configured !== '' ? json_decode($configured, true) : [];
|
|
if (!is_array($nodes)) {
|
|
$response->status(500)->json(['status' => 'error', 'message' => 'إعداد عقد الذكاء الاصطناعي غير صالح']);
|
|
return;
|
|
}
|
|
$response->json(['status' => 'success', 'data' => array_values($nodes)]);
|
|
}
|
|
|
|
public function securityAlerts(Request $request, Response $response): void
|
|
{
|
|
// No synthetic alerts: an audit-event pipeline will populate this endpoint.
|
|
$response->json(['status' => 'success', 'data' => []]);
|
|
}
|
|
|
|
private function count(string $table): int
|
|
{
|
|
$row = Database::selectOne("SELECT COUNT(*) AS count_value FROM `{$table}`");
|
|
return (int)($row['count_value'] ?? 0);
|
|
}
|
|
}
|