From 440c8c16336184720ded038d274d73633c0c4c78 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Thu, 7 May 2026 03:23:32 +0300 Subject: [PATCH] Update: 2026-05-07 03:23:32 --- app/modules_app/payments/my_requests.php | 11 +++++++--- app/modules_app/payments/stats.php | 2 +- .../controllers/subscription_controller.dart | 21 ++++++++++++++++++- .../subscription/views/subscription_view.dart | 12 +++++------ 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/app/modules_app/payments/my_requests.php b/app/modules_app/payments/my_requests.php index 5a9b4b7..fe845a9 100644 --- a/app/modules_app/payments/my_requests.php +++ b/app/modules_app/payments/my_requests.php @@ -16,8 +16,8 @@ $db = Database::getInstance(); try { $stmt = $db->prepare(" - SELECT pr.id, pr.plan_id, pr.amount_jod, pr.reference_number, pr.cliq_alias, - pr.status, pr.ai_match_score, pr.created_at, pr.verified_at, + SELECT pr.id, pr.plan_id, pr.amount_jod, pr.internal_reference, pr.cliq_alias, + pr.bank_reference, pr.status, pr.created_at, pr.verified_at, sp.name_ar AS plan_name FROM payment_requests pr LEFT JOIN subscription_plans sp ON pr.plan_id = sp.id @@ -27,9 +27,14 @@ try { $stmt->execute([$tenantId]); $requests = $stmt->fetchAll(); + // Map internal_reference to reference_number for Flutter compatibility + foreach ($requests as &$req) { + $req['reference_number'] = $req['internal_reference']; + } + json_success($requests, 'طلبات الدفع الخاصة بك'); -} catch (\Exception $e) { +} catch (\Throwable $e) { error_log("My Payment Requests Error: " . $e->getMessage()); json_error('حدث خطأ أثناء جلب طلبات الدفع.', 500); } diff --git a/app/modules_app/payments/stats.php b/app/modules_app/payments/stats.php index 0318206..aced292 100644 --- a/app/modules_app/payments/stats.php +++ b/app/modules_app/payments/stats.php @@ -54,7 +54,7 @@ try { // Recent payments (last 10) $stmt = $db->query(" - SELECT pr.id, pr.amount_jod, pr.status, pr.reference_number, pr.ai_match_score, pr.created_at, pr.verified_at, + SELECT pr.id, pr.amount_jod, pr.status, pr.internal_reference, pr.bank_reference, pr.created_at, pr.verified_at, u.name AS payer_name, sp.name_ar AS plan_name FROM payment_requests pr LEFT JOIN users u ON pr.user_id = u.id diff --git a/musadaq-app/lib/features/subscription/controllers/subscription_controller.dart b/musadaq-app/lib/features/subscription/controllers/subscription_controller.dart index 26c43d0..d5379dc 100644 --- a/musadaq-app/lib/features/subscription/controllers/subscription_controller.dart +++ b/musadaq-app/lib/features/subscription/controllers/subscription_controller.dart @@ -1,5 +1,7 @@ import 'package:get/get.dart'; +import 'package:dio/dio.dart'; import '../../../core/network/dio_client.dart'; +import '../../../core/utils/app_snackbar.dart'; import '../../../core/utils/logger.dart'; class SubscriptionController extends GetxController { @@ -54,7 +56,9 @@ class SubscriptionController extends GetxController { if (res.data['success'] == true && res.data['data'] != null) { myPayments.value = List>.from(res.data['data']); // Check for active pending payment - final pending = myPayments.firstWhereOrNull((p) => p['status'] == 'pending'); + final pending = myPayments.firstWhereOrNull( + (p) => p['status'] == 'pending' || p['status'] == 'uploaded', + ); activePaymentRequest.value = pending; } } catch (e) { @@ -72,6 +76,21 @@ class SubscriptionController extends GetxController { await loadMyPayments(); return result; } + } on DioException catch (e) { + if (e.response?.statusCode == 409) { + // Already has a pending payment — show existing one + AppSnackbar.showWarning( + 'طلب قائم', + 'لديك طلب دفع قائم بالفعل. قم بإتمامه أو انتظر المراجعة.', + ); + // Navigate to the existing pending payment + if (activePaymentRequest.value != null) { + Get.toNamed('/payment-receipt', arguments: activePaymentRequest.value); + } + } else { + AppLogger.error('Failed to create payment', e); + AppSnackbar.showError('خطأ', e.response?.data?['message'] ?? 'فشل إنشاء طلب الدفع'); + } } catch (e) { AppLogger.error('Failed to create payment', e); } finally { diff --git a/musadaq-app/lib/features/subscription/views/subscription_view.dart b/musadaq-app/lib/features/subscription/views/subscription_view.dart index 22de6eb..3113818 100644 --- a/musadaq-app/lib/features/subscription/views/subscription_view.dart +++ b/musadaq-app/lib/features/subscription/views/subscription_view.dart @@ -86,10 +86,11 @@ class SubscriptionView extends StatelessWidget { } Widget _buildCurrentPlan(Map sub, bool isDark) { - final planName = sub['plan_name'] ?? sub['plan_id'] ?? 'مجانية'; + final planName = sub['plan_name'] ?? sub['plan_name_en'] ?? sub['plan_id'] ?? 'مجانية'; final daysLeft = sub['days_remaining'] ?? 0; - final used = sub['invoices_used'] ?? 0; - final limit = sub['invoices_limit'] ?? 0; + final invoices = sub['invoices'] as Map?; + final used = invoices?['used'] ?? 0; + final limit = invoices?['limit'] ?? 0; return Container( padding: const EdgeInsets.all(20), @@ -280,9 +281,8 @@ class SubscriptionView extends StatelessWidget { onPressed: ctrl.isCreatingPayment.value ? null : () async { final result = await ctrl.createPaymentRequest(plan['id'].toString()); if (result != null) { - AppSnackbar.showSuccess('تم إنشاء طلب الدفع', 'قم بالتحويل عبر CliQ ثم ارفع وصل الدفع'); - } else { - AppSnackbar.showError('خطأ', 'فشل إنشاء طلب الدفع'); + AppSnackbar.showSuccess('تم إنشاء طلب الدفع', 'قم بالتحويل عبر CliQ ثم أدخل رقم المرجع'); + Get.toNamed('/payment-receipt', arguments: result); } }, style: ElevatedButton.styleFrom(