Files
saqel/backend/app/Controllers/CliqPaymentController.php
T

117 lines
4.3 KiB
PHP

<?php
/**
* ==============================================================================
* SAQEL ENTERPRISE - CLIQ PAYMENT & TEACHER PAYOUT CONTROLLER
* ==============================================================================
*
* ملف: CliqPaymentController.php
* إدارة نقاط النهاية البرمجية لمدفوعات كليك الفورية للطلبة وطابور السحب المالي للمعلمين.
*/
namespace App\Controllers;
use App\Core\Request;
use App\Core\Response;
use App\Services\CliqPaymentService;
use App\Services\StudentAccessControlService;
class CliqPaymentController
{
/**
* طلب دفع كليك لطالب خارجي
* POST /api/payment/cliq/initiate
*/
public function initiatePayment(Request $request, Response $response): void
{
$body = $request->getBody();
$studentId = (int)($request->user_id ?? 0);
$courseId = (int)($body['course_id'] ?? 0);
if (!$studentId || !$courseId) {
$response->status(400)->json([
'status' => 'error',
'message' => 'معرف الطالب ومعرف الدورة مطلوبان لإصدار مطالبة كليك'
]);
return;
}
$res = CliqPaymentService::initiatePayment($studentId, $courseId);
$status = ($res['status'] ?? 'error') === 'success' ? 200 : 400;
$response->status($status)->json($res);
}
/**
* رفع إيصال كليك والتحقق الذكي بالذكاء الاصطناعي
* POST /api/payment/cliq/submit-receipt
*/
public function submitReceipt(Request $request, Response $response): void
{
$body = $request->getBody();
$studentId = (int)($request->user_id ?? 0);
$referenceCode = trim((string)($body['reference_code'] ?? ''));
$receiptBase64 = (string)($body['receipt_image'] ?? '');
$manualTxId = isset($body['bank_transaction_id']) ? (string)$body['bank_transaction_id'] : null;
if (!$studentId || empty($referenceCode)) {
$response->status(400)->json([
'status' => 'error',
'message' => 'معرف الطالب والرمز المرجعي مطلوبان'
]);
return;
}
$res = CliqPaymentService::verifyPaymentReceipt($studentId, $referenceCode, $receiptBase64, $manualTxId);
$status = ($res['status'] ?? 'error') === 'success' ? 200 : 400;
$response->status($status)->json($res);
}
/**
* طلب سحب أرباح للمعلم عبر كليك
* POST /api/teacher/payout/request
*/
public function requestTeacherPayout(Request $request, Response $response): void
{
$body = $request->getBody();
$teacherId = (int)($request->user_id ?? 0);
$amountJod = (float)($body['amount_jod'] ?? 0.0);
$cliqAlias = trim((string)($body['cliq_alias'] ?? ''));
if ($amountJod <= 0 || empty($cliqAlias)) {
$response->status(400)->json([
'status' => 'error',
'message' => 'المبلغ ومعرّف كليك مطلوبان لإتمام طلب السحب'
]);
return;
}
$res = CliqPaymentService::requestTeacherPayout($teacherId, $amountJod, $cliqAlias);
$status = ($res['status'] ?? 'error') === 'success' ? 200 : 400;
$response->status($status)->json($res);
}
/**
* استعلام المعلم عن حالة طلبات السحب في طابور كليك
* GET /api/teacher/payout/status
*/
public function getTeacherPayoutStatus(Request $request, Response $response): void
{
$teacherId = (int)($request->user_id ?? 0);
$payouts = CliqPaymentService::getTeacherPayouts($teacherId);
$response->json([
'status' => 'success',
'data' => $payouts
]);
}
/**
* معالجة طابور السحب المالي (تُستدعى أيضاً عبر الكرون جوب أو المشرف)
* POST /api/admin/payout/process-queue
*/
public function processPayoutQueue(Request $request, Response $response): void
{
$res = CliqPaymentService::processPayoutQueue();
$response->json($res);
}
}