Update: 2026-05-08 04:58:23
This commit is contained in:
74
app/modules_app/marketplace/listings.php
Normal file
74
app/modules_app/marketplace/listings.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
/**
|
||||
* Marketplace — Accountant Directory & Service Listings
|
||||
* GET /v1/marketplace/listings
|
||||
* GET /v1/marketplace/listings?city=amman&specialty=tax
|
||||
*
|
||||
* Public directory where accounting offices can list their services
|
||||
* and businesses can find accountants.
|
||||
*/
|
||||
|
||||
use App\Core\Database;
|
||||
use App\Core\Encryption;
|
||||
use App\Middleware\AuthMiddleware;
|
||||
|
||||
$decoded = AuthMiddleware::check();
|
||||
$db = Database::getInstance();
|
||||
|
||||
$pagination = paginate_params(20, 50);
|
||||
|
||||
$city = $_GET['city'] ?? null;
|
||||
$specialty = $_GET['specialty'] ?? null;
|
||||
$search = $_GET['search'] ?? null;
|
||||
|
||||
$where = "ml.is_active = 1";
|
||||
$params = [];
|
||||
|
||||
if ($city) {
|
||||
$where .= " AND ml.city = ?";
|
||||
$params[] = $city;
|
||||
}
|
||||
if ($specialty) {
|
||||
$where .= " AND ml.specialty = ?";
|
||||
$params[] = $specialty;
|
||||
}
|
||||
if ($search) {
|
||||
$where .= " AND (ml.office_name LIKE ? OR ml.description LIKE ?)";
|
||||
$params[] = "%{$search}%";
|
||||
$params[] = "%{$search}%";
|
||||
}
|
||||
|
||||
try {
|
||||
// Count
|
||||
$countStmt = $db->prepare("SELECT COUNT(*) FROM marketplace_listings ml WHERE {$where}");
|
||||
$countStmt->execute($params);
|
||||
$total = (int)$countStmt->fetchColumn();
|
||||
|
||||
// Fetch
|
||||
$stmt = $db->prepare("
|
||||
SELECT ml.*, t.name as tenant_name
|
||||
FROM marketplace_listings ml
|
||||
LEFT JOIN tenants t ON ml.tenant_id = t.id
|
||||
WHERE {$where}
|
||||
ORDER BY ml.is_featured DESC, ml.rating DESC, ml.created_at DESC
|
||||
LIMIT {$pagination['limit']} OFFSET {$pagination['offset']}
|
||||
");
|
||||
$stmt->execute($params);
|
||||
$listings = $stmt->fetchAll();
|
||||
|
||||
// Decrypt names
|
||||
foreach ($listings as &$l) {
|
||||
if (!empty($l['tenant_name'])) {
|
||||
$dec = Encryption::decrypt($l['tenant_name']);
|
||||
$l['tenant_name'] = ($dec !== false && $dec !== null) ? $dec : $l['tenant_name'];
|
||||
}
|
||||
}
|
||||
|
||||
$cities = ['amman' => 'عمّان', 'irbid' => 'إربد', 'zarqa' => 'الزرقاء', 'aqaba' => 'العقبة', 'salt' => 'السلط', 'madaba' => 'مأدبا', 'karak' => 'الكرك', 'other' => 'أخرى'];
|
||||
$specialties = ['tax' => 'ضرائب', 'audit' => 'تدقيق', 'bookkeeping' => 'مسك دفاتر', 'payroll' => 'رواتب', 'consulting' => 'استشارات', 'general' => 'عام'];
|
||||
|
||||
json_paginated($listings, $total, $pagination, 'سوق المحاسبين');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
safe_error($e, 'marketplace/listings', 'حدث خطأ في تحميل القوائم.');
|
||||
}
|
||||
63
app/modules_app/marketplace/my_listing.php
Normal file
63
app/modules_app/marketplace/my_listing.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
/**
|
||||
* Marketplace — Create/Update My Listing
|
||||
* POST /v1/marketplace/my-listing
|
||||
* Body: { "office_name": "...", "city": "amman", "specialty": "tax", "description": "...", "phone": "...", "email": "..." }
|
||||
*/
|
||||
|
||||
use App\Core\Database;
|
||||
use App\Core\Encryption;
|
||||
use App\Core\Validator;
|
||||
use App\Middleware\AuthMiddleware;
|
||||
use App\Middleware\RoleMiddleware;
|
||||
|
||||
$decoded = RoleMiddleware::require(['super_admin', 'admin']);
|
||||
$db = Database::getInstance();
|
||||
|
||||
$tenantId = $decoded['tenant_id'];
|
||||
$data = input();
|
||||
|
||||
$errors = Validator::validate($data, [
|
||||
'office_name' => 'required',
|
||||
'city' => 'required',
|
||||
'specialty' => 'required',
|
||||
]);
|
||||
|
||||
if ($errors) {
|
||||
json_error('بيانات ناقصة', 422, $errors);
|
||||
}
|
||||
|
||||
try {
|
||||
// Check if listing exists
|
||||
$existing = $db->prepare("SELECT id FROM marketplace_listings WHERE tenant_id = ? LIMIT 1");
|
||||
$existing->execute([$tenantId]);
|
||||
$row = $existing->fetch();
|
||||
|
||||
if ($row) {
|
||||
// Update
|
||||
$db->prepare("
|
||||
UPDATE marketplace_listings SET
|
||||
office_name = ?, city = ?, specialty = ?, description = ?,
|
||||
contact_phone = ?, contact_email = ?, updated_at = NOW()
|
||||
WHERE tenant_id = ?
|
||||
")->execute([
|
||||
$data['office_name'], $data['city'], $data['specialty'],
|
||||
$data['description'] ?? '', $data['phone'] ?? '', $data['email'] ?? '',
|
||||
$tenantId
|
||||
]);
|
||||
json_success(['id' => $row['id']], 'تم تحديث القائمة بنجاح');
|
||||
} else {
|
||||
// Create
|
||||
$id = Database::generateUuid();
|
||||
$db->prepare("
|
||||
INSERT INTO marketplace_listings (id, tenant_id, office_name, city, specialty, description, contact_phone, contact_email, is_active, created_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, NOW())
|
||||
")->execute([
|
||||
$id, $tenantId, $data['office_name'], $data['city'], $data['specialty'],
|
||||
$data['description'] ?? '', $data['phone'] ?? '', $data['email'] ?? ''
|
||||
]);
|
||||
json_success(['id' => $id], 'تم إضافة مكتبك للسوق بنجاح! 🎉');
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
safe_error($e, 'marketplace/my-listing', 'حدث خطأ في حفظ القائمة.');
|
||||
}
|
||||
Reference in New Issue
Block a user