Plugin Directory

Changeset 3762600


Ignore:
Timestamp:
10/24/2026 12:15:21 AM (6 hours ago)
Author:
futurebase
Message:

Release 4.24: User Experience Improvements

Location:
simple-fatoora
Files:
1 deleted
16 edited
1 copied

Legend:

Unmodified
Added
Removed
  • simple-fatoora/tags/4.24/assets/js/simple-fatoora-settings.js

    r3762341 r3762600  
    564564        password: password || ''
    565565      };
     566      if ($('#sf-personal-signin').length) payload.signin_purpose = 'personal_profile';
    566567
    567568      if (!payload.email_id || !payload.password) {
  • simple-fatoora/tags/4.24/includes/class-simpfa-business-connection.php

    r3762341 r3762600  
    2424  private static function remembered_session()
    2525  {
    26     $saved = get_transient(self::session_key());
    27     if (!$saved && function_exists('get_user_meta')) $saved = get_user_meta(get_current_user_id(), 'simpfa_personal_session', true);
     26    // Durable administrator-owned proof is canonical; an old object-cache entry
     27    // must not replace a newer sign-in or bypass its expiry.
     28    $saved = function_exists('get_user_meta') ? get_user_meta(get_current_user_id(), 'simpfa_personal_session', true) : '';
     29    if (!$saved) $saved = get_transient(self::session_key());
    2830    // Recover a surviving legacy DB-backed transient after an object-cache change.
    2931    if (!$saved) $saved = get_option('_transient_' . self::session_key(), '');
  • simple-fatoora/tags/4.24/includes/class-simpfa-wc-settings-tab.php

    r3762341 r3762600  
    26452645    $token = Simpfa_BusinessConnection::token();
    26462646    $result = $token ? $this->get_client()->business_account($token, '/account') : [];
    2647     if (empty($result['ok'])) return '<div class="sf-card sf-form-card" data-personal-session-state="' . esc_attr(Simpfa_BusinessConnection::personal_session_state()) . '"><h2>' . esc_html__('Profile Settings', 'simple-fatoora') . '</h2><p>' . esc_html__('Your business is connected. Personal profile settings require your remembered account sign-in.', 'simple-fatoora') . '</p><a href="' . esc_url($this->get_page_url('home')) . '">' . esc_html__('Home', 'simple-fatoora') . '</a></div>';
     2647    if (empty($result['ok'])) {
     2648      $signin = !$token || in_array((int) ($result['status_code'] ?? 0), [401, 403], true);
     2649      $url = $signin ? add_query_arg('sf_profile_signin', '1', $this->get_page_url('profile')) : $this->get_page_url('profile');
     2650      if ($signin && isset($_GET['sf_profile_signin']) && (string) $_GET['sf_profile_signin'] === '1') return $this->render_personal_signin_card();
     2651      return '<div class="sf-card sf-form-card sf-personal-signin-notice" data-personal-session-state="' . esc_attr(Simpfa_BusinessConnection::personal_session_state()) . '"><h2>' . esc_html__('Profile Settings', 'simple-fatoora') . '</h2><p>' . esc_html($signin ? __('Please sign in again to access Profile Settings.', 'simple-fatoora') : __('Unable to load your profile. Please try again.', 'simple-fatoora')) . '</p><a class="sf-button-primary" href="' . esc_url($url) . '">' . esc_html($signin ? __('Sign In', 'simple-fatoora') : __('Try again', 'simple-fatoora')) . '</a></div>';
     2652    }
    26482653    $person = $this->get_client()->extract_response($result, []);
    26492654    $html = '<div id="sf-page-profile" class="sf-card sf-form-card sf-page-view sf-page-view--profile"><div class="sf-page-header"><h2 class="sf-title">' . esc_html__('Profile Settings', 'simple-fatoora') . '</h2></div>';
    … …  
    26572662    }
    26582663    return $html . '</div><div class="sf-form-actions sf-profile-submit-row"><button type="submit" class="button sf-button-primary" formaction="' . esc_url(admin_url('admin-post.php?action=simpfa_personal_profile')) . '" formmethod="post">' . esc_html__('Save Profile', 'simple-fatoora') . '</button></div></div></div>';
     2664  }
     2665
     2666  private function render_personal_signin_card()
     2667  {
     2668    return '<div id="sf-personal-signin" class="sf-card sf-form-card"><h2>' . esc_html__('Sign In', 'simple-fatoora') . '</h2><div class="sf-form sf-auth-form"><div class="sf-form-row"><label for="sf-login-email">' . esc_html__('Email', 'simple-fatoora') . '</label><input id="sf-login-email" type="email" autocomplete="username" /></div><div class="sf-form-row"><label for="sf-login-password">' . esc_html__('Password', 'simple-fatoora') . '</label><input id="sf-login-password" type="password" autocomplete="current-password" /></div><button type="button" id="sf-native-signin-btn" class="sf-button-primary">' . esc_html__('Sign In', 'simple-fatoora') . '</button><div id="sf-signin-feedback" class="sf-auth-feedback sf-v2-feedback" aria-live="polite"></div></div></div>';
    26592669  }
    26602670
    … …  
    31153125    $resolved_view = $this->resolve_payment_result_view($requested_view, $payment_result_data['status']);
    31163126    $transaction_id = isset($payment_result_data['transaction_id']) ? absint($payment_result_data['transaction_id']) : 0;
    3117     $result_title = __('Payment Status', 'simple-fatoora');
    3118     $result_message = __('We are checking your payment result.', 'simple-fatoora');
     3127    $result_title = __('Confirming your payment', 'simple-fatoora');
    31193128    $icon_class = 'sf-payment-result-icon-pending';
    3120     $icon_symbol = '...';
    3121 
     3129    $icon_symbol = '…';
    31223130    if ($resolved_view === 'success') {
    3123       $result_title = __('Purchase Confirmed', 'simple-fatoora');
    3124       $result_message = __('Your recurring membership payment was completed successfully.', 'simple-fatoora');
     3131      $result_title = __('Payment confirmed', 'simple-fatoora');
    31253132      $icon_class = 'sf-payment-result-icon-success';
    31263133      $icon_symbol = '✓';
    31273134    } elseif ($resolved_view === 'failed') {
    3128       $result_title = __('Payment Failed', 'simple-fatoora');
    3129       $result_message = $payment_view['reason'] === 'cancelled_or_failed'
    3130         ? __('The payment was cancelled or could not be completed. No membership was activated.', 'simple-fatoora')
    3131         : __('We could not confirm this payment. Please try again.', 'simple-fatoora');
     3135      $result_title = __('Payment failed', 'simple-fatoora');
    31323136      $icon_class = 'sf-payment-result-icon-failed';
    31333137      $icon_symbol = '!';
    3134     } else {
    3135       $result_title = __('Payment Pending', 'simple-fatoora');
    3136       $result_message = __('We are waiting for payment confirmation from MyFatoorah. This can take a short moment after OTP or card confirmation.', 'simple-fatoora');
    3137     }
    3138 
    3139     $home_button = '<a class="sf-button-primary" href="' . esc_url($payment_home_url) . '">' . esc_html__('Back to Plugin Home', 'simple-fatoora') . '</a>';
    3140     $refresh_button = '<a class="sf-button-secondary sf-hidden" href="' . esc_url($this->build_payment_result_url('pending', $transaction_id)) . '" id="sf-payment-result-refresh">' . esc_html__('Refresh Status', 'simple-fatoora') . '</a>';
    3141     $details = '';
    3142     if ($resolved_view === 'success') {
    3143       $membership_end_label = $this->get_membership_end_label(isset($payment_result_data['membership_title']) ? (string) $payment_result_data['membership_title'] : '');
    3144       $details .= '<div class="sf-payment-result-grid">';
    3145       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Membership', 'simple-fatoora') . '</span><strong>' . esc_html($payment_result_data['membership_title'] !== '' ? $payment_result_data['membership_title'] : '--') . '</strong></div>';
    3146       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Total', 'simple-fatoora') . '</span><strong>' . esc_html($this->format_result_amount($payment_result_data['amount'])) . '</strong></div>';
    3147       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Term', 'simple-fatoora') . '</span><strong>' . esc_html($payment_result_data['membership_term_label'] !== '' ? $payment_result_data['membership_term_label'] : '--') . '</strong></div>';
    3148       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Start Date', 'simple-fatoora') . '</span><strong>' . esc_html($payment_result_data['membership_start_date'] !== '' ? $payment_result_data['membership_start_date'] : '--') . '</strong></div>';
    3149       $details .= '<div class="sf-payment-result-item"><span>' . esc_html($membership_end_label) . '</span><strong>' . esc_html($payment_result_data['membership_end_date'] !== '' ? $payment_result_data['membership_end_date'] : '--') . '</strong></div>';
    3150       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Invoice ID', 'simple-fatoora') . '</span><strong>' . esc_html($payment_result_data['membership_invoice_number'] !== '' ? $payment_result_data['membership_invoice_number'] : '--') . '</strong></div>';
    3151       $details .= '</div>';
    3152     }
    3153 
    3154     $status_note = '';
    3155     if (!$is_connected) {
    3156       $status_note = '<div class="sf-notice sf-notice-error">' . esc_html__('Please reconnect your Simple Fatoora account to review payment details.', 'simple-fatoora') . '</div>';
    3157     } elseif (!empty($payment_result_data['message']) && $resolved_view !== 'success') {
    3158       $status_note = '<div class="sf-notice sf-notice-error">' . esc_html($payment_result_data['message']) . '</div>';
    3159     }
     3138    }
     3139    $home_button = '<a class="sf-button-primary" href="' . esc_url($is_connected ? $this->get_page_url('memberships') : $payment_home_url) . '">' . esc_html($is_connected ? __('Back to subscription', 'simple-fatoora') : __('Sign In', 'simple-fatoora')) . '</a>';
     3140    $status_note = !$is_connected ? '<p>' . esc_html__('Please sign in to view your subscription.', 'simple-fatoora') . '</p>' : '';
    31603141
    31613142    $pending_meta = '';
    … …  
    31743155    $html .= '<div class="sf-payment-result-icon ' . esc_attr($icon_class) . '">' . esc_html($icon_symbol) . '</div>';
    31753156    $html .= '<h3 class="sf-section-title">' . esc_html($result_title) . '</h3>';
    3176     $html .= '<p class="sf-subtitle">' . esc_html($result_message) . '</p>';
    31773157    $html .= '</div>';
    31783158    $html .= $status_note;
    3179     $html .= $details;
    31803159    if ($resolved_view === 'pending') {
    3181       $html .= '<div id="sf-payment-result-feedback" class="sf-v2-feedback" aria-live="polite"></div>';
     3160      $html .= '<div id="sf-payment-result-feedback" class="sf-v2-feedback sf-hidden" aria-live="polite"></div>';
    31823161    }
    31833162    $html .= '<div class="sf-payment-result-actions">';
    3184     if ($resolved_view === 'pending') {
    3185       $html .= $refresh_button;
    3186     }
    31873163    $html .= $home_button;
    31883164    $html .= '</div>';
    … …  
    32103186
    32113187    $login_payload = $this->get_client()->extract_response($login, []);
     3188    if (sanitize_key(wp_unslash($_POST['signin_purpose'] ?? '')) === 'personal_profile') {
     3189      if (empty($login_payload['uuid']) || !Simpfa_BusinessConnection::begin($this->get_client(), $login_payload['uuid'])) {
     3190        wp_send_json_error(__('Unable to sign in. Please try again.', 'simple-fatoora'));
     3191      }
     3192      // Personal reauthentication must never reconnect or switch the store's business.
     3193      wp_send_json_success(['redirect_url' => $this->get_page_url('profile')]);
     3194    }
    32123195    if (!empty($login_payload['uuid'])) {
    32133196      $this->begin_business_selection($login_payload['uuid']);
  • simple-fatoora/tags/4.24/languages/simple-fatoora-ar.po

    r3762341 r3762600  
    1 msgid ""
    2 msgstr ""
    3 "Project-Id-Version: Simple Fatoora 4.23\n"
     1#
     2msgid ""
     3msgstr ""
     4"Project-Id-Version: Simple Fatoora 4.24\n"
    45"Report-Msgid-Bugs-To: \n"
    56"POT-Creation-Date: 2026-10-23 22:17+0300\n"
    … …  
    1112"Content-Type: text/plain; charset=UTF-8\n"
    1213"Content-Transfer-Encoding: 8bit\n"
    13 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
    14 "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
     14"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
    1515
    1616#: includes/class-simpfa-admin.php:47 includes/class-simpfa-admin.php:48
    … …  
    195195msgstr "هذا الطلب لشركة - فاتورة ضريبية"
    196196
    197 #: includes/class-simpfa-checkout.php:43 includes/class-simpfa-checkout.php:159
     197#: includes/class-simpfa-checkout.php:43
     198#: includes/class-simpfa-checkout.php:159
    198199msgid "Company name"
    199200msgstr "اسم الشركة"
    … …  
    203204msgstr "اسم الشركة (مطلوب للفاتورة الضريبية)"
    204205
    205 #: includes/class-simpfa-checkout.php:56 includes/class-simpfa-checkout.php:160
     206#: includes/class-simpfa-checkout.php:56
     207#: includes/class-simpfa-checkout.php:160
    206208msgid "Company VAT number"
    207209msgstr "الرقم الضريبي للشركة"
    … …  
    218220msgstr "يجب أن يكون الرقم الضريبي 15 رقماً ويبدأ بالرقم 3."
    219221
    220 #: includes/class-simpfa-checkout.php:85 includes/class-simpfa-checkout.php:234
     222#: includes/class-simpfa-checkout.php:85
     223#: includes/class-simpfa-checkout.php:234
    221224msgid "Please enter the company name for VAT invoice."
    222225msgstr "يرجى إدخال اسم الشركة للفاتورة الضريبية."
    … …  
    260263"الفاتورة الأصلية والإشعارات المرتبطة بها."
    261264
    262 #: includes/class-simpfa-handler.php:130 includes/class-simpfa-order-ui.php:633
     265#: includes/class-simpfa-handler.php:130
     266#: includes/class-simpfa-order-ui.php:633
    263267#: includes/class-simpfa-wc-settings-tab.php:345
    264268#: includes/class-simpfa-wc-settings-tab.php:481
    … …  
    876880#: includes/class-simpfa-wc-settings-tab.php:715
    877881msgid "Enter a valid business name, not an email address or website."
    878 msgstr "أدخل اسم نشاط تجاري صحيحًا، وليس بريدًا إلكترونيًا أو موقعًا إلكترونيًا."
     882msgstr ""
     883"أدخل اسم نشاط تجاري صحيحًا، وليس بريدًا إلكترونيًا أو موقعًا إلكترونيًا."
    879884
    880885#: includes/class-simpfa-wc-settings-tab.php:288
    … …  
    11181123#: includes/class-simpfa-wc-settings-tab.php:341
    11191124msgid ""
    1120 "Payment page opened in a new tab. Complete payment there; status will update "
    1121 "here."
     1125"Payment page opened in a new tab. Complete payment there; status will update"
     1126" here."
    11221127msgstr ""
    11231128"فُتحت صفحة الدفع في علامة تبويب جديدة. أكمل الدفع هناك وستتحدث الحالة هنا."
    … …  
    11331138#: includes/class-simpfa-wc-settings-tab.php:344
    11341139msgid ""
    1135 "Payment is still pending. You can refresh the status or return to the plugin "
    1136 "home page."
     1140"Payment is still pending. You can refresh the status or return to the plugin"
     1141" home page."
    11371142msgstr ""
    11381143"ما زالت حالة الدفع معلقة. يمكنك تحديث الحالة أو العودة إلى الصفحة الرئيسية "
    … …  
    13261331"Simulation."
    13271332msgstr ""
    1328 "منصة التجارب نشطة. الطلبات والمسترجعات التجريبية تستخدم الآن محاكاة الفاتورة "
    1329 "الإلكترونية لدى زاتكا."
     1333"منصة التجارب نشطة. الطلبات والمسترجعات التجريبية تستخدم الآن محاكاة الفاتورة"
     1334" الإلكترونية لدى زاتكا."
    13301335
    13311336#: includes/class-simpfa-wc-settings-tab.php:449
    … …  
    13461351"Invoice Settings."
    13471352msgstr ""
    1348 "تم حفظ المستند، وتعذر تحديث إعداد الضريبة الصفرية الافتراضي. حدّثه من إعدادات "
    1349 "الفواتير."
     1353"تم حفظ المستند، وتعذر تحديث إعداد الضريبة الصفرية الافتراضي. حدّثه من "
     1354"إعدادات الفواتير."
    13501355
    13511356#: includes/class-simpfa-wc-settings-tab.php:541
    … …  
    14651470#: includes/class-simpfa-wc-settings-tab.php:1233
    14661471msgid ""
    1467 "Continue your guided invoice setup and preview each change before you finish."
     1472"Continue your guided invoice setup and preview each change before you "
     1473"finish."
    14681474msgstr "تابع إعداد الفاتورة الموجه وعاين كل تغيير قبل الإنهاء."
    14691475
    … …  
    16581664#: includes/class-simpfa-wc-settings-tab.php:1267
    16591665msgid ""
    1660 "Write something eg. “Thank you for visiting us! We look forward to welcoming "
    1661 "you again soon.”"
     1666"Write something eg. “Thank you for visiting us! We look forward to welcoming"
     1667" you again soon.”"
    16621668msgstr "اكتب مثلاً: «شكراً لزيارتكم! نتطلع إلى الترحيب بكم مرة أخرى قريباً.»"
    16631669
    … …  
    17151721#: includes/class-simpfa-wc-settings-tab.php:1332
    17161722msgid ""
    1717 "Review your current plan, compare memberships, and complete embedded payment "
    1718 "here."
     1723"Review your current plan, compare memberships, and complete embedded payment"
     1724" here."
    17191725msgstr "راجع خطتك الحالية وقارن العضويات وأكمل الدفع المضمن من هنا."
    17201726
    … …  
    17261732msgid ""
    17271733"Create invoices, notes, purchase documents, and quotations directly from "
    1728 "WordPress. Quotations remain outside ZATCA and invoice usage until converted "
    1729 "to an invoice."
     1734"WordPress. Quotations remain outside ZATCA and invoice usage until converted"
     1735" to an invoice."
    17301736msgstr ""
    17311737"أنشئ الفواتير والإشعارات ومستندات الشراء وعروض الأسعار مباشرة من ووردبريس. "
    1732 "لا تُرسل عروض الأسعار إلى الهيئة ولا تُحتسب ضمن استخدام الفواتير حتى تحويلها "
    1733 "إلى فاتورة."
     1738"لا تُرسل عروض الأسعار إلى الهيئة ولا تُحتسب ضمن استخدام الفواتير حتى تحويلها"
     1739" إلى فاتورة."
    17341740
    17351741#: includes/class-simpfa-wc-settings-tab.php:1384
    … …  
    17851791#: includes/class-simpfa-wc-settings-tab.php:1453
    17861792msgid ""
    1787 "A valid VAT number makes this a standard document for VAT-registered issuers."
    1788 msgstr ""
    1789 "يحوّل الرقم الضريبي الصحيح المستند إلى مستند قياسي للمنشآت المسجلة في الضريبة."
     1793"A valid VAT number makes this a standard document for VAT-registered "
     1794"issuers."
     1795msgstr ""
     1796"يحوّل الرقم الضريبي الصحيح المستند إلى مستند قياسي للمنشآت المسجلة في "
     1797"الضريبة."
    17901798
    17911799#: includes/class-simpfa-wc-settings-tab.php:1455
    … …  
    25672575#: includes/class-simpfa-wc-settings-tab.php:2946
    25682576msgid ""
    2569 "Use ZATCA's Fatoora Simulation for test WooCommerce orders, refunds, invoice "
    2570 "settings, profile, and Phase 2 onboarding."
    2571 msgstr ""
    2572 "استخدم محاكاة الفاتورة الإلكترونية لدى زاتكا لاختبار طلبات ومسترجعات ووكومرس "
    2573 "وإعدادات الفواتير والملف الشخصي والربط بالمرحلة الثانية."
     2577"Use ZATCA's Fatoora Simulation for test WooCommerce orders, refunds, invoice"
     2578" settings, profile, and Phase 2 onboarding."
     2579msgstr ""
     2580"استخدم محاكاة الفاتورة الإلكترونية لدى زاتكا لاختبار طلبات ومسترجعات ووكومرس"
     2581" وإعدادات الفواتير والملف الشخصي والربط بالمرحلة الثانية."
    25742582
    25752583#: includes/class-simpfa-wc-settings-tab.php:2950
    … …  
    25782586"Repair it now or exit sandbox."
    25792587msgstr ""
    2580 "تم تحديد منصة التجارب، لكن هذا المتجر لا يحتوي على مفتاح واجهة برمجة تطبيقات "
    2581 "التجربة. أصلح الإعداد الآن أو اخرج من منصة التجارب."
     2588"تم تحديد منصة التجارب، لكن هذا المتجر لا يحتوي على مفتاح واجهة برمجة تطبيقات"
     2589" التجربة. أصلح الإعداد الآن أو اخرج من منصة التجارب."
    25822590
    25832591#: includes/class-simpfa-wc-settings-tab.php:2952
    … …  
    26132621"and normal customer email behavior."
    26142622msgstr ""
    2615 "اخرج من منصة التجارب لإعادة هذا المتجر إلى الفواتير المباشرة وزاتكا المباشرة "
    2616 "وسلوك البريد الإلكتروني الطبيعي للعملاء."
     2623"اخرج من منصة التجارب لإعادة هذا المتجر إلى الفواتير المباشرة وزاتكا المباشرة"
     2624" وسلوك البريد الإلكتروني الطبيعي للعملاء."
    26172625
    26182626#: includes/class-simpfa-wc-settings-tab.php:2959
    … …  
    26212629"every incoming order and refund."
    26222630msgstr ""
    2623 "تابع فقط عندما تريد أن ينشئ هذا المتجر فواتير تجريبية لكل طلب أو مسترجع وارد."
     2631"تابع فقط عندما تريد أن ينشئ هذا المتجر فواتير تجريبية لكل طلب أو مسترجع "
     2632"وارد."
    26242633
    26252634#: includes/class-simpfa-wc-settings-tab.php:2966
    … …  
    27132722
    27142723#: includes/class-simpfa-wc-settings-tab.php:3156
    2715 msgid "Please reconnect your Simple Fatoora account to review payment details."
     2724msgid ""
     2725"Please reconnect your Simple Fatoora account to review payment details."
    27162726msgstr "يرجى إعادة ربط حساب سمبل فاتورة لمراجعة تفاصيل الدفع."
    27172727
    … …  
    29202930"memberships and invoice settings in one place."
    29212931msgstr ""
    2922 "اربط متجر WooCommerce الخاص بك دون مغادرة ووردبريس، ثم أدر العضويات وإعدادات "
    2923 "الفاتورة من مكان واحد."
     2932"اربط متجر WooCommerce الخاص بك دون مغادرة ووردبريس، ثم أدر العضويات وإعدادات"
     2933" الفاتورة من مكان واحد."
    29242934
    29252935#: includes/class-simpfa-wc-settings-tab.php:4350
    … …  
    33183328
    33193329#: includes/class-simpfa-wc-settings-tab.php:4944
    3320 msgid "Choose when and for which customers WooCommerce orders create invoices."
     3330msgid ""
     3331"Choose when and for which customers WooCommerce orders create invoices."
    33213332msgstr "حدد متى ولأي عملاء تنشئ طلبات ووكومرس فواتير."
    33223333
    … …  
    34813492"codes."
    34823493msgstr ""
    3483 "نعم. تدعم الإضافة مسارات المرحلتين الأولى والثانية عبر خدمة سمبل فاتورة، بما "
    3484 "في ذلك إنشاء الفواتير المتوافقة ورموز QR."
     3494"نعم. تدعم الإضافة مسارات المرحلتين الأولى والثانية عبر خدمة سمبل فاتورة، بما"
     3495" في ذلك إنشاء الفواتير المتوافقة ورموز QR."
    34853496
    34863497#: includes/class-simpfa-wc-settings-tab.php:5102
    … …  
    35313542"be processed as a VAT invoice."
    35323543msgstr ""
    3533 "عند تفعيل تفضيل صفحة الدفع، يمكن للعميل اختيار فاتورة شركة وإدخال اسم الشركة "
    3534 "والرقم الضريبي حتى تتم معالجة الطلب كفاتورة ضريبية."
     3544"عند تفعيل تفضيل صفحة الدفع، يمكن للعميل اختيار فاتورة شركة وإدخال اسم الشركة"
     3545" والرقم الضريبي حتى تتم معالجة الطلب كفاتورة ضريبية."
    35353546
    35363547#: includes/class-simpfa-wc-settings-tab.php:5106
    … …  
    35753586#: includes/class-simpfa-wc-settings-tab.php:5109
    35763587msgid ""
    3577 "Yes. An active membership is required before invoice and credit note actions "
    3578 "become available."
     3588"Yes. An active membership is required before invoice and credit note actions"
     3589" become available."
    35793590msgstr ""
    35803591"نعم. يلزم وجود عضوية نشطة قبل إتاحة إجراءات الفواتير والإشعارات الدائنة."
    … …  
    37103721#: includes/class-simpfa-wc-settings-tab.php:6154
    37113722msgid ""
    3712 "You do not have permission for this section. Ask a business member with user "
    3713 "management access to update your permissions."
     3723"You do not have permission for this section. Ask a business member with user"
     3724" management access to update your permissions."
    37143725msgstr ""
    37153726"ليس لديك صلاحية الوصول إلى هذا القسم. اطلب من أحد أعضاء المنشأة المخولين "
    … …  
    39223933"with their original business."
    39233934msgstr ""
    3924 "تُنشأ الطلبات الجديدة باسم المنشأة المرتبطة. وتبقى الفواتير والمبالغ المستردة "
    3925 "السابقة مرتبطة بمنشآتها الأصلية."
     3935"تُنشأ الطلبات الجديدة باسم المنشأة المرتبطة. وتبقى الفواتير والمبالغ "
     3936"المستردة السابقة مرتبطة بمنشآتها الأصلية."
    39263937
    39273938#: simple-fatoora.php:1425
    … …  
    39323943msgid "Settings"
    39333944msgstr "الإعدادات"
     3945
     3946#: includes/class-simpfa-wc-settings-tab.php
     3947msgid "Please sign in again to access Profile Settings."
     3948msgstr "يرجى تسجيل الدخول مجدداً للوصول إلى إعدادات الملف الشخصي."
     3949
     3950#: includes/class-simpfa-wc-settings-tab.php
     3951msgid "Unable to load your profile. Please try again."
     3952msgstr "تعذّر تحميل ملفك الشخصي. يرجى المحاولة مجدداً."
     3953
     3954#: includes/class-simpfa-wc-settings-tab.php
     3955msgid "Try again"
     3956msgstr "المحاولة مجدداً"
     3957
     3958#: includes/class-simpfa-wc-settings-tab.php
     3959msgid "Unable to sign in. Please try again."
     3960msgstr "تعذّر تسجيل الدخول. يرجى المحاولة مجدداً."
     3961
     3962#: includes/class-simpfa-wc-settings-tab.php
     3963msgid "Confirming your payment"
     3964msgstr "جارٍ تأكيد الدفع"
     3965
     3966#: includes/class-simpfa-wc-settings-tab.php
     3967msgid "Payment confirmed"
     3968msgstr "تم تأكيد الدفع"
     3969
     3970#: includes/class-simpfa-wc-settings-tab.php
     3971msgid "Payment failed"
     3972msgstr "فشلت عملية الدفع"
     3973
     3974#: includes/class-simpfa-wc-settings-tab.php
     3975msgid "Back to subscription"
     3976msgstr "العودة إلى الاشتراك"
     3977
     3978#: includes/class-simpfa-wc-settings-tab.php
     3979msgid "Please sign in to view your subscription."
     3980msgstr "يرجى تسجيل الدخول لعرض اشتراكك."
  • simple-fatoora/tags/4.24/languages/simple-fatoora.pot

    r3762341 r3762600  
    77msgid ""
    88msgstr ""
    9 "Project-Id-Version: Simple Fatoora 4.23\n"
     9"Project-Id-Version: Simple Fatoora 4.24\n"
    1010"Report-Msgid-Bugs-To: \n"
    1111"POT-Creation-Date: 2026-10-23 22:17+0300\n"
    … …  
    197197msgstr ""
    198198
    199 #: includes/class-simpfa-checkout.php:43 includes/class-simpfa-checkout.php:159
     199#: includes/class-simpfa-checkout.php:43
     200#: includes/class-simpfa-checkout.php:159
    200201msgid "Company name"
    201202msgstr ""
    … …  
    205206msgstr ""
    206207
    207 #: includes/class-simpfa-checkout.php:56 includes/class-simpfa-checkout.php:160
     208#: includes/class-simpfa-checkout.php:56
     209#: includes/class-simpfa-checkout.php:160
    208210msgid "Company VAT number"
    209211msgstr ""
    … …  
    220222msgstr ""
    221223
    222 #: includes/class-simpfa-checkout.php:85 includes/class-simpfa-checkout.php:234
     224#: includes/class-simpfa-checkout.php:85
     225#: includes/class-simpfa-checkout.php:234
    223226msgid "Please enter the company name for VAT invoice."
    224227msgstr ""
    … …  
    260263msgstr ""
    261264
    262 #: includes/class-simpfa-handler.php:130 includes/class-simpfa-order-ui.php:633
     265#: includes/class-simpfa-handler.php:130
     266#: includes/class-simpfa-order-ui.php:633
    263267#: includes/class-simpfa-wc-settings-tab.php:345
    264268#: includes/class-simpfa-wc-settings-tab.php:481
    … …  
    11071111#: includes/class-simpfa-wc-settings-tab.php:341
    11081112msgid ""
    1109 "Payment page opened in a new tab. Complete payment there; status will update "
    1110 "here."
     1113"Payment page opened in a new tab. Complete payment there; status will update"
     1114" here."
    11111115msgstr ""
    11121116
    … …  
    11211125#: includes/class-simpfa-wc-settings-tab.php:344
    11221126msgid ""
    1123 "Payment is still pending. You can refresh the status or return to the plugin "
    1124 "home page."
     1127"Payment is still pending. You can refresh the status or return to the plugin"
     1128" home page."
    11251129msgstr ""
    11261130
    … …  
    14451449#: includes/class-simpfa-wc-settings-tab.php:1233
    14461450msgid ""
    1447 "Continue your guided invoice setup and preview each change before you finish."
     1451"Continue your guided invoice setup and preview each change before you "
     1452"finish."
    14481453msgstr ""
    14491454
    … …  
    16381643#: includes/class-simpfa-wc-settings-tab.php:1267
    16391644msgid ""
    1640 "Write something eg. “Thank you for visiting us! We look forward to welcoming "
    1641 "you again soon.”"
     1645"Write something eg. “Thank you for visiting us! We look forward to welcoming"
     1646" you again soon.”"
    16421647msgstr ""
    16431648
    … …  
    16951700#: includes/class-simpfa-wc-settings-tab.php:1332
    16961701msgid ""
    1697 "Review your current plan, compare memberships, and complete embedded payment "
    1698 "here."
     1702"Review your current plan, compare memberships, and complete embedded payment"
     1703" here."
    16991704msgstr ""
    17001705
    … …  
    17061711msgid ""
    17071712"Create invoices, notes, purchase documents, and quotations directly from "
    1708 "WordPress. Quotations remain outside ZATCA and invoice usage until converted "
    1709 "to an invoice."
     1713"WordPress. Quotations remain outside ZATCA and invoice usage until converted"
     1714" to an invoice."
    17101715msgstr ""
    17111716
    … …  
    17621767#: includes/class-simpfa-wc-settings-tab.php:1453
    17631768msgid ""
    1764 "A valid VAT number makes this a standard document for VAT-registered issuers."
     1769"A valid VAT number makes this a standard document for VAT-registered "
     1770"issuers."
    17651771msgstr ""
    17661772
    … …  
    25312537#: includes/class-simpfa-wc-settings-tab.php:2946
    25322538msgid ""
    2533 "Use ZATCA's Fatoora Simulation for test WooCommerce orders, refunds, invoice "
    2534 "settings, profile, and Phase 2 onboarding."
     2539"Use ZATCA's Fatoora Simulation for test WooCommerce orders, refunds, invoice"
     2540" settings, profile, and Phase 2 onboarding."
    25352541msgstr ""
    25362542
    … …  
    26632669
    26642670#: includes/class-simpfa-wc-settings-tab.php:3156
    2665 msgid "Please reconnect your Simple Fatoora account to review payment details."
     2671msgid ""
     2672"Please reconnect your Simple Fatoora account to review payment details."
    26662673msgstr ""
    26672674
    … …  
    32603267
    32613268#: includes/class-simpfa-wc-settings-tab.php:4944
    3262 msgid "Choose when and for which customers WooCommerce orders create invoices."
     3269msgid ""
     3270"Choose when and for which customers WooCommerce orders create invoices."
    32633271msgstr ""
    32643272
    … …  
    34963504#: includes/class-simpfa-wc-settings-tab.php:5109
    34973505msgid ""
    3498 "Yes. An active membership is required before invoice and credit note actions "
    3499 "become available."
     3506"Yes. An active membership is required before invoice and credit note actions"
     3507" become available."
    35003508msgstr ""
    35013509
    … …  
    36243632#: includes/class-simpfa-wc-settings-tab.php:6154
    36253633msgid ""
    3626 "You do not have permission for this section. Ask a business member with user "
    3627 "management access to update your permissions."
     3634"You do not have permission for this section. Ask a business member with user"
     3635" management access to update your permissions."
    36283636msgstr ""
    36293637
    … …  
    38403848msgid "Settings"
    38413849msgstr ""
     3850
     3851#: includes/class-simpfa-wc-settings-tab.php
     3852msgid "Please sign in again to access Profile Settings."
     3853msgstr ""
     3854
     3855#: includes/class-simpfa-wc-settings-tab.php
     3856msgid "Unable to load your profile. Please try again."
     3857msgstr ""
     3858
     3859#: includes/class-simpfa-wc-settings-tab.php
     3860msgid "Try again"
     3861msgstr ""
     3862
     3863#: includes/class-simpfa-wc-settings-tab.php
     3864msgid "Unable to sign in. Please try again."
     3865msgstr ""
     3866
     3867#: includes/class-simpfa-wc-settings-tab.php
     3868msgid "Confirming your payment"
     3869msgstr ""
     3870
     3871#: includes/class-simpfa-wc-settings-tab.php
     3872msgid "Payment confirmed"
     3873msgstr ""
     3874
     3875#: includes/class-simpfa-wc-settings-tab.php
     3876msgid "Payment failed"
     3877msgstr ""
     3878
     3879#: includes/class-simpfa-wc-settings-tab.php
     3880msgid "Back to subscription"
     3881msgstr ""
     3882
     3883#: includes/class-simpfa-wc-settings-tab.php
     3884msgid "Please sign in to view your subscription."
     3885msgstr ""
  • simple-fatoora/tags/4.24/readme.txt

    r3762341 r3762600  
    44Tested up to: 6.9.4
    55Requires PHP: 7.4
    6 Stable tag: 4.23
     6Stable tag: 4.24
    77License: GPLv2 or later
    88License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    101101== Changelog ==
    102102
     103= 4.24 =
     104* User Experience Improvements
     105
    103106= 4.23 =
    104107* Performance Improvements
  • simple-fatoora/tags/4.24/simple-fatoora.php

    r3762341 r3762600  
    55 * Plugin URI: https://simplefatoora.com/
    66 * Description: Adds ZATCA Phase 2 e-invoicing with QR codes to WooCommerce for B2C and B2B VAT invoices.
    7  * Version: 4.23
     7 * Version: 4.24
    88 * Author: Future Base
    99 * Author URI: https://futurebase.sa/
    … …  
    2626// -----------------------------------------------------------------------------
    2727if (!defined('SIMPFA_VERSION')) {
    28   define('SIMPFA_VERSION', '4.23');
     28  define('SIMPFA_VERSION', '4.24');
    2929}
    3030require_once __DIR__ . '/includes/class-simpfa-order-boundary.php';
  • simple-fatoora/trunk/assets/js/simple-fatoora-settings.js

    r3762341 r3762600  
    564564        password: password || ''
    565565      };
     566      if ($('#sf-personal-signin').length) payload.signin_purpose = 'personal_profile';
    566567
    567568      if (!payload.email_id || !payload.password) {
  • simple-fatoora/trunk/includes/class-simpfa-business-connection.php

    r3762341 r3762600  
    2424  private static function remembered_session()
    2525  {
    26     $saved = get_transient(self::session_key());
    27     if (!$saved && function_exists('get_user_meta')) $saved = get_user_meta(get_current_user_id(), 'simpfa_personal_session', true);
     26    // Durable administrator-owned proof is canonical; an old object-cache entry
     27    // must not replace a newer sign-in or bypass its expiry.
     28    $saved = function_exists('get_user_meta') ? get_user_meta(get_current_user_id(), 'simpfa_personal_session', true) : '';
     29    if (!$saved) $saved = get_transient(self::session_key());
    2830    // Recover a surviving legacy DB-backed transient after an object-cache change.
    2931    if (!$saved) $saved = get_option('_transient_' . self::session_key(), '');
  • simple-fatoora/trunk/includes/class-simpfa-wc-settings-tab.php

    r3762341 r3762600  
    26452645    $token = Simpfa_BusinessConnection::token();
    26462646    $result = $token ? $this->get_client()->business_account($token, '/account') : [];
    2647     if (empty($result['ok'])) return '<div class="sf-card sf-form-card" data-personal-session-state="' . esc_attr(Simpfa_BusinessConnection::personal_session_state()) . '"><h2>' . esc_html__('Profile Settings', 'simple-fatoora') . '</h2><p>' . esc_html__('Your business is connected. Personal profile settings require your remembered account sign-in.', 'simple-fatoora') . '</p><a href="' . esc_url($this->get_page_url('home')) . '">' . esc_html__('Home', 'simple-fatoora') . '</a></div>';
     2647    if (empty($result['ok'])) {
     2648      $signin = !$token || in_array((int) ($result['status_code'] ?? 0), [401, 403], true);
     2649      $url = $signin ? add_query_arg('sf_profile_signin', '1', $this->get_page_url('profile')) : $this->get_page_url('profile');
     2650      if ($signin && isset($_GET['sf_profile_signin']) && (string) $_GET['sf_profile_signin'] === '1') return $this->render_personal_signin_card();
     2651      return '<div class="sf-card sf-form-card sf-personal-signin-notice" data-personal-session-state="' . esc_attr(Simpfa_BusinessConnection::personal_session_state()) . '"><h2>' . esc_html__('Profile Settings', 'simple-fatoora') . '</h2><p>' . esc_html($signin ? __('Please sign in again to access Profile Settings.', 'simple-fatoora') : __('Unable to load your profile. Please try again.', 'simple-fatoora')) . '</p><a class="sf-button-primary" href="' . esc_url($url) . '">' . esc_html($signin ? __('Sign In', 'simple-fatoora') : __('Try again', 'simple-fatoora')) . '</a></div>';
     2652    }
    26482653    $person = $this->get_client()->extract_response($result, []);
    26492654    $html = '<div id="sf-page-profile" class="sf-card sf-form-card sf-page-view sf-page-view--profile"><div class="sf-page-header"><h2 class="sf-title">' . esc_html__('Profile Settings', 'simple-fatoora') . '</h2></div>';
    … …  
    26572662    }
    26582663    return $html . '</div><div class="sf-form-actions sf-profile-submit-row"><button type="submit" class="button sf-button-primary" formaction="' . esc_url(admin_url('admin-post.php?action=simpfa_personal_profile')) . '" formmethod="post">' . esc_html__('Save Profile', 'simple-fatoora') . '</button></div></div></div>';
     2664  }
     2665
     2666  private function render_personal_signin_card()
     2667  {
     2668    return '<div id="sf-personal-signin" class="sf-card sf-form-card"><h2>' . esc_html__('Sign In', 'simple-fatoora') . '</h2><div class="sf-form sf-auth-form"><div class="sf-form-row"><label for="sf-login-email">' . esc_html__('Email', 'simple-fatoora') . '</label><input id="sf-login-email" type="email" autocomplete="username" /></div><div class="sf-form-row"><label for="sf-login-password">' . esc_html__('Password', 'simple-fatoora') . '</label><input id="sf-login-password" type="password" autocomplete="current-password" /></div><button type="button" id="sf-native-signin-btn" class="sf-button-primary">' . esc_html__('Sign In', 'simple-fatoora') . '</button><div id="sf-signin-feedback" class="sf-auth-feedback sf-v2-feedback" aria-live="polite"></div></div></div>';
    26592669  }
    26602670
    … …  
    31153125    $resolved_view = $this->resolve_payment_result_view($requested_view, $payment_result_data['status']);
    31163126    $transaction_id = isset($payment_result_data['transaction_id']) ? absint($payment_result_data['transaction_id']) : 0;
    3117     $result_title = __('Payment Status', 'simple-fatoora');
    3118     $result_message = __('We are checking your payment result.', 'simple-fatoora');
     3127    $result_title = __('Confirming your payment', 'simple-fatoora');
    31193128    $icon_class = 'sf-payment-result-icon-pending';
    3120     $icon_symbol = '...';
    3121 
     3129    $icon_symbol = '…';
    31223130    if ($resolved_view === 'success') {
    3123       $result_title = __('Purchase Confirmed', 'simple-fatoora');
    3124       $result_message = __('Your recurring membership payment was completed successfully.', 'simple-fatoora');
     3131      $result_title = __('Payment confirmed', 'simple-fatoora');
    31253132      $icon_class = 'sf-payment-result-icon-success';
    31263133      $icon_symbol = '✓';
    31273134    } elseif ($resolved_view === 'failed') {
    3128       $result_title = __('Payment Failed', 'simple-fatoora');
    3129       $result_message = $payment_view['reason'] === 'cancelled_or_failed'
    3130         ? __('The payment was cancelled or could not be completed. No membership was activated.', 'simple-fatoora')
    3131         : __('We could not confirm this payment. Please try again.', 'simple-fatoora');
     3135      $result_title = __('Payment failed', 'simple-fatoora');
    31323136      $icon_class = 'sf-payment-result-icon-failed';
    31333137      $icon_symbol = '!';
    3134     } else {
    3135       $result_title = __('Payment Pending', 'simple-fatoora');
    3136       $result_message = __('We are waiting for payment confirmation from MyFatoorah. This can take a short moment after OTP or card confirmation.', 'simple-fatoora');
    3137     }
    3138 
    3139     $home_button = '<a class="sf-button-primary" href="' . esc_url($payment_home_url) . '">' . esc_html__('Back to Plugin Home', 'simple-fatoora') . '</a>';
    3140     $refresh_button = '<a class="sf-button-secondary sf-hidden" href="' . esc_url($this->build_payment_result_url('pending', $transaction_id)) . '" id="sf-payment-result-refresh">' . esc_html__('Refresh Status', 'simple-fatoora') . '</a>';
    3141     $details = '';
    3142     if ($resolved_view === 'success') {
    3143       $membership_end_label = $this->get_membership_end_label(isset($payment_result_data['membership_title']) ? (string) $payment_result_data['membership_title'] : '');
    3144       $details .= '<div class="sf-payment-result-grid">';
    3145       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Membership', 'simple-fatoora') . '</span><strong>' . esc_html($payment_result_data['membership_title'] !== '' ? $payment_result_data['membership_title'] : '--') . '</strong></div>';
    3146       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Total', 'simple-fatoora') . '</span><strong>' . esc_html($this->format_result_amount($payment_result_data['amount'])) . '</strong></div>';
    3147       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Term', 'simple-fatoora') . '</span><strong>' . esc_html($payment_result_data['membership_term_label'] !== '' ? $payment_result_data['membership_term_label'] : '--') . '</strong></div>';
    3148       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Start Date', 'simple-fatoora') . '</span><strong>' . esc_html($payment_result_data['membership_start_date'] !== '' ? $payment_result_data['membership_start_date'] : '--') . '</strong></div>';
    3149       $details .= '<div class="sf-payment-result-item"><span>' . esc_html($membership_end_label) . '</span><strong>' . esc_html($payment_result_data['membership_end_date'] !== '' ? $payment_result_data['membership_end_date'] : '--') . '</strong></div>';
    3150       $details .= '<div class="sf-payment-result-item"><span>' . esc_html__('Invoice ID', 'simple-fatoora') . '</span><strong>' . esc_html($payment_result_data['membership_invoice_number'] !== '' ? $payment_result_data['membership_invoice_number'] : '--') . '</strong></div>';
    3151       $details .= '</div>';
    3152     }
    3153 
    3154     $status_note = '';
    3155     if (!$is_connected) {
    3156       $status_note = '<div class="sf-notice sf-notice-error">' . esc_html__('Please reconnect your Simple Fatoora account to review payment details.', 'simple-fatoora') . '</div>';
    3157     } elseif (!empty($payment_result_data['message']) && $resolved_view !== 'success') {
    3158       $status_note = '<div class="sf-notice sf-notice-error">' . esc_html($payment_result_data['message']) . '</div>';
    3159     }
     3138    }
     3139    $home_button = '<a class="sf-button-primary" href="' . esc_url($is_connected ? $this->get_page_url('memberships') : $payment_home_url) . '">' . esc_html($is_connected ? __('Back to subscription', 'simple-fatoora') : __('Sign In', 'simple-fatoora')) . '</a>';
     3140    $status_note = !$is_connected ? '<p>' . esc_html__('Please sign in to view your subscription.', 'simple-fatoora') . '</p>' : '';
    31603141
    31613142    $pending_meta = '';
    … …  
    31743155    $html .= '<div class="sf-payment-result-icon ' . esc_attr($icon_class) . '">' . esc_html($icon_symbol) . '</div>';
    31753156    $html .= '<h3 class="sf-section-title">' . esc_html($result_title) . '</h3>';
    3176     $html .= '<p class="sf-subtitle">' . esc_html($result_message) . '</p>';
    31773157    $html .= '</div>';
    31783158    $html .= $status_note;
    3179     $html .= $details;
    31803159    if ($resolved_view === 'pending') {
    3181       $html .= '<div id="sf-payment-result-feedback" class="sf-v2-feedback" aria-live="polite"></div>';
     3160      $html .= '<div id="sf-payment-result-feedback" class="sf-v2-feedback sf-hidden" aria-live="polite"></div>';
    31823161    }
    31833162    $html .= '<div class="sf-payment-result-actions">';
    3184     if ($resolved_view === 'pending') {
    3185       $html .= $refresh_button;
    3186     }
    31873163    $html .= $home_button;
    31883164    $html .= '</div>';
    … …  
    32103186
    32113187    $login_payload = $this->get_client()->extract_response($login, []);
     3188    if (sanitize_key(wp_unslash($_POST['signin_purpose'] ?? '')) === 'personal_profile') {
     3189      if (empty($login_payload['uuid']) || !Simpfa_BusinessConnection::begin($this->get_client(), $login_payload['uuid'])) {
     3190        wp_send_json_error(__('Unable to sign in. Please try again.', 'simple-fatoora'));
     3191      }
     3192      // Personal reauthentication must never reconnect or switch the store's business.
     3193      wp_send_json_success(['redirect_url' => $this->get_page_url('profile')]);
     3194    }
    32123195    if (!empty($login_payload['uuid'])) {
    32133196      $this->begin_business_selection($login_payload['uuid']);
  • simple-fatoora/trunk/languages/simple-fatoora-ar.po

    r3762341 r3762600  
    1 msgid ""
    2 msgstr ""
    3 "Project-Id-Version: Simple Fatoora 4.23\n"
     1#
     2msgid ""
     3msgstr ""
     4"Project-Id-Version: Simple Fatoora 4.24\n"
    45"Report-Msgid-Bugs-To: \n"
    56"POT-Creation-Date: 2026-10-23 22:17+0300\n"
    … …  
    1112"Content-Type: text/plain; charset=UTF-8\n"
    1213"Content-Transfer-Encoding: 8bit\n"
    13 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
    14 "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
     14"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
    1515
    1616#: includes/class-simpfa-admin.php:47 includes/class-simpfa-admin.php:48
    … …  
    195195msgstr "هذا الطلب لشركة - فاتورة ضريبية"
    196196
    197 #: includes/class-simpfa-checkout.php:43 includes/class-simpfa-checkout.php:159
     197#: includes/class-simpfa-checkout.php:43
     198#: includes/class-simpfa-checkout.php:159
    198199msgid "Company name"
    199200msgstr "اسم الشركة"
    … …  
    203204msgstr "اسم الشركة (مطلوب للفاتورة الضريبية)"
    204205
    205 #: includes/class-simpfa-checkout.php:56 includes/class-simpfa-checkout.php:160
     206#: includes/class-simpfa-checkout.php:56
     207#: includes/class-simpfa-checkout.php:160
    206208msgid "Company VAT number"
    207209msgstr "الرقم الضريبي للشركة"
    … …  
    218220msgstr "يجب أن يكون الرقم الضريبي 15 رقماً ويبدأ بالرقم 3."
    219221
    220 #: includes/class-simpfa-checkout.php:85 includes/class-simpfa-checkout.php:234
     222#: includes/class-simpfa-checkout.php:85
     223#: includes/class-simpfa-checkout.php:234
    221224msgid "Please enter the company name for VAT invoice."
    222225msgstr "يرجى إدخال اسم الشركة للفاتورة الضريبية."
    … …  
    260263"الفاتورة الأصلية والإشعارات المرتبطة بها."
    261264
    262 #: includes/class-simpfa-handler.php:130 includes/class-simpfa-order-ui.php:633
     265#: includes/class-simpfa-handler.php:130
     266#: includes/class-simpfa-order-ui.php:633
    263267#: includes/class-simpfa-wc-settings-tab.php:345
    264268#: includes/class-simpfa-wc-settings-tab.php:481
    … …  
    876880#: includes/class-simpfa-wc-settings-tab.php:715
    877881msgid "Enter a valid business name, not an email address or website."
    878 msgstr "أدخل اسم نشاط تجاري صحيحًا، وليس بريدًا إلكترونيًا أو موقعًا إلكترونيًا."
     882msgstr ""
     883"أدخل اسم نشاط تجاري صحيحًا، وليس بريدًا إلكترونيًا أو موقعًا إلكترونيًا."
    879884
    880885#: includes/class-simpfa-wc-settings-tab.php:288
    … …  
    11181123#: includes/class-simpfa-wc-settings-tab.php:341
    11191124msgid ""
    1120 "Payment page opened in a new tab. Complete payment there; status will update "
    1121 "here."
     1125"Payment page opened in a new tab. Complete payment there; status will update"
     1126" here."
    11221127msgstr ""
    11231128"فُتحت صفحة الدفع في علامة تبويب جديدة. أكمل الدفع هناك وستتحدث الحالة هنا."
    … …  
    11331138#: includes/class-simpfa-wc-settings-tab.php:344
    11341139msgid ""
    1135 "Payment is still pending. You can refresh the status or return to the plugin "
    1136 "home page."
     1140"Payment is still pending. You can refresh the status or return to the plugin"
     1141" home page."
    11371142msgstr ""
    11381143"ما زالت حالة الدفع معلقة. يمكنك تحديث الحالة أو العودة إلى الصفحة الرئيسية "
    … …  
    13261331"Simulation."
    13271332msgstr ""
    1328 "منصة التجارب نشطة. الطلبات والمسترجعات التجريبية تستخدم الآن محاكاة الفاتورة "
    1329 "الإلكترونية لدى زاتكا."
     1333"منصة التجارب نشطة. الطلبات والمسترجعات التجريبية تستخدم الآن محاكاة الفاتورة"
     1334" الإلكترونية لدى زاتكا."
    13301335
    13311336#: includes/class-simpfa-wc-settings-tab.php:449
    … …  
    13461351"Invoice Settings."
    13471352msgstr ""
    1348 "تم حفظ المستند، وتعذر تحديث إعداد الضريبة الصفرية الافتراضي. حدّثه من إعدادات "
    1349 "الفواتير."
     1353"تم حفظ المستند، وتعذر تحديث إعداد الضريبة الصفرية الافتراضي. حدّثه من "
     1354"إعدادات الفواتير."
    13501355
    13511356#: includes/class-simpfa-wc-settings-tab.php:541
    … …  
    14651470#: includes/class-simpfa-wc-settings-tab.php:1233
    14661471msgid ""
    1467 "Continue your guided invoice setup and preview each change before you finish."
     1472"Continue your guided invoice setup and preview each change before you "
     1473"finish."
    14681474msgstr "تابع إعداد الفاتورة الموجه وعاين كل تغيير قبل الإنهاء."
    14691475
    … …  
    16581664#: includes/class-simpfa-wc-settings-tab.php:1267
    16591665msgid ""
    1660 "Write something eg. “Thank you for visiting us! We look forward to welcoming "
    1661 "you again soon.”"
     1666"Write something eg. “Thank you for visiting us! We look forward to welcoming"
     1667" you again soon.”"
    16621668msgstr "اكتب مثلاً: «شكراً لزيارتكم! نتطلع إلى الترحيب بكم مرة أخرى قريباً.»"
    16631669
    … …  
    17151721#: includes/class-simpfa-wc-settings-tab.php:1332
    17161722msgid ""
    1717 "Review your current plan, compare memberships, and complete embedded payment "
    1718 "here."
     1723"Review your current plan, compare memberships, and complete embedded payment"
     1724" here."
    17191725msgstr "راجع خطتك الحالية وقارن العضويات وأكمل الدفع المضمن من هنا."
    17201726
    … …  
    17261732msgid ""
    17271733"Create invoices, notes, purchase documents, and quotations directly from "
    1728 "WordPress. Quotations remain outside ZATCA and invoice usage until converted "
    1729 "to an invoice."
     1734"WordPress. Quotations remain outside ZATCA and invoice usage until converted"
     1735" to an invoice."
    17301736msgstr ""
    17311737"أنشئ الفواتير والإشعارات ومستندات الشراء وعروض الأسعار مباشرة من ووردبريس. "
    1732 "لا تُرسل عروض الأسعار إلى الهيئة ولا تُحتسب ضمن استخدام الفواتير حتى تحويلها "
    1733 "إلى فاتورة."
     1738"لا تُرسل عروض الأسعار إلى الهيئة ولا تُحتسب ضمن استخدام الفواتير حتى تحويلها"
     1739" إلى فاتورة."
    17341740
    17351741#: includes/class-simpfa-wc-settings-tab.php:1384
    … …  
    17851791#: includes/class-simpfa-wc-settings-tab.php:1453
    17861792msgid ""
    1787 "A valid VAT number makes this a standard document for VAT-registered issuers."
    1788 msgstr ""
    1789 "يحوّل الرقم الضريبي الصحيح المستند إلى مستند قياسي للمنشآت المسجلة في الضريبة."
     1793"A valid VAT number makes this a standard document for VAT-registered "
     1794"issuers."
     1795msgstr ""
     1796"يحوّل الرقم الضريبي الصحيح المستند إلى مستند قياسي للمنشآت المسجلة في "
     1797"الضريبة."
    17901798
    17911799#: includes/class-simpfa-wc-settings-tab.php:1455
    … …  
    25672575#: includes/class-simpfa-wc-settings-tab.php:2946
    25682576msgid ""
    2569 "Use ZATCA's Fatoora Simulation for test WooCommerce orders, refunds, invoice "
    2570 "settings, profile, and Phase 2 onboarding."
    2571 msgstr ""
    2572 "استخدم محاكاة الفاتورة الإلكترونية لدى زاتكا لاختبار طلبات ومسترجعات ووكومرس "
    2573 "وإعدادات الفواتير والملف الشخصي والربط بالمرحلة الثانية."
     2577"Use ZATCA's Fatoora Simulation for test WooCommerce orders, refunds, invoice"
     2578" settings, profile, and Phase 2 onboarding."
     2579msgstr ""
     2580"استخدم محاكاة الفاتورة الإلكترونية لدى زاتكا لاختبار طلبات ومسترجعات ووكومرس"
     2581" وإعدادات الفواتير والملف الشخصي والربط بالمرحلة الثانية."
    25742582
    25752583#: includes/class-simpfa-wc-settings-tab.php:2950
    … …  
    25782586"Repair it now or exit sandbox."
    25792587msgstr ""
    2580 "تم تحديد منصة التجارب، لكن هذا المتجر لا يحتوي على مفتاح واجهة برمجة تطبيقات "
    2581 "التجربة. أصلح الإعداد الآن أو اخرج من منصة التجارب."
     2588"تم تحديد منصة التجارب، لكن هذا المتجر لا يحتوي على مفتاح واجهة برمجة تطبيقات"
     2589" التجربة. أصلح الإعداد الآن أو اخرج من منصة التجارب."
    25822590
    25832591#: includes/class-simpfa-wc-settings-tab.php:2952
    … …  
    26132621"and normal customer email behavior."
    26142622msgstr ""
    2615 "اخرج من منصة التجارب لإعادة هذا المتجر إلى الفواتير المباشرة وزاتكا المباشرة "
    2616 "وسلوك البريد الإلكتروني الطبيعي للعملاء."
     2623"اخرج من منصة التجارب لإعادة هذا المتجر إلى الفواتير المباشرة وزاتكا المباشرة"
     2624" وسلوك البريد الإلكتروني الطبيعي للعملاء."
    26172625
    26182626#: includes/class-simpfa-wc-settings-tab.php:2959
    … …  
    26212629"every incoming order and refund."
    26222630msgstr ""
    2623 "تابع فقط عندما تريد أن ينشئ هذا المتجر فواتير تجريبية لكل طلب أو مسترجع وارد."
     2631"تابع فقط عندما تريد أن ينشئ هذا المتجر فواتير تجريبية لكل طلب أو مسترجع "
     2632"وارد."
    26242633
    26252634#: includes/class-simpfa-wc-settings-tab.php:2966
    … …  
    27132722
    27142723#: includes/class-simpfa-wc-settings-tab.php:3156
    2715 msgid "Please reconnect your Simple Fatoora account to review payment details."
     2724msgid ""
     2725"Please reconnect your Simple Fatoora account to review payment details."
    27162726msgstr "يرجى إعادة ربط حساب سمبل فاتورة لمراجعة تفاصيل الدفع."
    27172727
    … …  
    29202930"memberships and invoice settings in one place."
    29212931msgstr ""
    2922 "اربط متجر WooCommerce الخاص بك دون مغادرة ووردبريس، ثم أدر العضويات وإعدادات "
    2923 "الفاتورة من مكان واحد."
     2932"اربط متجر WooCommerce الخاص بك دون مغادرة ووردبريس، ثم أدر العضويات وإعدادات"
     2933" الفاتورة من مكان واحد."
    29242934
    29252935#: includes/class-simpfa-wc-settings-tab.php:4350
    … …  
    33183328
    33193329#: includes/class-simpfa-wc-settings-tab.php:4944
    3320 msgid "Choose when and for which customers WooCommerce orders create invoices."
     3330msgid ""
     3331"Choose when and for which customers WooCommerce orders create invoices."
    33213332msgstr "حدد متى ولأي عملاء تنشئ طلبات ووكومرس فواتير."
    33223333
    … …  
    34813492"codes."
    34823493msgstr ""
    3483 "نعم. تدعم الإضافة مسارات المرحلتين الأولى والثانية عبر خدمة سمبل فاتورة، بما "
    3484 "في ذلك إنشاء الفواتير المتوافقة ورموز QR."
     3494"نعم. تدعم الإضافة مسارات المرحلتين الأولى والثانية عبر خدمة سمبل فاتورة، بما"
     3495" في ذلك إنشاء الفواتير المتوافقة ورموز QR."
    34853496
    34863497#: includes/class-simpfa-wc-settings-tab.php:5102
    … …  
    35313542"be processed as a VAT invoice."
    35323543msgstr ""
    3533 "عند تفعيل تفضيل صفحة الدفع، يمكن للعميل اختيار فاتورة شركة وإدخال اسم الشركة "
    3534 "والرقم الضريبي حتى تتم معالجة الطلب كفاتورة ضريبية."
     3544"عند تفعيل تفضيل صفحة الدفع، يمكن للعميل اختيار فاتورة شركة وإدخال اسم الشركة"
     3545" والرقم الضريبي حتى تتم معالجة الطلب كفاتورة ضريبية."
    35353546
    35363547#: includes/class-simpfa-wc-settings-tab.php:5106
    … …  
    35753586#: includes/class-simpfa-wc-settings-tab.php:5109
    35763587msgid ""
    3577 "Yes. An active membership is required before invoice and credit note actions "
    3578 "become available."
     3588"Yes. An active membership is required before invoice and credit note actions"
     3589" become available."
    35793590msgstr ""
    35803591"نعم. يلزم وجود عضوية نشطة قبل إتاحة إجراءات الفواتير والإشعارات الدائنة."
    … …  
    37103721#: includes/class-simpfa-wc-settings-tab.php:6154
    37113722msgid ""
    3712 "You do not have permission for this section. Ask a business member with user "
    3713 "management access to update your permissions."
     3723"You do not have permission for this section. Ask a business member with user"
     3724" management access to update your permissions."
    37143725msgstr ""
    37153726"ليس لديك صلاحية الوصول إلى هذا القسم. اطلب من أحد أعضاء المنشأة المخولين "
    … …  
    39223933"with their original business."
    39233934msgstr ""
    3924 "تُنشأ الطلبات الجديدة باسم المنشأة المرتبطة. وتبقى الفواتير والمبالغ المستردة "
    3925 "السابقة مرتبطة بمنشآتها الأصلية."
     3935"تُنشأ الطلبات الجديدة باسم المنشأة المرتبطة. وتبقى الفواتير والمبالغ "
     3936"المستردة السابقة مرتبطة بمنشآتها الأصلية."
    39263937
    39273938#: simple-fatoora.php:1425
    … …  
    39323943msgid "Settings"
    39333944msgstr "الإعدادات"
     3945
     3946#: includes/class-simpfa-wc-settings-tab.php
     3947msgid "Please sign in again to access Profile Settings."
     3948msgstr "يرجى تسجيل الدخول مجدداً للوصول إلى إعدادات الملف الشخصي."
     3949
     3950#: includes/class-simpfa-wc-settings-tab.php
     3951msgid "Unable to load your profile. Please try again."
     3952msgstr "تعذّر تحميل ملفك الشخصي. يرجى المحاولة مجدداً."
     3953
     3954#: includes/class-simpfa-wc-settings-tab.php
     3955msgid "Try again"
     3956msgstr "المحاولة مجدداً"
     3957
     3958#: includes/class-simpfa-wc-settings-tab.php
     3959msgid "Unable to sign in. Please try again."
     3960msgstr "تعذّر تسجيل الدخول. يرجى المحاولة مجدداً."
     3961
     3962#: includes/class-simpfa-wc-settings-tab.php
     3963msgid "Confirming your payment"
     3964msgstr "جارٍ تأكيد الدفع"
     3965
     3966#: includes/class-simpfa-wc-settings-tab.php
     3967msgid "Payment confirmed"
     3968msgstr "تم تأكيد الدفع"
     3969
     3970#: includes/class-simpfa-wc-settings-tab.php
     3971msgid "Payment failed"
     3972msgstr "فشلت عملية الدفع"
     3973
     3974#: includes/class-simpfa-wc-settings-tab.php
     3975msgid "Back to subscription"
     3976msgstr "العودة إلى الاشتراك"
     3977
     3978#: includes/class-simpfa-wc-settings-tab.php
     3979msgid "Please sign in to view your subscription."
     3980msgstr "يرجى تسجيل الدخول لعرض اشتراكك."
  • simple-fatoora/trunk/languages/simple-fatoora.pot

    r3762341 r3762600  
    77msgid ""
    88msgstr ""
    9 "Project-Id-Version: Simple Fatoora 4.23\n"
     9"Project-Id-Version: Simple Fatoora 4.24\n"
    1010"Report-Msgid-Bugs-To: \n"
    1111"POT-Creation-Date: 2026-10-23 22:17+0300\n"
    … …  
    197197msgstr ""
    198198
    199 #: includes/class-simpfa-checkout.php:43 includes/class-simpfa-checkout.php:159
     199#: includes/class-simpfa-checkout.php:43
     200#: includes/class-simpfa-checkout.php:159
    200201msgid "Company name"
    201202msgstr ""
    … …  
    205206msgstr ""
    206207
    207 #: includes/class-simpfa-checkout.php:56 includes/class-simpfa-checkout.php:160
     208#: includes/class-simpfa-checkout.php:56
     209#: includes/class-simpfa-checkout.php:160
    208210msgid "Company VAT number"
    209211msgstr ""
    … …  
    220222msgstr ""
    221223
    222 #: includes/class-simpfa-checkout.php:85 includes/class-simpfa-checkout.php:234
     224#: includes/class-simpfa-checkout.php:85
     225#: includes/class-simpfa-checkout.php:234
    223226msgid "Please enter the company name for VAT invoice."
    224227msgstr ""
    … …  
    260263msgstr ""
    261264
    262 #: includes/class-simpfa-handler.php:130 includes/class-simpfa-order-ui.php:633
     265#: includes/class-simpfa-handler.php:130
     266#: includes/class-simpfa-order-ui.php:633
    263267#: includes/class-simpfa-wc-settings-tab.php:345
    264268#: includes/class-simpfa-wc-settings-tab.php:481
    … …  
    11071111#: includes/class-simpfa-wc-settings-tab.php:341
    11081112msgid ""
    1109 "Payment page opened in a new tab. Complete payment there; status will update "
    1110 "here."
     1113"Payment page opened in a new tab. Complete payment there; status will update"
     1114" here."
    11111115msgstr ""
    11121116
    … …  
    11211125#: includes/class-simpfa-wc-settings-tab.php:344
    11221126msgid ""
    1123 "Payment is still pending. You can refresh the status or return to the plugin "
    1124 "home page."
     1127"Payment is still pending. You can refresh the status or return to the plugin"
     1128" home page."
    11251129msgstr ""
    11261130
    … …  
    14451449#: includes/class-simpfa-wc-settings-tab.php:1233
    14461450msgid ""
    1447 "Continue your guided invoice setup and preview each change before you finish."
     1451"Continue your guided invoice setup and preview each change before you "
     1452"finish."
    14481453msgstr ""
    14491454
    … …  
    16381643#: includes/class-simpfa-wc-settings-tab.php:1267
    16391644msgid ""
    1640 "Write something eg. “Thank you for visiting us! We look forward to welcoming "
    1641 "you again soon.”"
     1645"Write something eg. “Thank you for visiting us! We look forward to welcoming"
     1646" you again soon.”"
    16421647msgstr ""
    16431648
    … …  
    16951700#: includes/class-simpfa-wc-settings-tab.php:1332
    16961701msgid ""
    1697 "Review your current plan, compare memberships, and complete embedded payment "
    1698 "here."
     1702"Review your current plan, compare memberships, and complete embedded payment"
     1703" here."
    16991704msgstr ""
    17001705
    … …  
    17061711msgid ""
    17071712"Create invoices, notes, purchase documents, and quotations directly from "
    1708 "WordPress. Quotations remain outside ZATCA and invoice usage until converted "
    1709 "to an invoice."
     1713"WordPress. Quotations remain outside ZATCA and invoice usage until converted"
     1714" to an invoice."
    17101715msgstr ""
    17111716
    … …  
    17621767#: includes/class-simpfa-wc-settings-tab.php:1453
    17631768msgid ""
    1764 "A valid VAT number makes this a standard document for VAT-registered issuers."
     1769"A valid VAT number makes this a standard document for VAT-registered "
     1770"issuers."
    17651771msgstr ""
    17661772
    … …  
    25312537#: includes/class-simpfa-wc-settings-tab.php:2946
    25322538msgid ""
    2533 "Use ZATCA's Fatoora Simulation for test WooCommerce orders, refunds, invoice "
    2534 "settings, profile, and Phase 2 onboarding."
     2539"Use ZATCA's Fatoora Simulation for test WooCommerce orders, refunds, invoice"
     2540" settings, profile, and Phase 2 onboarding."
    25352541msgstr ""
    25362542
    … …  
    26632669
    26642670#: includes/class-simpfa-wc-settings-tab.php:3156
    2665 msgid "Please reconnect your Simple Fatoora account to review payment details."
     2671msgid ""
     2672"Please reconnect your Simple Fatoora account to review payment details."
    26662673msgstr ""
    26672674
    … …  
    32603267
    32613268#: includes/class-simpfa-wc-settings-tab.php:4944
    3262 msgid "Choose when and for which customers WooCommerce orders create invoices."
     3269msgid ""
     3270"Choose when and for which customers WooCommerce orders create invoices."
    32633271msgstr ""
    32643272
    … …  
    34963504#: includes/class-simpfa-wc-settings-tab.php:5109
    34973505msgid ""
    3498 "Yes. An active membership is required before invoice and credit note actions "
    3499 "become available."
     3506"Yes. An active membership is required before invoice and credit note actions"
     3507" become available."
    35003508msgstr ""
    35013509
    … …  
    36243632#: includes/class-simpfa-wc-settings-tab.php:6154
    36253633msgid ""
    3626 "You do not have permission for this section. Ask a business member with user "
    3627 "management access to update your permissions."
     3634"You do not have permission for this section. Ask a business member with user"
     3635" management access to update your permissions."
    36283636msgstr ""
    36293637
    … …  
    38403848msgid "Settings"
    38413849msgstr ""
     3850
     3851#: includes/class-simpfa-wc-settings-tab.php
     3852msgid "Please sign in again to access Profile Settings."
     3853msgstr ""
     3854
     3855#: includes/class-simpfa-wc-settings-tab.php
     3856msgid "Unable to load your profile. Please try again."
     3857msgstr ""
     3858
     3859#: includes/class-simpfa-wc-settings-tab.php
     3860msgid "Try again"
     3861msgstr ""
     3862
     3863#: includes/class-simpfa-wc-settings-tab.php
     3864msgid "Unable to sign in. Please try again."
     3865msgstr ""
     3866
     3867#: includes/class-simpfa-wc-settings-tab.php
     3868msgid "Confirming your payment"
     3869msgstr ""
     3870
     3871#: includes/class-simpfa-wc-settings-tab.php
     3872msgid "Payment confirmed"
     3873msgstr ""
     3874
     3875#: includes/class-simpfa-wc-settings-tab.php
     3876msgid "Payment failed"
     3877msgstr ""
     3878
     3879#: includes/class-simpfa-wc-settings-tab.php
     3880msgid "Back to subscription"
     3881msgstr ""
     3882
     3883#: includes/class-simpfa-wc-settings-tab.php
     3884msgid "Please sign in to view your subscription."
     3885msgstr ""
  • simple-fatoora/trunk/readme.txt

    r3762341 r3762600  
    44Tested up to: 6.9.4
    55Requires PHP: 7.4
    6 Stable tag: 4.23
     6Stable tag: 4.24
    77License: GPLv2 or later
    88License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    101101== Changelog ==
    102102
     103= 4.24 =
     104* User Experience Improvements
     105
    103106= 4.23 =
    104107* Performance Improvements
  • simple-fatoora/trunk/simple-fatoora.php

    r3762341 r3762600  
    55 * Plugin URI: https://simplefatoora.com/
    66 * Description: Adds ZATCA Phase 2 e-invoicing with QR codes to WooCommerce for B2C and B2B VAT invoices.
    7  * Version: 4.23
     7 * Version: 4.24
    88 * Author: Future Base
    99 * Author URI: https://futurebase.sa/
    … …  
    2626// -----------------------------------------------------------------------------
    2727if (!defined('SIMPFA_VERSION')) {
    28   define('SIMPFA_VERSION', '4.23');
     28  define('SIMPFA_VERSION', '4.24');
    2929}
    3030require_once __DIR__ . '/includes/class-simpfa-order-boundary.php';
Note: See TracChangeset for help on using the changeset viewer.