$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); } }