89 lines
3.3 KiB
PHP
89 lines
3.3 KiB
PHP
<?php
|
|
/**
|
|
* AI Accounting Chatbot — "اسأل مُصادَق"
|
|
* POST /v1/chatbot/ask
|
|
* Body: { "question": "كم ضريبة المبيعات على الخدمات الرقمية؟" }
|
|
*
|
|
* AI-powered chatbot that answers accounting & tax questions
|
|
* with context from the user's own data when relevant.
|
|
*/
|
|
|
|
use App\Core\Database;
|
|
use App\Core\AI;
|
|
use App\Core\Encryption;
|
|
use App\Middleware\AuthMiddleware;
|
|
|
|
$decoded = AuthMiddleware::check();
|
|
$db = Database::getInstance();
|
|
|
|
$data = json_decode(file_get_contents('php://input'), true);
|
|
$question = trim($data['question'] ?? '');
|
|
|
|
if (empty($question) || mb_strlen($question) < 3) {
|
|
json_error('يرجى كتابة سؤالك (3 أحرف على الأقل)', 422);
|
|
}
|
|
|
|
if (mb_strlen($question) > 500) {
|
|
json_error('السؤال طويل جداً (الحد 500 حرف)', 422);
|
|
}
|
|
|
|
$tenantId = $decoded['tenant_id'];
|
|
$userId = $decoded['user_id'];
|
|
|
|
try {
|
|
// 1. Gather user context (last month stats)
|
|
$contextStmt = $db->prepare("
|
|
SELECT
|
|
COUNT(*) as total_invoices,
|
|
COALESCE(SUM(grand_total), 0) as total_revenue,
|
|
COALESCE(SUM(tax_amount), 0) as total_tax
|
|
FROM invoices
|
|
WHERE tenant_id = ? AND created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
|
|
");
|
|
$contextStmt->execute([$tenantId]);
|
|
$context = $contextStmt->fetch();
|
|
|
|
$companyStmt = $db->prepare("SELECT COUNT(*) FROM companies WHERE tenant_id = ? AND deleted_at IS NULL");
|
|
$companyStmt->execute([$tenantId]);
|
|
$companyCount = (int)$companyStmt->fetchColumn();
|
|
|
|
// 2. Build AI prompt
|
|
$systemPrompt = <<<PROMPT
|
|
أنت "مُصادَق" — مساعد محاسبي ذكي متخصص في المحاسبة والضرائب الأردنية.
|
|
|
|
قواعد:
|
|
1. أجب بالعربية دائماً وبشكل مختصر ومفيد
|
|
2. إذا كان السؤال عن ضرائب أردنية، استخدم نسب ضريبة المبيعات الأردنية (16% عامة، 4% و8% مخفضة، 0% معفاة)
|
|
3. إذا كان السؤال غير محاسبي، قل "أنا متخصص بالمحاسبة والضرائب فقط"
|
|
4. لا تعطِ نصائح قانونية نهائية — انصح بمراجعة محاسب قانوني للحالات المعقدة
|
|
5. إذا كان السؤال يتعلق ببيانات المستخدم، استخدم السياق المتاح
|
|
|
|
سياق المستخدم (آخر 30 يوم):
|
|
- عدد الفواتير: {$context['total_invoices']}
|
|
- إجمالي الإيرادات: {$context['total_revenue']} دينار
|
|
- إجمالي الضريبة: {$context['total_tax']} دينار
|
|
- عدد الشركات: {$companyCount}
|
|
PROMPT;
|
|
|
|
$aiResponse = AI::chat($systemPrompt, $question, $tenantId);
|
|
|
|
if (!$aiResponse) {
|
|
json_error('عذراً، لم أتمكن من معالجة سؤالك. حاول مرة أخرى.', 500);
|
|
}
|
|
|
|
// 3. Log the conversation
|
|
$db->prepare("
|
|
INSERT INTO chatbot_history (id, user_id, tenant_id, question, answer, created_at)
|
|
VALUES (UUID(), ?, ?, ?, ?, NOW())
|
|
")->execute([$userId, $tenantId, $question, $aiResponse]);
|
|
|
|
json_success([
|
|
'answer' => $aiResponse,
|
|
'question' => $question,
|
|
'timestamp' => date('c'),
|
|
], 'إجابة مُصادَق');
|
|
|
|
} catch (\Exception $e) {
|
|
safe_error($e, 'chatbot/ask', 'حدث خطأ في المساعد الذكي.');
|
|
}
|