From 2f1a6f9c8500fc2397068ddefd218fba93752ee7 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sun, 17 May 2026 18:47:51 +0300 Subject: [PATCH] Update: 2026-05-17 18:47:51 --- .../dashboard/views/dashboard_view.dart | 18 +- .../controllers/onboarding_controller.dart | 9 +- .../settings/views/settings_view.dart | 2 +- .../subscription/views/subscription_view.dart | 270 ++++++++++++------ musadaq-app/pubspec.lock | 8 +- musadaq-app/pubspec.yaml | 2 +- 6 files changed, 199 insertions(+), 110 deletions(-) diff --git a/musadaq-app/lib/features/dashboard/views/dashboard_view.dart b/musadaq-app/lib/features/dashboard/views/dashboard_view.dart index 03abf03..42630ec 100644 --- a/musadaq-app/lib/features/dashboard/views/dashboard_view.dart +++ b/musadaq-app/lib/features/dashboard/views/dashboard_view.dart @@ -254,14 +254,16 @@ class DashboardView extends GetView { isDark, () => Get.toNamed(AppRoutes.AUDIT_LOG), ), - const SizedBox(width: 12), - _buildAdminActionCard( - 'ادعُ واكسب', - Icons.card_giftcard, - const Color(0xFFD4AF37), - isDark, - () => Get.toNamed(AppRoutes.REFERRAL), - ), + if (!GetPlatform.isIOS) ...[ + const SizedBox(width: 12), + _buildAdminActionCard( + 'ادعُ واكسب', + Icons.card_giftcard, + const Color(0xFFD4AF37), + isDark, + () => Get.toNamed(AppRoutes.REFERRAL), + ), + ], const SizedBox(width: 12), _buildAdminActionCard( 'استهلاك AI', diff --git a/musadaq-app/lib/features/onboarding/controllers/onboarding_controller.dart b/musadaq-app/lib/features/onboarding/controllers/onboarding_controller.dart index 813863c..5e40e22 100644 --- a/musadaq-app/lib/features/onboarding/controllers/onboarding_controller.dart +++ b/musadaq-app/lib/features/onboarding/controllers/onboarding_controller.dart @@ -5,7 +5,7 @@ import '../../../app/routes/app_pages.dart'; class OnboardingController extends GetxController { var currentPage = 0.obs; - final List items = [ + List get items => [ OnboardingModel( title: 'مرحباً بك في مُصادَق', description: @@ -19,9 +19,10 @@ class OnboardingController extends GetxController { imageAsset: 'assets/images/onboarding_2.png', ), OnboardingModel( - title: 'مدفوعات فورية آمنة', - description: - 'قم بشحن محفظتك وتفعيل اشتراكك عبر نظام كليك (CliQ) بكل سرعة وأمان.', + title: 'إدارة متكاملة لشركتك', + description: GetPlatform.isIOS + ? 'إدارة فواتير الشركات وأرشفة ضريبية متكاملة بأمان وسهولة تامة.' + : 'قم بشحن محفظتك وتفعيل اشتراكك عبر نظام كليك (CliQ) بكل سرعة وأمان.', imageAsset: 'assets/images/onboarding_3.png', ), ]; diff --git a/musadaq-app/lib/features/settings/views/settings_view.dart b/musadaq-app/lib/features/settings/views/settings_view.dart index 5805bf5..ae1dcf8 100644 --- a/musadaq-app/lib/features/settings/views/settings_view.dart +++ b/musadaq-app/lib/features/settings/views/settings_view.dart @@ -166,7 +166,7 @@ class SettingsView extends GetView { _buildInfoTile( icon: Icons.diamond_rounded, title: 'الاشتراكات والباقات', - trailing: 'ترقية →', + trailing: GetPlatform.isIOS ? 'التفاصيل →' : 'ترقية →', isDark: isDark, onTap: () => Get.toNamed(AppRoutes.SUBSCRIPTION), ), diff --git a/musadaq-app/lib/features/subscription/views/subscription_view.dart b/musadaq-app/lib/features/subscription/views/subscription_view.dart index 285bfa7..688e606 100644 --- a/musadaq-app/lib/features/subscription/views/subscription_view.dart +++ b/musadaq-app/lib/features/subscription/views/subscription_view.dart @@ -34,114 +34,122 @@ class SubscriptionView extends StatelessWidget { children: [ // Current Subscription Status if (controller.currentSubscription.value != null) - _buildCurrentPlan(controller.currentSubscription.value!, isDark), + _buildCurrentPlan(controller.currentSubscription.value!, isDark) + else + _buildFreePlanPlaceholder(isDark), const SizedBox(height: 24), - // Active Payment Request Banner - if (controller.activePaymentRequest.value != null) - _buildActivePaymentBanner(controller.activePaymentRequest.value!, isDark), + if (GetPlatform.isIOS) ...[ + _buildIOSB2BInfoCard(isDark), + ], - // Plans Header - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - const Icon(Icons.diamond_rounded, color: Color(0xFFD4AF37), size: 22), - const SizedBox(width: 8), - Text( - 'اختر باقتك', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: isDark ? Colors.white : const Color(0xFF0F172A), - ), - ), - ], - ), - const SizedBox(height: 4), - Text( - 'ادفع عبر CliQ — بدون عمولة!', - style: TextStyle(fontSize: 13, color: isDark ? Colors.white38 : Colors.grey), - ), - ], - ), - ], - ), - const SizedBox(height: 20), + if (!GetPlatform.isIOS) ...[ + // Active Payment Request Banner + if (controller.activePaymentRequest.value != null) + _buildActivePaymentBanner(controller.activePaymentRequest.value!, isDark), - // Toggle - Container( - padding: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: isDark ? Colors.white.withOpacity(0.05) : Colors.black.withOpacity(0.05), - borderRadius: BorderRadius.circular(12), - ), - child: Row( + // Plans Header + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - child: GestureDetector( - onTap: () => controller.isAnnual.value = false, - child: Obx(() => Container( - padding: const EdgeInsets.symmetric(vertical: 10), - decoration: BoxDecoration( - color: !controller.isAnnual.value ? const Color(0xFF0F4C81) : Colors.transparent, - borderRadius: BorderRadius.circular(10), - ), - child: Center( - child: Text( - 'دفع شهري', + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const Icon(Icons.diamond_rounded, color: Color(0xFFD4AF37), size: 22), + const SizedBox(width: 8), + Text( + 'اختر باقتك', style: TextStyle( - color: !controller.isAnnual.value ? Colors.white : (isDark ? Colors.white60 : Colors.black54), + fontSize: 20, fontWeight: FontWeight.bold, - fontSize: 13, + color: isDark ? Colors.white : const Color(0xFF0F172A), ), ), - ), - )), - ), - ), - Expanded( - child: GestureDetector( - onTap: () => controller.isAnnual.value = true, - child: Obx(() => Container( - padding: const EdgeInsets.symmetric(vertical: 10), - decoration: BoxDecoration( - color: controller.isAnnual.value ? const Color(0xFF0F4C81) : Colors.transparent, - borderRadius: BorderRadius.circular(10), - ), - child: Center( - child: Text( - 'دفع سنوي (توفير ✨)', - style: TextStyle( - color: controller.isAnnual.value ? Colors.white : (isDark ? Colors.white60 : Colors.black54), - fontWeight: FontWeight.bold, - fontSize: 13, - ), - ), - ), - )), - ), + ], + ), + const SizedBox(height: 4), + Text( + 'ادفع عبر CliQ — بدون عمولة!', + style: TextStyle(fontSize: 13, color: isDark ? Colors.white38 : Colors.grey), + ), + ], ), ], ), - ), - const SizedBox(height: 20), + const SizedBox(height: 20), - // Plans Grid - ...controller.plans.map((plan) => _buildPlanCard(plan, controller, isDark)), + // Toggle + Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: isDark ? Colors.white.withOpacity(0.05) : Colors.black.withOpacity(0.05), + borderRadius: BorderRadius.circular(12), + ), + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () => controller.isAnnual.value = false, + child: Obx(() => Container( + padding: const EdgeInsets.symmetric(vertical: 10), + decoration: BoxDecoration( + color: !controller.isAnnual.value ? const Color(0xFF0F4C81) : Colors.transparent, + borderRadius: BorderRadius.circular(10), + ), + child: Center( + child: Text( + 'دفع شهري', + style: TextStyle( + color: !controller.isAnnual.value ? Colors.white : (isDark ? Colors.white60 : Colors.black54), + fontWeight: FontWeight.bold, + fontSize: 13, + ), + ), + ), + )), + ), + ), + Expanded( + child: GestureDetector( + onTap: () => controller.isAnnual.value = true, + child: Obx(() => Container( + padding: const EdgeInsets.symmetric(vertical: 10), + decoration: BoxDecoration( + color: controller.isAnnual.value ? const Color(0xFF0F4C81) : Colors.transparent, + borderRadius: BorderRadius.circular(10), + ), + child: Center( + child: Text( + 'دفع سنوي (توفير ✨)', + style: TextStyle( + color: controller.isAnnual.value ? Colors.white : (isDark ? Colors.white60 : Colors.black54), + fontWeight: FontWeight.bold, + fontSize: 13, + ), + ), + ), + )), + ), + ), + ], + ), + ), + const SizedBox(height: 20), - const SizedBox(height: 24), + // Plans Grid + ...controller.plans.map((plan) => _buildPlanCard(plan, controller, isDark)), - // Payment History - if (controller.myPayments.isNotEmpty) ...[ - const Text('سجل المدفوعات', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), - const SizedBox(height: 12), - ...controller.myPayments.map((p) => _buildPaymentHistoryItem(p, isDark)), + const SizedBox(height: 24), + + // Payment History + if (controller.myPayments.isNotEmpty) ...[ + const Text('سجل المدفوعات', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + const SizedBox(height: 12), + ...controller.myPayments.map((p) => _buildPaymentHistoryItem(p, isDark)), + ], ], const SizedBox(height: 40), @@ -153,6 +161,84 @@ class SubscriptionView extends StatelessWidget { ); } + Widget _buildFreePlanPlaceholder(bool isDark) { + return _buildCurrentPlan({ + 'plan_name': 'الباقة الافتراضية (المجانية)', + 'days_remaining': 0, + 'invoices': { + 'used': 0, + 'limit': 100, + } + }, isDark); + } + + Widget _buildIOSB2BInfoCard(bool isDark) { + return Container( + width: double.infinity, + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: isDark ? const Color(0xFF1E1E2E) : Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: isDark ? Colors.white10 : Colors.grey.shade200, + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.business_rounded, color: const Color(0xFF0F4C81), size: 24), + const SizedBox(width: 8), + Text( + 'الاشتراكات المؤسسية (B2B)', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : const Color(0xFF0F172A), + ), + ), + ], + ), + const SizedBox(height: 12), + Text( + 'تطبيق "مُصادَق" مخصص لإدارة الفواتير الضريبية للشركات ومكاتب المحاسبة. يتم تفعيل وإدارة باقات الاشتراك والميزات الإضافية مركزياً عن طريق لوحة التحكم الخاصة بالمسؤول في منشأتك.', + style: TextStyle( + fontSize: 13, + height: 1.5, + color: isDark ? Colors.white70 : Colors.black87, + ), + ), + const SizedBox(height: 16), + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: const Color(0xFF0F4C81).withOpacity(0.05), + borderRadius: BorderRadius.circular(10), + ), + child: Row( + children: [ + Icon(Icons.info_outline, color: const Color(0xFF0F4C81), size: 20), + const SizedBox(width: 10), + Expanded( + child: Text( + 'إذا كنت بحاجة إلى ترقية باقتك أو زيادة الحصص (Quotas)، يرجى التواصل مع مسؤول تكنولوجيا المعلومات أو المحاسب المسؤول في شركتك.', + style: TextStyle( + fontSize: 12, + height: 1.4, + color: const Color(0xFF0F4C81), + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ), + ], + ), + ); + } + Widget _buildCurrentPlan(Map sub, bool isDark) { final planName = sub['plan_name'] ?? sub['plan_name_en'] ?? sub['plan_id'] ?? 'مجانية'; final daysLeft = sub['days_remaining'] ?? 0; diff --git a/musadaq-app/pubspec.lock b/musadaq-app/pubspec.lock index 213d07c..5cdb4b1 100644 --- a/musadaq-app/pubspec.lock +++ b/musadaq-app/pubspec.lock @@ -892,10 +892,10 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.19" material_color_utilities: dependency: transitive description: @@ -1465,10 +1465,10 @@ packages: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.10" timing: dependency: transitive description: diff --git a/musadaq-app/pubspec.yaml b/musadaq-app/pubspec.yaml index 38b5bb3..85e3280 100644 --- a/musadaq-app/pubspec.yaml +++ b/musadaq-app/pubspec.yaml @@ -1,7 +1,7 @@ name: musadaq_app description: Jordanian E-Invoicing Automation SaaS publish_to: 'none' -version: 1.0.3+3 +version: 1.0.5+5 environment: sdk: '>=3.2.0 <4.0.0'