From 876003d0b673c88eb356715c3160c09f5b17b5e0 Mon Sep 17 00:00:00 2001 From: MrRezai Date: Tue, 5 Aug 2025 17:24:52 +0330 Subject: [PATCH] Rebirth --- README.md | 102 + README.txt | 35 - admin/class-hesabix-admin.php | 2076 ++ admin/class-ssbhesabix-admin.php | 1658 -- admin/css/fontiran.css | 105 - admin/css/ssbhesabfa-admin.css | 67 - admin/index.php | 1 - admin/js/ssbhesabix-admin.js | 867 - admin/partials/hesabix-admin-display.php | 297 + admin/partials/hesabix-admin-functions.php | 4649 ++++ admin/partials/hesabix-admin-setting.php | 2645 ++ ...tml-output.php => hesabix-html-output.php} | 913 +- admin/partials/ssbhesabix-admin-display.php | 397 - admin/partials/ssbhesabix-admin-functions.php | 4272 --- admin/partials/ssbhesabix-admin-setting.php | 2339 -- admin/services/HesabixLogService.php | 22 +- admin/services/HesabixWpFaService.php | 344 +- admin/services/hesabixCustomerService.php | 235 + admin/services/hesabixItemService.php | 140 + admin/services/ssbhesabixCustomerService.php | 276 - admin/services/ssbhesabixItemService.php | 119 - {admin => assets}/css/bootstrap.css | 21560 ++++++++-------- assets/css/hesabix-admin.css | 2816 ++ .../fonts/eot/IRANYekanWebBlack.eot | Bin .../fonts/eot/IRANYekanWebBold.eot | Bin .../fonts/eot/IRANYekanWebExtraBlack.eot | Bin .../fonts/eot/IRANYekanWebExtraBold.eot | Bin .../fonts/eot/IRANYekanWebLight.eot | Bin .../fonts/eot/IRANYekanWebMedium.eot | Bin .../fonts/eot/IRANYekanWebRegular.eot | Bin .../fonts/eot/IRANYekanWebThin.eot | Bin .../fonts/svg/IRANYekanWebRegular.svg | 3096 +-- .../fonts/svg/iranyekanwebblack.svg | 2948 +-- .../fonts/svg/iranyekanwebbold.svg | 3138 +-- .../fonts/svg/iranyekanwebextrablack.svg | 2972 +-- .../fonts/svg/iranyekanwebextrabold.svg | 2944 +-- .../fonts/svg/iranyekanweblight.svg | 3238 +-- .../fonts/svg/iranyekanwebmedium.svg | 3146 +-- .../fonts/svg/iranyekanwebthin.svg | 3278 +-- .../fonts/ttf/IRANYekanWebBlack.ttf | Bin .../fonts/ttf/IRANYekanWebBold.ttf | Bin .../fonts/ttf/IRANYekanWebExtraBlack.ttf | Bin .../fonts/ttf/IRANYekanWebExtraBold.ttf | Bin .../fonts/ttf/IRANYekanWebLight.ttf | Bin .../fonts/ttf/IRANYekanWebMedium.ttf | Bin .../fonts/ttf/IRANYekanWebRegular.ttf | Bin .../fonts/ttf/IRANYekanWebThin.ttf | Bin .../fonts/woff/IRANYekanWebBlack.woff | Bin .../fonts/woff/IRANYekanWebBold.woff | Bin .../fonts/woff/IRANYekanWebExtraBlack.woff | Bin .../fonts/woff/IRANYekanWebExtraBold.woff | Bin .../fonts/woff/IRANYekanWebLight.woff | Bin .../fonts/woff/IRANYekanWebMedium.woff | Bin .../fonts/woff/IRANYekanWebRegular.woff | Bin .../fonts/woff/IRANYekanWebThin.woff | Bin .../fonts/woff2/IRANYekanWebBlack.woff2 | Bin .../fonts/woff2/IRANYekanWebBold.woff2 | Bin .../fonts/woff2/IRANYekanWebExtraBlack.woff2 | Bin .../fonts/woff2/IRANYekanWebExtraBold.woff2 | Bin .../fonts/woff2/IRANYekanWebLight.woff2 | Bin .../fonts/woff2/IRANYekanWebMedium.woff2 | Bin .../fonts/woff2/IRANYekanWebRegular.woff2 | Bin .../fonts/woff2/IRANYekanWebThin.woff2 | Bin assets/img/heart.gif | Bin 0 -> 476496 bytes {admin => assets}/img/hesabix-logo.fa.png | Bin assets/img/hesabix-logo.png | Bin 0 -> 6393 bytes {admin => assets}/img/icons/box-open.svg | 0 {admin => assets}/img/icons/cog.svg | 0 {admin => assets}/img/icons/file-alt.svg | 0 {admin => assets}/img/icons/file-export.svg | 0 .../img/icons/file-invoice-dollar.svg | 0 {admin => assets}/img/icons/home.svg | 0 .../img/icons/money-check-alt.svg | 0 {admin => assets}/img/icons/sync-alt.svg | 0 {admin => assets}/img/icons/users.svg | 0 {admin => assets}/img/logo.png | Bin {admin => assets}/img/menu-icon.png | Bin {admin => assets}/js/bootstrap.bundle.min.js | 12 +- assets/js/hesabix-admin.js | 1875 ++ assets/js/hesabix.js | 1875 ++ hesabix.php | 74 + includes/class-hesabix-activator.php | 56 + ...bhesabix-api.php => class-hesabix-api.php} | 1080 +- includes/class-hesabix-deactivator.php | 16 + includes/class-hesabix-i18n.php | 23 + includes/class-hesabix-loader.php | 64 + includes/class-hesabix-validation.php | 406 + ...-webhook.php => class-hesabix-webhook.php} | 710 +- includes/class-hesabix.php | 159 + includes/class-ssbhesabix-activator.php | 69 - includes/class-ssbhesabix-deactivator.php | 28 - includes/class-ssbhesabix-i18n.php | 34 - includes/class-ssbhesabix-loader.php | 123 - includes/class-ssbhesabix-validation.php | 318 - includes/class-ssbhesabix.php | 343 - includes/hesabix-webhook.php | 33 + includes/index.php | 1 - includes/ssbhesabix-webhook.php | 31 - index.php | 1 - languages/hesabix-fa_IR.mo | Bin 0 -> 60659 bytes languages/hesabix-fa_IR.po | 1785 ++ languages/hesabix.pot | 1605 ++ languages/ssbhesabix-fa_IR.mo | Bin 31296 -> 0 bytes languages/ssbhesabix-fa_IR.po | 1002 - ssbhesabix.php | 72 - uninstall.php | 47 +- 106 files changed, 45778 insertions(+), 36759 deletions(-) create mode 100644 README.md delete mode 100644 README.txt create mode 100644 admin/class-hesabix-admin.php delete mode 100644 admin/class-ssbhesabix-admin.php delete mode 100644 admin/css/fontiran.css delete mode 100644 admin/css/ssbhesabfa-admin.css delete mode 100644 admin/index.php delete mode 100644 admin/js/ssbhesabix-admin.js create mode 100644 admin/partials/hesabix-admin-display.php create mode 100644 admin/partials/hesabix-admin-functions.php create mode 100644 admin/partials/hesabix-admin-setting.php rename admin/partials/{ssbhesabix-html-output.php => hesabix-html-output.php} (55%) delete mode 100644 admin/partials/ssbhesabix-admin-display.php delete mode 100644 admin/partials/ssbhesabix-admin-functions.php delete mode 100644 admin/partials/ssbhesabix-admin-setting.php create mode 100644 admin/services/hesabixCustomerService.php create mode 100644 admin/services/hesabixItemService.php delete mode 100644 admin/services/ssbhesabixCustomerService.php delete mode 100644 admin/services/ssbhesabixItemService.php rename {admin => assets}/css/bootstrap.css (93%) create mode 100644 assets/css/hesabix-admin.css rename {admin => assets}/fonts/eot/IRANYekanWebBlack.eot (100%) rename {admin => assets}/fonts/eot/IRANYekanWebBold.eot (100%) rename {admin => assets}/fonts/eot/IRANYekanWebExtraBlack.eot (100%) rename {admin => assets}/fonts/eot/IRANYekanWebExtraBold.eot (100%) rename {admin => assets}/fonts/eot/IRANYekanWebLight.eot (100%) rename {admin => assets}/fonts/eot/IRANYekanWebMedium.eot (100%) rename {admin => assets}/fonts/eot/IRANYekanWebRegular.eot (100%) rename {admin => assets}/fonts/eot/IRANYekanWebThin.eot (100%) rename {admin => assets}/fonts/svg/IRANYekanWebRegular.svg (99%) rename {admin => assets}/fonts/svg/iranyekanwebblack.svg (99%) rename {admin => assets}/fonts/svg/iranyekanwebbold.svg (99%) rename {admin => assets}/fonts/svg/iranyekanwebextrablack.svg (99%) rename {admin => assets}/fonts/svg/iranyekanwebextrabold.svg (99%) rename {admin => assets}/fonts/svg/iranyekanweblight.svg (99%) rename {admin => assets}/fonts/svg/iranyekanwebmedium.svg (99%) rename {admin => assets}/fonts/svg/iranyekanwebthin.svg (99%) rename {admin => assets}/fonts/ttf/IRANYekanWebBlack.ttf (100%) rename {admin => assets}/fonts/ttf/IRANYekanWebBold.ttf (100%) rename {admin => assets}/fonts/ttf/IRANYekanWebExtraBlack.ttf (100%) rename {admin => assets}/fonts/ttf/IRANYekanWebExtraBold.ttf (100%) rename {admin => assets}/fonts/ttf/IRANYekanWebLight.ttf (100%) rename {admin => assets}/fonts/ttf/IRANYekanWebMedium.ttf (100%) rename {admin => assets}/fonts/ttf/IRANYekanWebRegular.ttf (100%) rename {admin => assets}/fonts/ttf/IRANYekanWebThin.ttf (100%) rename {admin => assets}/fonts/woff/IRANYekanWebBlack.woff (100%) rename {admin => assets}/fonts/woff/IRANYekanWebBold.woff (100%) rename {admin => assets}/fonts/woff/IRANYekanWebExtraBlack.woff (100%) rename {admin => assets}/fonts/woff/IRANYekanWebExtraBold.woff (100%) rename {admin => assets}/fonts/woff/IRANYekanWebLight.woff (100%) rename {admin => assets}/fonts/woff/IRANYekanWebMedium.woff (100%) rename {admin => assets}/fonts/woff/IRANYekanWebRegular.woff (100%) rename {admin => assets}/fonts/woff/IRANYekanWebThin.woff (100%) rename {admin => assets}/fonts/woff2/IRANYekanWebBlack.woff2 (100%) rename {admin => assets}/fonts/woff2/IRANYekanWebBold.woff2 (100%) rename {admin => assets}/fonts/woff2/IRANYekanWebExtraBlack.woff2 (100%) rename {admin => assets}/fonts/woff2/IRANYekanWebExtraBold.woff2 (100%) rename {admin => assets}/fonts/woff2/IRANYekanWebLight.woff2 (100%) rename {admin => assets}/fonts/woff2/IRANYekanWebMedium.woff2 (100%) rename {admin => assets}/fonts/woff2/IRANYekanWebRegular.woff2 (100%) rename {admin => assets}/fonts/woff2/IRANYekanWebThin.woff2 (100%) create mode 100644 assets/img/heart.gif rename {admin => assets}/img/hesabix-logo.fa.png (100%) create mode 100644 assets/img/hesabix-logo.png rename {admin => assets}/img/icons/box-open.svg (100%) rename {admin => assets}/img/icons/cog.svg (100%) rename {admin => assets}/img/icons/file-alt.svg (100%) rename {admin => assets}/img/icons/file-export.svg (100%) rename {admin => assets}/img/icons/file-invoice-dollar.svg (100%) rename {admin => assets}/img/icons/home.svg (100%) rename {admin => assets}/img/icons/money-check-alt.svg (100%) rename {admin => assets}/img/icons/sync-alt.svg (100%) rename {admin => assets}/img/icons/users.svg (100%) rename {admin => assets}/img/logo.png (100%) rename {admin => assets}/img/menu-icon.png (100%) rename {admin => assets}/js/bootstrap.bundle.min.js (99%) create mode 100644 assets/js/hesabix-admin.js create mode 100644 assets/js/hesabix.js create mode 100644 hesabix.php create mode 100644 includes/class-hesabix-activator.php rename includes/{class-ssbhesabix-api.php => class-hesabix-api.php} (63%) create mode 100644 includes/class-hesabix-deactivator.php create mode 100644 includes/class-hesabix-i18n.php create mode 100644 includes/class-hesabix-loader.php create mode 100644 includes/class-hesabix-validation.php rename includes/{class-ssbhesabix-webhook.php => class-hesabix-webhook.php} (62%) create mode 100644 includes/class-hesabix.php delete mode 100644 includes/class-ssbhesabix-activator.php delete mode 100644 includes/class-ssbhesabix-deactivator.php delete mode 100644 includes/class-ssbhesabix-i18n.php delete mode 100644 includes/class-ssbhesabix-loader.php delete mode 100644 includes/class-ssbhesabix-validation.php delete mode 100644 includes/class-ssbhesabix.php create mode 100644 includes/hesabix-webhook.php delete mode 100644 includes/index.php delete mode 100644 includes/ssbhesabix-webhook.php delete mode 100644 index.php create mode 100644 languages/hesabix-fa_IR.mo create mode 100644 languages/hesabix-fa_IR.po create mode 100644 languages/hesabix.pot delete mode 100644 languages/ssbhesabix-fa_IR.mo delete mode 100644 languages/ssbhesabix-fa_IR.po delete mode 100644 ssbhesabix.php diff --git a/README.md b/README.md new file mode 100644 index 0000000..c7b39ae --- /dev/null +++ b/README.md @@ -0,0 +1,102 @@ +=== Hesabix for WooCommerce === +Contributors: Mohammad Rezai +Tags: accounting, hesabix, woocommerce, jalali, invoice, integration, persian +Requires at least: 5.2 +Tested up to: 6.6.1 +Requires PHP: 7.4 +Stable tag: 1.0.0 +License: GPLv3 or later +License URI: https://www.gnu.org/licenses/gpl-3.0.html + +Modern, localized, and secure WooCommerce integration with Hesabix Cloud Accounting. Featuring full Jalali calendar support, real-time data sync, and advanced customization for Persian e-commerce. + +== 🧩 Overview == + +**Hesabix for WooCommerce** connects your online store with [Hesabix](https://hesabix.com), the powerful cloud-based accounting system built for Persian businesses. + +From real-time product, order, and customer sync to full Persian date support, this plugin is everything a modern Iranian online store needs to automate its bookkeeping. + +== ✨ Features == + +### 🔗 Seamless Integration +- Automatically syncs products, orders, and customers with your Hesabix account +- One-click synchronization for bulk data +- AJAX-powered UI for responsive operations + +### 📅 Persian Calendar Support +- Native Jalali calendar UI +- Gregorian ↔ Jalali date conversion +- Custom date filters and ranges + +### 💼 Smart Customer Handling +- Auto-create customers in Hesabix from WooCommerce orders +- National ID, economic code, and business info fields +- Custom checkout fields with flexible validation + +### 🧾 Invoice & Finance Management +- Instant invoice generation on new orders +- Freight and shipping cost handling +- Payment method mapping + +### ⚙️ Developer Tools +- Clean, modular code with hooks and filters +- Extendable data mappers for products and customers +- Debug logs and status monitoring + +### 🌐 Localization & UI +- Fully RTL and Persian language ready +- Modern, tabbed admin interface +- Responsive and mobile-friendly + +== 🛠️ Installation & Setup == + +1. Upload the plugin to `/wp-content/plugins/hesabix-woocommerce/` +2. Activate via **Plugins > Hesabix for WooCommerce** +3. Go to **WooCommerce > Hesabix Settings** +4. Enter your API Key (get it from your [Hesabix account](https://app.hesabix.com)) +5. Test connection and start syncing! + +== ❓ Frequently Asked Questions == + +**How do I get an API key?** +Log in to your Hesabix account and navigate to *Settings > API*. Copy the key and paste it into the plugin settings. + +**Is it compatible with Persian WooCommerce stores?** +Yes — fully RTL compatible, Persian translations included, and Jalali calendar support is native. + +**Can I control what data gets synced?** +Absolutely — toggle options for each data type and use filters to customize. + +**Does it work with subscription products?** +Currently designed for standard WooCommerce orders. + +**Is my data safe?** +Yes — we follow WordPress best practices including nonce verification, secure API connections, and local data handling. + +== 🖼️ Screenshots == + +1. Plugin Dashboard with sync status +2. Customer field customization +3. Jalali date picker for filtering +4. Invoice configuration +5. Product linking interface + +== 🌐 Resources == + +- [Official Website](https://hesabix.com) +- [User Guide](https://hesabix.com/school) +- [Support](https://hesabix.com/support) + +== 👨‍💻 Credits == + +**Developer**: Mohammad Rezai +**Website**: [pirouz.xyz](https://pirouz.xyz) + +== 🔐 License == + +This plugin is licensed under the GPLv3. You are free to modify, distribute, and use it under the terms of the license. + +== 🛡️ Privacy == + +No personal data is collected by this plugin. All communications are strictly between your WordPress site and Hesabix servers. + diff --git a/README.txt b/README.txt deleted file mode 100644 index 920f16c..0000000 --- a/README.txt +++ /dev/null @@ -1,35 +0,0 @@ -=== Hesabix Accounting === -Contributors: saeedsb, hamidprime, sepehr-najafi, Babak alizadeh -Tags: accounting cloud Hesabix -Requires at least: 5.2 -Tested up to: 6.6.1 -Requires PHP: 5.6 -Stable tag: 2.1.1 -License: GPLv2 or later -License URI: https://www.gnu.org/licenses/gpl-2.0.html - -Connect Hesabix Online Accounting to WooCommerce. - -== Description == -This plugin helps connect your (online) store to Hesabix online accounting software. By using this plugin, saving products, contacts, and orders in your store will also save them automatically in your Hesabix account. Besides that, just after a client pays a bill, the receipt document will be stored in Hesabix as well. Of course, you have to register your account in Hesabix first. To do so, visit Hesabix at the link here hesabix.com and sign up for free. After you signed up and entered your account, choose your business, then in the settings menu/API, you can find the API keys for the business and import them to the plugin settings. Now your module is ready to use. - -For more information and a full guide to how to use Hesabix and WooCommerce Plugin, visit Hesabix’s website and go to the “Accounting School” menu. - -== Installation == -1. Upload the plugin files to the `/wp-content/plugins/hesabixWCplugin` directory, or install the Hesabix plugin through the WordPress plugins screen directly. -2. Activate the plugin through the \'Plugins\' screen in WordPress -3. Use the Settings->Hesabix screen to configure the plugin - -== Screenshots == -1. API setting page -2. Catalog setting page -3. Customers setting page -4. Invoice setting page -5. Payment Methods setting page -6. Import and export setting page -7. Sync setting page -8. Log file - -== Changelog == -= 1.0.0 - 07.03.2024 = -* Initial stable release. \ No newline at end of file diff --git a/admin/class-hesabix-admin.php b/admin/class-hesabix-admin.php new file mode 100644 index 0000000..a170ab5 --- /dev/null +++ b/admin/class-hesabix-admin.php @@ -0,0 +1,2076 @@ +plugin_name = $plugin_name; + $this->version = $version; + $this->load_dependencies(); + add_action('wp_ajax_hesabix_get_sync_stats_ajax', array($this, 'hesabix_get_sync_stats_ajax')); + add_action('wp_ajax_hesabix_load_tab_content', array($this, 'hesabix_load_tab_content')); + add_action('wp_ajax_hesabix_save_customers_fields_ajax', array($this, 'hesabix_save_customers_fields_ajax')); + } + + public function hesabix_update_db_check() + { + $current_db_ver = get_site_option('hesabix_db_version'); + if ($current_db_ver === false || $current_db_ver < 1.1) { + global $wpdb; + $table_name = $wpdb->prefix . "hesabix"; + + $sql = "ALTER TABLE $table_name + ADD `id_ps_attribute` INT(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `id_ps`;"; + + if (!$wpdb->query($sql)) { + HesabixLogService::log(array("Cannot alter table $table_name. Current DB Version: $current_db_ver")); + } else { + update_option('hesabix_db_version', 1.1); + HesabixLogService::log(array("Alter table $table_name. Current DB Version: $current_db_ver")); + } + } + } + + public function enqueue_styles() + { + + if (isset($_GET['page']) && str_contains($_GET['page'], "hesabix")) { + ?> + + plugin_name, plugin_dir_url(__FILE__) . '../assets/css/hesabix-admin.css', array(), $this->version, 'all'); + wp_enqueue_style('bootstrap_css', plugin_dir_url(__FILE__) . '../assets/css/bootstrap.css', array(), $this->version, 'all'); + } + } + + public function enqueue_scripts() + { + + wp_enqueue_script($this->plugin_name, plugin_dir_url(__FILE__) . '../assets/js/hesabix.js', array('jquery'), $this->version, false); + + wp_localize_script($this->plugin_name, 'hesabix_ajax', array( + 'ajaxurl' => admin_url('admin-ajax.php'), + 'nonce' => wp_create_nonce('hesabix_ajax_nonce') + )); + + if (isset($_GET['page']) && str_contains($_GET['page'], "hesabix")) { + wp_enqueue_script('bootstrap_js', plugin_dir_url(__FILE__) . '../assets/js/bootstrap.bundle.min.js', array('jquery'), $this->version, false); + + } + } + + private function load_dependencies() + { + require_once plugin_dir_path(dirname(__FILE__)) . '/admin/partials/hesabix-admin-display.php'; + + require_once plugin_dir_path(dirname(__FILE__)) . '/admin/partials/hesabix-html-output.php'; + + require_once plugin_dir_path(dirname(__FILE__)) . '/admin/partials/hesabix-admin-setting.php'; + + require_once plugin_dir_path(dirname(__FILE__)) . '/admin/partials/hesabix-admin-functions.php'; + } + + public function hesabix_missing_notice() + { + echo '

' . sprintf(__('Hesabix Plugin requires the %s to work!', 'hesabix'), '' . __('WooCommerce', 'hesabix') . '') . '

'; + } + + public function hesabix_live_mode_notice() + { + echo '

' . __('Hesabix Plugin need to connect to Hesabix Accounting, Please check the API credential!', 'hesabix') . '

'; + } + + public function hesabix_business_expired_notice() + { + echo '

' . __('Cannot connect to Hesabix. Business expired.', 'hesabix') . '

'; + } + + public function hesabix_currency_notice() + { + echo '

' . __('Hesabix Plugin cannot works! because WooCommerce currency in not match with Hesabix.', 'hesabix') . '

'; + } + + public function hesabix_general_notices() + { + if (!empty($_REQUEST['submit_selected_orders_invoice_in_hesabix'])) { + if (!empty($_REQUEST['error_msg']) && $_REQUEST['error_msg'] == "select_max_10_items") { + printf( + '

%s

', + __('Error: Select maximum 10 orders. Due to some limitations in Hesabix API, sending too many requests in one minute is not possible.', 'hesabix') + ); + } else { + $success_count = intval($_REQUEST['success_count']); + printf('

%s %d

', __('Selected orders invoices have been saved. Number of saved invoices: ', 'hesabix'), $success_count); + } + } + } + + public function adminExportProductsCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + $batch = wc_clean($_POST['batch']); + $totalBatch = wc_clean($_POST['totalBatch']); + $total = wc_clean($_POST['total']); + $updateCount = wc_clean($_POST['updateCount']); + + $func = new Hesabix_Admin_Functions(); + $result = $func->exportProducts($batch, $totalBatch, $total, $updateCount); + + if ($result['error']) { + if ($updateCount === -1) { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productExportResult=false&error=-1'); + } else { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productExportResult=false'); + } + } else { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productExportResult=true&processed=' . $result['updateCount']); + } + + echo json_encode($result); + die(); + } + } + + public function adminImportProductsCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + $batch = wc_clean($_POST['batch']); + $totalBatch = wc_clean($_POST['totalBatch']); + $total = wc_clean($_POST['total']); + $updateCount = wc_clean($_POST['updateCount']); + + $func = new Hesabix_Admin_Functions(); + $result = $func->importProducts($batch, $totalBatch, $total, $updateCount); + $import_count = $result['updateCount']; + + if ($result['error']) { + if ($import_count === -1) { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productImportResult=false&error=-1'); + } else { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productImportResult=false'); + } + } else { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productImportResult=true&processed=' . $import_count); + } + + echo json_encode($result); + die(); + } + } + + public function adminExportProductsOpeningQuantityCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + $batch = wc_clean($_POST['batch']); + $totalBatch = wc_clean($_POST['totalBatch']); + $total = wc_clean($_POST['total']); + + $func = new Hesabix_Admin_Functions(); + $result = $func->exportOpeningQuantity($batch, $totalBatch, $total); + if ($result['error']) { + if ($result['errorType'] == 'shareholderError') { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productOpeningQuantityExportResult=false&shareholderError=true'); + } else if ($result['errorType'] == 'noProduct') { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productOpeningQuantityExportResult=false&noProduct=true'); + } else { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productOpeningQuantityExportResult=false'); + } + } else { + if ($result["done"] == true) + update_option('hesabix_use_export_product_opening_quantity', true); + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&productOpeningQuantityExportResult=true'); + } + + echo json_encode($result); + die(); + } + } + + public function adminExportCustomersCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + $batch = wc_clean($_POST['batch']); + $totalBatch = wc_clean($_POST['totalBatch']); + $total = wc_clean($_POST['total']); + $updateCount = wc_clean($_POST['updateCount']); + + $func = new Hesabix_Admin_Functions(); + $result = $func->exportCustomers($batch, $totalBatch, $total, $updateCount); + + if ($result["error"]) { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&customerExportResult=false'); + } else { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=export&customerExportResult=true&processed=' . $result["updateCount"]); + } + echo json_encode($result); + + die(); + } + } + + public function adminSyncChangesCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + include(dirname(__FILE__) . '/../includes/class-hesabix-webhook.php'); + new Hesabix_Webhook(); + wp_send_json(array( + 'success' => true, + 'message' => __('changes synced successfully', 'hesabix') + )); + } + } + + public function admin_sync_products_callback() + { + if (!wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error('Security check failed'); + } + + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + $batch = wc_clean($_POST['batch']); + $totalBatch = wc_clean($_POST['totalBatch']); + $total = wc_clean($_POST['total']); + $func = new Hesabix_Admin_Functions(); + $result = $func->syncProducts($batch, $totalBatch, $total); + if ($result['error']) { + wp_send_json(array( + 'success' => false, + 'message' => __('Error syncing prices and inventory. Please check the logs.', 'hesabix') + )); + } else { + wp_send_json(array( + 'success' => true, + 'message' => __('Prices and inventory synced successfully', 'hesabix') + )); + } + } + } + + public function admin_sync_orders_callback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + $batch = wc_clean($_POST['batch']); + $totalBatch = wc_clean($_POST['totalBatch']); + $total = wc_clean($_POST['total']); + $updateCount = wc_clean($_POST['updateCount']); + $from_date = wc_clean($_POST['date']); + $end_date = wc_clean($_POST['endDate']); + $func = new Hesabix_Admin_Functions(); + $result = $func->syncOrders($from_date, $end_date, $batch, $totalBatch, $total, $updateCount); + if (!$result['error']) { + wp_send_json(array( + 'success' => true, + 'message' => __('Orders synchronized successfully.', 'hesabix') + )); + } else { + wp_send_json(array( + 'success' => false, + 'message' => $result['error'] + )); + } + } + } + + public function admin_update_products_callback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + $batch = wc_clean($_POST['batch']); + $totalBatch = wc_clean($_POST['totalBatch']); + $total = wc_clean($_POST['total']); + + $func = new Hesabix_Admin_Functions(); + $result = $func->updateProductsInHesabixBasedOnStore($batch, $totalBatch, $total); + + if ($result['error']) { + wp_send_json(array( + 'success' => false, + 'message' => __('Error updating products. Please check the logs.', 'hesabix') + )); + } else { + wp_send_json(array( + 'success' => true, + 'message' => __('Products updated successfully', 'hesabix') + )); + } + } + } + + public function admin_update_wc_products_callback() + { + if (!wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error('Security check failed'); + } + + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + $batch = wc_clean($_POST['batch']); + $totalBatch = wc_clean($_POST['totalBatch']); + $total = wc_clean($_POST['total']); + + $func = new Hesabix_Admin_Functions(); + $result = $func->updateWooCommerceProductsBasedOnHesabix($batch, $totalBatch, $total); + + if ($result['error']) { + wp_send_json(array( + 'success' => false, + 'message' => __('Error updating products. Please check the logs.', 'hesabix') + )); + } else { + wp_send_json(array( + 'success' => true, + 'message' => __('Products updated successfully', 'hesabix') + )); + } + } + } + + public function adminUpdateProductsWithFilterCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + $offset = wc_clean($_POST['offset']); + $rpp = wc_clean($_POST['rpp']); + if (abs($rpp - $offset) <= 200) { + $func = new Hesabix_Admin_Functions(); + $result = $func->updateProductsInHesabixBasedOnStoreWithFilter($offset, $rpp); + + if ($result['error']) { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=sync&$productUpdateWithFilterResult=false'); + } else { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=sync&$productUpdateWithFilterResult=true'); + } + echo json_encode($result); + die(); + } else { + $result["redirectUrl"] = admin_url('admin.php?page=hesabix-option&tab=sync&$productUpdateWithFilterResult=false'); + echo json_encode($result); + die(); + } + } + } + + public function adminSubmitInvoiceCallback() + { + HesabixLogService::writeLogStr('Submit Invoice Manually'); + + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + $orderId = wc_clean($_POST['orderId']); + + $func = new Hesabix_Admin_Functions(); + $result = $func->setOrder($orderId); + if ($result) + $func->setOrderPayment($orderId); + + echo json_encode($result); + die(); + } + } + + public function adminClearPluginDataCallback() + { + + HesabixLogService::writeLogStr('Clear Plugin Data'); + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + $hesabixApi = new Hesabix_Api(); + $result = $hesabixApi->fixClearTags(); + if (!$result->Success) { + + HesabixLogService::log(array("hesabix-Cannot clear tags. Error Message: " . (string) $result->ErrorMessage . ". Error Code: " . (string) $result->ErrorCode)); + } + + global $wpdb; + $options = $wpdb->get_results("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '%hesabix%'"); + foreach ($options as $option) { + delete_option($option->option_name); + } + + $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}hesabix"); + + die(); + } + } + + public function adminInstallPluginDataCallback() + { + + HesabixLogService::writeLogStr('Install Plugin Data'); + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + require_once dirname(__FILE__) . '/includes/class-hesabix-activator.php'; + Hesabix_Activator::activate(); + + die(); + } + } + + public function admin_product_add_column($columns) + { + $hesabixArray = array("hesabix_code" => "کد در حسابیکس"); + $columns = $hesabixArray + $columns; + return $columns; + } + + public function admin_product_export_rows($rows, $products) + { + $rowsArray = explode("\n", $rows); + $exportRows = []; + + $reflection = new ReflectionClass($products); + $property = $reflection->getProperty('row_data'); + $property->setAccessible(true); + $productsArray = $property->getValue($products); + $matchingArray = []; + + if (!empty($productsArray)) { + foreach ($productsArray as $product) { + if (is_array($product) && isset($product['id'])) { + $wpFaService = new HesabixWpFaService(); + + if ($product["type"] == "variation") { + if (array_key_exists('parent_id', $product)) { + $parentId = $product['parent_id']; + $productParentId = explode(':', $parentId)[1]; + $wpFa = $wpFaService->getWpFaSearch($productParentId, $product['id'], '', "product"); + } + } elseif ($product["type"] == "simple" || $product["type"] == "variable") { + $wpFa = $wpFaService->getWpFaSearch($product['id'], 0, '', "product"); + } + + if (is_array($wpFa)) { + foreach ($wpFa as $item) { + if ($item->idWpAttribute != 0) { + $matchingArray[$item->idWpAttribute] = $item->idHesabix; + } else { + $matchingArray[$item->idWp] = $item->idHesabix; + } + } + } + } + } + } + + foreach ($rowsArray as $row) { + if (empty(trim($row))) { + continue; + } + $columns = str_getcsv($row); + $inserted = false; + + if (isset($columns[1])) { + foreach ($matchingArray as $wpId => $hesabixId) { + if ($columns[1] == $wpId && !$inserted) { + $columns[0] = $hesabixId; + $inserted = true; + break; + } + } + } + + if (!$inserted) { + $columns[0] = "کد ندارد"; + } + + $exportRows[] = implode(",", $columns); + } + + return implode("\n", $exportRows); + } + + public function hesabix_init_internal() + { + add_rewrite_rule('hesabix-webhook.php$', 'index.php?hesabix_webhook=1', 'top'); + } + + private function checkForSyncChanges() + { + $syncChangesLastDate = get_option('hesabix_sync_changes_last_date'); + if (!isset($syncChangesLastDate) || $syncChangesLastDate == false) { + add_option('hesabix_sync_changes_last_date', new DateTime()); + $syncChangesLastDate = new DateTime(); + } + + $nowDateTime = new DateTime(); + $diff = $nowDateTime->diff($syncChangesLastDate); + + if ($diff->i >= 4) { + HesabixLogService::writeLogStr('Sync Changes Automatically'); + update_option('hesabix_sync_changes_last_date', new DateTime()); + require_once plugin_dir_path(dirname(__FILE__)) . '/includes/class-hesabix-webhook.php'; + new Hesabix_Webhook(); + } + } + + public function hesabix_query_vars($query_vars) + { + $query_vars[] = 'hesabix_webhook'; + return $query_vars; + } + + public function custom_hesabix_column_order_list($columns) + { + $reordered_columns = array(); + + foreach ($columns as $key => $column) { + $reordered_columns[$key] = $column; + if ($key == 'order_status') { + + $reordered_columns['hesabix-column-invoice-number'] = __('Invoice in Hesabix', 'hesabix'); + $reordered_columns['hesabix-column-submit-invoice'] = __('Submit Invoice', 'hesabix'); + } + } + return $reordered_columns; + } + + public function custom_orders_list_column_content($column, $post_id) + { + + global $wpdb; + + if (get_option('woocommerce_custom_orders_table_enabled') == 'yes') { + switch ($column) { + case 'hesabix-column-invoice-number': + $product_id = $post_id->ID; + + $table_name = $wpdb->prefix . 'hesabix'; + $row = $wpdb->get_row( + $wpdb->prepare( + "SELECT id_hesabix FROM $table_name WHERE id_ps = %d AND obj_type = 'order'", + $product_id + ) + ); + + if (!empty($row)) { + echo '' . $row->id_hesabix . ''; + } else { + echo ''; + } + break; + + case 'hesabix-column-submit-invoice': + + $product_id = $post_id->ID; + echo ''; + echo __('Submit Invoice', 'hesabix'); + echo ''; + break; + } + } else { + switch ($column) { + case 'hesabix-column-invoice-number': + + $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "hesabix` WHERE `id_ps` = $post_id AND `obj_type` = 'order'"); + + + if (!empty($row)) + echo '' . $row->id_hesabix . ''; + else + echo ''; + break; + + case 'hesabix-column-submit-invoice': + echo '"; + echo __('Submit Invoice', 'hesabix'); + echo ''; + break; + } + } + } + + public function hesabix_parse_request(&$wp) + { + if (array_key_exists('hesabix_webhook', $wp->query_vars)) { + include(dirname(__FILE__) . '/includes/hesabix-webhook.php'); + exit(); + } + } + + public function custom_orders_list_bulk_action($actions) + { + $actions['submit_invoice_in_hesabix'] = __('Submit Invoice in Hesabix', 'hesabix'); + return $actions; + } + + public function custom_orders_list_bulk_action_run($redirect_to, $action, $post_ids) + { + if ($action !== 'submit_invoice_in_hesabix') + return $redirect_to; + + + HesabixLogService::writeLogStr("Submit selected orders invoice"); + + if (count($post_ids) > 10) + return $redirect_to = add_query_arg(array( + 'submit_selected_orders_invoice_in_hesabix' => '1', + 'error_msg' => 'select_max_10_items' + ), $redirect_to); + + $success_count = 0; + $func = new Hesabix_Admin_Functions(); + foreach ($post_ids as $orderId) { + $result = $func->setOrder($orderId); + if ($result) { + $success_count++; + $func->setOrderPayment($orderId); + } + } + + return $redirect_to = add_query_arg(array( + 'submit_selected_orders_invoice_in_hesabix' => '1', + 'success_count' => $success_count, + 'error_msg' => '0' + ), $redirect_to); + } + + public function hesabix_hook_edit_user(WP_User $user) + { + $wpFaService = new HesabixWpFaService(); + $code = isset($user) ? $wpFaService->getCustomerCodeByWpId($user->ID) : ''; + ?> +
+ + + + + +
+ +
+
+ +
+
+
+ getWpFaByHesabixId('customer', $user_hesabix_code); + $wpFa = $wpFaService->getWpFa('customer', $id_customer); + + if (!$wpFaOld || !$wpFa || $wpFaOld->id !== $wpFa->id) { + if ($wpFaOld) + $wpFaService->delete($wpFaOld); + + if ($wpFa) { + $wpFa->idHesabix = $user_hesabix_code; + $wpFaService->update($wpFa); + } else { + $wpFa = new WpFa(); + $wpFa->objType = 'customer'; + $wpFa->idWp = $id_customer; + $wpFa->idHesabix = intval($user_hesabix_code); + $wpFaService->save($wpFa); + } + } + } + + $function = new Hesabix_Admin_Functions(); + + if (get_option('hesabix_contact_automatically_save_in_hesabix') == 'yes') + $function->setContact($id_customer); + } + + public function hesabix_hook_delete_user($id_customer) + { + $wpFaService = new HesabixWpFaService(); + $id_obj = $wpFaService->getWpFaId('customer', $id_customer); + if ($id_obj != false) { + global $wpdb; + $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "hesabix` WHERE `id` = $id_obj AND `obj_type` = 'customer'"); + + if (is_object($row)) { + $hesabixApi = new Hesabix_Api(); + $hesabixApi->contactDelete($row->id_hesabix); + } + + global $wpdb; + $wpdb->delete($wpdb->prefix . 'hesabix', array('id_ps' => $id_customer)); + + + HesabixLogService::log(array("Customer deleted. Customer ID: $id_customer")); + } + } + + public function hesabix_hook_order_status_change($id_order, $from, $to) + { + HesabixLogService::writeLogStr("Order Status Hook"); + $function = new Hesabix_Admin_Functions(); + + $invoice_statuses = get_option('hesabix_invoice_status', array()); + if (!is_array($invoice_statuses)) { + if (is_string($invoice_statuses) && !empty($invoice_statuses)) { + $invoice_statuses = array_map('trim', explode(',', $invoice_statuses)); + } else { + $invoice_statuses = array(); + } + } + + foreach ($invoice_statuses as $status) { + + HesabixLogService::writeLogStr("status: $status"); + + if ($status == $to) { + $orderResult = $function->setOrder($id_order); + if ($orderResult) { + + $payment_statuses = get_option('hesabix_payment_status', array()); + if (!is_array($payment_statuses)) { + if (is_string($payment_statuses) && !empty($payment_statuses)) { + $payment_statuses = array_map('trim', explode(',', $payment_statuses)); + } else { + $payment_statuses = array(); + } + } + foreach ($payment_statuses as $statusPayment) { + if ($statusPayment == $to) + $function->setOrderPayment($id_order); + } + } + } + } + + $values = get_option('hesabix_invoice_return_status'); + if (is_array($values) || is_object($values)) { + foreach ($values as $status) { + if ($status == $to) + $function->setOrder($id_order, 2, $function->getInvoiceCodeByOrderId($id_order)); + } + } + } + + public function hesabix_hook_new_order($id_order, $order) + { + HesabixLogService::writeLogStr("New Order Hook"); + $function = new Hesabix_Admin_Functions(); + $orderStatus = wc_get_order($id_order)->get_status(); + $orderItems = $order->get_items(); + + $invoice_statuses = get_option('hesabix_invoice_status', array()); + if (!is_array($invoice_statuses)) { + if (is_string($invoice_statuses) && !empty($invoice_statuses)) { + $invoice_statuses = array_map('trim', explode(',', $invoice_statuses)); + } else { + $invoice_statuses = array(); + } + } + + foreach ($invoice_statuses as $status) { + + HesabixLogService::writeLogStr("status: $status"); + + if ($status == $orderStatus) { + $orderResult = $function->setOrder($id_order, 0, null, $orderItems); + if ($orderResult) { + + $payment_statuses = get_option('hesabix_payment_status', array()); + if (!is_array($payment_statuses)) { + if (is_string($payment_statuses) && !empty($payment_statuses)) { + $payment_statuses = array_map('trim', explode(',', $payment_statuses)); + } else { + $payment_statuses = array(); + } + } + foreach ($payment_statuses as $statusPayment) { + if ($statusPayment == $orderStatus) + $function->setOrderPayment($id_order); + } + } + } + } + + HesabixLogService::log(array($orderStatus)); + + $values = get_option('hesabix_invoice_return_status'); + if (is_array($values) || is_object($values)) { + foreach ($values as $status) { + if ($status == $orderStatus) + $function->setOrder($id_order, 2, $function->getInvoiceCodeByOrderId($id_order), $orderItems); + } + } + } + + public function hesabix_hook_payment_confirmation($id_order, $from, $to) + { + $payment_statuses = get_option('hesabix_payment_status', array()); + if (!is_array($payment_statuses)) { + if (is_string($payment_statuses) && !empty($payment_statuses)) { + $payment_statuses = array_map('trim', explode(',', $payment_statuses)); + } else { + $payment_statuses = array(); + } + } + + foreach ($payment_statuses as $status) { + if ($status == $to) { + $function = new Hesabix_Admin_Functions(); + $function->setOrderPayment($id_order); + } + } + } + + private $call_time = 1; + + public function hesabix_hook_new_product($id_product) + { + + if ($this->call_time === 1) { + $this->call_time++; + return; + } else { + $this->call_time = 1; + } + + if (get_option("hesabix_do_not_submit_product_automatically", "no") === "yes") + return; + $function = new Hesabix_Admin_Functions(); + $function->setItems(array($id_product)); + } + + public function hesabix_hook_save_product_variation($id_attribute) + { + + HesabixLogService::writeLogStr("hesabix_hook_save_product_variation"); + + if (get_option("hesabix_do_not_submit_product_automatically", "no") === "yes" || get_option("hesabix_do_not_submit_product_automatically", "no") == "1") { + + $variable_field_id = "hesabix_hesabix_item_code_" . $id_attribute; + $code = $_POST[$variable_field_id]; + $id_product = $_POST['product_id']; + + if ($code === "") + return; + + if (isset($code)) { + global $wpdb; + $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "hesabix` WHERE `id_hesabix` = " . $code . " AND `obj_type` = 'product'"); + + if (is_object($row)) { + if ($row->id_ps == $id_product && $row->id_ps_attribute == $id_attribute) { + return false; + } + + echo '

' . __('The new Item code already used for another Item', 'hesabix') . '

'; + + HesabixLogService::log(array("The new Item code already used for another Item. Product ID: $id_product")); + } else { + $row2 = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "hesabix` WHERE `id_ps` = $id_product AND `obj_type` = 'product' AND `id_ps_attribute` = $id_attribute"); + + if (is_object($row2)) { + $wpdb->update($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $code, + ), array( + 'id_ps' => $id_product, + 'id_ps_attribute' => $id_attribute, + 'obj_type' => 'product', + )); + } else if ((int) $code !== 0) { + $wpdb->insert($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $code, + 'id_ps' => (int) $id_product, + 'id_ps_attribute' => $id_attribute, + 'obj_type' => 'product', + )); + } + } + } + + + $func = new Hesabix_Admin_Functions(); + $wpFaService = new HesabixWpFaService(); + $code = $wpFaService->getProductCodeByWpId($id_product, $id_attribute); + if ($code == null) { + $func->setItems(array($id_product)); + } + } + } + + public function hesabix_hook_delete_product($id_product) + { + + HesabixLogService::writeLogStr("Product Delete Hook"); + + $func = new Hesabix_Admin_Functions(); + $wpFaService = new HesabixWpFaService(); + + $hesabixApi = new Hesabix_Api(); + global $wpdb; + + $variations = $func->getProductVariations($id_product); + if ($variations != false) { + foreach ($variations as $variation) { + $id_attribute = $variation->get_id(); + $code = $wpFaService->getProductCodeByWpId($id_product, $id_attribute); + if ($code != false) { + $hesabixApi->itemDelete($code); + $wpdb->delete($wpdb->prefix . 'hesabix', array('id_hesabix' => $code, 'obj_type' => 'product')); + + HesabixLogService::log(array("Product variation deleted. Product ID: $id_product-$id_attribute")); + } + } + } + + $code = $wpFaService->getProductCodeByWpId($id_product); + + if ($code != false) { + $hesabixApi->itemDelete($code); + $wpdb->delete($wpdb->prefix . 'hesabix', array('id_hesabix' => $code, 'obj_type' => 'product')); + + HesabixLogService::log(array("Product deleted. Product ID: $id_product")); + } + } + + public function hesabix_hook_delete_product_variation($id_attribute) + { + $hesabixApi = new Hesabix_Api(); + global $wpdb; + $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "hesabix` WHERE `id_ps_attribute` = $id_attribute AND `obj_type` = 'product'"); + + if (is_object($row)) { + $hesabixApi->itemDelete($row->id_hesabix); + + $wpdb->delete($wpdb->prefix . 'hesabix', array('id' => $row->id)); + + HesabixLogService::log(array("Product variation deleted. Product ID: $row->id_ps-$id_attribute")); + } + } + + public function hesabix_hook_product_options_general_product_data() + { + $wpFaService = new HesabixWpFaService(); + $value = isset($_GET['post']) ? $wpFaService->getProductCodeByWpId($_GET['post']) : ''; + $args = array( + 'id' => 'hesabix_hesabix_item_code_0', + 'label' => __('Hesabix base item code', 'hesabix'), + 'desc_tip' => true, + 'description' => __('The base Item code of this product in Hesabix, if you want to map this product to another item in Hesabix, enter the new Item code.', 'hesabix'), + 'value' => $value, + 'type' => 'number', + ); + woocommerce_wp_text_input($args); + } + + public function hesabix_hook_process_product_meta($post_id) + { + $itemCode = isset($_POST['hesabix_hesabix_item_code_0']) ? $_POST['hesabix_hesabix_item_code_0'] : ''; + + if ($itemCode === "") + return; + + if (isset($itemCode)) { + global $wpdb; + $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "hesabix` WHERE `id_hesabix` = " . $itemCode . " AND `obj_type` = 'product'"); + + if (is_object($row)) { + echo '

' . __('The new Item code already used for another Item', 'hesabix') . '

'; + + HesabixLogService::log(array("The new Item code already used for another Item. Product ID: $post_id")); + } else { + $row2 = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "hesabix` WHERE `id_ps` = $post_id AND `obj_type` = 'product' AND `id_ps_attribute` = 0"); + if (is_object($row2)) { + $wpdb->update($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $itemCode, + ), array( + 'id_ps' => $post_id, + 'id_ps_attribute' => 0, + 'obj_type' => 'product', + )); + } else if ((int) $itemCode !== 0) { + $wpdb->insert($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $itemCode, + 'id_ps' => (int) $post_id, + 'id_ps_attribute' => 0, + 'obj_type' => 'product', + )); + } + } + } + } + + public function hesabix_hook_product_after_variable_attributes($loop, $variation_data, $variation) + { + $wpFaService = new HesabixWpFaService(); + $value = isset($_POST['product_id']) ? $wpFaService->getProductCodeByWpId($_POST['product_id'], $variation->ID) : ''; + $args = array( + 'id' => 'hesabix_hesabix_item_code_' . $variation->ID, + 'label' => __('Hesabix variable item code', 'hesabix'), + 'desc_tip' => true, + 'description' => __('The variable Item code of this product variable in Hesabix, if you want to map this product to another item in Hesabix, enter the new Item code.', 'hesabix'), + 'value' => $value, + ); + woocommerce_wp_text_input($args); + } + + public function adminCleanLogFileCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + $func = new Hesabix_Admin_Functions(); + $result = $func->cleanLogFile(); + + if ($result) { + $redirect_url = admin_url('admin.php?page=hesabix-option&tab=log&cleanLogResult=true'); + } else { + $redirect_url = admin_url('admin.php?page=hesabix-option&tab=log&cleanLogResult=false'); + } + echo $redirect_url; + + die(); + } + } + + function add_hesabix_product_data_tab($product_data_tabs) + { + $product_data_tabs['hesabix'] = array( + 'label' => __('Hesabix', 'hesabix'), + 'target' => 'panel_product_data_hesabix', + ); + return $product_data_tabs; + } + + function add_hesabix_product_data_fields() + { + global $woocommerce, $post, $product; + + $funcs = new Hesabix_Admin_Functions(); + $items = array(); + $id_product = $post->ID; + $product = wc_get_product($id_product); + + if ($product->get_status() === "auto-draft") { + ?> +
+ هنوز محصول ذخیره نشده است. +
+ پس از ذخیره محصول، در این قسمت می توانید ارتباط محصول و متغیرهای آن با حسابیکس + را مدیریت کنید. +
+ get_stock_quantity(); + $items[0]["Id"] = $id_product; + $i = 1; + + $variations = $funcs->getProductVariations($id_product); + if ($variations) { + foreach ($variations as $variation) { + $items[] = HesabixItemService::mapProductVariation($product, $variation, $id_product, false); + $items[$i]["Quantity"] = $variation->get_stock_quantity(); + $items[$i]["Id"] = $variation->get_id(); + $i++; + } + } + + ?> +
+ + + + + + + + + + + + + + + + + + + + + +
نام کالاکد در حسابیکسذخیره کدحذف ارتباطبروزرسانی قیمت و موجودیقیمتموجودی
" id="hesabix-item-" + style="width: 75px;" class="hesabix-item-code" data-id="">" + class="button hesabix-item-save">" + class="button hesabix-item-delete-link">" + class="button button-primary hesabix-item-update">"> + + ">
+ + + + + +
+ + #hesabixID { + width: 5vw; + color: #2271b1; + } + #hesabixID a { + width: 100%; + } + '; + return array_slice($columns, 0, 3, true) + array('hesabixID' => 'کد حسابیکس') + array_slice($columns, 3, count($columns) - 3, true); + } + + function admin_products_hesabixId_column_content($column) + { + $funcs = new Hesabix_Admin_Functions(); + $items = array(); + $id_product = get_the_ID(); + $product = wc_get_product($id_product); + + $items[] = HesabixItemService::mapProduct($product, $id_product, false); + $i = 1; + + $variations = $funcs->getProductVariations($id_product); + if ($variations) { + foreach ($variations as $variation) { + $items[] = HesabixItemService::mapProductVariation($product, $variation, $id_product, false); + $i++; + } + } + + echo '
'; + foreach ($items as $item) { + if ($column == 'hesabixID') { + $hesabixId = $item["code"]; + echo "" . $hesabixId . " " . ""; + } + } + echo '
'; + } + + function adminChangeProductCodeCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + $productId = (int) wc_clean($_POST['productId']); + $attributeId = (int) wc_clean($_POST['attributeId']); + if ($productId == $attributeId) + $attributeId = 0; + $code = (int) wc_clean($_POST['code']); + $result = array(); + + if (!$code) { + $result["error"] = true; + $result["message"] = "کد کالا وارد نشده است."; + echo json_encode($result); + die(); + return; + } + + $wpFaService = new HesabixWpFaService(); + $wpFa = $wpFaService->getWpFaByHesabixId('product', $code); + if ($wpFa) { + $result["error"] = true; + $result["message"] = "این کد به کالای دیگری متصل است. \n" . $wpFa->idWp . "-" . $wpFa->idWpAttribute; + echo json_encode($result); + die(); + return; + } + + $api = new Hesabix_Api(); + $response = $api->itemGet($code); + if (!$response->Success) { + $result["error"] = true; + $result["message"] = "کالایی با کد وارد شده در حسابیکس پیدا نشد."; + echo json_encode($result); + die(); + return; + } + + $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); + if ($wpFa) { + $wpFa->idHesabix = $code; + $wpFaService->update($wpFa); + } else { + $wpFa = new WpFa(); + $wpFa->idHesabix = $code; + $wpFa->idWp = $productId; + $wpFa->idWpAttribute = $attributeId; + $wpFa->objType = 'product'; + $wpFaService->save($wpFa); + } + $result["error"] = false; + echo json_encode($result); + die(); + } + } + + function adminDeleteProductLinkCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + $productId = wc_clean($_POST['productId']); + $attributeId = wc_clean($_POST['attributeId']); + if ($productId == $attributeId) + $attributeId = 0; + $result = array(); + + $wpFaService = new HesabixWpFaService(); + $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); + if ($wpFa) { + $wpFaService->delete($wpFa); + HesabixLogService::writeLogStr("حذف ارتباط کالا. کد کالا: " . $productId . "-" . "کد متغیر:" . $attributeId); + } + + $result["error"] = false; + echo json_encode($result); + die(); + } + } + + function adminUpdateProductCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + if ( + get_option('hesabix_item_update_price', 'no') == 'no' && + get_option('hesabix_item_update_quantity', 'no') == 'no' + ) { + $result["error"] = true; + $result["message"] = "خطا: در تنظیمات افزونه، گزینه های بروزرسانی قیمت و موجودی محصول بر اساس حسابیکس فعال نیستند."; + echo json_encode($result); + die(); + } + + $productId = wc_clean($_POST['productId']); + $attributeId = wc_clean($_POST['attributeId']); + + if (get_option('hesabix_item_update_quantity', 'no') == 'yes') + update_post_meta($attributeId, '_manage_stock', 'yes'); + + if ($productId == $attributeId) + $attributeId = 0; + $result = array(); + + $wpFaService = new HesabixWpFaService(); + $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); + if ($wpFa) { + + $api = new Hesabix_Api(); + // $warehouse = get_option('hesabix_item_update_quantity_based_on', "-1"); + // if ($warehouse == "-1") + // $response = $api->itemGet($wpFa->idHesabix); + // else { + // $response = $api->itemGetQuantity($warehouse, array($wpFa->idHesabix)); + // } + + $response = $api->itemGet($wpFa->idHesabix); + + if ($response->Success) { + // $item = $warehouse == "-1" ? $response->Result : $response->Result[0]; + $item = $response->Result; + $newProps = Hesabix_Admin_Functions::setItemChanges($item); + $result["error"] = false; + $result["newPrice"] = $newProps["newPrice"]; + $result["newQuantity"] = $newProps["newQuantity"]; + } else { + $result["error"] = true; + $result["message"] = "کالا در حسابیکس پیدا نشد."; + } + } + + echo json_encode($result); + die(); + } + } + + function adminChangeProductsCodeCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + $wpFaService = new HesabixWpFaService(); + + $productId = (int) wc_clean($_POST['productId']); + $itemsData = wc_clean($_POST['itemsData'], true); + $result = array(); + $codes = []; + + foreach ($itemsData as $itemData) { + $attributeId = (int) $itemData["attributeId"]; + $code = (int) $itemData["code"]; + if ($productId == $attributeId) + $attributeId = 0; + $codes[] = str_pad($code, 6, "0", STR_PAD_LEFT); + + if (!$code) { + $result["error"] = true; + $result["message"] = "کد کالا وارد نشده است."; + echo json_encode($result); + die(); + return; + } + + $wpFa = $wpFaService->getWpFaByHesabixId('product', $code); + $wpFa2 = $wpFaService->getWpFa('product', $productId, $attributeId); + if ($wpFa && $wpFa2 && $wpFa->id != $wpFa2->id) { + $result["error"] = true; + $result["message"] = "این کد ($code) به کالای دیگری متصل است. \n" . $wpFa->idWp . "-" . $wpFa->idWpAttribute; + echo json_encode($result); + die(); + return; + } + } + + $api = new Hesabix_Api(); + $response = $api->itemGetItemsByCodes(array('values' => $codes)); + if ($response->Success) { + $items = $response->result; + foreach ($codes as $code) { + $found = false; + foreach ($items as $item) { + if ($item->code == $code) + $found = true; + } + if (!$found) { + $result["error"] = true; + $result["message"] = "کالایی با کد $code در حسابیکس پیدا نشد."; + echo json_encode($result); + die(); + return; + } + } + } else { + $result["error"] = true; + $result["message"] = "کالایی با کد وارد شده در حسابیکس پیدا نشد."; + echo json_encode($result); + die(); + return; + } + + + foreach ($itemsData as $itemData) { + $attributeId = (int) $itemData["attributeId"]; + $code = (int) $itemData["code"]; + if ($productId == $attributeId) + $attributeId = 0; + + $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); + if ($wpFa) { + $wpFa->idHesabix = $code; + $wpFaService->update($wpFa); + } else { + $wpFa = new WpFa(); + $wpFa->idHesabix = $code; + $wpFa->idWp = $productId; + $wpFa->idWpAttribute = $attributeId; + $wpFa->objType = 'product'; + $wpFaService->save($wpFa); + } + } + + $result["error"] = false; + echo json_encode($result); + die(); + } + } + + function adminDeleteProductsLinkCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + $productId = wc_clean($_POST['productId']); + $result = array(); + + $wpFaService = new HesabixWpFaService(); + $wpFaService->deleteAll($productId); + HesabixLogService::writeLogStr("حذف ارتباط کالاها. کد کالا: " . $productId); + + $result["error"] = false; + echo json_encode($result); + die(); + } + } + + function adminUpdateProductAndVariationsCallback() + { + if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { + + if ( + get_option('hesabix_item_update_price', 'no') == 'no' && + get_option('hesabix_item_update_quantity', 'no') == 'no' + ) { + $result["error"] = true; + $result["message"] = "خطا: در تنظیمات افزونه، گزینه های بروزرسانی قیمت و موجودی محصول بر اساس حسابیکس فعال نیستند."; + echo json_encode($result); + die(); + } + + + $api = new Hesabix_Api(); + $wpFaService = new HesabixWpFaService(); + + $productId = wc_clean($_POST['productId']); + $productAndCombinations = $wpFaService->getProductAndCombinations($productId); + $result = array(); + if (count($productAndCombinations) == 0) { + $result["error"] = true; + $result["message"] = "هیچ ارتباطی پیدا نشد."; + echo json_encode($result); + die(); + } + $codes = []; + $hesabix_item_update_quantity = get_option('hesabix_item_update_quantity', 'no'); + foreach ($productAndCombinations as $p) { + $codes[] = str_pad($p->idHesabix, 6, "0", STR_PAD_LEFT); + + if ($hesabix_item_update_quantity == 'yes') + update_post_meta($p->idWpAttribute == 0 ? $p->idWp : $p->idWpAttribute, '_manage_stock', 'yes'); + } + + // $warehouse = get_option('hesabix_item_update_quantity_based_on', "-1"); + // if ($warehouse == "-1") + // $response = $api->itemGetItemsByCodes($codes); + // else { + // $response = $api->itemGetQuantity($warehouse, $codes); + // } + + $response = $api->itemGetItemsByCodes($codes); + + if ($response->Success) { + // $items = $warehouse == "-1" ? $response->Result->List : $response->Result; + $items = $response->Result->List; + $newData = []; + $result["error"] = false; + foreach ($items as $item) { + $newProps = Hesabix_Admin_Functions::setItemChanges($item); + $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Code); + $newData[] = array( + "newPrice" => $newProps["newPrice"], + "newQuantity" => $newProps["newQuantity"], + "attributeId" => $wpFa->idWpAttribute > 0 ? $wpFa->idWpAttribute : $wpFa->idWp + ); + } + $result["newData"] = $newData; + } else { + $result["error"] = true; + $result["message"] = "کالایی با کد وارد شده در حسابیکس پیدا نشد."; + echo json_encode($result); + die(); + return; + } + + echo json_encode($result); + die(); + } + } + + function add_additional_fields_to_checkout($fields) + { + $add_fields_option = get_option('hesabix_contact_add_fields'); + + if ($add_fields_option !== '1') { + return $fields; + } + + $NationalCode_isActive = get_option('hesabix_contact_NationalCode_checkbox_hesabix'); + $EconomicCode_isActive = get_option('hesabix_contact_EconomicCode_checkbox_hesabix'); + $RegistrationNumber_isActive = get_option('hesabix_contact_RegistrationNumber_checkbox_hesabix'); + $Website_isActive = get_option('hesabix_contact_Website_checkbox_hesabix'); + + $NationalCode_isRequired = get_option('hesabix_contact_NationalCode_isRequired_hesabix') === 'yes'; + $EconomicCode_isRequired = get_option('hesabix_contact_EconomicCode_isRequired_hesabix') === 'yes'; + $RegistrationNumber_isRequired = get_option('hesabix_contact_RegistrationNumber_isRequired_hesabix') === 'yes'; + $Website_isRequired = get_option('hesabix_contact_Website_isRequired_hesabix') === 'yes'; + + + if ($NationalCode_isActive == 'yes') { + $fields['billing']['billing_hesabix_nationalcode'] = array( + 'label' => __('National code', 'hesabix'), + 'placeholder' => __('please enter your National code', 'hesabix'), + 'priority' => 30, + 'required' => $NationalCode_isRequired, + 'clear' => true, + 'maxlength' => 10, + ); + } + + if ($EconomicCode_isActive == 'yes') { + $fields['billing']['billing_hesabix_economiccode'] = array( + 'label' => __('Economic code', 'hesabix'), + 'placeholder' => __('please enter your Economic code', 'hesabix'), + 'priority' => 31, + 'required' => $EconomicCode_isRequired, + 'clear' => true + ); + } + + if ($RegistrationNumber_isActive == 'yes') { + $fields['billing']['billing_hesabix_registerationnumber'] = array( + 'label' => __('Registration number', 'hesabix'), + 'placeholder' => __('please enter your Registration number', 'hesabix'), + 'priority' => 32, + 'required' => $RegistrationNumber_isRequired, + 'clear' => true + ); + } + + if ($Website_isActive == 'yes') { + $fields['billing']['billing_hesabix_website'] = array( + 'type' => 'url', + 'label' => __('Website', 'hesabix'), + 'placeholder' => __('please enter your Website address', 'hesabix'), + 'priority' => 33, + 'required' => $Website_isRequired, + 'clear' => true, + ); + } + return $fields; + } + + function show_additional_fields_in_order_detail($order) + { + + $add_fields_option = get_option('hesabix_contact_add_fields'); + if ($add_fields_option !== '1') { + return; + } + + + $orderId = $order->get_id(); + $NationalCode = '_billing_hesabix_nationalcode'; + $EconomicCode = '_billing_hesabix_economiccode'; + $RegistrationNumber = '_billing_hesabix_registerationnumber'; + $Website = '_billing_hesabix_website'; + + $NationalCode_isActive = get_option('hesabix_contact_NationalCode_checkbox_hesabix'); + $EconomicCode_isActive = get_option('hesabix_contact_EconomicCode_checkbox_hesabix'); + $RegistrationNumber_isActive = get_option('hesabix_contact_RegistrationNumber_checkbox_hesabix'); + $Website_isActive = get_option('hesabix_contact_Website_checkbox_hesabix'); + + if ($NationalCode_isActive == 'yes') { + echo '

' . __('National code', 'hesabix') . ': ' . '
' . '' . get_post_meta($orderId, $NationalCode, true) . '

'; + } + + if ($EconomicCode_isActive == 'yes') + echo '

' . __('Economic code', 'hesabix') . ': ' . '
' . '' . get_post_meta($orderId, $EconomicCode, true) . '

'; + + if ($RegistrationNumber_isActive == 'yes') + echo '

' . __('Registration number', 'hesabix') . ': ' . '
' . '' . get_post_meta($orderId, $RegistrationNumber, true) . '

'; + + if ($Website_isActive == 'yes') + echo '

' . __('Website', 'hesabix') . ': ' . '
' . '' . get_post_meta($orderId, $Website, true) . '

'; + } + + public function admin_get_home_stats_callback() + { + + if (!wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_die('Security check failed'); + } + + + $products_data = Hesabix_Setting::getProductsCount(); + $products_count = $products_data['storeProductsCount']; + $customers_count = Hesabix_Setting::getCustomersCount(); + $orders_count = Hesabix_Setting::getOrdersCount(); + + + $is_connected = $this->quickCheckHesabixConnection(); + + + $response = array( + 'success' => true, + 'data' => array( + 'products_count' => number_format($products_count), + 'customers_count' => number_format($customers_count), + 'orders_count' => number_format($orders_count), + 'is_connected' => $is_connected, + 'connected_text' => $is_connected ? __('Connected', 'hesabix') : __('Not Connected', 'hesabix'), + 'products_label' => __('Total Products', 'hesabix'), + 'customers_label' => __('Total Customers', 'hesabix'), + 'orders_label' => __('Total Orders', 'hesabix'), + 'status_label' => __('Hesabix Status', 'hesabix') + ) + ); + + wp_send_json($response); + } + + private function checkHesabixConnection() + { + + $api_key = get_option('hesabix_account_api'); + if (!$api_key) { + return false; + } + + try { + + $hesabix_api = new Hesabix_Api(); + $currency_response = $hesabix_api->settingGetCurrency(); + + if ($currency_response && is_object($currency_response) && $currency_response->Success) { + return true; + } + + return false; + } catch (Exception $e) { + return false; + } + } + + private function silentCheckHesabixConnection() + { + + $api_key = get_option('hesabix_account_api'); + if (!$api_key) { + return false; + } + + try { + + $hesabix_api = new Hesabix_Api(); + $currency_response = $hesabix_api->settingGetCurrency(); + + if ($currency_response && is_object($currency_response) && $currency_response->Success) { + return true; + } + + return false; + } catch (Exception $e) { + return false; + } + } + + private function quickCheckHesabixConnection() + { + + $api_key = get_option('hesabix_account_api'); + $live_mode = get_option('hesabix_live_mode', 0); + + return !empty($api_key) && $live_mode == 1; + } + + public function admin_check_for_updates_callback() + { + + if (!wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_die('Security check failed'); + } + + try { + $plugin_stats = wp_remote_get('https://hesabix.dragonizzer.ir/api/wordpress/plugin/stats'); + + if ($plugin_stats && !is_wp_error($plugin_stats) && $plugin_stats['response']['code'] == 200) { + + $json_data = json_decode($plugin_stats['body']); + + if ($json_data && isset($json_data->Success) && $json_data->Success) { + $current_version = HESABIX_VERSION; + $latest_version = $json_data->Result->version; + + $is_update_available = version_compare($current_version, $latest_version, '<'); + + $response = array( + 'success' => true, + 'data' => array( + 'current_version' => $current_version, + 'latest_version' => $latest_version, + 'is_update_available' => $is_update_available, + 'download_url' => $json_data->Result->download_url, + 'changelog' => $json_data->Result->changelog, + 'statistics' => $json_data->Result->statistics + ) + ); + } else { + $response = array( + 'success' => false, + 'message' => __('Failed to check for updates', 'hesabix') + ); + } + } else { + $response = array( + 'success' => false, + 'message' => __('Failed to check for updates', 'hesabix') + ); + } + } catch (Exception $e) { + $response = array( + 'success' => false, + 'message' => __('Error checking for updates', 'hesabix') + ); + } + + wp_send_json($response); + } + + public function adminSaveApiSettingsCallback() + { + check_ajax_referer('hesabix_ajax_nonce', 'nonce'); + + try { + $api_key = sanitize_text_field($_POST['api_key'] ?? ''); + $api_address = sanitize_text_field($_POST['api_address'] ?? '0'); + $custom_api_address = sanitize_text_field($_POST['custom_api_address'] ?? ''); + + update_option('hesabix_account_api', $api_key); + update_option('hesabix_api_address', $api_address); + update_option('hesabix_custom_api_address', $custom_api_address); + + + Hesabix_Setting::hesabix_set_webhook(false); + + wp_send_json_success(array( + 'message' => __('Settings saved successfully', 'hesabix') + )); + + } catch (Exception $e) { + wp_send_json_error(array('message' => $e->getMessage())); + } + } + + public function adminTestApiConnectionCallback() + { + check_ajax_referer('hesabix_ajax_nonce', 'nonce'); + + try { + $api_key = get_option('hesabix_account_api'); + $api_address = get_option('hesabix_api_address', 0); + + if (!$api_key) { + wp_send_json_error(array('message' => __('API key not configured', 'hesabix'))); + return; + } + + $is_connected = $this->quickCheckHesabixConnection(); + + if (!$is_connected) { + wp_send_json_error(array('message' => __('Connection failed. Please check your API key and try again.', 'hesabix'))); + return; + } + + wp_send_json_success(array( + 'message' => __('Connection successful!', 'hesabix'), + 'business_info' => $data['data'] ?? array() + )); + + } catch (Exception $e) { + wp_send_json_error(array('message' => $e->getMessage())); + } + } + + public function hesabix_get_sync_stats_ajax() + { + + if (!wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error('Security check failed'); + } + + $storeProductsCount = Hesabix_Setting::getProductCountsInStore(); + $hesabixProductsCount = Hesabix_Setting::getProductCountsInHesabix(); + $linkedProductsCount = Hesabix_Setting::getLinkedProductsCount(); + + wp_send_json_success(array( + 'storeProductsCount' => $storeProductsCount, + 'hesabixProductsCount' => $hesabixProductsCount, + 'linkedProductsCount' => $linkedProductsCount + )); + } + + public function hesabix_load_tab_content() + { + + if (!wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error('Security check failed'); + } + + $tab = sanitize_text_field($_POST['tab']); + + + $api_required_tabs = array('catalog', 'customers', 'invoice', 'sync'); + + + if (in_array($tab, $api_required_tabs)) { + $is_connected = $this->quickCheckHesabixConnection(); + + if (!$is_connected) { + + $error_message = '
+
+ +
+

' . __('API Connection Required', 'hesabix') . '

+

' . __('This tab requires a valid API connection. Please configure your API settings from the API tab first.', 'hesabix') . '

+
+ +
+
'; + + wp_send_json_success(array('content' => $error_message)); + return; + } + } + + + ob_start(); + + + switch ($tab) { + case 'home': + do_action('hesabix_home_setting_save_field'); + do_action('hesabix_home_setting'); + break; + case 'extra': + + do_action('hesabix_extra_setting'); + break; + case 'catalog': + do_action('hesabix_catalog_setting'); + break; + case 'customers': + do_action('hesabix_customers_setting'); + break; + case 'invoice': + do_action('hesabix_invoice_setting'); + break; + case 'api': + do_action('hesabix_api_setting_save_field'); + do_action('hesabix_api_setting'); + break; + case 'export': + do_action('hesabix_export_setting'); + break; + case 'sync': + do_action('hesabix_sync_setting'); + break; + case 'log': + do_action('hesabix_log_setting'); + break; + default: + wp_send_json_error('Invalid tab'); + break; + } + + $content = ob_get_clean(); + + wp_send_json_success(array('content' => $content)); + } + + public function hesabix_update_customers_ajax() + { + + if (!wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error('Security check failed'); + } + + try { + $function = new Hesabix_Admin_Functions(); + + + $customers = get_users(array( + 'role' => 'customer', + 'number' => -1, + 'fields' => 'ID' + )); + + $success_count = 0; + $error_count = 0; + $errors = array(); + + foreach ($customers as $customer_id) { + $result = $function->setContact($customer_id); + if ($result) { + $success_count++; + } else { + $error_count++; + $errors[] = "Customer ID: $customer_id"; + } + } + + $response = array( + 'success' => true, + 'message' => __('Customers successfully updated in Hesabix.', 'hesabix'), + 'data' => array( + 'success_count' => $success_count, + 'error_count' => $error_count, + 'errors' => $errors + ) + ); + + wp_send_json_success($response); + + } catch (Exception $e) { + wp_send_json_error(array( + 'message' => __('Error updating customers: ', 'hesabix') . $e->getMessage() + )); + } + } + + public function hesabix_save_customers_fields_ajax() + { + + if (!wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error('Security check failed'); + } + + try { + + $fields_to_save = array( + 'hesabix_contact_add_fields' => isset($_POST['addFieldsRadio']) ? sanitize_text_field($_POST['addFieldsRadio']) : '', + 'hesabix_contact_NationalCode_checkbox_hesabix' => isset($_POST['nationalCodeCheck']) ? sanitize_text_field($_POST['nationalCodeCheck']) : 'no', + 'hesabix_contact_NationalCode_isRequired_hesabix' => isset($_POST['nationalCodeRequired']) ? sanitize_text_field($_POST['nationalCodeRequired']) : 'no', + 'hesabix_contact_NationalCode_text_hesabix' => isset($_POST['nationalCode']) ? sanitize_text_field($_POST['nationalCode']) : '', + 'hesabix_contact_EconomicCode_checkbox_hesabix' => isset($_POST['economicCodeCheck']) ? sanitize_text_field($_POST['economicCodeCheck']) : 'no', + 'hesabix_contact_EconomicCode_isRequired_hesabix' => isset($_POST['economicCodeRequired']) ? sanitize_text_field($_POST['economicCodeRequired']) : 'no', + 'hesabix_contact_EconomicCode_text_hesabix' => isset($_POST['economicCode']) ? sanitize_text_field($_POST['economicCode']) : '', + 'hesabix_contact_RegistrationNumber_checkbox_hesabix' => isset($_POST['registrationNumberCheck']) ? sanitize_text_field($_POST['registrationNumberCheck']) : 'no', + 'hesabix_contact_RegistrationNumber_isRequired_hesabix' => isset($_POST['registrationNumberRequired']) ? sanitize_text_field($_POST['registrationNumberRequired']) : 'no', + 'hesabix_contact_RegistrationNumber_text_hesabix' => isset($_POST['registrationNumber']) ? sanitize_text_field($_POST['registrationNumber']) : '', + 'hesabix_contact_Website_checkbox_hesabix' => isset($_POST['websiteCheck']) ? sanitize_text_field($_POST['websiteCheck']) : 'no', + 'hesabix_contact_Website_isRequired_hesabix' => isset($_POST['websiteRequired']) ? sanitize_text_field($_POST['websiteRequired']) : 'no', + 'hesabix_contact_Website_text_hesabix' => isset($_POST['website']) ? sanitize_text_field($_POST['website']) : '', + ); + + $success = true; + foreach ($fields_to_save as $option_name => $option_value) { + $result = update_option($option_name, $option_value); + if (!$result && get_option($option_name) !== $option_value) { + $success = false; + } + } + + if ($success) { + wp_send_json_success(array('message' => __('Customer fields saved successfully', 'hesabix'))); + } else { + wp_send_json_error(array('message' => __('Failed to save customer fields', 'hesabix'))); + } + } catch (Exception $e) { + wp_send_json_error(array( + 'message' => __('Error saving customer fields: ', 'hesabix') . $e->getMessage() + )); + } + } + +} diff --git a/admin/class-ssbhesabix-admin.php b/admin/class-ssbhesabix-admin.php deleted file mode 100644 index 5b80987..0000000 --- a/admin/class-ssbhesabix-admin.php +++ /dev/null @@ -1,1658 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - */ -class Ssbhesabix_Admin -{ - - /** - * The ID of this plugin. - * - * @since 1.0.0 - * @access private - * @var string $plugin_name The ID of this plugin. - */ - private $plugin_name; - - /** - * The version of this plugin. - * - * @since 1.0.0 - * @access private - * @var string $version The current version of this plugin. - */ - private $version; -//========================================================================================================================= - /** - * Initialize the class and set its properties. - * - * @param string $plugin_name The name of this plugin. - * @param string $version The version of this plugin. - * @since 1.0.0 - */ - public function __construct($plugin_name, $version) - { - $this->plugin_name = $plugin_name; - $this->version = $version; - $this->load_dependencies(); - } - - /** - * Check DB ver on plugin update and do necessary actions - * - * @since 1.0.7 - */ -//========================================================================================================================= - public function ssbhesabix_update_db_check() - { - $current_db_ver = get_site_option('ssbhesabix_db_version'); - if ($current_db_ver === false || $current_db_ver < 1.1) { - global $wpdb; - $table_name = $wpdb->prefix . "ssbhesabix"; - - $sql = "ALTER TABLE $table_name - ADD `id_ps_attribute` INT(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `id_ps`;"; - - if (!$wpdb->query($sql)) { - HesabixLogService::log(array("Cannot alter table $table_name. Current DB Version: $current_db_ver")); - } else { - update_option('ssbhesabix_db_version', 1.1); - HesabixLogService::log(array("Alter table $table_name. Current DB Version: $current_db_ver")); - } - } - } -//========================================================================================================================= - /** - * Register the stylesheets for the admin area. - * - * @since 1.0.0 - */ - public function enqueue_styles() - { - /** - * This function is provided for demonstration purposes only. - * - * An instance of this class should be passed to the run() function - * defined in Ssbhesabix_Loader as all of the hooks are defined - * in that particular class. - * - * The Ssbhesabix_Loader will then create the relationship - * between the defined hooks and the functions defined in this - * class. - */ - if( isset($_GET['page']) && str_contains($_GET['page'], "hesabix") ){ - wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/ssbhesabix-admin.css?v=1', array(), $this->version, 'all'); - wp_enqueue_style('bootstrap_css', plugin_dir_url(__FILE__) . 'css/bootstrap.css', array(), $this->version, 'all'); - } - } -//========================================================================================================================= - /** - * Register the JavaScript for the admin area. - * - * @since 1.0.0 - */ - public function enqueue_scripts() - { - /** - * This function is provided for demonstration purposes only. - * - * An instance of this class should be passed to the run() function - * defined in Ssbhesabix_Loader as all of the hooks are defined - * in that particular class. - * - * The Ssbhesabix_Loader will then create the relationship - * between the defined hooks and the functions defined in this - * class. - */ - - wp_enqueue_script($this->plugin_name, plugin_dir_url(__FILE__) . 'js/ssbhesabix-admin.js', array('jquery'), $this->version, false); - if( isset($_GET['page']) && str_contains($_GET['page'], "hesabix") ) - wp_enqueue_script('bootstrap_js', plugin_dir_url(__FILE__) . 'js/bootstrap.bundle.min.js', array('jquery'), $this->version, false); - } -//========================================================================================================================= - private function load_dependencies() - { - /** - * The class responsible for defining all actions that occur in the Dashboard - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'admin/partials/ssbhesabix-admin-display.php'; - - /** - * The class responsible for defining function for display Html element - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'admin/partials/ssbhesabix-html-output.php'; - - /** - * The class responsible for defining function for display general setting tab - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'admin/partials/ssbhesabix-admin-setting.php'; - - /** - * The class responsible for defining function for admin area - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'admin/partials/ssbhesabix-admin-functions.php'; - } - - /** - * WC missing notice for the admin area. - * - * @since 1.0.0 - */ -//========================================================================================================================= - public function ssbhesabix_missing_notice() - { - echo '

' . sprintf(__('Hesabix Plugin requires the %s to work!', 'ssbhesabix'), '' . __('WooCommerce', 'ssbhesabix') . '') . '

'; - } - - /** - * Hesabix Plugin Live mode notice for the admin area. - * - * @since 1.0.0 - */ -//========================================================================================================================= - public function ssbhesabix_live_mode_notice() - { - echo '

' . __('Hesabix Plugin need to connect to Hesabix Accounting, Please check the API credential!', 'ssbhesabix') . '

'; - } -//========================================================================================================================= - public function ssbhesabix_business_expired_notice() - { - echo '

' . __('Cannot connect to Hesabix. Business expired.', 'ssbhesabix') . '

'; - } - - /** - * Missing hesabix default currency notice for the admin area. - * - * @since 1.0.0 - */ -//========================================================================================================================= - public function ssbhesabix_currency_notice() - { - echo '

' . __('Hesabix Plugin cannot works! because WooCommerce currency in not match with Hesabix.', 'ssbhesabix') . '

'; - } -//========================================================================================================================= - public function ssbhesabix_general_notices() { - if (!empty( $_REQUEST['submit_selected_orders_invoice_in_hesabix'])) { - if(!empty($_REQUEST['error_msg']) && $_REQUEST['error_msg'] == "select_max_10_items") { - printf( '

%s

', - __('Error: Select maximum 10 orders. Due to some limitations in Hesabix API, sending too many requests in one minute is not possible.', 'ssbhesabix')); - } else { - $success_count = intval( $_REQUEST['success_count'] ); - printf( '

%s %d

', __('Selected orders invoices have been saved. Number of saved invoices: ', 'ssbhesabix'), $success_count); - } - } - } - -//========================================================================================================================= - /* - * Action - Ajax 'export products' from Hesabix/Export tab - * @since 1.0.0 - */ - public function adminExportProductsCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $batch = wc_clean($_POST['batch']); - $totalBatch = wc_clean($_POST['totalBatch']); - $total = wc_clean($_POST['total']); - $updateCount = wc_clean($_POST['updateCount']); - - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->exportProducts($batch, $totalBatch, $total, $updateCount); - - if ($result['error']) { - if ($updateCount === -1) { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productExportResult=false&error=-1'); - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productExportResult=false'); - } - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productExportResult=true&processed=' . $result['updateCount']); - } - - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - public function adminImportProductsCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $batch = wc_clean($_POST['batch']); - $totalBatch = wc_clean($_POST['totalBatch']); - $total = wc_clean($_POST['total']); - $updateCount = wc_clean($_POST['updateCount']); - - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->importProducts($batch, $totalBatch, $total, $updateCount); - $import_count = $result['updateCount']; - - if ($result['error']) { - if ($import_count === -1) { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productImportResult=false&error=-1'); - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productImportResult=false'); - } - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productImportResult=true&processed=' . $import_count); - } - - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - /* - * Action - Ajax 'export products Opening Quantity' from Hesabix/Export tab - * @since 1.0.6 - */ - public function adminExportProductsOpeningQuantityCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $batch = wc_clean($_POST['batch']); - $totalBatch = wc_clean($_POST['totalBatch']); - $total = wc_clean($_POST['total']); - - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->exportOpeningQuantity($batch, $totalBatch, $total); - if ($result['error']) { - if ($result['errorType'] == 'shareholderError') { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productOpeningQuantityExportResult=false&shareholderError=true'); - } else if ($result['errorType'] == 'noProduct') { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productOpeningQuantityExportResult=false&noProduct=true'); - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productOpeningQuantityExportResult=false'); - } - } else { - if ($result["done"] == true) - update_option('ssbhesabix_use_export_product_opening_quantity', true); - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&productOpeningQuantityExportResult=true'); - } - - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - /* - * Action - Ajax 'export customers' from Hesabix/Export tab - * @since 1.0.0 - */ - public function adminExportCustomersCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $batch = wc_clean($_POST['batch']); - $totalBatch = wc_clean($_POST['totalBatch']); - $total = wc_clean($_POST['total']); - $updateCount = wc_clean($_POST['updateCount']); - - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->exportCustomers($batch, $totalBatch, $total, $updateCount); - - if ($result["error"]) { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&customerExportResult=false'); - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=export&customerExportResult=true&processed=' . $result["updateCount"]); - } - echo json_encode($result); - - die(); - } - } -//========================================================================================================================= - /* - * Action - Ajax 'Sync Changes' from Hesabix/Sync tab - * @since 1.0.0 - */ - public function adminSyncChangesCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - include(plugin_dir_path(__DIR__) . 'includes/class-ssbhesabix-webhook.php'); - new Ssbhesabix_Webhook(); - - $redirect_url = admin_url('admin.php?page=ssbhesabix-option&tab=sync&changesSyncResult=true'); - echo $redirect_url; - - die(); - } - } -//========================================================================================================================= - /* - * Action - Ajax 'Sync Products' from Hesabix/Sync tab - * @since 1.0.0 - */ - public function adminSyncProductsCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $batch = wc_clean($_POST['batch']); - $totalBatch = wc_clean($_POST['totalBatch']); - $total = wc_clean($_POST['total']); - - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->syncProducts($batch, $totalBatch, $total); - if ($result['error']) { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&productSyncResult=false'); - echo json_encode($result); - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&productSyncResult=true'); - echo json_encode($result); - } - die(); - } - } -//========================================================================================================================= - /* - * Action - Ajax 'Sync Orders from Hesabix/Sync tab - * @since 1.0.0 - */ - public function adminSyncOrdersCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $batch = wc_clean($_POST['batch']); - $totalBatch = wc_clean($_POST['totalBatch']); - $total = wc_clean($_POST['total']); - $updateCount = wc_clean($_POST['updateCount']); - $from_date = wc_clean($_POST['date']); - $end_date = wc_clean($_POST['endDate']); - - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->syncOrders($from_date, $end_date, $batch, $totalBatch, $total, $updateCount); - - if (!$result['error']) - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&orderSyncResult=true&processed=' . $result["updateCount"]); - else { - switch ($result['error']) { - case 'fiscalYearError': - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&orderSyncResult=false&fiscal=true'); - break; - case 'inputDateError': - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&orderSyncResult=false'); - break; - default: - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&orderSyncResult=true&processed=' . $updateCount); - } - } - - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - /* - * Action - Ajax 'Update Products' from Hesabix/Sync tab - * @since 1.0.0 - */ - public function adminUpdateProductsCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $batch = wc_clean($_POST['batch']); - $totalBatch = wc_clean($_POST['totalBatch']); - $total = wc_clean($_POST['total']); - - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->updateProductsInHesabixBasedOnStore($batch, $totalBatch, $total); - - if ($result['error']) { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&$productUpdateResult=false'); - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&$productUpdateResult=true'); - } - echo json_encode($result); - die(); - } - } - -//========================================================================================================================= - public function adminUpdateProductsWithFilterCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $offset = wc_clean($_POST['offset']); - $rpp = wc_clean($_POST['rpp']); - if(abs($rpp-$offset) <= 200) { - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->updateProductsInHesabixBasedOnStoreWithFilter($offset, $rpp); - - if ($result['error']) { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&$productUpdateWithFilterResult=false'); - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&$productUpdateWithFilterResult=true'); - } - echo json_encode($result); - die(); - } else { - $result["redirectUrl"] = admin_url('admin.php?page=ssbhesabix-option&tab=sync&$productUpdateWithFilterResult=false'); - echo json_encode($result); - die(); - } - } - } -//========================================================================================================================== - public function adminSubmitInvoiceCallback() - { - HesabixLogService::writeLogStr('Submit Invoice Manually'); - - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - $orderId = wc_clean($_POST['orderId']); - - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->setOrder($orderId); - if ($result) - $func->setOrderPayment($orderId); - - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - public function adminSyncProductsManuallyCallback() - { - HesabixLogService::writeLogStr('Sync Products Manually'); - - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $page = wc_clean($_POST["page"]); - $rpp = wc_clean($_POST["rpp"]); - if (!$page) $page = 1; - if (!$rpp) $rpp = 10; - - if (isset($_POST["data"])) { - $data = wc_clean($_POST['data']); - $data = str_replace('\\', '', $data); - $data = json_decode($data, true); - } else { - $errors = true; - } - - $func = new Ssbhesabix_Admin_Functions(); - $res = $func->syncProductsManually($data); - if ($res["result"] == true) { - $redirect_url = admin_url("admin.php?page=hesabix-sync-products-manually&p=$page&rpp=$rpp&result=true"); - } else { - $data = implode(",", $res["data"]); - $redirect_url = admin_url("admin.php?page=hesabix-sync-products-manually&p=$page&rpp=$rpp&result=false&data=$data"); - } - echo $redirect_url; - - die(); - } - } -//========================================================================================================================= - public function adminClearPluginDataCallback() - { - - HesabixLogService::writeLogStr('Clear Plugin Data'); - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - //Call API - $hesabixApi = new Ssbhesabix_Api(); - $result = $hesabixApi->fixClearTags(); - if (!$result->Success) { - - HesabixLogService::log(array("ssbhesabix - Cannot clear tags. Error Message: " . (string)$result->ErrorMessage . ". Error Code: " . (string)$result->ErrorCode)); - } - - global $wpdb; - $options = $wpdb->get_results("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '%ssbhesabix%'"); - foreach ($options as $option) { - delete_option($option->option_name); - } - - $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}ssbhesabix"); - - die(); - } - } -//========================================================================================================================= - public function adminInstallPluginDataCallback() - { - - HesabixLogService::writeLogStr('Install Plugin Data'); - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - // create table and settings - require_once plugin_dir_path(__DIR__) . 'includes/class-ssbhesabix-activator.php'; - Ssbhesabix_Activator::activate(); - - die(); - } - } -//========================================================================================================================= - public function admin_product_add_column( $columns ) { - $hesabixArray = array("hesabix_code" => "کد در حسابیکس"); - $columns = $hesabixArray + $columns; - return $columns; - } -//========================================================================================================================= - public function admin_product_export_rows($rows, $products) { - $rowsArray = explode("\n", $rows); - $exportRows = []; - - $reflection = new ReflectionClass($products); - $property = $reflection->getProperty('row_data'); - $property->setAccessible(true); - $productsArray = $property->getValue($products); - $matchingArray = []; - - if (!empty($productsArray)) { - foreach ($productsArray as $product) { - if (is_array($product) && isset($product['id'])) { - $wpFaService = new HesabixWpFaService(); - - if ($product["type"] == "variation") { - if(array_key_exists('parent_id', $product)) { - $parentId = $product['parent_id']; - $productParentId = explode(':', $parentId)[1]; - $wpFa = $wpFaService->getWpFaSearch($productParentId, $product['id'], '', "product"); - } - } elseif ($product["type"] == "simple" || $product["type"] == "variable") { - $wpFa = $wpFaService->getWpFaSearch($product['id'], 0, '', "product"); - } - - if (is_array($wpFa)) { - foreach ($wpFa as $item) { - if ($item->idWpAttribute != 0) { - $matchingArray[$item->idWpAttribute] = $item->idHesabix; - } else { - $matchingArray[$item->idWp] = $item->idHesabix; - } - } - } - } - } - } - - foreach ($rowsArray as $row) { - if (empty(trim($row))) { - continue; - } - $columns = str_getcsv($row); - $inserted = false; - - if (isset($columns[1])) { - foreach ($matchingArray as $wpId => $hesabixId) { - if ($columns[1] == $wpId && !$inserted) { - $columns[0] = $hesabixId; - $inserted = true; - break; - } - } - } - - if (!$inserted) { - $columns[0] = "کد ندارد"; - } - - $exportRows[] = implode(",", $columns); - } - - return implode("\n", $exportRows); - } -//========================================================================================================================= - public function ssbhesabix_init_internal() - { - add_rewrite_rule('ssbhesabix-webhook.php$', 'index.php?ssbhesabix_webhook=1', 'top'); - //$this->checkForSyncChanges(); - } -//========================================================================================================================= - private function checkForSyncChanges() - { - $syncChangesLastDate = get_option('ssbhesabix_sync_changes_last_date'); - if (!isset($syncChangesLastDate) || $syncChangesLastDate == false) { - add_option('ssbhesabix_sync_changes_last_date', new DateTime()); - $syncChangesLastDate = new DateTime(); - } - - $nowDateTime = new DateTime(); - $diff = $nowDateTime->diff($syncChangesLastDate); - - if ($diff->i >= 4) { - HesabixLogService::writeLogStr('Sync Changes Automatically'); - update_option('ssbhesabix_sync_changes_last_date', new DateTime()); - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-ssbhesabix-webhook.php'; - new Ssbhesabix_Webhook(); - } - } -//========================================================================================================================= - public function ssbhesabix_query_vars($query_vars) - { - $query_vars[] = 'ssbhesabix_webhook'; - return $query_vars; - } -//========================================================================================================================= - public function custom_hesabix_column_order_list($columns) - { - $reordered_columns = array(); - - foreach ($columns as $key => $column) { - $reordered_columns[$key] = $column; - if ($key == 'order_status') { - // Inserting after "Status" column - $reordered_columns['hesabix-column-invoice-number'] = __('Invoice in Hesabix', 'ssbhesabix'); - $reordered_columns['hesabix-column-submit-invoice'] = __('Submit Invoice', 'ssbhesabix'); - } - } - return $reordered_columns; - } -//========================================================================================================================= - public function custom_orders_list_column_content($column, $post_id) - { - - global $wpdb; - - if (get_option('woocommerce_custom_orders_table_enabled') == 'yes') { - switch ($column) { - case 'hesabix-column-invoice-number': - $product_id = $post_id->ID; // Extract product ID from the object - // $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps` = $post_id AND `obj_type` = 'order'"); - $table_name = $wpdb->prefix . 'ssbhesabix'; - $row = $wpdb->get_row( - $wpdb->prepare( - "SELECT id_hesabix FROM $table_name WHERE id_ps = %d AND obj_type = 'order'", - $product_id - ) - ); - - if (!empty($row)) { - echo '' . $row->id_hesabix . ''; - } else { - echo ''; - } - break; - - case 'hesabix-column-submit-invoice': - // Use the product ID for the data attribute value - $product_id = $post_id->ID; - echo ''; - echo __('Submit Invoice', 'ssbhesabix'); - echo ''; - break; - } - } else { - switch ($column) { - case 'hesabix-column-invoice-number' : - // Get custom post meta data - $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps` = $post_id AND `obj_type` = 'order'"); - - //$my_var_one = get_post_meta( $post_id, '_the_meta_key1', true ); - if (!empty($row)) - echo '' . $row->id_hesabix . ''; - else - echo ''; - break; - - case 'hesabix-column-submit-invoice' : - echo '"; - echo __('Submit Invoice', 'ssbhesabix'); - echo ''; - break; - } - } - } -//========================================================================================================================= - public function ssbhesabix_parse_request(&$wp) - { - if (array_key_exists('ssbhesabix_webhook', $wp->query_vars)) { - include(plugin_dir_path(__DIR__) . 'includes/ssbhesabix-webhook.php'); - exit(); - } - } -//========================================================================================================================= - public function custom_orders_list_bulk_action($actions) { - $actions['submit_invoice_in_hesabix'] = __('Submit Invoice in Hesabix', 'ssbhesabix'); - return $actions; - } -//========================================================================================================================= - public function custom_orders_list_bulk_action_run($redirect_to, $action, $post_ids) { - if ( $action !== 'submit_invoice_in_hesabix' ) - return $redirect_to; // Exit - - - HesabixLogService::writeLogStr("Submit selected orders invoice"); - - if(count($post_ids) > 10) - return $redirect_to = add_query_arg( array( - 'submit_selected_orders_invoice_in_hesabix' => '1', - 'error_msg' => 'select_max_10_items' - ), $redirect_to ); - - $success_count = 0; - $func = new Ssbhesabix_Admin_Functions(); - foreach ($post_ids as $orderId) { - $result = $func->setOrder($orderId); - if ($result) { - $success_count++; - $func->setOrderPayment($orderId); - } - } - - return $redirect_to = add_query_arg( array( - 'submit_selected_orders_invoice_in_hesabix' => '1', - 'success_count' => $success_count, - 'error_msg' => '0' - ), $redirect_to ); - } -//========================================================================================================================= - //Hooks - //Contact - public function ssbhesabix_hook_edit_user(WP_User $user) - { - $wpFaService = new HesabixWpFaService(); - $code = isset($user) ? $wpFaService->getCustomerCodeByWpId($user->ID) : ''; - ?> -
- - - - - -
- -
-
- -
-
-
- getWpFaByHesabixId('customer', $user_hesabix_code); - $wpFa = $wpFaService->getWpFa('customer', $id_customer); - - if (!$wpFaOld || !$wpFa || $wpFaOld->id !== $wpFa->id) { - if ($wpFaOld) - $wpFaService->delete($wpFaOld); - - if ($wpFa) { - $wpFa->idHesabix = $user_hesabix_code; - $wpFaService->update($wpFa); - } else { - $wpFa = new WpFa(); - $wpFa->objType = 'customer'; - $wpFa->idWp = $id_customer; - $wpFa->idHesabix = intval($user_hesabix_code); - $wpFaService->save($wpFa); - } - } - } - - $function = new Ssbhesabix_Admin_Functions(); - - if(get_option('ssbhesabix_contact_automatically_save_in_hesabix') == 'yes') - $function->setContact($id_customer); - } -//========================================================================================================================= - public function ssbhesabix_hook_delete_user($id_customer) - { - $wpFaService = new HesabixWpFaService(); - $id_obj = $wpFaService->getWpFaId('customer', $id_customer); - if ($id_obj != false) { - global $wpdb; - $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id` = $id_obj AND `obj_type` = 'customer'"); - - if (is_object($row)) { - $hesabixApi = new Ssbhesabix_Api(); - $hesabixApi->contactDelete($row->id_hesabix); - } - - global $wpdb; - $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id_ps' => $id_customer)); - - - HesabixLogService::log(array("Customer deleted. Customer ID: $id_customer")); - } - } -//========================================================================================================================= - //Invoice - public function ssbhesabix_hook_order_status_change($id_order, $from, $to) - { - HesabixLogService::writeLogStr("Order Status Hook"); - $function = new Ssbhesabix_Admin_Functions(); - - foreach (get_option('ssbhesabix_invoice_status') as $status) { - - HesabixLogService::writeLogStr("status: $status"); - - if ($status == $to) { - $orderResult = $function->setOrder($id_order); - if ($orderResult) { - // set payment - foreach (get_option('ssbhesabix_payment_status') as $statusPayment) { - if ($statusPayment == $to) - $function->setOrderPayment($id_order); - } - } - } - } - - $values = get_option('ssbhesabix_invoice_return_status'); - if(is_array($values) || is_object($values)) { - foreach ($values as $status) { - if ($status == $to) - $function->setOrder($id_order, 2, $function->getInvoiceCodeByOrderId($id_order)); - } - } - } -//========================================================================================================================= - public function ssbhesabix_hook_new_order($id_order, $order) - { - HesabixLogService::writeLogStr("New Order Hook"); - $function = new Ssbhesabix_Admin_Functions(); - $orderStatus = wc_get_order($id_order)->get_status(); - $orderItems = $order->get_items(); - - foreach (get_option('ssbhesabix_invoice_status') as $status) { - - HesabixLogService::writeLogStr("status: $status"); - - if ($status == $orderStatus) { - $orderResult = $function->setOrder($id_order, 0, null, $orderItems); - if ($orderResult) { - // set payment - foreach (get_option('ssbhesabix_payment_status') as $statusPayment) { - if ($statusPayment == $orderStatus) - $function->setOrderPayment($id_order); - } - } - } - } - - HesabixLogService::log(array($orderStatus)); - - $values = get_option('ssbhesabix_invoice_return_status'); - if(is_array($values) || is_object($values)) { - foreach ($values as $status) { - if ($status == $orderStatus) - $function->setOrder($id_order, 2, $function->getInvoiceCodeByOrderId($id_order), $orderItems); - } - } - } -//========================================================================================================================= - public function ssbhesabix_hook_payment_confirmation($id_order, $from, $to) - { - foreach (get_option('ssbhesabix_payment_status') as $status) { - if ($status == $to) { - $function = new Ssbhesabix_Admin_Functions(); - $function->setOrderPayment($id_order); - } - } - } - - //Item - private $call_time = 1; -//========================================================================================================================= - public function ssbhesabix_hook_new_product($id_product) - { -// if (get_option("ssbhesabix_inside_product_edit", 0) === 1) -// return; - - if ($this->call_time === 1) { - $this->call_time++; - return; - } else { - $this->call_time = 1; - } - - if (get_option("ssbhesabix_do_not_submit_product_automatically", "no") === "yes") return; - $function = new Ssbhesabix_Admin_Functions(); - $function->setItems(array($id_product)); - } -//========================================================================================================================= - public function ssbhesabix_hook_save_product_variation($id_attribute) - { - - HesabixLogService::writeLogStr("ssbhesabix_hook_save_product_variation"); - - if (get_option("ssbhesabix_do_not_submit_product_automatically", "no") === "yes" || get_option("ssbhesabix_do_not_submit_product_automatically", "no") == "1") { - //change hesabix item code - $variable_field_id = "ssbhesabix_hesabix_item_code_" . $id_attribute; - $code = $_POST[$variable_field_id]; - $id_product = $_POST['product_id']; - - if ($code === "") - return; - - if (isset($code)) { - global $wpdb; - $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_hesabix` = " . $code . " AND `obj_type` = 'product'"); - - if (is_object($row)) { - if ($row->id_ps == $id_product && $row->id_ps_attribute == $id_attribute) { - return false; - } - - echo '

' . __('The new Item code already used for another Item', 'ssbhesabix') . '

'; - - HesabixLogService::log(array("The new Item code already used for another Item. Product ID: $id_product")); - } else { - $row2 = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps` = $id_product AND `obj_type` = 'product' AND `id_ps_attribute` = $id_attribute"); - - if (is_object($row2)) { - $wpdb->update($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$code, - ), array( - 'id_ps' => $id_product, - 'id_ps_attribute' => $id_attribute, - 'obj_type' => 'product', - )); - } else if ((int)$code !== 0) { - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$code, - 'id_ps' => (int)$id_product, - 'id_ps_attribute' => $id_attribute, - 'obj_type' => 'product', - )); - } - } - } - - //add attribute if not exists - $func = new Ssbhesabix_Admin_Functions(); - $wpFaService = new HesabixWpFaService(); - $code = $wpFaService->getProductCodeByWpId($id_product, $id_attribute); - if ($code == null) { - $func->setItems(array($id_product)); - } - } - } -//========================================================================================================================= - //ToDo: check why base product is not deleted - public function ssbhesabix_hook_delete_product($id_product) - { - - HesabixLogService::writeLogStr("Product Delete Hook"); - - $func = new Ssbhesabix_Admin_Functions(); - $wpFaService = new HesabixWpFaService(); - - $hesabixApi = new Ssbhesabix_Api(); - global $wpdb; - - $variations = $func->getProductVariations($id_product); - if ($variations != false) { - foreach ($variations as $variation) { - $id_attribute = $variation->get_id(); - $code = $wpFaService->getProductCodeByWpId($id_product, $id_attribute); - if ($code != false) { - $hesabixApi->itemDelete($code); - $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id_hesabix' => $code, 'obj_type' => 'product')); - - HesabixLogService::log(array("Product variation deleted. Product ID: $id_product-$id_attribute")); - } - } - } - - $code = $wpFaService->getProductCodeByWpId($id_product); - - if ($code != false) { - $hesabixApi->itemDelete($code); - $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id_hesabix' => $code, 'obj_type' => 'product')); - - HesabixLogService::log(array("Product deleted. Product ID: $id_product")); - } - } -//========================================================================================================================= - public function ssbhesabix_hook_delete_product_variation($id_attribute) - { -// $func = new Ssbhesabix_Admin_Functions(); - - $hesabixApi = new Ssbhesabix_Api(); - global $wpdb; - $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps_attribute` = $id_attribute AND `obj_type` = 'product'"); - - if (is_object($row)) { - $hesabixApi->itemDelete($row->id_hesabix); - - $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id' => $row->id)); - - HesabixLogService::log(array("Product variation deleted. Product ID: $row->id_ps-$id_attribute")); - } - } -//========================================================================================================================= - public function ssbhesabix_hook_product_options_general_product_data() - { - $wpFaService = new HesabixWpFaService(); - $value = isset($_GET['post']) ? $wpFaService->getProductCodeByWpId($_GET['post']) : ''; - $args = array( - 'id' => 'ssbhesabix_hesabix_item_code_0', - 'label' => __('Hesabix base item code', 'ssbhesabix'), - 'desc_tip' => true, - 'description' => __('The base Item code of this product in Hesabix, if you want to map this product to another item in Hesabix, enter the new Item code.', 'ssbhesabix'), - 'value' => $value, - 'type' => 'number', - ); - woocommerce_wp_text_input($args); - } -//========================================================================================================================= - public function ssbhesabix_hook_process_product_meta($post_id) - { - $itemCode = isset($_POST['ssbhesabix_hesabix_item_code_0']) ? $_POST['ssbhesabix_hesabix_item_code_0'] : ''; - - if ($itemCode === "") - return; - - if (isset($itemCode)) { - global $wpdb; - $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_hesabix` = " . $itemCode . " AND `obj_type` = 'product'"); - - if (is_object($row)) { - //ToDo: show error to customer in BO - echo '

' . __('The new Item code already used for another Item', 'ssbhesabix') . '

'; - - HesabixLogService::log(array("The new Item code already used for another Item. Product ID: $post_id")); - } else { - $row2 = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps` = $post_id AND `obj_type` = 'product' AND `id_ps_attribute` = 0"); - if (is_object($row2)) { - $wpdb->update($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$itemCode, - ), array( - 'id_ps' => $post_id, - 'id_ps_attribute' => 0, - 'obj_type' => 'product', - )); - } else if ((int)$itemCode !== 0) { - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$itemCode, - 'id_ps' => (int)$post_id, - 'id_ps_attribute' => 0, - 'obj_type' => 'product', - )); - } - } - } - } -//========================================================================================================================= - public function ssbhesabix_hook_product_after_variable_attributes($loop, $variation_data, $variation) - { - $wpFaService = new HesabixWpFaService(); - $value = isset($_POST['product_id']) ? $wpFaService->getProductCodeByWpId($_POST['product_id'], $variation->ID) : ''; - $args = array( - 'id' => 'ssbhesabix_hesabix_item_code_' . $variation->ID, - 'label' => __('Hesabix variable item code', 'ssbhesabix'), - 'desc_tip' => true, - 'description' => __('The variable Item code of this product variable in Hesabix, if you want to map this product to another item in Hesabix, enter the new Item code.', 'ssbhesabix'), - 'value' => $value, - ); - woocommerce_wp_text_input($args); - } -//========================================================================================================================= - /* - * Action - Ajax 'clean log file' from Hesabix/Log tab - * @since 1.0.0 - */ - public function adminCleanLogFileCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - $func = new Ssbhesabix_Admin_Functions(); - $result = $func->cleanLogFile(); - - if ($result) { - $redirect_url = admin_url('admin.php?page=ssbhesabix-option&tab=log&cleanLogResult=true'); - } else { - $redirect_url = admin_url('admin.php?page=ssbhesabix-option&tab=log&cleanLogResult=false'); - } - echo $redirect_url; - - die(); - } - } -//========================================================================================================================= - // custom data tab in edit product page in admin panel - function add_hesabix_product_data_tab($product_data_tabs) - { - $product_data_tabs['hesabix'] = array( - 'label' => __('Hesabix', 'ssbhesabix'), - 'target' => 'panel_product_data_hesabix', - ); - return $product_data_tabs; - } -//========================================================================================================================= - function add_hesabix_product_data_fields() - { - global $woocommerce, $post, $product; - - $funcs = new Ssbhesabix_Admin_Functions(); - $items = array(); - $id_product = $post->ID; -// $product = new WC_Product($id_product); - $product = wc_get_product($id_product); - - if ($product->get_status() === "auto-draft") { - ?> -
- هنوز محصول ذخیره نشده است. -
- پس از ذخیره محصول، در این قسمت می توانید ارتباط محصول و متغیرهای آن با حسابیکس - را مدیریت کنید. -
- get_stock_quantity(); - $items[0]["Id"] = $id_product; - $i = 1; - - $variations = $funcs->getProductVariations($id_product); - if ($variations) { - foreach ($variations as $variation) { - $items[] = ssbhesabixItemService::mapProductVariation($product, $variation, $id_product, false); - $items[$i]["Quantity"] = $variation->get_stock_quantity(); - $items[$i]["Id"] = $variation->get_id(); - $i++; - } - } - - ?> -
- - - - - - - - - - - - - - - - - - - - - -
نام کالاکد در حسابیکسذخیره کدحذف ارتباطبروزرسانی قیمت و موجودیقیمتموجودی
" - id="hesabix-item-" style="width: 75px;" - class="hesabix-item-code" data-id="">" - class="button hesabix-item-save">" - class="button hesabix-item-delete-link">" - class="button button-primary hesabix-item-update">">">
- - - - - -
- - #hesabixID { - width: 5vw; - color: #2271b1; - } - '; - return array_slice($columns, 0, 3, true) + array('hesabixID' => 'کد حسابیکس') + array_slice($columns, 3, count($columns) - 3, true); - } -//====== - function admin_products_hesabixId_column_content( $column ){ - $funcs = new Ssbhesabix_Admin_Functions(); - $items = array(); - $id_product = get_the_ID(); -// $product = new WC_Product($id_product); - $product = wc_get_product($id_product); - - $items[] = ssbhesabixItemService::mapProduct($product, $id_product, false); - $i = 1; - - $variations = $funcs->getProductVariations($id_product); - if ($variations) { - foreach ($variations as $variation) { - $items[] = ssbhesabixItemService::mapProductVariation($product, $variation, $id_product, false); - $i++; - } - } - - echo '
'; - foreach ($items as $item) { - if ( $column == 'hesabixID' ) { - $hesabixId = $item["Code"]; - echo "" . $hesabixId . " " . ""; - } - } - echo '
'; - } -//========================================================================================================================= - function adminChangeProductCodeCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $productId = (int)wc_clean($_POST['productId']); - $attributeId = (int)wc_clean($_POST['attributeId']); - if ($productId == $attributeId) $attributeId = 0; - $code = (int)wc_clean($_POST['code']); - $result = array(); - - if (!$code) { - $result["error"] = true; - $result["message"] = "کد کالا وارد نشده است."; - echo json_encode($result); - die(); - return; - } - - $wpFaService = new HesabixWpFaService(); - $wpFa = $wpFaService->getWpFaByHesabixId('product', $code); - if ($wpFa) { - $result["error"] = true; - $result["message"] = "این کد به کالای دیگری متصل است. \n" . $wpFa->idWp . " - " . $wpFa->idWpAttribute; - echo json_encode($result); - die(); - return; - } - - $api = new Ssbhesabix_Api(); - $response = $api->itemGet($code); - if (!$response->Success) { - $result["error"] = true; - $result["message"] = "کالایی با کد وارد شده در حسابیکس پیدا نشد."; - echo json_encode($result); - die(); - return; - } - - $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); - if ($wpFa) { - $wpFa->idHesabix = $code; - $wpFaService->update($wpFa); - } else { - $wpFa = new WpFa(); - $wpFa->idHesabix = $code; - $wpFa->idWp = $productId; - $wpFa->idWpAttribute = $attributeId; - $wpFa->objType = 'product'; - $wpFaService->save($wpFa); - } - $result["error"] = false; - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - function adminDeleteProductLinkCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - $productId = wc_clean($_POST['productId']); - $attributeId = wc_clean($_POST['attributeId']); - if ($productId == $attributeId) $attributeId = 0; - $result = array(); - - $wpFaService = new HesabixWpFaService(); - $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); - if ($wpFa) { - $wpFaService->delete($wpFa); - HesabixLogService::writeLogStr("حذف ارتباط کالا. کد کالا: " . $productId . " - ". "کد متغیر:". $attributeId); - } - - $result["error"] = false; - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - function adminUpdateProductCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - if (get_option('ssbhesabix_item_update_price', 'no') == 'no' && - get_option('ssbhesabix_item_update_quantity', 'no') == 'no') { - $result["error"] = true; - $result["message"] = "خطا: در تنظیمات افزونه، گزینه های بروزرسانی قیمت و موجودی محصول بر اساس حسابیکس فعال نیستند."; - echo json_encode($result); - die(); - } - - $productId = wc_clean($_POST['productId']); - $attributeId = wc_clean($_POST['attributeId']); - - if (get_option('ssbhesabix_item_update_quantity', 'no') == 'yes') - update_post_meta($attributeId, '_manage_stock', 'yes'); - - if ($productId == $attributeId) $attributeId = 0; - $result = array(); - - $wpFaService = new HesabixWpFaService(); - $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); - if ($wpFa) { - - $api = new Ssbhesabix_Api(); - $warehouse = get_option('ssbhesabix_item_update_quantity_based_on', "-1"); - if ($warehouse == "-1") - $response = $api->itemGet($wpFa->idHesabix); - else { - $response = $api->itemGetQuantity($warehouse, array($wpFa->idHesabix)); - } - - if ($response->Success) { - $item = $warehouse == "-1" ? $response->Result : $response->Result[0]; - $newProps = Ssbhesabix_Admin_Functions::setItemChanges($item); - $result["error"] = false; - $result["newPrice"] = $newProps["newPrice"]; - $result["newQuantity"] = $newProps["newQuantity"]; - } else { - $result["error"] = true; - $result["message"] = "کالا در حسابیکس پیدا نشد."; - } - } - - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - function adminChangeProductsCodeCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - $wpFaService = new HesabixWpFaService(); - - $productId = (int)wc_clean($_POST['productId']); - $itemsData = wc_clean($_POST['itemsData'], true); - $result = array(); - $codes = []; - - foreach ($itemsData as $itemData) { - $attributeId = (int)$itemData["attributeId"]; - $code = (int)$itemData["code"]; - if ($productId == $attributeId) $attributeId = 0; - $codes[] = str_pad($code, 6, "0", STR_PAD_LEFT); - - if (!$code) { - $result["error"] = true; - $result["message"] = "کد کالا وارد نشده است."; - echo json_encode($result); - die(); - return; - } - - $wpFa = $wpFaService->getWpFaByHesabixId('product', $code); - $wpFa2 = $wpFaService->getWpFa('product', $productId, $attributeId); - if ($wpFa && $wpFa2 && $wpFa->id != $wpFa2->id) { - $result["error"] = true; - $result["message"] = "این کد ($code) به کالای دیگری متصل است. \n" . $wpFa->idWp . " - " . $wpFa->idWpAttribute; - echo json_encode($result); - die(); - return; - } - } - - $api = new Ssbhesabix_Api(); - $response = $api->itemGetItemsByCodes(array('values' => $codes)); - if ($response->Success) { - $items = $response->result; - foreach ($codes as $code) { - $found = false; - foreach ($items as $item) { - if ($item->code == $code) - $found = true; - } - if (!$found) { - $result["error"] = true; - $result["message"] = "کالایی با کد $code در حسابیکس پیدا نشد."; - echo json_encode($result); - die(); - return; - } - } - } else { - $result["error"] = true; - $result["message"] = "کالایی با کد وارد شده در حسابیکس پیدا نشد."; - echo json_encode($result); - die(); - return; - } - - - foreach ($itemsData as $itemData) { - $attributeId = (int)$itemData["attributeId"]; - $code = (int)$itemData["code"]; - if ($productId == $attributeId) $attributeId = 0; - - $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); - if ($wpFa) { - $wpFa->idHesabix = $code; - $wpFaService->update($wpFa); - } else { - $wpFa = new WpFa(); - $wpFa->idHesabix = $code; - $wpFa->idWp = $productId; - $wpFa->idWpAttribute = $attributeId; - $wpFa->objType = 'product'; - $wpFaService->save($wpFa); - } - } - - $result["error"] = false; - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - function adminDeleteProductsLinkCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - $productId = wc_clean($_POST['productId']); - $result = array(); - - $wpFaService = new HesabixWpFaService(); - $wpFaService->deleteAll($productId); - HesabixLogService::writeLogStr("حذف ارتباط کالاها. کد کالا: " . $productId); - - $result["error"] = false; - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - function adminUpdateProductAndVariationsCallback() - { - if (is_admin() && (defined('DOING_AJAX') || DOING_AJAX)) { - - if (get_option('ssbhesabix_item_update_price', 'no') == 'no' && - get_option('ssbhesabix_item_update_quantity', 'no') == 'no') { - $result["error"] = true; - $result["message"] = "خطا: در تنظیمات افزونه، گزینه های بروزرسانی قیمت و موجودی محصول بر اساس حسابیکس فعال نیستند."; - echo json_encode($result); - die(); - } - - //Call API - $api = new Ssbhesabix_Api(); - $wpFaService = new HesabixWpFaService(); - - $productId = wc_clean($_POST['productId']); - $productAndCombinations = $wpFaService->getProductAndCombinations($productId); - $result = array(); - if (count($productAndCombinations) == 0) { - $result["error"] = true; - $result["message"] = "هیچ ارتباطی پیدا نشد."; - echo json_encode($result); - die(); - } - $codes = []; - $ssbhesabix_item_update_quantity = get_option('ssbhesabix_item_update_quantity', 'no'); - foreach ($productAndCombinations as $p) { - $codes[] = str_pad($p->idHesabix, 6, "0", STR_PAD_LEFT); - - if ($ssbhesabix_item_update_quantity == 'yes') - update_post_meta($p->idWpAttribute == 0 ? $p->idWp : $p->idWpAttribute, '_manage_stock', 'yes'); - } - - $warehouse = get_option('ssbhesabix_item_update_quantity_based_on', "-1"); - if ($warehouse == "-1") - $response = $api->itemGetItemsByCodes($codes); - else { - $response = $api->itemGetQuantity($warehouse, $codes); - } - - if ($response->Success) { - $items = $warehouse == "-1" ? $response->Result->List : $response->Result; - $newData = []; - $result["error"] = false; - foreach ($items as $item) { - $newProps = Ssbhesabix_Admin_Functions::setItemChanges($item); - $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Code); - $newData[] = array("newPrice" => $newProps["newPrice"], - "newQuantity" => $newProps["newQuantity"], - "attributeId" => $wpFa->idWpAttribute > 0 ? $wpFa->idWpAttribute : $wpFa->idWp); - } - $result["newData"] = $newData; - } else { - $result["error"] = true; - $result["message"] = "کالایی با کد وارد شده در حسابیکس پیدا نشد."; - echo json_encode($result); - die(); - return; - } - - echo json_encode($result); - die(); - } - } -//========================================================================================================================= - function add_additional_fields_to_checkout( $fields ) { - $NationalCode_isActive = get_option('ssbhesabix_contact_NationalCode_checkbox_hesabix'); - $EconomicCode_isActive = get_option('ssbhesabix_contact_EconomicCode_checkbox_hesabix'); - $RegistrationNumber_isActive = get_option('ssbhesabix_contact_RegistrationNumber_checkbox_hesabix'); - $Website_isActive = get_option('ssbhesabix_contact_Website_checkbox_hesabix'); - - $NationalCode_isRequired = get_option('ssbhesabix_contact_NationalCode_isRequired_hesabix'); - $EconomicCode_isRequired = get_option('ssbhesabix_contact_EconomicCode_isRequired_hesabix'); - $RegistrationNumber_isRequired = get_option('ssbhesabix_contact_RegistrationNumber_isRequired_hesabix'); - $Website_isRequired = get_option('ssbhesabix_contact_Website_isRequired_hesabix'); - - //NationalCode - if($NationalCode_isActive == 'yes'){ - $fields['billing']['billing_hesabix_nationalcode'] = array( - 'label' => __('National code', 'ssbhesabix'), - 'placeholder' => __('please enter your National code', 'ssbhesabix'), - 'priority' => 30, - 'required' => (bool) $NationalCode_isRequired, - 'clear' => true, - 'maxlength' => 10, - ); - } - //Economic code - if($EconomicCode_isActive == 'yes'){ - $fields['billing']['billing_hesabix_economiccode'] = array( - 'label' => __('Economic code', 'ssbhesabix'), - 'placeholder' => __('please enter your Economic code', 'ssbhesabix'), - 'priority' => 31, - 'required' => (bool) $EconomicCode_isRequired, - 'clear' => true - ); - } - //Registration Number - if($RegistrationNumber_isActive == 'yes'){ - $fields['billing']['billing_hesabix_registerationnumber'] = array( - 'label' => __('Registration number', 'ssbhesabix'), - 'placeholder' => __('please enter your Registration number', 'ssbhesabix'), - 'priority' => 32, - 'required' => (bool) $RegistrationNumber_isRequired, - 'clear' => true - ); - } - //Website - if($Website_isActive == 'yes'){ - $fields['billing']['billing_hesabix_website'] = array( - 'type' => 'url', - 'label' => __('Website', 'ssbhesabix'), - 'placeholder' => __('please enter your Website address', 'ssbhesabix'), - 'priority' => 33, - 'required' => (bool) $Website_isRequired, - 'clear' => true, - ); - } - if(isset($_POST['billing_hesabix_nationalcode']) || isset($_POST['billing_hesabix_website'])) { - $func = new Ssbhesabix_Admin_Functions(); - $NationalCode = $_POST['billing_hesabix_nationalcode']; - $Website = $_POST['billing_hesabix_website']; - if($NationalCode_isRequired) { - $func->checkNationalCode($NationalCode); - } - - if($Website_isRequired) { - $func->checkWebsite($Website); - } - } - return $fields; - } -//========================================================================================================================= - function show_additional_fields_in_order_detail($order) { - //this function is used to show codes and website in woocommerce orders detail - $orderId = $order->get_id(); - $NationalCode = '_billing_hesabix_nationalcode'; - $EconomicCode = '_billing_hesabix_economiccode'; - $RegistrationNumber = '_billing_hesabix_registerationnumber'; - $Website = '_billing_hesabix_website'; - - $NationalCode_isActive = get_option('ssbhesabix_contact_NationalCode_checkbox_hesabix'); - $EconomicCode_isActive = get_option('ssbhesabix_contact_EconomicCode_checkbox_hesabix'); - $RegistrationNumber_isActive = get_option('ssbhesabix_contact_RegistrationNumber_checkbox_hesabix'); - $Website_isActive = get_option('ssbhesabix_contact_Website_checkbox_hesabix'); - - if($NationalCode_isActive == 'yes') { - echo '

' . __('National code', 'ssbhesabix') . ': ' .'
'. '' . get_post_meta( $orderId, $NationalCode, true ) . '

'; - } - - if($EconomicCode_isActive == 'yes') - echo '

' . __('Economic code', 'ssbhesabix') . ': ' .'
'. '' . get_post_meta( $orderId, $EconomicCode, true ) . '

'; - - if($RegistrationNumber_isActive == 'yes') - echo '

' . __('Registration number', 'ssbhesabix') . ': ' .'
'. '' . get_post_meta( $orderId, $RegistrationNumber, true ) . '

'; - - if($Website_isActive == 'yes') - echo '

' . __('Website', 'ssbhesabix') . ': ' .'
'. '' . get_post_meta( $orderId, $Website, true ) . '

'; - } -//========================================================================================================================= -} diff --git a/admin/css/fontiran.css b/admin/css/fontiran.css deleted file mode 100644 index 14c003c..0000000 --- a/admin/css/fontiran.css +++ /dev/null @@ -1,105 +0,0 @@ -/** -* -* Name: IRANYekan Font -* Version: 3.3 -* Author: Moslem Ebrahimi (moslemebrahimi.com) -* Created on: Sep 17, 2020 -* Updated on: Sep 17, 2020 -* Website: http://fontiran.com -* Copyright: Commercial/Proprietary Software --------------------------------------------------------------------------------------- -فونت ایران یکان یک نرم افزار مالکیتی محسوب می شود. جهت آگاهی از قوانین استفاده از این فونت ها لطفا به وب سایت (فونت ایران دات کام) مراجعه نمایید --------------------------------------------------------------------------------------- -IRANYekan fonts are considered a proprietary software. To gain information about the laws regarding the use of these fonts, please visit www.fontiran.com --------------------------------------------------------------------------------------- -This set of fonts are used in this project under the license: (.....) --------------------------------------------------------------------------------------- -* -**/ -@font-face { - font-family: iranyekan; - font-style: normal; - font-weight: bold; - src: url('../fonts/eot/iranyekanwebbold.eot'); - src: url('../fonts/eot/iranyekanwebbold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('../fonts/woff/iranyekanwebbold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('../fonts/woff2/iranyekanwebbold.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('../fonts/ttf/iranyekanwebbold.ttf') format('truetype'); -} - -@font-face { - font-family: iranyekan; - font-style: normal; - font-weight: 100; - src: url('../fonts/eot/iranyekanwebthin.eot'); - src: url('../fonts/eot/iranyekanwebthin.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('../fonts/woff/iranyekanwebthin.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('../fonts/woff2/iranyekanwebthin.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('../fonts/ttf/iranyekanwebthin.ttf') format('truetype'); -} - -@font-face { - font-family: iranyekan; - font-style: normal; - font-weight: 300; - src: url('../fonts/eot/iranyekanweblight.eot'); - src: url('../fonts/eot/iranyekanweblight.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('../fonts/woff/iranyekanweblight.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('../fonts/woff2/iranyekanweblight.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('../fonts/ttf/iranyekanweblight.ttf') format('truetype'); -} - -@font-face { - font-family: iranyekan; - font-style: normal; - font-weight: normal; - src: url('../fonts/eot/iranyekanwebregular.eot'); - src: url('../fonts/eot/iranyekanwebregular.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('../fonts/woff/iranyekanwebregular.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('../fonts/woff2/iranyekanwebregular.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('../fonts/ttf/iranyekanwebregular.ttf') format('truetype'); -} - -@font-face { - font-family: iranyekan; - font-style: normal; - font-weight: 500; - src: url('../fonts/eot/iranyekanwebmedium.eot'); - src: url('../fonts/eot/iranyekanwebmedium.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('../fonts/woff/iranyekanwebmedium.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('../fonts/woff2/iranyekanwebmedium.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('../fonts/ttf/iranyekanwebmedium.ttf') format('truetype'); -} - -@font-face { - font-family: iranyekan; - font-style: normal; - font-weight: 800; - src: url('../fonts/eot/iranyekanwebextrabold.eot'); - src: url('../fonts/eot/iranyekanwebextrabold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('../fonts/woff/iranyekanwebextrabold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('../fonts/woff2/iranyekanwebextrabold.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('../fonts/ttf/iranyekanwebextrabold.ttf') format('truetype'); -} - -@font-face { - font-family: iranyekan; - font-style: normal; - font-weight: 850; - src: url('../fonts/eot/iranyekanwebblack.eot'); - src: url('../fonts/eot/iranyekanwebblack.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('../fonts/woff/iranyekanwebblack.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('../fonts/woff2/iranyekanwebblack.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('../fonts/ttf/iranyekanwebblack.ttf') format('truetype'); -} - -@font-face { - font-family: iranyekan; - font-style: normal; - font-weight: 900; - src: url('../fonts/eot/iranyekanwebextrablack.eot'); - src: url('../fonts/eot/iranyekanwebextrablack.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ - url('../fonts/woff/iranyekanwebextrablack.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ - url('../fonts/woff2/iranyekanwebextrablack.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ - url('../fonts/ttf/iranyekanwebextrablack.ttf') format('truetype'); -} \ No newline at end of file diff --git a/admin/css/ssbhesabfa-admin.css b/admin/css/ssbhesabfa-admin.css deleted file mode 100644 index fe05fbe..0000000 --- a/admin/css/ssbhesabfa-admin.css +++ /dev/null @@ -1,67 +0,0 @@ -* { - font-family: "Tahoma", "Calibri", sans-serif; -} - -.hand { - cursor: pointer; -} - -.hesabix-tab-icon { - width: 16px; - height: 16px; - margin-left: 10px; -} - -a.nav-tab { - padding: 5px 10px; - font-weight: normal; - border-radius: 7px 7px 0px 0px; - -} - -.hesabix-tab-page-title { - color: dimgray; -} - -.hesabix-f-12 { - font-size: 12pt; -} - -.hesabix-f li { - font-size: 11pt; -} - -.hesabix-header { - background-color: #304967; - box-shadow: 5px 5px 5px #f3f3f3; - padding: 5px; - margin-right: -20px; -} - -.hesabix-header img { - height: 35px; -} - -.hesabix-card { - max-width: none !important; - margin-left: 20px; - background-color: whitesmoke !important; -} - -.hesabix-bold { - font-weight: bold; -} - -.hesabix-plugin-tutorial-chapter { - color: dimgray; - font-weight: bold; - border-bottom: 1px solid silver; - margin-bottom: 5px; - padding-bottom: 10px; - margin-top: 10px; -} - -.hesabix-plugin-tutorial-chapter:hover { - color: dodgerblue; - cursor: pointer; -} diff --git a/admin/index.php b/admin/index.php deleted file mode 100644 index e71af0e..0000000 --- a/admin/index.php +++ /dev/null @@ -1 +0,0 @@ - خروج محصولات...'); - $('#ssbhesabix-export-product-submit i.spinner').show(); - - $('#exportProductsProgress').show(); - $('#exp ortProductsProgressBar').css('width', 0 + '%').attr('aria-valuenow', 0); - - exportProducts(1, 1, 1, 0); - - return false; - }); - }); -//===================================================================================================================== - function exportProducts(batch, totalBatch, total, updateCount) { - const data = { - 'action': 'adminExportProducts', - 'batch': batch, - 'totalBatch': totalBatch, - 'total': total, - 'updateCount': updateCount - }; - $.post(ajaxurl, data, function (response) { - if (response !== 'failed') { - const res = JSON.parse(response); - res.batch = parseInt(res.batch); - if (res.batch < res.totalBatch) { - let progress = (res.batch * 100) / res.totalBatch; - progress = Math.round(progress); - $('#exportProductsProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); - exportProducts(res.batch + 1, res.totalBatch, res.total, res.updateCount); - return false; - } else { - $('#exportProductsProgressBar').css('width', 100 + '%').attr('aria-valuenow', 100); - setTimeout(() => { - top.location.replace(res.redirectUrl); - }, 1000); - return false; - } - } else { - alert('خطا در استخراج محصولات'); - return false; - } - }); - } -//===================================================================================================================== - $(function () { - // AJAX - Import Products - $('#ssbhesabix_import_products').submit(function () { - // show processing status - $('#ssbhesabix-import-product-submit').attr('disabled', 'disabled'); - $('#ssbhesabix-import-product-submit').removeClass('button-primary'); - $('#ssbhesabix-import-product-submit').html(' در حال ورود کالاها از حسابیکس, لطفاً صبر کنید...'); - $('#ssbhesabix-import-product-submit i.spinner').show(); - - $('#importProductsProgress').show(); - $('#importProductsProgressBar').css('width', 0 + '%').attr('aria-valuenow', 0); - - importProducts(1, 1, 1, 0); - - return false; - }); - }); -//===================================================================================================================== - function importProducts(batch, totalBatch, total, updateCount) { - var data = { - 'action': 'adminImportProducts', - 'batch': batch, - 'totalBatch': totalBatch, - 'total': total, - 'updateCount': updateCount - }; - $.post(ajaxurl, data, function (response) { - if ('failed' !== response) { - const res = JSON.parse(response); - res.batch = parseInt(res.batch); - if (res.batch < res.totalBatch) { - let progress = (res.batch * 100) / res.totalBatch; - progress = Math.round(progress); - $('#importProductsProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); - //alert('batch: ' + res.batch + ', totalBatch: ' + res.totalBatch + ', total: ' + res.total); - importProducts(res.batch + 1, res.totalBatch, res.total, res.updateCount); - return false; - } else { - $('#importProductsProgressBar').css('width', 100 + '%').attr('aria-valuenow', 100); - setTimeout(() => { - top.location.replace(res.redirectUrl); - }, 1000); - return false; - } - } else { - alert('خطا در وارد کردن محصولات'); - return false; - } - }); - } -//===================================================================================================================== - $(function () { - // AJAX - Export Products opening quantity - $('#ssbhesabix_export_products_opening_quantity').submit(function () { - // show processing status - $('#ssbhesabix-export-product-opening-quantity-submit').attr('disabled', 'disabled'); - $('#ssbhesabix-export-product-opening-quantity-submit').removeClass('button-primary'); - $('#ssbhesabix-export-product-opening-quantity-submit').html(' استخراج موجودی اول دوره...'); - $('#ssbhesabix-export-product-opening-quantity-submit i.spinner').show(); - - $('#exportProductsOpeningQuantityProgress').show(); - $('#exportProductsOpeningQuantityProgressBar').css('width', 0 + '%').attr('aria-valuenow', 0); - - exportProductsOpeningQuantity(1, 1, 1); - - return false; - }); - }); - - function exportProductsOpeningQuantity(batch, totalBatch, total) { - var data = { - 'action': 'adminExportProductsOpeningQuantity', - 'batch': batch, - 'totalBatch': totalBatch, - 'total': total - }; - $.post(ajaxurl, data, function (response) { - if ('failed' !== response) { - const res = JSON.parse(response); - res.batch = parseInt(res.batch); - if (res.batch < res.totalBatch) { - let progress = (res.batch * 100) / res.totalBatch; - progress = Math.round(progress); - $('#exportProductsOpeningQuantityProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); - exportProductsOpeningQuantity(res.batch + 1, res.totalBatch, res.total); - return false; - } else { - $('#exportProductsOpeningQuantityProgressBar').css('width', 100 + '%').attr('aria-valuenow', 100); - setTimeout(() => { - top.location.replace(res.redirectUrl); - }, 1000); - return false; - } - } else { - alert('خطا در استخراج موجودی اول دوره'); - return false; - } - }); - } -//===================================================================================================================== - $(function () { - // AJAX - Export Customers - $('#ssbhesabix_export_customers').submit(function () { - // show processing status - $('#ssbhesabix-export-customer-submit').attr('disabled', 'disabled'); - $('#ssbhesabix-export-customer-submit').removeClass('button-primary'); - $('#ssbhesabix-export-customer-submit').html(' خروجی مشتریان، لطفاً صبر کنید...'); - $('#ssbhesabix-export-customer-submit i.spinner').show(); - - $('#exportCustomersProgress').show(); - $('#exportCustomersProgressBar').css('width', 0 + '%').attr('aria-valuenow', 0); - - exportCustomers(1, 1, 1, 0); - - return false; - }); - }); - - function exportCustomers(batch, totalBatch, total, updateCount) { - const data = { - 'action': 'adminExportCustomers', - 'batch': batch, - 'totalBatch': totalBatch, - 'total': total, - 'updateCount': updateCount - }; - $.post(ajaxurl, data, function (response) { - if (response !== 'failed') { - const res = JSON.parse(response); - res.batch = parseInt(res.batch); - if (res.batch < res.totalBatch) { - let progress = (res.batch * 100) / res.totalBatch; - progress = Math.round(progress); - $('#exportCustomersProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); - exportCustomers(res.batch + 1, res.totalBatch, res.total, res.updateCount); - return false; - } else { - $('#exportCustomersProgressBar').css('width', 100 + '%').attr('aria-valuenow', 100); - setTimeout(() => { - top.location.replace(res.redirectUrl); - }, 1000); - return false; - } - } else { - alert('خطا در استخراج مشتریان'); - return false; - } - }); - } -//===================================================================================================================== - $(function () { - // AJAX - Sync Changes - $('#ssbhesabix_sync_changes').submit(function () { - // show processing status - $('#ssbhesabix-sync-changes-submit').attr('disabled', 'disabled'); - $('#ssbhesabix-sync-changes-submit').removeClass('button-primary'); - $('#ssbhesabix-sync-changes-submit').html(' همسان سازی تغییرات...'); - $('#ssbhesabix-sync-changes-submit i.spinner').show(); - - var data = { - 'action': 'adminSyncChanges' - }; - - // post it - $.post(ajaxurl, data, function (response) { - if ('failed' !== response) { - var redirectUrl = response; - - /** Debug **/ - // console.log(redirectUrl); - // return false; - - top.location.replace(redirectUrl); - return false; - } else { - alert('خطا در همگام سازی تغییرات'); - return false; - } - }); - /*End Post*/ - return false; - }); - }); -//===================================================================================================================== - $(function () { - // AJAX - Sync Products - $('#ssbhesabix_sync_products').submit(function () { - - // show processing status - $('#ssbhesabix-sync-products-submit').attr('disabled', 'disabled'); - $('#ssbhesabix-sync-products-submit').removeClass('button-primary'); - $('#ssbhesabix-sync-products-submit').html(' همسان سازی محصولات...'); - $('#ssbhesabix-sync-products-submit i.spinner').show(); - - $('#syncProductsProgress').show(); - $('#syncProductsProgressBar').css('width', 0 + '%').attr('aria-valuenow', 0); - - syncProducts(1, 1, 1); - - return false; - }); - }); -//===================================================================================================================== - function syncProducts(batch, totalBatch, total) { - const data = { - 'action': 'adminSyncProducts', - 'batch': batch, - 'totalBatch': totalBatch, - 'total': total - }; - //$.post(URL, DATA, CALLBACK) - $.post(ajaxurl, data, function (response) { - if (response !== 'failed') { - const res = JSON.parse(response); - res.batch = parseInt(res.batch); - if (res.batch < res.totalBatch) { - let progress = (res.batch * 100) / res.totalBatch; - progress = Math.round(progress); - $('#syncProductsProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); - //alert('batch: ' + res.batch + ', totalBatch: ' + res.totalBatch + ', total: ' + res.total); - syncProducts(res.batch + 1, res.totalBatch, res.total); - return false; - } else { - $('#syncProductsProgressBar').css('width', 100 + '%').attr('aria-valuenow', 100); - setTimeout(() => { - top.location.replace(res.redirectUrl); - }, 1000); - return false; - } - } else { - alert('خطا در همگام سازی محصولات'); - return false; - } - }); - } -//===================================================================================================================== - $(function () { - // AJAX - Sync Orders - $('#ssbhesabix_sync_orders').submit(function () { - // show processing status - $('#ssbhesabix-sync-orders-submit').attr('disabled', 'disabled'); - $('#ssbhesabix-sync-orders-submit').removeClass('button-primary'); - $('#ssbhesabix-sync-orders-submit').html(' همسان سازی سفارشات...'); - $('#ssbhesabix-sync-orders-submit i.spinner').show(); - - $('#syncOrdersProgress').show(); - $('#syncOrdersProgressBar').css('width', 0 + '%').attr('aria-valuenow', 0); - - syncOrders(1, 1, 1, 0); - - return false; - }); - }); - - function syncOrders(batch, totalBatch, total, updateCount) { - var date = $('#ssbhesabix_sync_order_date').val(); - var endDate = $('#ssbhesabix_sync_order_end_date').val(); - - const data = { - 'action': 'adminSyncOrders', - 'date': date, - 'endDate': endDate, - 'batch': batch, - 'totalBatch': totalBatch, - 'total': total, - 'updateCount': updateCount, - }; - - $.post(ajaxurl, data, function (response) { - if (response !== 'failed') { - const res = JSON.parse(response); - res.batch = parseInt(res.batch); - if(res.batch) $('#syncOrdersStatistics').html(`
پارت: ${res.batch} از ${res.totalBatch} - تعداد کل: ${res.total}
`); - if (res.batch < res.totalBatch) { - let progress = (res.batch * 100) / res.totalBatch; - progress = Math.round(progress); - $('#syncOrdersProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); - syncOrders(res.batch + 1, res.totalBatch, res.total, res.updateCount); - return false; - } else { - $('#syncOrdersProgressBar').css('width', 100 + '%').attr('aria-valuenow', 100); - setTimeout(() => { - top.location.replace(res.redirectUrl); - }, 1000); - return false; - } - } else { - alert('خطا در همگام سازی سفارشات'); - return false; - } - }); - } -//===================================================================================================================== - $(function () { - // AJAX - Sync Products - $('#ssbhesabix_update_products').submit(function () { - // show processing status - $('#ssbhesabix-update-products-submit').attr('disabled', 'disabled'); - $('#ssbhesabix-update-products-submit').removeClass('button-primary'); - $('#ssbhesabix-update-products-submit').html(' بروزرسانی محصولات...'); - $('#ssbhesabix-update-products-submit i.spinner').show(); - - $('#updateProductsProgress').show(); - $('#updateProductsProgressBar').css('width', 0 + '%').attr('aria-valuenow', 0); - - updateProducts(1, 1, 1); - - return false; - }); - }); -//===================================================================================================================== - function updateProducts(batch, totalBatch, total) { - var data = { - 'action': 'adminUpdateProducts', - 'batch': batch, - 'totalBatch': totalBatch, - 'total': total - }; - $.post(ajaxurl, data, function (response) { - if ('failed' !== response) { - const res = JSON.parse(response); - res.batch = parseInt(res.batch); - if (res.batch < res.totalBatch) { - let progress = (res.batch * 100) / res.totalBatch; - progress = Math.round(progress); - $('#updateProductsProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); - updateProducts(res.batch + 1, res.totalBatch, res.total); - return false; - } else { - $('#updateProductsProgressBar').css('width', 100 + '%').attr('aria-valuenow', 100); - setTimeout(() => { - top.location.replace(res.redirectUrl); - }, 1000); - return false; - } - } else { - alert('خطا در بروزرسانی محصولات'); - return false; - } - }); - } - -//===================================================================================================================== - - // $(function () { - // // AJAX - Sync Products with ID filter - // $('#ssbhesabix_update_products_with_filter').submit(function (e) { - // - // // Show processing status - // var submitButton = $('#ssbhesabix-update-products-with-filter-submit'); - // submitButton.removeClass('button-primary'); - // submitButton.html(' بروزرسانی محصولات...'); - // }); - // }); - - - - $(function () { - // AJAX - Sync Products - $('#ssbhesabix_update_products_with_filter').submit(function () { - let submitButton = $('#ssbhesabix-update-products-with-filter-submit'); - let offset = document.getElementById("ssbhesabix-update-products-offset").value; - let rpp = document.getElementById("ssbhesabix-update-products-rpp").value; - submitButton.removeClass('button-primary'); - submitButton.html(' بروزرسانی محصولات لطفا صبر کنید...'); - $('#ssbhesabix-update-products-with-filter-submit').attr('disabled', 'disabled'); - - updateProductsWithFilter(offset, rpp); - - return false; - }); - }); -//===================================================================================================================== - function updateProductsWithFilter(offset, rpp) { - var data = { - 'action': 'adminUpdateProductsWithFilter', - 'offset': offset, - 'rpp': rpp, - }; - if(offset && rpp) { - $.post(ajaxurl, data, function (response) { - if ('failed' !== response) { - const res = JSON.parse(response); - if(!res.error) { - top.location.replace(res.redirectUrl); - } - } else { - alert('خطا در بروزرسانی محصولات'); - return false; - } - }); - } else { - alert('فیلد ها را به درستی وارد نمایید'); - submitButton.addClass('button-primary'); - submitButton.html('بروزرسانی محصولات در حسابیکس بر اساس فروشگاه در بازه ID مشخص شده'); - $('#ssbhesabix-update-products-with-filter-submit').removeAttr('disabled'); - return false; - } - } - -//===================================================================================================================== - $(function () { - // AJAX - Clean log - $('#ssbhesabix_clean_log').submit(function (e) { - // show processing status - $('#ssbhesabix-log-clean-submit').attr('disabled', 'disabled'); - $('#ssbhesabix-log-clean-submit').removeClass('button-primary'); - $('#ssbhesabix-log-clean-submit').html(' پاک کردن فایل لاگ، لطفاً صبر کنید...'); - $('#ssbhesabix-log-clean-submit i.spinner').show(); - - var data = { - 'action': 'adminCleanLogFile' - }; - - // post it - $.post(ajaxurl, data, function (response) { - if ('failed' !== response) { - var redirectUrl = response; - - /** Debug **/ - // console.log(redirectUrl); - // return false; - - top.location.replace(redirectUrl); - return false; - } else { - alert('خطا در پاکسازی فایل لاگ'); - return false; - } - }); - /*End Post*/ - return false; - }); - }); -//===================================================================================================================== - $(function () { - // AJAX - Sync Products Manually - $('#ssbhesabix_sync_products_manually').submit(function () { - // show processing status - $('#ssbhesabix_sync_products_manually-submit').attr('disabled', 'disabled'); - $('#ssbhesabix_sync_products_manually-submit').removeClass('button-primary'); - $('#ssbhesabix_sync_products_manually-submit').html(' ذخیره کردن اطلاعات...'); - $('#ssbhesabix_sync_products_manually i.spinner').show(); - - const inputArray = []; - const inputs = $('.code-input'); - console.log(inputs); - for (var n = 0; n < inputs.length; n++) { - var i = inputs[n]; - console.log(i); - const obj = { - id: $(i).attr('id'), - hesabix_id: $(i).val(), - parent_id: $(i).attr('data-parent-id') - } - inputArray.push(obj); - } - - const page = $('#pageNumber').val(); - const rpp = $('#goToPage').attr('data-rpp'); - - var data = { - 'action': 'adminSyncProductsManually', - 'data': JSON.stringify(inputArray), - 'page': page, - 'rpp': rpp - }; - - // post it - $.post(ajaxurl, data, function (response) { - if ('failed' !== response) { - var redirectUrl = response; - - /** Debug **/ - // console.log(redirectUrl); - // return false; - - top.location.replace(redirectUrl); - return false; - } else { - alert('خطا در ذخیره اطلاعات'); - return false; - } - }); - /*End Post*/ - return false; - }); - - $("#goToPage").click(function () { - const page = $('#pageNumber').val(); - const rpp = $('#goToPage').attr('data-rpp'); - window.location.href = "?page=hesabix-sync-products-manually&p=" + page + "&rpp=" + rpp; - }); - - $("#show-tips-btn").click(function () { - $('#tips-alert').removeClass('d-none'); - $('#tips-alert').addClass('d-block'); - }); - - $("#hide-tips-btn").click(function () { - $('#tips-alert').removeClass('d-block'); - $('#tips-alert').addClass('d-none'); - }); - }); - - $(".btn-submit-invoice").on( "click", function() { - var orderId = $(this).attr("data-order-id"); - - var btnEl = $('.btn-submit-invoice[data-order-id=' + orderId + ']'); - - btnEl.attr('aria-disabled', true); - btnEl.addClass('disabled'); - btnEl.html('ثبت فاکتور...'); - //btnEl.show(); - - submitInvoice(orderId); - }); -//===================================================================================================================== - function submitInvoice(orderId) { - var data = { - 'action': 'adminSubmitInvoice', - 'orderId': orderId - }; - $.post(ajaxurl, data, function (response) { - if ('failed' !== response) { - const res = JSON.parse(response); - // refresh page - location.reload(); - } else { - alert('خطا در ثبت فاکتور'); - return false; - } - }); - } - - // change business warning - var oldApiKey = ''; - $("#changeBusinessWarning").hide(); - - $("#ssbhesabix_account_api").focusin( function () { - oldApiKey = $("#ssbhesabix_account_api" ).val(); - }); - $("#ssbhesabix_account_api").focusout( function () { - var newApiKey = $("#ssbhesabix_account_api" ).val(); - if(oldApiKey != '' && oldApiKey != newApiKey) { - $("#changeBusinessWarning").show(); - } - }); -//===================================================================================================================== - $(function () { - // AJAX - clear all plugin data - $('#hesabix-clear-plugin-data').click(function () { - if (confirm('هشدار: با انجام این عملیات کلیه اطلاعات افزونه شامل روابط بین کالاها، مشتریان و فاکتور ها و همینطور تنظیمات افزونه حذف می گردد.' + - 'آیا از انجام این عملیات مطمئن هستید؟')) { - $('#hesabix-clear-plugin-data').addClass('disabled'); - $('#hesabix-clear-plugin-data').html('حذف دیتای افزونه...'); - var data = { - 'action': 'adminClearPluginData' - }; - $.post(ajaxurl, data, function (response) { - $('#hesabix-clear-plugin-data').removeClass('disabled'); - $('#hesabix-clear-plugin-data').html('حذف دیتای افزونه'); - if ('failed' !== response) { - alert('دیتای افزونه با موفقیت حذف شد.'); - return false; - } else { - alert('خطا در هنگام حذف دیتای افزونه.'); - return false; - } - }); - } else { - // Do nothing! - } - return false; - }); - - $('#hesabix-install-plugin-data').click(function () { - if (confirm('با انجام این عملیات جدول افزونه در دیتابیس وردپرس ایجاد' + - ' و تنظیمات پیش فرض افزونه تنظیم می گردد.' + - ' آیا از انجام این عملیات مطمئن هستید؟')) { - $('#hesabix-install-plugin-data').addClass('disabled'); - $('#hesabix-install-plugin-data').html('نصب دیتای افزونه...'); - var data = { - 'action': 'adminInstallPluginData' - }; - $.post(ajaxurl, data, function (response) { - $('#hesabix-install-plugin-data').removeClass('disabled'); - $('#hesabix-install-plugin-data').html('نصب دیتای افزونه'); - if ('failed' !== response) { - alert('دیتای افزونه با موفقیت نصب شد.'); - return false; - } else { - alert('خطا در هنگام نصب دیتای افزونه.'); - return false; - } - }); - } else { - // Do nothing! - } - return false; - }); - }); -//===================================================================================================================== - $(function () { - //SAVE - $(".hesabix-item-save").on('click', function (){ - const productId = $("#panel_product_data_hesabix").data('product-id'); - const attributeId = $(this).data('id'); - const code = $("#hesabix-item-" + attributeId).val(); - var data = { - 'action': 'adminChangeProductCode', - 'productId': productId, - 'attributeId': attributeId, - 'code': code, - }; - $(this).prop('disabled', true); - const _this = this; - $.post(ajaxurl, data, function (response) { - $(_this).prop('disabled', false); - if ('failed' !== response) { - const res = JSON.parse(response); - alert(res.error ? res.message : 'کد کالای متصل با موفقیت تغییر کرد.'); - if(productId === attributeId) - $("#ssbhesabix_hesabix_item_code_0").val(code); - else - $("#ssbhesabix_hesabix_item_code_" + attributeId).val(code); - return false; - } else { - alert('خطا در هنگام تغییر کد کالای متصل.'); - return false; - } - }); - }); - //DELETE LINK - $(".hesabix-item-delete-link").on('click', function (){ - const productId = $("#panel_product_data_hesabix").data('product-id'); - const attributeId = $(this).data('id'); - var data = { - 'action': 'adminDeleteProductLink', - 'productId': productId, - 'attributeId': attributeId - }; - $(this).prop('disabled', true); - const _this = this; - $.post(ajaxurl, data, function (response) { - $(_this).prop('disabled', false); - if ('failed' !== response) { - const res = JSON.parse(response); - $("#hesabix-item-" + attributeId).val(''); - if(productId === attributeId) - $("#ssbhesabix_hesabix_item_code_0").val(''); - else - $("#ssbhesabix_hesabix_item_code_" + attributeId).val(''); - setTimeout(function (){ - alert(res.error ? res.message : 'ارتباط محصول با موفقیت حذف شد'); - }, 100); - return false; - } else { - alert('خطا در هنگام حذف ارتباط'); - return false; - } - }); - }); - //UPDATE - $(".hesabix-item-update").on('click', function (){ - const productId = $("#panel_product_data_hesabix").data('product-id'); - const attributeId = $(this).data('id'); - var data = { - 'action': 'adminUpdateProduct', - 'productId': productId, - 'attributeId': attributeId - }; - $(this).prop('disabled', true); - const _this = this; - $.post(ajaxurl, data, function (response) { - $(_this).prop('disabled', false); - if ('failed' !== response) { - const res = JSON.parse(response); - if(res.newPrice != null) - $("#hesabix-item-price-" + attributeId).text(res.newPrice); - if(res.newQuantity != null) - $("#hesabix-item-quantity-" + attributeId).text(res.newQuantity); - if(res.error) - alert(res.message); - return false; - } else { - alert('خطا در هنگام بروزرسانی محصول'); - return false; - } - }); - }); - //SAVE ALL - $("#hesabix-item-save-all").on('click', function (){ - const productId = $("#panel_product_data_hesabix").data('product-id'); - const itemsCode = $(".hesabix-item-code"); - const itemsData = []; - for (let i = 0; i < itemsCode.length; i++) { - const item = itemsCode[i]; - const attributeId = $(item).data('id'); - const code = $(item).val(); - itemsData.push({attributeId: attributeId, code: code}); - } - - var data = { - 'action': 'adminChangeProductsCode', - 'productId': productId, - 'itemsData': itemsData - }; - $(this).prop('disabled', true); - const _this = this; - $.post(ajaxurl, data, function (response) { - $(_this).prop('disabled', false); - if ('failed' !== response) { - const res = JSON.parse(response); - alert(res.error ? res.message : 'کد کالاهای متصل با موفقیت تغییر کرد.'); - location.reload(); - return false; - } else { - alert('خطا در هنگام تغییر کد کالاهای متصل'); - return false; - } - }); - }); - //DELETE - $("#hesabix-item-delete-link-all").on('click', function (){ - const productId = $("#panel_product_data_hesabix").data('product-id'); - var data = { - 'action': 'adminDeleteProductsLink', - 'productId': productId - }; - $(this).prop('disabled', true); - const _this = this; - $.post(ajaxurl, data, function (response) { - $(_this).prop('disabled', false); - if ('failed' !== response) { - const res = JSON.parse(response); - const itemsCode = $(".hesabix-item-code"); - for (let i = 0; i < itemsCode.length; i++) { - const item = itemsCode[i]; - $(item).val(''); - } - $('[id^="ssbhesabix_hesabix_item_code_"]').val(''); - setTimeout(function (){ - alert(res.error ? res.message : 'ارتباط محصولات با موفقیت حذف شد.'); - }, 100); - return false; - } else { - alert('خطا در هنگام حذف ارتباط'); - return false; - } - }); - }); - //UPDATE ALL - $("#hesabix-item-update-all").on('click', function (){ - const productId = $("#panel_product_data_hesabix").data('product-id'); - var data = { - 'action': 'adminUpdateProductAndVariations', - 'productId': productId - }; - $(this).prop('disabled', true); - const _this = this; - $.post(ajaxurl, data, function (response) { - $(_this).prop('disabled', false); - if ('failed' !== response) { - const res = JSON.parse(response); - if(res.error) - { - alert(res.message); - return false; - } - for (let i = 0; i < res.newData.length; i++) { - if(res.newData[i].newPrice != null) - $("#hesabix-item-price-" + res.newData[i].attributeId).text(res.newData[i].newPrice); - if(res.newData[i].newQuantity != null) - $("#hesabix-item-quantity-" + res.newData[i].attributeId).text(res.newData[i].newQuantity); - } - return false; - } else { - alert('خطا در هنگام بروزرسانی محصول'); - return false; - } - }); - }); - }); -//===================================================================================================================== - $(function (){ - let radio = $('input:radio[name="addFieldsRadio"]'); - let radioChecked = $('input:radio[name="addFieldsRadio"]:checked'); - let textInput = $('.contact_text_input'); - - if(radioChecked.val() === '2'){ - textInput.prop( "disabled", false ); - }else { - textInput.prop( "disabled", true ); - } - $(radio).on('click',function (){ - if($(this).val() === '2'){ - textInput.prop( "disabled", false ); - }else { - textInput.prop( "disabled", true ); - } - }); - - }); -}); -//===================================================================================================================== -function hesabixTutorialJumpTo(time) { - let vidEl = document.getElementById('hesabix-tutorial-video'); - vidEl.play(); - vidEl.pause(); - vidEl.currentTime = time; - vidEl.play(); -} diff --git a/admin/partials/hesabix-admin-display.php b/admin/partials/hesabix-admin-display.php new file mode 100644 index 0000000..fb26275 --- /dev/null +++ b/admin/partials/hesabix-admin-display.php @@ -0,0 +1,297 @@ +get_results( + "SELECT id_hesabix + FROM {$wpdb->prefix}hesabix + WHERE obj_type = 'product' + GROUP BY id_hesabix + HAVING COUNT(id_hesabix) > 1" + ); + + $ids = array(); + + foreach ($rows as $row) + $ids[] = $row->id_hesabix; + + $idsStr = implode(',', $ids); + + $rows = $wpdb->get_results( + $wpdb->prepare( + "SELECT * + FROM {$wpdb->prefix}hesabix + WHERE obj_type = 'product' + AND id_hesabix IN ($idsStr) + ORDER BY id_hesabix" + ) + ); + + $i = 0; + + self::hesabix_plugin_header(); + ?> +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
#
id_hesabix; ?>id_ps; ?>id_ps_attribute; ?>
+
+ +
+
+ +
+ + +
+ +
+ get_results( + $wpdb->prepare( + "SELECT post.ID, post.post_title, post.post_parent, post.post_excerpt, wc.sku + FROM {$wpdb->posts} AS post + LEFT OUTER JOIN {$wpdb->prefix}wc_product_meta_lookup AS wc + ON post.ID = wc.product_id + WHERE post.post_type IN ('product', 'product_variation') + AND post.post_status IN ('publish', 'private') + ORDER BY post.post_title ASC + LIMIT %d, %d", + $offset, + $rpp + ) + ); + + $totalCount = $wpdb->get_var( + "SELECT COUNT(*) + FROM {$wpdb->posts} AS post + LEFT OUTER JOIN {$wpdb->prefix}wc_product_meta_lookup AS wc + ON post.ID = wc.product_id + WHERE post.post_type IN ('product', 'product_variation') + AND post.post_status IN ('publish', 'private')" + ); + + $links = $wpdb->get_results( + "SELECT * + FROM {$wpdb->prefix}hesabix + WHERE obj_type = 'product'" + ); + + foreach ($rows as $r) { + if ($r->post_excerpt) + $r->post_title = $r->post_title . ' [' . $r->post_excerpt . ']'; + } + + foreach ($links as $link) { + foreach ($rows as $r) { + if ($r->ID == $link->id_ps && $link->id_ps_attribute == 0) { + $r->id_hesabix = $link->id_hesabix; + } else if ($r->ID == $link->id_ps_attribute) { + $r->id_hesabix = $link->id_hesabix; + } + } + } + + return array("data" => $rows, "totalCount" => $totalCount); + } + + public static function hesabix_plugin_page() + { + $iconsArray = [ + 'home', + 'cog', + 'box-open', + 'users', + 'file-invoice-dollar', + 'sync-alt', + 'file-alt', + 'cog' + ]; + if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) { + $setting_tabs = apply_filters('hesabix_setting_tab', array( + 'home' => __('Home', 'hesabix'), + 'api' => __('API', 'hesabix'), + 'catalog' => __('Catalog', 'hesabix'), + 'customers' => __('Customers', 'hesabix'), + 'invoice' => __('Invoice', 'hesabix'), + 'sync' => __('Sync', 'hesabix'), + 'log' => __('Log', 'hesabix'), + 'extra' => __('Extra Settings', 'hesabix') + )); + $current_tab = (isset($_GET['tab'])) ? wc_clean($_GET['tab']) : 'home'; + ?> +
+
+ + +
+ $label) { + $iconUrl = HESABIX_PLUGIN_URL . "assets/img/icons/$iconsArray[$i].svg"; + $i++; + $active_class = ($current_tab == $name) ? 'active' : ''; + echo ''; + } + ?> +
+ +
+ $setting_tabvalue) { + switch ($setting_tabkey) { + case $current_tab: + do_action('hesabix_' . $setting_tabkey . '_setting_save_field'); + do_action('hesabix_' . $setting_tabkey . '_setting'); + break; + } + } + ?> +
+
+
+ +
+
+
+ + + +
+ +
+
+
+
+
+ +
+ +
+

+

+
+ + + + + + + + +
+
+
+ +
+ + + + + + + +
+
+
+ format($date); + return $this->convertPersianDigitsToEnglish($formatted); + } catch (Exception $e) { + return ''; + } + } + + public static function isDateInFiscalYear($date) + { + $hesabixApi = new Hesabix_Api(); + $fiscalYear = $hesabixApi->settingGetFiscalYear(); + if (is_object($fiscalYear)) { + + if ($fiscalYear->Success) { + $fiscalYearStartTimeStamp = strtotime($fiscalYear->Result->StartDate); + $fiscalYearEndTimeStamp = strtotime($fiscalYear->Result->EndDate); + $dateTimeStamp = strtotime($date); + + if ($dateTimeStamp >= $fiscalYearStartTimeStamp && $dateTimeStamp <= $fiscalYearEndTimeStamp) { + return 1; + } else { + return __('date is not in fiscal year', 'hesabix'); + } + } else { + HesabixLogService::log(array("Cannot get FiscalDate. Error Code: $fiscalYear->ErrroCode. Error Message: $fiscalYear->ErrorMessage")); + return __('Cannot connect to Hesabix for get FiscalDate.', 'hesabix'); + } + } else { + return __('Cannot connect to Hesabix for get FiscalDate.', 'hesabix'); + } + HesabixLogService::log(array("Cannot connect to Hesabix for get FiscalDate.")); + return __('Cannot connect to Hesabix for get FiscalDate.', 'hesabix'); + } + + public function getProductVariations($id_product) + { + if (!isset($id_product)) { + return false; + } + $product = wc_get_product($id_product); + + if (is_bool($product)) + return false; + if ($product->is_type('variable')) { + $children = $product->get_children($args = '', $output = OBJECT); + $variations = array(); + foreach ($children as $value) { + $product_variatons = new WC_Product_Variation($value); + if ($product_variatons->exists()) { + $variations[] = $product_variatons; + } + } + return $variations; + } + return false; + } + + public function setItems($id_product_array) + { + if (!isset($id_product_array) || $id_product_array[0] == null) + return false; + if (is_array($id_product_array) && empty($id_product_array)) + return true; + + $items = array(); + foreach ($id_product_array as $id_product) { + $product = new WC_Product($id_product); + if ($product->get_status() === "draft") + continue; + + $items[] = HesabixItemService::mapProduct($product, $id_product, false); + + $variations = $this->getProductVariations($id_product); + if ($variations) + foreach ($variations as $variation) + $items[] = HesabixItemService::mapProductVariation($product, $variation, $id_product, false); + } + + if (count($items) === 0) + return false; + if (!$this->saveItems($items)) + return false; + return true; + } + + public function saveItems($items) + { + $hesabix = new Hesabix_Api(); + $wpFaService = new HesabixWpFaService(); + + $response = $hesabix->itemBatchSave($items); + if ($response->Success) { + foreach ($response->createdItems as $item) + $wpFaService->saveProduct($item); + return true; + } else { + HesabixLogService::log(array("Cannot add/update Hesabix items. Error Code: " . (string) $response->ErrorCode . ". Error Message: $response->ErrorMessage.")); + return false; + } + } + + public function getContactCodeByCustomerId($id_customer) + { + if (!isset($id_customer)) { + return false; + } + + global $wpdb; + + + $row = $wpdb->get_row( + $wpdb->prepare( + "SELECT `id_hesabix` FROM {$wpdb->prefix}hesabix + WHERE `id_ps` = %d AND `obj_type` = 'customer'", + $id_customer + ) + ); + + if (is_object($row)) { + return $row->id_hesabix; + } else { + return null; + } + } + + public function setContact($id_customer, $type = 'first', $id_order = '') + { + if (!isset($id_customer)) + return false; + + $code = $this->getContactCodeByCustomerId($id_customer); + + $hesabixCustomer = HesabixCustomerService::mapCustomer($code, $id_customer, $type, $id_order); + + $hesabix = new Hesabix_Api(); + $response = $hesabix->contactSave($hesabixCustomer); + + if ($response->Success) { + $wpFaService = new HesabixWpFaService(); + $wpFaService->saveCustomer($response->person); + return $response->person->code; + } else { + HesabixLogService::log(array("Cannot add/update customer. Error Code: " . (string) $response->ErrroCode . ". Error Message: " . (string) $response->ErrorMessage . ". Customer ID: $id_customer")); + return false; + } + } + + public function setGuestCustomer($id_order) + { + if (!isset($id_order)) + return false; + + + $order = wc_get_order($id_order); + + $contactCode = $this->getContactCodeByPhoneOrEmail($order->get_billing_phone(), $order->get_billing_email()); + + $hesabixCustomer = HesabixCustomerService::mapGuestCustomer($contactCode, $id_order); + + $hesabix = new Hesabix_Api(); + $response = $hesabix->contactSave($hesabixCustomer); + + if ($response->Success) { + $wpFaService = new HesabixWpFaService(); + $wpFaService->saveCustomer($response->Result); + return (int) $response->Result->code; + } else { + HesabixLogService::log(array("Cannot add/update contact. Error Code: " . (string) $response->ErrroCode . ". Error Message: " . (string) $response->ErrorMessage . ". Customer ID: Guest Customer")); + return false; + } + } + + public function getContactCodeByPhoneOrEmail($phone, $email) + { + if (!$email && !$phone) + return null; + + $hesabix = new Hesabix_Api(); + $response = $hesabix->contactGetByPhoneOrEmail($phone, $email); + + if (is_object($response)) { + if ($response->Success && $response->Result->TotalCount > 0) { + $contact_obj = $response->Result->List; + + if (!$contact_obj[0]->code || $contact_obj[0]->code == '0' || $contact_obj[0]->code == '000000') + return null; + + foreach ($contact_obj as $contact) { + if (($contact->phone == $phone || $contact->mobile = $phone) && $contact->email == $email) + return (int) $contact->code; + } + foreach ($contact_obj as $contact) { + if ($phone && $contact->phone == $phone || $contact->mobile = $phone) + return (int) $contact->code; + } + foreach ($contact_obj as $contact) { + if ($email && $contact->email == $email) + return (int) $contact->code; + } + return null; + } + } else { + HesabixLogService::log(array("Cannot get Contact list. Error Message: (string)$response->ErrorMessage. Error Code: (string)$response->ErrorCode.")); + } + + return null; + } + + private function formatInvoiceItems($products) + { + $wpFaService = new HesabixWpFaService(); + $items = []; + foreach ($products as $product) { + $wcProduct = $product['variation_id'] + ? wc_get_product($product['variation_id']) + : wc_get_product($product['product_id']); + + $product_id = $product['product_id']; + $code = $wpFaService->getProductCodeByWpId($product_id, $product['variation_id']); + $uid = $wpFaService->getProductUidByCode($code); + if (!$code) + continue; + if (!$uid) + continue; + + + if ($wcProduct->is_on_sale() && get_option('hesabix_set_special_sale_as_discount') === 'yes') { + $unit_price = $this->getPriceInHesabixDefaultCurrency($wcProduct->get_regular_price()); + $discountAmount = $this->getPriceInHesabixDefaultCurrency($wcProduct->get_regular_price() - $wcProduct->get_sale_price()); + $discountAmount *= $product['quantity']; + $total = $this->getPriceInHesabixDefaultCurrency($product['total']); + } else { + $unit_price = $this->getPriceInHesabixDefaultCurrency($product['subtotal'] / $product['quantity']); + $total = $this->getPriceInHesabixDefaultCurrency($product['total']); + $discountAmount = $this->getPriceInHesabixDefaultCurrency($product['subtotal'] - $product['total']); + } + + $items[] = [ + 'name' => [ + 'id' => $uid, + 'name' => $product['name'], + 'code' => $code, + 'priceSell' => (float) $unit_price, + ], + 'count' => (int) $product['quantity'], + 'price' => (float) $unit_price, + 'discountType' => 'percent', + 'discountPercent' => 0, + 'discountAmount' => (float) $discountAmount, + 'description' => '', + 'showPercentDiscount' => true, + 'total' => (float) $total, + 'tax' => (float) $this->getPriceInHesabixDefaultCurrency($product['total_tax']) + ]; + } + return $items; + } + + public function setOrder($id_order, $orderType = 0, $reference = null) + { + if (!isset($id_order)) { + return false; + } + + $wpFaService = new HesabixWpFaService(); + + $number = $this->getInvoiceNumberByOrderId($id_order); + if (!$number) { + $number = null; + if ($orderType == 2) { + return false; + } + } + + $order = wc_get_order($id_order); + + $dokanOption = get_option("hesabix_invoice_dokan", 0); + + if ($dokanOption && is_plugin_active("dokan-lite/dokan.php")) { + $orderCreated = $order->get_created_via(); + if ($dokanOption == 1 && $orderCreated !== 'checkout') + return false; + else if ($dokanOption == 2 && $orderCreated === 'checkout') + return false; + } + + $id_customer = $order->get_customer_id(); + if ($id_customer !== 0) { + + $contactCode = $this->setContact($id_customer, 'first', $id_order); + + if ($contactCode == null) { + if (!$contactCode) { + return false; + } + } + HesabixLogService::writeLogStr("order ID " . $id_order); + if (get_option('hesabix_contact_address_status') == 2) { + $this->setContact($id_customer, 'billing', $id_order); + } elseif (get_option('hesabix_contact_address_status') == 3) { + $this->setContact($id_customer, 'shipping', $id_order); + } + } else { + $contactCode = $this->setGuestCustomer($id_order); + if (!$contactCode) { + return false; + } + } + + global $notDefinedProductID; + $notDefinedItems = array(); + $products = $order->get_items(); + foreach ($products as $product) { + if ($product['product_id'] == 0) + continue; + $itemCode = $wpFaService->getProductCodeByWpId($product['product_id'], $product['variation_id']); + if ($itemCode == null) { + $notDefinedItems[] = $product['product_id']; + } + } + + if (!empty($notDefinedItems)) { + if (!$this->setItems($notDefinedItems)) { + HesabixLogService::writeLogStr("Cannot add/update Invoice. Failed to set products. Order ID: $id_order"); + return false; + } + } + + $invoiceItems = array(); + $i = 0; + $failed = false; + + $invoiceItems = $this->formatInvoiceItems($products); + + + if (empty($invoiceItems)) { + HesabixLogService::writeLogStr("Cannot add/update Invoice. No valid items found. Order ID: $id_order"); + return false; + } + + if ($failed) { + HesabixLogService::writeLogStr("Cannot add/update Invoice. Item code is NULL. Check your invoice products and relations with Hesabix. Order ID: $id_order"); + return false; + } + + if (empty($invoiceItems)) { + HesabixLogService::log(array("Cannot add/update Invoice. At least one item required.")); + return false; + } + + $date_obj = $order->get_date_created(); + switch ($orderType) { + case 0: + $date = $date_obj->date('Y-m-d H:i:s'); + break; + case 2: + $date = date('Y-m-d H:i:s'); + break; + default: + $date = $date_obj->date('Y-m-d H:i:s'); + } + + if ($reference === null) + $reference = $id_order; + + global $freightOption, $freightItemCode; + $freightOption = get_option("hesabix_invoice_freight"); + + $order_shipping_method = ""; + foreach ($order->get_items('shipping') as $item) + $order_shipping_method = $item->get_name(); + + $note = $order->get_customer_note(); + if ($order_shipping_method && $freightOption == 0) + $note .= "\n" . __('Shipping method', 'hesabix') . ": " . $order_shipping_method; + + + $freightItems = []; + + if ($freightOption == 1) { + $freightItemCode = get_option('hesabix_invoice_freight_code'); + if (!isset($freightItemCode) || !$freightItemCode) + HesabixLogService::writeLogStr(__("Freight service code is not defined", 'hesabix') . "\n" . "Freight service code is not set"); + + $freightItemCode = $this->convertPersianDigitsToEnglish($freightItemCode); + + if ($this->getPriceInHesabixDefaultCurrency($order->get_shipping_total()) != 0) { + + $wpFaService = new HesabixWpFaService(); + $uid = $wpFaService->getProductUidByCode($freightItemCode); + + if ($uid) { + $freightItems[] = [ + 'name' => [ + 'id' => $uid, + 'name' => __('Freight Cost', 'hesabix'), + 'code' => $freightItemCode, + 'priceSell' => (float) $this->getPriceInHesabixDefaultCurrency($order->get_shipping_total()), + ], + 'count' => 1, + 'price' => (float) $this->getPriceInHesabixDefaultCurrency($order->get_shipping_total()), + 'discountType' => 'percent', + 'discountPercent' => 0, + 'discountAmount' => 0, + 'description' => __('Freight method', 'hesabix') . ": " . $order_shipping_method, + 'showPercentDiscount' => true, + 'total' => (float) $this->getPriceInHesabixDefaultCurrency($order->get_shipping_total()), + 'tax' => (float) $this->getPriceInHesabixDefaultCurrency($order->get_shipping_tax()) + ]; + } + } + } + + $contactId = $wpFaService->getCustomerUidByCode($contactCode); + + if (!isset($contactId)) { + return false; + } + + + $allItems = $this->formatInvoiceItems($products); + if (!empty($freightItems)) { + $allItems = array_merge($allItems, $freightItems); + } + + $data = [ + 'id' => '', + 'invoiceDate' => $this->convertToJalali($date), + 'customer' => (int) $contactId, + 'invoiceDescription' => $note, + 'totalInvoice' => $this->getPriceInHesabixDefaultCurrency($order->get_total()), + 'taxPercent' => 0, + 'discountType' => 'percent', + 'discountPercent' => 0, + 'totalDiscount' => 0, + + 'showTotalPercentDiscount' => true, + 'items' => $allItems, + 'sendSmsToCustomer' => false, + 'payments' => [] + ]; + + if ($freightOption == 0) { + $freight = $this->getPriceInHesabixDefaultCurrency($order->get_shipping_total() + $order->get_shipping_tax()); + $data['shippingCost'] = $freight; + } + + + + + + $invoice_project = get_option('hesabix_invoice_project', -1); + $invoice_salesman = get_option('hesabix_invoice_salesman', -1); + $invoice_salesman_percentage = get_option('hesabix_invoice_salesman_percentage', 0); + if ($invoice_project != -1) + $data['Project'] = $invoice_project; + if ($invoice_salesman != -1) + $data['SalesmanCode'] = $invoice_salesman; + if ($invoice_salesman_percentage) if ($invoice_salesman_percentage != 0) + $data['SalesmanPercent'] = $this->convertPersianDigitsToEnglish($invoice_salesman_percentage); + + $hesabix = new Hesabix_Api(); + $response = $hesabix->invoiceSave($data); + + if ($response->Success) { + global $wpdb; + + switch ($orderType) { + case 0: + $obj_type = 'order'; + break; + case 2: + $obj_type = 'returnOrder'; + break; + } + + if ($number === null) { + $wpdb->insert($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $response->data->id, + 'obj_type' => $obj_type, + 'id_ps' => $id_order, + )); + HesabixLogService::log(array("Invoice successfully added. Invoice number: " . (string) $response->Result->Number . ". Order ID: $id_order")); + } else { + $wpFaId = $wpFaService->getWpFaId($obj_type, $id_order); + + $wpdb->update($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $response->data->id, + 'obj_type' => $obj_type, + 'id_ps' => $id_order, + ), array('id' => $wpFaId)); + HesabixLogService::log(array("Invoice successfully updated. Invoice number: " . (string) $response->Result->Number . ". Order ID: $id_order")); + } + + // $warehouse = get_option('hesabix_item_update_quantity_based_on', "-1"); + // if ($warehouse != "-1" && $orderType === 0) + // $this->setWarehouseReceipt($invoiceItems, (int) $response->Result->Number, $warehouse, $date, $invoice_project); + + return true; + } else { + foreach ($invoiceItems as $item) { + HesabixLogService::log(array( + "Cannot add/update Invoice. Error Code: " . (string) $response->ErrorCode . ". Error Message: " . (string) $response->ErrorMessage . ". Order ID: $id_order" . "\n" + . "Hesabix Id:" . $item['ItemCode'] + )); + } + return false; + } + } + + public function setWarehouseReceipt($items, $invoiceNumber, $warehouseCode, $date, $project) + { + $invoiceOption = get_option('hesabix_invoice_freight'); + if ($invoiceOption == 1) { + $invoiceFreightCode = get_option('hesabix_invoice_freight_code'); + for ($i = 0; $i < count($items); $i++) { + if ($items[$i]["ItemCode"] == $invoiceFreightCode) { + unset($items[$i]); + } + } + } + + $data = array( + 'WarehouseCode' => $warehouseCode, + 'InvoiceNumber' => $invoiceNumber, + 'InvoiceType' => 0, + 'Date' => $date, + 'Items' => $items + ); + + if ($project != -1) + $data['Project'] = $project; + + $hesabix = new Hesabix_Api(); + $response = $hesabix->saveWarehouseReceipt($data); + + if ($response->Success) + HesabixLogService::log(array("Warehouse receipt successfully saved/updated. warehouse receipt number: " . (string) $response->Result->Number . ". Invoice number: $invoiceNumber")); + else + HesabixLogService::log(array("Cannot save/update Warehouse receipt. Error Code: " . (string) $response->ErrorCode . ". Error Message: " . (string) $response->ErrorMessage . ". Invoice number: $invoiceNumber")); + } + + public static function getPriceInHesabixDefaultCurrency($price) + { + if (!isset($price)) + return false; + + $woocommerce_currency = get_woocommerce_currency(); + $hesabix_currency = get_option('hesabix_hesabix_default_currency'); + + if (!is_numeric($price)) + $price = intval($price); + + if ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT') + $price *= 10; + + if ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR') + $price /= 10; + + return $price; + } + + public static function getPriceInWooCommerceDefaultCurrency($price) + { + if (!isset($price)) + return false; + + $woocommerce_currency = get_woocommerce_currency(); + $hesabix_currency = get_option('hesabix_hesabix_default_currency'); + + if (!is_numeric($price)) + $price = intval($price); + + if ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT') + $price /= 10; + + if ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR') + $price *= 10; + + return $price; + } + + public function setOrderPayment($id_order) + { + if (!isset($id_order)) { + return false; + } + + $hesabix = new Hesabix_Api(); + $number = $this->getInvoiceCodeByOrderId($id_order); + if (!$number) { + return false; + } + + + $order = wc_get_order($id_order); + + if ($order->get_total() <= 0) { + return true; + } + + + $transaction_id = $order->get_transaction_id(); + + if ($transaction_id == '') { + $transaction_id = '-'; + } + + global $financialData; + if (get_option('hesabix_payment_option') == 'no') { + $bank_code = $this->getBankCodeByPaymentMethod($order->get_payment_method()); + if ($bank_code != false) { + $payTempValue = substr($bank_code, 0, 4); + + switch ($payTempValue) { + case 'bank': + $payTempValue = substr($bank_code, 4); + $financialData = array('bankCode' => $payTempValue); + break; + case 'cash': + $payTempValue = substr($bank_code, 4); + $financialData = array('cashCode' => $payTempValue); + break; + } + } else { + HesabixLogService::log(array("Cannot add Hesabix Invoice payment - Bank Code not defined. Order ID: $id_order")); + return false; + } + } elseif (get_option('hesabix_payment_option') == 'yes') { + $defaultBankCode = $this->convertPersianDigitsToEnglish(get_option('hesabix_default_payment_method_code')); + if ($defaultBankCode != false) { + $financialData = array('bankCode' => $defaultBankCode); + } else { + HesabixLogService::writeLogStr("Default Bank Code is not Defined"); + return false; + } + } + + $date_obj = $order->get_date_paid(); + if ($date_obj == null) { + $date_obj = $order->get_date_modified(); + } + + global $accountPath; + + if (get_option("hesabix_cash_in_transit") == "1" || get_option("hesabix_cash_in_transit") == "yes") { + $func = new Hesabix_Admin_Functions(); + $cashInTransitFullPath = $func->getCashInTransitFullPath(); + if (!$cashInTransitFullPath) { + HesabixLogService::writeLogStr("Cash in Transit is not Defined in Hesabix ---- " . __('Cash in Transit not found in Hesabix', 'hesabix')); + return false; + } else { + $accountPath = array("accountPath" => $cashInTransitFullPath); + } + } + + $response = $hesabix->invoiceGet($number); + if ($response->Success) { + if ($response->Result->Paid > 0) { + + } else { + $paymentMethod = $order->get_payment_method(); + $transactionFee = 0; + if (isset($paymentMethod)) { + if (get_option("hesabix_payment_transaction_fee_$paymentMethod") > 0) + $transactionFee = $this->formatTransactionFee(get_option("hesabix_payment_transaction_fee_$paymentMethod"), $this->getPriceInHesabixDefaultCurrency($order->get_total())); + else + $transactionFee = $this->formatTransactionFee(get_option("hesabix_invoice_transaction_fee"), $this->getPriceInHesabixDefaultCurrency($order->get_total())); + } + + if (isset($transactionFee) && $transactionFee != null) + $response = $hesabix->invoiceSavePayment($number, $financialData, $accountPath, $date_obj->date('Y-m-d H:i:s'), $this->getPriceInHesabixDefaultCurrency($order->get_total()), $transaction_id, '', $transactionFee); + else + $response = $hesabix->invoiceSavePayment($number, $financialData, $accountPath, $date_obj->date('Y-m-d H:i:s'), $this->getPriceInHesabixDefaultCurrency($order->get_total()), $transaction_id, '', 0); + + if ($response->Success) { + HesabixLogService::log(array("Hesabix invoice payment added. Order ID: $id_order")); + return true; + } else { + HesabixLogService::log(array("Cannot add Hesabix Invoice payment. Order ID: $id_order. Error Code: " . (string) $response->ErrorCode . ". Error Message: " . (string) $response->ErrorMessage . ".")); + return false; + } + } + return true; + } else { + HesabixLogService::log(array("Error while trying to get invoice. Invoice Number: $number. Error Code: " . (string) $response->ErrorCode . ". Error Message: " . (string) $response->ErrorMessage . ".")); + return false; + } + } + + public function getCashInTransitFullPath() + { + $api = new Hesabix_Api(); + $accounts = $api->settingGetAccounts(); + foreach ($accounts->Result as $account) { + if ($account->Name == "وجوه در راه") { + return $account->FullPath; + } + } + return false; + } + + public function getInvoiceNumberByOrderId($id_order) + { + if (!isset($id_order)) + return false; + + global $wpdb; + $row = $wpdb->get_row("SELECT `id_hesabix` FROM " . $wpdb->prefix . "hesabix WHERE `id_ps` = $id_order AND `obj_type` = 'order'"); + + if (is_object($row)) { + return $row->id_hesabix; + } else { + return false; + } + } + + public function getBankCodeByPaymentMethod($payment_method) + { + $code = get_option('hesabix_payment_method_' . $payment_method); + + if (isset($code)) + return $code; + else + return false; + } + + public function getInvoiceCodeByOrderId($id_order) + { + if (!isset($id_order)) + return false; + + global $wpdb; + $row = $wpdb->get_row("SELECT `id_hesabix` FROM " . $wpdb->prefix . "hesabix WHERE `id_ps` = $id_order AND `obj_type` = 'order'"); + + if (is_object($row)) { + return $row->id_hesabix; + } else { + return false; + } + } + + public function exportProducts($batch, $totalBatch, $total, $updateCount) + { + HesabixLogService::writeLogStr("Exporting Products"); + try { + $wpFaService = new HesabixWpFaService(); + $extraSettingRPP = get_option("hesabix_set_rpp_for_export_products"); + $rpp = 500; + if ($extraSettingRPP) { + if ($extraSettingRPP != '-1' && $extraSettingRPP != '0') { + $rpp = $extraSettingRPP; + } + } + $result = array(); + $result["error"] = false; + global $wpdb; + + if ($batch == 1) { + + + + $total = $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT(*) FROM {$wpdb->posts} + WHERE post_type = 'product' AND post_status IN ('publish', 'private')" + ) + ); + + $totalBatch = ceil($total / $rpp); + } + + $offset = ($batch - 1) * $rpp; + + + + $products = $wpdb->get_results( + $wpdb->prepare( + "SELECT ID FROM {$wpdb->posts} + WHERE post_type = 'product' AND post_status IN ('publish', 'private') + ORDER BY ID ASC + LIMIT %d, %d", + $offset, + $rpp + ) + ); + + $items = array(); + + foreach ($products as $item) { + $id_product = $item->ID; + $product = new WC_Product($id_product); + + $id_obj = $wpFaService->getWpFaId('product', $id_product, 0); + + if (!$id_obj) { + $hesabixItem = HesabixItemService::mapProduct($product, $id_product); + array_push($items, $hesabixItem); + $updateCount++; + } + + $variations = $this->getProductVariations($id_product); + if ($variations) { + foreach ($variations as $variation) { + $id_attribute = $variation->get_id(); + $id_obj = $wpFaService->getWpFaId('product', $id_product, $id_attribute); + + if (!$id_obj) { + $hesabixItem = HesabixItemService::mapProductVariation($product, $variation, $id_product); + array_push($items, $hesabixItem); + $updateCount++; + } + } + } + } + + if (!empty($items)) { + $count = 0; + $hesabix = new Hesabix_Api(); + $response = $hesabix->itemBatchSave($items); + if ($response->Success) { + foreach ($response->Result as $item) { + $json = json_decode($item->Tag); + + global $wpdb; + $wpdb->insert($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $item->code, + 'obj_type' => 'product', + 'id_ps' => (int) $json->id_product, + 'id_ps_attribute' => (int) $json->id_attribute, + )); + HesabixLogService::log(array("Item successfully added. Item Code: " . (string) $item->code . ". Product ID: $json->id_product - $json->id_attribute")); + } + $count += count($response->Result); + } else { + HesabixLogService::log(array("Cannot add bulk item. Error Message: " . (string) $response->ErrorMessage . ". Error Code: " . (string) $response->ErrorCode . ".")); + } + sleep(2); + } + + $result["batch"] = $batch; + $result["totalBatch"] = $totalBatch; + $result["total"] = $total; + $result["updateCount"] = $updateCount; + return $result; + } catch (Error $error) { + HesabixLogService::writeLogStr("Error in export products: " . $error->getMessage()); + } + } + + public function importProducts($batch, $totalBatch, $total, $updateCount) + { + HesabixLogService::writeLogStr("Import Products"); + try { + $wpFaService = new HesabixWpFaService(); + $extraSettingRPP = get_option("hesabix_set_rpp_for_import_products"); + + $rpp = 100; + if ($extraSettingRPP) { + if ($extraSettingRPP != '-1' && $extraSettingRPP != '0') { + $rpp = $extraSettingRPP; + } + } + + $result = array(); + $result["error"] = false; + global $wpdb; + $hesabix = new Hesabix_Api(); + $filters = array(array("Property" => "khadamat", "Operator" => "=", "Value" => 0)); + + if ($batch == 1) { + $total = 0; + $response = $hesabix->itemGetItems(array('Take' => 1, 'Filters' => $filters)); + if ($response->Success) { + $total = $response->Result->FilteredCount; + $totalBatch = ceil($total / $rpp); + } else { + HesabixLogService::log(array("Error while trying to get products for import. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode.")); + $result["error"] = true; + return $result; + } + ; + } + + $id_product_array = array(); + $offset = ($batch - 1) * $rpp; + + $response = $hesabix->itemGetItems(array('Skip' => $offset, 'Take' => $rpp, 'SortBy' => 'Id', 'Filters' => $filters)); + if ($response->Success) { + $items = $response->Result->List; + $from = $response->Result->From; + $to = $response->Result->To; + + foreach ($items as $item) { + $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->code); + if ($wpFa) + continue; + + $clearedName = preg_replace("/\s+|\/|\\\|\(|\)/", '-', trim($item->Name)); + $clearedName = preg_replace("/\-+/", '-', $clearedName); + $clearedName = trim($clearedName, '-'); + $clearedName = preg_replace( + ["/۰/", "/۱/", "/۲/", "/۳/", "/۴/", "/۵/", "/۶/", "/۷/", "/۸/", "/۹/"], + ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], + $clearedName + ); + + + $wpdb->insert($wpdb->posts, array( + 'post_author' => get_current_user_id(), + 'post_date' => current_time('mysql'), + 'post_date_gmt' => current_time('mysql', 1), + 'post_content' => '', + 'post_title' => $item->Name, + 'post_excerpt' => '', + 'post_status' => 'private', + 'comment_status' => 'open', + 'ping_status' => 'closed', + 'post_password' => '', + 'post_name' => $clearedName, + 'to_ping' => '', + 'pinged' => '', + 'post_modified' => current_time('mysql'), + 'post_modified_gmt' => current_time('mysql', 1), + 'post_content_filtered' => '', + 'post_parent' => 0, + 'guid' => home_url('/product/' . $clearedName . '/'), + 'menu_order' => 0, + 'post_type' => 'product', + 'post_mime_type' => '', + 'comment_count' => 0, + )); + + $postId = $wpdb->insert_id; + $id_product_array[] = $postId; + $price = self::getPriceInWooCommerceDefaultCurrency($item->SellPrice); + + + $wpdb->insert($wpdb->prefix . 'hesabix', array( + 'obj_type' => 'product', + 'id_hesabix' => (int) $item->code, + 'id_ps' => $postId, + 'id_ps_attribute' => 0, + )); + + update_post_meta($postId, '_manage_stock', 'yes'); + update_post_meta($postId, '_sku', $item->Barcode); + update_post_meta($postId, '_regular_price', $price); + update_post_meta($postId, '_price', $price); + update_post_meta($postId, '_stock', $item->stock); + + $new_stock_status = ($item->stock > 0) ? "instock" : "outofstock"; + wc_update_product_stock_status($postId, $new_stock_status); + $updateCount++; + } + + } else { + HesabixLogService::log(array("Error while trying to get products for import. Error Message: (string)$response->ErrorMessage. Error Code: (string)$response->ErrorCode.")); + $result["error"] = true; + return $result; + } + sleep(2); + + $result["batch"] = $batch; + $result["totalBatch"] = $totalBatch; + $result["total"] = $total; + $result["updateCount"] = $updateCount; + return $result; + } catch (Error $error) { + HesabixLogService::writeLogStr("Error in importing products" . $error->getMessage()); + } + } + + public function exportOpeningQuantity($batch, $totalBatch, $total) + { + try { + $wpFaService = new HesabixWpFaService(); + + $result = array(); + $result["error"] = false; + $extraSettingRPP = get_option("hesabix_set_rpp_for_export_opening_products"); + + $rpp = 500; + if ($extraSettingRPP) { + if ($extraSettingRPP != '-1' && $extraSettingRPP != '0') { + $rpp = $extraSettingRPP; + } + } + + global $wpdb; + + if ($batch == 1) { + $total = $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT(*) FROM {$wpdb->posts} + WHERE post_type = 'product' AND post_status IN ('publish', 'private')" + ) + ); + $totalBatch = ceil($total / $rpp); + } + + $offset = ($batch - 1) * $rpp; + + $products = $wpdb->get_results( + $wpdb->prepare( + "SELECT ID FROM {$wpdb->posts} + WHERE post_type = 'product' AND post_status IN ('publish', 'private') + ORDER BY ID ASC + LIMIT %d, %d", + $offset, + $rpp + ) + ); + + $items = array(); + + foreach ($products as $item) { + $variations = $this->getProductVariations($item->ID); + if (!$variations) { + $id_obj = $wpFaService->getWpFaId('product', $item->ID, 0); + + if ($id_obj != false) { + $product = new WC_Product($item->ID); + $quantity = $product->get_stock_quantity(); + $price = $product->get_regular_price() ? $product->get_regular_price() : $product->get_price(); + + $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "hesabix` WHERE `id` = " . $id_obj . " AND `obj_type` = 'product'"); + + if (is_object($product) && is_object($row) && $quantity > 0 && $price > 0) { + array_push($items, array( + 'Code' => $row->id_hesabix, + 'Quantity' => $quantity, + 'UnitPrice' => $this->getPriceInHesabixDefaultCurrency($price), + )); + } + } + } else { + foreach ($variations as $variation) { + $id_attribute = $variation->get_id(); + $id_obj = $wpFaService->getWpFaId('product', $item->ID, $id_attribute); + if ($id_obj != false) { + $quantity = $variation->get_stock_quantity(); + $price = $variation->get_regular_price() ? $variation->get_regular_price() : $variation->get_price(); + + $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "hesabix` WHERE `id` = " . $id_obj . " AND `obj_type` = 'product'"); + + if (is_object($variation) && is_object($row) && $quantity > 0 && $price > 0) { + array_push($items, array( + 'Code' => $row->id_hesabix, + 'Quantity' => $quantity, + 'UnitPrice' => $this->getPriceInHesabixDefaultCurrency($price), + )); + } + } + } + } + } + + if (!empty($items)) { + $hesabix = new Hesabix_Api(); + $response = $hesabix->itemUpdateOpeningQuantity($items); + if ($response->Success) { + + } else { + HesabixLogService::log(array("hesabix - Cannot set Opening quantity. Error Code: ' . $response->ErrorCode . '. Error Message: ' . $response->ErrorMessage")); + $result['error'] = true; + if ($response->ErrorCode = 199 && $response->ErrorMessage == 'No-Shareholders-Exist') { + $result['errorType'] = 'shareholderError'; + return $result; + } + return $result; + } + } + sleep(2); + $result["batch"] = $batch; + $result["totalBatch"] = $totalBatch; + $result["total"] = $total; + $result["done"] = $batch == $totalBatch; + return $result; + } catch (Error $error) { + HesabixLogService::writeLogStr("Error in Exporting Opening Quantity" . $error->getMessage()); + } + } + + public function exportCustomers($batch, $totalBatch, $total, $updateCount) + { + HesabixLogService::writeLogStr("Export Customers"); + $wpFaService = new HesabixWpFaService(); + + $result = array(); + $result["error"] = false; + $rpp = 500; + global $wpdb; + + if ($batch == 1) { + $total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "users`"); + $totalBatch = ceil($total / $rpp); + } + + $offset = ($batch - 1) * $rpp; + $customers = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "users` ORDER BY ID ASC LIMIT $offset,$rpp"); + + $items = array(); + foreach ($customers as $item) { + $id_customer = $item->ID; + $id_obj = $wpFaService->getWpFaId('customer', $id_customer); + if (!$id_obj) { + $hesabixCustomer = HesabixCustomerService::mapCustomer(null, $id_customer); + array_push($items, $hesabixCustomer); + $updateCount++; + } + } + + if (!empty($items)) { + $hesabix = new Hesabix_Api(); + $response = $hesabix->contactBatchSave($items); + if ($response->Success) { + foreach ($response->Result as $item) { + $json = json_decode($item->Tag); + + $wpdb->insert($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $item->code, + 'obj_type' => 'customer', + 'id_ps' => (int) $json->id_customer, + )); + + HesabixLogService::log(array("Contact successfully added. Contact Code: " . $item->code . ". Customer ID: " . (int) $json->id_customer)); + } + } else { + HesabixLogService::log(array("Cannot add bulk contacts. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode.")); + } + } + + $result["batch"] = $batch; + $result["totalBatch"] = $totalBatch; + $result["total"] = $total; + $result["updateCount"] = $updateCount; + + return $result; + } + + + private function getOrdersCount($from_date, $end_date) + { + global $wpdb; + if (get_option('woocommerce_custom_orders_table_enabled') === 'yes') { + $table = $wpdb->prefix . 'wc_orders'; + $sql = $wpdb->prepare( + "SELECT COUNT(*) FROM `$table` + WHERE type = %s AND date_created_gmt BETWEEN %s AND %s", + 'shop_order', + $from_date, + $end_date + ); + } else { + $table = $wpdb->prefix . 'posts'; + $sql = $wpdb->prepare( + "SELECT COUNT(*) FROM `$table` + WHERE post_type = %s AND post_date BETWEEN %s AND %s", + 'shop_order', + $from_date, + $end_date + ); + } + return (int) $wpdb->get_var($sql); + } + + private function getOrdersByBatch($from_date, $end_date, $batch, $rpp) + { + global $wpdb; + $offset = ($batch - 1) * $rpp; + + if (get_option('woocommerce_custom_orders_table_enabled') === 'yes') { + $table = $wpdb->prefix . 'wc_orders'; + $sql = $wpdb->prepare( + "SELECT ID FROM `$table` + WHERE type = %s AND date_created_gmt BETWEEN %s AND %s + ORDER BY ID ASC LIMIT %d, %d", + 'shop_order', + $from_date, + $end_date, + $offset, + $rpp + ); + } else { + $table = $wpdb->prefix . 'posts'; + $sql = $wpdb->prepare( + "SELECT ID FROM `$table` + WHERE post_type = %s AND post_date BETWEEN %s AND %s + ORDER BY ID ASC LIMIT %d, %d", + 'shop_order', + $from_date, + $end_date, + $offset, + $rpp + ); + } + + return $wpdb->get_results($sql); + } + + public function syncOrders($from_date, $end_date, $batch, $totalBatch, $total, $updateCount) + { + HesabixLogService::writeLogStr("Sync Orders"); + + $result = [ + "error" => false, + "batch" => $batch, + "totalBatch" => $totalBatch, + "total" => $total, + "updateCount" => $updateCount, + ]; + + $rpp = 10; + global $wpdb; + + if (empty($from_date) || empty($end_date)) { + $result['error'] = 'inputDateError'; + return $result; + } + + if (($fy1 = $this->isDateInFiscalYear($from_date)) !== 1) { + $result['error'] = $fy1; + return $result; + } + + if (($fy2 = $this->isDateInFiscalYear($end_date)) !== 1) { + $result['error'] = $fy2; + return $result; + } + + if ($batch == 1) { + $total = $this->getOrdersCount($from_date, $end_date); + $totalBatch = ceil($total / $rpp); + HesabixLogService::writeLogStr("Total Orders: $total, Total Batches: $totalBatch"); + } + + $orders = $this->getOrdersByBatch($from_date, $end_date, $batch, $rpp); + if (empty($orders)) { + $result['error'] = __('no orders found', 'hesabix'); + return $result; + } + HesabixLogService::writeLogStr("Orders count: " . count($orders)); + + $wpFaService = new HesabixWpFaService(); + $invoice_statuses = get_option('hesabix_invoice_status', array()); + if (!is_array($invoice_statuses)) { + if (is_string($invoice_statuses) && !empty($invoice_statuses)) { + $invoice_statuses = array_map('trim', explode(',', $invoice_statuses)); + } else { + $invoice_statuses = array(); + } + } + + $return_invoice_statuses = get_option('hesabix_invoice_return_status', array()); + if (!is_array($return_invoice_statuses)) { + if (is_string($return_invoice_statuses) && !empty($return_invoice_statuses)) { + $return_invoice_statuses = array_map('trim', explode(',', $return_invoice_statuses)); + } else { + $return_invoice_statuses = array(); + } + } + + $payment_statuses = get_option('hesabix_payment_status', array()); + if (!is_array($payment_statuses)) { + if (is_string($payment_statuses) && !empty($payment_statuses)) { + $payment_statuses = array_map('trim', explode(',', $payment_statuses)); + } else { + $payment_statuses = array(); + } + } + + $statusesToSubmitInvoice = $invoice_statuses; + $statusesToSubmitReturnInvoice = $return_invoice_statuses; + $statusesToSubmitPayment = $payment_statuses; + + $id_orders = []; + + + foreach ($orders as $order) { + $order = wc_get_order($order->ID); + if (!$order) + continue; + + $id_order = $order->get_id(); + $current_status = $order->get_status(); + $id_obj = $wpFaService->getWpFaId('order', $id_order); + + if (!$id_obj) { + if (in_array($current_status, $statusesToSubmitInvoice)) { + if ($this->setOrder($id_order)) { + $id_orders[] = $id_order; + $updateCount++; + + if (in_array($current_status, $statusesToSubmitPayment)) { + $this->setOrderPayment($id_order); + } + + if (in_array($current_status, $statusesToSubmitReturnInvoice)) { + $invoice_code = $this->getInvoiceCodeByOrderId($id_order); + $this->setOrder($id_order, 2, $invoice_code); + } + } + } + } else { + if (in_array($current_status, $statusesToSubmitPayment)) { + $this->setOrderPayment($id_order); + } + } + } + + $result["total"] = $total; + $result["totalBatch"] = $totalBatch; + $result["updateCount"] = $updateCount; + + return $result; + } + + + public function syncProducts($batch, $totalBatch, $total) + { + try { + HesabixLogService::writeLogStr("Sync products price and quantity from hesabix to store: part $batch"); + $result = array(); + $result["error"] = false; + $extraSettingRPP = get_option("hesabix_set_rpp_for_sync_products_into_woocommerce"); + + $rpp = 200; + if ($extraSettingRPP) { + if ($extraSettingRPP != '-1' && $extraSettingRPP != '0') { + $rpp = $extraSettingRPP; + } + } + + $hesabix = new Hesabix_Api(); + $filters = array(array("Property" => "khadamat", "Operator" => "=", "Value" => 0)); + + if ($batch == 1) { + $response = $hesabix->itemGetItems(array('Take' => 1, 'Filters' => $filters)); + if ($response->Success) { + $total = $response->data->FilteredCount; + $totalBatch = ceil($total / $rpp); + } else { + HesabixLogService::log(array("Error while trying to get products for sync. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode.")); + $result["error"] = true; + return $result; + } + } + + $offset = ($batch - 1) * $rpp; + $response = $hesabix->itemGetItems(array('Skip' => $offset, 'Take' => $rpp, 'SortBy' => 'Id', 'Filters' => $filters)); + + // $warehouse = get_option('hesabix_item_update_quantity_based_on', "-1"); + + // if ($warehouse != "-1") { + // $products = $response->data->List; + // $codes = []; + // foreach ($products as $product) + // $codes[] = $product->code; + // $response = $hesabix->itemGetQuantity($warehouse, $codes); + // error_log('warehouse: ' . $warehouse); + // error_log('codes: ' . print_r($codes, true)); + // error_log('response: ' . print_r($response, true)); + // } + + if ($response->Success) { + // $products = $warehouse == "-1" ? $response->data->List : $response->data; + $products = $response->data->List; + foreach ($products as $product) { + self::setItemChanges($product); + } + } else { + HesabixLogService::log(array("Error while trying to get products for sync. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode.")); + $result["error"] = true; + return $result; + } + + $result["batch"] = $batch; + $result["totalBatch"] = $totalBatch; + $result["total"] = $total; + return $result; + } catch (Error $error) { + HesabixLogService::writeLogStr("Error in sync products: " . $error->getMessage()); + } + } + + public function syncProductsManually($data) + { + HesabixLogService::writeLogStr('Sync Products Manually'); + + $hesabix_item_codes = array(); + foreach ($data as $d) { + if ($d["hesabix_id"]) { + $hesabix_item_codes[] = str_pad($d["hesabix_id"], 6, "0", STR_PAD_LEFT); + } + } + + $hesabix = new Hesabix_Api(); + + $filters = array(array("Property" => "Code", "Operator" => "in", "Value" => $hesabix_item_codes)); + $response = $hesabix->itemGetItems(array('Take' => 100, 'Filters' => $filters)); + + if ($response->Success) { + $products = $response->Result->List; + $products_codes = array(); + foreach ($products as $product) + $products_codes[] = $product->code; + $diff = array_diff($hesabix_item_codes, $products_codes); + if (is_array($diff) && count($diff) > 0) { + return array("result" => false, "data" => $diff); + } + } + + $id_product_array = array(); + global $wpdb; + + foreach ($data as $d) { + $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "hesabix` WHERE `id_ps_attribute` = " . $d["id"] . " AND `obj_type` = 'product'"); + + if (!is_object($row)) { + $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "hesabix` WHERE `id_ps` = " . $d["id"] . " AND `obj_type` = 'product'"); + } + if (is_object($row)) { + if (!$d["hesabix_id"]) + $wpdb->delete($wpdb->prefix . 'hesabix', array('id' => $row->id)); + else + $wpdb->update($wpdb->prefix . 'hesabix', array('id_hesabix' => $d["hesabix_id"]), array('id' => $row->id)); + } else { + if (!$d["hesabix_id"]) + continue; + if ($d["parent_id"]) + $wpdb->insert($wpdb->prefix . 'hesabix', array('obj_type' => 'product', 'id_hesabix' => $d["hesabix_id"], 'id_ps' => $d["parent_id"], 'id_ps_attribute' => $d["id"])); + else + $wpdb->insert($wpdb->prefix . 'hesabix', array('obj_type' => 'product', 'id_hesabix' => $d["hesabix_id"], 'id_ps' => $d["id"], 'id_ps_attribute' => '0')); + } + + if ($d["hesabix_id"]) { + if ($d["parent_id"]) { + if (!in_array($d["parent_id"], $id_product_array)) + $id_product_array[] = $d["parent_id"]; + } else { + if (!in_array($d["id"], $id_product_array)) + $id_product_array[] = $d["id"]; + } + } + } + + $this->setItems($id_product_array); + return array("result" => true, "data" => null); + } + + public function updateProductsInHesabixBasedOnStore($batch, $totalBatch, $total) + { + HesabixLogService::writeLogStr("Update Products In Hesabix Based On Store"); + $result = array(); + $result["error"] = false; + $extraSettingRPP = get_option('hesabix_set_rpp_for_sync_products_into_hesabix'); + + $rpp = 500; + if ($extraSettingRPP) { + if ($extraSettingRPP != '-1' && $extraSettingRPP != '0') { + $rpp = $extraSettingRPP; + } + } + + global $wpdb; + + if ($batch == 1) { + $total = $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT(*) FROM {$wpdb->posts} + WHERE post_type = 'product' AND post_status IN ('publish', 'private')" + ) + ); + $totalBatch = ceil($total / $rpp); + } + + $offset = ($batch - 1) * $rpp; + + $products = $wpdb->get_results( + $wpdb->prepare( + "SELECT ID FROM {$wpdb->posts} + WHERE post_type = 'product' AND post_status IN ('publish', 'private') + ORDER BY ID ASC + LIMIT %d, %d", + $offset, + $rpp + ) + ); + + $products_id_array = array(); + foreach ($products as $product) + $products_id_array[] = $product->ID; + $this->setItems($products_id_array); + sleep(2); + + $result["batch"] = $batch; + $result["totalBatch"] = $totalBatch; + $result["total"] = $total; + return $result; + } + + + public function updateWooCommerceProductsBasedOnHesabix($batch, $totalBatch, $total) + { + HesabixLogService::writeLogStr("Update WooCommerce Products Based On Hesabix"); + $result = array(); + $result["error"] = false; + $extraSettingRPP = get_option('hesabix_set_rpp_for_sync_products_into_hesabix'); + + $rpp = 500; + if ($extraSettingRPP) { + if ($extraSettingRPP != '-1' && $extraSettingRPP != '0') { + $rpp = $extraSettingRPP; + } + } + + $api = new Hesabix_Api(); + $wpFaService = new HesabixWpFaService(); + $filters = array(array("Property" => "khadamat", "Operator" => "=", "Value" => 0)); + $items = $api->itemGetItems(array('Filters' => $filters)); + + foreach ($items->data->List as $item) { + + $this->saveHesabixProductToDatabase($item, $wpFaService); + + + $existingWpFa = $wpFaService->getWpFaByHesabixCode('product', $item->code); + + if ($existingWpFa && $existingWpFa->idWp > 0) { + + $this->updateWooCommerceProductsFromHesabix(array($existingWpFa->idWp)); + } else { + + $this->createWooCommerceProductFromHesabix($item, $wpFaService); + } + } + + $result["batch"] = $batch; + $result["totalBatch"] = $totalBatch; + $result["total"] = $total; + return $result; + + } + + + private function saveHesabixProductToDatabase($item, $wpFaService) + { + $hesabix_code = 0; + $hesabix_uid = 0; + $id_product = 0; + $id_attribute = 0; + + if (isset($item->code)) + $hesabix_code = (int) $item->code; + if (isset($item->id)) + $hesabix_uid = (int) $item->id; + + + $existingWpFa = $wpFaService->getWpFaByHesabixCode('product', $hesabix_code); + + if (!$existingWpFa) { + + $wpFa = WpFa::newWpFa(0, 'product', $hesabix_code, $id_product, $id_attribute, $hesabix_uid); + $wpFaService->save($wpFa); + HesabixLogService::writeLogStr("Hesabix product added to database. Code: $hesabix_code, UID: $hesabix_uid"); + } else { + + $existingWpFa->idHesabix = $hesabix_code; + $existingWpFa->uidHesabix = $hesabix_uid; + $wpFaService->update($existingWpFa); + HesabixLogService::writeLogStr("Hesabix product updated in database. Code: $hesabix_code, UID: $hesabix_uid"); + } + } + + + private function createWooCommerceProductFromHesabix($item, $wpFaService) + { + HesabixLogService::writeLogStr("Creating WooCommerce product from Hesabix - Code: " . $item->code . ", Name: " . $item->name); + + try { + + $product = new WC_Product_Simple(); + + + if (!empty($item->name)) { + $product->set_name($item->name); + } + + + + + if (isset($item->priceSell) && $item->priceSell > 0) { + $price = $this->getPriceInWooCommerceDefaultCurrency($item->priceSell); + $product->set_regular_price($price); + $product->set_price($price); + HesabixLogService::writeLogStr("Price converted from Hesabix: " . $item->priceSell . " to WooCommerce: " . $price); + } + + + if (isset($item->priceSellDiscount) && $item->priceSellDiscount > 0) { + $sale_price = $this->getPriceInWooCommerceDefaultCurrency($item->priceSellDiscount); + $product->set_sale_price($sale_price); + HesabixLogService::writeLogStr("Sale price converted from Hesabix: " . $item->priceSellDiscount . " to WooCommerce: " . $sale_price); + } + + + if (isset($item->priceBuy) && $item->priceBuy > 0) { + $purchase_price = $this->getPriceInWooCommerceDefaultCurrency($item->priceBuy); + update_post_meta($product->get_id(), '_purchase_price', $purchase_price); + HesabixLogService::writeLogStr("Purchase price converted from Hesabix: " . $item->priceBuy . " to WooCommerce: " . $purchase_price); + } + + + if (!empty($item->des)) { + $product->set_description($item->des); + } + + + if (!empty($item->barcodes)) { + $product->set_sku($item->barcodes); + } + + + $product->set_status('publish'); + + + $product_id = $product->save(); + + if ($product_id) { + + $existingWpFa = $wpFaService->getWpFaByHesabixCode('product', $item->code); + if ($existingWpFa) { + $existingWpFa->idWp = $product_id; + $wpFaService->update($existingWpFa); + HesabixLogService::writeLogStr("Updated database record with WooCommerce product ID: " . $product_id . " for Hesabix code: " . $item->code); + } + + + update_post_meta($product_id, 'hesabix_product_code', $item->code); + + HesabixLogService::writeLogStr("Successfully created WooCommerce product ID: " . $product_id . " from Hesabix code: " . $item->code); + } + } catch (Exception $e) { + HesabixLogService::writeLogStr("Error creating WooCommerce product from Hesabix code: " . $item->code . " - " . $e->getMessage()); + } + } + + + private function updateWooCommerceProductsFromHesabix($products_id_array) + { + HesabixLogService::writeLogStr("Update WooCommerce Products From Hesabix - Products Count: " . count($products_id_array)); + + $hesabixApi = new Hesabix_Api(); + + foreach ($products_id_array as $product_id) { + $product = wc_get_product($product_id); + if (!$product) { + continue; + } + + + $hesabix_code = get_post_meta($product_id, 'hesabix_product_code', true); + if (empty($hesabix_code)) { + continue; + } + + try { + + $hesabixProduct = $hesabixApi->itemGetItemsByCodes(array('values' => [$hesabix_code])); + + if ($hesabixProduct && isset($hesabixProduct->Success) && $hesabixProduct->Success) { + $item = $hesabixProduct->result[0]; + + + if (get_option('hesabix_do_not_update_titles_in_hesabix') !== 'yes') { + if (!empty($item->name)) { + $product->set_name($item->name); + } + } + + + if (get_option('hesabix_do_not_update_product_price_in_hesabix') !== 'yes') { + if (isset($item->priceSell) && $item->priceSell > 0) { + $price = $this->getPriceInWooCommerceDefaultCurrency($item->priceSell); + $product->set_regular_price($price); + $product->set_price($price); + } + } + + + if (get_option('hesabix_do_not_update_product_barcode_in_hesabix') !== 'yes') { + if (!empty($item->barcodes)) { + update_post_meta($product_id, '_sku', $item->barcodes); + } + } + + + if (get_option('hesabix_do_not_update_product_category_in_hesabix') !== 'yes') { + if (!empty($item->cat)) { + + + $category_name = $item->cat; + $term = term_exists($category_name, 'product_cat'); + if (!$term) { + $term = wp_insert_term($category_name, 'product_cat'); + } + if (!is_wp_error($term)) { + wp_set_object_terms($product_id, $term['term_id'], 'product_cat'); + } + } + } + + + if (get_option('hesabix_do_not_update_product_product_code_in_hesabix') !== 'yes') { + if (!empty($item->code)) { + update_post_meta($product_id, 'hesabix_product_code', $item->code); + } + } + + $product->save(); + + HesabixLogService::writeLogStr("Updated WooCommerce product ID: " . $product_id . " with Hesabix data"); + } + } catch (Exception $e) { + HesabixLogService::writeLogStr("Error updating WooCommerce product ID: " . $product_id . " - " . $e->getMessage()); + } + } + } + + public static function updateProductsInHesabixBasedOnStoreWithFilter($offset = 0, $rpp = 0) + { + HesabixLogService::writeLogStr("Update Products With Filter In Hesabix Based On Store"); + $result = array(); + $result["error"] = false; + + global $wpdb; + if ($offset != 0 && $rpp != 0) { + if (abs($rpp - $offset) <= 200) { + if ($rpp > $offset) { + + + + $products = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM {$wpdb->posts} + WHERE ID BETWEEN %d AND %d + AND post_type = 'product' + AND post_status IN ('publish', 'private') + ORDER BY ID ASC", + $offset, + $rpp + ) + ); + + $products_id_array = array(); + foreach ($products as $product) + $products_id_array[] = $product->ID; + $response = (new Hesabix_Admin_Functions)->setItems($products_id_array); + if (!$response) + $result['error'] = true; + } else { + + + + $products = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM {$wpdb->posts} + WHERE ID BETWEEN %d AND %d + AND post_type = 'product' + AND post_status IN ('publish', 'private') + ORDER BY ID ASC", + $rpp, + $offset + ) + ); + + $products_id_array = array(); + foreach ($products as $product) + $products_id_array[] = $product->ID; + $response = (new Hesabix_Admin_Functions)->setItems($products_id_array); + if (!$response) + $result['error'] = true; + } + } else { + $result['error'] = true; + echo ''; + } + } else { + echo ''; + } + + return $result; + } + + public function cleanLogFile() + { + HesabixLogService::clearLog(); + return true; + } + + public static function setItemChanges($item) + { + + if (!is_object($item)) + return false; + + if ($item->count || !$item->stock) + $item->stock = $item->count; + + $wpFaService = new HesabixWpFaService(); + global $wpdb; + + $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->code); + if (!$wpFa) + return false; + + $id_product = $wpFa->idWp; + $id_attribute = $wpFa->idWpAttribute; + + if ($id_product == 0) { + HesabixLogService::log(array("Item with code: $item->code is not defined in Online store")); + return false; + } + + $found = $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT(*) FROM {$wpdb->posts} + WHERE ID = %d", + $id_product + ) + ); + + if (!$found) { + HesabixLogService::writeLogStr("product not found in woocommerce.code: $item->code, product id: $id_product, variation id: $id_attribute"); + return false; + } + + $product = wc_get_product($id_product); + $variation = $id_attribute != 0 ? wc_get_product($id_attribute) : null; + + $result = array(); + $result["newPrice"] = null; + $result["newQuantity"] = null; + + $p = $variation ? $variation : $product; + + if (get_option('hesabix_item_update_price') == 'yes') + $result = self::setItemNewPrice($p, $item, $id_attribute, $id_product, $result); + + if (get_option('hesabix_item_update_quantity') == 'yes') + $result = self::setItemNewQuantity($p, $item, $id_product, $id_attribute, $result); + + return $result; + } + + private static function setItemNewPrice($product, $item, $id_attribute, $id_product, array $result) + { + try { + $option_sale_price = get_option('hesabix_item_update_sale_price', 0); + $woocommerce_currency = get_woocommerce_currency(); + $hesabix_currency = get_option('hesabix_hesabix_default_currency'); + + $old_price = $product->get_regular_price() ? $product->get_regular_price() : $product->get_price(); + $old_price = Hesabix_Admin_Functions::getPriceInHesabixDefaultCurrency($old_price); + + $post_id = $id_attribute && $id_attribute > 0 ? $id_attribute : $id_product; + + $new_price = Hesabix_Admin_Functions::getPriceInWooCommerceDefaultCurrency($item->priceSell); + update_post_meta($post_id, '_regular_price', $new_price); + update_post_meta($post_id, '_price', $new_price); + + $sale_price = $product->get_sale_price(); + if ($sale_price && is_numeric($sale_price)) { + $sale_price = Hesabix_Admin_Functions::getPriceInHesabixDefaultCurrency($sale_price); + if (+$option_sale_price === 1) { + update_post_meta($post_id, '_sale_price', null); + } elseif (+$option_sale_price === 2) { + update_post_meta($post_id, '_sale_price', round(($sale_price * $new_price) / $old_price)); + update_post_meta($post_id, '_price', round(($sale_price * $new_price) / $old_price)); + } else { + if ($woocommerce_currency == 'IRT' && $hesabix_currency == 'IRR') + update_post_meta($post_id, '_price', ($sale_price / 10)); + elseif ($woocommerce_currency == 'IRR' && $hesabix_currency == 'IRT') + update_post_meta($post_id, '_price', ($sale_price * 10)); + elseif ($woocommerce_currency == 'IRR' && $hesabix_currency == 'IRR') + update_post_meta($post_id, '_price', $sale_price); + elseif ($woocommerce_currency == 'IRT' && $hesabix_currency == 'IRT') + update_post_meta($post_id, '_price', $sale_price); + } + } + + HesabixLogService::log(array("product ID $id_product-$id_attribute Price changed. Old Price: $old_price. New Price: $new_price")); + $result["newPrice"] = $new_price; + + return $result; + } catch (Error $error) { + HesabixLogService::writeLogStr("Error in Set Item New Price -> $error"); + } + } + + private static function setItemNewQuantity($product, $item, $id_product, $id_attribute, array $result) + { + try { + $old_quantity = $product->get_stock_quantity(); + $new_quantity = $item->stock; + if (!$new_quantity) + $new_quantity = 0; + + + $new_stock_status = ($new_quantity > 0) ? "instock" : "outofstock"; + + $post_id = ($id_attribute && $id_attribute > 0) ? $id_attribute : $id_product; + + $product = wc_get_product($post_id); + if ($product) { + $product->set_manage_stock(true); + $product->set_stock_quantity($new_quantity); + $product->set_stock_status($new_stock_status); + $product->save(); + HesabixLogService::log(array("product ID $id_product-$id_attribute quantity changed. Old quantity: $old_quantity. New quantity: $new_quantity")); + $result["newQuantity"] = $new_quantity; + } + + return $result; + } catch (Error $error) { + HesabixLogService::writeLogStr("Error in Set Item New Quantity -> $error"); + } + } + + public static function syncLastChangeID(): bool + { + try { + HesabixLogService::writeLogStr("Sync Last Change ID"); + $hesabixApi = new Hesabix_Api(); + $lastChange = $hesabixApi->getLastChangeId(); + + if ($lastChange && isset($lastChange->LastId)) { + update_option('hesabix_last_log_check_id', $lastChange->LastId - 1); + return true; + } + } catch (Exception $error) { + HesabixLogService::writeLogStr("Error in syncing last change id -> " . $error->getMessage()); + } + + return false; + } + + public static function SaveProductManuallyToHesabix($woocommerceCode, $attributeId, $hesabixCode): bool + { + + $isProductExistInHesabix = self::CheckExistenceOfTheProductInHesabix($hesabixCode); + if (!$isProductExistInHesabix) { + $isProductValidInWoocommerce = self::CheckValidityOfTheProductInWoocommerce($woocommerceCode, $attributeId, $hesabixCode); + if ($isProductValidInWoocommerce) { + + $product = wc_get_product($woocommerceCode); + if ($attributeId != 0) + $variation = wc_get_product($attributeId); + + if ($attributeId == 0) { + $hesabixItem = HesabixItemService::mapProduct($product, $woocommerceCode); + } else { + $hesabixItem = HesabixItemService::mapProductVariation($product, $variation, $woocommerceCode); + } + + + $api = new Hesabix_Api(); + $hesabixItem["Code"] = $hesabixCode; + $response = $api->itemSave($hesabixItem); + if ($response->Success) { + if ($attributeId == 0) + $productCode = $woocommerceCode; + else + $productCode = $attributeId; + HesabixLogService::log(array("Item successfully added to Hesabix. Hesabix code: " . $hesabixCode . " - Product code: " . $productCode)); + + $wpFaService = new HesabixWpFaService(); + $wpFa = $wpFaService->getWpFa('product', $woocommerceCode, $attributeId); + if (!$wpFa) { + $wpFa = new WpFa(); + $wpFa->idHesabix = $hesabixCode; + $wpFa->idWp = $woocommerceCode; + $wpFa->idWpAttribute = $attributeId; + $wpFa->objType = 'product'; + $wpFaService->save($wpFa); + HesabixLogService::log(array("Item successfully added. Hesabix code: " . (string) $hesabixCode . ". Product ID: $woocommerceCode - $attributeId")); + return true; + } + } else { + HesabixLogService::log(array("Error in saving product to hesabix. Hesabix given code: " . $hesabixCode)); + return false; + } + } + } + + return false; + } + + public static function CheckExistenceOfTheProductInHesabix($hesabixCode): bool + { + $api = new Hesabix_Api(); + $response = $api->itemGet($hesabixCode); + if ($response->Success) { + HesabixLogService::writeLogStr("کالا با کد(" . $hesabixCode . ") در حسابیکس موجود است."); + return true; + } else if ($response->ErrorCode == "112") { + return false; + } else { + HesabixLogService::writeLogStr("Error in getting the existence of the product"); + return true; + } + } + + public static function CheckValidityOfTheProductInWoocommerce($woocommerceCode, $attributeId, $hesabixCode): bool + { + + $wpFaService = new HesabixWpFaService(); + $code = $wpFaService->getProductCodeByWpId($woocommerceCode, $attributeId); + if ($code) { + HesabixLogService::writeLogStr("این کد حسابیکسی وارد شده به کالای دیگری متصل است." . $code . " - " . $woocommerceCode . " - " . $attributeId); + return false; + } + + + global $wpdb; + + if ($attributeId != 0) + $productId = $attributeId; + else + $productId = $woocommerceCode; + + $found = $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT(*) FROM {$wpdb->posts} + WHERE ID = %d", + $productId + ) + ); + + if ($found) { + + return true; + } else { + HesabixLogService::writeLogStr("product not found in woocommerce. Given product code: " . $woocommerceCode . "-" . $attributeId); + return false; + } + } + + function checkNationalCode($NationalCode): void + { + $identicalDigits = ['1111111111', '2222222222', '3333333333', '4444444444', '5555555555', '6666666666', '7777777777', '8888888888', '9999999999']; + + if (strlen($NationalCode) === 10) { + $summation = 0; + $j = 10; + for ($i = 0; $i < 9; $i++) { + $digit = substr($NationalCode, $i, 1); + $temp = $digit * $j; + $j -= 1; + $summation += $temp; + } + $controlDigit = substr($NationalCode, 9, 1); + $retrieve = $summation % 11; + + if (in_array($NationalCode, $identicalDigits) === false) { + if ($retrieve < 2) { + if ($controlDigit != $retrieve) { + wc_add_notice(__('please enter a valid national code', 'hesabix'), 'error'); + } + } else { + if ($controlDigit != (11 - $retrieve)) { + wc_add_notice(__('please enter a valid national code', 'hesabix'), 'error'); + } + } + } + } else { + wc_add_notice(__('please enter a valid national code', 'hesabix'), 'error'); + } + } + + public function checkNationalCodeWithPhone($nationalCode, $billingPhone): bool + { + $api = new Hesabix_Api(); + + $formattedPhoneNumber = $this->convertPersianPhoneDigitsToEnglish($billingPhone); + $formattedPhoneNumber = $this->formatPhoneNumber($formattedPhoneNumber); + + $response = $api->checkMobileAndNationalCode($nationalCode, $formattedPhoneNumber); + if ($response->Success) { + if ($response->Result->Status == 1) { + return $response->Result->Data->Matched; + } else { + return false; + } + } else { + HesabixLogService::writeLogStr('Error Occurred in Checking Mobile and NationalCode. ErrorCode: ' . $response->ErrorCode . " - ErrorMessage: " . $response->ErrorMessage); + return false; + } + } + + function checkWebsite($Website): void + { + if (filter_var($Website, FILTER_VALIDATE_URL)) { + + } else { + wc_add_notice(__('please enter a valid Website URL', 'hesabix'), 'error'); + } + } + + public static function enableDebugMode(): void + { + update_option('hesabix_debug_mode', 1); + } + + public static function disableDebugMode(): void + { + update_option('hesabix_debug_mode', 0); + } + + function formatPhoneNumber($phoneNumber) + { + $phoneNumber = preg_replace('/\D/', '', $phoneNumber); + + if (substr($phoneNumber, 0, 2) == '98') { + $phoneNumber = substr($phoneNumber, 2); + } + + if (substr($phoneNumber, 0, 1) == '9' && strlen($phoneNumber) == 10) { + $phoneNumber = '0' . $phoneNumber; + } + + if (strlen($phoneNumber) == 10 && substr($phoneNumber, 0, 1) == '9') { + $phoneNumber = '0' . $phoneNumber; + } + + return $phoneNumber; + } + + public function convertPersianPhoneDigitsToEnglish($inputString): string + { + $newNumbers = range(0, 9); + $persianDecimal = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'); + $arabicDecimal = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); + $arabic = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); + $persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'); + + $string = str_replace($persianDecimal, $newNumbers, $inputString); + $string = str_replace($arabicDecimal, $newNumbers, $string); + $string = str_replace($persian, $newNumbers, $string); + + return str_replace($arabic, $newNumbers, $string); + } + + public function convertPersianDigitsToEnglish($inputString) + { + $newNumbers = range(0, 9); + $persianDecimal = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'); + $arabicDecimal = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); + $arabic = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); + $persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'); + + $string = str_replace($persianDecimal, $newNumbers, $inputString); + $string = str_replace($arabicDecimal, $newNumbers, $string); + $string = str_replace($persian, $newNumbers, $string); + + return str_replace($arabic, $newNumbers, $string); + } + + public function formatTransactionFee($transactionFee, $amount) + { + if ($transactionFee && $transactionFee > 0) { + $func = new Hesabix_Admin_Functions(); + $transactionFee = $func->convertPersianDigitsToEnglish($transactionFee); + + if ($transactionFee < 100 && $transactionFee > 0) + $transactionFee /= 100; + $transactionFee *= $amount; + if ($transactionFee < 1) + $transactionFee = 0; + } + return $transactionFee; + } + + public function convertCityCodeToName($cityCode) + { + $citiesArray = [ + 1 => [ + 'title' => 'تهران', + 'cities' => [ + 1 => 'تهران', + 331 => 'اسلام شهر', + 1813 => 'ری', + 3341 => 'لواسان', + 3351 => 'شهریار', + 3371 => 'ورامین', + 3381 => 'پیشوا', + 3391 => 'پاکدشت', + 3751 => 'قدس', + 3761 => 'رباطکریم', + 3971 => 'دماوند', + 3981 => 'فیروزکوه', + 16531 => 'جاجرود (خسروآباد)', + 16551 => 'بومهن', + 16571 => 'شهرصنعتی خرمدشت', + 16581 => 'پردیس', + 18131 => 'باقر شهر', + 18141 => 'جعفرابادباقراف', + 18151 => 'مرقدامام ره', + 18161 => 'کهریزک', + 18171 => 'طورقوزاباد', + 18181 => 'قاسم ابادشوراباد', + 18191 => 'قمصر', + 18331 => 'حسن آباد', + 18341 => 'شمس اباد', + 18351 => 'ابراهیم اباد', + 18361 => 'چرمشهر', + 18371 => 'قلعه محمدعلی خان', + 18381 => 'فرودگاه امام خمینی', + 18391 => 'وهن اباد', + 18441 => 'قلعه نوخالصه', + 18451 => 'گل تپه کبیر', + 18461 => 'محمودابادپیرزاده', + 18471 => 'فرون اباد', + 18631 => 'خاورشهر', + 18641 => 'اسلام اباد', + 18651 => 'لپه زنگ', + 18661 => 'قیامدشت', + 18686 => 'قرچک', + 18791 => 'قوچ حصار', + 18986 => 'خلازیر', + 19338 => 'تجریش', + 31130 => 'نصیرشهر', + 31133 => 'شهرک صنعتی نصیرشهر', + 31136 => 'شهرک قلعه میر', + 31641 => 'صفادشت', + 31686 => 'اندیشه', + 31691 => 'ملارد', + 31694 => 'گرمدره', + 33131 => 'احمدابادمستوفی', + 33141 => 'فیروزبهرام', + 33151 => 'گلدسته', + 33171 => 'صالح آباد', + 33186 => 'شاطره', + 33191 => 'چهاردانگه', + 33361 => 'سعیدآباد', + 33451 => 'فشم', + 33461 => 'لواسان بزرگ', + 33541 => 'باغستان', + 33560 => 'صباشهر', + 33561 => 'شاهدشهر', + 33571 => 'فردوسیه', + 33581 => 'وحیدیه', + 33591 => 'لم اباد', + 33711 => 'قلعه سین', + 33741 => 'عسگرابادعباسی', + 33751 => 'دهماسین', + 33761 => 'باغخواص', + 33771 => 'ایجدان', + 33781 => 'ابباریک', + 33831 => 'جواد آباد', + 33841 => 'خاوه', + 33861 => 'جلیل اباد', + 33871 => 'کریم اباد', + 33881 => 'قلعه خواجه', + 33930 => 'شهرک عباس آباد', + 33931 => 'داوداباد', + 33941 => 'شریف آباد', + 33971 => 'پارچین', + 33981 => 'حصارامیر', + 33991 => 'خاتون اباد', + 37551 => 'نصیرآباد', + 37571 => 'گلستان', + 37581 => 'کلمه', + 37611 => 'پرند', + 37614 => 'شهر صنعتی پرند', + 37631 => 'سلطان اباد', + 37650 => 'حصارک پایین', + 37651 => 'نسیم شهر', + 37652 => 'حصارک بالا', + 37653 => 'سبزدشت', + 37656 => 'احمدآبادجانسپار', + 37661 => 'اسماعیل آباد', + 39720 => 'جابان', + 39731 => 'رودهن', + 39741 => 'آبعلی', + 39751 => 'کیلان', + 39761 => 'آبسرد', + 39771 => 'سربندان', + 39780 => 'مهرآباد', + 39781 => 'مشا', + 39791 => 'مرا', + 39811 => 'هرانده', + 39831 => 'درده', + 39841 => 'حصاربن', + 39851 => 'ارجمند', + 39861 => 'امیریه', + ], + ], + 2 => [ + 'title' => 'گيلان', + 'cities' => [ + 41 => 'رشت', + 431 => 'بندرانزلی', + 441 => 'لاهیجان', + 4331 => 'ابکنار', + 4341 => 'خمام', + 4351 => 'فومن', + 4361 => 'صومعه سرا', + 4371 => 'هشتپر', + 4381 => 'ماسال', + 4391 => 'آستارا', + 4431 => 'سیاهکل', + 4441 => 'آستانه اشرفیه', + 4451 => 'منجیل', + 4461 => 'رودبار', + 4471 => 'لنگرود', + 4481 => 'رودسر', + 4491 => 'کلاچای', + 43331 => 'کپورچال', + 43341 => 'جیرهنده', + 43351 => 'لیچارکی حسن رود', + 43361 => 'سنگر', + 43381 => 'سراوان', + 43391 => 'خشکبیجار', + 43431 => 'لشت نشاء', + 43451 => 'خواچکین', + 43461 => 'کوچصفهان', + 43471 => 'بلسبنه', + 43481 => 'چاپارخانه', + 43491 => 'جیرکویه', + 43513 => 'ماکلوان', + 43531 => 'لولمان', + 43541 => 'شفت', + 43551 => 'ملاسرا', + 43561 => 'چوبر', + 43571 => 'ماسوله', + 43581 => 'گشت', + 43591 => 'احمد سر گوراب', + 43631 => 'مرجقل', + 43641 => 'گوراب زرمیخ', + 43651 => 'طاهرگوراب', + 43661 => 'ضیابر', + 43671 => 'مرکیه', + 43681 => 'هنده خاله', + 43691 => 'نوخاله اکبری', + 43741 => 'شیله وشت', + 43751 => 'جوکندان بزرگ', + 43761 => 'لیسار', + 43771 => 'بازارخطبه سرا', + 43780 => 'چوبر', + 43781 => 'حویق', + 43791 => 'پلاسی', + 43811 => 'بازار جمعه', + 43841 => 'رضوانشهر', + 43861 => 'پره سر', + 43871 => 'پلنگ پاره', + 43891 => 'اسالم', + 43931 => 'شیخ محله', + 43941 => 'ویرمونی', + 43951 => 'سیبلی', + 43961 => 'لوندویل', + 43971 => 'مشند', + 43981 => 'کوته کومه', + 43991 => 'حیران', + 44141 => 'رودبنه', + 44331 => 'پایین محله پاشاکی', + 44341 => 'گرماور', + 44351 => 'لیش', + 44361 => 'بارکوسرا', + 44371 => 'شیرین نسا', + 44381 => 'خرارود', + 44391 => 'دیلمان', + 44431 => 'لسکوکلایه', + 44441 => 'کیسم', + 44451 => 'شیرکوه چهارده', + 44461 => 'دهشال', + 44471 => 'کیاشهر', + 44481 => 'دستک', + 44491 => 'پرگاپشت مهدی خانی', + 44531 => 'لوشان', + 44541 => 'بیورزین', + 44551 => 'جیرنده', + 44561 => 'بره سر', + 44581 => 'ویشان', + 44591 => 'کلیشم', + 44631 => 'علی اباد', + 44641 => 'رستم آباد', + 44651 => 'توتکابن', + 44661 => 'کلشتر', + 44681 => 'اسکولک', + 44691 => 'کوکنه', + 44731 => 'سلوش', + 44741 => 'چاف وچمخاله', + 44751 => 'شلمان', + 44761 => 'کومله', + 44771 => 'دیوشل', + 44781 => 'پروش پایین', + 44791 => 'اطاقور', + 44841 => 'حسن سرا', + 44851 => 'طول لات', + 44861 => 'رانکوه', + 44871 => 'چابکسر', + 44881 => 'جنگ سرا', + 44891 => 'واجارگاه', + 44931 => 'رحیم آباد', + 44941 => 'بلترک', + 44951 => 'املش', + 44971 => 'کجید', + 44981 => 'گرمابدشت', + 44991 => 'شوییل', + 44992 => 'پونل', + ], + ], + 3 => [ + 'title' => 'آذربايجان شرقي', + 'cities' => [ + 51 => 'تبریز', + 531 => 'میانه', + 541 => 'مرند', + 551 => 'مراغه', + 5331 => 'شهرجدیدسهند', + 5351 => 'اسکو', + 5361 => 'سردرود', + 5371 => 'آذر شهر', + 5381 => 'شبستر', + 5391 => 'هریس', + 5431 => 'هادیشهر', + 5441 => 'جلفا', + 5451 => 'اهر', + 5461 => 'کلیبر', + 5471 => 'سراب', + 5491 => 'بستان آباد', + 5541 => 'عجب شیر', + 5551 => 'بناب', + 5561 => 'ملکان', + 5571 => 'هشترود', + 5581 => 'قره آغاج', + 5586 => 'اغچه ریش', + 53331 => 'ترک', + 53351 => 'ترکمانچای', + 53361 => 'خاتون اباد', + 53371 => 'شیخدراباد', + 53381 => 'قره بلاغ', + 53391 => 'آقکند', + 53431 => 'اچاچی', + 53441 => 'گوندوغدی', + 53451 => 'پورسخلو', + 53461 => 'کنگاور', + 53481 => 'قویوجاق', + 53491 => 'ارموداق', + 53531 => 'کهنمو', + 53541 => 'اربط', + 53551 => 'خسرو شهر', + 53561 => 'لاهیجان', + 53571 => 'خاص اباد (خاصبان)', + 53581 => 'ایلخچی', + 53591 => 'سرای (سرای ده)', + 53631 => 'کجوار', + 53641 => 'خلجان', + 53651 => '(ینگی اسپران (سفیدان جد', + 53661 => 'باسمنج', + 53671 => '(شادبادمشایخ (پینه شلوا', + 53681 => 'کندرود', + 53691 => 'مایان سفلی', + 53731 => 'تیمورلو', + 53740 => 'خراجو', + 53741 => 'قدمگاه (بادام یار)', + 53751 => 'ممقان', + 53761 => 'گوگان', + 53771 => 'شیرامین', + 53791 => 'هفت چشمه', + 53811 => 'وایقان', + 53831 => 'امند', + 53840 => 'کوزه کنان', + 53841 => 'خامنه', + 53851 => 'سیس', + 53861 => 'صوفیان', + 53871 => 'شند آباد', + 53881 => 'تسوج', + 53891 => 'شرفخانه', + 53941 => 'مینق', + 53950 => 'کلوانق', + 53951 => 'بخشایش', + 53961 => 'سرند', + 53971 => 'زرنق', + 53981 => 'بیلوردی', + 53991 => 'خواجه', + 54331 => 'گلین قیه', + 54341 => 'هرزندجدید (چای هرزند)', + 54351 => 'بناب جدید', + 54361 => 'زنوز', + 54371 => 'دولت اباد', + 54381 => 'یکان کهریز', + 54391 => 'یامچی', + 54431 => 'شجاع', + 54441 => 'داران', + 54451 => 'سیه رود', + 54461 => 'نوجه مهر', + 54471 => 'کشکسرای', + 54481 => 'خاروانا', + 54491 => 'هوراند', + 54531 => 'چول قشلاقی', + 54541 => 'ورگهان', + 54551 => 'افیل', + 54561 => 'اذغان (ازغان)', + 54571 => 'سیه کلان', + 54581 => 'ورزقان', + 54591 => 'اق براز', + 54631 => 'مولان', + 54641 => 'خمارلو', + 54651 => 'عاشقلو', + 54661 => 'اسکلو (اسگلو)', + 54671 => 'آبش احمد', + 54681 => 'یوزبند', + 54682 => 'شهرک صنعتی کاغذکنان', + 54685 => 'کندوان', + 54686 => 'تیل', + 54691 => 'لاریجان', + 54731 => 'اسبفروشان', + 54741 => 'ابرغان', + 54750 => 'دوزدوزان', + 54751 => 'شربیان', + 54761 => 'مهربان', + 54771 => 'رازلیق', + 54781 => 'اغمیون', + 54791 => 'اردها', + 54931 => 'قره چای حاج علی', + 54941 => 'قره بابا', + 54951 => 'سعیداباد', + 54961 => 'الانق', + 54971 => 'کردکندی', + 54981 => 'تیکمه داش', + 54991 => 'قره چمن', + 55330 => 'ورجوی', + 55341 => 'گل تپه', + 55351 => 'خداجو', + 55361 => 'داش اتان', + 55371 => 'داش بلاغ بازار', + 55381 => 'صومعه', + 55391 => 'علویان', + 55431 => 'شیراز', + 55441 => 'خضرلو', + 55451 => 'ینگجه', + 55461 => 'مهماندار', + 55471 => 'خانیان', + 55481 => 'دانالو', + 55491 => 'رحمانلو', + 55531 => 'زاوشت', + 55541 => 'القو', + 55551 => 'روشت بزرگ', + 55561 => 'خوشه مهر (خواجه امیر)', + 55571 => 'زوارق', + 55581 => '(خانه برق قدیم (شورخانه ب', + 55631 => 'لکلر', + 55641 => 'بایقوت', + 55651 => 'اروق', + 55661 => 'اق منار', + 55671 => 'لیلان', + 55681 => 'طوراغای (طوراغایی)', + 55731 => 'اوشندل', + 55741 => 'علی ابادعلیا', + 55751 => 'ذوالبین', + 55761 => 'نظر کهریزی', + 55771 => 'اتش بیگ', + 55781 => 'سلوک', + 55791 => 'نصیرابادسفلی', + 55831 => 'ارسگنای سفلی', + 55841 => '(سلطان اباد (س انمکزار', + 55851 => 'قلعه حسین اباد', + 55871 => 'ذاکرکندی', + 55881 => 'قوچ احمد', + 55891 => 'اغ زیارت', + ], + ], + 4 => [ + 'title' => 'خوزستان', + 'cities' => [ + 61 => 'اهواز', + 631 => 'آبادان', + 641 => 'خرمشهر', + 6331 => 'اروندکنار', + 6341 => 'ملاثانی', + 6351 => 'بندرماهشهر', + 6361 => 'بهبهان', + 6371 => 'آغاجاری', + 6381 => 'رامهرمز', + 6391 => 'ایذه', + 6431 => 'شادگان', + 6441 => 'سوسنگرد', + 6451 => 'شوشتر', + 6461 => 'دزفول', + 6471 => 'شوش', + 6481 => 'اندیمشک', + 6491 => 'مسجدسلیمان', + 61431 => 'الهائی', + 61481 => 'شیبان', + 61491 => 'ویس', + 63331 => 'فیاضی', + 63341 => 'تنگ یک', + 63351 => 'چوئبده', + 63361 => 'نهرسلیم', + 63381 => 'نهرابطر', + 63431 => 'عین دو', + 63441 => 'حمیدیه', + 63451 => 'ام الطمیر (سیدیوسف)', + 63461 => 'کوت عبدالله', + 63471 => 'قلعه چنعان', + 63481 => 'کریت برومی', + 63491 => 'غیزانیه بزرگ', + 63531 => 'چم کلگه', + 63541 => 'چمران', + 63561 => 'بندرامام خمینی', + 63571 => 'صالح شهر', + 63581 => 'اسیاب', + 63591 => 'هندیجان', + 63640 => 'تشان', + 63641 => 'گروه پدافندهوایی بهبها', + 63651 => 'شاه غالب ده ابراهیم', + 63661 => 'کردستان بزرگ', + 63671 => 'منصوریه', + 63681 => 'سردشت', + 63731 => 'امیدیه', + 63751 => 'میانکوه', + 63771 => 'زهره', + 63831 => 'رودزرد', + 63851 => 'نفت سفید', + 63861 => 'مشراگه', + 63871 => 'رامشیر', + 63881 => 'جایزان', + 63891 => 'دره تونم نمی', + 63931 => 'میداود', + 63941 => 'صیدون', + 63951 => 'باغ ملک', + 63961 => 'قلعه تل', + 63971 => 'چنارستان', + 63981 => 'پشت پیان', + 63991 => 'دهدز', + 64330 => 'خنافره', + 64331 => 'عبودی', + 64341 => 'دارخوین', + 64351 => 'درویشی', + 64361 => 'بوزی سیف', + 64371 => 'مینوشهر', + 64381 => 'حفاری شرقی', + 64431 => 'بروایه یوسف', + 64440 => 'کوت سیدنعیم', + 64441 => 'ابوحمیظه', + 64451 => 'هویزه', + 64461 => 'یزدنو', + 64471 => 'رفیع', + 64481 => 'بستان', + 64491 => 'سیدعباس', + 64510 => 'سرداران', + 64511 => 'شرافت', + 64531 => 'گوریه', + 64541 => 'جنت مکان', + 64551 => 'گتوند', + 64560 => 'ترکالکی', + 64561 => 'سماله', + 64571 => 'شهرک نورمحمدی', + 64581 => 'گاومیش اباد', + 64591 => 'عرب حسن', + 64631 => 'صفی آباد', + 64640 => 'چغامیش', + 64641 => 'حمزه', + 64650 => 'شمس آباد', + 64651 => 'امام', + 64652 => 'سیاه منصور', + 64661 => 'میانرود', + 64681 => 'چلون', + 64691 => 'سالند', + 64730 => 'حر', + 64731 => 'شاوور', + 64741 => 'مزرعه یک', + 64751 => 'خسرجی راضی حمد', + 64761 => 'الوان', + 64771 => 'علمه تیمورابوذرغفاری', + 64781 => 'شهرک بهرام', + 64791 => 'فتح المبین', + 64830 => 'آزادی', + 64831 => 'شهرک انصار', + 64841 => 'خواجوی', + 64850 => 'بیدروبه', + 64851 => 'حسینیه', + 64861 => 'کلگه دره دو', + 64871 => 'تله زنگ پایین', + 64881 => 'چم گلک', + 64931 => 'روستای عنبر', + 64941 => 'لالی', + 64951 => 'دره بوری', + 64961 => 'هفتگل', + 64971 => 'کوشکک', + 64980 => 'آبژدان', + 64981 => 'قلعه خواجه', + 64991 => 'گلگیر', + ], + ], + 5 => [ + 'title' => 'فارس', + 'cities' => [ + 71 => 'شیراز', + 731 => 'کازرون', + 741 => 'جهرم', + 7331 => 'قائمیه', + 7341 => 'زرقان', + 7351 => 'نور آباد', + 7361 => 'اردکان', + 7371 => 'مرودشت', + 7381 => 'اقلید', + 7391 => 'آباده', + 7431 => 'لار', + 7441 => 'گراش', + 7451 => 'استهبان', + 7461 => 'فسا', + 7471 => 'فیروز آباد', + 7481 => 'داراب', + 7491 => 'نی ریز', + 71431 => 'بندامیر', + 71451 => 'خیرابادتوللی', + 71461 => 'داریان', + 71491 => 'کم جان', + 71551 => 'شوریجه', + 71561 => 'مهارلو', + 71571 => 'کوهنجان', + 71581 => 'سلطان آباد', + 71591 => 'تفیهان', + 71641 => 'طسوج', + 71651 => 'اکبراباد', + 71661 => 'مظفری', + 71671 => 'کوشک بیدک', + 71681 => 'فتح اباد', + 71691 => 'ده شیب', + 71741 => 'خانه زنیان', + 71781 => 'پاسگاه چنارراهدار', + 71881 => 'موردراز', + 71991 => 'شهرجدیدصدرا', + 73131 => 'کلاتون', + 73141 => 'کلانی', + 73151 => 'کمارج مرکزی', + 73161 => 'مهبودی علیا', + 73171 => 'وراوی', + 73311 => 'حکیم باشی نصف میان (بالا)', + 73331 => 'کنار تخته', + 73341 => 'خشت', + 73351 => 'انارستان', + 73361 => 'نودان', + 73371 => 'مهرنجان', + 73381 => 'جره', + 73391 => 'بالاده', + 73411 => 'لپوئی', + 73431 => 'کامفیروز', + 73441 => 'خرامه', + 73451 => 'سروستان', + 73461 => 'کوار', + 73471 => 'رامجرد', + 73491 => 'گویم', + 73511 => 'خومه زار', + 73531 => 'بابامنیر', + 73541 => 'اهنگری', + 73551 => 'پرین', + 73560 => 'کوپن', + 73561 => 'حسین ابادرستم', + 73571 => 'مصیری', + 73591 => 'میشان سفلی', + 73611 => 'بهرغان', + 73631 => 'بیضا', + 73641 => 'هماشهر', + 73651 => 'کمهر', + 73661 => 'راشک علیا', + 73671 => 'هرایجان', + 73681 => 'بانش', + 73711 => 'کوشک', + 73731 => 'خانیمن', + 73741 => 'سعادت شهر', + 73751 => 'قادرآباد', + 73761 => 'ارسنجان', + 73771 => 'سیدان', + 73791 => 'کوشکک', + 73810 => 'مزایجان', + 73811 => 'خنجشت', + 73831 => 'امامزاده اسماعیل', + 73840 => 'مادرسلیمان', + 73841 => 'حسن آباد', + 73851 => 'اسپاس', + 73861 => 'سده', + 73881 => 'دژکرد', + 73891 => 'شهرمیان', + 73911 => 'بهمن', + 73931 => 'صغاد', + 73940 => 'حسامی', + 73941 => 'بوانات', + 73942 => 'کره ای', + 73951 => 'صفاشهر', + 73981 => 'سورمق', + 73991 => 'ایزدخواست', + 74110 => 'دوزه', + 74161 => 'بندبست', + 74171 => 'باب انار', + 74311 => 'فیشور', + 74331 => 'اوز', + 74341 => 'لامرد', + 74351 => 'جویم', + 74361 => 'بنارویه', + 74370 => 'خور', + 74371 => 'لطیفی', + 74380 => 'عمادده', + 74381 => 'بیرم', + 74390 => 'اهل', + 74391 => 'اشکنان', + 74410 => 'اسیر', + 74411 => 'کهنه', + 74414 => 'خوزی', + 74431 => 'خنج', + 74441 => 'علامرودشت', + 74450 => 'گله دار', + 74451 => 'مهر', + 74461 => 'رونیز', + 74471 => 'بنوان', + 74481 => 'ایج', + 74491 => 'درب قلعه', + 74541 => 'خاوران', + 74551 => 'قطب آباد', + 74561 => 'دنیان', + 74571 => 'سروو', + 74581 => 'مانیان', + 74591 => 'به جان', + 74611 => 'کوشک قاضی', + 74641 => 'نوبندگان', + 74650 => 'قره بلاغ', + 74651 => 'ششده', + 74661 => 'قاسم ابادسفلی', + 74671 => 'زاهدشهر', + 74681 => 'میانده', + 74691 => 'صحرارود', + 74711 => 'بایگان', + 74714 => 'امام شهر', + 74731 => 'مبارک آباد', + 74741 => 'میمند', + 74751 => 'افزر', + 74760 => 'قیر', + 74761 => 'کارزین', + 74771 => 'فراشبند', + 74780 => 'نوجین', + 74781 => 'دهرم', + 74791 => 'جوکان', + 74811 => 'مادوان', + 74814 => 'دبیران', + 74831 => 'ماه سالاری', + 74841 => 'رستاق', + 74850 => 'شهرپیر', + 74861 => 'حاجی آباد', + 74871 => 'فدامی', + 74880 => 'دوبرجی', + 74881 => 'چمن مروارید', + 74891 => 'جنت شهر', + 74911 => 'لای حنا', + 74931 => 'آباده طشک', + 74941 => 'قطاربنه', + 74971 => 'مشکان', + 74981 => 'قطرویه', + 74991 => 'هرگان', + ], + ], + 6 => [ + 'title' => 'اصفهان', + 'cities' => [ + 81 => 'اصفهان', + 831 => 'شاهین شهر', + 841 => 'خمینی شهر', + 851 => 'نجف آباد', + 861 => 'شهرضا', + 871 => 'کاشان', + 8161 => 'منطقه صنعتی محموداباد', + 8331 => 'مورچه خورت', + 8341 => 'دولت آباد', + 8351 => 'میمه', + 8361 => 'خور', + 8371 => 'کوهپایه', + 8381 => 'اردستان', + 8391 => 'نائین', + 8431 => 'درچه پیاز', + 8441 => 'زواره', + 8451 => 'فلاورجان', + 8461 => 'قهدریجان', + 8471 => 'زرین شهر', + 8481 => 'مبارکه', + 8491 => 'فولادشهر', + 8531 => 'تیران', + 8541 => 'دهق', + 8551 => 'علویجه', + 8561 => 'داران', + 8571 => 'چادگان', + 8591 => 'فریدونشهر', + 8641 => 'دهاقان', + 8651 => 'اسفرجان', + 8661 => 'سمیرم', + 8671 => 'حنا', + 8681 => 'مهرگرد', + 8731 => 'جوشقان استرک', + 8741 => 'آران و بیدگل', + 8751 => 'قمصر', + 8761 => 'نطنز', + 8771 => 'گلپایگان', + 8781 => 'گوگد', + 8791 => 'خوانسار', + 81351 => 'تودشک', + 81391 => 'سگزی', + 81431 => 'بهارستان', + 81561 => 'خوراسگان', + 81594 => 'گورت', + 81671 => 'دستجا', + 81681 => 'زیار', + 81751 => 'نصرآباد', + 81789 => 'ابریشم', + 81799 => 'اصفهان (سپاهان شهر)', + 83341 => 'پادگان اموزشی امام ص', + 83351 => 'پالایشگاه اصفهان', + 83361 => 'کلهرود', + 83371 => 'گرگاب', + 83431 => 'دستگرد', + 83441 => 'گز برخوار', + 83451 => 'خورزوق', + 83461 => 'حبیب آباد', + 83531 => 'موته', + 83541 => 'وزوان', + 83551 => 'لای بید', + 83561 => 'رباطاقاکمال', + 83581 => 'خسرواباد', + 83591 => 'کمشچه', + 83631 => 'جندق', + 83641 => 'فرخی', + 83651 => 'مزیک', + 83661 => 'مهرجان', + 83671 => 'بیاضه', + 83681 => 'چوپانان', + 83691 => 'بلان', + 83731 => 'محمدآباد', + 83741 => 'هرند', + 83751 => 'ورزنه', + 83761 => 'قهجاورستان', + 83771 => 'نیک آباد', + 83781 => 'اژیه', + 83791 => 'حسن اباد', + 83831 => 'کچومثقال', + 83841 => 'ظفرقند', + 83851 => 'نهوج', + 83861 => 'نیسیان', + 83871 => 'ومکان', + 83881 => 'همسار', + 83891 => 'فسخود', + 83931 => 'فوداز', + 83941 => 'اشکستان', + 83951 => 'کجان', + 83961 => 'نیستانک', + 83971 => 'انارک', + 83991 => 'بافران', + 84331 => 'تیرانچی', + 84341 => 'کوشک', + 84371 => 'قلعه امیریه', + 84431 => 'مهاباد', + 84441 => 'درقه', + 84451 => 'شهراب', + 84461 => 'تورزن', + 84471 => 'کریم اباد', + 84481 => 'تلک اباد', + 84491 => 'موغار', + 84531 => 'خوانسارک', + 84541 => 'پیربکران', + 84561 => 'کلیشادوسودرجان', + 84581 => 'کرسگان', + 84591 => 'بهاران شهر', + 84631 => 'سهروفیروزان', + 84651 => 'ایمانشهر', + 84671 => 'زازران', + 84681 => 'شرودان', + 84691 => 'جوجیل', + 84731 => 'ورنامخواست', + 84741 => 'سده لنجان', + 84751 => 'چرمهین', + 84761 => 'باغ بهادران', + 84771 => 'نوگوران', + 84781 => 'چمگردان', + 84791 => 'کرچگان', + 84831 => 'دیزیچه', + 84841 => 'زیباشهر', + 84851 => 'باغ ملک', + 84861 => 'دهسرخ', + 84871 => 'پلی اکریل', + 84881 => 'فولادمبارکه', + 84891 => 'کرکوند', + 84931 => 'زاینده رود', + 84951 => 'چم نور', + 84961 => 'کچوییه', + 84971 => 'اشیان', + 84981 => 'طالخونچه', + 84991 => 'تاسیسات سدنکواباد', + 85331 => 'رضوانشهر', + 85341 => 'ورپشت', + 85351 => 'عسگران', + 85371 => 'عزیزاباد', + 85381 => 'میراباد', + 85391 => 'حاجی اباد', + 85441 => 'خیراباد', + 85451 => 'اشن', + 85471 => 'خونداب', + 85531 => 'حسین اباد', + 85631 => 'غرغن', + 85641 => 'دامنه', + 85651 => 'بوئین و میاندشت', + 85661 => 'زرنه', + 85671 => 'بلطاق', + 85681 => 'کرچ', + 85691 => 'قره بلطاق', + 85711 => 'افوس', + 85731 => 'سازمان عمران زاینده رود', + 85741 => 'مشهدکاوه', + 85751 => 'اسکندری', + 85761 => 'رزوه', + 85771 => 'نهرخلج', + 85781 => 'چاه غلامرضارحیمی', + 85791 => 'اورگان', + 85831 => 'گلدشت', + 85851 => 'جوزدان', + 85861 => 'کهریزسنگ', + 85931 => 'نهضت اباد', + 85941 => 'قلعه سرخ', + 85961 => 'اسلام ابادموگویی', + 85971 => 'مصیر', + 85991 => 'برف انبار', + 86331 => 'قمشلو', + 86341 => 'پوده', + 86351 => 'مهیار', + 86361 => 'پرزان', + 86371 => 'منوچهراباد', + 86391 => 'شهرک صنایع شیمیایی ر', + 86431 => 'همگین', + 86451 => 'گلشن', + 86461 => 'کهرویه', + 86471 => 'قصرچم', + 86531 => 'امین اباد', + 86541 => 'مقصودبیک', + 86551 => 'سولار', + 86561 => 'منظریه', + 86631 => 'گرموک', + 86651 => 'هست', + 86671 => 'ونک', + 86751 => 'کهنگان', + 86771 => 'کمه', + 86781 => 'مورک', + 86791 => 'چهارراه', + 86831 => 'ده نسا سفلی', + 86841 => 'اغداش', + 86851 => 'چشمه رحمان', + 86861 => 'ورق', + 86881 => 'سعادت اباد', + 86891 => 'فتح اباد', + 87181 => 'نیاسر', + 87331 => 'سن سن', + 87351 => 'ده زیره', + 87361 => 'رحق', + 87371 => 'اب شیرین', + 87381 => 'نشلج', + 87391 => 'مشکات', + 87431 => 'سفیدشهر', + 87441 => 'مزرعه صدر', + 87461 => 'نوش آباد', + 87481 => 'ابوزیدآباد', + 87491 => 'کاغذی', + 87541 => 'قهرود', + 87551 => 'جوشقان و کامو', + 87561 => 'برزک', + 87571 => 'اسحق اباد', + 87581 => 'وادقان', + 87591 => 'اذان', + 87631 => 'طرق رود', + 87641 => 'اریسمان', + 87651 => 'ابیانه', + 87661 => 'بادرود', + 87671 => 'خالدآ باد', + 87681 => 'اوره', + 87731 => 'ملازجان', + 87741 => 'سعیداباد', + 87751 => 'مرغ', + 87771 => 'قرغن', + 87781 => 'کوچری', + 87831 => 'کلوچان', + 87841 => 'گلشهر', + 87861 => 'زرنجان', + 87871 => 'وانشان', + 87881 => 'تیکن', + 87931 => 'سنگ سفید', + 87941 => 'رحمت اباد', + 87951 => 'خم پیچ', + 87961 => 'مهراباد', + 87971 => 'تیدجان', + 87981 => 'خشکرود', + 87991 => 'ویست', + ], + ], + 7 => [ + 'title' => 'خراسان رضوي', + 'cities' => [ + 91 => 'مشهد', + 931 => 'نیشابور', + 951 => 'تربت حیدریه', + 961 => 'سبزوار', + 9331 => 'فیروزه', + 9341 => 'درود', + 9351 => 'طرقبه', + 9361 => 'چناران', + 9371 => 'کلات', + 9381 => 'سرخس', + 9391 => 'فریمان', + 9471 => 'قوچان', + 9491 => 'درگز', + 9531 => 'فیض آباد', + 9541 => 'رشتخوار', + 9551 => 'کدکن', + 9561 => 'خواف', + 9571 => 'تربت جام', + 9581 => 'صالح آباد', + 9591 => 'تایباد', + 9631 => 'داورزن', + 9641 => 'جغتای', + 9651 => 'ششتمد', + 9671 => 'کاشمر', + 9681 => 'بردسکن', + 9691 => 'گناباد', + 91671 => 'رضویه', + 93161 => 'همت آباد', + 93331 => 'شوراب', + 93341 => 'گلبوی پایین', + 93351 => 'مبارکه', + 93361 => 'چکنه', + 93371 => 'برزنون', + 93381 => 'فدیشه', + 93391 => 'بار', + 93431 => 'میراباد', + 93441 => 'فرخک', + 93451 => 'خرو', + 93461 => 'قدمگاه', + 93471 => 'اسحق اباد', + 93481 => 'خوجان', + 93491 => 'عشق آباد', + 93541 => 'ملک آباد', + 93551 => 'کورده', + 93561 => 'شاندیز', + 93571 => 'طوس سفلی', + 93581 => 'قرقی سفلی (شهیدکاوه)', + 93591 => 'کنه بیست', + 93631 => 'رادکان', + 93641 => 'سیداباد', + 93651 => 'گلبهار', + 93661 => 'سلوگرد', + 93671 => 'ارداک', + 93681 => 'بقمج', + 93691 => 'گلمکان', + 93741 => 'میامی', + 93751 => 'چاهک', + 93761 => 'شهرزو', + 93771 => 'گوش', + 93781 => 'نریمانی سفلی', + 93791 => 'تقی اباد', + 93831 => 'کچولی', + 93841 => 'شیرتپه', + 93851 => 'پس کمر', + 93861 => 'مزدآوند', + 93871 => 'بزنگان', + 93881 => 'گنبدلی', + 93891 => 'کندک لی', + 93931 => 'کته شمشیرسفلی', + ], + ], + 8 => [ + 'title' => 'قزوين', + 'cities' => [ + 341 => 'قزوین', + 3431 => 'الوند', + 3441 => 'آبیک', + 3451 => 'بوئین زهرا', + 3461 => 'آوج', + 3481 => 'تاکستان', + 3491 => 'محمدیه', + 34131 => 'محمودآبادنمونه', + 34151 => 'بیدستان', + 34161 => 'شریفیه', + 34171 => 'اقبالیه', + 34313 => 'نصرت آباد', + 34331 => 'الولک', + 34341 => 'کاکوهستان', + 34351 => 'فلار', + 34381 => 'مینودشت', + 34391 => 'زوارک', + 34431 => 'صمغ اباد', + 34441 => 'ناصراباد', + 34461 => 'رشتقون', + 34471 => 'قشلاق', + 34481 => 'خاکعلی', + 34491 => 'شهرک صنعتی لیا (قدیم)', + 34531 => 'سگز آباد', + 34541 => 'عصمت اباد', + 34551 => 'خرم اباد', + 34561 => 'اسفرورین', + 34571 => 'شال', + 34581 => 'دانسفهان', + 34631 => 'کلنجین', + 34641 => 'آبگرم', + 34651 => 'استبلخ', + 34671 => 'ارداق', + 34681 => 'نیارج', + 34691 => 'حصارولیعصر', + 34731 => 'ماهین', + 34741 => 'سیردان', + 34761 => 'سیاهپوش', + 34781 => 'نیارک', + 34791 => 'اقابابا', + 34811 => 'نرجه', + 34831 => 'خرمدشت', + 34851 => 'ضیاءآباد', + 34871 => 'حسین اباد', + 34891 => 'رحیم اباد', + 34913 => 'مهرگان', + 34931 => 'معلم کلایه', + 34941 => 'یحیی اباد', + 34951 => 'نیکویه', + 34961 => 'رازمیان', + 34971 => 'کوهین', + ], + ], + 9 => [ + 'title' => 'سمنان', + 'cities' => [ + 351 => 'سمنان', + 361 => 'شاهرود', + 3531 => 'علا', + 3541 => 'ابخوری', + 3551 => 'سرخه', + 3561 => 'مهدیشهر', + 3571 => 'شهمیرزاد', + 3581 => 'گرمسار', + 3591 => 'ایوانکی', + 3631 => 'میامی', + 3641 => 'بسطام', + 3651 => 'مجن', + 3661 => 'بیارجمند', + 3671 => 'دامغان', + 3681 => 'امیریه', + 35331 => 'خیراباد', + 35341 => 'ایستگاه میان دره', + 35381 => 'اهوان', + 35431 => 'جام', + 35441 => 'دوزهیر', + 35451 => 'معدن نمک', + 35531 => 'نظامی', + 35541 => 'اسداباد', + 35551 => 'لاسجرد', + 35561 => 'سیداباد', + 35571 => 'عبدالله ابادپایین', + 35581 => 'بیابانک', + 35591 => 'مومن اباد', + 35631 => 'درجزین', + 35641 => 'دربند', + 35651 => 'گل رودبار', + 35661 => 'ابگرم', + 35671 => 'افتر', + 35731 => 'فولادمحله', + 35741 => 'ده صوفیان', + 35751 => 'هیکو', + 35761 => 'چاشم', + 35831 => 'کردوان', + 35841 => 'مندولک', + 35851 => 'داوراباد', + 35861 => 'آرادان', + 35881 => 'بن کوه', + 35891 => 'کهن آباد', + 35931 => 'حسین ابادکوروس', + 35941 => 'کرک', + 35951 => 'گلستانک', + 35961 => 'لجران', + 36331 => 'جودانه', + 36341 => 'ابراهیم اباد', + 36351 => 'بکران', + 36361 => 'کرداباد', + 36371 => 'نردین', + 36381 => 'سوداغلان', + 36391 => 'فرومد', + 36431 => 'ابرسیج', + 36441 => 'میغان', + 36451 => 'قلعه نوخرقان', + 36461 => 'چهلدخترپادگان', + 36471 => 'کلاته خیج', + 36531 => 'نگارمن', + 36541 => 'دهملا', + 36551 => 'رویان', + 36561 => 'بدشت', + 36571 => 'سطوه', + 36581 => 'طرود', + 36591 => 'مغان', + 36631 => 'گیور', + 36641 => 'دستجرد', + 36651 => 'مسیح اباد', + 36661 => 'احمداباد', + 36671 => 'زمان اباد', + 36681 => 'سلمرود', + 36731 => 'جزن', + 36741 => 'برم', + 36751 => 'محمداباد', + 36761 => 'معصوم اباد', + 36771 => 'فرات', + 36781 => 'علیان', + 36791 => 'عمروان', + 36831 => 'قوشه', + 36841 => 'دروار', + 36851 => 'استانه', + 36861 => 'دیباج', + 36871 => 'طرزه', + 36881 => 'مهماندوست', + 36891 => 'کلاته ملا', + 36931 => 'قدرت اباد', + ], + ], + 10 => [ + 'title' => 'قم', + 'cities' => [ + 371 => 'قم', + 3731 => 'قنوات', + 3741 => 'دستجرد', + 37331 => 'امیرابادگنجی', + 37341 => 'قمرود', + 37351 => 'کهک', + 37361 => 'قلعه چم', + 37431 => 'قاهان', + 37441 => 'جعفریه', + 37451 => 'جنداب', + 37461 => 'سلفچگان', + ], + ], + 11 => [ + 'title' => 'مركزي', + 'cities' => [ + 381 => 'اراک', + 391 => 'ساوه', + 3771 => 'پرندک', + 3781 => 'محلات', + 3791 => 'دلیجان', + 3831 => 'کرهرود', + 3841 => 'خنداب', + 3851 => 'کمیجان', + 3861 => 'شازند', + 3871 => 'آستانه', + 3881 => 'خمین', + 3891 => 'رباطمراد', + 3931 => 'غرق آباد', + 3941 => 'مامونیه', + 3951 => 'تفرش', + 3961 => 'آشتیان', + 3991 => 'شهرجدیدمهاجران', + 37731 => 'سلطان اباد', + 37741 => 'اصفهانک', + 37751 => 'حسین اباد', + 37761 => 'خشکرود', + 37771 => 'حکیم اباد', + 37781 => 'یحیی اباد', + 37791 => 'صدراباد', + 37841 => 'نیمور', + 37851 => 'نخجیروان', + 37861 => 'باقراباد', + 37871 => 'بزیجان', + 37881 => 'عیسی اباد', + 37891 => 'خورهه', + 37961 => 'نراق', + 38341 => 'ساروق', + 38351 => 'داودآباد', + 38361 => 'کارچان', + 38451 => 'جاورسیان', + 38461 => 'ادشته', + 38471 => 'استوه', + 38481 => 'سنجان', + 38491 => 'اناج', + 38531 => 'وفس', + 38541 => 'خسروبیگ', + 38551 => 'میلاجرد', + 38561 => 'سمقاور', + 38571 => 'هزاوه', + 38631 => 'قدمگاه', + 38641 => 'هفته', + 38651 => 'لنجرود', + 38661 => 'توره', + 38671 => 'کزاز', + 38681 => 'کتیران بالا', + 38691 => 'نهرمیان', + 38731 => 'سرسختی بالا', + 38741 => 'لوزدرعلیا', + 38761 => 'هندودر', + 38771 => 'تواندشت علیا', + 38781 => 'مالمیر', + 38791 => 'چهارچریک', + 38841 => 'چهارچشمه', + 38851 => 'لکان', + 38861 => 'قورچی باشی', + 38871 => 'ورچه', + 38881 => 'فرفهان', + 38891 => 'امامزاده ورچه', + 38931 => 'رباطکفسان', + 38941 => 'ریحان علیا', + 38951 => 'جزنق', + 38961 => 'خوراوند', + 38971 => 'میشیجان علیا', + 38981 => 'گلدشت', + 38991 => 'دهنو', + 39331 => 'نوبران', + 39351 => 'یل اباد', + 39361 => 'رازقان', + 39371 => 'الویر', + 39381 => 'دوزج', + 39391 => 'علیشار', + 39431 => 'بالقلو', + 39441 => 'زاویه', + 39451 => 'چمران', + 39461 => 'قاقان', + 39471 => 'سامان', + 39481 => 'دخان', + 39491 => 'مراغه', + 39531 => 'فرمهین', + 39541 => 'شهراب', + 39551 => 'زاغر', + 39561 => 'کهک', + 39571 => 'فشک', + 39581 => 'اهنگران', + 39631 => 'مزرعه نو', + 39641 => 'صالح اباد', + 39651 => 'سیاوشان', + 39661 => 'اهو', + ], + ], + 12 => [ + 'title' => 'زنجان', + 'cities' => [ + 451 => 'زنجان', + 4531 => 'زرین آباد', + 4541 => 'ماهنشان', + 4551 => 'سلطانیه', + 4561 => 'ابهر', + 4571 => 'خرمدره', + 4581 => 'قیدار', + 4591 => 'آب بر', + 45331 => 'همایون', + 45341 => 'بوغداکندی', + 45351 => 'اژدهاتو', + 45371 => 'اسفجین', + 45381 => 'ارمغانخانه', + 45391 => 'قبله بلاغی', + 45431 => 'پری', + 45441 => 'اندابادعلیا', + 45451 => 'قره گل', + 45461 => 'نیک پی', + 45471 => 'دندی', + 45481 => 'سونتو', + 45491 => 'قلتوق', + 45531 => 'گوزلدره', + 45551 => 'سنبل اباد', + 45641 => 'درسجین', + 45651 => 'دولت اباد', + 45661 => 'کینه ورس', + 45731 => 'هیدج', + 45741 => 'صائین قلعه', + 45781 => 'اقبلاغ سفلی', + 45791 => 'سهرورد', + 45831 => 'کرسف', + 45841 => 'سجاس', + 45851 => 'محموداباد', + 45861 => 'باش قشلاق', + 45871 => 'گرماب', + 45881 => 'زرین رود', + 45891 => 'کهلا', + 45931 => 'گیلوان', + 45941 => 'دستجرده', + 45951 => 'سعیداباد', + 45961 => 'چورزق', + 45971 => 'حلب', + 45981 => 'درام', + ], + ], + 13 => [ + 'title' => 'مازندران', + 'cities' => [ + 461 => 'آمل', + 471 => 'بابل', + 481 => 'ساری', + 4631 => 'محمودآباد', + 4641 => 'نور', + 4651 => 'نوشهر', + 4661 => 'چالوس', + 4671 => 'سلمانشهر', + 4681 => 'تنکابن', + 4691 => 'رامسر', + 4731 => 'امیرکلا', + 4741 => 'بابلسر', + 4751 => 'فریدونکنار', + 4761 => 'قائم شهر', + 4771 => 'جویبار', + 4781 => 'زیر آب', + 4791 => 'پل سفید', + 4831 => 'کیاسر', + 4841 => 'نکا', + 4851 => 'بهشهر', + 4861 => 'گلوگاه', + 46181 => 'دابودشت', + 46331 => 'معلم کلا', + 46341 => 'سرخرود', + 46351 => 'وسطی کلا', + 46361 => 'رینه', + 46371 => 'سوا', + 46381 => 'باییجان', + 46391 => 'گزنک', + 46411 => 'ایزدشهر', + 46431 => 'چمستان', + 46441 => 'بنفشه ده', + 46451 => 'رییس کلا', + 46461 => 'اوز', + 46471 => 'بلده', + 46481 => 'تاکر', + 46491 => 'گلندرود', + 46531 => 'چلندر', + 46541 => 'صلاح الدین کلا', + 46551 => 'نارنج بن', + 46561 => 'رویان', + 46571 => 'کجور', + 46581 => 'پول', + 46591 => 'لشکنار', + 46631 => 'هیچرود', + 46641 => 'مرزن آباد', + 46651 => 'کردیچال', + 46661 => 'کلاردشت', + 46671 => 'کلنو', + 46681 => 'دلیر', + 46691 => 'سیاه بیشه', + 46731 => 'کلارآباد', + 46741 => 'عباس آباد', + 46751 => 'سرلنگا', + 46761 => 'کترا', + 46771 => 'گلعلی اباد', + 46781 => 'میان کوه سادات', + 46791 => 'مران سه هزار', + 46831 => 'نشتارود', + 46841 => 'قلعه گردن', + 46851 => 'خرم آباد', + 46861 => 'شیرود', + 46871 => 'سلیمان اباد', + 46881 => 'کشکو', + 46891 => 'لاک تراشان', + 46931 => 'سادات محله', + 46941 => 'کتالم وسادات شهر', + 46961 => 'اغوزکتی', + 46971 => 'جواهرده', + 46981 => 'جنت رودبار', + 46991 => 'تمل', + 47331 => 'خوشرودپی', + 47341 => 'اهنگرکلا', + 47351 => 'گاوانکلا', + 47381 => 'شورکش', + 47391 => 'اینج دان', + 47431 => 'عرب خیل', + 47441 => 'بهنمیر', + 47451 => 'کاسگرمحله', + 47461 => 'کله بست', + 47471 => 'بیشه سر', + 47491 => 'گتاب', + 47541 => 'درازکش', + 47551 => 'گردرودبار', + 47561 => 'مرزی کلا', + 47571 => 'شهیداباد', + 47581 => 'زرگرمحله', + 47631 => 'بالاجنیدلاک پل', + 47641 => 'خطیرکلا', + 47651 => 'حاجی کلاصنم', + 47661 => 'واسکس', + 47681 => 'ریکنده', + 47691 => 'ارطه', + 47731 => 'کیاکلا', + 47741 => 'بالادسته رکن کنار', + 47751 => 'بیزکی', + 47761 => 'کوهی خیل', + 47781 => 'سنگتاب', + 47791 => 'رکابدارکلا', + 47831 => 'شیرکلا', + 47841 => 'آلاشت', + 47851 => 'لفور (لفورک)', + 47861 => 'اتو', + 47871 => 'شیرگاه', + 47881 => 'پالند', + 47891 => 'چرات', + 47931 => 'ده میان', + 47941 => 'خشک دره', + 47951 => 'امافت', + 47961 => 'بالادواب', + 47971 => 'ورسک', + 47981 => 'کتی لته', + 48331 => 'اروست', + 48341 => 'فریم', + 48351 => 'سنگده', + 48361 => 'قادیکلا', + 48371 => 'تاکام', + 48390 => 'پایین هولار', + 48391 => 'بالاهولار', + 48431 => 'اسبوکلا', + 48441 => 'سورک', + 48451 => 'اسلام اباد', + 48461 => 'شهرک صنعتی گهرباران', + 48471 => 'فرح اباد (خزراباد)', + 48481 => 'دارابکلا', + 48491 => 'ماچک پشت', + 48531 => 'خورشید (امامیه)', + 48541 => 'زاغمرز', + 48551 => 'چلمردی', + 48561 => 'رستم کلا', + 48571 => 'پایین زرندین', + 48591 => 'بادابسر', + 48631 => 'تیرتاش', + 48641 => 'خلیل شهر', + 48661 => 'دامداری حسن ابوطالبی', + 48671 => 'بیشه بنه', + 48681 => 'سفیدچاه', + 48691 => 'دامداری حاج عزیزمجریان', + 48841 => 'میان دره', + 48872 => 'بندپی', + ], + ], + 14 => [ + 'title' => 'گلستان', + 'cities' => [ + 491 => 'گرگان', + 4871 => 'بندر گز', + 4881 => 'کردکوی', + 4891 => 'بندرترکمن', + 4931 => 'آق قلا', + 4941 => 'علی آباد', + 4951 => 'رامیان', + 4961 => 'آزاد شهر', + 4971 => 'گنبد کاووس', + 4981 => 'مینو دشت', + 4991 => 'کلاله', + 48731 => 'نوکنده', + 48733 => 'مراوه تپه', + 48961 => 'گمیش تپه', + 48971 => 'سیمین شهر', + 49351 => 'جلین', + 49361 => 'سرخنکلاته', + 49371 => 'تقی اباد', + 49391 => 'انبار آلوم', + 49431 => 'فاضل آباد', + 49471 => 'حاجیکلاته', + 49531 => 'خان ببین', + 49541 => 'دلند', + 49631 => 'نگین شهر', + 49641 => 'نوده خاندوز', + 49680 => 'تاتارعلیا', + 49751 => 'اینچه برون', + 49791 => 'کرند', + 49831 => 'گالیکش', + 49981 => 'عزیزاباد', + ], + ], + 15 => [ + 'title' => 'اردبيل', + 'cities' => [ + 561 => 'اردبیل', + 5631 => 'نمین', + 5641 => 'نیر', + 5651 => 'گرمی', + 5661 => 'مشگین شهر', + 5671 => 'بیله سوار', + 5681 => 'خلخال', + 5691 => 'پارس آباد', + 56331 => 'آبی بیگلو', + 56341 => 'ننه کران', + 56351 => 'عنبران', + 56361 => 'گرده', + 56371 => 'ثمرین', + 56381 => 'اردیموسی', + 56391 => 'سرعین', + 56431 => 'کورائیم', + 56441 => 'اسلام آباد', + 56451 => 'مهماندوست علیا', + 56461 => 'هیر', + 56471 => 'بقراباد', + 56481 => 'بودالالو', + 56491 => 'اراللوی بزرگ', + 56531 => 'دیزج', + 56541 => 'حمزه خانلو', + 56551 => 'زهرا', + 56561 => 'انی علیا', + 56571 => 'قاسم کندی', + 56581 => 'تازه کندانگوت', + 56591 => 'قره اغاج پایین', + 56631 => 'پریخان', + 56641 => 'قصابه', + 56651 => 'فخرآباد', + 56653 => 'لاهرود', + 56661 => 'رضی', + 56671 => 'قوشه سفلی', + 56681 => 'مرادلو', + 56691 => 'گنجوبه', + 56731 => 'گوگ تپه', + 56741 => 'انجیرلو', + 56751 => 'جعفر آباد', + 56761 => 'قشلاق اغداش کلام', + 56771 => 'خورخورسفلی', + 56781 => 'شورگل', + 56791 => 'نظرعلی بلاغی', + 56831 => 'لنبر', + 56841 => 'فیروزاباد', + 56851 => 'گیوی', + 56861 => 'خلفلو', + 56871 => 'هشتجین', + 56881 => 'برندق', + 56891 => 'کلور', + 56931 => 'تازه کندجدید', + 56941 => 'گوشلو', + 56961 => 'اق قباق علیا', + 56971 => 'شهرک غفاری', + 56981 => 'اصلاندوز', + 56991 => 'بران علیا', + ], + ], + 16 => [ + 'title' => 'آذربايجان غربي', + 'cities' => [ + 571 => 'ارومیه', + 573 => 'سیلوه', + 581 => 'خوی', + 591 => 'مهاباد', + 5751 => 'قوشچی', + 5761 => 'نقده', + 5771 => 'اشنویه', + 5781 => 'پیرانشهر', + 5791 => 'جلدیان', + 5831 => 'ایواوغلی', + 5837 => 'دیزج دیز', + 5841 => 'فیرورق', + 5861 => 'ماکو', + 5881 => 'سلماس', + 5891 => 'تازه شهر', + 5931 => 'گوگ تپه', + 5951 => 'بوکان', + 5961 => 'سردشت', + 5971 => 'میاندوآب', + 5981 => 'شاهیندژ', + 5991 => 'تکاب', + 57331 => 'باراندوز', + 57341 => 'دیزج دول', + 57351 => 'میاوق', + 57361 => 'ایبلو', + 57371 => 'دستجرد', + 57381 => 'نوشین', + 57391 => 'طلاتپه', + 57411 => 'سیلوانه', + 57431 => 'راژان', + 57441 => 'هاشم اباد', + 57451 => 'دیزج', + 57461 => 'زیوه', + 57471 => 'تویی', + 57481 => 'موانا', + 57531 => 'قره باغ', + 57541 => 'بهله', + 57551 => 'امام کندی', + 57561 => 'نازلو', + 57571 => 'سرو', + 57581 => 'کانسپی', + 57591 => 'ممکان', + 57641 => 'حسنلو', + 57651 => 'کهریزعجم', + 57661 => 'محمدیار', + 57671 => 'شیخ احمد', + 57681 => 'بیگم قلعه', + 57691 => 'راهدانه', + 57731 => 'شاهوانه', + 57741 => 'نالوس', + 57751 => 'ده شمس بزرگ', + 57761 => 'گلاز', + 57771 => 'لولکان', + 57781 => 'سیاوان', + 57831 => 'کله کین', + 57841 => 'شین اباد', + 57851 => 'چیانه', + 57861 => 'بیکوس', + 57871 => 'هنگ اباد', + 57941 => 'گردکشانه', + 57951 => 'پسوه', + 57961 => 'ریگ اباد', + 57971 => 'احمدغریب', + 58331 => 'سیه باز', + 58341 => 'بیله وار', + 58361 => 'ولدیان', + 58381 => 'قوروق', + 58391 => 'هندوان', + 58431 => 'بدلان', + 58441 => 'بلسورسفلی', + 58450 => 'زرآباد', + 58471 => 'استران', + 58481 => 'قطور', + 58516 => 'قره ضیاءالدین', + 58531 => 'شیرین بلاغ', + 58541 => 'مراکان', + 58551 => 'چورس', + 58561 => 'قورول علیا', + 58571 => 'بسطام', + 58631 => 'قره تپه', + 58641 => 'ریحانلوی علیا', + 58651 => 'زاویه سفلی', + 58661 => 'آواجیق', + 58671 => 'بازرگان', + 58681 => 'قم قشلاق', + 58691 => 'یولاگلدی', + 58716 => 'سیه چشمه', + 58731 => 'قرنقو', + 58751 => 'شوط', + 58761 => 'مرگنلر', + 58771 => 'پلدشت', + 58781 => 'نازک علیا', + 58791 => 'حسن کندی', + 58831 => 'وردان', + 58861 => 'قره قشلاق', + 58871 => 'تمر', + 58881 => 'ابگرم', + 58891 => 'سرنق', + 58931 => 'چهریق علیا', + 58941 => 'داراب', + 58951 => 'دلزی', + 58961 => 'اغ برزه', + 58971 => 'سنجی', + 59341 => 'خاتون باغ', + 59351 => 'حاجی حسن', + 59361 => 'سوگلی تپه', + 59371 => 'گلیجه', + 59381 => 'حاجی کند', + 59431 => 'باغچه', + 59441 => 'خورخوره', + 59450 => 'خلیفان', + 59451 => 'کاولان علیا', + 59461 => 'سیاقول علیا', + 59471 => 'اگریقاش', + 59481 => 'اوزون دره علیا', + 59531 => 'یکشوه', + 59541 => 'جوانمرد', + 59551 => 'اختتر', + 59561 => 'سیمینه', + 59571 => 'رحیم خان', + 59581 => 'گل تپه قورمیش', + 59631 => 'شلماش', + 59641 => 'اسلام اباد', + 59651 => 'بیوران سفلی', + 59671 => 'میرآباد', + 59681 => 'زمزیران', + 59691 => 'ربط', + 59730 => 'کشاورز', + 59731 => 'اقبال', + 59741 => 'ملاشهاب الدین', + 59751 => 'للکلو', + 59761 => 'بگتاش', + 59771 => 'چهار برج', + 59781 => 'گوگ تپه خالصه', + 59791 => 'تک اغاج', + 59831 => 'هاچاسو', + 59841 => 'هولاسو', + 59851 => 'قوزلوی افشار', + 59861 => 'محمودآباد', + 59871 => 'الی چین', + 59881 => 'حیدرباغی', + 59891 => 'حمزه قاسم', + 59931 => 'اوغول بیگ', + 59941 => 'دورباش', + 59951 => 'اقابیگ', + 59961 => 'احمدابادسفلی', + 59981 => 'باروق', + ], + ], + 17 => [ + 'title' => 'همدان', + 'cities' => [ + 651 => 'همدان', + 6531 => 'بهار', + 6541 => 'اسدآباد', + 6551 => 'کبودرآهنگ', + 6561 => 'فامنین', + 6571 => 'ملایر', + 6581 => 'تویسرکان', + 6591 => 'نهاوند', + 65141 => 'مریانج', + 65181 => 'جورقان', + 65331 => 'لالجین', + 65341 => 'دیناراباد', + 65351 => 'همه کسی', + 65361 => 'صالح آباد', + 65371 => 'پرلوک', + 65381 => 'حسین ابادبهارعاشوری', + 65391 => 'مهاجران', + 65431 => 'ویرایی', + 65441 => 'جنت اباد', + 65451 => 'موسی اباد', + 65461 => 'چنارسفلی', + 65471 => 'چنارعلیا', + 65481 => 'آجین', + 65491 => 'طویلان سفلی', + 65531 => 'کوریجان', + 65541 => 'کوهین', + 65551 => 'قهوردسفلی', + 65561 => 'اکنلو', + 65571 => 'شیرین سو', + 65581 => 'گل تپه', + 65591 => 'داق داق اباد', + 65631 => 'قهاوند', + 65641 => 'تجرک', + 65651 => 'کوزره', + 65661 => 'چانگرین', + 65671 => 'دمق', + 65681 => 'رزن', + 65691 => 'قروه درجزین', + 65731 => 'ازناو', + 65741 => 'جوزان', + 65751 => 'زنگنه', + 65761 => 'سامن', + 65771 => 'اورزمان', + 65781 => 'جوکار', + 65791 => 'اسلام اباد', + 65831 => 'جعفریه (قلعه جعفربیک)', + 65841 => 'سرکان', + 65851 => 'میانده', + 65861 => 'فرسفج', + 65871 => 'ولاشجرد', + 65881 => 'اشتران', + 65891 => 'باباپیر', + 65931 => 'جهان اباد', + 65941 => 'باباقاسم', + 65951 => 'بابارستم', + 65960 => 'برزول', + 65961 => 'گیان', + 65971 => 'دهفول', + 65981 => 'فیروزان', + 65991 => 'شهرک صنعتی بوعلی', + 65992 => 'پایگاه نوژه', + 65993 => 'علیصدر', + 65995 => 'ازندریان', + 65998 => 'گنبد', + 66000 => 'پادگان قهرمان', + ], + ], + 18 => [ + 'title' => 'كردستان', + 'cities' => [ + 661 => 'سنندج', + 6631 => 'کامیاران', + 6641 => 'دیواندره', + 6651 => 'بیجار', + 6661 => 'قروه', + 6671 => 'مریوان', + 6681 => 'سقز', + 6691 => 'بانه', + 66171 => 'شویشه', + 66331 => 'شاهینی', + 66341 => 'طای', + 66351 => 'گازرخانی', + 66361 => 'نشورسفلی', + 66371 => 'شیروانه', + 66381 => 'خامسان', + 66391 => 'موچش', + 66431 => 'شریف اباد', + 66441 => 'کوله', + 66451 => 'هزارکانیان', + 66461 => 'زرینه', + 66471 => 'گورباباعلی', + 66481 => 'گاوشله', + 66491 => 'خرکه', + 66531 => 'یاسوکند', + 66541 => 'توپ اغاج', + 66551 => 'اق بلاغ طغامین', + 66561 => 'بابارشانی', + 66571 => 'خسرواباد', + 66591 => 'جعفراباد', + 66631 => 'دلبران', + 66641 => 'دزج', + 66651 => 'کانی گنجی', + 66661 => 'بلبان آباد', + 66671 => 'دهگلان', + 66681 => 'قوریچای', + 66691 => 'سریش آباد', + 66711 => 'کانی دینار', + 66731 => 'نی', + 66741 => 'برده رشه', + 66751 => 'چناره', + 66761 => 'پیرخضران', + 66771 => 'بیساران', + 66781 => 'سروآباد', + 66791 => 'اورامان تخت', + 66831 => 'سرا', + 66841 => 'گل تپه', + 66851 => 'تیلکو', + 66861 => 'صاحب', + 66871 => 'خورخوره', + 66881 => 'کسنزان', + 66891 => 'میرده', + 66931 => 'ننور', + 66941 => 'بوئین سفلی', + 66951 => 'آرمرده', + 66961 => 'بوالحسن', + 66971 => 'کانی سور', + 66981 => 'کوخان', + 66991 => 'شوی', + ], + ], + 19 => [ + 'title' => 'كرمانشاه', + 'cities' => [ + 671 => 'کرمانشاه', + 6731 => 'هرسین', + 6741 => 'کنگاور', + 6751 => 'سنقر', + 6761 => 'اسلام آبادغرب', + 6771 => 'سرپل ذهاب', + 6781 => 'قصرشیرین', + 6791 => 'پاوه', + 67131 => 'رباط', + 67331 => 'هفت اشیان', + 67341 => 'هلشی', + 67351 => 'دوردشت', + 67361 => 'سنقراباد', + 67371 => 'بیستون', + 67381 => 'جعفراباد', + 67391 => 'مرزبانی', + 67431 => 'فش', + 67441 => 'فرامان', + 67451 => 'سلطان اباد', + 67461 => 'صحنه', + 67471 => 'قزوینه', + 67481 => 'دهلقین', + 67491 => 'درکه', + 67531 => 'باوله', + 67541 => 'گردکانه علیا', + 67551 => 'اگاه علیا', + 67561 => 'سطر', + 67571 => 'کیوه نان', + 67580 => 'میان راهان', + 67581 => 'کرکسار', + 67591 => 'کندوله', + 67631 => 'زاوله علیا', + 67641 => 'حمیل', + 67651 => 'ریجاب', + 67661 => 'کرندغرب', + 67671 => 'گهواره', + 67681 => 'کوزران', + 67691 => 'قلعه شیان', + 67731 => 'حسن اباد', + 67741 => 'سراب ذهاب', + 67751 => 'ترک ویس', + 67761 => 'ازگله', + 67771 => 'تازه آباد', + 67781 => 'نساردیره', + 67791 => 'سرمست', + 67831 => 'تپه رش', + 67841 => 'خسروی', + 67861 => 'سومار', + 67871 => 'گیلانغرب', + 67891 => 'قیلان', + 67911 => 'شاهو', + 67931 => 'باینگان', + 67940 => 'بانوره', + 67941 => 'نوسود', + 67951 => 'نودشه', + 67961 => 'روانسر', + 67971 => 'دولت اباد', + 67981 => 'جوانرود', + 67991 => 'میراباد', + ], + ], + 20 => [ + 'title' => 'لرستان', + 'cities' => [ + 681 => 'خرم آباد', + 691 => 'بروجرد', + 6831 => 'نورآباد', + 6841 => 'کوهدشت', + 6851 => 'پلدختر', + 6861 => 'الیگودرز', + 6871 => 'ازنا', + 6881 => 'دورود', + 6891 => 'الشتر', + 68141 => 'ماسور', + 68181 => 'بیرانوند', + 68331 => 'برخوردار', + 68341 => 'فرهاداباد', + 68351 => 'دم باغ', + 68361 => 'کهریزوروشت', + 68371 => 'چشمه کیزاب علیا', + 68381 => 'هفت چشمه', + 68391 => 'تقی اباد', + 68431 => 'خوشناموند', + 68441 => 'اشتره گل گل', + 68451 => 'چقابل', + 68461 => 'سوری', + 68471 => 'کونانی', + 68481 => 'گراب', + 68491 => 'درب گنبد', + 68531 => 'پاعلم (پل تنگ)', + 68541 => 'واشیان نصیرتپه', + 68551 => 'چمشک زیرتنگ', + 68561 => 'افرینه', + 68571 => 'معمولان', + 68580 => 'ویسیان', + 68581 => 'میان تاگان', + 68591 => 'پل شوراب پایین', + 68631 => 'شاهپوراباد', + 68641 => 'چمن سلطان', + 68651 => 'کیزاندره', + 68661 => 'قلعه بزنوید', + 68671 => 'شول آباد', + 68681 => 'حیه', + 68691 => 'مرگ سر', + 68731 => 'مومن آباد', + 68741 => 'رازان', + 68751 => 'سیاه گوشی (پل هرو)', + 68761 => 'زاغه', + 68771 => 'سرابدوره', + 68781 => 'چاه ذوالفقار', + 68791 => 'چم پلک', + 68831 => 'ژان', + 68841 => 'کاغه', + 68851 => 'چالانچولان', + 68861 => 'سپید دشت', + 68871 => 'چم سنگر', + 68881 => 'ایستگاه تنگ هفت', + 68891 => 'مکینه حکومتی', + 68931 => 'سراب سیاهپوش', + 68951 => 'ده رحم', + 68961 => 'فیروز آباد', + 68971 => 'اشترینان', + 68981 => 'بندیزه', + 68991 => 'دره گرگ', + ], + ], + 21 => [ + 'title' => 'بوشهر', + 'cities' => [ + 751 => 'بوشهر', + 7531 => 'بندرگناوه', + 7541 => 'خورموج', + 7551 => 'اهرم', + 7561 => 'برازجان', + 75111 => 'نخل تقی', + 75331 => 'بندر ریگ', + 75341 => 'چهارروستایی', + 75351 => 'شول', + 75361 => 'بندر دیلم', + 75371 => 'امام حسن', + 75381 => 'چغادک', + 75390 => 'سیراف', + 75391 => 'عسلویه', + 75431 => 'بادوله', + 75441 => 'شنبه', + 75451 => 'کاکی', + 75461 => 'خارک', + 75471 => 'دلوار', + 75481 => 'بنه گز', + 75491 => 'اباد', + 75531 => 'بردخون', + 75540 => 'بردستان', + 75541 => 'بندردیر', + 75551 => 'آبدان', + 75560 => 'انارستان', + 75561 => 'ریز', + 75570 => 'بنک', + 75571 => 'بندرکنگان', + 75581 => 'جم', + 75591 => 'ابگرمک', + 75631 => 'دالکی', + 75641 => 'شبانکاره', + 75651 => 'آبپخش', + 75661 => 'سعدآباد', + 75671 => 'وحدتیه', + 75681 => 'تنگ ارم', + 75691 => 'کلمه', + ], + ], + 22 => [ + 'title' => 'كرمان', + 'cities' => [ + 761 => 'کرمان', + 771 => 'رفسنجان', + 781 => 'سیرجان', + 7631 => 'ماهان', + 7641 => 'گلباف', + 7651 => 'راور', + 7661 => 'بم', + 7671 => 'بروات', + 7681 => 'راین', + 7691 => 'محمدآباد', + 7731 => 'سرچشمه', + 7741 => 'انار', + 7751 => 'شهربابک', + 7761 => 'زرند', + 7771 => 'کیانشهر', + 7781 => 'کوهبنان', + 7791 => 'چترود', + 7831 => 'پاریز', + 7841 => 'بردسیر', + 7851 => 'بافت', + 7861 => 'جیرفت', + 7871 => 'عنبرآباد', + 7881 => 'کهنوج', + 7891 => 'منوجان', + 76331 => 'ده بالا', + 76361 => 'جوپار', + 76371 => 'باغین', + 76381 => 'اختیارآباد', + 76391 => 'زنگی آباد', + 76431 => 'جوشان', + 76451 => 'اندوهجرد', + 76461 => 'شهداد', + 76471 => 'کشیت', + 76541 => 'فیض اباد', + 76641 => 'دریجان', + 76731 => 'نرماشیر', + 76741 => 'فهرج', + 76771 => 'برج معاز', + 76791 => 'نظام شهر', + 76831 => 'خانه خاتون', + 76841 => 'ابارق', + 76861 => 'گروه', + 76871 => 'گزک', + 76891 => 'محی آباد', + 76941 => 'تهرود', + 76951 => 'میرابادارجمند', + 77331 => 'داوران', + 77341 => 'خنامان', + 77351 => 'کبوترخان', + 77361 => 'هرمزاباد', + 77371 => 'کشکوئیه', + 77381 => 'گلشن', + 77391 => 'صفائیه', + 77431 => 'امین شهر', + 77461 => 'بهرمان', + 77471 => 'جوادیه الهیه نوق', + 77511 => 'خاتون آباد', + 77541 => 'محمدابادبرفه', + 77551 => 'خورسند', + 77561 => 'خبر', + 77571 => 'کمسرخ', + 77581 => 'جوزم', + 77591 => 'دهج', + 77631 => 'دشت خاک', + 77651 => 'حتکن', + 77661 => 'ریحان', + 77671 => 'جرجافک', + 77691 => 'یزدان شهر', + 77731 => 'شعبجره', + 77751 => 'سیریز', + 77761 => 'خانوک', + 77861 => 'جور', + 77931 => 'هوتک', + 77951 => 'کاظم آباد', + 77961 => 'هجدک', + 77971 => 'حرجند', + 78151 => 'نجف شهر', + 78331 => 'بلورد', + 78341 => 'ملک اباد', + 78361 => 'عماداباد', + 78371 => 'زیدآباد', + 78380 => 'هماشهر', + 78431 => 'نگار', + 78441 => 'گلزار', + 78451 => 'لاله زار', + 78461 => 'قلعه عسکر', + 78471 => 'مومن اباد', + 78481 => 'چناربرین', + 78491 => 'کمال اباد', + 78541 => 'امیراباد', + 78551 => 'بزنجان', + 78561 => 'رابر', + 78571 => 'پتکان', + 78591 => 'ارزوئیه', + 78631 => 'جبالبارز', + 78661 => 'درب بهشت', + 78691 => 'رضی ابادبالا', + 78731 => 'میجان علیا', + 78761 => 'مردهک', + 78771 => 'دوساری', + 78781 => 'حسین ابادجدید', + 78791 => 'بلوک', + 78831 => 'رودبار', + 78841 => 'قلعه گنج', + 78851 => 'نودژ', + 78871 => 'فاریاب', + 78941 => 'سرخ قلعه', + 78971 => 'خیراباد', + ], + ], + 23 => [ + 'title' => 'هرمزگان', + 'cities' => [ + 791 => 'بندرعباس', + 7931 => 'خمیر', + 7941 => 'کیش', + 7951 => 'قشم', + 7961 => 'بستک', + 7971 => 'بندرلنگه', + 7981 => 'میناب', + 7991 => 'دهبارز', + 79331 => 'پشته ایسین', + 79341 => 'پل شرقی', + 79351 => 'فین', + 79361 => 'سیاهو', + 79370 => 'سرگز', + 79371 => 'فارغان', + 79381 => 'باغات', + 79391 => 'حاجی آباد', + 79431 => 'ابگرم خورگو', + 79441 => 'قلعه قاضی', + 79450 => 'تخت', + 79451 => 'حسن لنگی پایین', + 79460 => 'گروک', + 79461 => 'سیریک', + 79471 => 'گونمردی', + 79491 => 'گوهرت', + 79531 => 'درگهان', + 79541 => 'سوزا', + 79551 => 'هرمز', + 79561 => 'جزیره لارک شهری', + 79571 => 'هنگام جدید', + 79581 => 'جزیره سیری', + 79591 => 'ابوموسی', + 79611 => 'جناح', + 79631 => 'پدل', + 79641 => 'کنگ', + 79651 => 'دژگان', + 79661 => 'رویدر', + 79671 => 'دهنگ', + 79691 => 'کمشک', + 79711 => 'کوشکنار', + 79731 => 'گزیر', + 79741 => 'بندرمغویه', + 79751 => 'چارک', + 79761 => 'دشتی', + 79771 => 'پارسیان', + 79781 => 'جزیره لاوان', + 79791 => 'بندرجاسک', + 79831 => 'بندر', + 79841 => 'سندرک', + 79851 => 'درپهن', + 79861 => 'کلورجکدان', + 79871 => 'گوهران', + 79881 => 'سردشت', + 79911 => 'بیکاه', + 79931 => 'جغین', + 79941 => 'زیارت علی', + 79951 => 'ماشنگی', + 79961 => 'گوربند', + 79971 => 'تیاب', + 79981 => 'بندزرک', + 79991 => 'هشتبندی', + ], + ], + 24 => [ + 'title' => 'چهارمحال و بختياري', + 'cities' => [ + 881 => 'شهر کرد', + 8831 => 'فرخ شهر', + 8834 => 'دزک', + 8841 => 'هفشجان', + 8844 => 'هارونی', + 8851 => 'سامان', + 8861 => 'فارسان', + 8871 => 'بروجن', + 8881 => 'اردل', + 8891 => 'لردگان', + 88139 => 'کیان', + 88331 => 'طاقانک', + 88351 => 'خراجی', + 88361 => 'دستناء', + 88371 => 'شلمزار', + 88381 => 'گهرو', + 88431 => 'سورشجان', + 88451 => 'مرغملک', + 88461 => 'سودجان', + 88561 => 'نافچ', + 88571 => 'وردنجان', + 88581 => 'بن', + 88591 => 'پردنجان', + 88631 => 'باباحیدر', + 88651 => 'چلگرد', + 88661 => 'شهریاری', + 88671 => 'جونقان', + 88731 => 'نقنه', + 88741 => 'فرادنبه', + 88751 => 'سفید دشت', + 88761 => 'بلداجی', + 88771 => 'اورگان', + 88781 => 'گندمان', + 88791 => 'امام قیس', + 88831 => 'ناغان', + 88841 => 'گل سفید', + 88861 => 'چوله دان', + 88881 => 'دشتک', + 88941 => 'آلونی', + 88951 => 'مال خلیفه', + 88961 => 'چمن بید', + 88971 => 'سردشت', + 88991 => 'منج', + ], + ], + 25 => [ + 'title' => 'يزد', + 'cities' => [ + 891 => 'یزد', + 8931 => 'ابرکوه', + 8951 => 'اردکان', + 8961 => 'میبد', + 8971 => 'بافق', + 8981 => 'مهریز', + 8991 => 'تفت', + 89331 => 'فراغه', + 89351 => 'مهردشت', + 89361 => 'اسفنداباد', + 89416 => 'اشکذر', + 89418 => 'زارچ', + 89431 => 'شاهدیه', + 89441 => 'فهرج', + 89451 => 'خضر آباد', + 89481 => 'ندوشن', + 89491 => 'حمیدیا', + 89531 => 'احمد آباد', + 89551 => 'عقدا', + 89571 => 'انارستان', + 89581 => 'زرین', + 89631 => 'بفروئیه', + 89731 => 'اسفیج', + 89751 => 'مبارکه', + 89761 => 'بهاباد', + 89771 => 'کوشک', + 89781 => 'بنستان', + 89831 => 'تنگ چنار (چنار)', + 89851 => 'ارنان', + 89861 => 'بهادران', + 89871 => 'مروست', + 89881 => 'هرات', + 89891 => 'فتح اباد', + 89931 => 'ناحیه صنعتی پیشکوه', + 89941 => 'نصراباد', + 89951 => 'علی اباد', + 89961 => 'نیر', + 89981 => 'ناحیه صنعتی گاریزات', + 89991 => 'دهشیر', + ], + ], + 26 => [ + 'title' => 'سيستان و بلوچستان', + 'cities' => [ + 981 => 'زاهدان', + 991 => 'ایرانشهر', + 9831 => 'نصرت آباد', + 9841 => 'میرجاوه', + 9861 => 'زابل', + 9871 => 'زهک', + 9875 => 'خواجه احمد', + 9891 => 'خاش', + 9931 => 'سرباز', + 9941 => 'بمپور', + 9951 => 'سراوان', + 9961 => 'سوران', + 9971 => 'چابهار', + 9981 => 'کنارک', + 9991 => 'نیکشهر', + ], + ], + 27 => [ + 'title' => 'ايلام', + 'cities' => [ + 6931 => 'ایلام', + 6941 => 'ایوان', + 6951 => 'سرآبله', + 6961 => 'دره شهر', + 6971 => 'آبدانان', + 6981 => 'دهلران', + 6991 => 'مهران', + 69331 => 'چنارباشی', + 69341 => 'بیشه دراز', + 69351 => 'چشمه کبود', + 69361 => 'چوار', + 69371 => 'بانویزه', + 69381 => 'چمن سیدمحمد', + 69391 => 'هفت چشمه', + 69441 => 'شورابه ملک', + 69451 => 'کلان', + 69471 => 'زرنه', + 69511 => 'شباب', + 69531 => 'توحید', + 69541 => 'بلاوه تره سفلی', + 69551 => 'لومار', + 69561 => 'آسمان آباد', + 69571 => 'سراب کارزان', + 69581 => 'شهرک سرتنگ', + 69591 => 'علی اباد', + 69631 => 'ماژین', + 69641 => 'ارمو', + 69661 => 'چشمه شیرین', + 69671 => 'بدره', + 69681 => 'شهرک ولیعصر', + 69731 => 'گنداب', + 69741 => 'ژیور', + 69751 => 'سراب باغ', + 69761 => 'مورموری', + 69771 => 'سیاه گل', + 69781 => 'اب انار', + 69831 => 'چم هندی', + 69841 => 'موسیان', + 69851 => 'گولاب', + 69861 => 'میمه', + 69871 => 'پهله', + 69881 => 'عین خوش', + 69891 => 'دشت عباس', + 69931 => 'شهرک اسلامیه', + 69951 => 'صالح آباد', + 69970 => 'دلگشا', + 69971 => 'ارکواز', + 69972 => 'مهر', + 69981 => 'دول کبودخوشادول', + 69991 => 'پاریاب', + ], + ], + 28 => [ + 'title' => 'كهگيلويه و بويراحمد', + 'cities' => [ + 7571 => 'دهدشت', + 7581 => 'دوگنبدان', + 7591 => 'یاسوج', + 75731 => 'سوق', + 75741 => 'لنده', + 75751 => 'لیکک', + 75761 => 'چرام', + 75771 => 'دیشموک', + 75781 => 'قلعه رییسی', + 75791 => 'قلعه دختر', + 75831 => 'باباکلان', + 75841 => 'مظفراباد', + 75851 => 'دیل', + 75861 => 'شاه بهرام', + 75871 => 'چاه تلخاب علیا', + 75881 => 'باشت', + 75891 => 'سربیشه', + 75911 => 'مادوان', + 75941 => 'چیتاب', + 75951 => 'گراب سفلی', + 75961 => 'مارگون', + 75971 => 'میمند', + 75981 => 'پاتاوه', + 75991 => 'سی سخت', + ], + ], + 29 => [ + 'title' => 'خراسان شمالي', + 'cities' => [ + 941 => 'بجنورد', + 9431 => 'گرمه', + 9441 => 'جاجرم', + 9451 => 'آشخانه', + 9461 => 'شیروان', + 9481 => 'فاروج', + 9661 => 'اسفراین', + ], + ], + 30 => [ + 'title' => 'خراسان جنوبي', + 'cities' => [ + 971 => 'بیرجند', + 9741 => 'سربیشه', + 9751 => 'نهبندان', + 9761 => 'قاین', + 9771 => 'فردوس', + 9781 => 'بشرویه', + 9791 => 'طبس', + ], + ], + 31 => [ + 'title' => 'البرز', + 'cities' => [ + 31 => 'کرج', + 3331 => 'نظرآباد', + 3361 => 'هشتگرد', + 31541 => 'ادران', + 31551 => 'آسارا', + 31638 => 'گرمدره', + 31656 => 'فردیس', + 31776 => 'مشکین دشت', + 31778 => 'محمدشهر', + 31836 => 'کرج (مهرشهر)', + 31849 => 'ماهدشت', + 31871 => 'اشتهارد', + 31991 => 'کمالشهر', + 33351 => 'تنکمان', + 33611 => 'گلسار', + 33618 => 'شهر جدید هشتگرد', + 33651 => 'کوهسار', + 33661 => 'چهارباغ', + 33691 => 'طالقان', + ], + ], + ]; + foreach ($citiesArray as $province) { + foreach ($province['cities'] as $code => $cityName) { + if ($code == $cityCode) { + return $cityName; + } + } + } + return false; + } + +} \ No newline at end of file diff --git a/admin/partials/hesabix-admin-setting.php b/admin/partials/hesabix-admin-setting.php new file mode 100644 index 0000000..c35fb4d --- /dev/null +++ b/admin/partials/hesabix-admin-setting.php @@ -0,0 +1,2645 @@ + + +
+
+

+

+ +

+
+ +
+
+
+ + + +
+

+

+
+
+
+ + + +
+

+

+
+
+
+ + + +
+

+

+
+
+
+ + + +
+

+

+
+
+
+ + + +
+
+

+

+
+ +
+
+ + + + +
+
+

+

+
+
+ +
+
+ + + + +
+
+

+

+
+
+
+ + + +
+
+
+

+
+ +
+
+ __('Enable or Disable Debug Mode', 'hesabix'), + 'id' => 'hesabix_debug_mode_checkbox', + 'default' => 'no', + 'type' => 'checkbox', + ); + + return $fields; + } + + public static function hesabix_extra_setting() + { + ?> +
+
+ + + + +
+

+

+ db_version(); + $max_execution_time = ini_get('max_execution_time'); + $memory_limit = ini_get('memory_limit'); + $upload_max_filesize = ini_get('upload_max_filesize'); + $post_max_size = ini_get('post_max_size'); + + $is_connected = get_option('hesabix_account_api') ? true : false; + $connection_status = $is_connected ? __('Connected', 'hesabix') : __('Disconnected', 'hesabix'); + $connection_color = $is_connected ? 'white' : 'white'; + + $business_info = array(); + if ($is_connected) { + try { + $subscription_info = self::getSubscriptionInfo(); + if (!empty($subscription_info['businessName'])) { + $business_info = $subscription_info; + } + } catch (Exception $e) { + } + } + ?> +
+
+
+
+ + + +
+
+ +
+
+ +
+
+
+
+ + +
+
+ + + + +
+ +
+ + +
+ +
+
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
+
+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+ +
+ init($hesabi_setting_fields); ?> +
+
+ + + +
+
+ + + +
+ +
+
+ +
+ +
+ + save_fields($fields); + } + + public static function hesabix_catalog_setting_fields() + { + $warehouses = Hesabix_Setting::hesabix_get_warehouses(); + + $fields[] = array( + 'title' => __('Catalog Settings', 'hesabix'), + 'type' => 'title', + 'desc' => '', + 'id' => 'catalog_options' + ); + + $fields[] = array( + 'title' => __('Update Price', 'hesabix'), + 'desc' => __('Update Price after change in Hesabix', 'hesabix'), + 'id' => 'hesabix_item_update_price', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => __('Update Quantity', 'hesabix'), + 'desc' => __('Update Quantity after change in Hesabix', 'hesabix'), + 'id' => 'hesabix_item_update_quantity', + 'default' => 'no', + 'type' => 'checkbox' + ); + + // $fields[] = array( + // 'title' => __("Update product's quantity based on", 'hesabix'), + // 'id' => 'hesabix_item_update_quantity_based_on', + // 'type' => 'select', + // 'options' => $warehouses, + // ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Remove The Titles for Attributes When Saving Product To Hesabix', 'hesabix'), + 'id' => 'hesabix_remove_attributes_titles', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Do not update purchase and sales titles in hesabix', 'hesabix'), + 'id' => 'hesabix_do_not_update_titles_in_hesabix', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Do not submit product in Hesabix automatically by saving product in woocommerce', 'hesabix'), + 'id' => 'hesabix_do_not_submit_product_automatically', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Do not update product price in Hesabix by editing product in woocommerce', 'hesabix'), + 'id' => 'hesabix_do_not_update_product_price_in_hesabix', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Do not update product barcode in Hesabix by saving product in woocommerce', 'hesabix'), + 'id' => 'hesabix_do_not_update_product_barcode_in_hesabix', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Do not update product category in Hesabix by saving product in woocommerce', 'hesabix'), + 'id' => 'hesabix_do_not_update_product_category_in_hesabix', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Do not update product code in Hesabix by saving product in woocommerce', 'hesabix'), + 'id' => 'hesabix_do_not_update_product_product_code_in_hesabix', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Show Hesabix ID in Products Page', 'hesabix'), + 'id' => 'hesabix_show_product_code_in_products_page', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Show Hesabix Code in Woocommerce Excel Export', 'hesabix'), + 'id' => 'hesabix_show_hesabix_code_in_excel_export', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $fields[] = array( + 'title' => "", + 'desc' => __('Set Special Sale as Discount in invoice', 'hesabix'), + 'id' => 'hesabix_set_special_sale_as_discount', + 'default' => 'no', + 'type' => 'checkbox' + ); + + $options_to_update_sale_price = array(); + $options_to_update_sale_price[0] = __("The Sale price does not change", 'hesabix'); + $options_to_update_sale_price[1] = __("The Sale price gets removed", 'hesabix'); + $options_to_update_sale_price[2] = __("The sale price get changes in proportion to the regular price", 'hesabix'); + + $fields[] = array( + 'title' => __("Update sale price", 'hesabix'), + 'id' => 'hesabix_item_update_sale_price', + 'type' => 'select', + 'options' => $options_to_update_sale_price, + ); + + $fields[] = array('type' => 'sectionend', 'id' => 'catalog_options'); + + return $fields; + } + + public static function hesabix_catalog_setting() + { + $hesabi_setting_fields = self::hesabix_catalog_setting_fields(); + $Html_output = new Hesabix_Html_output(); + ?> +
+
+

+

+ +

+
+
+ + +
+ init($hesabi_setting_fields); ?> +
+
+ +
+
+
+ save_fields($hesabi_setting_fields); + } + + public static function hesabix_customers_setting_fields() + { + + $fields[] = array( + 'title' => __('Customers Settings', 'hesabix'), + 'type' => 'title', + 'desc' => '', + 'id' => 'customer_options' + ); + + $fields[] = array( + 'title' => __('Update Customer Address', 'hesabix'), + 'desc' => __('Choose when update Customer address in Hesabix.', 'hesabix'), + 'id' => 'hesabix_contact_address_status', + 'type' => 'select', + 'options' => array( + '1' => __('Use first customer address', 'hesabix'), + '2' => __('update address with Invoice address', 'hesabix'), + '3' => __('update address with Delivery address', 'hesabix') + ), + ); + + $fields[] = array( + 'title' => __('Customer\'s Group', 'hesabix'), + 'desc' => __('Enter a Customer\'s Group in Hesabix', 'hesabix'), + 'id' => 'hesabix_contact_node_family', + 'type' => 'text', + 'default' => 'مشتریان فروشگاه آنلاین' + ); + + $fields[] = array( + 'title' => __('Save Customer\'s group', 'hesabix'), + 'desc' => __('Automatically save Customer\'s group in hesabix', 'hesabix'), + 'id' => 'hesabix_contact_automatic_save_node_family', + 'default' => 'yes', + 'type' => 'checkbox' + ); + $fields[] = array( + 'title' => __('Customer\'s detail auto save and update', 'hesabix'), + 'desc' => __('Save and update Customer\'s detail automatically in hesabix', 'hesabix'), + 'id' => 'hesabix_contact_automatically_save_in_hesabix', + 'type' => 'checkbox', + 'default' => 'yes' + ); + + $fields[] = array('type' => 'sectionend', 'id' => 'customer_options'); + + return $fields; + } + + public static function hesabix_customers_setting() + { + $hesabi_setting_fields = self::hesabix_customers_setting_fields(); + + $add_fields = get_option('hesabix_contact_add_fields', '1'); + $nationalCodeCheck = get_option('hesabix_contact_NationalCode_checkbox_hesabix') == 'yes'; + $economicCodeCheck = get_option('hesabix_contact_EconomicCode_checkbox_hesabix') == 'yes'; + $registrationNumberCheck = get_option('hesabix_contact_RegistrationNumber_checkbox_hesabix') == 'yes'; + $websiteCheck = get_option('hesabix_contact_Website_checkbox_hesabix') == 'yes'; + + $nationalCodeRequired = get_option('hesabix_contact_NationalCode_isRequired_hesabix') == 'yes'; + $economicCodeRequired = get_option('hesabix_contact_EconomicCode_isRequired_hesabix') == 'yes'; + $registrationNumberRequired = get_option('hesabix_contact_RegistrationNumber_isRequired_hesabix') == 'yes'; + $websiteRequired = get_option('hesabix_contact_Website_isRequired_hesabix') == 'yes'; + + $nationalCodeMetaName = get_option('hesabix_contact_NationalCode_text_hesabix', null); + $economicCodeMetaName = get_option('hesabix_contact_EconomicCode_text_hesabix', null); + $registrationNumberMetaName = get_option('hesabix_contact_RegistrationNumber_text_hesabix', null); + $websiteMetaName = get_option('hesabix_contact_Website_text_hesabix', null); + + $Html_output = new Hesabix_Html_output(); + ?> + +
+
+

+

+ +

+
+ +
+ +
+
+
+ init($hesabi_setting_fields); ?> + +
+ +
+
+
+ +
+

+

+ +

+ +
+ +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+ + + + + +
+
+ +
+ +
+
+
+ __('Invoice Settings', 'hesabix'), + 'type' => 'title', + 'desc' => '', + 'id' => 'invoice_options' + ); + + $fields[] = array( + 'title' => __('Add invoice in which status', 'hesabix'), + 'id' => 'hesabix_invoice_status', + 'type' => 'custom_status_selector', + 'options' => array( + 'pending' => __('Pending payment', 'hesabix'), + 'processing' => __('Processing', 'hesabix'), + 'on-hold' => __('On hold', 'hesabix'), + 'completed' => __('Completed', 'hesabix'), + 'cancelled' => __('Cancelled', 'hesabix'), + 'refunded' => __('Refunded', 'hesabix'), + 'failed' => __('Failed', 'hesabix'), + 'checkout-draft' => __('Draft', 'hesabix'), + ), + ); + + $fields[] = array( + 'title' => __('Save Shipping Costs', 'hesabix'), + 'id' => 'hesabix_invoice_freight', + 'type' => 'freight_switch', + 'options' => [ + 'disabled' => __("Don't Save", 'hesabix'), + 0 => __("Save as Freight", 'hesabix'), + 1 => __("Save as Service", 'hesabix') + ], + 'desc' => __('Choose how shipping costs should be handled in invoices', 'hesabix'), + ); + + $fields[] = array( + 'title' => __('Service Code For Freight', 'hesabix'), + 'id' => 'hesabix_invoice_freight_code', + 'type' => 'text', + 'placeholder' => __('Enter Freight Service Code', 'hesabix'), + 'desc' => __('Required when "Save as Service" is selected. Create this service in Hesabix first.', 'hesabix'), + ); + + if (is_plugin_active('dokan-lite/dokan.php')) { + $fields[] = array( + 'title' => __("Submit invoice base on Dokan orders", 'hesabix'), + 'id' => 'hesabix_invoice_dokan', + 'type' => 'radio', + 'options' => [ + 0 => __("Inactive", 'hesabix'), + 1 => __("Submit parent order", 'hesabix'), + 2 => __("Submit children orders", 'hesabix') + ], + 'default' => 0 + ); + } + + $fields[] = array('type' => 'sectionend', 'id' => 'invoice_options'); + + return $fields; + } + public static function hesabix_invoice_setting() + { + $hesabi_setting_fields = self::hesabix_invoice_setting_fields(); + $Html_output = new Hesabix_Html_output(); + ?> + +
+
+

+

+ +

+
+ +
+
+
+ + + +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+ +
+
+
+ init($hesabi_setting_fields); ?> + +
+ +
+
+
+
+ + + + alert("کد خدمت حمل و نقل تعریف نشده است");'; + } + ?> + __('API Settings', 'hesabix'), + 'type' => 'title', + 'desc' => '', + 'id' => 'api_options' + ); + + $fields[] = array( + 'title' => __('API Key', 'hesabix'), + 'desc' => __('Find API key in Setting->Access Tokens Menu', 'hesabix'), + 'id' => 'hesabix_account_api', + 'type' => 'text', + ); + + $fields[] = array( + 'title' => __('API Address', 'hesabix'), + 'id' => 'hesabix_api_address', + 'type' => 'select', + 'options' => array( + "0" => "app.hesabix.ir", + "1" => "next.hesabix.ir", + "2" => "hesabix.dragonizzer.ir", + "custom" => __("Custom Address", 'hesabix') + ) + ); + + $fields[] = array( + 'title' => __('Custom API Address', 'hesabix'), + 'desc' => __('Enter your custom API address (e.g., your-domain.com)', 'hesabix'), + 'id' => 'hesabix_custom_api_address', + 'type' => 'text', + 'class' => 'custom-api-address-field' + ); + $fields[] = array('type' => 'sectionend', 'id' => 'api_options'); + + return $fields; + } + public static function hesabix_api_setting() + { + $businessInfo = self::getSubscriptionInfo(); + $isBusinessInfo = false; + if ($businessInfo["expireDate"] != '' && $businessInfo["expireDate"] != null) { + $isBusinessInfo = true; + $expireDate = strtotime($businessInfo["expireDate"]); + $expireDateStr = date("Y/m/d", $expireDate); + } + + $hesabi_setting_fields = self::hesabix_api_setting_fields(); + $Html_output = new Hesabix_Html_output(); + ?> + +
+
+

+

+ +

+
+ + +
+

+
+
+
+ + + +
+

+

+
+ +
+
+ + + +
+

+

+
+ +
+
+ + + +
+

+

+
+ +
+
+ + + +
+

+

+
+
+
+ + +
+ + +
+
+ + + + +
+
+
    +
  • +
  • +
  • +
  • +
  • API Settings in Hesabix.', 'hesabix'); ?> +
  • +
  • +
  • +
+
+
+ +
+ init($hesabi_setting_fields); ?> +
+ + +
+
+
+ +
+
+ + + + +
+
+

+

+
+
+
+ save_fields($hesabi_setting_fields); + $api_key = get_option('hesabix_account_api'); + if (!empty($api_key)) { + Hesabix_Setting::hesabix_set_webhook(); + } + } + public static function hesabix_export_setting() + { + $productExportResult = (isset($_GET['productExportResult'])) ? wc_clean($_GET['productExportResult']) : null; + $productImportResult = (isset($_GET['productImportResult'])) ? wc_clean($_GET['productImportResult']) : null; + $error = (isset($_GET['error'])) ? wc_clean($_GET['error']) : null; + + if (!is_null($productExportResult) && $productExportResult === 'true') { + $processed = (isset($_GET['processed'])) ? wc_clean($_GET['processed']) : null; + if ($processed == 0) { + echo '
'; + echo '

' . __('No products were exported, All products were exported or there are no product', 'hesabix'); + echo '

'; + } else { + echo '
'; + echo '

' . sprintf(__('Export products completed. %s products added/updated.', 'hesabix'), $processed); + echo '

'; + } + } elseif ($productExportResult === 'false') { + if (!is_null($error) && $error === '-1') { + echo '
'; + echo '

' . __('Export products fail. Hesabix has already contained products.', 'hesabix'); + echo '

'; + } else { + echo '
'; + echo '

' . __('Export products fail. Please check the log file.', 'hesabix'); + echo '

'; + } + } + + if (!is_null($productImportResult) && $productImportResult === 'true') { + $processed = (isset($_GET['processed'])) ? wc_clean($_GET['processed']) : null; + if ($processed == 0) { + echo '
'; + echo '

' . __('No products were imported, All products were imported or there are no product', 'hesabix'); + echo '

'; + } else { + echo '
'; + echo '

' . sprintf(__('Import products completed. %s products added/updated.', 'hesabix'), $processed); + echo '

'; + } + } elseif ($productImportResult === 'false') { + echo '
'; + echo '

' . __('Import products fail. Please check the log file.', 'hesabix'); + echo '

'; + } + $productOpeningQuantityExportResult = (isset($_GET['productOpeningQuantityExportResult'])) ? wc_clean($_GET['productOpeningQuantityExportResult']) : null; + if (!is_null($productOpeningQuantityExportResult) && $productOpeningQuantityExportResult === 'true') { + echo '
'; + echo '

' . __('Export product opening quantity completed.', 'hesabix'); + echo '

'; + } elseif (!is_null($productOpeningQuantityExportResult) && $productOpeningQuantityExportResult === 'false') { + $shareholderError = (isset($_GET['shareholderError'])) ? wc_clean($_GET['shareholderError']) : null; + $noProduct = (isset($_GET['noProduct'])) ? wc_clean($_GET['noProduct']) : null; + if ($shareholderError == 'true') { + echo '
'; + echo '

' . __('Export product opening quantity fail. No Shareholder exists, Please define Shareholder in Hesabix', 'hesabix'); + echo '

'; + } elseif ($noProduct == 'true') { + echo '
'; + echo '

' . __('No product available for Export product opening quantity.', 'hesabix'); + echo '

'; + } else { + echo '
'; + echo '

' . __('Export product opening quantity fail. Please check the log file.', 'hesabix'); + echo '

'; + } + } + $customerExportResult = (isset($_GET['customerExportResult'])) ? wc_clean($_GET['customerExportResult']) : null; + + if (!is_null($customerExportResult) && $customerExportResult === 'true') { + $processed = (isset($_GET['processed'])) ? wc_clean($_GET['processed']) : null; + if ($processed == 0) { + echo '
'; + echo '

' . __('No customers were exported, All customers were exported or there are no customer', 'hesabix'); + echo '

'; + } else { + echo '
'; + echo '

' . sprintf(__('Export customers completed. %s customers added.', 'hesabix'), $processed); + echo '

'; + } + } elseif (!is_null($customerExportResult) && $customerExportResult === 'false') { + if (!is_null($error) && $error === '-1') { + echo '
'; + echo '

' . __('Export customers fail. Hesabix has already contained customers.', 'hesabix'); + echo '

'; + } else { + echo '
'; + echo '

' . __('Export customers fail. Please check the log file.', 'hesabix'); + echo '

'; + } + } + + ?> +
+

+
+
+
+
+
+ +
+ +
+
+

+ +

+
+
+
+
+ +
    +
  • با انجام این عملیات محصولات لینک نشده از فروشگاه وارد حسابیکس می شوند.
  • +
  • اگر محصولات از قبل هم در فروشگاه تعریف شده اند و هم در حسابیکس و به هم لینک نشده اند باید از + گزینه + همسان سازی دستی محصولات استفاده کنید. +
  • +
  • با انجام این عملیات موجودی محصولات وارد حسابیکس نمی شود و برای وارد کردن موجودی محصولات + فروشگاه + در حسابیکس، باید از گزینه استخراج موجودی اول دوره استفاده کنید. +
  • +
+
+
+
+ +
+
+
+ +
+ +
+
+

+ +

+
+
+
+
+ +
    +
  • با انجام این عملیات موجودی کنونی محصولات در فروشگاه بعنوان موجودی اول دوره محصولات در حسابیکس + ثبت می شوند. +
  • +
  • بطور کلی فقط یک بار باید از این گزینه استفاده کنید، + که این کار باید پس از خروج محصولات به حسابیکس و یا پس از همسان سازی دستی تمام محصولات + انجام شود. +
  • +
+
+
+
+ +
+
+
+ +
+ +
+
+

+ +

+
+
+
+
+ +
    +
  • با انجام این عملیات مشتریان لینک نشده از فروشگاه وارد حسابیکس می شوند.
  • +
  • + اگر یک مشتری بیش از یک بار وارد حسابیکس شده است می توانید از گزینه ادغام تراکنش ها در حسابیکس + استفاده کنید. +
  • +
+
+
+
+ +
+
+
+ +
+ +
+
+

+ +

+
+
+
+
+ +
    +
  • با انجام این عملیات محصولات لینک نشده از حسابیکس وارد فروشگاه می شوند.
  • +
  • اگر محصولات از قبل هم در فروشگاه تعریف شده اند و هم در حسابیکس و به هم لینک نشده اند باید از + گزینه + همسان سازی دستی محصولات استفاده کنید. +
  • +
  • محصولات در وضعیت خصوصی وارد فروشگاه می شوند و سپس هر زمان مایل بودید می توانید وضعیت را به + منتشر شده تغییر دهید. +
  • +
  • تمامی محصولات بعنوان محصول ساده (و نه متغیر) وارد فروشگاه می شوند.
  • +
+
+
+
+ +
+
+ + + + +
+

+ +

+
+
+
+ + + +
+

+

+
+
+
+ + + +
+

+

+
+
+
+ + + + + +
+

+

+
+
+
+ +
+

+ +

+
+
+ +
+
+ +
+
+
+
+

+ +

+
+
+ + + + + +
+
+ +
+
+
+
+

+
+ +
+
+ +
+ + + + +
+
+ + + + +
+ +
+ +
+
+
+ +
+
+
+

+

+
+
+ +
+
+ +
+
+
+
+

+ +

+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+

+
+
+ + + $storeProductsCount, + "hesabixProductsCount" => $hesabixProductsCount, + "linkedProductsCount" => $linkedProductsCount + ); + } + public static function getProductCountsInHesabix() + { + $hesabix = new Hesabix_Api(); + + $filters = array(array("Property" => "khadamat", "Operator" => "=", "Value" => 0)); + + $response = $hesabix->itemGetItems(array('Filters' => $filters)); + if ($response->Success) { + return $response->data->FilteredCount; + } else { + return 0; + } + } + public static function getLinkedProductsCount() + { + global $wpdb; + + return $wpdb->get_var( + $wpdb->prepare( + "SELECT COUNT(*) FROM {$wpdb->prefix}hesabix WHERE obj_type = 'product'" + ) + ); + } + public static function getProductCountsInStore() + { + if (!function_exists('wc_get_products')) { + return 0; + } + + $args = array( + 'limit' => -1, + 'status' => array('publish', 'private', 'draft'), + 'return' => 'ids', + ); + + $products = wc_get_products($args); + return count($products); + } + + public static function getCustomersCount() + { + if (!class_exists('WP_User_Query')) { + return 0; + } + + $args = array( + 'fields' => 'ID', + 'number' => -1, + ); + + $user_query = new WP_User_Query($args); + return $user_query->get_total(); + } + + public static function getOrdersCount() + { + if (!function_exists('wc_get_orders')) { + return 0; + } + + $args = array( + 'limit' => -1, + 'return' => 'ids', + ); + + $orders = wc_get_orders($args); + return count($orders); + } + public static function getSubscriptionInfo() + { + $businessName = ''; + $credit = ''; + $expireDate = ''; + $plan = ''; + + $hesabix = new Hesabix_Api(); + $response = $hesabix->settingGetSubscriptionInfo(); + + if (isset($response->Success) && $response->Success && isset($response->Result)) { + $businessName = $response->Result->name ?? 'نامشخص'; + $credit = $response->Result->credit ?? 0; + $expireDate = $response->Result->expireDate ?? null; + $plan = $response->Result->subscription ?? 'ندارد'; + } + + return array( + "businessName" => $businessName, + "credit" => $credit, + "expireDate" => $expireDate, + "plan" => $plan + ); + } + public static function hesabix_set_webhook($show_errors = true) + { + $url = get_site_url() . '/index.php?hesabix_webhook=1&token=' . substr(wp_hash(AUTH_KEY . 'hesabix/webhook'), 0, 10); + + $hookPassword = get_option('hesabix_webhook_password'); + + $hesabix_api = new Hesabix_Api(); + $response = $hesabix_api->settingSetChangeHook($url, $hookPassword); + + if (is_object($response)) { + if ($response->Success) { + update_option('hesabix_live_mode', 1); + update_option('hesabix_account_bid', $response->bid); + update_option('hesabix_account_year', $response->year); + + + if (Hesabix_Admin_Functions::isDateInFiscalYear(date('Y-m-d H:i:s')) === 0) { + if ($show_errors) { + echo '
'; + echo '

' . __('The fiscal year has passed or not arrived. Please check the fiscal year settings in Hesabix.', 'hesabix') . '

'; + echo '
'; + } + update_option('hesabix_live_mode', 0); + } + + + $default_currency = $hesabix_api->settingGetCurrency(); + if ($default_currency->Success) { + + $woocommerce_currency = get_woocommerce_currency(); + $hesabix_currency = $default_currency->Result->moneyName; + if ($hesabix_currency == $woocommerce_currency || ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT') || ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR')) { + update_option('hesabix_hesabix_default_currency', $hesabix_currency); + } else { + update_option('hesabix_hesabix_default_currency', 0); + update_option('hesabix_live_mode', 0); + + if ($show_errors) { + echo '
'; + echo '

' . __('Hesabix and WooCommerce default currency must be same.', 'hesabix'); + echo '

'; + } + } + } else { + if ($show_errors) { + echo '
'; + echo '

' . __('Cannot check the Hesabix default currency. Error Message: ', 'hesabix') . $default_currency->ErrorMessage . '

'; + echo '
'; + } + HesabixLogService::log(array("Cannot check the Hesabix default currency. Error Message: $default_currency->ErrorMessage. Error Code: $default_currency->ErrorCode")); + } + + + if (get_option('hesabix_live_mode') && $show_errors) { + echo '
'; + echo '

' . __('API Setting updated. Test Successfully', 'hesabix') . '

'; + echo '
'; + } + } else { + update_option('hesabix_live_mode', 0); + + if ($response->ErrorCode === 108) { + if ($show_errors) { + echo '
'; + echo '

' . __('Cannot connect to Hesabix. Business expired.', 'hesabix') . $response->ErrorMessage . '

'; + echo '
'; + } + update_option('hesabix_business_expired', 1); + } else { + if ($show_errors) { + echo '
'; + echo '

' . __('Cannot set Hesabix webHook. Error Message:', 'hesabix') . $response->ErrorMessage . '

'; + echo '
'; + } + update_option('hesabix_business_expired', 0); + } + + HesabixLogService::log(array("Cannot set Hesabix webHook. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode")); + } + } else { + update_option('hesabix_live_mode', 0); + + if ($show_errors) { + echo '
'; + echo '

' . __('Cannot connect to Hesabix servers. Please check your Internet connection', 'hesabix') . '

'; + echo '
'; + } + + HesabixLogService::log(array("Cannot connect to hesabix servers. Check your internet connection")); + } + + return $response; + } + + public static function hesabix_get_banks() + { + $hesabix_api = new Hesabix_Api(); + $banks = $hesabix_api->settingGetBanks(); + + if (is_object($banks) && $banks->Success) { + $available_banks = array(); + $available_banks[-1] = __('Choose', 'hesabix'); + foreach ($banks->Result as $bank) { + if ($bank->Currency == get_woocommerce_currency() || (get_woocommerce_currency() == 'IRT' && $bank->Currency == 'IRR') || (get_woocommerce_currency() == 'IRR' && $bank->Currency == 'IRT')) { + $available_banks['bank' . $bank->Code] = $bank->Name . ' - ' . $bank->Branch . ' - ' . $bank->AccountNumber; + } + } + + if (empty($available_banks)) { + $available_banks[0] = __('Define at least one bank in Hesabix', 'hesabix'); + } + + return $available_banks; + } else { + update_option('hesabix_live_mode', 0); + + echo '
'; + echo '

' . __('Cannot get Banks detail.', 'hesabix') . '

'; + echo '
'; + + HesabixLogService::log(array("Cannot get banking information. Error Code: $banks->ErrorCode. Error Message: $banks->ErrorMessage.")); + + return array('0' => __('Cannot get Banks detail.', 'hesabix')); + } + } + + public static function hesabix_get_cashes() + { + $hesabix_api = new Hesabix_Api(); + $cashes = $hesabix_api->settingGetCashes(); + + if (is_object($cashes) && $cashes->Success) { + $available_cashes = array(); + foreach ($cashes->Result as $cash) { + if ($cash->Currency == get_woocommerce_currency() || (get_woocommerce_currency() == 'IRT' && $cash->Currency == 'IRR') || (get_woocommerce_currency() == 'IRR' && $cash->Currency == 'IRT')) { + $available_cashes['cash' . $cash->Code] = $cash->Name; + } + } + return $available_cashes; + } + } + + public static function hesabix_get_projects() + { + $hesabix_api = new Hesabix_Api(); + $projects = $hesabix_api->settingGetProjects(); + + if (is_object($projects) && $projects->Success) { + $available_projects = array(); + $available_projects[-1] = __('Choose', 'hesabix'); + foreach ($projects->data as $project) { + $available_projects[$project->id] = $project->name; + } + + return $available_projects; + } else { + update_option('hesabix_live_mode', 0); + echo '
'; + echo '

' . __('Cannot get Projects detail.', 'hesabix') . '

'; + echo '
'; + HesabixLogService::log(array("Cannot get projects information. Error Code:$projects->ErrorCode. Error Message: $projects->ErrorMessage.")); + + return array('0' => __('Cannot get projects detail.', 'hesabix')); + } + } + + public static function hesabix_get_salesmen() + { + $hesabix_api = new Hesabix_Api(); + $salesmen = $hesabix_api->settingGetSalesmen(); + + if (is_object($salesmen) && $salesmen->Success) { + $available_salesmen = array(); + $available_salesmen[-1] = __('Choose', 'hesabix'); + foreach ($salesmen->result as $salesman) { + $available_salesmen[$salesman->code] = $salesman->nikename; + } + + return $available_salesmen; + } else { + update_option('hesabix_live_mode', 0); + echo '
'; + echo '

' . __('Cannot get Salesmen detail.', 'hesabix') . '

'; + echo '
'; + HesabixLogService::log(array("Cannot get salesmen information. Error Code: $salesmen->ErrorCode Error Message: .$salesmen->ErrorMessage.")); + + return array('0' => __('Cannot get salesmen detail.', 'hesabix')); + } + } + + public static function hesabix_log_setting() + { + $cleanLogResult = (isset($_GET['cleanLogResult'])) ? wc_clean($_GET['cleanLogResult']) : null; + + if (!is_null($cleanLogResult) && $cleanLogResult === 'true') { + echo '
'; + echo '

' . __('The log file was cleared.', 'hesabix') . '

'; + echo '
'; + } elseif ($cleanLogResult === 'false') { + echo '
'; + echo '

' . __('Log file not found.', 'hesabix') . '

'; + echo '
'; + } + + self::hesabix_tab_log_html(); + } + + public static function hesabix_tab_log_html() + { + $logFiles = []; + for ($i = 0; $i < 10; $i++) { + $logDate = date("20y-m-d", strtotime(-$i . "day")); + if (file_exists(WP_CONTENT_DIR . '/hesabix-' . $logDate . '.txt')) { + $logFiles[] = $logDate; + } + } + $hasLogs = count($logFiles) > 0; + $defaultLogDate = $hasLogs ? $logFiles[0] : date("20y-m-d"); + $defaultLogFile = WP_CONTENT_DIR . '/hesabix-' . $defaultLogDate . '.txt'; + $logFileContent = ($hasLogs && file_exists($defaultLogFile)) ? file_get_contents($defaultLogFile) : ''; + ?> +
+
+
+ + + +

+
+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+

+

+
+ + > + + + + + + +
+
+
+

:

+
+ $logDate) { + $isActive = ($idx === 0) ? ' active' : ''; + echo ''; + } + } else { + echo '' . __('No logs found.', 'hesabix') . ''; + } ?> +
+
+ +
+

:

+ +
+
+ + settingGetWarehouses(); + + if (is_object($warehouses->data)) { + $available_warehouses = array(); + $available_warehouses[-1] = __('Accounting quantity (Total inventory)', 'hesabix'); + + return $available_warehouses; + } + + if (is_object($warehouses) && $warehouses->Success) { + $available_warehouses = array(); + $available_warehouses[-1] = __('Accounting quantity (Total inventory)', 'hesabix'); + foreach ($warehouses->data as $warehouse) { + $available_warehouses[$warehouse->code] = $warehouse->name; + } + + return $available_warehouses; + } else { + update_option('hesabix_live_mode', 0); + echo '
'; + echo '

' . __('Cannot get warehouses.', 'hesabix') . '

'; + echo '
'; + HesabixLogService::log(array("Cannot get warehouses. Error Code: $warehouses->ErrorCode. Error Message: .$warehouses->ErrorMessage.")); + + return array('0' => __('Cannot get warehouses.', 'hesabix')); + } + } + +} + +Hesabix_Setting::init(); + +add_action('wp_ajax_hesabix_save_catalog_settings_ajax', function () { + + if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error(array('message' => 'Security check failed')); + return; + } + + + + + $fields_to_save = array( + 'hesabix_item_update_price' => isset($_POST['hesabix_item_update_price']) ? 'yes' : 'no', + 'hesabix_item_update_quantity' => isset($_POST['hesabix_item_update_quantity']) ? 'yes' : 'no', + 'hesabix_item_update_quantity_based_on' => isset($_POST['hesabix_item_update_quantity_based_on']) ? sanitize_text_field($_POST['hesabix_item_update_quantity_based_on']) : '', + 'hesabix_remove_attributes_titles' => isset($_POST['hesabix_remove_attributes_titles']) ? 'yes' : 'no', + 'hesabix_do_not_update_titles_in_hesabix' => isset($_POST['hesabix_do_not_update_titles_in_hesabix']) ? 'yes' : 'no', + 'hesabix_do_not_submit_product_automatically' => isset($_POST['hesabix_do_not_submit_product_automatically']) ? 'yes' : 'no', + 'hesabix_do_not_update_product_price_in_hesabix' => isset($_POST['hesabix_do_not_update_product_price_in_hesabix']) ? 'yes' : 'no', + 'hesabix_do_not_update_product_barcode_in_hesabix' => isset($_POST['hesabix_do_not_update_product_barcode_in_hesabix']) ? 'yes' : 'no', + 'hesabix_do_not_update_product_category_in_hesabix' => isset($_POST['hesabix_do_not_update_product_category_in_hesabix']) ? 'yes' : 'no', + 'hesabix_do_not_update_product_product_code_in_hesabix' => isset($_POST['hesabix_do_not_update_product_product_code_in_hesabix']) ? 'yes' : 'no', + 'hesabix_show_product_code_in_products_page' => isset($_POST['hesabix_show_product_code_in_products_page']) ? 'yes' : 'no', + 'hesabix_show_hesabix_code_in_excel_export' => isset($_POST['hesabix_show_hesabix_code_in_excel_export']) ? 'yes' : 'no', + 'hesabix_set_special_sale_as_discount' => isset($_POST['hesabix_set_special_sale_as_discount']) ? 'yes' : 'no', + 'hesabix_item_update_sale_price' => isset($_POST['hesabix_item_update_sale_price']) ? sanitize_text_field($_POST['hesabix_item_update_sale_price']) : '' + ); + + $success = true; + foreach ($fields_to_save as $option_name => $option_value) { + $result = update_option($option_name, $option_value); + if (!$result && get_option($option_name) !== $option_value) { + $success = false; + } + } + + if ($success) { + wp_send_json_success(array('message' => __('Settings saved successfully', 'hesabix'), 'options' => $fields_to_save)); + } else { + wp_send_json_error(array('message' => __('Failed to save settings', 'hesabix'))); + } +}); + +add_action('wp_ajax_hesabix_get_log_file_ajax', function () { + if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error(array('message' => 'Security check failed')); + return; + } + $log_date = isset($_POST['log_date']) ? sanitize_text_field($_POST['log_date']) : ''; + $file = WP_CONTENT_DIR . '/hesabix-' . $log_date . '.txt'; + if (file_exists($file)) { + $content = file_get_contents($file); + wp_send_json_success($content); + } else { + wp_send_json_error(); + } +}); + +add_action('wp_ajax_hesabix_delete_log_file_ajax', function () { + if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error(array('message' => 'Security check failed')); + return; + } + $log_date = isset($_POST['log_date']) ? sanitize_text_field($_POST['log_date']) : ''; + $file = WP_CONTENT_DIR . '/hesabix-' . $log_date . '.txt'; + if (file_exists($file) && unlink($file)) { + wp_send_json_success(); + } else { + wp_send_json_error(); + } +}); + +add_action('wp_ajax_hesabix_delete_all_logs_ajax', function () { + if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error(array('message' => 'Security check failed')); + return; + } + $prefix = WP_CONTENT_DIR . '/hesabix-'; + $files = glob($prefix . '*'); + $success = true; + if ($files) { + foreach ($files as $file) { + if (is_file($file)) { + if (!unlink($file)) { + $success = false; + } + } + } + } + if ($success) { + wp_send_json_success(); + } else { + wp_send_json_error(); + } +}); + +add_action('wp_ajax_hesabix_save_extra_settings_ajax', function () { + + if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error(array('message' => 'Security check failed')); + return; + } + + + $fields_to_save = array( + 'hesabix_debug_mode_checkbox' => isset($_POST['hesabix_debug_mode_checkbox']) ? 'yes' : 'no', + 'hesabix_set_rpp_for_sync_products_into_hesabix' => isset($_POST['hesabix_set_rpp_for_sync_products_into_hesabix']) ? sanitize_text_field($_POST['hesabix_set_rpp_for_sync_products_into_hesabix']) : '', + 'hesabix_set_rpp_for_sync_products_into_woocommerce' => isset($_POST['hesabix_set_rpp_for_sync_products_into_woocommerce']) ? sanitize_text_field($_POST['hesabix_set_rpp_for_sync_products_into_woocommerce']) : '', + 'hesabix_set_rpp_for_import_products' => isset($_POST['hesabix_set_rpp_for_import_products']) ? sanitize_text_field($_POST['hesabix_set_rpp_for_import_products']) : '', + 'hesabix_set_rpp_for_export_products' => isset($_POST['hesabix_set_rpp_for_export_products']) ? sanitize_text_field($_POST['hesabix_set_rpp_for_export_products']) : '', + 'hesabix_set_rpp_for_export_opening_products' => isset($_POST['hesabix_set_rpp_for_export_opening_products']) ? sanitize_text_field($_POST['hesabix_set_rpp_for_export_opening_products']) : '' + ); + + $success = true; + foreach ($fields_to_save as $option_name => $option_value) { + $result = update_option($option_name, $option_value); + if (!$result && get_option($option_name) !== $option_value) { + $success = false; + } + } + + if ($success) { + wp_send_json_success(array('message' => __('Settings saved successfully', 'hesabix'))); + } else { + wp_send_json_error(array('message' => __('Failed to save settings', 'hesabix'))); + } +}); + +add_action('wp_ajax_hesabix_save_invoice_settings_ajax', function () { + + if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error(array('message' => 'Security check failed')); + return; + } + + + $fields_to_save = array( + 'hesabix_invoice_status' => isset($_POST['hesabix_invoice_status']) ? sanitize_text_field($_POST['hesabix_invoice_status']) : '', + 'hesabix_invoice_project' => isset($_POST['hesabix_invoice_project']) ? sanitize_text_field($_POST['hesabix_invoice_project']) : '', + 'hesabix_invoice_salesman' => isset($_POST['hesabix_invoice_salesman']) ? sanitize_text_field($_POST['hesabix_invoice_salesman']) : '', + 'hesabix_invoice_salesman_percentage' => isset($_POST['hesabix_invoice_salesman_percentage']) ? sanitize_text_field($_POST['hesabix_invoice_salesman_percentage']) : '', + 'hesabix_invoice_draft_save_in_hesabix' => isset($_POST['hesabix_invoice_draft_save_in_hesabix']) ? 'yes' : 'no', + 'hesabix_invoice_freight' => isset($_POST['hesabix_invoice_freight']) ? sanitize_text_field($_POST['hesabix_invoice_freight']) : '', + 'hesabix_invoice_freight_code' => isset($_POST['hesabix_invoice_freight_code']) ? sanitize_text_field($_POST['hesabix_invoice_freight_code']) : '' + ); + + + if (is_plugin_active('dokan-lite/dokan.php')) { + $fields_to_save['hesabix_invoice_dokan'] = isset($_POST['hesabix_invoice_dokan']) ? sanitize_text_field($_POST['hesabix_invoice_dokan']) : '0'; + } + + $success = true; + foreach ($fields_to_save as $option_name => $option_value) { + $result = update_option($option_name, $option_value); + if (!$result && get_option($option_name) !== $option_value) { + $success = false; + } + } + + if ($success) { + wp_send_json_success(array('message' => __('Settings saved successfully', 'hesabix'))); + } else { + wp_send_json_error(array('message' => __('Failed to save settings', 'hesabix'))); + } +}); + +add_action('wp_ajax_hesabix_save_customers_settings_ajax', function () { + + if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error(array('message' => 'Security check failed')); + return; + } + + + $fields_to_save = array( + 'hesabix_contact_address_status' => isset($_POST['hesabix_contact_address_status']) ? sanitize_text_field($_POST['hesabix_contact_address_status']) : '', + 'hesabix_contact_node_family' => isset($_POST['hesabix_contact_node_family']) ? sanitize_text_field($_POST['hesabix_contact_node_family']) : '', + 'hesabix_contact_automatic_save_node_family' => isset($_POST['hesabix_contact_automatic_save_node_family']) ? 'yes' : 'no', + 'hesabix_contact_automatically_save_in_hesabix' => isset($_POST['hesabix_contact_automatically_save_in_hesabix']) ? 'yes' : 'no' + ); + + $success = true; + foreach ($fields_to_save as $option_name => $option_value) { + $result = update_option($option_name, $option_value); + if (!$result && get_option($option_name) !== $option_value) { + $success = false; + } + } + + if ($success) { + wp_send_json_success(array('message' => __('Settings saved successfully', 'hesabix'))); + } else { + wp_send_json_error(array('message' => __('Failed to save settings', 'hesabix'))); + } +}); + + + +add_action('wp_ajax_hesabix_get_sync_stats_ajax', function () { + + if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'hesabix_ajax_nonce')) { + wp_send_json_error(array('message' => 'Security check failed')); + return; + } + + $result = Hesabix_Setting::getProductsCount(); + wp_send_json_success([ + 'storeProductsCount' => $result['storeProductsCount'], + 'hesabixProductsCount' => $result['hesabixProductsCount'], + 'linkedProductsCount' => $result['linkedProductsCount'], + ]); +}); diff --git a/admin/partials/ssbhesabix-html-output.php b/admin/partials/hesabix-html-output.php similarity index 55% rename from admin/partials/ssbhesabix-html-output.php rename to admin/partials/hesabix-html-output.php index 77271c2..5836605 100644 --- a/admin/partials/ssbhesabix-html-output.php +++ b/admin/partials/hesabix-html-output.php @@ -1,371 +1,542 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - */ - -class Ssbhesabix_Html_output { - public static function init($options = array()) { - if (!empty($options)) { - foreach ($options as $value) { - if (!isset($value['type'])) continue; - if (!isset($value['id'])) $value['id'] = ''; - if (!isset($value['title'])) $value['title'] = isset($value['name']) ? $value['name'] : ''; - if (!isset($value['class'])) $value['class'] = ''; - if (!isset($value['css'])) $value['css'] = ''; - if (!isset($value['default'])) $value['default'] = ''; - if (!isset($value['desc'])) $value['desc'] = ''; - if (!isset($value['desc_tip'])) $value['desc_tip'] = false; - $custom_attributes = array(); - if (!empty($value['custom_attributes']) && is_array($value['custom_attributes'])) { - foreach ($value['custom_attributes'] as $attribute => $attribute_value) { - $custom_attributes[] = esc_attr($attribute) . '="' . esc_attr($attribute_value) . '"'; - } - } - if (true === $value['desc_tip']) { - $description = ''; - $tip = $value['desc']; - } elseif (!empty($value['desc_tip'])) { - $description = $value['desc']; - $tip = $value['desc_tip']; - } elseif (!empty($value['desc'])) { - $description = $value['desc']; - $tip = ''; - } else { - $description = $tip = ''; - } - if ($description && in_array($value['type'], array('textarea', 'radio'))) { - $description = '

' . wp_kses_post($description) . '

'; - } elseif ($description && in_array($value['type'], array('checkbox'))) { - $description = wp_kses_post($description); - } elseif ($description) { - $description = '' . wp_kses_post($description) . ''; - } - if (isset($value['placeholder']) && !empty($value['placeholder'])) { - $placeholder = $value['placeholder']; - } else { - $placeholder = ''; - } - if ($tip && in_array($value['type'], array('checkbox'))) { - - $tip = '

' . $tip . '

'; - } - switch ($value['type']) { - case 'title': - if (!empty($value['title'])) { - echo '

' . esc_html($value['title']) . '

'; - } - if (!empty($value['desc'])) { - echo wpautop(wptexturize(wp_kses_post($value['desc']))); - } - echo '' . "\n\n"; - break; - case 'sectionend': - echo '
'; - break; - case 'text': - case 'email': - case 'number': - case 'color' : - case 'password' : - $type = $value['type']; - $class = ''; - $option_value = self::get_option($value['id'], $value['default']); - if ($value['type'] == 'color') { - $type = 'text'; - $value['class'] .= 'colorpick'; - $description .= ''; - } - ?> - - - - - - - /> - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
    - $val) { - ?> -
  • - -
  • - -
-
- - - - - -
- -
- - - - - -
- - - -
- $value['id'], - 'id' => $value['id'], - 'sort_column' => 'menu_order', - 'sort_order' => 'ASC', - 'show_option_none' => ' ', - 'class' => $value['class'], - 'echo' => false, - 'selected' => absint(self::get_option($value['id'])) - ); - if (isset($value['args'])) { - $args = wp_parse_args($value['args'], $args); - } - ?> - - - - - $value) { - update_option($name, wc_clean($value)); - } - echo '

' . __( 'Settings were saved successfully.', 'ssbhesabix' ) . '

'; - return true; - } -//===================================================================================================== -} - -Ssbhesabix_Html_output::init(); + $attribute_value) { + $custom_attributes[] = esc_attr($attribute) . '="' . esc_attr($attribute_value) . '"'; + } + } + if (true === $value['desc_tip']) { + $description = ''; + $tip = $value['desc']; + } elseif (!empty($value['desc_tip'])) { + $description = $value['desc']; + $tip = $value['desc_tip']; + } elseif (!empty($value['desc'])) { + $description = $value['desc']; + $tip = ''; + } else { + $description = $tip = ''; + } + if ($description && in_array($value['type'], array('textarea', 'radio'))) { + $description = '

' . wp_kses_post($description) . '

'; + } elseif ($description && in_array($value['type'], array('checkbox'))) { + $description = wp_kses_post($description); + } elseif ($description) { + $description = '' . wp_kses_post($description) . ''; + } + if (isset($value['placeholder']) && !empty($value['placeholder'])) { + $placeholder = $value['placeholder']; + } else { + $placeholder = ''; + } + if ($tip && in_array($value['type'], array('checkbox'))) { + + $tip = '

' . $tip . '

'; + } + switch ($value['type']) { + case 'title': + if (!empty($value['title'])) { + + } + if (!empty($value['desc'])) { + echo wpautop(wptexturize(wp_kses_post($value['desc']))); + } + echo '' . "\n\n"; + break; + case 'sectionend': + echo '
'; + break; + case 'text': + case 'email': + case 'number': + case 'color' : + case 'password' : + $type = $value['type']; + $class = ''; + $option_value = self::get_option($value['id'], $value['default']); + if ($value['type'] == 'color') { + $type = 'text'; + $value['class'] .= 'colorpick'; + $description .= ''; + } + ?>> + + + + + + + /> + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ $val) { + $is_selected = in_array($key, $option_value); + $status_class = 'hesabix-status-' . str_replace('-', '-', $key); + ?> +
+ /> +
+ '; + break; + case 'processing': + echo ''; + break; + case 'on-hold': + echo ''; + break; + case 'completed': + echo ''; + break; + case 'cancelled': + echo ''; + break; + case 'refunded': + echo ''; + break; + case 'failed': + echo ''; + break; + case 'checkout-draft': + echo ''; + break; + default: + echo ''; + } + ?> +
+
+
+
+ +
+
+
+ +
+
+ + + + + + + + +
+ +
    + $val) { + ?> +
  • + +
  • + +
+
+ + + + + + + +
+
+ $val) : ?> +
+
+
+ '; + break; + case '0': + echo ''; + break; + case '1': + echo ''; + break; + } + ?> +
+
+
+ +
+
+
+ +
+ +
+ + + + + + +
+ +
+ + + + + +
+ + + +
+ $value['id'], + 'id' => $value['id'], + 'sort_column' => 'menu_order', + 'sort_order' => 'ASC', + 'show_option_none' => ' ', + 'class' => $value['class'], + 'echo' => false, + 'selected' => absint(self::get_option($value['id'])) + ); + if (isset($value['args'])) { + $args = wp_parse_args($value['args'], $args); + } + ?> + + + + + $value) { + update_option($name, wc_clean($value)); + } + + return true; + } + +} + +Hesabix_Html_output::init(); diff --git a/admin/partials/ssbhesabix-admin-display.php b/admin/partials/ssbhesabix-admin-display.php deleted file mode 100644 index 37d189e..0000000 --- a/admin/partials/ssbhesabix-admin-display.php +++ /dev/null @@ -1,397 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - */ - -class Ssbhesabix_Admin_Display -{ - /** - * Ssbhesabix_Admin_Display constructor. - */ - public function __construct() - { - add_action('admin_menu', array(__CLASS__, 'hesabix_add_menu')); - } - - /** - * Hook in methods - * @since 1.0.0 - * @access static - */ - - /** - * @since 1.0.0 - * @access public - */ - - static function hesabix_add_menu() - { - $iconUrl = plugins_url('/hesabix-accounting/admin/img/menu-icon.png'); - add_menu_page("حسابیکس", "حسابیکس", "manage_options", "ssbhesabix-option", array(__CLASS__, 'hesabix_plugin_page'), $iconUrl, null); - add_submenu_page("ssbhesabix-option", "تنظیمات حسابیکس", "تنظیمات حسابیکس", "manage_options", 'ssbhesabix-option', array(__CLASS__, 'hesabix_plugin_page')); - } - - function hesabix_plugin_sync_products_manually() - { - $page = $_GET["p"]; - $rpp = $_GET["rpp"]; - if (isset($_GET['data'])) { - $data = $_GET["data"]; - $codesNotFoundInHesabix = explode(",", $data); - } - //set default values to page and rpp - if (!$page) $page = 1; - if (!$rpp) $rpp = 10; - - $result = self::getProductsAndRelations($page, $rpp); - $pageCount = ceil($result["totalCount"] / $rpp); - $i = ($page - 1) * $rpp; - $rpp_options = [10, 15, 20, 30, 50]; - - $showTips = true; - if (!isset($_COOKIE['syncProductsManuallyHelp'])) { - setcookie('syncProductsManuallyHelp', 'ture'); - } else { - $showTips = false; - } - - self::hesabix_plugin_header(); - ?> -
-

-

- همسان سازی دستی کالاهای فروشگاه با حسابیکس - مشاهده نکات مهم -
- - - - - -

-
- - - - - - - - - - - - - - - - - - - - - - -
#IDنام کالاشناسه محصولکد حسابیکس
ID; ?>post_title; ?>sku; ?> - -
- - | - | - - - برو - - - < صفحه قبل - صفحه بعد > - -
- -
-
-
- get_results("SELECT id_hesabix FROM " . $wpdb->prefix . "ssbhesabix WHERE obj_type = 'product' GROUP BY id_hesabix HAVING COUNT(id_hesabix) > 1;"); - - $rows = $wpdb->get_results( - "SELECT id_hesabix - FROM {$wpdb->prefix}ssbhesabix - WHERE obj_type = 'product' - GROUP BY id_hesabix - HAVING COUNT(id_hesabix) > 1" - ); - - $ids = array(); - - foreach ($rows as $row) - $ids[] = $row->id_hesabix; - - $idsStr = implode(',', $ids); - //$rows = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "ssbhesabix WHERE obj_type = 'product' AND id_hesabix IN ($idsStr) ORDER BY id_hesabix"); - - $rows = $wpdb->get_results( - $wpdb->prepare( - "SELECT * - FROM {$wpdb->prefix}ssbhesabix - WHERE obj_type = 'product' - AND id_hesabix IN ($idsStr) - ORDER BY id_hesabix" - ) - ); - - $i = 0; - - self::hesabix_plugin_header(); - ?> -
-
- کد محصولات تکراری -
- - - - - - - - - - - - - - - - - - - -
#کد حسابیکسشناسه محصولشناسه متغیر
id_hesabix; ?>id_ps; ?>id_ps_attribute; ?>
-
- -
-
- ابزارهای افزونه حسابیکس -
- - حذف دیتای افزونه -
- نصب دیتای افزونه -
- get_results("SELECT post.ID,post.post_title,post.post_parent,post_excerpt,wc.sku FROM `" . $wpdb->prefix . "posts` as post -// LEFT OUTER JOIN `" . $wpdb->prefix . "wc_product_meta_lookup` as wc -// ON post.id = wc.product_id -// WHERE post.post_type IN('product','product_variation') AND post.post_status IN('publish','private') -// ORDER BY post.post_title ASC LIMIT $offset,$rpp"); - - $rows = $wpdb->get_results( - $wpdb->prepare( - "SELECT post.ID, post.post_title, post.post_parent, post.post_excerpt, wc.sku - FROM {$wpdb->posts} AS post - LEFT OUTER JOIN {$wpdb->prefix}wc_product_meta_lookup AS wc - ON post.ID = wc.product_id - WHERE post.post_type IN ('product', 'product_variation') - AND post.post_status IN ('publish', 'private') - ORDER BY post.post_title ASC - LIMIT %d, %d", - $offset, - $rpp - ) - ); - - - -// $totalCount = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts` as post -// LEFT OUTER JOIN `" . $wpdb->prefix . "wc_product_meta_lookup` as wc -// ON post.id = wc.product_id -// WHERE post.post_type IN('product','product_variation') AND post.post_status IN('publish','private')"); - - $totalCount = $wpdb->get_var( - "SELECT COUNT(*) - FROM {$wpdb->posts} AS post - LEFT OUTER JOIN {$wpdb->prefix}wc_product_meta_lookup AS wc - ON post.ID = wc.product_id - WHERE post.post_type IN ('product', 'product_variation') - AND post.post_status IN ('publish', 'private')" - ); - - -// $links = $wpdb->get_results("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` -// WHERE obj_type ='product'"); - - $links = $wpdb->get_results( - "SELECT * - FROM {$wpdb->prefix}ssbhesabix - WHERE obj_type = 'product'" - ); - - foreach ($rows as $r) { - if ($r->post_excerpt) - $r->post_title = $r->post_title . ' [' . $r->post_excerpt . ']'; - } - - foreach ($links as $link) { - foreach ($rows as $r) { - if ($r->ID == $link->id_ps && $link->id_ps_attribute == 0) { - $r->id_hesabix = $link->id_hesabix; - } else if ($r->ID == $link->id_ps_attribute) { - $r->id_hesabix = $link->id_hesabix; - } - } - } - - return array("data" => $rows, "totalCount" => $totalCount); - } -//======================================================================================================================================== - /** - * @since 1.0.0 - * @access public - */ - public static function hesabix_plugin_page() - { - $iconsArray = ['home', 'cog', 'box-open', 'users', 'file-invoice-dollar', 'money-check-alt', 'file-export', 'sync-alt', 'file-alt', 'cog']; - if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) { - $setting_tabs = apply_filters('ssbhesabix_setting_tab', array( - 'home' => __('Home', 'ssbhesabix'), - 'api' => __('API', 'ssbhesabix'), - 'catalog' => __('Catalog', 'ssbhesabix'), - 'customers' => __('Customers', 'ssbhesabix'), - 'invoice' => __('Invoice', 'ssbhesabix'), - 'payment' => __('Payment Methods', 'ssbhesabix'), - 'export' => __('Import and export data', 'ssbhesabix'), - 'sync' => __('Sync', 'ssbhesabix'), - 'log' => __('Log', 'ssbhesabix'), - 'extra' => __('Extra Settings', 'ssbhesabix') - )); - $current_tab = (isset($_GET['tab'])) ? wc_clean($_GET['tab']) : 'home'; - self::hesabix_plugin_header(); - ?> - - $setting_tabvalue) { - switch ($setting_tabkey) { - case $current_tab: - do_action('ssbhesabix_' . $setting_tabkey . '_setting_save_field'); - do_action('ssbhesabix_' . $setting_tabkey . '_setting'); - break; - } - } - } else { - echo '
' . __('Hesabix Plugin requires the WooCommerce to work!, Please install/activate woocommerce and try again', 'ssbhesabix') . '
'; - } - } -//======================================================================================================================================== - public static function hesabix_plugin_header() - { - $logoUrl = plugins_url('/hesabix-accounting/admin/img/hesabix-logo.fa.png'); - ?> - - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - */ -class Ssbhesabix_Admin_Functions -{ - public static function isDateInFiscalYear($date) - { - $hesabixApi = new Ssbhesabix_Api(); - $fiscalYear = $hesabixApi->settingGetFiscalYear(); - if (is_object($fiscalYear)) { - - if ($fiscalYear->Success) { - $fiscalYearStartTimeStamp = strtotime($fiscalYear->Result->StartDate); - $fiscalYearEndTimeStamp = strtotime($fiscalYear->Result->EndDate); - $dateTimeStamp = strtotime($date); - - if ($dateTimeStamp >= $fiscalYearStartTimeStamp && $dateTimeStamp <= $fiscalYearEndTimeStamp) { - return 1; - } else { - return 0; - } - } else { - HesabixLogService::log(array("Cannot get FiscalDate. Error Code: $fiscalYear->ErrroCode. Error Message: $fiscalYear->ErrorMessage")); - return false; - } - } - HesabixLogService::log(array("Cannot connect to Hesabix for get FiscalDate.")); - return false; - } -//==================================================================================================================== - public function getProductVariations($id_product) - { - if (!isset($id_product)) { - return false; - } - $product = wc_get_product($id_product); - - if (is_bool($product)) return false; - if ($product->is_type('variable')) { - $children = $product->get_children($args = '', $output = OBJECT); - $variations = array(); - foreach ($children as $value) { - $product_variatons = new WC_Product_Variation($value); - if ($product_variatons->exists()) { - $variations[] = $product_variatons; - } - } - return $variations; - } - return false; - } -//======================================================================================================== - public function setItems($id_product_array) - { - if (!isset($id_product_array) || $id_product_array[0] == null) return false; - if (is_array($id_product_array) && empty($id_product_array)) return true; - - $items = array(); - foreach ($id_product_array as $id_product) { - $product = new WC_Product($id_product); - if ($product->get_status() === "draft") continue; - - $items[] = ssbhesabixItemService::mapProduct($product, $id_product, false); - - $variations = $this->getProductVariations($id_product); - if ($variations) - foreach ($variations as $variation) - $items[] = ssbhesabixItemService::mapProductVariation($product, $variation, $id_product, false); - } - - if (count($items) === 0) return false; - if (!$this->saveItems($items)) return false; - return true; - } -//==================================================================================================================== - public function saveItems($items) - { - $hesabix = new Ssbhesabix_Api(); - $wpFaService = new HesabixWpFaService(); - - $response = $hesabix->itemBatchSave($items); - if ($response->Success) { - foreach ($response->Result as $item) - $wpFaService->saveProduct($item); - return true; - } else { - HesabixLogService::log(array("Cannot add/update Hesabix items. Error Code: " . (string)$response->ErrorCode . ". Error Message: $response->ErrorMessage.")); - return false; - } - } -//==================================================================================================================== - public function getContactCodeByCustomerId($id_customer) - { - if (!isset($id_customer)) { - return false; - } - - global $wpdb; - //$row = $wpdb->get_row("SELECT `id_hesabix` FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_ps` = $id_customer AND `obj_type` = 'customer'"); - - $row = $wpdb->get_row( - $wpdb->prepare( - "SELECT `id_hesabix` FROM {$wpdb->prefix}ssbhesabix - WHERE `id_ps` = %d AND `obj_type` = 'customer'", - $id_customer - ) - ); - - if (is_object($row)) { - return $row->id_hesabix; - } else { - return null; - } - } -//==================================================================================================================== - public function setContact($id_customer, $type = 'first', $id_order = '') - { - if (!isset($id_customer)) return false; - - $code = $this->getContactCodeByCustomerId($id_customer); - - $hesabixCustomer = ssbhesabixCustomerService::mapCustomer($code, $id_customer, $type, $id_order); - - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->contactSave($hesabixCustomer); - - if ($response->Success) { - $wpFaService = new HesabixWpFaService(); - $wpFaService->saveCustomer($response->Result); - return $response->Result->Code; - } else { - HesabixLogService::log(array("Cannot add/update customer. Error Code: " . (string)$response->ErrroCode . ". Error Message: " . (string)$response->ErrorMessage . ". Customer ID: $id_customer")); - return false; - } - } -//==================================================================================================================== - public function setGuestCustomer($id_order) - { - if (!isset($id_order)) return false; - - //$order = new WC_Order($id_order); - $order = wc_get_order($id_order); - - $contactCode = $this->getContactCodeByPhoneOrEmail($order->get_billing_phone(), $order->get_billing_email()); - - $hesabixCustomer = ssbhesabixCustomerService::mapGuestCustomer($contactCode, $id_order); - - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->contactSave($hesabixCustomer); - - if ($response->Success) { - $wpFaService = new HesabixWpFaService(); - $wpFaService->saveCustomer($response->Result); - return (int)$response->Result->Code; - } else { - HesabixLogService::log(array("Cannot add/update contact. Error Code: " . (string)$response->ErrroCode . ". Error Message: " . (string)$response->ErrorMessage . ". Customer ID: Guest Customer")); - return false; - } - } -//==================================================================================================================== - public function getContactCodeByPhoneOrEmail($phone, $email) - { - if (!$email && !$phone) return null; - - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->contactGetByPhoneOrEmail($phone, $email); - - if (is_object($response)) { - if ($response->Success && $response->Result->TotalCount > 0) { - $contact_obj = $response->Result->List; - - if (!$contact_obj[0]->Code || $contact_obj[0]->Code == '0' || $contact_obj[0]->Code == '000000') return null; - - foreach ($contact_obj as $contact) { - if (($contact->phone == $phone || $contact->mobile = $phone) && $contact->email == $email) - return (int)$contact->Code; - } - foreach ($contact_obj as $contact) { - if ($phone && $contact->phone == $phone || $contact->mobile = $phone) - return (int)$contact->Code; - } - foreach ($contact_obj as $contact) { - if ($email && $contact->email == $email) - return (int)$contact->Code; - } - return null; - } - } else { - HesabixLogService::log(array("Cannot get Contact list. Error Message: (string)$response->ErrorMessage. Error Code: (string)$response->ErrorCode.")); - } - - return null; - } -//==================================================================================================================== - //Invoice - public function setOrder($id_order, $orderType = 0, $reference = null) - { - if (!isset($id_order)) { - return false; - } - - $wpFaService = new HesabixWpFaService(); - - $number = $this->getInvoiceNumberByOrderId($id_order); - if (!$number) { - $number = null; - if ($orderType == 2) //return if saleInvoice not set before - { - return false; - } - } - -// $order = new WC_Order($id_order); - $order = wc_get_order($id_order); - - $dokanOption = get_option("ssbhesabix_invoice_dokan", 0); - - if ($dokanOption && is_plugin_active("dokan-lite/dokan.php")) { - $orderCreated = $order->get_created_via(); - if ($dokanOption == 1 && $orderCreated !== 'checkout') - return false; - else if ($dokanOption == 2 && $orderCreated === 'checkout') - return false; - } - - $id_customer = $order->get_customer_id(); - if ($id_customer !== 0) { - - $contactCode = $this->setContact($id_customer, 'first', $id_order); - - if ($contactCode == null) { - if (!$contactCode) { - return false; - } - } - HesabixLogService::writeLogStr("order ID " . $id_order); - if (get_option('ssbhesabix_contact_address_status') == 2) { - $this->setContact($id_customer, 'billing', $id_order); - } elseif (get_option('ssbhesabix_contact_address_status') == 3) { - $this->setContact($id_customer, 'shipping', $id_order); - } - } else { - $contactCode = $this->setGuestCustomer($id_order); - if (!$contactCode) { - return false; - } - } - - global $notDefinedProductID; - $notDefinedItems = array(); - $products = $order->get_items(); - foreach ($products as $product) { - if ($product['product_id'] == 0) continue; - $itemCode = $wpFaService->getProductCodeByWpId($product['product_id'], $product['variation_id']); - if ($itemCode == null) { - $notDefinedItems[] = $product['product_id']; - } - } - - if (!empty($notDefinedItems)) { - if (!$this->setItems($notDefinedItems)) { - HesabixLogService::writeLogStr("Cannot add/update Invoice. Failed to set products. Order ID: $id_order"); - return false; - } - } - - $invoiceItems = array(); - $i = 0; - $failed = false; - foreach ($products as $key => $product) { - $itemCode = $wpFaService->getProductCodeByWpId($product['product_id'], $product['variation_id']); - - if ($itemCode == null) { - $pId = $product['product_id']; - $vId = $product['variation_id']; - HesabixLogService::writeLogStr("Item not found. productId: $pId, variationId: $vId, Order ID: $id_order"); - - $failed = true; - break; - } - -// $wcProduct = new WC_Product($product['product_id']); - - if($product['variation_id']) { - $wcProduct = wc_get_product($product['variation_id']); - } else { - $wcProduct = wc_get_product($product['product_id']); - } - - global $discount, $price; - if( $wcProduct->is_on_sale() && get_option('ssbhesabix_set_special_sale_as_discount') === 'yes' ) { - $price = $this->getPriceInHesabixDefaultCurrency($wcProduct->get_regular_price()); - $discount = $this->getPriceInHesabixDefaultCurrency($wcProduct->get_regular_price() - $wcProduct->get_sale_price()); - $discount *= $product['quantity']; - } else { - $price = $this->getPriceInHesabixDefaultCurrency($product['subtotal'] / $product['quantity']); - $discount = $this->getPriceInHesabixDefaultCurrency($product['subtotal'] - $product['total']); - } - - $item = array( - 'RowNumber' => $i, - 'ItemCode' => $itemCode, - 'Description' => Ssbhesabix_Validation::invoiceItemDescriptionValidation($product['name']), - 'Quantity' => (int)$product['quantity'], - 'UnitPrice' => (float)$price, - 'Discount' => (float)$discount, - 'Tax' => (float)$this->getPriceInHesabixDefaultCurrency($product['total_tax']), - ); - - $invoiceItems[] = $item; - $i++; - } - - if ($failed) { - HesabixLogService::writeLogStr("Cannot add/update Invoice. Item code is NULL. Check your invoice products and relations with Hesabix. Order ID: $id_order"); - return false; - } - - if (empty($invoiceItems)) { - HesabixLogService::log(array("Cannot add/update Invoice. At least one item required.")); - return false; - } - - $date_obj = $order->get_date_created(); - switch ($orderType) { - case 0: - $date = $date_obj->date('Y-m-d H:i:s'); - break; - case 2: - $date = date('Y-m-d H:i:s'); - break; - default: - $date = $date_obj->date('Y-m-d H:i:s'); - } - - if ($reference === null) - $reference = $id_order; - - $order_shipping_method = ""; - foreach ($order->get_items('shipping') as $item) - $order_shipping_method = $item->get_name(); - - $note = $order->customer_note; - if ($order_shipping_method) - $note .= "\n" . __('Shipping method', 'ssbhesabix') . ": " . $order_shipping_method; - - global $freightOption, $freightItemCode; - $freightOption = get_option("ssbhesabix_invoice_freight"); - - if($freightOption == 1) { - $freightItemCode = get_option('ssbhesabix_invoice_freight_code'); - if(!isset($freightItemCode) || !$freightItemCode) HesabixLogService::writeLogStr("کد هزینه حمل و نقل تعریف نشده است" . "\n" . "Freight service code is not set"); - - $freightItemCode = $this->convertPersianDigitsToEnglish($freightItemCode); - - if($this->getPriceInHesabixDefaultCurrency($order->get_shipping_total()) != 0) { - $invoiceItem = array( - 'RowNumber' => $i, - 'ItemCode' => $freightItemCode, - 'Description' => 'هزینه حمل و نقل', - 'Quantity' => 1, - 'UnitPrice' => (float) $this->getPriceInHesabixDefaultCurrency($order->get_shipping_total()), - 'Discount' => 0, - 'Tax' => (float) $this->getPriceInHesabixDefaultCurrency($order->get_shipping_tax()) - ); - $invoiceItems[] = $invoiceItem; - } - } - - $data = array( - 'Number' => $number, - 'InvoiceType' => $orderType, - 'ContactCode' => $contactCode, - 'Date' => $date, - 'DueDate' => $date, - 'Reference' => $reference, - 'Status' => 2, - 'Tag' => json_encode(array('id_order' => $id_order)), - 'InvoiceItems' => $invoiceItems, - 'Note' => $note, - 'Freight' => '' - ); - - if($freightOption == 0) { - $freight = $this->getPriceInHesabixDefaultCurrency($order->get_shipping_total() + $order->get_shipping_tax()); - $data['Freight'] = $freight; - } - - $invoice_draft_save = get_option('ssbhesabix_invoice_draft_save_in_hesabix', 'no'); - if ($invoice_draft_save != 'no') - $data['Status'] = 0; - - $invoice_project = get_option('ssbhesabix_invoice_project', -1); - $invoice_salesman = get_option('ssbhesabix_invoice_salesman', -1); - $invoice_salesman_percentage = get_option('ssbhesabix_invoice_salesman_percentage', 0); - if ($invoice_project != -1) $data['Project'] = $invoice_project; - if ($invoice_salesman != -1) $data['SalesmanCode'] = $invoice_salesman; - if($invoice_salesman_percentage) if($invoice_salesman_percentage != 0) $data['SalesmanPercent'] = $this->convertPersianDigitsToEnglish($invoice_salesman_percentage); - - $GUID = $this->getGUID($id_order); - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->invoiceSave($data, $GUID); -// $response = $hesabix->invoiceSave($data, ''); - - if ($response->Success) { - global $wpdb; - - switch ($orderType) { - case 0: - $obj_type = 'order'; - break; - case 2: - $obj_type = 'returnOrder'; - break; - } - - if ($number === null) { - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$response->Result->Number, - 'obj_type' => $obj_type, - 'id_ps' => $id_order, - )); - HesabixLogService::log(array("Invoice successfully added. Invoice number: " . (string)$response->Result->Number . ". Order ID: $id_order")); - } else { - $wpFaId = $wpFaService->getWpFaId($obj_type, $id_order); - - $wpdb->update($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$response->Result->Number, - 'obj_type' => $obj_type, - 'id_ps' => $id_order, - ), array('id' => $wpFaId)); - HesabixLogService::log(array("Invoice successfully updated. Invoice number: " . (string)$response->Result->Number . ". Order ID: $id_order")); - } - - $warehouse = get_option('ssbhesabix_item_update_quantity_based_on', "-1"); - if ($warehouse != "-1" && $orderType === 0) - $this->setWarehouseReceipt($invoiceItems, (int)$response->Result->Number, $warehouse, $date, $invoice_project); - - return true; - } else { - foreach ($invoiceItems as $item) { - HesabixLogService::log(array("Cannot add/update Invoice. Error Code: " . (string)$response->ErrorCode . ". Error Message: " . (string)$response->ErrorMessage . ". Order ID: $id_order" . "\n" - . "Hesabix Id:" . $item['ItemCode'] - )); - } - return false; - } - } -//======================================================================================================================== - public function setWarehouseReceipt($items, $invoiceNumber, $warehouseCode, $date, $project) - { - $invoiceOption = get_option('ssbhesabix_invoice_freight'); - if($invoiceOption == 1) { - $invoiceFreightCode = get_option('ssbhesabix_invoice_freight_code'); - for ($i = 0 ; $i < count($items) ; $i++) { - if($items[$i]["ItemCode"] == $invoiceFreightCode) { - unset($items[$i]); - } - } - } - - $data = array( - 'WarehouseCode' => $warehouseCode, - 'InvoiceNumber' => $invoiceNumber, - 'InvoiceType' => 0, - 'Date' => $date, - 'Items' => $items - ); - - if ($project != -1) - $data['Project'] = $project; - - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->saveWarehouseReceipt($data); - - if ($response->Success) - HesabixLogService::log(array("Warehouse receipt successfully saved/updated. warehouse receipt number: " . (string)$response->Result->Number . ". Invoice number: $invoiceNumber")); - else - HesabixLogService::log(array("Cannot save/update Warehouse receipt. Error Code: " . (string)$response->ErrorCode . ". Error Message: " . (string)$response->ErrorMessage . ". Invoice number: $invoiceNumber")); - } -//======================================================================================================================== - public static function getPriceInHesabixDefaultCurrency($price) - { - if (!isset($price)) return false; - - $woocommerce_currency = get_woocommerce_currency(); - $hesabix_currency = get_option('ssbhesabix_hesabix_default_currency'); - - if (!is_numeric($price)) - $price = intval($price); - - if ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT') - $price *= 10; - - if ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR') - $price /= 10; - - return $price; - } -//======================================================================================================================== - public static function getPriceInWooCommerceDefaultCurrency($price) - { - if (!isset($price)) return false; - - $woocommerce_currency = get_woocommerce_currency(); - $hesabix_currency = get_option('ssbhesabix_hesabix_default_currency'); - - if (!is_numeric($price)) - $price = intval($price); - - if ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT') - $price /= 10; - - if ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR') - $price *= 10; - - return $price; - } -//======================================================================================================================== - public function setOrderPayment($id_order) - { - if (!isset($id_order)) { - return false; - } - - $hesabix = new Ssbhesabix_Api(); - $number = $this->getInvoiceCodeByOrderId($id_order); - if (!$number) { - return false; - } - - //$order = new WC_Order($id_order); - $order = wc_get_order($id_order); - - if ($order->get_total() <= 0) { - return true; - } - - - $transaction_id = $order->get_transaction_id(); - //transaction id cannot be null or empty - if ($transaction_id == '') { - $transaction_id = '-'; - } - - global $financialData; - if(get_option('ssbhesabix_payment_option') == 'no') { - $bank_code = $this->getBankCodeByPaymentMethod($order->get_payment_method()); - if ($bank_code != false) { - $payTempValue = substr($bank_code, 0, 4); - - switch($payTempValue) { - case 'bank': - $payTempValue = substr($bank_code, 4); - $financialData = array('bankCode' => $payTempValue);break; - case 'cash': - $payTempValue = substr($bank_code, 4); - $financialData = array('cashCode' => $payTempValue);break; - } - } else { - HesabixLogService::log(array("Cannot add Hesabix Invoice payment - Bank Code not defined. Order ID: $id_order")); - return false; - } - } elseif (get_option('ssbhesabix_payment_option') == 'yes') { - $defaultBankCode = $this->convertPersianDigitsToEnglish(get_option('ssbhesabix_default_payment_method_code')); - if($defaultBankCode != false) { - $financialData = array('bankCode' => $defaultBankCode); - } else { - HesabixLogService::writeLogStr("Default Bank Code is not Defined"); - return false; - } - } - - $date_obj = $order->get_date_paid(); - if ($date_obj == null) { - $date_obj = $order->get_date_modified(); - } - - global $accountPath; - - if(get_option("ssbhesabix_cash_in_transit") == "1" || get_option("ssbhesabix_cash_in_transit") == "yes") { - $func = new Ssbhesabix_Admin_Functions(); - $cashInTransitFullPath = $func->getCashInTransitFullPath(); - if(!$cashInTransitFullPath) { - HesabixLogService::writeLogStr("Cash in Transit is not Defined in Hesabix ---- وجوه در راه در حسابیکس یافت نشد"); - return false; - } else { - $accountPath = array("accountPath" => $cashInTransitFullPath); - } - } - - $response = $hesabix->invoiceGet($number); - if ($response->Success) { - if ($response->Result->Paid > 0) { - // payment submited before - } else { - $paymentMethod = $order->get_payment_method(); - $transactionFee = 0; - if(isset($paymentMethod)) { - if(get_option("ssbhesabix_payment_transaction_fee_$paymentMethod") > 0) $transactionFee = $this->formatTransactionFee(get_option("ssbhesabix_payment_transaction_fee_$paymentMethod"), $this->getPriceInHesabixDefaultCurrency($order->get_total())); - else $transactionFee = $this->formatTransactionFee(get_option("ssbhesabix_invoice_transaction_fee"), $this->getPriceInHesabixDefaultCurrency($order->get_total())); - } - - if(isset($transactionFee) && $transactionFee != null) $response = $hesabix->invoiceSavePayment($number, $financialData, $accountPath, $date_obj->date('Y-m-d H:i:s'), $this->getPriceInHesabixDefaultCurrency($order->get_total()), $transaction_id,'', $transactionFee); - else $response = $hesabix->invoiceSavePayment($number, $financialData, $accountPath, $date_obj->date('Y-m-d H:i:s'), $this->getPriceInHesabixDefaultCurrency($order->get_total()), $transaction_id,'', 0); - - if ($response->Success) { - HesabixLogService::log(array("Hesabix invoice payment added. Order ID: $id_order")); - return true; - } else { - HesabixLogService::log(array("Cannot add Hesabix Invoice payment. Order ID: $id_order. Error Code: " . (string)$response->ErrorCode . ". Error Message: " . (string)$response->ErrorMessage . ".")); - return false; - } - } - return true; - } else { - HesabixLogService::log(array("Error while trying to get invoice. Invoice Number: $number. Error Code: " . (string)$response->ErrorCode . ". Error Message: " . (string)$response->ErrorMessage . ".")); - return false; - } - } -//======================================================================================================================== - public function getCashInTransitFullPath() { - $api = new Ssbhesabix_Api(); - $accounts = $api->settingGetAccounts(); - foreach ($accounts->Result as $account) { - if($account->Name == "وجوه در راه") { - return $account->FullPath; - } - } - return false; - } -//======================================================================================================================== - public function getInvoiceNumberByOrderId($id_order) - { - if (!isset($id_order)) return false; - - global $wpdb; - $row = $wpdb->get_row("SELECT `id_hesabix` FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_ps` = $id_order AND `obj_type` = 'order'"); - - if (is_object($row)) { - return $row->id_hesabix; - } else { - return false; - } - } -//======================================================================================================================== - public function getBankCodeByPaymentMethod($payment_method) - { - $code = get_option('ssbhesabix_payment_method_' . $payment_method); - - if (isset($code)) - return $code; - else - return false; - } -//======================================================================================================================== - public function getInvoiceCodeByOrderId($id_order) - { - if (!isset($id_order)) return false; - - global $wpdb; - $row = $wpdb->get_row("SELECT `id_hesabix` FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_ps` = $id_order AND `obj_type` = 'order'"); - - if (is_object($row)) { - return $row->id_hesabix; - } else { - return false; - } - } -//======================================================================================================================== - public function exportProducts($batch, $totalBatch, $total, $updateCount) - { - HesabixLogService::writeLogStr("Exporting Products"); - try { - $wpFaService = new HesabixWpFaService(); - $extraSettingRPP = get_option("ssbhesabix_set_rpp_for_export_products"); - $rpp=500; - if($extraSettingRPP) { - if($extraSettingRPP != '-1' && $extraSettingRPP != '0') { - $rpp=$extraSettingRPP; - } - } - $result = array(); - $result["error"] = false; - global $wpdb; - - if ($batch == 1) { -// $total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts` -// WHERE post_type = 'product' AND post_status IN('publish','private')"); - - $total = $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(*) FROM {$wpdb->posts} - WHERE post_type = 'product' AND post_status IN ('publish', 'private')" - ) - ); - - $totalBatch = ceil($total / $rpp); - } - - $offset = ($batch - 1) * $rpp; -// $products = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "posts` -// WHERE post_type = 'product' AND post_status IN('publish','private') ORDER BY 'ID' ASC LIMIT $offset,$rpp"); - - $products = $wpdb->get_results( - $wpdb->prepare( - "SELECT ID FROM {$wpdb->posts} - WHERE post_type = 'product' AND post_status IN ('publish', 'private') - ORDER BY ID ASC - LIMIT %d, %d", - $offset, - $rpp - ) - ); - - $items = array(); - - foreach ($products as $item) { - $id_product = $item->ID; - $product = new WC_Product($id_product); - - $id_obj = $wpFaService->getWpFaId('product', $id_product, 0); - - if (!$id_obj) { - $hesabixItem = ssbhesabixItemService::mapProduct($product, $id_product); - array_push($items, $hesabixItem); - $updateCount++; - } - - $variations = $this->getProductVariations($id_product); - if ($variations) { - foreach ($variations as $variation) { - $id_attribute = $variation->get_id(); - $id_obj = $wpFaService->getWpFaId('product', $id_product, $id_attribute); - - if (!$id_obj) { - $hesabixItem = ssbhesabixItemService::mapProductVariation($product, $variation, $id_product); - array_push($items, $hesabixItem); - $updateCount++; - } - } - } - } - - if (!empty($items)) { - $count = 0; - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->itemBatchSave($items); - if ($response->Success) { - foreach ($response->Result as $item) { - $json = json_decode($item->Tag); - - global $wpdb; - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$item->Code, - 'obj_type' => 'product', - 'id_ps' => (int)$json->id_product, - 'id_ps_attribute' => (int)$json->id_attribute, - )); - HesabixLogService::log(array("Item successfully added. Item Code: " . (string)$item->Code . ". Product ID: $json->id_product - $json->id_attribute")); - } - $count += count($response->Result); - } else { - HesabixLogService::log(array("Cannot add bulk item. Error Message: " . (string)$response->ErrorMessage . ". Error Code: " . (string)$response->ErrorCode . ".")); - } - sleep(2); - } - - $result["batch"] = $batch; - $result["totalBatch"] = $totalBatch; - $result["total"] = $total; - $result["updateCount"] = $updateCount; - return $result; - } catch(Error $error) { - HesabixLogService::writeLogStr("Error in export products: " . $error->getMessage()); - } - } -//======================================================================================================================== - public function importProducts($batch, $totalBatch, $total, $updateCount) - { - HesabixLogService::writeLogStr("Import Products"); - try { - $wpFaService = new HesabixWpFaService(); - $extraSettingRPP = get_option("ssbhesabix_set_rpp_for_import_products"); - - $rpp=100; - if($extraSettingRPP) { - if($extraSettingRPP != '-1' && $extraSettingRPP != '0') { - $rpp=$extraSettingRPP; - } - } - - $result = array(); - $result["error"] = false; - global $wpdb; - $hesabix = new Ssbhesabix_Api(); - $filters = array(array("Property" => "khadamat", "Operator" => "=", "Value" => 0)); - - if ($batch == 1) { - $total = 0; - $response = $hesabix->itemGetItems(array('Take' => 1, 'Filters' => $filters)); - if ($response->Success) { - $total = $response->Result->FilteredCount; - $totalBatch = ceil($total / $rpp); - } else { - HesabixLogService::log(array("Error while trying to get products for import. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode.")); - $result["error"] = true; - return $result; - }; - } - - $id_product_array = array(); - $offset = ($batch - 1) * $rpp; - - $response = $hesabix->itemGetItems(array('Skip' => $offset, 'Take' => $rpp, 'SortBy' => 'Id', 'Filters' => $filters)); - if ($response->Success) { - $items = $response->Result->List; - $from = $response->Result->From; - $to = $response->Result->To; - - foreach ($items as $item) { - $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Code); - if ($wpFa) continue; - - $clearedName = preg_replace("/\s+|\/|\\\|\(|\)/", '-', trim($item->Name)); - $clearedName = preg_replace("/\-+/", '-', $clearedName); - $clearedName = trim($clearedName, '-'); - $clearedName = preg_replace(["/۰/", "/۱/", "/۲/", "/۳/", "/۴/", "/۵/", "/۶/", "/۷/", "/۸/", "/۹/"], - ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], $clearedName); - - // add product to database - $wpdb->insert($wpdb->posts, array( - 'post_author' => get_current_user_id(), - 'post_date' => current_time('mysql'), - 'post_date_gmt' => current_time('mysql', 1), - 'post_content' => '', - 'post_title' => $item->Name, - 'post_excerpt' => '', - 'post_status' => 'private', - 'comment_status' => 'open', - 'ping_status' => 'closed', - 'post_password' => '', - 'post_name' => $clearedName, - 'to_ping' => '', - 'pinged' => '', - 'post_modified' => current_time('mysql'), - 'post_modified_gmt' => current_time('mysql', 1), - 'post_content_filtered' => '', - 'post_parent' => 0, - 'guid' => home_url('/product/' . $clearedName . '/'), - 'menu_order' => 0, - 'post_type' => 'product', - 'post_mime_type' => '', - 'comment_count' => 0, - )); - - $postId = $wpdb->insert_id; - $id_product_array[] = $postId; - $price = self::getPriceInWooCommerceDefaultCurrency($item->SellPrice); - - // add product link to hesabix - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( - 'obj_type' => 'product', - 'id_hesabix' => (int)$item->Code, - 'id_ps' => $postId, - 'id_ps_attribute' => 0, - )); - - update_post_meta($postId, '_manage_stock', 'yes'); - update_post_meta($postId, '_sku', $item->Barcode); - update_post_meta($postId, '_regular_price', $price); - update_post_meta($postId, '_price', $price); - update_post_meta($postId, '_stock', $item->Stock); - - $new_stock_status = ($item->Stock > 0) ? "instock" : "outofstock"; - wc_update_product_stock_status($postId, $new_stock_status); - $updateCount++; - } - - } else { - HesabixLogService::log(array("Error while trying to get products for import. Error Message: (string)$response->ErrorMessage. Error Code: (string)$response->ErrorCode.")); - $result["error"] = true; - return $result; - } - sleep(2); - - $result["batch"] = $batch; - $result["totalBatch"] = $totalBatch; - $result["total"] = $total; - $result["updateCount"] = $updateCount; - return $result; - } catch(Error $error) { - HesabixLogService::writeLogStr("Error in importing products" . $error->getMessage()); - } - } -//======================================================================================================================== - public function exportOpeningQuantity($batch, $totalBatch, $total) - { - try { - $wpFaService = new HesabixWpFaService(); - - $result = array(); - $result["error"] = false; - $extraSettingRPP = get_option("ssbhesabix_set_rpp_for_export_opening_products"); - - $rpp=500; - if($extraSettingRPP) { - if($extraSettingRPP != '-1' && $extraSettingRPP != '0') { - $rpp=$extraSettingRPP; - } - } - - global $wpdb; - - if ($batch == 1) { - $total = $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(*) FROM {$wpdb->posts} - WHERE post_type = 'product' AND post_status IN ('publish', 'private')" - ) - ); - $totalBatch = ceil($total / $rpp); - } - - $offset = ($batch - 1) * $rpp; - - $products = $wpdb->get_results( - $wpdb->prepare( - "SELECT ID FROM {$wpdb->posts} - WHERE post_type = 'product' AND post_status IN ('publish', 'private') - ORDER BY ID ASC - LIMIT %d, %d", - $offset, - $rpp - ) - ); - - $items = array(); - - foreach ($products as $item) { - $variations = $this->getProductVariations($item->ID); - if (!$variations) { - $id_obj = $wpFaService->getWpFaId('product', $item->ID, 0); - - if ($id_obj != false) { - $product = new WC_Product($item->ID); - $quantity = $product->get_stock_quantity(); - $price = $product->get_regular_price() ? $product->get_regular_price() : $product->get_price(); - - $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id` = " . $id_obj . " AND `obj_type` = 'product'"); - - if (is_object($product) && is_object($row) && $quantity > 0 && $price > 0) { - array_push($items, array( - 'Code' => $row->id_hesabix, - 'Quantity' => $quantity, - 'UnitPrice' => $this->getPriceInHesabixDefaultCurrency($price), - )); - } - } - } else { - foreach ($variations as $variation) { - $id_attribute = $variation->get_id(); - $id_obj = $wpFaService->getWpFaId('product', $item->ID, $id_attribute); - if ($id_obj != false) { - $quantity = $variation->get_stock_quantity(); - $price = $variation->get_regular_price() ? $variation->get_regular_price() : $variation->get_price(); - - $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id` = " . $id_obj . " AND `obj_type` = 'product'"); - - if (is_object($variation) && is_object($row) && $quantity > 0 && $price > 0) { - array_push($items, array( - 'Code' => $row->id_hesabix, - 'Quantity' => $quantity, - 'UnitPrice' => $this->getPriceInHesabixDefaultCurrency($price), - )); - } - } - } - } - } - - if (!empty($items)) { - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->itemUpdateOpeningQuantity($items); - if ($response->Success) { - // continue batch loop - } else { - HesabixLogService::log(array("ssbhesabix - Cannot set Opening quantity. Error Code: ' . $response->ErrorCode . '. Error Message: ' . $response->ErrorMessage")); - $result['error'] = true; - if ($response->ErrorCode = 199 && $response->ErrorMessage == 'No-Shareholders-Exist') { - $result['errorType'] = 'shareholderError'; - return $result; - } - return $result; - } - } - sleep(2); - $result["batch"] = $batch; - $result["totalBatch"] = $totalBatch; - $result["total"] = $total; - $result["done"] = $batch == $totalBatch; - return $result; - } catch(Error $error) { - HesabixLogService::writeLogStr("Error in Exporting Opening Quantity" . $error->getMessage()); - } - } -//======================================================================================================================== - public function exportCustomers($batch, $totalBatch, $total, $updateCount) - { - HesabixLogService::writeLogStr("Export Customers"); - $wpFaService = new HesabixWpFaService(); - - $result = array(); - $result["error"] = false; - $rpp = 500; - global $wpdb; - - if ($batch == 1) { - $total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "users`"); - $totalBatch = ceil($total / $rpp); - } - - $offset = ($batch - 1) * $rpp; - $customers = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "users` ORDER BY ID ASC LIMIT $offset,$rpp"); - - $items = array(); - foreach ($customers as $item) { - $id_customer = $item->ID; - $id_obj = $wpFaService->getWpFaId('customer', $id_customer); - if (!$id_obj) { - $hesabixCustomer = ssbhesabixCustomerService::mapCustomer(null, $id_customer); - array_push($items, $hesabixCustomer); - $updateCount++; - } - } - - if (!empty($items)) { - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->contactBatchSave($items); - if ($response->Success) { - foreach ($response->Result as $item) { - $json = json_decode($item->Tag); - - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$item->Code, - 'obj_type' => 'customer', - 'id_ps' => (int)$json->id_customer, - )); - - HesabixLogService::log(array("Contact successfully added. Contact Code: " . $item->Code . ". Customer ID: " . (int)$json->id_customer)); - } - } else { - HesabixLogService::log(array("Cannot add bulk contacts. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode.")); - } - } - - $result["batch"] = $batch; - $result["totalBatch"] = $totalBatch; - $result["total"] = $total; - $result["updateCount"] = $updateCount; - - return $result; - } -//======================================================================================================================== - public function syncOrders($from_date, $end_date, $batch, $totalBatch, $total, $updateCount) - { - HesabixLogService::writeLogStr("Sync Orders"); - $wpFaService = new HesabixWpFaService(); - - $result = array(); - $result["error"] = false; - $rpp = 10; - global $wpdb; - - if (!isset($from_date) || empty($from_date)) { - $result['error'] = 'inputDateError'; - return $result; - } - - if (!isset($end_date) || empty($end_date)) { - $result['error'] = 'inputDateError'; - return $result; - } - - if (!$this->isDateInFiscalYear($from_date)) { - $result['error'] = 'fiscalYearError'; - return $result; - } - - if (!$this->isDateInFiscalYear($end_date)) { - $result['error'] = 'fiscalYearError'; - return $result; - } - - if ($batch == 1) { - if (get_option('woocommerce_custom_orders_table_enabled') === 'yes') { - $total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "wc_orders` - WHERE type = 'shop_order' AND date_created_gmt >= '" . $from_date . "' AND date_created_gmt <= '". $end_date ."'"); - } else { - $total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts` - WHERE post_type = 'shop_order' AND post_date >= '" . $from_date . "' AND post_date <= '". $end_date ."'"); - } - $totalBatch = ceil($total / $rpp); - } - - $offset = ($batch - 1) * $rpp; - - if (get_option('woocommerce_custom_orders_table_enabled') === 'yes') { - $orders = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "wc_orders` - WHERE type = 'shop_order' AND date_created_gmt >= '" . $from_date . "' - AND date_created_gmt <= '". $end_date ."' - ORDER BY ID ASC LIMIT $offset,$rpp"); - } else { - $orders = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "posts` - WHERE post_type = 'shop_order' AND post_date >= '" . $from_date . "' - AND post_date <= '". $end_date ."' - ORDER BY ID ASC LIMIT $offset,$rpp"); - } - - HesabixLogService::writeLogStr("Orders count: " . count($orders)); - - $statusesToSubmitInvoice = get_option('ssbhesabix_invoice_status'); - $statusesToSubmitInvoice = implode(',', $statusesToSubmitInvoice); - $statusesToSubmitReturnInvoice = get_option('ssbhesabix_invoice_return_status'); - $statusesToSubmitReturnInvoice = implode(',', $statusesToSubmitReturnInvoice); - $statusesToSubmitPayment = get_option('ssbhesabix_payment_status'); - $statusesToSubmitPayment = implode(',', $statusesToSubmitPayment); - - $id_orders = array(); - foreach ($orders as $order) { - //$order = new WC_Order($order->ID); - $order = wc_get_order($order->ID); - - $id_order = $order->get_id(); - $id_obj = $wpFaService->getWpFaId('order', $id_order); - $current_status = $order->get_status(); - - if (!$id_obj) { - if (strpos($statusesToSubmitInvoice, $current_status) !== false) { - if ($this->setOrder($id_order)) { - array_push($id_orders, $id_order); - $updateCount++; - - if (strpos($statusesToSubmitPayment, $current_status) !== false) - $this->setOrderPayment($id_order); - - // set return invoice - if (strpos($statusesToSubmitReturnInvoice, $current_status) !== false) { - $this->setOrder($id_order, 2, $this->getInvoiceCodeByOrderId($id_order)); - } - } - } - } else { - if (strpos($statusesToSubmitPayment, $current_status) !== false) - $this->setOrderPayment($id_order); - } - } - - $result["batch"] = $batch; - $result["totalBatch"] = $totalBatch; - $result["total"] = $total; - $result["updateCount"] = $updateCount; - return $result; - } -//======================================================================================================================== - public function syncProducts($batch, $totalBatch, $total) - { - try { - HesabixLogService::writeLogStr("Sync products price and quantity from hesabix to store: part $batch"); - $result = array(); - $result["error"] = false; - $extraSettingRPP = get_option("ssbhesabix_set_rpp_for_sync_products_into_woocommerce"); - - $rpp=200; - if($extraSettingRPP) { - if($extraSettingRPP != '-1' && $extraSettingRPP != '0') { - $rpp=$extraSettingRPP; - } - } - - $hesabix = new Ssbhesabix_Api(); - $filters = array(array("Property" => "khadamat", "Operator" => "=", "Value" => 0)); - - if ($batch == 1) { - $response = $hesabix->itemGetItems(array('Take' => 1, 'Filters' => $filters)); - if ($response->Success) { - $total = $response->Result->FilteredCount; - $totalBatch = ceil($total / $rpp); - } else { - HesabixLogService::log(array("Error while trying to get products for sync. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode.")); - $result["error"] = true; - return $result; - } - } - - $offset = ($batch - 1) * $rpp; - $response = $hesabix->itemGetItems(array('Skip' => $offset, 'Take' => $rpp, 'SortBy' => 'Id', 'Filters' => $filters)); - - $warehouse = get_option('ssbhesabix_item_update_quantity_based_on', "-1"); - - if ($warehouse != "-1") { - $products = $response->Result->List; - $codes = []; - foreach ($products as $product) - $codes[] = $product->Code; - $response = $hesabix->itemGetQuantity($warehouse, $codes); - } - - if ($response->Success) { - $products = $warehouse == "-1" ? $response->Result->List : $response->Result; - foreach ($products as $product) { - self::setItemChanges($product); - } - } else { - HesabixLogService::log(array("Error while trying to get products for sync. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode.")); - $result["error"] = true; - return $result; - } - - $result["batch"] = $batch; - $result["totalBatch"] = $totalBatch; - $result["total"] = $total; - return $result; - } catch (Error $error) { - HesabixLogService::writeLogStr("Error in sync products: " . $error->getMessage()); - } - } -//======================================================================================================================== - public function syncProductsManually($data) - { - HesabixLogService::writeLogStr('Sync Products Manually'); - - $hesabix_item_codes = array(); - foreach ($data as $d) { - if ($d["hesabix_id"]) { - $hesabix_item_codes[] = str_pad($d["hesabix_id"], 6, "0", STR_PAD_LEFT); - } - } - - $hesabix = new Ssbhesabix_Api(); - - $filters = array(array("Property" => "Code", "Operator" => "in", "Value" => $hesabix_item_codes)); - $response = $hesabix->itemGetItems(array('Take' => 100, 'Filters' => $filters)); - - if ($response->Success) { - $products = $response->Result->List; - $products_codes = array(); - foreach ($products as $product) - $products_codes[] = $product->Code; - $diff = array_diff($hesabix_item_codes, $products_codes); - if (is_array($diff) && count($diff) > 0) { - return array("result" => false, "data" => $diff); - } - } - - $id_product_array = array(); - global $wpdb; - - foreach ($data as $d) { - $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps_attribute` = " . $d["id"] . " AND `obj_type` = 'product'"); - - if (!is_object($row)) { - $row = $wpdb->get_row("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_ps` = " . $d["id"] . " AND `obj_type` = 'product'"); - } - if (is_object($row)) { - if (!$d["hesabix_id"]) - $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id' => $row->id)); - else - $wpdb->update($wpdb->prefix . 'ssbhesabix', array('id_hesabix' => $d["hesabix_id"]), array('id' => $row->id)); - } else { - if (!$d["hesabix_id"]) - continue; - if ($d["parent_id"]) - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array('obj_type' => 'product', 'id_hesabix' => $d["hesabix_id"], 'id_ps' => $d["parent_id"], 'id_ps_attribute' => $d["id"])); - else - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array('obj_type' => 'product', 'id_hesabix' => $d["hesabix_id"], 'id_ps' => $d["id"], 'id_ps_attribute' => '0')); - } - - if ($d["hesabix_id"]) { - if ($d["parent_id"]) { - if (!in_array($d["parent_id"], $id_product_array)) - $id_product_array[] = $d["parent_id"]; - } else { - if (!in_array($d["id"], $id_product_array)) - $id_product_array[] = $d["id"]; - } - } - } - - $this->setItems($id_product_array); - return array("result" => true, "data" => null); - } -//======================================================================================================================== - public function updateProductsInHesabixBasedOnStore($batch, $totalBatch, $total) - { - HesabixLogService::writeLogStr("Update Products In Hesabix Based On Store"); - $result = array(); - $result["error"] = false; - $extraSettingRPP = get_option('ssbhesabix_set_rpp_for_sync_products_into_hesabix'); - - $rpp=500; - if($extraSettingRPP) { - if($extraSettingRPP != '-1' && $extraSettingRPP != '0') { - $rpp=$extraSettingRPP; - } - } - - global $wpdb; - - if ($batch == 1) { - //$total = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts` WHERE post_type = 'product' AND post_status IN('publish','private')"); - - $total = $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(*) FROM {$wpdb->posts} - WHERE post_type = 'product' AND post_status IN ('publish', 'private')" - ) - ); - $totalBatch = ceil($total / $rpp); - } - - $offset = ($batch - 1) * $rpp; -// $products = $wpdb->get_results("SELECT ID FROM `" . $wpdb->prefix . "posts` -// WHERE post_type = 'product' AND post_status IN('publish','private') ORDER BY 'ID' ASC LIMIT $offset,$rpp"); - - $products = $wpdb->get_results( - $wpdb->prepare( - "SELECT ID FROM {$wpdb->posts} - WHERE post_type = 'product' AND post_status IN ('publish', 'private') - ORDER BY ID ASC - LIMIT %d, %d", - $offset, - $rpp - ) - ); - - $products_id_array = array(); - foreach ($products as $product) - $products_id_array[] = $product->ID; - $this->setItems($products_id_array); - sleep(2); - - $result["batch"] = $batch; - $result["totalBatch"] = $totalBatch; - $result["total"] = $total; - return $result; - } -//======================================================================================================================== - public static function updateProductsInHesabixBasedOnStoreWithFilter($offset=0, $rpp=0) - { - HesabixLogService::writeLogStr("Update Products With Filter In Hesabix Based On Store"); - $result = array(); - $result["error"] = false; - - global $wpdb; - if($offset != 0 && $rpp != 0) { - if(abs($rpp - $offset) <= 200) { - if($rpp > $offset) { -// $products = $wpdb->get_results("SELECT * FROM `" . $wpdb->prefix . "posts` -// WHERE ID BETWEEN $offset AND $rpp AND post_type = 'product' AND post_status IN('publish','private') ORDER BY 'ID' ASC"); - - $products = $wpdb->get_results( - $wpdb->prepare( - "SELECT * FROM {$wpdb->posts} - WHERE ID BETWEEN %d AND %d - AND post_type = 'product' - AND post_status IN ('publish', 'private') - ORDER BY ID ASC", - $offset, - $rpp - ) - ); - - $products_id_array = array(); - foreach ($products as $product) - $products_id_array[] = $product->ID; - $response = (new Ssbhesabix_Admin_Functions)->setItems($products_id_array); - if(!$response) $result['error'] = true; - } else { -// $products = $wpdb->get_results("SELECT * FROM `" . $wpdb->prefix . "posts` -// WHERE ID BETWEEN $rpp AND $offset AND post_type = 'product' AND post_status IN('publish','private') ORDER BY 'ID' ASC"); - - $products = $wpdb->get_results( - $wpdb->prepare( - "SELECT * FROM {$wpdb->posts} - WHERE ID BETWEEN %d AND %d - AND post_type = 'product' - AND post_status IN ('publish', 'private') - ORDER BY ID ASC", - $rpp, - $offset - ) - ); - - $products_id_array = array(); - foreach ($products as $product) - $products_id_array[] = $product->ID; - $response = (new Ssbhesabix_Admin_Functions)->setItems($products_id_array); - if(!$response) $result['error'] = true; - } - } else { - $result['error'] = true; - echo ''; - } - } else { - echo ''; - } - - return $result; - } -//======================================================================================================================== - public function cleanLogFile() - { - HesabixLogService::clearLog(); - return true; - } -//======================================================================================================================== - public static function setItemChanges($item) - { - if (!is_object($item)) return false; - - if ($item->Quantity || !$item->Stock) - $item->Stock = $item->Quantity; - - $wpFaService = new HesabixWpFaService(); - global $wpdb; - - $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Code); - if (!$wpFa) return false; - - $id_product = $wpFa->idWp; - $id_attribute = $wpFa->idWpAttribute; - - if ($id_product == 0) { - HesabixLogService::log(array("Item with code: $item->Code is not defined in Online store")); - return false; - } - - //$found = $wpdb->get_var("SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts` WHERE ID = $id_product"); - - $found = $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(*) FROM {$wpdb->posts} - WHERE ID = %d", - $id_product - ) - ); - - - if (!$found) { - HesabixLogService::writeLogStr("product not found in woocommerce.code: $item->Code, product id: $id_product, variation id: $id_attribute"); - return false; - } - - $product = wc_get_product($id_product); - $variation = $id_attribute != 0 ? wc_get_product($id_attribute) : null; - - -// $product = new WC_Product($id_product); -// $variation = $id_attribute != 0 ? new WC_Product($id_attribute) : null; - - $result = array(); - $result["newPrice"] = null; - $result["newQuantity"] = null; - - $p = $variation ? $variation : $product; - - if (get_option('ssbhesabix_item_update_price') == 'yes') - $result = self::setItemNewPrice($p, $item, $id_attribute, $id_product, $result); - - if (get_option('ssbhesabix_item_update_quantity') == 'yes') - $result = self::setItemNewQuantity($p, $item, $id_product, $id_attribute, $result); - - return $result; - } -//======================================================================================================================== - private static function setItemNewPrice($product, $item, $id_attribute, $id_product, array $result) - { - try { - $option_sale_price = get_option('ssbhesabix_item_update_sale_price', 0); - $woocommerce_currency = get_woocommerce_currency(); - $hesabix_currency = get_option('ssbhesabix_hesabix_default_currency'); - - $old_price = $product->get_regular_price() ? $product->get_regular_price() : $product->get_price(); - $old_price = Ssbhesabix_Admin_Functions::getPriceInHesabixDefaultCurrency($old_price); - - $post_id = $id_attribute && $id_attribute > 0 ? $id_attribute : $id_product; - - if ($item->SellPrice != $old_price) { - $new_price = Ssbhesabix_Admin_Functions::getPriceInWooCommerceDefaultCurrency($item->SellPrice); - update_post_meta($post_id, '_regular_price', $new_price); - update_post_meta($post_id, '_price', $new_price); - - - $sale_price = $product->get_sale_price(); - if ($sale_price && is_numeric($sale_price)) { - $sale_price = Ssbhesabix_Admin_Functions::getPriceInHesabixDefaultCurrency($sale_price); - if (+$option_sale_price === 1) { - update_post_meta($post_id, '_sale_price', null); - } elseif (+$option_sale_price === 2) { - update_post_meta($post_id, '_sale_price', round(($sale_price * $new_price) / $old_price)); - update_post_meta($post_id, '_price', round(($sale_price * $new_price) / $old_price)); - } else { - if($woocommerce_currency == 'IRT' && $hesabix_currency == 'IRR') update_post_meta($post_id, '_price', ($sale_price/10)); - elseif($woocommerce_currency == 'IRR' && $hesabix_currency == 'IRT') update_post_meta($post_id, '_price', ($sale_price*10)); - elseif($woocommerce_currency == 'IRR' && $hesabix_currency == 'IRR') update_post_meta($post_id, '_price', $sale_price); - elseif($woocommerce_currency == 'IRT' && $hesabix_currency == 'IRT') update_post_meta($post_id, '_price', $sale_price); - } - } - - HesabixLogService::log(array("product ID $id_product-$id_attribute Price changed. Old Price: $old_price. New Price: $new_price")); - $result["newPrice"] = $new_price; - } - - return $result; - } catch (Error $error) { - HesabixLogService::writeLogStr("Error in Set Item New Price -> $error"); - } - } -//======================================================================================================================== - private static function setItemNewQuantity($product, $item, $id_product, $id_attribute, array $result) - { - try { - $old_quantity = $product->get_stock_quantity(); - if ($item->Stock != $old_quantity) { - $new_quantity = $item->Stock; - if (!$new_quantity) $new_quantity = 0; - - $new_stock_status = ($new_quantity > 0) ? "instock" : "outofstock"; - - $post_id = ($id_attribute && $id_attribute > 0) ? $id_attribute : $id_product; - -// update_post_meta($post_id, '_stock', $new_quantity); -// wc_update_product_stock_status($post_id, $new_stock_status); - - $product = wc_get_product( $post_id ); - if ( $product ) { - - $product->set_stock_quantity( $new_quantity ); - $product->set_stock_status( $new_stock_status ); - $product->save(); - HesabixLogService::log(array("product ID $id_product-$id_attribute quantity changed. Old quantity: $old_quantity. New quantity: $new_quantity")); - $result["newQuantity"] = $new_quantity; - } - } - - return $result; - } catch (Error $error) { - HesabixLogService::writeLogStr("Error in Set Item New Quantity -> $error"); - } - } -//========================================================================================================================= - public static function syncLastChangeID(): bool { - try { - HesabixLogService::writeLogStr("Sync Last Change ID"); - $hesabixApi = new Ssbhesabix_Api(); - $lastChange = $hesabixApi->getLastChangeId(); - - if ($lastChange && isset($lastChange->LastId)) { - update_option('ssbhesabix_last_log_check_id', $lastChange->LastId - 1); - return true; - } - } catch (Exception $error) { - HesabixLogService::writeLogStr("Error in syncing last change id -> " . $error->getMessage()); - } - - return false; - } -//========================================================================================================================= - public static function SaveProductManuallyToHesabix($woocommerceCode, $attributeId, $hesabixCode): bool { - //check no record exist in hesabix - $isProductExistInHesabix = self::CheckExistenceOfTheProductInHesabix($hesabixCode); - if(!$isProductExistInHesabix) { - $isProductValidInWoocommerce = self::CheckValidityOfTheProductInWoocommerce($woocommerceCode, $attributeId, $hesabixCode); - if($isProductValidInWoocommerce) { - //get product - $product = wc_get_product($woocommerceCode); - if($attributeId != 0) $variation = wc_get_product($attributeId); - - if($attributeId == 0) { - $hesabixItem = ssbhesabixItemService::mapProduct($product, $woocommerceCode); - } else { - $hesabixItem = ssbhesabixItemService::mapProductVariation($product, $variation, $woocommerceCode); - } - - //save product to hesabix and make a new link - $api = new Ssbhesabix_Api(); - $hesabixItem["Code"] = $hesabixCode; - $response = $api->itemSave($hesabixItem); - if($response->Success) { - if($attributeId == 0) $productCode = $woocommerceCode; else $productCode = $attributeId; - HesabixLogService::log(array("Item successfully added to Hesabix. Hesabix code: " . $hesabixCode . " - Product code: " . $productCode)); - - $wpFaService = new HesabixWpFaService(); - $wpFa = $wpFaService->getWpFa('product', $woocommerceCode, $attributeId); - if (!$wpFa) { - $wpFa = new WpFa(); - $wpFa->idHesabix = $hesabixCode; - $wpFa->idWp = $woocommerceCode; - $wpFa->idWpAttribute = $attributeId; - $wpFa->objType = 'product'; - $wpFaService->save($wpFa); - HesabixLogService::log(array("Item successfully added. Hesabix code: " . (string)$hesabixCode . ". Product ID: $woocommerceCode - $attributeId")); - return true; - } - } else { - HesabixLogService::log(array("Error in saving product to hesabix. Hesabix given code: " . $hesabixCode)); - return false; - } - } - } - - return false; - } -//========================================================================================================================= - public static function CheckExistenceOfTheProductInHesabix($hesabixCode): bool { - $api = new Ssbhesabix_Api(); - $response = $api->itemGet($hesabixCode); - if($response->Success) { - HesabixLogService::writeLogStr("کالا با کد(" . $hesabixCode . ") در حسابیکس موجود است."); - return true; - } else if($response->ErrorCode == "112") { - return false; - } else { - HesabixLogService::writeLogStr("Error in getting the existence of the product"); - return true; - } - } -//========================================================================================================================= - public static function CheckValidityOfTheProductInWoocommerce($woocommerceCode, $attributeId, $hesabixCode): bool { - //check not exist in link table - $wpFaService = new HesabixWpFaService(); - $code = $wpFaService->getProductCodeByWpId($woocommerceCode, $attributeId); - if ($code) { - HesabixLogService::writeLogStr("این کد حسابیکسی وارد شده به کالای دیگری متصل است." . $code . " - " . $woocommerceCode . " - " . $attributeId); - return false; - } - - //check woocommerce code exists - global $wpdb; - - if($attributeId != 0) $productId = $attributeId; - else $productId = $woocommerceCode; - - $found = $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(*) FROM {$wpdb->posts} - WHERE ID = %d", - $productId - ) - ); - - if($found) { - //product is valid - return true; - } else { - HesabixLogService::writeLogStr("product not found in woocommerce. Given product code: " . $woocommerceCode . "-" . $attributeId ); - return false; - } - } -//========================================================================================================================= - function checkNationalCode($NationalCode): void - { - $identicalDigits = ['1111111111', '2222222222', '3333333333', '4444444444', '5555555555', '6666666666', '7777777777', '8888888888', '9999999999']; - - if(strlen($NationalCode) === 10) { - $summation = 0; - $j = 10; - for($i = 0 ; $i < 9 ; $i++) { - $digit = substr($NationalCode, $i, 1); - $temp = $digit * $j; - $j -= 1; - $summation += $temp; - } - $controlDigit = substr($NationalCode, 9, 1); - $retrieve = $summation % 11; - - if(in_array($NationalCode, $identicalDigits) === false) { - if($retrieve < 2) { - if($controlDigit != $retrieve) { - wc_add_notice(__('please enter a valid national code', 'ssbhesabix'), 'error'); - } - } else { - if($controlDigit != (11 - $retrieve)) { - wc_add_notice(__('please enter a valid national code', 'ssbhesabix'), 'error'); - } - } - } - } else { - wc_add_notice(__('please enter a valid national code', 'ssbhesabix'), 'error'); - } - } -//========================================================================================================================= - public function checkNationalCodeWithPhone($nationalCode, $billingPhone): bool { - $api = new Ssbhesabix_Api(); - - $formattedPhoneNumber = $this->convertPersianPhoneDigitsToEnglish($billingPhone); - $formattedPhoneNumber = $this->formatPhoneNumber($formattedPhoneNumber); - - $response = $api->checkMobileAndNationalCode($nationalCode, $formattedPhoneNumber); - if($response->Success) { - if($response->Result->Status == 1) { - return $response->Result->Data->Matched; - } else { - return false; - } - } else { - HesabixLogService::writeLogStr('Error Occurred in Checking Mobile and NationalCode. ErrorCode: ' . $response->ErrorCode . " - ErrorMessage: " . $response->ErrorMessage); - return false; - } - } -//========================================================================================================================= - function checkWebsite($Website): void - { - if (filter_var($Website, FILTER_VALIDATE_URL)) { - // - } else { - wc_add_notice(__('please enter a valid Website URL', 'ssbhesabix'), 'error'); - } - } -//========================================================================================================================= - public static function enableDebugMode(): void { - update_option('ssbhesabix_debug_mode', 1); - } - - public static function disableDebugMode(): void { - update_option('ssbhesabix_debug_mode', 0); - } -//========================================================================================================================= - function formatPhoneNumber($phoneNumber) { - $phoneNumber = preg_replace('/\D/', '', $phoneNumber); - - if (substr($phoneNumber, 0, 2) == '98') { - $phoneNumber = substr($phoneNumber, 2); - } - - if (substr($phoneNumber, 0, 1) == '9' && strlen($phoneNumber) == 10) { - $phoneNumber = '0' . $phoneNumber; - } - - if (strlen($phoneNumber) == 10 && substr($phoneNumber, 0, 1) == '9') { - $phoneNumber = '0' . $phoneNumber; - } - - return $phoneNumber; - } -//========================================================================================================================= - public function convertPersianPhoneDigitsToEnglish($inputString) : string { - $newNumbers = range(0, 9); - $persianDecimal = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'); - $arabicDecimal = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); - $arabic = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); - $persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'); - - $string = str_replace($persianDecimal, $newNumbers, $inputString); - $string = str_replace($arabicDecimal, $newNumbers, $string); - $string = str_replace($persian, $newNumbers, $string); - - return str_replace($arabic, $newNumbers, $string); - } -//========================================================================================================================= - public function convertPersianDigitsToEnglish($inputString) : int { - $newNumbers = range(0, 9); - $persianDecimal = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'); - $arabicDecimal = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); - $arabic = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'); - $persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'); - - $string = str_replace($persianDecimal, $newNumbers, $inputString); - $string = str_replace($arabicDecimal, $newNumbers, $string); - $string = str_replace($persian, $newNumbers, $string); - - return str_replace($arabic, $newNumbers, $string); - } -//========================================================================================================================= - function generateGUID() : string { - $characters = '0123456789ABCDEF'; - $guid = ''; - - for ($i = 0; $i < 32; $i++) { - $guid .= $characters[mt_rand(0, 15)]; - if ($i == 7 || $i == 11 || $i == 15 || $i == 19) { - $guid .= '-'; - } - } - - return $guid; - } -//========================================================================================================================= - public function getGUID($id_order): string { - $option = get_option($id_order); - - if ($option === false || $option == 0) { - $GUID = $this->generateGUID(); - $expirationDateTime = new DateTime('now', new DateTimeZone('UTC')); - add_option($id_order, $expirationDateTime->format('Y-m-d H:i:s') . $GUID); - } else { - $expirationDateTime = new DateTime(substr($option, 0, 19), new DateTimeZone('UTC')); - $currentDateTime = new DateTime('now', new DateTimeZone('UTC')); - - $diff = $currentDateTime->diff($expirationDateTime); - - if ($diff->days < 1) { - // GUID is still valid, continue processing - } else { - // GUID expired, reset the option to allow saving a new invoice - $GUID = $this->generateGUID(); - $expirationDateTime = new DateTime('now', new DateTimeZone('UTC')); - update_option($id_order, $expirationDateTime->format('Y-m-d H:i:s') . $GUID); - } - } - - return substr(get_option($id_order), 20); - } -//========================================================================================================================= - public function formatTransactionFee($transactionFee, $amount) { - if($transactionFee && $transactionFee > 0) { - $func = new Ssbhesabix_Admin_Functions(); - $transactionFee = $func->convertPersianDigitsToEnglish($transactionFee); - - if($transactionFee<100 && $transactionFee>0) $transactionFee /= 100; - $transactionFee *= $amount; - if($transactionFee < 1) $transactionFee = 0; - } - return $transactionFee; - } -//========================================================================================================================= - public function convertCityCodeToName($cityCode) { - $citiesArray = [ - 1 => [ - 'title' => 'تهران', - 'cities' => [ - 1 => 'تهران', - 331 => 'اسلام شهر', - 1813 => 'ری', - 3341 => 'لواسان', - 3351 => 'شهریار', - 3371 => 'ورامین', - 3381 => 'پیشوا', - 3391 => 'پاکدشت', - 3751 => 'قدس', - 3761 => 'رباطکریم', - 3971 => 'دماوند', - 3981 => 'فیروزکوه', - 16531 => 'جاجرود (خسروآباد)', - 16551 => 'بومهن', - 16571 => 'شهرصنعتی خرمدشت', - 16581 => 'پردیس', - 18131 => 'باقر شهر', - 18141 => 'جعفرابادباقراف', - 18151 => 'مرقدامام ره', - 18161 => 'کهریزک', - 18171 => 'طورقوزاباد', - 18181 => 'قاسم ابادشوراباد', - 18191 => 'قمصر', - 18331 => 'حسن آباد', - 18341 => 'شمس اباد', - 18351 => 'ابراهیم اباد', - 18361 => 'چرمشهر', - 18371 => 'قلعه محمدعلی خان', - 18381 => 'فرودگاه امام خمینی', - 18391 => 'وهن اباد', - 18441 => 'قلعه نوخالصه', - 18451 => 'گل تپه کبیر', - 18461 => 'محمودابادپیرزاده', - 18471 => 'فرون اباد', - 18631 => 'خاورشهر', - 18641 => 'اسلام اباد', - 18651 => 'لپه زنگ', - 18661 => 'قیامدشت', - 18686 => 'قرچک', - 18791 => 'قوچ حصار', - 18986 => 'خلازیر', - 19338 => 'تجریش', - 31130 => 'نصیرشهر', - 31133 => 'شهرک صنعتی نصیرشهر', - 31136 => 'شهرک قلعه میر', - 31641 => 'صفادشت', - 31686 => 'اندیشه', - 31691 => 'ملارد', - 31694 => 'گرمدره', - 33131 => 'احمدابادمستوفی', - 33141 => 'فیروزبهرام', - 33151 => 'گلدسته', - 33171 => 'صالح آباد', - 33186 => 'شاطره', - 33191 => 'چهاردانگه', - 33361 => 'سعیدآباد', - 33451 => 'فشم', - 33461 => 'لواسان بزرگ', - 33541 => 'باغستان', - 33560 => 'صباشهر', - 33561 => 'شاهدشهر', - 33571 => 'فردوسیه', - 33581 => 'وحیدیه', - 33591 => 'لم اباد', - 33711 => 'قلعه سین', - 33741 => 'عسگرابادعباسی', - 33751 => 'دهماسین', - 33761 => 'باغخواص', - 33771 => 'ایجدان', - 33781 => 'ابباریک', - 33831 => 'جواد آباد', - 33841 => 'خاوه', - 33861 => 'جلیل اباد', - 33871 => 'کریم اباد', - 33881 => 'قلعه خواجه', - 33930 => 'شهرک عباس آباد', - 33931 => 'داوداباد', - 33941 => 'شریف آباد', - 33971 => 'پارچین', - 33981 => 'حصارامیر', - 33991 => 'خاتون اباد', - 37551 => 'نصیرآباد', - 37571 => 'گلستان', - 37581 => 'کلمه', - 37611 => 'پرند', - 37614 => 'شهر صنعتی پرند', - 37631 => 'سلطان اباد', - 37650 => 'حصارک پایین', - 37651 => 'نسیم شهر', - 37652 => 'حصارک بالا', - 37653 => 'سبزدشت', - 37656 => 'احمدآبادجانسپار', - 37661 => 'اسماعیل آباد', - 39720 => 'جابان', - 39731 => 'رودهن', - 39741 => 'آبعلی', - 39751 => 'کیلان', - 39761 => 'آبسرد', - 39771 => 'سربندان', - 39780 => 'مهرآباد', - 39781 => 'مشا', - 39791 => 'مرا', - 39811 => 'هرانده', - 39831 => 'درده', - 39841 => 'حصاربن', - 39851 => 'ارجمند', - 39861 => 'امیریه', - ], - ], - 2 => [ - 'title' => 'گيلان', - 'cities' => [ - 41 => 'رشت', - 431 => 'بندرانزلی', - 441 => 'لاهیجان', - 4331 => 'ابکنار', - 4341 => 'خمام', - 4351 => 'فومن', - 4361 => 'صومعه سرا', - 4371 => 'هشتپر', - 4381 => 'ماسال', - 4391 => 'آستارا', - 4431 => 'سیاهکل', - 4441 => 'آستانه اشرفیه', - 4451 => 'منجیل', - 4461 => 'رودبار', - 4471 => 'لنگرود', - 4481 => 'رودسر', - 4491 => 'کلاچای', - 43331 => 'کپورچال', - 43341 => 'جیرهنده', - 43351 => 'لیچارکی حسن رود', - 43361 => 'سنگر', - 43381 => 'سراوان', - 43391 => 'خشکبیجار', - 43431 => 'لشت نشاء', - 43451 => 'خواچکین', - 43461 => 'کوچصفهان', - 43471 => 'بلسبنه', - 43481 => 'چاپارخانه', - 43491 => 'جیرکویه', - 43513 => 'ماکلوان', - 43531 => 'لولمان', - 43541 => 'شفت', - 43551 => 'ملاسرا', - 43561 => 'چوبر', - 43571 => 'ماسوله', - 43581 => 'گشت', - 43591 => 'احمد سر گوراب', - 43631 => 'مرجقل', - 43641 => 'گوراب زرمیخ', - 43651 => 'طاهرگوراب', - 43661 => 'ضیابر', - 43671 => 'مرکیه', - 43681 => 'هنده خاله', - 43691 => 'نوخاله اکبری', - 43741 => 'شیله وشت', - 43751 => 'جوکندان بزرگ', - 43761 => 'لیسار', - 43771 => 'بازارخطبه سرا', - 43780 => 'چوبر', - 43781 => 'حویق', - 43791 => 'پلاسی', - 43811 => 'بازار جمعه', - 43841 => 'رضوانشهر', - 43861 => 'پره سر', - 43871 => 'پلنگ پاره', - 43891 => 'اسالم', - 43931 => 'شیخ محله', - 43941 => 'ویرمونی', - 43951 => 'سیبلی', - 43961 => 'لوندویل', - 43971 => 'مشند', - 43981 => 'کوته کومه', - 43991 => 'حیران', - 44141 => 'رودبنه', - 44331 => 'پایین محله پاشاکی', - 44341 => 'گرماور', - 44351 => 'لیش', - 44361 => 'بارکوسرا', - 44371 => 'شیرین نسا', - 44381 => 'خرارود', - 44391 => 'دیلمان', - 44431 => 'لسکوکلایه', - 44441 => 'کیسم', - 44451 => 'شیرکوه چهارده', - 44461 => 'دهشال', - 44471 => 'کیاشهر', - 44481 => 'دستک', - 44491 => 'پرگاپشت مهدی خانی', - 44531 => 'لوشان', - 44541 => 'بیورزین', - 44551 => 'جیرنده', - 44561 => 'بره سر', - 44581 => 'ویشان', - 44591 => 'کلیشم', - 44631 => 'علی اباد', - 44641 => 'رستم آباد', - 44651 => 'توتکابن', - 44661 => 'کلشتر', - 44681 => 'اسکولک', - 44691 => 'کوکنه', - 44731 => 'سلوش', - 44741 => 'چاف وچمخاله', - 44751 => 'شلمان', - 44761 => 'کومله', - 44771 => 'دیوشل', - 44781 => 'پروش پایین', - 44791 => 'اطاقور', - 44841 => 'حسن سرا', - 44851 => 'طول لات', - 44861 => 'رانکوه', - 44871 => 'چابکسر', - 44881 => 'جنگ سرا', - 44891 => 'واجارگاه', - 44931 => 'رحیم آباد', - 44941 => 'بلترک', - 44951 => 'املش', - 44971 => 'کجید', - 44981 => 'گرمابدشت', - 44991 => 'شوییل', - 44992 => 'پونل', - ], - ], - 3 => [ - 'title' => 'آذربايجان شرقي', - 'cities' => [ - 51 => 'تبریز', - 531 => 'میانه', - 541 => 'مرند', - 551 => 'مراغه', - 5331 => 'شهرجدیدسهند', - 5351 => 'اسکو', - 5361 => 'سردرود', - 5371 => 'آذر شهر', - 5381 => 'شبستر', - 5391 => 'هریس', - 5431 => 'هادیشهر', - 5441 => 'جلفا', - 5451 => 'اهر', - 5461 => 'کلیبر', - 5471 => 'سراب', - 5491 => 'بستان آباد', - 5541 => 'عجب شیر', - 5551 => 'بناب', - 5561 => 'ملکان', - 5571 => 'هشترود', - 5581 => 'قره آغاج', - 5586 => 'اغچه ریش', - 53331 => 'ترک', - 53351 => 'ترکمانچای', - 53361 => 'خاتون اباد', - 53371 => 'شیخدراباد', - 53381 => 'قره بلاغ', - 53391 => 'آقکند', - 53431 => 'اچاچی', - 53441 => 'گوندوغدی', - 53451 => 'پورسخلو', - 53461 => 'کنگاور', - 53481 => 'قویوجاق', - 53491 => 'ارموداق', - 53531 => 'کهنمو', - 53541 => 'اربط', - 53551 => 'خسرو شهر', - 53561 => 'لاهیجان', - 53571 => 'خاص اباد (خاصبان)', - 53581 => 'ایلخچی', - 53591 => 'سرای (سرای ده)', - 53631 => 'کجوار', - 53641 => 'خلجان', - 53651 => '(ینگی اسپران (سفیدان جد', - 53661 => 'باسمنج', - 53671 => '(شادبادمشایخ (پینه شلوا', - 53681 => 'کندرود', - 53691 => 'مایان سفلی', - 53731 => 'تیمورلو', - 53740 => 'خراجو', - 53741 => 'قدمگاه (بادام یار)', - 53751 => 'ممقان', - 53761 => 'گوگان', - 53771 => 'شیرامین', - 53791 => 'هفت چشمه', - 53811 => 'وایقان', - 53831 => 'امند', - 53840 => 'کوزه کنان', - 53841 => 'خامنه', - 53851 => 'سیس', - 53861 => 'صوفیان', - 53871 => 'شند آباد', - 53881 => 'تسوج', - 53891 => 'شرفخانه', - 53941 => 'مینق', - 53950 => 'کلوانق', - 53951 => 'بخشایش', - 53961 => 'سرند', - 53971 => 'زرنق', - 53981 => 'بیلوردی', - 53991 => 'خواجه', - 54331 => 'گلین قیه', - 54341 => 'هرزندجدید (چای هرزند)', - 54351 => 'بناب جدید', - 54361 => 'زنوز', - 54371 => 'دولت اباد', - 54381 => 'یکان کهریز', - 54391 => 'یامچی', - 54431 => 'شجاع', - 54441 => 'داران', - 54451 => 'سیه رود', - 54461 => 'نوجه مهر', - 54471 => 'کشکسرای', - 54481 => 'خاروانا', - 54491 => 'هوراند', - 54531 => 'چول قشلاقی', - 54541 => 'ورگهان', - 54551 => 'افیل', - 54561 => 'اذغان (ازغان)', - 54571 => 'سیه کلان', - 54581 => 'ورزقان', - 54591 => 'اق براز', - 54631 => 'مولان', - 54641 => 'خمارلو', - 54651 => 'عاشقلو', - 54661 => 'اسکلو (اسگلو)', - 54671 => 'آبش احمد', - 54681 => 'یوزبند', - 54682 => 'شهرک صنعتی کاغذکنان', - 54685 => 'کندوان', - 54686 => 'تیل', - 54691 => 'لاریجان', - 54731 => 'اسبفروشان', - 54741 => 'ابرغان', - 54750 => 'دوزدوزان', - 54751 => 'شربیان', - 54761 => 'مهربان', - 54771 => 'رازلیق', - 54781 => 'اغمیون', - 54791 => 'اردها', - 54931 => 'قره چای حاج علی', - 54941 => 'قره بابا', - 54951 => 'سعیداباد', - 54961 => 'الانق', - 54971 => 'کردکندی', - 54981 => 'تیکمه داش', - 54991 => 'قره چمن', - 55330 => 'ورجوی', - 55341 => 'گل تپه', - 55351 => 'خداجو', - 55361 => 'داش اتان', - 55371 => 'داش بلاغ بازار', - 55381 => 'صومعه', - 55391 => 'علویان', - 55431 => 'شیراز', - 55441 => 'خضرلو', - 55451 => 'ینگجه', - 55461 => 'مهماندار', - 55471 => 'خانیان', - 55481 => 'دانالو', - 55491 => 'رحمانلو', - 55531 => 'زاوشت', - 55541 => 'القو', - 55551 => 'روشت بزرگ', - 55561 => 'خوشه مهر (خواجه امیر)', - 55571 => 'زوارق', - 55581 => '(خانه برق قدیم (شورخانه ب', - 55631 => 'لکلر', - 55641 => 'بایقوت', - 55651 => 'اروق', - 55661 => 'اق منار', - 55671 => 'لیلان', - 55681 => 'طوراغای (طوراغایی)', - 55731 => 'اوشندل', - 55741 => 'علی ابادعلیا', - 55751 => 'ذوالبین', - 55761 => 'نظر کهریزی', - 55771 => 'اتش بیگ', - 55781 => 'سلوک', - 55791 => 'نصیرابادسفلی', - 55831 => 'ارسگنای سفلی', - 55841 => '(سلطان اباد (س انمکزار', - 55851 => 'قلعه حسین اباد', - 55871 => 'ذاکرکندی', - 55881 => 'قوچ احمد', - 55891 => 'اغ زیارت', - ], - ], - 4 => [ - 'title' => 'خوزستان', - 'cities' => [ - 61 => 'اهواز', - 631 => 'آبادان', - 641 => 'خرمشهر', - 6331 => 'اروندکنار', - 6341 => 'ملاثانی', - 6351 => 'بندرماهشهر', - 6361 => 'بهبهان', - 6371 => 'آغاجاری', - 6381 => 'رامهرمز', - 6391 => 'ایذه', - 6431 => 'شادگان', - 6441 => 'سوسنگرد', - 6451 => 'شوشتر', - 6461 => 'دزفول', - 6471 => 'شوش', - 6481 => 'اندیمشک', - 6491 => 'مسجدسلیمان', - 61431 => 'الهائی', - 61481 => 'شیبان', - 61491 => 'ویس', - 63331 => 'فیاضی', - 63341 => 'تنگ یک', - 63351 => 'چوئبده', - 63361 => 'نهرسلیم', - 63381 => 'نهرابطر', - 63431 => 'عین دو', - 63441 => 'حمیدیه', - 63451 => 'ام الطمیر (سیدیوسف)', - 63461 => 'کوت عبدالله', - 63471 => 'قلعه چنعان', - 63481 => 'کریت برومی', - 63491 => 'غیزانیه بزرگ', - 63531 => 'چم کلگه', - 63541 => 'چمران', - 63561 => 'بندرامام خمینی', - 63571 => 'صالح شهر', - 63581 => 'اسیاب', - 63591 => 'هندیجان', - 63640 => 'تشان', - 63641 => 'گروه پدافندهوایی بهبها', - 63651 => 'شاه غالب ده ابراهیم', - 63661 => 'کردستان بزرگ', - 63671 => 'منصوریه', - 63681 => 'سردشت', - 63731 => 'امیدیه', - 63751 => 'میانکوه', - 63771 => 'زهره', - 63831 => 'رودزرد', - 63851 => 'نفت سفید', - 63861 => 'مشراگه', - 63871 => 'رامشیر', - 63881 => 'جایزان', - 63891 => 'دره تونم نمی', - 63931 => 'میداود', - 63941 => 'صیدون', - 63951 => 'باغ ملک', - 63961 => 'قلعه تل', - 63971 => 'چنارستان', - 63981 => 'پشت پیان', - 63991 => 'دهدز', - 64330 => 'خنافره', - 64331 => 'عبودی', - 64341 => 'دارخوین', - 64351 => 'درویشی', - 64361 => 'بوزی سیف', - 64371 => 'مینوشهر', - 64381 => 'حفاری شرقی', - 64431 => 'بروایه یوسف', - 64440 => 'کوت سیدنعیم', - 64441 => 'ابوحمیظه', - 64451 => 'هویزه', - 64461 => 'یزدنو', - 64471 => 'رفیع', - 64481 => 'بستان', - 64491 => 'سیدعباس', - 64510 => 'سرداران', - 64511 => 'شرافت', - 64531 => 'گوریه', - 64541 => 'جنت مکان', - 64551 => 'گتوند', - 64560 => 'ترکالکی', - 64561 => 'سماله', - 64571 => 'شهرک نورمحمدی', - 64581 => 'گاومیش اباد', - 64591 => 'عرب حسن', - 64631 => 'صفی آباد', - 64640 => 'چغامیش', - 64641 => 'حمزه', - 64650 => 'شمس آباد', - 64651 => 'امام', - 64652 => 'سیاه منصور', - 64661 => 'میانرود', - 64681 => 'چلون', - 64691 => 'سالند', - 64730 => 'حر', - 64731 => 'شاوور', - 64741 => 'مزرعه یک', - 64751 => 'خسرجی راضی حمد', - 64761 => 'الوان', - 64771 => 'علمه تیمورابوذرغفاری', - 64781 => 'شهرک بهرام', - 64791 => 'فتح المبین', - 64830 => 'آزادی', - 64831 => 'شهرک انصار', - 64841 => 'خواجوی', - 64850 => 'بیدروبه', - 64851 => 'حسینیه', - 64861 => 'کلگه دره دو', - 64871 => 'تله زنگ پایین', - 64881 => 'چم گلک', - 64931 => 'روستای عنبر', - 64941 => 'لالی', - 64951 => 'دره بوری', - 64961 => 'هفتگل', - 64971 => 'کوشکک', - 64980 => 'آبژدان', - 64981 => 'قلعه خواجه', - 64991 => 'گلگیر', - ], - ], - 5 => [ - 'title' => 'فارس', - 'cities' => [ - 71 => 'شیراز', - 731 => 'کازرون', - 741 => 'جهرم', - 7331 => 'قائمیه', - 7341 => 'زرقان', - 7351 => 'نور آباد', - 7361 => 'اردکان', - 7371 => 'مرودشت', - 7381 => 'اقلید', - 7391 => 'آباده', - 7431 => 'لار', - 7441 => 'گراش', - 7451 => 'استهبان', - 7461 => 'فسا', - 7471 => 'فیروز آباد', - 7481 => 'داراب', - 7491 => 'نی ریز', - 71431 => 'بندامیر', - 71451 => 'خیرابادتوللی', - 71461 => 'داریان', - 71491 => 'کم جان', - 71551 => 'شوریجه', - 71561 => 'مهارلو', - 71571 => 'کوهنجان', - 71581 => 'سلطان آباد', - 71591 => 'تفیهان', - 71641 => 'طسوج', - 71651 => 'اکبراباد', - 71661 => 'مظفری', - 71671 => 'کوشک بیدک', - 71681 => 'فتح اباد', - 71691 => 'ده شیب', - 71741 => 'خانه زنیان', - 71781 => 'پاسگاه چنارراهدار', - 71881 => 'موردراز', - 71991 => 'شهرجدیدصدرا', - 73131 => 'کلاتون', - 73141 => 'کلانی', - 73151 => 'کمارج مرکزی', - 73161 => 'مهبودی علیا', - 73171 => 'وراوی', - 73311 => 'حکیم باشی نصف میان (بالا)', - 73331 => 'کنار تخته', - 73341 => 'خشت', - 73351 => 'انارستان', - 73361 => 'نودان', - 73371 => 'مهرنجان', - 73381 => 'جره', - 73391 => 'بالاده', - 73411 => 'لپوئی', - 73431 => 'کامفیروز', - 73441 => 'خرامه', - 73451 => 'سروستان', - 73461 => 'کوار', - 73471 => 'رامجرد', - 73491 => 'گویم', - 73511 => 'خومه زار', - 73531 => 'بابامنیر', - 73541 => 'اهنگری', - 73551 => 'پرین', - 73560 => 'کوپن', - 73561 => 'حسین ابادرستم', - 73571 => 'مصیری', - 73591 => 'میشان سفلی', - 73611 => 'بهرغان', - 73631 => 'بیضا', - 73641 => 'هماشهر', - 73651 => 'کمهر', - 73661 => 'راشک علیا', - 73671 => 'هرایجان', - 73681 => 'بانش', - 73711 => 'کوشک', - 73731 => 'خانیمن', - 73741 => 'سعادت شهر', - 73751 => 'قادرآباد', - 73761 => 'ارسنجان', - 73771 => 'سیدان', - 73791 => 'کوشکک', - 73810 => 'مزایجان', - 73811 => 'خنجشت', - 73831 => 'امامزاده اسماعیل', - 73840 => 'مادرسلیمان', - 73841 => 'حسن آباد', - 73851 => 'اسپاس', - 73861 => 'سده', - 73881 => 'دژکرد', - 73891 => 'شهرمیان', - 73911 => 'بهمن', - 73931 => 'صغاد', - 73940 => 'حسامی', - 73941 => 'بوانات', - 73942 => 'کره ای', - 73951 => 'صفاشهر', - 73981 => 'سورمق', - 73991 => 'ایزدخواست', - 74110 => 'دوزه', - 74161 => 'بندبست', - 74171 => 'باب انار', - 74311 => 'فیشور', - 74331 => 'اوز', - 74341 => 'لامرد', - 74351 => 'جویم', - 74361 => 'بنارویه', - 74370 => 'خور', - 74371 => 'لطیفی', - 74380 => 'عمادده', - 74381 => 'بیرم', - 74390 => 'اهل', - 74391 => 'اشکنان', - 74410 => 'اسیر', - 74411 => 'کهنه', - 74414 => 'خوزی', - 74431 => 'خنج', - 74441 => 'علامرودشت', - 74450 => 'گله دار', - 74451 => 'مهر', - 74461 => 'رونیز', - 74471 => 'بنوان', - 74481 => 'ایج', - 74491 => 'درب قلعه', - 74541 => 'خاوران', - 74551 => 'قطب آباد', - 74561 => 'دنیان', - 74571 => 'سروو', - 74581 => 'مانیان', - 74591 => 'به جان', - 74611 => 'کوشک قاضی', - 74641 => 'نوبندگان', - 74650 => 'قره بلاغ', - 74651 => 'ششده', - 74661 => 'قاسم ابادسفلی', - 74671 => 'زاهدشهر', - 74681 => 'میانده', - 74691 => 'صحرارود', - 74711 => 'بایگان', - 74714 => 'امام شهر', - 74731 => 'مبارک آباد', - 74741 => 'میمند', - 74751 => 'افزر', - 74760 => 'قیر', - 74761 => 'کارزین', - 74771 => 'فراشبند', - 74780 => 'نوجین', - 74781 => 'دهرم', - 74791 => 'جوکان', - 74811 => 'مادوان', - 74814 => 'دبیران', - 74831 => 'ماه سالاری', - 74841 => 'رستاق', - 74850 => 'شهرپیر', - 74861 => 'حاجی آباد', - 74871 => 'فدامی', - 74880 => 'دوبرجی', - 74881 => 'چمن مروارید', - 74891 => 'جنت شهر', - 74911 => 'لای حنا', - 74931 => 'آباده طشک', - 74941 => 'قطاربنه', - 74971 => 'مشکان', - 74981 => 'قطرویه', - 74991 => 'هرگان', - ], - ], - 6 => [ - 'title' => 'اصفهان', - 'cities' => [ - 81 => 'اصفهان', - 831 => 'شاهین شهر', - 841 => 'خمینی شهر', - 851 => 'نجف آباد', - 861 => 'شهرضا', - 871 => 'کاشان', - 8161 => 'منطقه صنعتی محموداباد', - 8331 => 'مورچه خورت', - 8341 => 'دولت آباد', - 8351 => 'میمه', - 8361 => 'خور', - 8371 => 'کوهپایه', - 8381 => 'اردستان', - 8391 => 'نائین', - 8431 => 'درچه پیاز', - 8441 => 'زواره', - 8451 => 'فلاورجان', - 8461 => 'قهدریجان', - 8471 => 'زرین شهر', - 8481 => 'مبارکه', - 8491 => 'فولادشهر', - 8531 => 'تیران', - 8541 => 'دهق', - 8551 => 'علویجه', - 8561 => 'داران', - 8571 => 'چادگان', - 8591 => 'فریدونشهر', - 8641 => 'دهاقان', - 8651 => 'اسفرجان', - 8661 => 'سمیرم', - 8671 => 'حنا', - 8681 => 'مهرگرد', - 8731 => 'جوشقان استرک', - 8741 => 'آران و بیدگل', - 8751 => 'قمصر', - 8761 => 'نطنز', - 8771 => 'گلپایگان', - 8781 => 'گوگد', - 8791 => 'خوانسار', - 81351 => 'تودشک', - 81391 => 'سگزی', - 81431 => 'بهارستان', - 81561 => 'خوراسگان', - 81594 => 'گورت', - 81671 => 'دستجا', - 81681 => 'زیار', - 81751 => 'نصرآباد', - 81789 => 'ابریشم', - 81799 => 'اصفهان (سپاهان شهر)', - 83341 => 'پادگان اموزشی امام ص', - 83351 => 'پالایشگاه اصفهان', - 83361 => 'کلهرود', - 83371 => 'گرگاب', - 83431 => 'دستگرد', - 83441 => 'گز برخوار', - 83451 => 'خورزوق', - 83461 => 'حبیب آباد', - 83531 => 'موته', - 83541 => 'وزوان', - 83551 => 'لای بید', - 83561 => 'رباطاقاکمال', - 83581 => 'خسرواباد', - 83591 => 'کمشچه', - 83631 => 'جندق', - 83641 => 'فرخی', - 83651 => 'مزیک', - 83661 => 'مهرجان', - 83671 => 'بیاضه', - 83681 => 'چوپانان', - 83691 => 'بلان', - 83731 => 'محمدآباد', - 83741 => 'هرند', - 83751 => 'ورزنه', - 83761 => 'قهجاورستان', - 83771 => 'نیک آباد', - 83781 => 'اژیه', - 83791 => 'حسن اباد', - 83831 => 'کچومثقال', - 83841 => 'ظفرقند', - 83851 => 'نهوج', - 83861 => 'نیسیان', - 83871 => 'ومکان', - 83881 => 'همسار', - 83891 => 'فسخود', - 83931 => 'فوداز', - 83941 => 'اشکستان', - 83951 => 'کجان', - 83961 => 'نیستانک', - 83971 => 'انارک', - 83991 => 'بافران', - 84331 => 'تیرانچی', - 84341 => 'کوشک', - 84371 => 'قلعه امیریه', - 84431 => 'مهاباد', - 84441 => 'درقه', - 84451 => 'شهراب', - 84461 => 'تورزن', - 84471 => 'کریم اباد', - 84481 => 'تلک اباد', - 84491 => 'موغار', - 84531 => 'خوانسارک', - 84541 => 'پیربکران', - 84561 => 'کلیشادوسودرجان', - 84581 => 'کرسگان', - 84591 => 'بهاران شهر', - 84631 => 'سهروفیروزان', - 84651 => 'ایمانشهر', - 84671 => 'زازران', - 84681 => 'شرودان', - 84691 => 'جوجیل', - 84731 => 'ورنامخواست', - 84741 => 'سده لنجان', - 84751 => 'چرمهین', - 84761 => 'باغ بهادران', - 84771 => 'نوگوران', - 84781 => 'چمگردان', - 84791 => 'کرچگان', - 84831 => 'دیزیچه', - 84841 => 'زیباشهر', - 84851 => 'باغ ملک', - 84861 => 'دهسرخ', - 84871 => 'پلی اکریل', - 84881 => 'فولادمبارکه', - 84891 => 'کرکوند', - 84931 => 'زاینده رود', - 84951 => 'چم نور', - 84961 => 'کچوییه', - 84971 => 'اشیان', - 84981 => 'طالخونچه', - 84991 => 'تاسیسات سدنکواباد', - 85331 => 'رضوانشهر', - 85341 => 'ورپشت', - 85351 => 'عسگران', - 85371 => 'عزیزاباد', - 85381 => 'میراباد', - 85391 => 'حاجی اباد', - 85441 => 'خیراباد', - 85451 => 'اشن', - 85471 => 'خونداب', - 85531 => 'حسین اباد', - 85631 => 'غرغن', - 85641 => 'دامنه', - 85651 => 'بوئین و میاندشت', - 85661 => 'زرنه', - 85671 => 'بلطاق', - 85681 => 'کرچ', - 85691 => 'قره بلطاق', - 85711 => 'افوس', - 85731 => 'سازمان عمران زاینده رود', - 85741 => 'مشهدکاوه', - 85751 => 'اسکندری', - 85761 => 'رزوه', - 85771 => 'نهرخلج', - 85781 => 'چاه غلامرضارحیمی', - 85791 => 'اورگان', - 85831 => 'گلدشت', - 85851 => 'جوزدان', - 85861 => 'کهریزسنگ', - 85931 => 'نهضت اباد', - 85941 => 'قلعه سرخ', - 85961 => 'اسلام ابادموگویی', - 85971 => 'مصیر', - 85991 => 'برف انبار', - 86331 => 'قمشلو', - 86341 => 'پوده', - 86351 => 'مهیار', - 86361 => 'پرزان', - 86371 => 'منوچهراباد', - 86391 => 'شهرک صنایع شیمیایی ر', - 86431 => 'همگین', - 86451 => 'گلشن', - 86461 => 'کهرویه', - 86471 => 'قصرچم', - 86531 => 'امین اباد', - 86541 => 'مقصودبیک', - 86551 => 'سولار', - 86561 => 'منظریه', - 86631 => 'گرموک', - 86651 => 'هست', - 86671 => 'ونک', - 86751 => 'کهنگان', - 86771 => 'کمه', - 86781 => 'مورک', - 86791 => 'چهارراه', - 86831 => 'ده نسا سفلی', - 86841 => 'اغداش', - 86851 => 'چشمه رحمان', - 86861 => 'ورق', - 86881 => 'سعادت اباد', - 86891 => 'فتح اباد', - 87181 => 'نیاسر', - 87331 => 'سن سن', - 87351 => 'ده زیره', - 87361 => 'رحق', - 87371 => 'اب شیرین', - 87381 => 'نشلج', - 87391 => 'مشکات', - 87431 => 'سفیدشهر', - 87441 => 'مزرعه صدر', - 87461 => 'نوش آباد', - 87481 => 'ابوزیدآباد', - 87491 => 'کاغذی', - 87541 => 'قهرود', - 87551 => 'جوشقان و کامو', - 87561 => 'برزک', - 87571 => 'اسحق اباد', - 87581 => 'وادقان', - 87591 => 'اذان', - 87631 => 'طرق رود', - 87641 => 'اریسمان', - 87651 => 'ابیانه', - 87661 => 'بادرود', - 87671 => 'خالدآ باد', - 87681 => 'اوره', - 87731 => 'ملازجان', - 87741 => 'سعیداباد', - 87751 => 'مرغ', - 87771 => 'قرغن', - 87781 => 'کوچری', - 87831 => 'کلوچان', - 87841 => 'گلشهر', - 87861 => 'زرنجان', - 87871 => 'وانشان', - 87881 => 'تیکن', - 87931 => 'سنگ سفید', - 87941 => 'رحمت اباد', - 87951 => 'خم پیچ', - 87961 => 'مهراباد', - 87971 => 'تیدجان', - 87981 => 'خشکرود', - 87991 => 'ویست', - ], - ], - 7 => [ - 'title' => 'خراسان رضوي', - 'cities' => [ - 91 => 'مشهد', - 931 => 'نیشابور', - 951 => 'تربت حیدریه', - 961 => 'سبزوار', - 9331 => 'فیروزه', - 9341 => 'درود', - 9351 => 'طرقبه', - 9361 => 'چناران', - 9371 => 'کلات', - 9381 => 'سرخس', - 9391 => 'فریمان', - 9471 => 'قوچان', - 9491 => 'درگز', - 9531 => 'فیض آباد', - 9541 => 'رشتخوار', - 9551 => 'کدکن', - 9561 => 'خواف', - 9571 => 'تربت جام', - 9581 => 'صالح آباد', - 9591 => 'تایباد', - 9631 => 'داورزن', - 9641 => 'جغتای', - 9651 => 'ششتمد', - 9671 => 'کاشمر', - 9681 => 'بردسکن', - 9691 => 'گناباد', - 91671 => 'رضویه', - 93161 => 'همت آباد', - 93331 => 'شوراب', - 93341 => 'گلبوی پایین', - 93351 => 'مبارکه', - 93361 => 'چکنه', - 93371 => 'برزنون', - 93381 => 'فدیشه', - 93391 => 'بار', - 93431 => 'میراباد', - 93441 => 'فرخک', - 93451 => 'خرو', - 93461 => 'قدمگاه', - 93471 => 'اسحق اباد', - 93481 => 'خوجان', - 93491 => 'عشق آباد', - 93541 => 'ملک آباد', - 93551 => 'کورده', - 93561 => 'شاندیز', - 93571 => 'طوس سفلی', - 93581 => 'قرقی سفلی (شهیدکاوه)', - 93591 => 'کنه بیست', - 93631 => 'رادکان', - 93641 => 'سیداباد', - 93651 => 'گلبهار', - 93661 => 'سلوگرد', - 93671 => 'ارداک', - 93681 => 'بقمج', - 93691 => 'گلمکان', - 93741 => 'میامی', - 93751 => 'چاهک', - 93761 => 'شهرزو', - 93771 => 'گوش', - 93781 => 'نریمانی سفلی', - 93791 => 'تقی اباد', - 93831 => 'کچولی', - 93841 => 'شیرتپه', - 93851 => 'پس کمر', - 93861 => 'مزدآوند', - 93871 => 'بزنگان', - 93881 => 'گنبدلی', - 93891 => 'کندک لی', - 93931 => 'کته شمشیرسفلی', - ], - ], - 8 => [ - 'title' => 'قزوين', - 'cities' => [ - 341 => 'قزوین', - 3431 => 'الوند', - 3441 => 'آبیک', - 3451 => 'بوئین زهرا', - 3461 => 'آوج', - 3481 => 'تاکستان', - 3491 => 'محمدیه', - 34131 => 'محمودآبادنمونه', - 34151 => 'بیدستان', - 34161 => 'شریفیه', - 34171 => 'اقبالیه', - 34313 => 'نصرت آباد', - 34331 => 'الولک', - 34341 => 'کاکوهستان', - 34351 => 'فلار', - 34381 => 'مینودشت', - 34391 => 'زوارک', - 34431 => 'صمغ اباد', - 34441 => 'ناصراباد', - 34461 => 'رشتقون', - 34471 => 'قشلاق', - 34481 => 'خاکعلی', - 34491 => 'شهرک صنعتی لیا (قدیم)', - 34531 => 'سگز آباد', - 34541 => 'عصمت اباد', - 34551 => 'خرم اباد', - 34561 => 'اسفرورین', - 34571 => 'شال', - 34581 => 'دانسفهان', - 34631 => 'کلنجین', - 34641 => 'آبگرم', - 34651 => 'استبلخ', - 34671 => 'ارداق', - 34681 => 'نیارج', - 34691 => 'حصارولیعصر', - 34731 => 'ماهین', - 34741 => 'سیردان', - 34761 => 'سیاهپوش', - 34781 => 'نیارک', - 34791 => 'اقابابا', - 34811 => 'نرجه', - 34831 => 'خرمدشت', - 34851 => 'ضیاءآباد', - 34871 => 'حسین اباد', - 34891 => 'رحیم اباد', - 34913 => 'مهرگان', - 34931 => 'معلم کلایه', - 34941 => 'یحیی اباد', - 34951 => 'نیکویه', - 34961 => 'رازمیان', - 34971 => 'کوهین', - ], - ], - 9 => [ - 'title' => 'سمنان', - 'cities' => [ - 351 => 'سمنان', - 361 => 'شاهرود', - 3531 => 'علا', - 3541 => 'ابخوری', - 3551 => 'سرخه', - 3561 => 'مهدیشهر', - 3571 => 'شهمیرزاد', - 3581 => 'گرمسار', - 3591 => 'ایوانکی', - 3631 => 'میامی', - 3641 => 'بسطام', - 3651 => 'مجن', - 3661 => 'بیارجمند', - 3671 => 'دامغان', - 3681 => 'امیریه', - 35331 => 'خیراباد', - 35341 => 'ایستگاه میان دره', - 35381 => 'اهوان', - 35431 => 'جام', - 35441 => 'دوزهیر', - 35451 => 'معدن نمک', - 35531 => 'نظامی', - 35541 => 'اسداباد', - 35551 => 'لاسجرد', - 35561 => 'سیداباد', - 35571 => 'عبدالله ابادپایین', - 35581 => 'بیابانک', - 35591 => 'مومن اباد', - 35631 => 'درجزین', - 35641 => 'دربند', - 35651 => 'گل رودبار', - 35661 => 'ابگرم', - 35671 => 'افتر', - 35731 => 'فولادمحله', - 35741 => 'ده صوفیان', - 35751 => 'هیکو', - 35761 => 'چاشم', - 35831 => 'کردوان', - 35841 => 'مندولک', - 35851 => 'داوراباد', - 35861 => 'آرادان', - 35881 => 'بن کوه', - 35891 => 'کهن آباد', - 35931 => 'حسین ابادکوروس', - 35941 => 'کرک', - 35951 => 'گلستانک', - 35961 => 'لجران', - 36331 => 'جودانه', - 36341 => 'ابراهیم اباد', - 36351 => 'بکران', - 36361 => 'کرداباد', - 36371 => 'نردین', - 36381 => 'سوداغلان', - 36391 => 'فرومد', - 36431 => 'ابرسیج', - 36441 => 'میغان', - 36451 => 'قلعه نوخرقان', - 36461 => 'چهلدخترپادگان', - 36471 => 'کلاته خیج', - 36531 => 'نگارمن', - 36541 => 'دهملا', - 36551 => 'رویان', - 36561 => 'بدشت', - 36571 => 'سطوه', - 36581 => 'طرود', - 36591 => 'مغان', - 36631 => 'گیور', - 36641 => 'دستجرد', - 36651 => 'مسیح اباد', - 36661 => 'احمداباد', - 36671 => 'زمان اباد', - 36681 => 'سلمرود', - 36731 => 'جزن', - 36741 => 'برم', - 36751 => 'محمداباد', - 36761 => 'معصوم اباد', - 36771 => 'فرات', - 36781 => 'علیان', - 36791 => 'عمروان', - 36831 => 'قوشه', - 36841 => 'دروار', - 36851 => 'استانه', - 36861 => 'دیباج', - 36871 => 'طرزه', - 36881 => 'مهماندوست', - 36891 => 'کلاته ملا', - 36931 => 'قدرت اباد', - ], - ], - 10 => [ - 'title' => 'قم', - 'cities' => [ - 371 => 'قم', - 3731 => 'قنوات', - 3741 => 'دستجرد', - 37331 => 'امیرابادگنجی', - 37341 => 'قمرود', - 37351 => 'کهک', - 37361 => 'قلعه چم', - 37431 => 'قاهان', - 37441 => 'جعفریه', - 37451 => 'جنداب', - 37461 => 'سلفچگان', - ], - ], - 11 => [ - 'title' => 'مركزي', - 'cities' => [ - 381 => 'اراک', - 391 => 'ساوه', - 3771 => 'پرندک', - 3781 => 'محلات', - 3791 => 'دلیجان', - 3831 => 'کرهرود', - 3841 => 'خنداب', - 3851 => 'کمیجان', - 3861 => 'شازند', - 3871 => 'آستانه', - 3881 => 'خمین', - 3891 => 'رباطمراد', - 3931 => 'غرق آباد', - 3941 => 'مامونیه', - 3951 => 'تفرش', - 3961 => 'آشتیان', - 3991 => 'شهرجدیدمهاجران', - 37731 => 'سلطان اباد', - 37741 => 'اصفهانک', - 37751 => 'حسین اباد', - 37761 => 'خشکرود', - 37771 => 'حکیم اباد', - 37781 => 'یحیی اباد', - 37791 => 'صدراباد', - 37841 => 'نیمور', - 37851 => 'نخجیروان', - 37861 => 'باقراباد', - 37871 => 'بزیجان', - 37881 => 'عیسی اباد', - 37891 => 'خورهه', - 37961 => 'نراق', - 38341 => 'ساروق', - 38351 => 'داودآباد', - 38361 => 'کارچان', - 38451 => 'جاورسیان', - 38461 => 'ادشته', - 38471 => 'استوه', - 38481 => 'سنجان', - 38491 => 'اناج', - 38531 => 'وفس', - 38541 => 'خسروبیگ', - 38551 => 'میلاجرد', - 38561 => 'سمقاور', - 38571 => 'هزاوه', - 38631 => 'قدمگاه', - 38641 => 'هفته', - 38651 => 'لنجرود', - 38661 => 'توره', - 38671 => 'کزاز', - 38681 => 'کتیران بالا', - 38691 => 'نهرمیان', - 38731 => 'سرسختی بالا', - 38741 => 'لوزدرعلیا', - 38761 => 'هندودر', - 38771 => 'تواندشت علیا', - 38781 => 'مالمیر', - 38791 => 'چهارچریک', - 38841 => 'چهارچشمه', - 38851 => 'لکان', - 38861 => 'قورچی باشی', - 38871 => 'ورچه', - 38881 => 'فرفهان', - 38891 => 'امامزاده ورچه', - 38931 => 'رباطکفسان', - 38941 => 'ریحان علیا', - 38951 => 'جزنق', - 38961 => 'خوراوند', - 38971 => 'میشیجان علیا', - 38981 => 'گلدشت', - 38991 => 'دهنو', - 39331 => 'نوبران', - 39351 => 'یل اباد', - 39361 => 'رازقان', - 39371 => 'الویر', - 39381 => 'دوزج', - 39391 => 'علیشار', - 39431 => 'بالقلو', - 39441 => 'زاویه', - 39451 => 'چمران', - 39461 => 'قاقان', - 39471 => 'سامان', - 39481 => 'دخان', - 39491 => 'مراغه', - 39531 => 'فرمهین', - 39541 => 'شهراب', - 39551 => 'زاغر', - 39561 => 'کهک', - 39571 => 'فشک', - 39581 => 'اهنگران', - 39631 => 'مزرعه نو', - 39641 => 'صالح اباد', - 39651 => 'سیاوشان', - 39661 => 'اهو', - ], - ], - 12 => [ - 'title' => 'زنجان', - 'cities' => [ - 451 => 'زنجان', - 4531 => 'زرین آباد', - 4541 => 'ماهنشان', - 4551 => 'سلطانیه', - 4561 => 'ابهر', - 4571 => 'خرمدره', - 4581 => 'قیدار', - 4591 => 'آب بر', - 45331 => 'همایون', - 45341 => 'بوغداکندی', - 45351 => 'اژدهاتو', - 45371 => 'اسفجین', - 45381 => 'ارمغانخانه', - 45391 => 'قبله بلاغی', - 45431 => 'پری', - 45441 => 'اندابادعلیا', - 45451 => 'قره گل', - 45461 => 'نیک پی', - 45471 => 'دندی', - 45481 => 'سونتو', - 45491 => 'قلتوق', - 45531 => 'گوزلدره', - 45551 => 'سنبل اباد', - 45641 => 'درسجین', - 45651 => 'دولت اباد', - 45661 => 'کینه ورس', - 45731 => 'هیدج', - 45741 => 'صائین قلعه', - 45781 => 'اقبلاغ سفلی', - 45791 => 'سهرورد', - 45831 => 'کرسف', - 45841 => 'سجاس', - 45851 => 'محموداباد', - 45861 => 'باش قشلاق', - 45871 => 'گرماب', - 45881 => 'زرین رود', - 45891 => 'کهلا', - 45931 => 'گیلوان', - 45941 => 'دستجرده', - 45951 => 'سعیداباد', - 45961 => 'چورزق', - 45971 => 'حلب', - 45981 => 'درام', - ], - ], - 13 => [ - 'title' => 'مازندران', - 'cities' => [ - 461 => 'آمل', - 471 => 'بابل', - 481 => 'ساری', - 4631 => 'محمودآباد', - 4641 => 'نور', - 4651 => 'نوشهر', - 4661 => 'چالوس', - 4671 => 'سلمانشهر', - 4681 => 'تنکابن', - 4691 => 'رامسر', - 4731 => 'امیرکلا', - 4741 => 'بابلسر', - 4751 => 'فریدونکنار', - 4761 => 'قائم شهر', - 4771 => 'جویبار', - 4781 => 'زیر آب', - 4791 => 'پل سفید', - 4831 => 'کیاسر', - 4841 => 'نکا', - 4851 => 'بهشهر', - 4861 => 'گلوگاه', - 46181 => 'دابودشت', - 46331 => 'معلم کلا', - 46341 => 'سرخرود', - 46351 => 'وسطی کلا', - 46361 => 'رینه', - 46371 => 'سوا', - 46381 => 'باییجان', - 46391 => 'گزنک', - 46411 => 'ایزدشهر', - 46431 => 'چمستان', - 46441 => 'بنفشه ده', - 46451 => 'رییس کلا', - 46461 => 'اوز', - 46471 => 'بلده', - 46481 => 'تاکر', - 46491 => 'گلندرود', - 46531 => 'چلندر', - 46541 => 'صلاح الدین کلا', - 46551 => 'نارنج بن', - 46561 => 'رویان', - 46571 => 'کجور', - 46581 => 'پول', - 46591 => 'لشکنار', - 46631 => 'هیچرود', - 46641 => 'مرزن آباد', - 46651 => 'کردیچال', - 46661 => 'کلاردشت', - 46671 => 'کلنو', - 46681 => 'دلیر', - 46691 => 'سیاه بیشه', - 46731 => 'کلارآباد', - 46741 => 'عباس آباد', - 46751 => 'سرلنگا', - 46761 => 'کترا', - 46771 => 'گلعلی اباد', - 46781 => 'میان کوه سادات', - 46791 => 'مران سه هزار', - 46831 => 'نشتارود', - 46841 => 'قلعه گردن', - 46851 => 'خرم آباد', - 46861 => 'شیرود', - 46871 => 'سلیمان اباد', - 46881 => 'کشکو', - 46891 => 'لاک تراشان', - 46931 => 'سادات محله', - 46941 => 'کتالم وسادات شهر', - 46961 => 'اغوزکتی', - 46971 => 'جواهرده', - 46981 => 'جنت رودبار', - 46991 => 'تمل', - 47331 => 'خوشرودپی', - 47341 => 'اهنگرکلا', - 47351 => 'گاوانکلا', - 47381 => 'شورکش', - 47391 => 'اینج دان', - 47431 => 'عرب خیل', - 47441 => 'بهنمیر', - 47451 => 'کاسگرمحله', - 47461 => 'کله بست', - 47471 => 'بیشه سر', - 47491 => 'گتاب', - 47541 => 'درازکش', - 47551 => 'گردرودبار', - 47561 => 'مرزی کلا', - 47571 => 'شهیداباد', - 47581 => 'زرگرمحله', - 47631 => 'بالاجنیدلاک پل', - 47641 => 'خطیرکلا', - 47651 => 'حاجی کلاصنم', - 47661 => 'واسکس', - 47681 => 'ریکنده', - 47691 => 'ارطه', - 47731 => 'کیاکلا', - 47741 => 'بالادسته رکن کنار', - 47751 => 'بیزکی', - 47761 => 'کوهی خیل', - 47781 => 'سنگتاب', - 47791 => 'رکابدارکلا', - 47831 => 'شیرکلا', - 47841 => 'آلاشت', - 47851 => 'لفور (لفورک)', - 47861 => 'اتو', - 47871 => 'شیرگاه', - 47881 => 'پالند', - 47891 => 'چرات', - 47931 => 'ده میان', - 47941 => 'خشک دره', - 47951 => 'امافت', - 47961 => 'بالادواب', - 47971 => 'ورسک', - 47981 => 'کتی لته', - 48331 => 'اروست', - 48341 => 'فریم', - 48351 => 'سنگده', - 48361 => 'قادیکلا', - 48371 => 'تاکام', - 48390 => 'پایین هولار', - 48391 => 'بالاهولار', - 48431 => 'اسبوکلا', - 48441 => 'سورک', - 48451 => 'اسلام اباد', - 48461 => 'شهرک صنعتی گهرباران', - 48471 => 'فرح اباد (خزراباد)', - 48481 => 'دارابکلا', - 48491 => 'ماچک پشت', - 48531 => 'خورشید (امامیه)', - 48541 => 'زاغمرز', - 48551 => 'چلمردی', - 48561 => 'رستم کلا', - 48571 => 'پایین زرندین', - 48591 => 'بادابسر', - 48631 => 'تیرتاش', - 48641 => 'خلیل شهر', - 48661 => 'دامداری حسن ابوطالبی', - 48671 => 'بیشه بنه', - 48681 => 'سفیدچاه', - 48691 => 'دامداری حاج عزیزمجریان', - 48841 => 'میان دره', - 48872 => 'بندپی', - ], - ], - 14 => [ - 'title' => 'گلستان', - 'cities' => [ - 491 => 'گرگان', - 4871 => 'بندر گز', - 4881 => 'کردکوی', - 4891 => 'بندرترکمن', - 4931 => 'آق قلا', - 4941 => 'علی آباد', - 4951 => 'رامیان', - 4961 => 'آزاد شهر', - 4971 => 'گنبد کاووس', - 4981 => 'مینو دشت', - 4991 => 'کلاله', - 48731 => 'نوکنده', - 48733 => 'مراوه تپه', - 48961 => 'گمیش تپه', - 48971 => 'سیمین شهر', - 49351 => 'جلین', - 49361 => 'سرخنکلاته', - 49371 => 'تقی اباد', - 49391 => 'انبار آلوم', - 49431 => 'فاضل آباد', - 49471 => 'حاجیکلاته', - 49531 => 'خان ببین', - 49541 => 'دلند', - 49631 => 'نگین شهر', - 49641 => 'نوده خاندوز', - 49680 => 'تاتارعلیا', - 49751 => 'اینچه برون', - 49791 => 'کرند', - 49831 => 'گالیکش', - 49981 => 'عزیزاباد', - ], - ], - 15 => [ - 'title' => 'اردبيل', - 'cities' => [ - 561 => 'اردبیل', - 5631 => 'نمین', - 5641 => 'نیر', - 5651 => 'گرمی', - 5661 => 'مشگین شهر', - 5671 => 'بیله سوار', - 5681 => 'خلخال', - 5691 => 'پارس آباد', - 56331 => 'آبی بیگلو', - 56341 => 'ننه کران', - 56351 => 'عنبران', - 56361 => 'گرده', - 56371 => 'ثمرین', - 56381 => 'اردیموسی', - 56391 => 'سرعین', - 56431 => 'کورائیم', - 56441 => 'اسلام آباد', - 56451 => 'مهماندوست علیا', - 56461 => 'هیر', - 56471 => 'بقراباد', - 56481 => 'بودالالو', - 56491 => 'اراللوی بزرگ', - 56531 => 'دیزج', - 56541 => 'حمزه خانلو', - 56551 => 'زهرا', - 56561 => 'انی علیا', - 56571 => 'قاسم کندی', - 56581 => 'تازه کندانگوت', - 56591 => 'قره اغاج پایین', - 56631 => 'پریخان', - 56641 => 'قصابه', - 56651 => 'فخرآباد', - 56653 => 'لاهرود', - 56661 => 'رضی', - 56671 => 'قوشه سفلی', - 56681 => 'مرادلو', - 56691 => 'گنجوبه', - 56731 => 'گوگ تپه', - 56741 => 'انجیرلو', - 56751 => 'جعفر آباد', - 56761 => 'قشلاق اغداش کلام', - 56771 => 'خورخورسفلی', - 56781 => 'شورگل', - 56791 => 'نظرعلی بلاغی', - 56831 => 'لنبر', - 56841 => 'فیروزاباد', - 56851 => 'گیوی', - 56861 => 'خلفلو', - 56871 => 'هشتجین', - 56881 => 'برندق', - 56891 => 'کلور', - 56931 => 'تازه کندجدید', - 56941 => 'گوشلو', - 56961 => 'اق قباق علیا', - 56971 => 'شهرک غفاری', - 56981 => 'اصلاندوز', - 56991 => 'بران علیا', - ], - ], - 16 => [ - 'title' => 'آذربايجان غربي', - 'cities' => [ - 571 => 'ارومیه', - 573 => 'سیلوه', - 581 => 'خوی', - 591 => 'مهاباد', - 5751 => 'قوشچی', - 5761 => 'نقده', - 5771 => 'اشنویه', - 5781 => 'پیرانشهر', - 5791 => 'جلدیان', - 5831 => 'ایواوغلی', - 5837 => 'دیزج دیز', - 5841 => 'فیرورق', - 5861 => 'ماکو', - 5881 => 'سلماس', - 5891 => 'تازه شهر', - 5931 => 'گوگ تپه', - 5951 => 'بوکان', - 5961 => 'سردشت', - 5971 => 'میاندوآب', - 5981 => 'شاهیندژ', - 5991 => 'تکاب', - 57331 => 'باراندوز', - 57341 => 'دیزج دول', - 57351 => 'میاوق', - 57361 => 'ایبلو', - 57371 => 'دستجرد', - 57381 => 'نوشین', - 57391 => 'طلاتپه', - 57411 => 'سیلوانه', - 57431 => 'راژان', - 57441 => 'هاشم اباد', - 57451 => 'دیزج', - 57461 => 'زیوه', - 57471 => 'تویی', - 57481 => 'موانا', - 57531 => 'قره باغ', - 57541 => 'بهله', - 57551 => 'امام کندی', - 57561 => 'نازلو', - 57571 => 'سرو', - 57581 => 'کانسپی', - 57591 => 'ممکان', - 57641 => 'حسنلو', - 57651 => 'کهریزعجم', - 57661 => 'محمدیار', - 57671 => 'شیخ احمد', - 57681 => 'بیگم قلعه', - 57691 => 'راهدانه', - 57731 => 'شاهوانه', - 57741 => 'نالوس', - 57751 => 'ده شمس بزرگ', - 57761 => 'گلاز', - 57771 => 'لولکان', - 57781 => 'سیاوان', - 57831 => 'کله کین', - 57841 => 'شین اباد', - 57851 => 'چیانه', - 57861 => 'بیکوس', - 57871 => 'هنگ اباد', - 57941 => 'گردکشانه', - 57951 => 'پسوه', - 57961 => 'ریگ اباد', - 57971 => 'احمدغریب', - 58331 => 'سیه باز', - 58341 => 'بیله وار', - 58361 => 'ولدیان', - 58381 => 'قوروق', - 58391 => 'هندوان', - 58431 => 'بدلان', - 58441 => 'بلسورسفلی', - 58450 => 'زرآباد', - 58471 => 'استران', - 58481 => 'قطور', - 58516 => 'قره ضیاءالدین', - 58531 => 'شیرین بلاغ', - 58541 => 'مراکان', - 58551 => 'چورس', - 58561 => 'قورول علیا', - 58571 => 'بسطام', - 58631 => 'قره تپه', - 58641 => 'ریحانلوی علیا', - 58651 => 'زاویه سفلی', - 58661 => 'آواجیق', - 58671 => 'بازرگان', - 58681 => 'قم قشلاق', - 58691 => 'یولاگلدی', - 58716 => 'سیه چشمه', - 58731 => 'قرنقو', - 58751 => 'شوط', - 58761 => 'مرگنلر', - 58771 => 'پلدشت', - 58781 => 'نازک علیا', - 58791 => 'حسن کندی', - 58831 => 'وردان', - 58861 => 'قره قشلاق', - 58871 => 'تمر', - 58881 => 'ابگرم', - 58891 => 'سرنق', - 58931 => 'چهریق علیا', - 58941 => 'داراب', - 58951 => 'دلزی', - 58961 => 'اغ برزه', - 58971 => 'سنجی', - 59341 => 'خاتون باغ', - 59351 => 'حاجی حسن', - 59361 => 'سوگلی تپه', - 59371 => 'گلیجه', - 59381 => 'حاجی کند', - 59431 => 'باغچه', - 59441 => 'خورخوره', - 59450 => 'خلیفان', - 59451 => 'کاولان علیا', - 59461 => 'سیاقول علیا', - 59471 => 'اگریقاش', - 59481 => 'اوزون دره علیا', - 59531 => 'یکشوه', - 59541 => 'جوانمرد', - 59551 => 'اختتر', - 59561 => 'سیمینه', - 59571 => 'رحیم خان', - 59581 => 'گل تپه قورمیش', - 59631 => 'شلماش', - 59641 => 'اسلام اباد', - 59651 => 'بیوران سفلی', - 59671 => 'میرآباد', - 59681 => 'زمزیران', - 59691 => 'ربط', - 59730 => 'کشاورز', - 59731 => 'اقبال', - 59741 => 'ملاشهاب الدین', - 59751 => 'للکلو', - 59761 => 'بگتاش', - 59771 => 'چهار برج', - 59781 => 'گوگ تپه خالصه', - 59791 => 'تک اغاج', - 59831 => 'هاچاسو', - 59841 => 'هولاسو', - 59851 => 'قوزلوی افشار', - 59861 => 'محمودآباد', - 59871 => 'الی چین', - 59881 => 'حیدرباغی', - 59891 => 'حمزه قاسم', - 59931 => 'اوغول بیگ', - 59941 => 'دورباش', - 59951 => 'اقابیگ', - 59961 => 'احمدابادسفلی', - 59981 => 'باروق', - ], - ], - 17 => [ - 'title' => 'همدان', - 'cities' => [ - 651 => 'همدان', - 6531 => 'بهار', - 6541 => 'اسدآباد', - 6551 => 'کبودرآهنگ', - 6561 => 'فامنین', - 6571 => 'ملایر', - 6581 => 'تویسرکان', - 6591 => 'نهاوند', - 65141 => 'مریانج', - 65181 => 'جورقان', - 65331 => 'لالجین', - 65341 => 'دیناراباد', - 65351 => 'همه کسی', - 65361 => 'صالح آباد', - 65371 => 'پرلوک', - 65381 => 'حسین ابادبهارعاشوری', - 65391 => 'مهاجران', - 65431 => 'ویرایی', - 65441 => 'جنت اباد', - 65451 => 'موسی اباد', - 65461 => 'چنارسفلی', - 65471 => 'چنارعلیا', - 65481 => 'آجین', - 65491 => 'طویلان سفلی', - 65531 => 'کوریجان', - 65541 => 'کوهین', - 65551 => 'قهوردسفلی', - 65561 => 'اکنلو', - 65571 => 'شیرین سو', - 65581 => 'گل تپه', - 65591 => 'داق داق اباد', - 65631 => 'قهاوند', - 65641 => 'تجرک', - 65651 => 'کوزره', - 65661 => 'چانگرین', - 65671 => 'دمق', - 65681 => 'رزن', - 65691 => 'قروه درجزین', - 65731 => 'ازناو', - 65741 => 'جوزان', - 65751 => 'زنگنه', - 65761 => 'سامن', - 65771 => 'اورزمان', - 65781 => 'جوکار', - 65791 => 'اسلام اباد', - 65831 => 'جعفریه (قلعه جعفربیک)', - 65841 => 'سرکان', - 65851 => 'میانده', - 65861 => 'فرسفج', - 65871 => 'ولاشجرد', - 65881 => 'اشتران', - 65891 => 'باباپیر', - 65931 => 'جهان اباد', - 65941 => 'باباقاسم', - 65951 => 'بابارستم', - 65960 => 'برزول', - 65961 => 'گیان', - 65971 => 'دهفول', - 65981 => 'فیروزان', - 65991 => 'شهرک صنعتی بوعلی', - 65992 => 'پایگاه نوژه', - 65993 => 'علیصدر', - 65995 => 'ازندریان', - 65998 => 'گنبد', - 66000 => 'پادگان قهرمان', - ], - ], - 18 => [ - 'title' => 'كردستان', - 'cities' => [ - 661 => 'سنندج', - 6631 => 'کامیاران', - 6641 => 'دیواندره', - 6651 => 'بیجار', - 6661 => 'قروه', - 6671 => 'مریوان', - 6681 => 'سقز', - 6691 => 'بانه', - 66171 => 'شویشه', - 66331 => 'شاهینی', - 66341 => 'طای', - 66351 => 'گازرخانی', - 66361 => 'نشورسفلی', - 66371 => 'شیروانه', - 66381 => 'خامسان', - 66391 => 'موچش', - 66431 => 'شریف اباد', - 66441 => 'کوله', - 66451 => 'هزارکانیان', - 66461 => 'زرینه', - 66471 => 'گورباباعلی', - 66481 => 'گاوشله', - 66491 => 'خرکه', - 66531 => 'یاسوکند', - 66541 => 'توپ اغاج', - 66551 => 'اق بلاغ طغامین', - 66561 => 'بابارشانی', - 66571 => 'خسرواباد', - 66591 => 'جعفراباد', - 66631 => 'دلبران', - 66641 => 'دزج', - 66651 => 'کانی گنجی', - 66661 => 'بلبان آباد', - 66671 => 'دهگلان', - 66681 => 'قوریچای', - 66691 => 'سریش آباد', - 66711 => 'کانی دینار', - 66731 => 'نی', - 66741 => 'برده رشه', - 66751 => 'چناره', - 66761 => 'پیرخضران', - 66771 => 'بیساران', - 66781 => 'سروآباد', - 66791 => 'اورامان تخت', - 66831 => 'سرا', - 66841 => 'گل تپه', - 66851 => 'تیلکو', - 66861 => 'صاحب', - 66871 => 'خورخوره', - 66881 => 'کسنزان', - 66891 => 'میرده', - 66931 => 'ننور', - 66941 => 'بوئین سفلی', - 66951 => 'آرمرده', - 66961 => 'بوالحسن', - 66971 => 'کانی سور', - 66981 => 'کوخان', - 66991 => 'شوی', - ], - ], - 19 => [ - 'title' => 'كرمانشاه', - 'cities' => [ - 671 => 'کرمانشاه', - 6731 => 'هرسین', - 6741 => 'کنگاور', - 6751 => 'سنقر', - 6761 => 'اسلام آبادغرب', - 6771 => 'سرپل ذهاب', - 6781 => 'قصرشیرین', - 6791 => 'پاوه', - 67131 => 'رباط', - 67331 => 'هفت اشیان', - 67341 => 'هلشی', - 67351 => 'دوردشت', - 67361 => 'سنقراباد', - 67371 => 'بیستون', - 67381 => 'جعفراباد', - 67391 => 'مرزبانی', - 67431 => 'فش', - 67441 => 'فرامان', - 67451 => 'سلطان اباد', - 67461 => 'صحنه', - 67471 => 'قزوینه', - 67481 => 'دهلقین', - 67491 => 'درکه', - 67531 => 'باوله', - 67541 => 'گردکانه علیا', - 67551 => 'اگاه علیا', - 67561 => 'سطر', - 67571 => 'کیوه نان', - 67580 => 'میان راهان', - 67581 => 'کرکسار', - 67591 => 'کندوله', - 67631 => 'زاوله علیا', - 67641 => 'حمیل', - 67651 => 'ریجاب', - 67661 => 'کرندغرب', - 67671 => 'گهواره', - 67681 => 'کوزران', - 67691 => 'قلعه شیان', - 67731 => 'حسن اباد', - 67741 => 'سراب ذهاب', - 67751 => 'ترک ویس', - 67761 => 'ازگله', - 67771 => 'تازه آباد', - 67781 => 'نساردیره', - 67791 => 'سرمست', - 67831 => 'تپه رش', - 67841 => 'خسروی', - 67861 => 'سومار', - 67871 => 'گیلانغرب', - 67891 => 'قیلان', - 67911 => 'شاهو', - 67931 => 'باینگان', - 67940 => 'بانوره', - 67941 => 'نوسود', - 67951 => 'نودشه', - 67961 => 'روانسر', - 67971 => 'دولت اباد', - 67981 => 'جوانرود', - 67991 => 'میراباد', - ], - ], - 20 => [ - 'title' => 'لرستان', - 'cities' => [ - 681 => 'خرم آباد', - 691 => 'بروجرد', - 6831 => 'نورآباد', - 6841 => 'کوهدشت', - 6851 => 'پلدختر', - 6861 => 'الیگودرز', - 6871 => 'ازنا', - 6881 => 'دورود', - 6891 => 'الشتر', - 68141 => 'ماسور', - 68181 => 'بیرانوند', - 68331 => 'برخوردار', - 68341 => 'فرهاداباد', - 68351 => 'دم باغ', - 68361 => 'کهریزوروشت', - 68371 => 'چشمه کیزاب علیا', - 68381 => 'هفت چشمه', - 68391 => 'تقی اباد', - 68431 => 'خوشناموند', - 68441 => 'اشتره گل گل', - 68451 => 'چقابل', - 68461 => 'سوری', - 68471 => 'کونانی', - 68481 => 'گراب', - 68491 => 'درب گنبد', - 68531 => 'پاعلم (پل تنگ)', - 68541 => 'واشیان نصیرتپه', - 68551 => 'چمشک زیرتنگ', - 68561 => 'افرینه', - 68571 => 'معمولان', - 68580 => 'ویسیان', - 68581 => 'میان تاگان', - 68591 => 'پل شوراب پایین', - 68631 => 'شاهپوراباد', - 68641 => 'چمن سلطان', - 68651 => 'کیزاندره', - 68661 => 'قلعه بزنوید', - 68671 => 'شول آباد', - 68681 => 'حیه', - 68691 => 'مرگ سر', - 68731 => 'مومن آباد', - 68741 => 'رازان', - 68751 => 'سیاه گوشی (پل هرو)', - 68761 => 'زاغه', - 68771 => 'سرابدوره', - 68781 => 'چاه ذوالفقار', - 68791 => 'چم پلک', - 68831 => 'ژان', - 68841 => 'کاغه', - 68851 => 'چالانچولان', - 68861 => 'سپید دشت', - 68871 => 'چم سنگر', - 68881 => 'ایستگاه تنگ هفت', - 68891 => 'مکینه حکومتی', - 68931 => 'سراب سیاهپوش', - 68951 => 'ده رحم', - 68961 => 'فیروز آباد', - 68971 => 'اشترینان', - 68981 => 'بندیزه', - 68991 => 'دره گرگ', - ], - ], - 21 => [ - 'title' => 'بوشهر', - 'cities' => [ - 751 => 'بوشهر', - 7531 => 'بندرگناوه', - 7541 => 'خورموج', - 7551 => 'اهرم', - 7561 => 'برازجان', - 75111 => 'نخل تقی', - 75331 => 'بندر ریگ', - 75341 => 'چهارروستایی', - 75351 => 'شول', - 75361 => 'بندر دیلم', - 75371 => 'امام حسن', - 75381 => 'چغادک', - 75390 => 'سیراف', - 75391 => 'عسلویه', - 75431 => 'بادوله', - 75441 => 'شنبه', - 75451 => 'کاکی', - 75461 => 'خارک', - 75471 => 'دلوار', - 75481 => 'بنه گز', - 75491 => 'اباد', - 75531 => 'بردخون', - 75540 => 'بردستان', - 75541 => 'بندردیر', - 75551 => 'آبدان', - 75560 => 'انارستان', - 75561 => 'ریز', - 75570 => 'بنک', - 75571 => 'بندرکنگان', - 75581 => 'جم', - 75591 => 'ابگرمک', - 75631 => 'دالکی', - 75641 => 'شبانکاره', - 75651 => 'آبپخش', - 75661 => 'سعدآباد', - 75671 => 'وحدتیه', - 75681 => 'تنگ ارم', - 75691 => 'کلمه', - ], - ], - 22 => [ - 'title' => 'كرمان', - 'cities' => [ - 761 => 'کرمان', - 771 => 'رفسنجان', - 781 => 'سیرجان', - 7631 => 'ماهان', - 7641 => 'گلباف', - 7651 => 'راور', - 7661 => 'بم', - 7671 => 'بروات', - 7681 => 'راین', - 7691 => 'محمدآباد', - 7731 => 'سرچشمه', - 7741 => 'انار', - 7751 => 'شهربابک', - 7761 => 'زرند', - 7771 => 'کیانشهر', - 7781 => 'کوهبنان', - 7791 => 'چترود', - 7831 => 'پاریز', - 7841 => 'بردسیر', - 7851 => 'بافت', - 7861 => 'جیرفت', - 7871 => 'عنبرآباد', - 7881 => 'کهنوج', - 7891 => 'منوجان', - 76331 => 'ده بالا', - 76361 => 'جوپار', - 76371 => 'باغین', - 76381 => 'اختیارآباد', - 76391 => 'زنگی آباد', - 76431 => 'جوشان', - 76451 => 'اندوهجرد', - 76461 => 'شهداد', - 76471 => 'کشیت', - 76541 => 'فیض اباد', - 76641 => 'دریجان', - 76731 => 'نرماشیر', - 76741 => 'فهرج', - 76771 => 'برج معاز', - 76791 => 'نظام شهر', - 76831 => 'خانه خاتون', - 76841 => 'ابارق', - 76861 => 'گروه', - 76871 => 'گزک', - 76891 => 'محی آباد', - 76941 => 'تهرود', - 76951 => 'میرابادارجمند', - 77331 => 'داوران', - 77341 => 'خنامان', - 77351 => 'کبوترخان', - 77361 => 'هرمزاباد', - 77371 => 'کشکوئیه', - 77381 => 'گلشن', - 77391 => 'صفائیه', - 77431 => 'امین شهر', - 77461 => 'بهرمان', - 77471 => 'جوادیه الهیه نوق', - 77511 => 'خاتون آباد', - 77541 => 'محمدابادبرفه', - 77551 => 'خورسند', - 77561 => 'خبر', - 77571 => 'کمسرخ', - 77581 => 'جوزم', - 77591 => 'دهج', - 77631 => 'دشت خاک', - 77651 => 'حتکن', - 77661 => 'ریحان', - 77671 => 'جرجافک', - 77691 => 'یزدان شهر', - 77731 => 'شعبجره', - 77751 => 'سیریز', - 77761 => 'خانوک', - 77861 => 'جور', - 77931 => 'هوتک', - 77951 => 'کاظم آباد', - 77961 => 'هجدک', - 77971 => 'حرجند', - 78151 => 'نجف شهر', - 78331 => 'بلورد', - 78341 => 'ملک اباد', - 78361 => 'عماداباد', - 78371 => 'زیدآباد', - 78380 => 'هماشهر', - 78431 => 'نگار', - 78441 => 'گلزار', - 78451 => 'لاله زار', - 78461 => 'قلعه عسکر', - 78471 => 'مومن اباد', - 78481 => 'چناربرین', - 78491 => 'کمال اباد', - 78541 => 'امیراباد', - 78551 => 'بزنجان', - 78561 => 'رابر', - 78571 => 'پتکان', - 78591 => 'ارزوئیه', - 78631 => 'جبالبارز', - 78661 => 'درب بهشت', - 78691 => 'رضی ابادبالا', - 78731 => 'میجان علیا', - 78761 => 'مردهک', - 78771 => 'دوساری', - 78781 => 'حسین ابادجدید', - 78791 => 'بلوک', - 78831 => 'رودبار', - 78841 => 'قلعه گنج', - 78851 => 'نودژ', - 78871 => 'فاریاب', - 78941 => 'سرخ قلعه', - 78971 => 'خیراباد', - ], - ], - 23 => [ - 'title' => 'هرمزگان', - 'cities' => [ - 791 => 'بندرعباس', - 7931 => 'خمیر', - 7941 => 'کیش', - 7951 => 'قشم', - 7961 => 'بستک', - 7971 => 'بندرلنگه', - 7981 => 'میناب', - 7991 => 'دهبارز', - 79331 => 'پشته ایسین', - 79341 => 'پل شرقی', - 79351 => 'فین', - 79361 => 'سیاهو', - 79370 => 'سرگز', - 79371 => 'فارغان', - 79381 => 'باغات', - 79391 => 'حاجی آباد', - 79431 => 'ابگرم خورگو', - 79441 => 'قلعه قاضی', - 79450 => 'تخت', - 79451 => 'حسن لنگی پایین', - 79460 => 'گروک', - 79461 => 'سیریک', - 79471 => 'گونمردی', - 79491 => 'گوهرت', - 79531 => 'درگهان', - 79541 => 'سوزا', - 79551 => 'هرمز', - 79561 => 'جزیره لارک شهری', - 79571 => 'هنگام جدید', - 79581 => 'جزیره سیری', - 79591 => 'ابوموسی', - 79611 => 'جناح', - 79631 => 'پدل', - 79641 => 'کنگ', - 79651 => 'دژگان', - 79661 => 'رویدر', - 79671 => 'دهنگ', - 79691 => 'کمشک', - 79711 => 'کوشکنار', - 79731 => 'گزیر', - 79741 => 'بندرمغویه', - 79751 => 'چارک', - 79761 => 'دشتی', - 79771 => 'پارسیان', - 79781 => 'جزیره لاوان', - 79791 => 'بندرجاسک', - 79831 => 'بندر', - 79841 => 'سندرک', - 79851 => 'درپهن', - 79861 => 'کلورجکدان', - 79871 => 'گوهران', - 79881 => 'سردشت', - 79911 => 'بیکاه', - 79931 => 'جغین', - 79941 => 'زیارت علی', - 79951 => 'ماشنگی', - 79961 => 'گوربند', - 79971 => 'تیاب', - 79981 => 'بندزرک', - 79991 => 'هشتبندی', - ], - ], - 24 => [ - 'title' => 'چهارمحال و بختياري', - 'cities' => [ - 881 => 'شهر کرد', - 8831 => 'فرخ شهر', - 8834 => 'دزک', - 8841 => 'هفشجان', - 8844 => 'هارونی', - 8851 => 'سامان', - 8861 => 'فارسان', - 8871 => 'بروجن', - 8881 => 'اردل', - 8891 => 'لردگان', - 88139 => 'کیان', - 88331 => 'طاقانک', - 88351 => 'خراجی', - 88361 => 'دستناء', - 88371 => 'شلمزار', - 88381 => 'گهرو', - 88431 => 'سورشجان', - 88451 => 'مرغملک', - 88461 => 'سودجان', - 88561 => 'نافچ', - 88571 => 'وردنجان', - 88581 => 'بن', - 88591 => 'پردنجان', - 88631 => 'باباحیدر', - 88651 => 'چلگرد', - 88661 => 'شهریاری', - 88671 => 'جونقان', - 88731 => 'نقنه', - 88741 => 'فرادنبه', - 88751 => 'سفید دشت', - 88761 => 'بلداجی', - 88771 => 'اورگان', - 88781 => 'گندمان', - 88791 => 'امام قیس', - 88831 => 'ناغان', - 88841 => 'گل سفید', - 88861 => 'چوله دان', - 88881 => 'دشتک', - 88941 => 'آلونی', - 88951 => 'مال خلیفه', - 88961 => 'چمن بید', - 88971 => 'سردشت', - 88991 => 'منج', - ], - ], - 25 => [ - 'title' => 'يزد', - 'cities' => [ - 891 => 'یزد', - 8931 => 'ابرکوه', - 8951 => 'اردکان', - 8961 => 'میبد', - 8971 => 'بافق', - 8981 => 'مهریز', - 8991 => 'تفت', - 89331 => 'فراغه', - 89351 => 'مهردشت', - 89361 => 'اسفنداباد', - 89416 => 'اشکذر', - 89418 => 'زارچ', - 89431 => 'شاهدیه', - 89441 => 'فهرج', - 89451 => 'خضر آباد', - 89481 => 'ندوشن', - 89491 => 'حمیدیا', - 89531 => 'احمد آباد', - 89551 => 'عقدا', - 89571 => 'انارستان', - 89581 => 'زرین', - 89631 => 'بفروئیه', - 89731 => 'اسفیج', - 89751 => 'مبارکه', - 89761 => 'بهاباد', - 89771 => 'کوشک', - 89781 => 'بنستان', - 89831 => 'تنگ چنار (چنار)', - 89851 => 'ارنان', - 89861 => 'بهادران', - 89871 => 'مروست', - 89881 => 'هرات', - 89891 => 'فتح اباد', - 89931 => 'ناحیه صنعتی پیشکوه', - 89941 => 'نصراباد', - 89951 => 'علی اباد', - 89961 => 'نیر', - 89981 => 'ناحیه صنعتی گاریزات', - 89991 => 'دهشیر', - ], - ], - 26 => [ - 'title' => 'سيستان و بلوچستان', - 'cities' => [ - 981 => 'زاهدان', - 991 => 'ایرانشهر', - 9831 => 'نصرت آباد', - 9841 => 'میرجاوه', - 9861 => 'زابل', - 9871 => 'زهک', - 9875 => 'خواجه احمد', - 9891 => 'خاش', - 9931 => 'سرباز', - 9941 => 'بمپور', - 9951 => 'سراوان', - 9961 => 'سوران', - 9971 => 'چابهار', - 9981 => 'کنارک', - 9991 => 'نیکشهر', - ], - ], - 27 => [ - 'title' => 'ايلام', - 'cities' => [ - 6931 => 'ایلام', - 6941 => 'ایوان', - 6951 => 'سرآبله', - 6961 => 'دره شهر', - 6971 => 'آبدانان', - 6981 => 'دهلران', - 6991 => 'مهران', - 69331 => 'چنارباشی', - 69341 => 'بیشه دراز', - 69351 => 'چشمه کبود', - 69361 => 'چوار', - 69371 => 'بانویزه', - 69381 => 'چمن سیدمحمد', - 69391 => 'هفت چشمه', - 69441 => 'شورابه ملک', - 69451 => 'کلان', - 69471 => 'زرنه', - 69511 => 'شباب', - 69531 => 'توحید', - 69541 => 'بلاوه تره سفلی', - 69551 => 'لومار', - 69561 => 'آسمان آباد', - 69571 => 'سراب کارزان', - 69581 => 'شهرک سرتنگ', - 69591 => 'علی اباد', - 69631 => 'ماژین', - 69641 => 'ارمو', - 69661 => 'چشمه شیرین', - 69671 => 'بدره', - 69681 => 'شهرک ولیعصر', - 69731 => 'گنداب', - 69741 => 'ژیور', - 69751 => 'سراب باغ', - 69761 => 'مورموری', - 69771 => 'سیاه گل', - 69781 => 'اب انار', - 69831 => 'چم هندی', - 69841 => 'موسیان', - 69851 => 'گولاب', - 69861 => 'میمه', - 69871 => 'پهله', - 69881 => 'عین خوش', - 69891 => 'دشت عباس', - 69931 => 'شهرک اسلامیه', - 69951 => 'صالح آباد', - 69970 => 'دلگشا', - 69971 => 'ارکواز', - 69972 => 'مهر', - 69981 => 'دول کبودخوشادول', - 69991 => 'پاریاب', - ], - ], - 28 => [ - 'title' => 'كهگيلويه و بويراحمد', - 'cities' => [ - 7571 => 'دهدشت', - 7581 => 'دوگنبدان', - 7591 => 'یاسوج', - 75731 => 'سوق', - 75741 => 'لنده', - 75751 => 'لیکک', - 75761 => 'چرام', - 75771 => 'دیشموک', - 75781 => 'قلعه رییسی', - 75791 => 'قلعه دختر', - 75831 => 'باباکلان', - 75841 => 'مظفراباد', - 75851 => 'دیل', - 75861 => 'شاه بهرام', - 75871 => 'چاه تلخاب علیا', - 75881 => 'باشت', - 75891 => 'سربیشه', - 75911 => 'مادوان', - 75941 => 'چیتاب', - 75951 => 'گراب سفلی', - 75961 => 'مارگون', - 75971 => 'میمند', - 75981 => 'پاتاوه', - 75991 => 'سی سخت', - ], - ], - 29 => [ - 'title' => 'خراسان شمالي', - 'cities' => [ - 941 => 'بجنورد', - 9431 => 'گرمه', - 9441 => 'جاجرم', - 9451 => 'آشخانه', - 9461 => 'شیروان', - 9481 => 'فاروج', - 9661 => 'اسفراین', - ], - ], - 30 => [ - 'title' => 'خراسان جنوبي', - 'cities' => [ - 971 => 'بیرجند', - 9741 => 'سربیشه', - 9751 => 'نهبندان', - 9761 => 'قاین', - 9771 => 'فردوس', - 9781 => 'بشرویه', - 9791 => 'طبس', - ], - ], - 31 => [ - 'title' => 'البرز', - 'cities' => [ - 31 => 'کرج', - 3331 => 'نظرآباد', - 3361 => 'هشتگرد', - 31541 => 'ادران', - 31551 => 'آسارا', - 31638 => 'گرمدره', - 31656 => 'فردیس', - 31776 => 'مشکین دشت', - 31778 => 'محمدشهر', - 31836 => 'کرج (مهرشهر)', - 31849 => 'ماهدشت', - 31871 => 'اشتهارد', - 31991 => 'کمالشهر', - 33351 => 'تنکمان', - 33611 => 'گلسار', - 33618 => 'شهر جدید هشتگرد', - 33651 => 'کوهسار', - 33661 => 'چهارباغ', - 33691 => 'طالقان', - ], - ], - ]; - foreach($citiesArray as $province) { - foreach ($province['cities'] as $code => $cityName) { - if ($code == $cityCode) { - return $cityName; - } - } - } - return false; - } -//========================================================================================================================= -} \ No newline at end of file diff --git a/admin/partials/ssbhesabix-admin-setting.php b/admin/partials/ssbhesabix-admin-setting.php deleted file mode 100644 index 4d430dd..0000000 --- a/admin/partials/ssbhesabix-admin-setting.php +++ /dev/null @@ -1,2339 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - */ -class Ssbhesabix_Setting { - - /** - * Hook in methods - * @since 1.0.0 - * @access static - */ -//========================================================================================================================== - public static function init() { - add_action( 'ssbhesabix_home_setting', array( __CLASS__, 'ssbhesabix_home_setting' ) ); - - add_action( 'ssbhesabix_catalog_setting', array( __CLASS__, 'ssbhesabix_catalog_setting' ) ); - add_action( 'ssbhesabix_catalog_setting_save_field', array( - __CLASS__, - 'ssbhesabix_catalog_setting_save_field' - ) ); - - add_action( 'ssbhesabix_customers_setting', array( __CLASS__, 'ssbhesabix_customers_setting' ) ); - add_action( 'ssbhesabix_customers_setting_save_field', array( - __CLASS__, - 'ssbhesabix_customers_setting_save_field' - ) ); - - add_action( 'ssbhesabix_invoice_setting', array( __CLASS__, 'ssbhesabix_invoice_setting' ) ); - add_action( 'ssbhesabix_invoice_setting_save_field', array( - __CLASS__, - 'ssbhesabix_invoice_setting_save_field' - ) ); - - add_action( 'ssbhesabix_payment_setting', array( __CLASS__, 'ssbhesabix_payment_setting' ) ); - add_action( 'ssbhesabix_payment_setting_save_field', array( - __CLASS__, - 'ssbhesabix_payment_setting_save_field' - ) ); - - add_action( 'ssbhesabix_api_setting', array( __CLASS__, 'ssbhesabix_api_setting' ) ); - add_action( 'ssbhesabix_api_setting_save_field', array( __CLASS__, 'ssbhesabix_api_setting_save_field' ) ); - - add_action( 'ssbhesabix_export_setting', array( __CLASS__, 'ssbhesabix_export_setting' ) ); - - add_action( 'ssbhesabix_sync_setting', array( __CLASS__, 'ssbhesabix_sync_setting' ) ); - - add_action( 'ssbhesabix_log_setting', array( __CLASS__, 'ssbhesabix_log_setting' ) ); - - add_action( 'ssbhesabix_extra_setting', array( __CLASS__, 'ssbhesabix_extra_setting' ) ); - add_action( 'ssbhesabix_extra_setting_save_field', array( - __CLASS__, - 'ssbhesabix_extra_setting_save_field' - ) ); - } -//========================================================================================================================== - public static function ssbhesabix_home_setting() { - ?> -

-

-

- -
- هشدارها -
-
    -
  • * - افزونه حسابیکس از کد کالاها و مشتریان و از شماره فاکتور جهت شناسایی آنها استفاده می کند، - بنابراین پس از ثبت کالاها و مشتریان در حسابیکس کد آنها را در حسابیکس تغییر ندهید، و همچنین پس از ثبت - فاکتور، - شماره فاکتور را در حسابیکس نباید تغییر دهید. -
  • -
  • - * با حذف افزونه از وردپرس، جدول ارتباط بین افزونه و حسابیکس نیز از دیتابیس وردپرس حذف می شود - و کلیه ارتباطات از بین می رود. -
  • -
-
-
- نکات -
-
    -
  • * - پیشنهاد می شود قبل از شروع کار با افزونه، حتما ویدیو خودآموز افزونه را مشاهده نمایید. -
  • -
-
- -
-
-

- - -
-
-

-
- نصب افزونه -
00:00 -
-
- اتصال افزونه به حسابیکس -
01:15 -
-
- تنظیمات افزونه -
04:06 -
-
- تعریف محصول و لینک کردن محصول به حسابیکس -
08:40 -
-
- خروجی محصولات به حسابیکس -
22:58 -
-
- خروجی موجودی اول دوره محصولات به حسابیکس -
24:22 -
-
- خروجی مشتریان -
24:55 -
-
- ورود محصولات از حسابیکس به فروشگاه -
25:25 -
-
- همسان سازی قیمت و موجودی محصولات -
26:32 -
-
- همسان سازی سفارشات -
27:25 -
-
- بروزرسانی محصولات در حسابیکس بر اساس فروشگاه -
29:18 -
-
- سفارشات و ثبت فاکتور در حسابیکس -
30:05 -
-
- پشتیبان گیری از جدول افزونه در دیتابیس -
35:20 -
-
- لاگ رویدادها و خطاها -
41:42 -
-
- حذف محصولات -
50:46 -
-
- محصول پیش نویس -
52:23 -
-
-
- - __('Enable or Disable Debug Mode', 'ssbhesabix'), - 'id' => 'ssbhesabix_debug_mode_checkbox', - 'default' => 'no', - 'type' => 'checkbox', - ); - - return $fields; - } -//============================================================================================== - public static function ssbhesabix_extra_setting() { - ?> -
-
    -
  • - این صفحه برای تنظیمات پیشرفته افزونه می باشد -
  • -
-
- -

- - -
- - - - Plugin Version - Server PHP Version - Plugin PHP Version Tested Up To - - - - - ' . $plugin_version . ' - ' . $server_php_version . ' - ' . $plugin_php_version . ' - - - ' - - . ''; - ?> -
- init( $ssbhesabi_setting_fields ); ?> -
- - - : 500 -
-
-
- - - : 200 -
-
-
- - - : 100 -
-
-
- - - : 500 -
-
-
- - - : 500 -
-
-

- -

-
-

بروزرسانی ID آخرین تغییر

-

این گزینه تغییرات را به آخرین ID بروزرسانی می کند.

- -
-
-
-

افزودن دستی محصول به حسابیکس

-

در فیلد کد ووکامرس، کد محصول بدون لینک را که می خواهید در حسابیکس ذخیره کنید، وارد نمایید.

-

در فیلد کد حسابیکس، کد حسابداری را وارد نمایید به طوری که محصولی با این کد حسابداری وجود نداشته باشد تا محصول ووکامرس انتخابی با این کد در حسابیکس اضافه شود.

-

در صورتی که محصول ساده است به جای کد متغیر عدد صفر را قرار دهید.

- - - - - - - - - - - -
-
- syncLastChangeID(); - } - - if(isset($_POST['ssbhesabix_save_product_manually_to_hesabix'])) { - $func = new Ssbhesabix_Admin_Functions(); - if(empty($_POST['attribute_code'])) { - $_POST['attribute_code'] = 0; - } - if (empty($_POST['woocommerce_code'])) { - echo ""; - } else { - if(isset($_POST['hesabix_code']) && isset($_POST['woocommerce_code']) && isset($_POST['attribute_code'])) { - $result = $func->SaveProductManuallyToHesabix($_POST['woocommerce_code'], $_POST['attribute_code'], $_POST['hesabix_code']); - if($result) { - echo ''; - } else { - echo ''; - } - } - } - } - - if(isset($_POST["ssbhesabix_integration"])) { - if(isset($_POST['ssbhesabix_set_rpp_for_sync_products_into_hesabix'])) update_option('ssbhesabix_set_rpp_for_sync_products_into_hesabix', $_POST['ssbhesabix_set_rpp_for_sync_products_into_hesabix']); - if(isset($_POST['ssbhesabix_set_rpp_for_sync_products_into_woocommerce'])) update_option('ssbhesabix_set_rpp_for_sync_products_into_woocommerce', $_POST['ssbhesabix_set_rpp_for_sync_products_into_woocommerce']); - if(isset($_POST['ssbhesabix_set_rpp_for_import_products'])) update_option('ssbhesabix_set_rpp_for_import_products', $_POST['ssbhesabix_set_rpp_for_import_products']); - if(isset($_POST['ssbhesabix_set_rpp_for_export_products'])) update_option('ssbhesabix_set_rpp_for_export_products', $_POST['ssbhesabix_set_rpp_for_export_products']); - if(isset($_POST['ssbhesabix_set_rpp_for_export_opening_products'])) update_option('ssbhesabix_set_rpp_for_export_opening_products', $_POST['ssbhesabix_set_rpp_for_export_opening_products']); - header('refresh:0'); - } - ?> -
-
-

مشاهده آیتم های جدول ارتباط

- - - - - - - - - - - - -
- getWpFaSearch($woocommerce_search_code, $woocommerce_attribute_search_code, $hesabix_search_code, $obj_type_search); - - ?> -
- - - - - - - - - - - - - - - - - - - - - -
IDنوع آیتمکد حسابیکسکد ووکامرسکد متغیر ووکامرس
id;?>objType;?>idHesabix;?>idWp;?>idWpAttribute;?>
-
- - save_fields( $ssbhesabi_setting_fields ); - } -//============================================================================================== - public static function ssbhesabix_catalog_setting_fields() { - $warehouses = Ssbhesabix_Setting::ssbhesabix_get_warehouses(); - - $fields[] = array( - 'title' => __( 'Catalog Settings', 'ssbhesabix' ), - 'type' => 'title', - 'desc' => '', - 'id' => 'catalog_options' - ); - - $fields[] = array( - 'title' => __( 'Update Price', 'ssbhesabix' ), - 'desc' => __( 'Update Price after change in Hesabix', 'ssbhesabix' ), - 'id' => 'ssbhesabix_item_update_price', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => __( 'Update Quantity', 'ssbhesabix' ), - 'desc' => __( 'Update Quantity after change in Hesabix', 'ssbhesabix' ), - 'id' => 'ssbhesabix_item_update_quantity', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => __( "Update product's quantity based on", 'ssbhesabix' ), - 'id' => 'ssbhesabix_item_update_quantity_based_on', - 'type' => 'select', - 'options' => $warehouses, - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Remove The Titles for Attributes When Saving Product To Hesabix', 'ssbhesabix' ), - 'id' => 'ssbhesabix_remove_attributes_titles', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Do not update purchase and sales titles in hesabix', 'ssbhesabix' ), - 'id' => 'ssbhesabix_do_not_update_titles_in_hesabix', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Do not submit product in Hesabix automatically by saving product in woocommerce', 'ssbhesabix' ), - 'id' => 'ssbhesabix_do_not_submit_product_automatically', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Do not update product price in Hesabix by editing product in woocommerce', 'ssbhesabix' ), - 'id' => 'ssbhesabix_do_not_update_product_price_in_hesabix', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Do not update product barcode in Hesabix by saving product in woocommerce', 'ssbhesabix' ), - 'id' => 'ssbhesabix_do_not_update_product_barcode_in_hesabix', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Do not update product category in Hesabix by saving product in woocommerce', 'ssbhesabix' ), - 'id' => 'ssbhesabix_do_not_update_product_category_in_hesabix', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Do not update product code in Hesabix by saving product in woocommerce', 'ssbhesabix' ), - 'id' => 'ssbhesabix_do_not_update_product_product_code_in_hesabix', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Show Hesabix ID in Products Page', 'ssbhesabix' ), - 'id' => 'ssbhesabix_show_product_code_in_products_page', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Show Hesabix Code in Woocommerce Excel Export', 'ssbhesabix' ), - 'id' => 'ssbhesabix_show_hesabix_code_in_excel_export', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $fields[] = array( - 'title' => "", - 'desc' => __( 'Set Special Sale as Discount in invoice', 'ssbhesabix' ), - 'id' => 'ssbhesabix_set_special_sale_as_discount', - 'default' => 'no', - 'type' => 'checkbox' - ); - - $options_to_update_sale_price = array(); - $options_to_update_sale_price[0] = __( "The Sale price does not change", 'ssbhesabix' ); - $options_to_update_sale_price[1] = __( "The Sale price gets removed", 'ssbhesabix' ); - $options_to_update_sale_price[2] = __( "The sale price get changes in proportion to the regular price", 'ssbhesabix' ); - - $fields[] = array( - 'title' => __( "Update sale price", 'ssbhesabix' ), - 'id' => 'ssbhesabix_item_update_sale_price', - 'type' => 'select', - 'options' => $options_to_update_sale_price, - ); - - $fields[] = array( 'type' => 'sectionend', 'id' => 'catalog_options' ); - - return $fields; - } -//==================================================================================================== - public static function ssbhesabix_catalog_setting() { - $ssbhesabi_setting_fields = self::ssbhesabix_catalog_setting_fields(); - $Html_output = new Ssbhesabix_Html_output(); - ?> -
- init( $ssbhesabi_setting_fields ); ?> -

- -

-
- save_fields( $ssbhesabi_setting_fields ); - } -//============================================================================================= - public static function ssbhesabix_customers_setting_fields() { - - $fields[] = array( - 'title' => __( 'Customers Settings', 'ssbhesabix' ), - 'type' => 'title', - 'desc' => '', - 'id' => 'customer_options' - ); - - $fields[] = array( - 'title' => __( 'Update Customer Address', 'ssbhesabix' ), - 'desc' => __( 'Choose when update Customer address in Hesabix.', 'ssbhesabix' ), - 'id' => 'ssbhesabix_contact_address_status', - 'type' => 'select', - 'options' => array( - '1' => __( 'Use first customer address', 'ssbhesabix' ), - '2' => __( 'update address with Invoice address', 'ssbhesabix' ), - '3' => __( 'update address with Delivery address', 'ssbhesabix' ) - ), - ); - - $fields[] = array( - 'title' => __( 'Customer\'s Group', 'ssbhesabix' ), - 'desc' => __( 'Enter a Customer\'s Group in Hesabix', 'ssbhesabix' ), - 'id' => 'ssbhesabix_contact_node_family', - 'type' => 'text', - 'default' => 'مشتریان فروشگاه آنلاین' - ); - - $fields[] = array( - 'title' => __( 'Save Customer\'s group', 'ssbhesabix' ), - 'desc' => __( 'Automatically save Customer\'s group in hesabix', 'ssbhesabix' ), - 'id' => 'ssbhesabix_contact_automatic_save_node_family', - 'default' => 'yes', - 'type' => 'checkbox' - ); - $fields[] = array( - 'title' => __( 'Customer\'s detail auto save and update', 'ssbhesabix' ), - 'desc' => __( 'Save and update Customer\'s detail automatically in hesabix', 'ssbhesabix' ), - 'id' => 'ssbhesabix_contact_automatically_save_in_hesabix', - 'type' => 'checkbox', - 'default' => 'yes' - ); - - $fields[] = array( 'type' => 'sectionend', 'id' => 'customer_options' ); - - return $fields; - } -//============================================================================================= - public static function ssbhesabix_customers_setting() { - - $ssbhesabi_setting_fields = self::ssbhesabix_customers_setting_fields(); - - $add_fields = get_option( 'ssbhesabix_contact_add_additional_checkout_fields_hesabix', 1 ); - $nationalCodeCheck = get_option( 'ssbhesabix_contact_NationalCode_checkbox_hesabix' ) == 'yes'; - $economicCodeCheck = get_option( 'ssbhesabix_contact_EconomicCode_checkbox_hesabix' ) == 'yes'; - $registrationNumberCheck = get_option( 'ssbhesabix_contact_RegistrationNumber_checkbox_hesabix') == 'yes'; - $websiteCheck = get_option( 'ssbhesabix_contact_Website_checkbox_hesabix') == 'yes'; - - $nationalCodeRequired = get_option( 'ssbhesabix_contact_NationalCode_isRequired_hesabix' ) == 'yes'; - $economicCodeRequired = get_option( 'ssbhesabix_contact_EconomicCode_isRequired_hesabix' ) == 'yes'; - $registrationNumberRequired = get_option( 'ssbhesabix_contact_RegistrationNumber_isRequired_hesabix') == 'yes'; - $websiteRequired = get_option( 'ssbhesabix_contact_Website_isRequired_hesabix') == 'yes'; - - $nationalCodeMetaName = get_option( 'ssbhesabix_contact_NationalCode_text_hesabix', null ) ; - $economicCodeMetaName = get_option( 'ssbhesabix_contact_EconomicCode_text_hesabix', null ) ; - $registrationNumberMetaName = get_option( 'ssbhesabix_contact_RegistrationNumber_text_hesabix', null ); - $websiteMetaName = get_option( 'ssbhesabix_contact_Website_text_hesabix', null ) ; - - $Html_output = new Ssbhesabix_Html_output(); - ?> -
- init( $ssbhesabi_setting_fields ); ?> - -
-
- -
-
-
- > - -
- -
- > - -
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class="form-control" value="yes"> class="form-control" value="yes">
class="form-control" value="yes"> class="form-control" value="yes">
class="form-control" value="yes"> class="form-control" value="yes">
class="form-control" value="yes"> class="form-control" value="yes">
-
-
- -

- -

-
- save_fields( $ssbhesabi_setting_fields ); - // .... - } - -//============================================================================================= - public static function ssbhesabix_invoice_setting_fields() { - $projects = Ssbhesabix_Setting::ssbhesabix_get_projects(); - $salesmen = Ssbhesabix_Setting::ssbhesabix_get_salesmen(); - - $fields[] = array( - 'title' => __( 'Invoice Settings', 'ssbhesabix' ), - 'type' => 'title', - 'desc' => '', - 'id' => 'invoice_options' - ); - - $fields[] = array( - 'title' => __( 'Add invoice in which status', 'ssbhesabix' ), - 'id' => 'ssbhesabix_invoice_status', - 'type' => 'multiselect', - 'options' => array( - 'pending' => __( 'Pending payment', 'ssbhesabix' ), - 'processing' => __( 'Processing', 'ssbhesabix' ), - 'on-hold' => __( 'On hold', 'ssbhesabix' ), - 'completed' => __( 'Completed', 'ssbhesabix' ), - 'cancelled' => __( 'Cancelled', 'ssbhesabix' ), - 'refunded' => __( 'Refunded', 'ssbhesabix' ), - 'failed' => __( 'Failed', 'ssbhesabix' ), - 'checkout-draft' => __( 'Draft', 'ssbhesabix' ), - ), - ); - - $fields[] = array( - 'title' => __( 'Return sale invoice status', 'ssbhesabix' ), - 'id' => 'ssbhesabix_invoice_return_status', - 'type' => 'multiselect', - 'options' => array( - 'pending' => __( 'Pending payment', 'ssbhesabix' ), - 'processing' => __( 'Processing', 'ssbhesabix' ), - 'on-hold' => __( 'On hold', 'ssbhesabix' ), - 'completed' => __( 'Completed', 'ssbhesabix' ), - 'cancelled' => __( 'Cancelled', 'ssbhesabix' ), - 'refunded' => __( 'Refunded', 'ssbhesabix' ), - 'failed' => __( 'Failed', 'ssbhesabix' ), - 'checkout-draft' => __( 'Draft', 'ssbhesabix' ), - ), - ); - - $fields[] = array( - 'title' => __( "Invoice's Project", 'ssbhesabix' ), - 'id' => 'ssbhesabix_invoice_project', - 'type' => 'select', - 'options' => $projects, - ); - - $fields[] = array( - 'title' => __( "Invoice's Salesman", 'ssbhesabix' ), - 'id' => 'ssbhesabix_invoice_salesman', - 'type' => 'select', - 'options' => $salesmen, - ); - - $fields[] = array( - 'title' => __( "Invoice Salesman Percentage", 'ssbhesabix' ), - 'id' => 'ssbhesabix_invoice_salesman_percentage', - 'type' => 'text', - 'placeholder' => __("Invoice Salesman Percentage", 'ssbhesabix'), - ); - - $fields[] = array( - 'title' => '', - 'desc' => __('Save invoice in draft mode in Hesabix', 'ssbhesabix'), - 'id' => 'ssbhesabix_invoice_draft_save_in_hesabix', - 'type' => 'checkbox', - 'default' => 'no' - ); - - $fields[] = array( - 'title' => __('Save Freight', 'ssbhesabix'), - 'id' => 'ssbhesabix_invoice_freight', - 'type' => 'radio', - 'options' => [ - 0 => __("Save as Freight", 'ssbhesabix'), - 1 => __("Save as a Service", 'ssbhesabix') - ], - ); - - $fields[] = array( - 'title' => __('Service Code For Freight', 'ssbhesabix'), - 'id' => 'ssbhesabix_invoice_freight_code', - 'type' => 'text', - 'placeholder' => __('Enter Freight Code', 'ssbhesabix'), - ); - - if(is_plugin_active( 'dokan-lite/dokan.php' )){ - $fields[] = array( - 'title' => __( "Submit invoice base on Dokan orders", 'ssbhesabix' ), - 'id' => 'ssbhesabix_invoice_dokan', - 'type' => 'radio', - 'options' => [0 => __( "Inactive", 'ssbhesabix' ), - 1 => __( "Submit parent order", 'ssbhesabix' ), - 2 => __( "Submit children orders", 'ssbhesabix' )], - 'default' => 0 - ); - } - - $fields[] = array('type' => 'sectionend', 'id' => 'invoice_options'); - - return $fields; - } -//============================================================================================= - public static function ssbhesabix_invoice_setting() { - $ssbhesabi_setting_fields = self::ssbhesabix_invoice_setting_fields(); - $Html_output = new Ssbhesabix_Html_output(); - ?> - -
- توجه
- در اینجا تعیین کنید که فاکتور سفارش در چه مرحله ای در حسابیکس ثبت شود. - و چه زمان برای یک سفارش فاکتور برگشت از فروش ثبت شود. -
- در صورت انتخاب ذخیره هزینه حمل و نقل به عنوان یک خدمت، ابتدا باید یک خدمت در حسابیکس تعریف کنید و کد مربوط به آن را در فیلد کد خدمت حمل و نقل وارد و ذخیره نمایید. -
- فیلد "ذخیره هزینه به عنوان خدمت" برای سامانه مودیان مالیاتی می باشد. -
- توجه کنید که مقدار این فیلد به درستی وارد شده باشد تا در ثبت فاکتور مشکلی ایجاد نشود. -
-
- init( $ssbhesabi_setting_fields ); ?> -

- -

- alert("کد خدمت حمل و نقل تعریف نشده است")'; - } - ?> -
- save_fields( $ssbhesabi_setting_fields ); - } -//============================================================================================= - public static function ssbhesabix_payment_setting_fields() { - $banks = Ssbhesabix_Setting::ssbhesabix_get_banks(); - $cashes = Ssbhesabix_Setting::ssbhesabix_get_cashes(); - $payInputValue = array_merge($banks,$cashes); - - $payment_gateways = new WC_Payment_Gateways; - $available_payment_gateways = $payment_gateways->get_available_payment_gateways(); - - $fields[] = array( - 'title' => __( 'Payment methods Settings', 'ssbhesabix' ), - 'type' => 'title', - 'desc' => '', - 'id' => 'payment_options' - ); - - $fields[] = array( - 'title' => __( 'Add payment in which status', 'ssbhesabix' ), - 'id' => 'ssbhesabix_payment_status', - 'type' => 'multiselect', - 'options' => array( - 'pending' => __( 'Pending payment', 'ssbhesabix' ), - 'processing' => __( 'Processing', 'ssbhesabix' ), - 'on-hold' => __( 'On hold', 'ssbhesabix' ), - 'completed' => __( 'Completed', 'ssbhesabix' ), - 'cancelled' => __( 'Cancelled', 'ssbhesabix' ), - 'refunded' => __( 'Refunded', 'ssbhesabix' ), - 'failed' => __( 'Failed', 'ssbhesabix' ), - 'checkout-draft' => __( 'Draft', 'ssbhesabix' ), - ), - ); - - foreach ( $available_payment_gateways as $gateway ) { - $fields[] = array( - 'title' => $gateway->title, - 'id' => 'ssbhesabix_payment_method_' . $gateway->id, - 'type' => 'select', - 'options' => $payInputValue - ); - } - - foreach ( $available_payment_gateways as $gateway ) { - $fields[] = array( - 'title' => 'درصد کارمزد تراکنش برای ' . $gateway->title, - 'id' => 'ssbhesabix_payment_transaction_fee_' . $gateway->id, - 'class' => 'payment-transaction-fee', - 'type' => 'text', - 'placeholder' => 'وارد نمایید', - 'default' => '0', - ); - } - - $plugins = get_plugins(); - foreach ($plugins as $plugin_file => $plugin_info) { - if ($plugin_file === 'snapppay-woocommerce-gateway /index.php') { - if(is_plugin_active('snapppay-woocommerce-gateway /index.php')) { - $fields[] = array( - 'title' => 'پرداخت اسنپ پی', - 'id' => 'ssbhesabix_payment_method_snapppay', - 'type' => 'select', - 'options' => $payInputValue - ); - - $fields[] = array( - 'title' => 'درصد کارمزد تراکنش برای پرداخت اسنپ پی', - 'id' => 'ssbhesabix_payment_transaction_fee_snapppay', - 'type' => 'text', - 'placeholder' => 'وارد نمایید', - 'default' => '0', - ); - } - } - } - - $fields[] = array( - 'title' => __('Default Payment Gateway By Using this Option, all Invoices Will Have this Payment Gateway as Their Payment Gateway', 'ssbhesabix'), - 'id' => 'ssbhesabix_payment_option', - 'type' => 'radio', - 'options' => [ - 'yes' => __("Save Default Bank as the Payment Gateway", "ssbhesabix"), - 'no' => __("Save Other Payment Methods as the Payment Gateway", "ssbhesabix"), - ], - 'default' => 'no' - ); - - $fields[] = array( - 'title' => __( "Default Invoice Transaction Fee Percentage", 'ssbhesabix' ), - 'id' => 'ssbhesabix_invoice_transaction_fee', - 'type' => 'text', - 'class' => 'payment-transaction-fee', - 'placeholder' => __("Default Invoice Transaction Fee Percentage", 'ssbhesabix'), - 'default' => '0' - ); - - $fields[] = array( - 'title' => __( "Submit Cash in Transit", 'ssbhesabix' ), - 'id' => 'ssbhesabix_cash_in_transit', - 'desc' => __( "Submit Invoice Receipt Cash in Transit", 'ssbhesabix' ), - 'type' => 'checkbox', - 'default' => 'no' - ); - - $fields[] = array( - 'title' => __('Default Bank Code', 'ssbhesabix'), - 'id' => 'ssbhesabix_default_payment_method_code', - 'type' => 'text', - 'placeholder' => __('Enter Bank Code', 'ssbhesabix') - ); - - $fields[] = array( - 'title' => __('Default Bank Name', 'ssbhesabix'), - 'id' => 'ssbhesabix_default_payment_method_name', - 'type' => 'text', - 'placeholder' => __('Enter Bank Name', 'ssbhesabix') - ); - - $fields[] = array( 'type' => 'sectionend', 'id' => 'payment_options' ); - - return $fields; - } -//============================================================================================= - public static function ssbhesabix_payment_setting() { - $ssbhesabi_setting_fields = self::ssbhesabix_payment_setting_fields(); - $Html_output = new Ssbhesabix_Html_output(); - ?> - -
- توجه
- در اینجا تعیین کنید که رسید دریافت وجه فاکتور در چه وضعیتی ثبت شود - و در هر روش پرداخت، رسید در چه بانکی و یا صندوقی ثبت شود. -
- بانک پیش فرض، جهت کاربرانی می باشد که به هر دلیلی روش های پرداخت وکامرس در اینجا نمایش داده نمی شود. در این صورت با انتخاب بانک و ثبت کد آن، تمامی دریافت ها در آن بانک ثبت خواهد شد -
- درصد کارمزد تراکنش برای هر روش پرداخت می تواند تعریف شود(بین 1 تا 100). -
- درصد کارمزد تراکنش پیش فرض زمانی اعمال می شود که درصد یک روش پرداخت یا تعریف نشده باشد و یا صفر باشد. -
-
- init( $ssbhesabi_setting_fields ); ?> -

- -

- alert("کد بانک پیش فرض تعریف نشده است")'; - } - - if(get_option("ssbhesabix_cash_in_transit") == "yes" || get_option("ssbhesabix_cash_in_transit") == "1") { - $func = new Ssbhesabix_Admin_Functions(); - $cashInTransitFullPath = $func->getCashInTransitFullPath(); - if(!$cashInTransitFullPath) { - HesabixLogService::writeLogStr("Cash in Transit is not Defined in Hesabix ---- وجوه در راه در حسابیکس یافت نشد"); - echo ' - '; - } - } - ?> -
- save_fields( $ssbhesabi_setting_fields ); - } -//============================================================================================= - public static function ssbhesabix_api_setting_fields() { - $fields[] = array( - 'title' => __( 'API Settings', 'ssbhesabix' ), - 'type' => 'title', - 'desc' => '', - 'id' => 'api_options' - ); - - $fields[] = array( - 'title' => __( 'API Key', 'ssbhesabix' ), - 'desc' => __( 'Find API key in Setting->Financial Settings->API Menu', 'ssbhesabix' ), - 'id' => 'ssbhesabix_account_api', - 'type' => 'text', - ); - - $fields[] = array( - 'title' => __( 'API Address', 'ssbhesabix' ), - 'id' => 'ssbhesabix_api_address', - 'type' => 'select', - 'options' => array( - "0" => "hesabix.ir", - "1" => "next.hesabix.ir" - ) - ); - $fields[] = array( 'type' => 'sectionend', 'id' => 'api_options' ); - - return $fields; - } -//============================================================================================= - public static function ssbhesabix_api_setting() { - $businessInfo = self::getSubscriptionInfo(); - $isBusinessInfo = false; - if ( $businessInfo["expireDate"] != '' && $businessInfo["expireDate"] != null ) { - $isBusinessInfo = true; - $expireDate = strtotime( $businessInfo["expireDate"] ); - $expireDateStr = date( "Y/m/d", $expireDate ); - } - - $ssbhesabi_setting_fields = self::ssbhesabix_api_setting_fields(); - $Html_output = new Ssbhesabix_Html_output(); - ?> -
- توجه
-
    -
  • - برای اتصال به API حسابیکس و فعال شدن این افزونه باید در اینجا - کلید API و توکن ورود به کسب و کار خود را وارد کنید. -
  • -
  • - اگر برای اتصال به API حسابیکس از توکن ورود استفاده کنید - نیازی به وارد کردن ایمیل و رمز عبور نیست. -
  • -
  • - برای پیدا کردن توکن ورود و کلید API، در حسابیکس به قسمت تنظیمات، تنظیمات API مراجعه کنید. -
  • -
  • - اگر می خواهید کسب و کار دیگری را به افزونه متصل کنید، ابتدا باید یک بار افزونه را - حذف و مجدد نصب کنید تا جدول ارتباطات کسب و کار قبلی با افزونه حذف گردد. -
  • -
-
-
- اطلاعات کسب و کار -
-
نام کسب و کار:
-
-
طرح:
-
-
-
-
اعتبار سند:
-
-
تاریخ انقضا:
-
-
-
- -
- هشدار
- برای اتصال یک کسب و کار دیگر به افزونه، ابتدا باید یک بار افزونه را حذف و مجدد - نصب کنید تا جدول ارتباطات افزونه با کسب و کار قبل حذف گردد. -
- -
- init( $ssbhesabi_setting_fields ); ?> -

- -

-
- save_fields( $ssbhesabi_setting_fields ); - - Ssbhesabix_Setting::ssbhesabix_set_webhook(); - } -//============================================================================================= - public static function ssbhesabix_export_setting() { - // Export - Bulk product export offers - $productExportResult = ( isset( $_GET['productExportResult'] ) ) ? wc_clean( $_GET['productExportResult'] ) : null; - $productImportResult = ( isset( $_GET['productImportResult'] ) ) ? wc_clean( $_GET['productImportResult'] ) : null; - $error = ( isset( $_GET['error'] ) ) ? wc_clean( $_GET['error'] ) : null; - - if ( ! is_null( $productExportResult ) && $productExportResult === 'true' ) { - $processed = ( isset( $_GET['processed'] ) ) ? wc_clean( $_GET['processed'] ) : null; - if ( $processed == 0 ) { - echo '
'; - echo '

' . __( 'No products were exported, All products were exported or there are no product', 'ssbhesabix' ); - echo '

'; - } else { - echo '
'; - echo '

' . sprintf( __( 'Export products completed. %s products added/updated.', 'ssbhesabix' ), $processed ); - echo '

'; - } - } elseif ( $productExportResult === 'false' ) { - if ( ! is_null( $error ) && $error === '-1' ) { - echo '
'; - echo '

' . __( 'Export products fail. Hesabix has already contained products.', 'ssbhesabix' ); - echo '

'; - } else { - echo '
'; - echo '

' . __( 'Export products fail. Please check the log file.', 'ssbhesabix' ); - echo '

'; - } - } - - if ( ! is_null( $productImportResult ) && $productImportResult === 'true' ) { - $processed = ( isset( $_GET['processed'] ) ) ? wc_clean( $_GET['processed'] ) : null; - if ( $processed == 0 ) { - echo '
'; - echo '

' . __( 'No products were imported, All products were imported or there are no product', 'ssbhesabix' ); - echo '

'; - } else { - echo '
'; - echo '

' . sprintf( __( 'Import products completed. %s products added/updated.', 'ssbhesabix' ), $processed ); - echo '

'; - } - } elseif ( $productImportResult === 'false' ) { - echo '
'; - echo '

' . __( 'Import products fail. Please check the log file.', 'ssbhesabix' ); - echo '

'; - } - - // Export - Product opening quantity export offers - $productOpeningQuantityExportResult = ( isset( $_GET['productOpeningQuantityExportResult'] ) ) ? wc_clean( $_GET['productOpeningQuantityExportResult'] ) : null; - if ( ! is_null( $productOpeningQuantityExportResult ) && $productOpeningQuantityExportResult === 'true' ) { - echo '
'; - echo '

' . __( 'Export product opening quantity completed.', 'ssbhesabix' ); - echo '

'; - } elseif ( ! is_null( $productOpeningQuantityExportResult ) && $productOpeningQuantityExportResult === 'false' ) { - $shareholderError = ( isset( $_GET['shareholderError'] ) ) ? wc_clean( $_GET['shareholderError'] ) : null; - $noProduct = ( isset( $_GET['noProduct'] ) ) ? wc_clean( $_GET['noProduct'] ) : null; - if ( $shareholderError == 'true' ) { - echo '
'; - echo '

' . __( 'Export product opening quantity fail. No Shareholder exists, Please define Shareholder in Hesabix', 'ssbhesabix' ); - echo '

'; - } elseif ( $noProduct == 'true' ) { - echo '
'; - echo '

' . __( 'No product available for Export product opening quantity.', 'ssbhesabix' ); - echo '

'; - } else { - echo '
'; - echo '

' . __( 'Export product opening quantity fail. Please check the log file.', 'ssbhesabix' ); - echo '

'; - } - } - - // Export - Bulk customer export offers - $customerExportResult = ( isset( $_GET['customerExportResult'] ) ) ? wc_clean( $_GET['customerExportResult'] ) : null; - - if ( ! is_null( $customerExportResult ) && $customerExportResult === 'true' ) { - $processed = ( isset( $_GET['processed'] ) ) ? wc_clean( $_GET['processed'] ) : null; - if ( $processed == 0 ) { - echo '
'; - echo '

' . __( 'No customers were exported, All customers were exported or there are no customer', 'ssbhesabix' ); - echo '

'; - } else { - echo '
'; - echo '

' . sprintf( __( 'Export customers completed. %s customers added.', 'ssbhesabix' ), $processed ); - echo '

'; - } - } elseif ( ! is_null( $customerExportResult ) && $customerExportResult === 'false' ) { - if ( ! is_null( $error ) && $error === '-1' ) { - echo '
'; - echo '

' . __( 'Export customers fail. Hesabix has already contained customers.', 'ssbhesabix' ); - echo '

'; - } else { - echo '
'; - echo '

' . __( 'Export customers fail. Please check the log file.', 'ssbhesabix' ); - echo '

'; - } - } - - ?> -
-

-
-
-
-
-
- -
- -
-
-

-
-
-
-
- -
    -
  • با انجام این عملیات محصولات لینک نشده از فروشگاه وارد حسابیکس می شوند.
  • -
  • اگر محصولات از قبل هم در فروشگاه تعریف شده اند و هم در حسابیکس و به هم لینک نشده اند باید از - گزینه - همسان سازی دستی محصولات استفاده کنید. -
  • -
  • با انجام این عملیات موجودی محصولات وارد حسابیکس نمی شود و برای وارد کردن موجودی محصولات - فروشگاه - در حسابیکس، باید از گزینه استخراج موجودی اول دوره استفاده کنید. -
  • -
-
-
-
- -
-
-
- -
- -
-
-

-
-
-
-
- -
    -
  • با انجام این عملیات موجودی کنونی محصولات در فروشگاه بعنوان موجودی اول دوره محصولات در حسابیکس - ثبت می شوند. -
  • -
  • بطور کلی فقط یک بار باید از این گزینه استفاده کنید، - که این کار باید پس از خروج محصولات به حسابیکس و یا پس از همسان سازی دستی تمام محصولات - انجام شود. -
  • -
-
-
-
- -
-
-
- -
- -
-
-

-
-
-
-
- -
    -
  • با انجام این عملیات مشتریان لینک نشده از فروشگاه وارد حسابیکس می شوند.
  • -
  • - اگر یک مشتری بیش از یک بار وارد حسابیکس شده است می توانید از گزینه ادغام تراکنش ها در حسابیکس - استفاده کنید. -
  • -
-
-
-
- -
-
-
- -
- -
-
-

- -

-
-
-
-
- -
    -
  • با انجام این عملیات محصولات لینک نشده از حسابیکس وارد فروشگاه می شوند.
  • -
  • اگر محصولات از قبل هم در فروشگاه تعریف شده اند و هم در حسابیکس و به هم لینک نشده اند باید از - گزینه - همسان سازی دستی محصولات استفاده کنید. -
  • -
  • محصولات در وضعیت خصوصی وارد فروشگاه می شوند و سپس هر زمان مایل بودید می توانید وضعیت را به - منتشر شده تغییر دهید. -
  • -
  • تمامی محصولات بعنوان محصول ساده (و نه متغیر) وارد فروشگاه می شوند.
  • -
-
-
-
- '; - echo '

' . __( 'Sync completed, All hesabix changes synced successfully.', 'ssbhesabix' ); - echo '

'; - } - - // Sync - Bulk product sync offers - $productSyncResult = ( isset( $_GET['productSyncResult'] ) ) ? wc_clean( $_GET['productSyncResult'] ) : null; - if ( ! is_null( $productSyncResult ) && $productSyncResult == 'true' ) { - echo '
'; - echo '

' . __( 'Sync completed, All products price/quantity synced successfully.', 'ssbhesabix' ); - echo '

'; - } elseif ( ! is_null( $productSyncResult ) && ! $productSyncResult == 'false' ) { - echo '
'; - echo '

' . __( 'Sync products fail. Please check the log file.', 'ssbhesabix' ); - echo '

'; - } - - // Sync - Bulk invoice sync offers - $orderSyncResult = ( isset( $_GET['orderSyncResult'] ) ) ? wc_clean( $_GET['orderSyncResult'] ) : null; - - if ( ! is_null( $orderSyncResult ) && $orderSyncResult === 'true' ) { - $processed = ( isset( $_GET['processed'] ) ) ? wc_clean( $_GET['processed'] ) : null; - echo '
'; - echo '

' . sprintf( __( 'Order sync completed. %s order added.', 'ssbhesabix' ), $processed ); - echo '

'; - } elseif ( ! is_null( $orderSyncResult ) && $orderSyncResult === 'false' ) { - $fiscal = ( isset( $_GET['fiscal'] ) ) ? wc_clean( $_GET['fiscal'] ) : false; - - if ( $fiscal === 'true' ) { - echo '
'; - echo '

' . __( 'The date entered is not within the fiscal year.', 'ssbhesabix' ); - echo '

'; - } else { - echo '
'; - echo '

' . __( 'Cannot sync orders. Please enter valid Date format.', 'ssbhesabix' ); - echo '

'; - } - } - - // Sync - Bulk product update - $productUpdateResult = ( isset( $_GET['$productUpdateResult'] ) ) ? wc_clean( $_GET['$productUpdateResult'] ) : null; - if ( ! is_null( $productUpdateResult ) && $productUpdateResult == 'true' ) { - echo '
'; - echo '

' . __( 'Update completed successfully.', 'ssbhesabix' ); - echo '

'; - } elseif ( ! is_null( $productUpdateResult ) && ! $productUpdateResult == 'false' ) { - echo '
'; - echo '

' . __( 'Update failed. Please check the log file.', 'ssbhesabix' ); - echo '

'; - } - - // Sync - Bulk product with filter update in Hesabix - $productUpdateWithFilterResult = ( isset( $_GET['$productUpdateWithFilterResult'] ) ) ? wc_clean( $_GET['$productUpdateWithFilterResult'] ) : null; - if ( ! is_null( $productUpdateWithFilterResult ) && $productUpdateWithFilterResult == 'true' ) { - echo '
'; - echo '

' . __( 'Update completed successfully.', 'ssbhesabix' ); - echo '

'; - } elseif ( ! is_null( $productUpdateWithFilterResult ) && ! $productUpdateWithFilterResult == 'false' ) { - echo '
'; - echo '

' . __( 'Update failed. Please check the log file.', 'ssbhesabix' ); - echo '

'; - } - ?> - -
-

' . $storeProductsCount . '' ?>

-

' . $hesabixProductsCount . '' ?>

-

' . $linkedProductsCount . '' ?>

-
- -
-

-
- -
-
-
-
- -
- -
-
-

-
- -
    -
  • با انجام این عملیات کالاها، مشتریان و سفارشاتی که تا کنون در حسابیکس ثبت نشده اند در حسابیکس - ثبت می شوند. -
  • -
  • توجه کنید که بصورت نرمال با فعالسازی افزونه و تکمیل تنظیمات API - این همسان سازی بصورت خودکار انجام می شود و این گزینه صرفاْ برای مواقعی است که به دلایل فنی - مثل قطع اتصال فروشگاه با حسابیکس و یا خطا و باگ این همسان سازی صورت نگرفته است. -
  • -
-
-
-
- -
-
-
- -
- - - - - -
-
-

-
-
-
-
- -
    -
  • با انجام این عملیات موجودی و قیمت محصولات در فروشگاه، بر اساس قیمت و موجودی آنها در حسابیکس - تنظیم می شود. -
  • -
  • این عملیات بر اساس تنظیمات صورت گرفته در تب محصولات انجام می شود.
  • -
-
-
-
- -
-
-
- -
- - تا - - - -
-
-

-
-
-
-
-
-
- -
    -
  • با انجام این عملیات سفارشات فروشگاه که در حسابیکس ثبت نشده اند از تاریخ انتخاب شده بررسی و در - حسابیکس ثبت می شوند. -
  • -
  • توجه کنید که بصورت نرمال با فعالسازی افزونه و تکمیل تنظیمات API - این همسان سازی بصورت خودکار انجام می شود و این گزینه صرفاْ برای مواقعی است که به دلایل فنی - مثل قطع اتصال فروشگاه با حسابیکس و یا خطا و باگ این همسان سازی صورت نگرفته است. -
  • -
-
-
-
- -
-
-
- -
- -
-
-

-
-
-
-
- -
    -
  • با انجام این عملیات ویژگی محصولات مثل نام و قیمت در حسابیکس، بر اساس فروشگاه بروزرسانی می - شود. -
  • -
  • در این عملیات موجودی کالا در حسابیکس تغییری نمی کند و بروز رسانی نمی شود.
  • -
-
-
-
- -
-
-
- -
- -

- -

- -
-
-

-
- -
    -
  • با انجام این عملیات ویژگی محصولات مثل نام و قیمت در حسابیکس، بر اساس فروشگاه در بازه ID مشخص شده بروزرسانی می - شود. -
  • -
  • در این عملیات موجودی کالا در حسابیکس تغییری نمی کند و بروز رسانی نمی شود.
  • -
  • بازه ID نباید بیشتر از 200 عدد باشد.
  • -
-
-
-
- - $storeProductsCount, - "hesabixProductsCount" => $hesabixProductsCount, - "linkedProductsCount" => $linkedProductsCount - ); - } -//============================================================================================= - public static function getProductCountsInHesabix() { - $hesabix = new Ssbhesabix_Api(); - - $filters = array( array( "Property" => "khadamat", "Operator" => "=", "Value" => 0 ) ); - - $response = $hesabix->itemGetItems( array('Filters' => $filters ) ); - if ( $response->Success ) { - return $response->data->FilteredCount; - } else { - return 0; - } - } -//============================================================================================= -// public static function getLinkedProductsCount() { -// global $wpdb; -// -// return $wpdb->get_var( "SELECT COUNT(*) FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `obj_type` = 'product'" ); -// } - - - public static function getLinkedProductsCount() { - global $wpdb; - - return $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(*) FROM {$wpdb->prefix}ssbhesabix WHERE obj_type = 'product'" - ) - ); - } -//============================================================================================= -// public static function getProductCountsInStore() { -// global $wpdb; -// -// return $wpdb->get_var( "SELECT COUNT(*) FROM `" . $wpdb->prefix . "posts` WHERE `post_type` IN ('product','product_variation') AND `post_status` IN ('publish', 'private', 'draft') " ); -// } - - public static function getProductCountsInStore() { - global $wpdb; - - return $wpdb->get_var( - $wpdb->prepare( - "SELECT COUNT(*) - FROM {$wpdb->prefix}posts - WHERE post_type IN ('product', 'product_variation') - AND post_status IN ('publish', 'private', 'draft')" - ) - ); - } - -//============================================================================================= - public static function getSubscriptionInfo() { - $businessName = ''; - $credit = ''; - $expireDate = ''; - $plan = ''; - - $hesabix = new Ssbhesabix_Api(); - $response = $hesabix->settingGetSubscriptionInfo(); - if ( $response->Success ) { - $businessName = $response->Result->Name; - $credit = $response->Result->Credit; - $expireDate = $response->Result->ExpireDate; - $plan = $response->Result->Subscription; - } - - return array( - "businessName" => $businessName, - "credit" => $credit, - "expireDate" => $expireDate, - "plan" => $plan - ); - } -//============================================================================================= - public static function ssbhesabix_set_webhook() { - $url = get_site_url() . '/index.php?ssbhesabix_webhook=1&token=' . substr( wp_hash( AUTH_KEY . 'ssbhesabix/webhook' ), 0, 10 ); - - $hookPassword = get_option( 'ssbhesabix_webhook_password' ); - - $ssbhesabix_api = new Ssbhesabix_Api(); - $response = $ssbhesabix_api->settingSetChangeHook( $url, $hookPassword ); - - if ( is_object( $response ) ) { - if ( $response->Success ) { - update_option( 'ssbhesabix_live_mode', 1 ); - update_option( 'ssbhesabix_account_bid', $response->bid ); - update_option( 'ssbhesabix_account_year', $response->year ); - - //set the last log ID if is not set - $lastChanges = get_option( 'ssbhesabix_last_log_check_id' ); - if ( ! $lastChanges ) { - $lastChanges = 0; - } - $changes = $ssbhesabix_api->settingGetChanges( $lastChanges ); - if ( $changes->Success ) { - if ( get_option( 'ssbhesabix_last_log_check_id' ) == 0 ) { - $lastChange = end( $changes->Result ); - update_option( 'ssbhesabix_last_log_check_id', $lastChange->Id ); - } - } else { - echo '
'; - echo '

' . __( 'Cannot check the last change ID. Error Message: ', 'ssbhesabix' ) . $changes->ErrorMessage . '

'; - echo '
'; - - HesabixLogService::log( array("Cannot check the last change ID. Error Message: $changes->ErrorMessage. Error Code: $changes->ErrorCode") ); - } - - - //check if date in fiscalYear - if ( Ssbhesabix_Admin_Functions::isDateInFiscalYear( date( 'Y-m-d H:i:s' ) ) === 0 ) { - echo '
'; - echo '

' . __( 'The fiscal year has passed or not arrived. Please check the fiscal year settings in Hesabix.', 'ssbhesabix' ) . '

'; - echo '
'; - - update_option( 'ssbhesabix_live_mode', 0 ); - } - - //check the Hesabix default currency - $default_currency = $ssbhesabix_api->settingGetCurrency(); - if ( $default_currency->Success ) { - - $woocommerce_currency = get_woocommerce_currency(); - $hesabix_currency = $default_currency->Result->moneyName; - if ( $hesabix_currency == $woocommerce_currency || ( $hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT' ) || ( $hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR' ) ) { - update_option( 'ssbhesabix_hesabix_default_currency', $hesabix_currency ); - } else { - update_option( 'ssbhesabix_hesabix_default_currency', 0 ); - update_option( 'ssbhesabix_live_mode', 0 ); - - echo '
'; - echo '

' . __( 'Hesabix and WooCommerce default currency must be same.', 'ssbhesabix' ); - echo '

'; - } - } else { - echo '
'; - echo '

' . __( 'Cannot check the Hesabix default currency. Error Message: ', 'ssbhesabix' ) . $default_currency->ErrorMessage . '

'; - echo '
'; - - HesabixLogService::log( array( "Cannot check the Hesabix default currency. Error Message: $default_currency->ErrorMessage. Error Code: $default_currency->ErrorCode" ) ); - } - - if ( get_option( 'ssbhesabix_live_mode' ) ) { - echo '
'; - echo '

' . __( 'API Setting updated. Test Successfully', 'ssbhesabix' ) . '

'; - echo '
'; - } - - //add gift wrapping service - $wpFaService = new HesabixWpFaService(); - $wpFa = $wpFaService->getWpFa('gift_wrapping', 0); - if(!$wpFa) { - $gift_wrapping = $ssbhesabix_api->itemSave(array( - 'name' => 'خدمات بسته بندی هدیه', - 'khadamat' => 1, - 'Tag' => json_encode(array('id_product' => 0, 'id_attribute' => 0)) - )); - - if($gift_wrapping->Success) { - $wpFa = new WpFa(); - $wpFa->idPs = 0; - $wpFa->idPsAttribute = 0; - $wpFa->idHesabix = $gift_wrapping->code; - $wpFa->objType = 'gift_wrapping'; - $wpFaService->save($wpFa); - $msg = 'Hesabix Gift wrapping service added successfully. Service Code: ' . $gift_wrapping->Result->Code; - HesabixLogService::writeLogStr($msg); - } else { - $msg = 'Cannot set Gift wrapping service code. Error Message: ' . $gift_wrapping->ErrorMessage . ', Error Code: ' . $gift_wrapping->ErrorCode; - HesabixLogService::writeLogStr($msg); - } - } - } else { - update_option( 'ssbhesabix_live_mode', 0 ); - - if ( $response->ErrorCode === 108 ) { - echo '
'; - echo '

' . __( 'Cannot connect to Hesabix. Business expired.', 'ssbhesabix' ) . $response->ErrorMessage . '

'; - echo '
'; - update_option( 'ssbhesabix_business_expired', 1 ); - } else { - echo '
'; - echo '

' . __( 'Cannot set Hesabix webHook. Error Message:', 'ssbhesabix' ) . $response->ErrorMessage . '

'; - echo '
'; - update_option( 'ssbhesabix_business_expired', 0 ); - } - - HesabixLogService::log( array("Cannot set Hesabix webHook. Error Message: $response->ErrorMessage. Error Code: $response->ErrorCode") ); - } - } else { - update_option( 'ssbhesabix_live_mode', 0 ); - - echo '
'; - echo '

' . __( 'Cannot connect to Hesabix servers. Please check your Internet connection', 'ssbhesabix' ) . '

'; - echo '
'; - - HesabixLogService::log( array("Cannot connect to hesabix servers. Check your internet connection" ) ); - } - - return $response; - } -//============================================================================================= - public static function ssbhesabix_get_banks() { - $ssbhesabix_api = new Ssbhesabix_Api(); - $banks = $ssbhesabix_api->settingGetBanks(); - - if ( is_object( $banks ) && $banks->Success ) { - $available_banks = array(); - $available_banks[ - 1 ] = __( 'Choose', 'ssbhesabix' ); - foreach ( $banks->Result as $bank ) { - if ( $bank->Currency == get_woocommerce_currency() || ( get_woocommerce_currency() == 'IRT' && $bank->Currency == 'IRR' ) || ( get_woocommerce_currency() == 'IRR' && $bank->Currency == 'IRT' ) ) { - $available_banks[ 'bank'.$bank->Code ] = $bank->Name . ' - ' . $bank->Branch . ' - ' . $bank->AccountNumber; - } - } - - if ( empty( $available_banks ) ) { - $available_banks[0] = __( 'Define at least one bank in Hesabix', 'ssbhesabix' ); - } - - return $available_banks; - } else { - update_option( 'ssbhesabix_live_mode', 0 ); - - echo '
'; - echo '

' . __( 'Cannot get Banks detail.', 'ssbhesabix' ) . '

'; - echo '
'; - - HesabixLogService::log( array("Cannot get banking information. Error Code: $banks->ErrorCode. Error Message: $banks->ErrorMessage." ) ); - - return array( '0' => __( 'Cannot get Banks detail.', 'ssbhesabix' ) ); - } - } -//============================================================================================= - public static function ssbhesabix_get_cashes() { - $ssbhesabix_api = new Ssbhesabix_Api(); - $cashes = $ssbhesabix_api->settingGetCashes(); - - if ( is_object( $cashes ) && $cashes->Success ) { - $available_cashes = array(); - foreach ( $cashes->Result as $cash ) { - if ( $cash->Currency == get_woocommerce_currency() || ( get_woocommerce_currency() == 'IRT' && $cash->Currency == 'IRR' ) || ( get_woocommerce_currency() == 'IRR' && $cash->Currency == 'IRT' ) ) { - $available_cashes[ 'cash'.$cash->Code ] = $cash->Name; - } - } - return $available_cashes; - } - } -//============================================================================================= - public static function ssbhesabix_get_projects() { - $ssbhesabix_api = new Ssbhesabix_Api(); - $projects = $ssbhesabix_api->settingGetProjects(); - - if ( is_object( $projects ) && $projects->Success ) { - $available_projects = array(); - $available_projects[ - 1 ] = __( 'Choose', 'ssbhesabix' ); - foreach ( $projects->data as $project ) { - $available_projects[ $project->id ] = $project->name; - } - - return $available_projects; - } else { - update_option( 'ssbhesabix_live_mode', 0 ); - echo '
'; - echo '

' . __( 'Cannot get Projects detail.', 'ssbhesabix' ) . '

'; - echo '
'; - HesabixLogService::log( array("Cannot get projects information. Error Code:$projects->ErrorCode. Error Message: $projects->ErrorMessage.") ); - - return array( '0' => __( 'Cannot get projects detail.', 'ssbhesabix' ) ); - } - } -//============================================================================================= - public static function ssbhesabix_get_salesmen() { - $ssbhesabix_api = new Ssbhesabix_Api(); - $salesmen = $ssbhesabix_api->settingGetSalesmen(); - - if ( is_object( $salesmen ) && $salesmen->Success ) { - $available_salesmen = array(); - $available_salesmen[ - 1 ] = __( 'Choose', 'ssbhesabix' ); - foreach ( $salesmen->result as $salesman ) { - $available_salesmen[ $salesman->code ] = $salesman->nikename; - } - - return $available_salesmen; - } else { - update_option( 'ssbhesabix_live_mode', 0 ); - echo '
'; - echo '

' . __( 'Cannot get Salesmen detail.', 'ssbhesabix' ) . '

'; - echo '
'; - HesabixLogService::log( array("Cannot get salesmen information. Error Code: $salesmen->ErrorCode Error Message: .$salesmen->ErrorMessage.") ); - - return array( '0' => __( 'Cannot get salesmen detail.', 'ssbhesabix' ) ); - } - } -//============================================================================================= - public static function ssbhesabix_log_setting() { - $cleanLogResult = ( isset( $_GET['cleanLogResult'] ) ) ? wc_clean( $_GET['cleanLogResult'] ) : null; - - if ( ! is_null( $cleanLogResult ) && $cleanLogResult === 'true' ) { - echo '
'; - echo '

' . __( 'The log file was cleared.', 'ssbhesabix' ) . '

'; - echo '
'; - } elseif ( $cleanLogResult === 'false' ) { - echo '
'; - echo '

' . __( 'Log file not found.', 'ssbhesabix' ) . '

'; - echo '
'; - } - - self::ssbhesabix_tab_log_html(); - } -//============================================================================================= - public static function ssbhesabix_tab_log_html() { - ?> -
-
- توجه فرمایید با زدن دکمه پاک کردن کل لاگ ها، تمامی فایل های لاگ ذخیره شده پاک می شوند. -
- در صورت نیاز به پاک کردن فایل لاگ جاری می توانید از دکمه پاک کردن لاگ جاری، زمانی که فایل لاگ مدنظر انتخاب شده است، استفاده کنید. -
- فهرست تاریخچه لاگ ها، لاگ های موجود در سیستم در بازه 10 روز گذشته را نمایش می دهد. -
-

-
-
- -
-
-
- -
-
-
-
-
- -
- "> - - -
-
-
-
- -
-
- "> - -
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
- -
- - - -
-
-
-
-
- 1000 ) { - - $fileSizeInMb = ( ( filesize( WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d") . '.txt' ) / 1000 ) / 1000 ); - $fileSizeInMb = round( $fileSizeInMb, 2 ); - - - $str = __( 'The log file size is large, clean log file.', 'ssbhesabix' ); - - echo '
' . - '

' . $str . ' (' . $fileSizeInMb . 'MB)' . '

' - . '
'; - - } else if ( file_exists( WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d") . '.txt' ) ) { - - $URL = WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d") . '.txt'; - $logFileContent = HesabixLogService::readLog($URL); - } - - echo '
'. - '
-

' . __("Log History", "ssbhesabix") . '

-
-
    '; - for($i = 0 ; $i < 10 ; $i++) { - if( file_exists( WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d", strtotime(-$i."day")) . '.txt' ) ) { - echo '
  • '; - } - } - echo ' -
-
-
'; - echo ''; - echo '
'; -//--------------------------------------- - if(isset($_POST["changeLogFile"])) { - echo - ''; - - $URL = WP_CONTENT_DIR . '/ssbhesabix-' . $_POST["changeLogFile"] . '.txt'; - $logFileContent = HesabixLogService::readLog($URL); - - echo '
'. - '
-

' . __("Log History", "ssbhesabix") . '

-
-
    '; - for($i = 0 ; $i < 10 ; $i++) { - if( file_exists( WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d", strtotime(-$i."day")) . '.txt' ) ) { - echo '
  • '; - } - } - echo ' -
-
-
'; - echo ''; - echo '
'; - } -//--------------------------------------- - if(isset($_POST["deleteLogFiles"])) { - $prefix = WP_CONTENT_DIR . '/ssbhesabix-'; - - $files = glob($prefix . '*'); - if ($files) { - foreach ($files as $file) { - if (is_file($file)) { - if (unlink($file)) { - header("refresh:0"); - } else { - HesabixLogService::writeLogStr("Unable to delete the file"); - } - } - } - } else { - HesabixLogService::writeLogStr("No files found"); - } - } -//--------------------------------------- - if(isset($_POST["ssbhesabix-log-clean-submit"])) { - if($_POST["currentLogFileDate"]) { - $file = WP_CONTENT_DIR . '/ssbhesabix-' . $_POST["currentLogFileDate"] . '.txt'; - } else { - $file = WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d") . '.txt'; - } - if (is_file($file)) { - if (unlink($file)) { - HesabixLogService::writeLogStr("Selected Log File Deleted"); - header("refresh:0"); - } else { - HesabixLogService::writeLogStr("Unable to delete the file"); - } - } - } -//--------------------------------------- - if(isset($_POST["ssbhesabix-delete-logs-between-two-dates"])) { - $startDate = $_POST["ssbhesabix_delete_log_date_from"]; - $endDate = $_POST["ssbhesabix_delete_log_date_to"]; - - $directory = WP_CONTENT_DIR . '/ssbhesabix-'; - $files = glob($directory . '*'); - if($files) { - foreach ($files as $file) { - if(is_file($file)) { - $fileDate = substr($file, strlen($directory), 10); - $dateObj = DateTime::createFromFormat('Y-m-d', $fileDate); - $startObj = DateTime::createFromFormat('Y-m-d', $startDate); - $endObj = DateTime::createFromFormat('Y-m-d', $endDate); - - if ($dateObj >= $startObj && $dateObj <= $endObj) { - HesabixLogService::writeLogStr("Log Files deleted"); - unlink($file); - } - } - } - } - header("refresh:0"); - } -//--------------------------------------- - if(isset($_POST["ssbhesabix-find-log-submit"])) { - echo - ''; - - $URL = WP_CONTENT_DIR . '/ssbhesabix-' . $_POST["ssbhesabix_find_log_date"] . '.txt'; - if ( file_exists( WP_CONTENT_DIR . '/ssbhesabix-' . $_POST["ssbhesabix_find_log_date"] . '.txt' ) && - ( filesize( WP_CONTENT_DIR . '/ssbhesabix-' . $_POST["ssbhesabix_find_log_date"] . '.txt' ) / 1000 ) < 1000 ) { - $logFileContent = HesabixLogService::readLog($URL); - } - - - echo '
'. - '
-

' . __("Log History", "ssbhesabix") . '

-
-
    '; - for($i = 0 ; $i < 10 ; $i++) { - if( file_exists( WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d", strtotime(-$i."day")) . '.txt' ) ) { - echo '
  • '; - } - } - echo ' -
-
-
'; - echo ''; - echo '
'; - } - ?> -
- settingGetWarehouses(); - - if ( is_object( $warehouses->data ) ) { - $available_warehouses = array(); - $available_warehouses[ - 1 ] = __( 'Accounting quantity (Total inventory)', 'ssbhesabix' ); - - return $available_warehouses; - } - - if ( is_object( $warehouses ) && $warehouses->Success ) { - $available_warehouses = array(); - $available_warehouses[ - 1 ] = __( 'Accounting quantity (Total inventory)', 'ssbhesabix' ); - foreach ( $warehouses->data as $warehouse ) { - $available_warehouses[ $warehouse->code ] = $warehouse->name; - } - - return $available_warehouses; - } else { - update_option( 'ssbhesabix_live_mode', 0 ); - echo '
'; - echo '

' . __( 'Cannot get warehouses.', 'ssbhesabix' ) . '

'; - echo '
'; - HesabixLogService::log( array("Cannot get warehouses. Error Code: $warehouses->ErrorCode. Error Message: .$warehouses->ErrorMessage.") ); - - return array( '0' => __( 'Cannot get warehouses.', 'ssbhesabix' ) ); - } - } - -} - -Ssbhesabix_Setting::init(); diff --git a/admin/services/HesabixLogService.php b/admin/services/HesabixLogService.php index 0efb931..b3d933f 100644 --- a/admin/services/HesabixLogService.php +++ b/admin/services/HesabixLogService.php @@ -1,12 +1,20 @@ format('[Y-m-d H:i:s] '); $str = $date . $str; @@ -16,7 +24,7 @@ class HesabixLogService public static function writeLogObj($obj) { - $fileName = WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d") . '.txt'; + $fileName = WP_CONTENT_DIR . '/hesabix-' . date("20y-m-d") . '.txt'; ob_start(); var_dump($obj); file_put_contents($fileName, PHP_EOL . ob_get_flush(), FILE_APPEND); @@ -24,10 +32,10 @@ class HesabixLogService public static function log($params) { - $fileName = WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d") . '.txt'; + $fileName = WP_CONTENT_DIR . '/hesabix-' . date("20y-m-d") . '.txt'; $log = ''; - $dateTime = new DateTimeImmutable( 'now', wp_timezone() ); + $dateTime = new DateTimeImmutable('now', wp_timezone()); $date = $dateTime->format('[Y-m-d H:i:s] '); foreach ($params as $message) { @@ -51,7 +59,7 @@ class HesabixLogService public static function clearLog() { - $fileName = WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d") . '.txt'; + $fileName = WP_CONTENT_DIR . '/hesabix-' . date("20y-m-d") . '.txt'; if (file_exists($fileName)) { file_put_contents($fileName, ""); } @@ -59,6 +67,6 @@ class HesabixLogService public static function getLogFilePath() { - return WP_CONTENT_DIR . '/ssbhesabix-' . date("20y-m-d") . '.txt'; + return WP_CONTENT_DIR . '/hesabix-' . date("20y-m-d") . '.txt'; } } \ No newline at end of file diff --git a/admin/services/HesabixWpFaService.php b/admin/services/HesabixWpFaService.php index b39f873..07df003 100644 --- a/admin/services/HesabixWpFaService.php +++ b/admin/services/HesabixWpFaService.php @@ -1,6 +1,14 @@ id = $id; @@ -20,25 +32,28 @@ class WpFa $instance->idHesabix = $idHesabix; $instance->idWp = $idWp; $instance->idWpAttribute = $idWpAttribute; + $instance->uidHesabix = $uidHesabix; return $instance; } } class HesabixWpFaService { - public function __construct() {} - - public function getWpFa($objType, $idWp, $idWpAttribute = 0) + public function __construct() { - if (!isset($objType) || !isset($idWp)) return false; + } + + public function getWpFaByWpId($objType, $idWp, $idWpAttribute = 0) + { + if (!isset($objType) || !isset($idWp)) + return false; global $wpdb; - //$row = $wpdb->get_row("SELECT * FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_ps` = $idWp AND `id_ps_attribute` = $idWpAttribute AND `obj_type` = '$objType'"); $row = $wpdb->get_row( $wpdb->prepare( "SELECT * - FROM {$wpdb->prefix}ssbhesabix + FROM {$wpdb->prefix}hesabix WHERE `id_ps` = %d AND `id_ps_attribute` = %d AND `obj_type` = %s", @@ -49,11 +64,39 @@ class HesabixWpFaService ); - if (isset($row)) return $this->mapWpFa($row); + if (isset($row)) + return $this->mapWpFa($row); return null; } -//========================================================================================================= + + public function getWpFaByHesabixCode($objType, $codehx, $idWpAttribute = 0) + { + if (!isset($objType) || !isset($codehx)) + return false; + + global $wpdb; + + $row = $wpdb->get_row( + $wpdb->prepare( + "SELECT * + FROM {$wpdb->prefix}hesabix + WHERE `id_hesabix` = %d + AND `id_ps_attribute` = %d + AND `obj_type` = %s", + $codehx, + $idWpAttribute, + $objType + ) + ); + + + if (isset($row)) + return $this->mapWpFa($row); + + return null; + } + public function getWpFaSearch($woocommerce_search_code = '', $woocommerce_attribute_search_code = '', $hesabix_search_code = '', $obj_type_search = '') { global $wpdb; @@ -81,7 +124,7 @@ class HesabixWpFaService $params[] = $obj_type_search; } - $sql = "SELECT * FROM {$wpdb->prefix}ssbhesabix"; + $sql = "SELECT * FROM {$wpdb->prefix}hesabix"; if (!empty($conditions)) { $sql .= " WHERE " . implode(" AND ", $conditions); } @@ -99,18 +142,18 @@ class HesabixWpFaService return $wpFaObjects; } -//========================================================================================================= + public function getWpFaByHesabixId($objType, $hesabixId) { - if (!isset($objType) || !isset($hesabixId)) return false; + if (!isset($objType) || !isset($hesabixId)) + return false; global $wpdb; - //$row = $wpdb->get_row("SELECT * FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_hesabix` = $hesabixId AND `obj_type` = '$objType'"); $row = $wpdb->get_row( $wpdb->prepare( "SELECT * - FROM {$wpdb->prefix}ssbhesabix + FROM {$wpdb->prefix}hesabix WHERE `id_hesabix` = %d AND `obj_type` = %s", $hesabixId, @@ -122,19 +165,18 @@ class HesabixWpFaService return $this->mapWpFa($row); return null; } -//========================================================================================================= + public function getWpFaId($objType, $idWp, $idWpAttribute = 0) { if (!isset($objType) || !isset($idWp)) return false; global $wpdb; - //$row = $wpdb->get_row("SELECT `id` FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_ps` = $idWp AND `id_ps_attribute` = $idWpAttribute AND `obj_type` = '$objType'"); $row = $wpdb->get_row( $wpdb->prepare( "SELECT `id` - FROM {$wpdb->prefix}ssbhesabix + FROM {$wpdb->prefix}hesabix WHERE `id_ps` = %d AND `id_ps_attribute` = %d AND `obj_type` = %s", @@ -145,23 +187,22 @@ class HesabixWpFaService ); if (is_object($row)) - return (int)$row->id; + return (int) $row->id; else return false; } -//========================================================================================================= + public function getWpFaIdByHesabixId($objType, $hesabixId) { if (!isset($objType) || !isset($hesabixId)) return false; global $wpdb; - //$row = $wpdb->get_row("SELECT `id` FROM " . $wpdb->prefix . "ssbhesabix WHERE `id_hesabix` = $hesabixId AND `obj_type` = '$objType'"); $row = $wpdb->get_row( $wpdb->prepare( "SELECT `id` - FROM {$wpdb->prefix}ssbhesabix + FROM {$wpdb->prefix}hesabix WHERE `id_hesabix` = %d AND `obj_type` = %s", $hesabixId, @@ -171,47 +212,103 @@ class HesabixWpFaService if (isset($row)) - return (int)$row->id; + return (int) $row->id; return null; } -//========================================================================================================= + public function getProductCodeByWpId($id_product, $id_attribute = 0) { - $obj = $this->getWpFa('product', $id_product, $id_attribute); + $obj = $this->getWpFaByWpId('product', $id_product, $id_attribute); - if ($obj != null) return $obj->idHesabix; + if ($obj != null) + return $obj->idHesabix; return null; } -//========================================================================================================= + + public function getProductUidByWpId($id_product, $id_attribute = 0) + { + $obj = $this->getWpFaByWpId('product', $id_product, $id_attribute); + + if ($obj != null) + return $obj->uidHesabix; + + return null; + } + + public function getProductUidByCode($code) + { + $obj = $this->getWpFaByHesabixCode('product', $code); + + if ($obj != null) + return $obj->uidHesabix; + + $api = new Hesabix_Api(); + $response = $api->apiRequest('api/commodity/info/' . $code); + if ($response->code == $code) { + return $response->id; + } + + return null; + } + public function getCustomerCodeByWpId($id_customer) { - $obj = $this->getWpFa('customer', $id_customer); + $obj = $this->getWpFaByWpId('customer', $id_customer); - if ($obj != null) return $obj->idHesabix; + if ($obj != null) + return $obj->idHesabix; return null; } -//========================================================================================================= + + public function getCustomerUidByWpId($id_customer) + { + $obj = $this->getWpFaByWpId('customer', $id_customer); + + if ($obj != null) + return $obj->uidHesabix; + + return null; + } + + public function getCustomerUidByCode($code_customer) + { + $obj = $this->getWpFaByHesabixCode('customer', $code_customer); + + if ($obj != null) + return $obj->uidHesabix; + + return null; + } + public function getInvoiceCodeByWpId($id_order) { - $obj = $this->getWpFa('order', $id_order); + $obj = $this->getWpFaByWpId('order', $id_order); - if ($obj != null) return $obj->idHesabix; + if ($obj != null) + return $obj->idHesabix; return null; } -//========================================================================================================= + + public function getInvoiceUidByWpId($id_order) + { + $obj = $this->getWpFaByWpId('order', $id_order); + + if ($obj != null) + return $obj->uidHesabix; + + return null; + } + public function getProductAndCombinations($idWp) { global $wpdb; - //$sql = "SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `obj_type` = 'product' AND `id_ps` = '$idWp'"; - //$result = $wpdb->get_results($sql); - $sql = $wpdb->prepare( "SELECT * - FROM {$wpdb->prefix}ssbhesabix + FROM {$wpdb->prefix}hesabix WHERE `obj_type` = 'product' AND `id_ps` = %d", $idWp @@ -228,85 +325,93 @@ class HesabixWpFaService } return null; } -//========================================================================================================= + public function mapWpFa($sqlObj): WpFa { $wpFa = new WpFa(); $wpFa->id = $sqlObj->id; $wpFa->idHesabix = $sqlObj->id_hesabix; + $wpFa->uidHesabix = $sqlObj->uid_hesabix; $wpFa->idWp = $sqlObj->id_ps; $wpFa->idWpAttribute = $sqlObj->id_ps_attribute; $wpFa->objType = $sqlObj->obj_type; return $wpFa; } -//========================================================================================================= + public function saveProduct($item): bool { - $json = json_decode($item->Tag); + $hesabix_code = 0; + $id_product = 0; + $id_attribute = 0; + if (isset($item->code)) + $hesabix_code = (int) $item->code; + if (isset($item->id)) + $hesabix_uid = (int) $item->id; + if (isset($item->tags)) { + $json = $item->tags; + if (isset($json->id_product)) + $id_product = (int) $json->id_product; + if (isset($json->id_attribute)) + $id_attribute = (int) $json->id_attribute; + } + $wpFaService = new HesabixWpFaService(); - $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Code); + $wpFa = $wpFaService->getWpFaByHesabixId('product', $hesabix_code); if (!$wpFa) { - $wpFa = WpFa::newWpFa(0, 'product', (int)$item->Code, (int)$json->id_product, (int)$json->id_attribute); + $wpFa = WpFa::newWpFa(0, 'product', $hesabix_code, $id_product, $id_attribute, $hesabix_uid); $wpFaService->save($wpFa); - HesabixLogService::log(array("Item successfully added. Item code: " . (string)$item->Code . ". Product ID: $json->id_product-$json->id_attribute")); + HesabixLogService::log(array("Item successfully added. Item code: $hesabix_code. Product ID: $id_product-$id_attribute")); } else { - $wpFa->idHesabix = (int)$item->Code; + $wpFa->idHesabix = $hesabix_code; + $wpFa->uidHesabix = $hesabix_uid; $wpFaService->update($wpFa); - HesabixLogService::log(array("Item successfully updated. Item code: " . (string)$item->Code . ". Product ID: $json->id_product-$json->id_attribute")); + HesabixLogService::log(array("Item successfully updated. Item code: $hesabix_code. Product ID: $id_product-$id_attribute")); } return true; } -//========================================================================================================= + public function saveCustomer($customer): bool { - $json = json_decode($customer->Tag); - if ((int)$json->id_customer == 0) return true; + $json = json_decode($customer->tags); + if ((int) $json->id_customer == 0) + return true; - $id = $this->getWpFaId('customer', (int)$json->id_customer); + $id = $this->getWpFaId('customer', (int) $json->id_customer); global $wpdb; if (!$id) { -// $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( -// 'id_hesabix' => (int)$customer->Code, -// 'obj_type' => 'customer', -// 'id_ps' => (int)$json->id_customer -// )); $wpdb->insert( - $wpdb->prefix . 'ssbhesabix', + $wpdb->prefix . 'hesabix', array( - 'id_hesabix' => (int)$customer->Code, + 'id_hesabix' => (int) $customer->code, + 'uid_hesabix' => (int) $customer->id, 'obj_type' => 'customer', - 'id_ps' => (int)$json->id_customer + 'id_ps' => (int) $json->id_customer ), array( + '%d', '%d', '%s', '%d' ) ); - - - HesabixLogService::writeLogStr("Customer successfully added. Customer code: " . (string)$customer->Code . ". Customer ID: $json->id_customer"); + HesabixLogService::writeLogStr("Customer successfully added. Customer code: " . (string) $customer->code . ". Customer ID: $json->id_customer"); } else { -// $wpdb->update($wpdb->prefix . 'ssbhesabix', array( -// 'id_hesabix' => (int)$customer->Code, -// 'obj_type' => 'customer', -// 'id_ps' => (int)$json->id_customer, -// ), array('id' => $id)); - $wpdb->update( - $wpdb->prefix . 'ssbhesabix', + $wpdb->prefix . 'hesabix', array( - 'id_hesabix' => (int)$customer->Code, + 'id_hesabix' => (int) $customer->code, + 'uid_hesabix' => (int) $customer->id, 'obj_type' => 'customer', - 'id_ps' => (int)$json->id_customer, + 'id_ps' => (int) $json->id_customer, ), array('id' => $id), array( + '%d', '%d', '%s', '%d' @@ -314,165 +419,128 @@ class HesabixWpFaService array('%d') ); - HesabixLogService::writeLogStr("Customer successfully updated. Customer code: " . (string)$customer->Code . ". Customer ID: $json->id_customer"); + HesabixLogService::writeLogStr("Customer successfully updated. Customer code: " . (string) $customer->code . ". Customer ID: $json->id_customer"); } return true; } -//========================================================================================================= + public function saveInvoice($invoice, $orderType) { $json = json_decode($invoice->Tag); - $id = $this->getPsFaId('order', (int)$json->id_order); + $id = $this->getPsFaId('order', (int) $json->id_order); - $invoiceNumber = (int)$invoice->Number; + $invoiceNumber = (int) $invoice->Number; $objType = $orderType == 0 ? 'order' : 'returnOrder'; if (!$id) { -// Db::getInstance()->insert('ps_hesabix', array( -// 'id_hesabix' => $invoiceNumber, -// 'obj_type' => $objType, -// 'id_ps' => (int)$json->id_order, -// )); - Db::getInstance()->insert('ps_hesabix', array( 'id_hesabix' => $invoiceNumber, 'obj_type' => $objType, - 'id_ps' => (int)$json->id_order, + 'id_ps' => (int) $json->id_order, )); if ($objType == 'order') - LogService::writeLogStr("Invoice successfully added. invoice number: " . (string)$invoice->Number . ", order id: " . $json->id_order); + LogService::writeLogStr("Invoice successfully added. invoice number: " . (string) $invoice->Number . ", order id: " . $json->id_order); else - LogService::writeLogStr("Return Invoice successfully added. Customer code: " . (string)$invoice->Number . ", order id: " . $json->id_order); + LogService::writeLogStr("Return Invoice successfully added. Customer code: " . (string) $invoice->Number . ", order id: " . $json->id_order); } else { -// Db::getInstance()->update('ps_hesabix', array( -// 'id_hesabix' => $invoiceNumber, -// 'obj_type' => $objType, -// 'id_ps' => (int)$json->id_order, -// ), array('id' => $id), 0, true, true); - - Db::getInstance()->update('ps_hesabix', array( 'id_hesabix' => $invoiceNumber, 'obj_type' => $objType, - 'id_ps' => (int)$json->id_order, + 'id_ps' => (int) $json->id_order, ), array('id' => $id), 0, true, true); - //check if it is order or return order + if ($objType == 'order') - LogService::writeLogStr("Invoice successfully updated. invoice number: " . (string)$invoice->Number . ", order id: " . $json->id_order); + LogService::writeLogStr("Invoice successfully updated. invoice number: " . (string) $invoice->Number . ", order id: " . $json->id_order); else - LogService::writeLogStr("Return Invoice successfully updated. Customer code: " . (string)$invoice->Number . ", order id: " . $json->id_order); + LogService::writeLogStr("Return Invoice successfully updated. Customer code: " . (string) $invoice->Number . ", order id: " . $json->id_order); } return true; } -//========================================================================================================= + public function save(WpFa $wpFa) { global $wpdb; -// $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( -// 'id_hesabix' => $wpFa->idHesabix, -// 'obj_type' => $wpFa->objType, -// 'id_ps' => (int)$wpFa->idWp, -// 'id_ps_attribute' => (int)$wpFa->idWpAttribute, -// )); $wpdb->insert( - $wpdb->prefix . 'ssbhesabix', + $wpdb->prefix . 'hesabix', array( 'id_hesabix' => $wpFa->idHesabix, 'obj_type' => $wpFa->objType, - 'id_ps' => (int)$wpFa->idWp, - 'id_ps_attribute' => (int)$wpFa->idWpAttribute, + 'id_ps' => (int) $wpFa->idWp, + 'id_ps_attribute' => (int) $wpFa->idWpAttribute, + 'uid_hesabix' => (int) $wpFa->uidHesabix, ), array( '%s', '%s', '%d', - '%d' + '%d', + '%s' ) ); } -//========================================================================================================= -// public function update(WpFa $wpFa) -// { -// global $wpdb; -// $wpdb->update($wpdb->prefix . 'ssbhesabix', array( -// 'id_hesabix' => $wpFa->idHesabix, -// 'obj_type' => $wpFa->objType, -// 'id_ps' => (int)$wpFa->idWp, -// 'id_ps_attribute' => (int)$wpFa->idWpAttribute, -// ), array('id' => $wpFa->id)); -// } + public function update(WpFa $wpFa) { global $wpdb; $idHesabix = isset($wpFa->idHesabix) ? sanitize_text_field($wpFa->idHesabix) : ''; + $uidHesabix = isset($wpFa->uidHesabix) ? sanitize_text_field($wpFa->uidHesabix) : ''; $objType = isset($wpFa->objType) ? sanitize_text_field($wpFa->objType) : ''; - $idWp = isset($wpFa->idWp) ? (int)$wpFa->idWp : 0; - $idWpAttribute = isset($wpFa->idWpAttribute) ? (int)$wpFa->idWpAttribute : 0; + $idWp = isset($wpFa->idWp) ? (int) $wpFa->idWp : 0; + $idWpAttribute = isset($wpFa->idWpAttribute) ? (int) $wpFa->idWpAttribute : 0; $wpdb->update( - $wpdb->prefix . 'ssbhesabix', + $wpdb->prefix . 'hesabix', array( 'id_hesabix' => $idHesabix, 'obj_type' => $objType, 'id_ps' => $idWp, 'id_ps_attribute' => $idWpAttribute, + 'uid_hesabix' => $uidHesabix, ), array('id' => $wpFa->id), array( '%s', '%s', '%d', - '%d' + '%d', + '%s' ), array('%d') ); } -//========================================================================================================= -// public function delete(WpFa $wpFa) -// { -// global $wpdb; -// $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id' => $wpFa->id)); -// } public function delete(WpFa $wpFa) { global $wpdb; - $id = isset($wpFa->id) ? (int)$wpFa->id : 0; + $id = isset($wpFa->id) ? (int) $wpFa->id : 0; $wpdb->delete( - $wpdb->prefix . 'ssbhesabix', + $wpdb->prefix . 'hesabix', array('id' => $id), array('%d') ); } -//========================================================================================================= -// public function deleteAll($productId) -// { -// global $wpdb; -// $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id_ps' => $productId)); -// } + public function deleteAll($productId) { global $wpdb; - $productId = isset($productId) ? (int)$productId : 0; + $productId = isset($productId) ? (int) $productId : 0; $wpdb->delete( - $wpdb->prefix . 'ssbhesabix', + $wpdb->prefix . 'hesabix', array('id_ps' => $productId), array('%d') ); } - -//========================================================================================================= } \ No newline at end of file diff --git a/admin/services/hesabixCustomerService.php b/admin/services/hesabixCustomerService.php new file mode 100644 index 0000000..2179760 --- /dev/null +++ b/admin/services/hesabixCustomerService.php @@ -0,0 +1,235 @@ +get_first_name() ?: $customer->get_billing_first_name(); + $lastName = $customer->get_last_name() ?: $customer->get_billing_last_name(); + $name = trim($firstName . ' ' . $lastName); + if (empty($name)) $name = __('Not Defined', 'hesabix'); + + $checkout_fields = HesabixCustomerService::getAdditionalCheckoutFileds($id_order); + $NationalCode = $checkout_fields['NationalCode'] ?? ''; + $EconomicCode = $checkout_fields['EconomicCode'] ?? ''; + $RegistrationNumber = $checkout_fields['RegistrationNumber'] ?? ''; + $Website = $checkout_fields['Website'] ?? ''; + $nodeFamily = get_option('hesabix_contact_automatic_save_node_family') === 'yes' + ? __('Persons:', 'hesabix') . get_option('hesabix_contact_node_family') : null; + + if ($type === 'shipping') { + $country_code = $order->get_shipping_country(); + $state_code = $order->get_shipping_state(); + $fullAddress = $order->get_shipping_address_1() . '-' . $order->get_shipping_address_2(); + $city = $order->get_shipping_city(); + $postalCode = $order->get_shipping_postcode(); + } else { + $country_code = $order->get_billing_country(); + $state_code = $order->get_billing_state(); + $fullAddress = $order->get_billing_address_1() . '-' . $order->get_billing_address_2(); + $city = $order->get_billing_city(); + $postalCode = $order->get_billing_postcode(); + } + + if (strlen($fullAddress) < 5) { + $fullAddress = $customer->get_billing_address_1() . '-' . $customer->get_billing_address_2(); + } + if (empty($postalCode)) { + $postalCode = $customer->get_billing_postcode(); + } + + if (preg_match('/^\d+$/', $city)) { + $func = new Hesabix_Admin_Functions(); + $city = $func->convertCityCodeToName($city); + } + + $country_name = self::$countries[$country_code] ?? ''; + $state_name = self::$states[$country_code][$state_code] ?? ''; + + $hesabixCustomer = [ + 'nikename' => $name, + 'name' => Hesabix_Validation::contactFirstNameValidation($firstName) . Hesabix_Validation::contactLastNameValidation($lastName), + 'des' => __('Customer ID in OnlineStore: ', 'hesabix') . $id_customer, + 'tel' => (strlen(preg_replace('/\D/', '', $customer->get_billing_phone())) === 11) + ? Hesabix_Validation::contactPhoneValidation($customer->get_billing_phone()) + : '', + 'mobile' => '', + 'mobile2' => '', + 'address' => Hesabix_Validation::contactAddressValidation($fullAddress), + 'company' => '', + 'shenasemeli' => $NationalCode, + 'codeeghtesadi'=> $EconomicCode, + 'sabt' => $RegistrationNumber, + 'keshvar' => Hesabix_Validation::contactCountryValidation($country_name), + 'ostan' => Hesabix_Validation::contactStateValidation($state_name), + 'shahr' => Hesabix_Validation::contactCityValidation($city), + 'postalcode' => Hesabix_Validation::contactPostalCodeValidation($postalCode), + 'email' => Hesabix_Validation::contactEmailValidation($customer->get_email()), + 'website' => $Website, + 'fax' => '', + 'code' => (int) $code ?: 0, + 'types' => [ + [ 'label' => __('Customer', 'hesabix'), 'code' => 'customer', 'checked' => true ], + [ 'label' => __('Marketer', 'hesabix'), 'code' => 'marketer', 'checked' => false ], + [ 'label' => __('Employee', 'hesabix'), 'code' => 'emplyee', 'checked' => false ], + [ 'label' => __('Supplier', 'hesabix'),'code' => 'supplier', 'checked' => false ], + [ 'label' => __('Colleague', 'hesabix'), 'code' => 'colleague', 'checked' => false ], + [ 'label' => __('Salesman', 'hesabix'), 'code' => 'salesman', 'checked' => false ], + ], + 'accounts' => [], + 'prelabel' => null, + 'speedAccess' => false, + 'tags' => json_encode([ + 'id_customer' => $id_customer + ]) + ]; + + return self::correctCustomerData($hesabixCustomer); + } + public static function mapGuestCustomer($code, $id_order): array + { + $order = new WC_Order($id_order); + + $name = $order->get_billing_first_name() . ' ' . $order->get_billing_last_name(); + if (empty($order->get_billing_first_name()) && empty($order->get_billing_last_name())) { + $name = __('Guest Customer', 'hesabix'); + } + $nodeFamily = get_option('hesabix_contact_automatic_save_node_family') == 'yes'? __('Persons:', 'hesabix') . get_option('hesabix_contact_node_family') :null; + + $checkout_fields = hesabixCustomerService::getAdditionalCheckoutFileds($id_order); + $NationalCode = $checkout_fields['NationalCode']; + $EconomicCode = $checkout_fields['EconomicCode']; + $RegistrationNumber = $checkout_fields['RegistrationNumber']; + $Website = $checkout_fields['Website']; + + WC()->countries->countries[ $order->shipping_country ]; + $country_name = WC()->countries->countries[ $order->get_billing_country() ]; + $states = WC()->countries->get_states( $order->get_billing_country() ); + $state_name = $states[ $order->get_billing_state() ]; + if(!$state_name) $state_name = WC()->countries->states[$order->billing_country][$order->billing_state]; + if(!$state_name) $state_name = $order->get_billing_state(); + + $city = $order->get_billing_city(); + if(preg_match('/^[0-9]+$/', $city)) { + $func = new Hesabix_Admin_Functions(); + $city = $func->convertCityCodeToName($order->get_billing_city()); + } + + $fullAddress = $order->get_billing_address_1() . '-' . $order->get_billing_address_2(); + + $hesabixCustomer = array( + 'Code' => $code, + 'Name' => $name, + 'FirstName' => Hesabix_Validation::contactFirstNameValidation($order->get_billing_first_name()), + 'LastName' => Hesabix_Validation::contactLastNameValidation($order->get_billing_last_name()), + 'ContactType' => 1, + 'NationalCode' => $NationalCode, + 'EconomicCode' => $EconomicCode, + 'RegistrationNumber' => $RegistrationNumber, + 'Website' => $Website, + 'NodeFamily' => $nodeFamily, + 'Address' => Hesabix_Validation::contactAddressValidation($fullAddress), + 'City' => Hesabix_Validation::contactCityValidation($city), + 'State' => Hesabix_Validation::contactStateValidation($state_name), + 'Country' => Hesabix_Validation::contactCountryValidation($country_name), + 'PostalCode' => Hesabix_Validation::contactPostalCodeValidation($order->get_billing_postcode()), + 'Phone' => Hesabix_Validation::contactPhoneValidation($order->get_billing_phone()), + 'Email' => Hesabix_Validation::contactEmailValidation($order->get_billing_email()), + 'Tag' => json_encode(array('id_customer' => 0)), + 'Note' => __('Customer registered as a GuestCustomer.', 'hesabix'), + ); + + return self::correctCustomerData($hesabixCustomer); + } + + private static function getMobileFromPhone($phone) { + if(preg_match("/^09\d{9}$/", $phone)) + return $phone; + else if(preg_match("/^9\d{9}$/", $phone)) + return '0' . $phone; + else if(preg_match("/^989\d{9}$/", $phone)) + return str_replace('98', '0' ,$phone); + else return ''; + } + + private static function correctCustomerData($hesabixCustomer) { + if($hesabixCustomer["Phone"] == '') + unset($hesabixCustomer["Phone"]); + else { + $mobile = self::getMobileFromPhone($hesabixCustomer["Phone"]); + + if($mobile) $hesabixCustomer["Mobile"] = $mobile; + } + + if($hesabixCustomer["Email"] == '') unset($hesabixCustomer["Email"]); + if($hesabixCustomer["Address"] == '') unset($hesabixCustomer["Address"]); + if($hesabixCustomer["PostalCode"] == '') unset($hesabixCustomer["PostalCode"]); + if($hesabixCustomer["City"] == '') unset($hesabixCustomer["City"]); + if($hesabixCustomer["State"] == '') unset($hesabixCustomer["State"]); + if($hesabixCustomer["Country"] == '') unset($hesabixCustomer["Country"]); + + return $hesabixCustomer; + } + + private static function getCountriesAndStates() + { + if (!isset(self::$countries)) { + $countries_obj = new WC_Countries(); + self::$countries = $countries_obj->get_countries(); + self::$states = $countries_obj->get_states(); + } + } + + private static function getAdditionalCheckoutFileds($id_order) { + $NationalCode = '_billing_hesabix_nationalcode'; + $EconomicCode = '_billing_hesabix_economiccode'; + $RegistrationNumber = '_billing_hesabix_registerationnumber'; + $Website = '_billing_hesabix_website'; + $NationalCode_isActive = get_option('hesabix_contact_NationalCode_checkbox_hesabix'); + $EconomicCode_isActive = get_option('hesabix_contact_EconomicCode_checkbox_hesabix'); + $RegistrationNumber_isActive = get_option('hesabix_contact_RegistrationNumber_checkbox_hesabix'); + $Website_isActive = get_option('hesabix_contact_Website_checkbox_hesabix'); + $add_additional_fileds = get_option('hesabix_contact_add_additional_checkout_fields_hesabix'); + $fields = array(); + + if($add_additional_fileds == '1') { + $fields['NationalCode'] = get_post_meta( $id_order, $NationalCode, true) ?? null; + $fields['EconomicCode'] = get_post_meta( $id_order, $EconomicCode, true) ?? null; + $fields['RegistrationNumber'] = get_post_meta( $id_order, $RegistrationNumber, true) ?? null; + $fields['Website'] = get_post_meta( $id_order, $Website, true) ?? null; + } elseif($add_additional_fileds == '2') { + $NationalCode = get_option('hesabix_contact_NationalCode_text_hesabix'); + $EconomicCode = get_option('hesabix_contact_EconomicCode_text_hesabix'); + $RegistrationNumber = get_option('hesabix_contact_RegistrationNumber_text_hesabix'); + $Website = get_option('hesabix_contact_Website_text_hesabix'); + + if($NationalCode_isActive == 'yes' && $NationalCode) + $fields['NationalCode'] = get_post_meta( $id_order, $NationalCode, true) ?? null; + + if($EconomicCode_isActive == 'yes' && $EconomicCode) + $fields['EconomicCode'] = get_post_meta( $id_order, $EconomicCode, true) ?? null; + + if($RegistrationNumber_isActive == 'yes' && $RegistrationNumber) + $fields['RegistrationNumber'] = get_post_meta( $id_order, $RegistrationNumber, true) ?? null; + + if($Website_isActive == 'yes' && $Website) + $fields['Website'] = get_post_meta( $id_order, $Website, true) ?? null; + } + return $fields; + } +} diff --git a/admin/services/hesabixItemService.php b/admin/services/hesabixItemService.php new file mode 100644 index 0000000..6ca79aa --- /dev/null +++ b/admin/services/hesabixItemService.php @@ -0,0 +1,140 @@ +get_category_ids(); + $code = $new ? null : $wpFaService->getProductCodeByWpId($id); + $price = $product->get_regular_price() ? $product->get_regular_price() : $product->get_price(); + + $hesabixItem = array( + 'code' => $code, + 'name' => Hesabix_Validation::itemNameValidation($product->get_title()), + 'khadamat' => $product->is_virtual() == 1 ? 1 : 0, + 'Tag' => json_encode(array('id_product' => $id, 'id_attribute' => 0)) + ); + + if (get_option("hesabix_do_not_update_titles_in_hesabix", "no") === "no") { + $hesabixItem['PurchasesTitle'] = Hesabix_Validation::itemNameValidation($product->get_title()); + $hesabixItem['SalesTitle'] = Hesabix_Validation::itemNameValidation($product->get_title()); + } + + if (!$code || get_option("hesabix_do_not_update_product_price_in_hesabix", "no") === "no") + $hesabixItem["priceSell"] = self::getPriceInHesabixDefaultCurrency($price); + if (get_option("hesabix_do_not_update_product_barcode_in_hesabix", "no") === "no") + $hesabixItem["barcodes"] = Hesabix_Validation::itemBarcodeValidation($product->get_sku()); + if (get_option("hesabix_do_not_update_product_category_in_hesabix", "no") === "no") + if ($categories) + $hesabixItem["NodeFamily"] = self::getCategoryPath($categories[0]); + if (get_option("hesabix_do_not_update_product_product_code_in_hesabix", "no") === "no") + $hesabixItem["ProductCode"] = $id; + + return $hesabixItem; + } + + public static function mapProductVariation($product, $variation, $id_product, $new = true) + { + $wpFaService = new HesabixWpFaService(); + + $id_attribute = $variation->get_id(); + $categories = $product->get_category_ids(); + $code = $new ? null : $wpFaService->getProductCodeByWpId($id_product, $id_attribute); + + $productName = $product->get_title(); + $variationName = $variation->get_attribute_summary(); + + if (get_option("hesabix_remove_attributes_titles") == "yes" || get_option("hesabix_remove_attributes_titles") == "1") { + $values = self::getAttributesValues($variationName); + $fullName = Hesabix_Validation::itemNameValidation($productName . ' - ' . implode(", ", $values)); + } else { + $fullName = Hesabix_Validation::itemNameValidation($productName . ' - ' . $variationName); + } + + $price = $variation->get_regular_price() ? $variation->get_regular_price() : $variation->get_price(); + + $hesabixItem = array( + 'code' => $code, + 'name' => $fullName, + 'khadamat' => $variation->is_virtual() == 1 ? 1 : 0, + 'Tag' => json_encode(array( + 'id_product' => $id_product, + 'id_attribute' => $id_attribute + )), + ); + + if (get_option("hesabix_do_not_update_titles_in_hesabix", "no") === "no") { + $hesabixItem['PurchasesTitle'] = $fullName; + $hesabixItem['SalesTitle'] = $fullName; + } + + if (!$code || get_option("hesabix_do_not_update_product_price_in_hesabix", "no") === "no") + $hesabixItem["SellPrice"] = self::getPriceInHesabixDefaultCurrency($price); + if (get_option("hesabix_do_not_update_product_barcode_in_hesabix", "no") === "no") + $hesabixItem["Barcode"] = Hesabix_Validation::itemBarcodeValidation($variation->get_sku()); + if (get_option("hesabix_do_not_update_product_category_in_hesabix", "no") === "no") + $hesabixItem["NodeFamily"] = self::getCategoryPath($categories[0]); + if (get_option("hesabix_do_not_update_product_product_code_in_hesabix", "no") === "no") + $hesabixItem["ProductCode"] = $id_attribute; + + return $hesabixItem; + } + + public static function getAttributesValues($variationName) + { + $pairs = explode(",", $variationName); + + $values = array(); + foreach ($pairs as $pair) { + list($title, $value) = explode(":", $pair); + $values[] = trim($value); + } + return $values; + } + + public static function getPriceInHesabixDefaultCurrency($price) + { + if (!isset($price)) + return false; + + $woocommerce_currency = get_woocommerce_currency(); + $hesabix_currency = get_option('hesabix_hesabix_default_currency'); + + if (!is_numeric($price)) + $price = intval($price); + + if ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT') + $price *= 10; + + if ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR') + $price /= 10; + + return $price; + } + + public static function getCategoryPath($id_category) + { + if (!isset($id_category)) + return ''; + + $path = get_term_parents_list($id_category, 'product_cat', array( + 'format' => 'name', + 'separator' => ':', + 'link' => false, + 'inclusive' => true, + )); + + return substr('products: ' . $path, 0, -1); + } + +} \ No newline at end of file diff --git a/admin/services/ssbhesabixCustomerService.php b/admin/services/ssbhesabixCustomerService.php deleted file mode 100644 index fb40ba8..0000000 --- a/admin/services/ssbhesabixCustomerService.php +++ /dev/null @@ -1,276 +0,0 @@ -get_first_name() ? $customer->get_first_name() : $customer->get_billing_first_name(); - $lastName = $customer->get_last_name() ? $customer->get_last_name() : $customer->get_billing_last_name(); - $name = $firstName . ' ' . $lastName; - $nodeFamily = get_option('ssbhesabix_contact_automatic_save_node_family') == 'yes'? 'اشخاص :' . get_option('ssbhesabix_contact_node_family') : null; - - //checkout fields - $checkout_fields = ssbhesabixCustomerService::getAdditionalCheckoutFileds($id_order); - $NationalCode = $checkout_fields['NationalCode']; - $EconomicCode = $checkout_fields['EconomicCode']; - $RegistrationNumber = $checkout_fields['RegistrationNumber']; - $Website = $checkout_fields['Website']; - - if($NationalCode === false) $NationalCode = ''; - if($EconomicCode === false) $EconomicCode = ''; - if($RegistrationNumber === false) $RegistrationNumber = ''; - if($Website === false) $Website = ''; - - if (empty($name) || $name === ' ') $name = __('Not Defined', 'ssbhesabix'); - - $hesabixCustomer = array(); - - switch ($type) { - case 'first': - // - case 'billing': - $country_name = self::$countries[$order->get_billing_country()]; - $state_name = self::$states[$order->get_billing_country()][$order->get_billing_state()]; - $fullAddress = $order->get_billing_address_1() . '-' . $order->get_billing_address_2(); - $postalCode = $order->get_billing_postcode(); - if(strlen($fullAddress) < 5) { - $fullAddress = $customer->get_billing_address_1() . '-' . $customer->get_billing_address_2(); - } - if(empty($country_name)) - $country_name = self::$countries[$customer->get_billing_country()]; - if(empty($state_name)) - $state_name = self::$states[$customer->get_billing_country()][$customer->get_billing_state()]; - if(empty($postalCode)) - $postalCode = $customer->get_billing_postcode(); - - $city = $order->get_billing_city(); - if(preg_match('/^[0-9]+$/', $city)) { - $func = new Ssbhesabix_Admin_Functions(); - $city = $func->convertCityCodeToName($order->get_billing_city()); - } - - $hesabixCustomer = array( - 'code' => $code, - 'nikename' => $name, - 'name' => Ssbhesabix_Validation::contactFirstNameValidation($firstName) . Ssbhesabix_Validation::contactLastNameValidation($lastName), - 'ContactType' => 1, - 'NodeFamily' => $nodeFamily, - 'shenasemeli' => $NationalCode, - 'codeeghtesadi' => $EconomicCode, - 'RegistrationNumber' => $RegistrationNumber, - 'website' => $Website, - 'address' => Ssbhesabix_Validation::contactAddressValidation($fullAddress), - 'shahr' => Ssbhesabix_Validation::contactCityValidation($city), - 'ostan' => Ssbhesabix_Validation::contactStateValidation($state_name), - 'keshvar' => Ssbhesabix_Validation::contactCountryValidation($country_name), - 'postalcode' => Ssbhesabix_Validation::contactPostalCodeValidation($postalCode), - 'tel' => Ssbhesabix_Validation::contactPhoneValidation($customer->get_billing_phone()), - 'emal' => Ssbhesabix_Validation::contactEmailValidation($customer->get_email()), - 'Tag' => json_encode(array('id_customer' => $id_customer)), - 'des' => __('Customer ID in OnlineStore: ', 'ssbhesabix') . $id_customer, - 'types' => [ - [ - 'checked'=>true, - 'code'=>'customer' - ] - ] - ); - break; - case 'shipping': - $country_name = self::$countries[$order->get_shipping_country()]; - $state_name = self::$states[$order->get_shipping_country()][$order->get_shipping_state()]; - $fullAddress = $order->get_shipping_address_1() . ' - ' . $order->get_shipping_address_2(); - $postalCode = $order->get_shipping_postcode(); - - if(strlen($fullAddress) < 5) - $fullAddress = $customer->get_billing_address_1() . '-' . $customer->get_billing_address_2(); - if(empty($country_name)) - $country_name = self::$countries[$customer->get_billing_country()]; - if(empty($state_name)) - $state_name = self::$states[$customer->get_billing_country()][$customer->get_billing_state()]; - if(empty($postalCode)) - $postalCode = $customer->get_shipping_postcode(); - - $city = $order->get_shipping_city(); - if(preg_match('/^[0-9]+$/', $city)) { - $func = new Ssbhesabix_Admin_Functions(); - $city = $func->convertCityCodeToName($order->get_shipping_city()); - } - - $hesabixCustomer = array( - 'code' => $code, - 'nikename' => $name, - 'name' => Ssbhesabix_Validation::contactFirstNameValidation($firstName) . Ssbhesabix_Validation::contactLastNameValidation($lastName), - 'ContactType' => 1, - 'NodeFamily' => $nodeFamily, - 'shenasemeli' => $NationalCode, - 'codeeghtesadi' => $EconomicCode, - 'RegistrationNumber' => $RegistrationNumber, - 'website' => $Website, - 'address' => Ssbhesabix_Validation::contactAddressValidation($fullAddress), - 'shahr' => Ssbhesabix_Validation::contactCityValidation($city), - 'ostan' => Ssbhesabix_Validation::contactStateValidation($state_name), - 'keshvar' => Ssbhesabix_Validation::contactCountryValidation($country_name), - 'postalcode' => Ssbhesabix_Validation::contactPostalCodeValidation($postalCode), - 'tel' => Ssbhesabix_Validation::contactPhoneValidation($customer->get_billing_phone()), - 'email' => Ssbhesabix_Validation::contactEmailValidation($customer->get_email()), - 'Tag' => json_encode(array('id_customer' => $id_customer)), - 'des' => __('Customer ID in OnlineStore: ', 'ssbhesabix') . $id_customer, - 'types' => [ - [ - 'checked'=>true, - 'code'=>'customer' - ] - ] - ); - break; - } - - return self::correctCustomerData($hesabixCustomer); - } -//=========================================================================================================== - public static function mapGuestCustomer($code, $id_order): array - { - $order = new WC_Order($id_order); - - $name = $order->get_billing_first_name() . ' ' . $order->get_billing_last_name(); - if (empty($order->get_billing_first_name()) && empty($order->get_billing_last_name())) { - $name = __('Guest Customer', 'ssbhesabix'); - } - $nodeFamily = get_option('ssbhesabix_contact_automatic_save_node_family') == 'yes'? 'اشخاص :' . get_option('ssbhesabix_contact_node_family') :null; - - //checkout fields - $checkout_fields = ssbhesabixCustomerService::getAdditionalCheckoutFileds($id_order); - $NationalCode = $checkout_fields['NationalCode']; - $EconomicCode = $checkout_fields['EconomicCode']; - $RegistrationNumber = $checkout_fields['RegistrationNumber']; - $Website = $checkout_fields['Website']; - -// $country_name = self::$countries[$order->get_billing_country()]; -// $state_name = self::$states[$order->get_billing_state()]; - - - WC()->countries->countries[ $order->shipping_country ]; - $country_name = WC()->countries->countries[ $order->get_billing_country() ]; - $states = WC()->countries->get_states( $order->get_billing_country() ); - $state_name = $states[ $order->get_billing_state() ]; - if(!$state_name) $state_name = WC()->countries->states[$order->billing_country][$order->billing_state]; - if(!$state_name) $state_name = $order->get_billing_state(); - - $city = $order->get_billing_city(); - if(preg_match('/^[0-9]+$/', $city)) { - $func = new Ssbhesabix_Admin_Functions(); - $city = $func->convertCityCodeToName($order->get_billing_city()); - } - - $fullAddress = $order->get_billing_address_1() . '-' . $order->get_billing_address_2(); - - $hesabixCustomer = array( - 'Code' => $code, - 'Name' => $name, - 'FirstName' => Ssbhesabix_Validation::contactFirstNameValidation($order->get_billing_first_name()), - 'LastName' => Ssbhesabix_Validation::contactLastNameValidation($order->get_billing_last_name()), - 'ContactType' => 1, - 'NationalCode' => $NationalCode, - 'EconomicCode' => $EconomicCode, - 'RegistrationNumber' => $RegistrationNumber, - 'Website' => $Website, - 'NodeFamily' => $nodeFamily, - 'Address' => Ssbhesabix_Validation::contactAddressValidation($fullAddress), - 'City' => Ssbhesabix_Validation::contactCityValidation($city), - 'State' => Ssbhesabix_Validation::contactStateValidation($state_name), - 'Country' => Ssbhesabix_Validation::contactCountryValidation($country_name), - 'PostalCode' => Ssbhesabix_Validation::contactPostalCodeValidation($order->get_billing_postcode()), - 'Phone' => Ssbhesabix_Validation::contactPhoneValidation($order->get_billing_phone()), - 'Email' => Ssbhesabix_Validation::contactEmailValidation($order->get_billing_email()), - 'Tag' => json_encode(array('id_customer' => 0)), - 'Note' => __('Customer registered as a GuestCustomer.', 'ssbhesabix'), - ); - - return self::correctCustomerData($hesabixCustomer); - } -//=========================================================================================================== - private static function getMobileFromPhone($phone) { - if(preg_match("/^09\d{9}$/", $phone)) - return $phone; - else if(preg_match("/^9\d{9}$/", $phone)) - return '0' . $phone; - else if(preg_match("/^989\d{9}$/", $phone)) - return str_replace('98', '0' ,$phone); - else return ''; - } -//=========================================================================================================== - private static function correctCustomerData($hesabixCustomer) { - if($hesabixCustomer["Phone"] == '') - unset($hesabixCustomer["Phone"]); - else { - $mobile = self::getMobileFromPhone($hesabixCustomer["Phone"]); - - if($mobile) $hesabixCustomer["Mobile"] = $mobile; - } - - if($hesabixCustomer["Email"] == '') unset($hesabixCustomer["Email"]); - if($hesabixCustomer["Address"] == '') unset($hesabixCustomer["Address"]); - if($hesabixCustomer["PostalCode"] == '') unset($hesabixCustomer["PostalCode"]); - if($hesabixCustomer["City"] == '') unset($hesabixCustomer["City"]); - if($hesabixCustomer["State"] == '') unset($hesabixCustomer["State"]); - if($hesabixCustomer["Country"] == '') unset($hesabixCustomer["Country"]); - - return $hesabixCustomer; - } -//=========================================================================================================== - private static function getCountriesAndStates() - { - if (!isset(self::$countries)) { - $countries_obj = new WC_Countries(); - self::$countries = $countries_obj->get_countries(); - self::$states = $countries_obj->get_states(); - } - } -//=========================================================================================================== - private static function getAdditionalCheckoutFileds($id_order) { - $NationalCode = '_billing_hesabix_nationalcode'; - $EconomicCode = '_billing_hesabix_economiccode'; - $RegistrationNumber = '_billing_hesabix_registerationnumber'; - $Website = '_billing_hesabix_website'; - $NationalCode_isActive = get_option('ssbhesabix_contact_NationalCode_checkbox_hesabix'); - $EconomicCode_isActive = get_option('ssbhesabix_contact_EconomicCode_checkbox_hesabix'); - $RegistrationNumber_isActive = get_option('ssbhesabix_contact_RegistrationNumber_checkbox_hesabix'); - $Website_isActive = get_option('ssbhesabix_contact_Website_checkbox_hesabix'); - $add_additional_fileds = get_option('ssbhesabix_contact_add_additional_checkout_fields_hesabix'); - $fields = array(); - - // add additional fields to checkout - if($add_additional_fileds == '1') { - $fields['NationalCode'] = get_post_meta( $id_order, $NationalCode, true) ?? null; - $fields['EconomicCode'] = get_post_meta( $id_order, $EconomicCode, true) ?? null; - $fields['RegistrationNumber'] = get_post_meta( $id_order, $RegistrationNumber, true) ?? null; - $fields['Website'] = get_post_meta( $id_order, $Website, true) ?? null; - } elseif($add_additional_fileds == '2') { - $NationalCode = get_option('ssbhesabix_contact_NationalCode_text_hesabix'); - $EconomicCode = get_option('ssbhesabix_contact_EconomicCode_text_hesabix'); - $RegistrationNumber = get_option('ssbhesabix_contact_RegistrationNumber_text_hesabix'); - $Website = get_option('ssbhesabix_contact_Website_text_hesabix'); - - if($NationalCode_isActive == 'yes' && $NationalCode) - $fields['NationalCode'] = get_post_meta( $id_order, $NationalCode, true) ?? null; - - if($EconomicCode_isActive == 'yes' && $EconomicCode) - $fields['EconomicCode'] = get_post_meta( $id_order, $EconomicCode, true) ?? null; - - if($RegistrationNumber_isActive == 'yes' && $RegistrationNumber) - $fields['RegistrationNumber'] = get_post_meta( $id_order, $RegistrationNumber, true) ?? null; - - if($Website_isActive == 'yes' && $Website) - $fields['Website'] = get_post_meta( $id_order, $Website, true) ?? null; - } - return $fields; - } -} diff --git a/admin/services/ssbhesabixItemService.php b/admin/services/ssbhesabixItemService.php deleted file mode 100644 index 1728036..0000000 --- a/admin/services/ssbhesabixItemService.php +++ /dev/null @@ -1,119 +0,0 @@ -get_category_ids(); - $code = $new ? null : $wpFaService->getProductCodeByWpId($id) ; - $price = $product->get_regular_price() ? $product->get_regular_price() : $product->get_price(); - - $hesabixItem = array( - 'code' => $code, - 'name' => Ssbhesabix_Validation::itemNameValidation($product->get_title()), - 'khadamat' => $product->is_virtual() == 1 ? 1 : 0, - 'Tag' => json_encode(array('id_product' => $id, 'id_attribute' => 0)) - ); - - if(get_option("ssbhesabix_do_not_update_titles_in_hesabix", "no") === "no") { - $hesabixItem['PurchasesTitle'] = Ssbhesabix_Validation::itemNameValidation($product->get_title()); - $hesabixItem['SalesTitle'] = Ssbhesabix_Validation::itemNameValidation($product->get_title()); - } - - if(!$code || get_option("ssbhesabix_do_not_update_product_price_in_hesabix", "no") === "no") - $hesabixItem["priceSell"] = self::getPriceInHesabixDefaultCurrency($price); - if(get_option("ssbhesabix_do_not_update_product_barcode_in_hesabix", "no") === "no") - $hesabixItem["barcodes"] = Ssbhesabix_Validation::itemBarcodeValidation($product->get_sku()); - if(get_option("ssbhesabix_do_not_update_product_category_in_hesabix", "no") === "no") - if($categories) $hesabixItem["NodeFamily"] = self::getCategoryPath($categories[0]); - if(get_option("ssbhesabix_do_not_update_product_product_code_in_hesabix", "no") === "no") - $hesabixItem["ProductCode"] = $id; - - return $hesabixItem; - } -//=========================================================================================================== - public static function mapProductVariation($product, $variation, $id_product, $new = true) { - $wpFaService = new HesabixWpFaService(); - - $id_attribute = $variation->get_id(); - $categories = $product->get_category_ids(); - $code = $new ? null : $wpFaService->getProductCodeByWpId($id_product, $id_attribute); - - $productName = $product->get_title(); - $variationName = $variation->get_attribute_summary(); - - if(get_option("ssbhesabix_remove_attributes_titles") == "yes" || get_option("ssbhesabix_remove_attributes_titles") == "1") { - $values = self::getAttributesValues($variationName); - $fullName = Ssbhesabix_Validation::itemNameValidation($productName . ' - ' . implode(", ", $values)); - } else { - $fullName = Ssbhesabix_Validation::itemNameValidation($productName . ' - ' . $variationName); - } - - $price = $variation->get_regular_price() ? $variation->get_regular_price() : $variation->get_price(); - - $hesabixItem = array( - 'code' => $code, - 'name' => $fullName, - 'khadamat' => $variation->is_virtual() == 1 ? 1 : 0, - 'Tag' => json_encode(array( - 'id_product' => $id_product, - 'id_attribute' => $id_attribute - )), - ); - - if(get_option("ssbhesabix_do_not_update_titles_in_hesabix", "no") === "no") { - $hesabixItem['PurchasesTitle'] = $fullName; - $hesabixItem['SalesTitle'] = $fullName; - } - - if(!$code || get_option("ssbhesabix_do_not_update_product_price_in_hesabix", "no") === "no") $hesabixItem["SellPrice"] = self::getPriceInHesabixDefaultCurrency($price); - if(get_option("ssbhesabix_do_not_update_product_barcode_in_hesabix", "no") === "no") $hesabixItem["Barcode"] = Ssbhesabix_Validation::itemBarcodeValidation($variation->get_sku()); - if(get_option("ssbhesabix_do_not_update_product_category_in_hesabix", "no") === "no") $hesabixItem["NodeFamily"] = self::getCategoryPath($categories[0]); - if(get_option("ssbhesabix_do_not_update_product_product_code_in_hesabix", "no") === "no") $hesabixItem["ProductCode"] = $id_attribute; - - return $hesabixItem; - } -//=========================================================================================================== - public static function getAttributesValues($variationName) { - $pairs = explode(",", $variationName); - - $values = array(); - foreach ($pairs as $pair) { - list($title, $value) = explode(":", $pair); - $values[] = trim($value); - } - return $values; - } -//=========================================================================================================== - public static function getPriceInHesabixDefaultCurrency($price) - { - if (!isset($price)) return false; - - $woocommerce_currency = get_woocommerce_currency(); - $hesabix_currency = get_option('ssbhesabix_hesabix_default_currency'); - - if (!is_numeric($price)) $price = intval($price); - - if ($hesabix_currency == 'IRR' && $woocommerce_currency == 'IRT') $price *= 10; - - if ($hesabix_currency == 'IRT' && $woocommerce_currency == 'IRR') $price /= 10; - - return $price; - } -//=========================================================================================================== - public static function getCategoryPath($id_category) - { - if (!isset($id_category)) return ''; - - $path = get_term_parents_list($id_category, 'product_cat', array( - 'format' => 'name', - 'separator' => ':', - 'link' => false, - 'inclusive' => true, - )); - - return substr('products: ' . $path, 0, -1); - } -//=========================================================================================================== -} \ No newline at end of file diff --git a/admin/css/bootstrap.css b/assets/css/bootstrap.css similarity index 93% rename from admin/css/bootstrap.css rename to assets/css/bootstrap.css index 8e6adc8..cd3dad1 100644 --- a/admin/css/bootstrap.css +++ b/assets/css/bootstrap.css @@ -1,10790 +1,10770 @@ -@charset "UTF-8"; -/*! - * Bootstrap v5.0.1 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #6f42c1; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffc107; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-primary: #0d6efd; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffc107; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); -} - -@media (prefers-reduced-motion: no-preference) { - :root { - scroll-behavior: smooth; - } -} - -.h6, .h5, .h4, .h3, .h2, .h1 { - margin-top: 0; - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} - -.h1 { - font-size: calc(1.375rem + 1.5vw); -} -@media (min-width: 1200px) { - .h1 { - font-size: 2.5rem; - } -} - -.h2 { - font-size: calc(1.325rem + 0.9vw); -} -@media (min-width: 1200px) { - .h2 { - font-size: 2rem; - } -} - -.h3 { - font-size: calc(1.3rem + 0.6vw); -} -@media (min-width: 1200px) { - .h3 { - font-size: 1.75rem; - } -} - -.h4 { - font-size: calc(1.275rem + 0.3vw); -} -@media (min-width: 1200px) { - .h4 { - font-size: 1.5rem; - } -} - -.h5 { - font-size: 1.25rem; -} - -.h6 { - font-size: 1rem; -} - -.p { - margin-top: 0; - margin-bottom: 1rem; -} - - -abbr[title], -abbr[data-bs-original-title] { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - -webkit-text-decoration-skip-ink: none; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul { - padding-left: 2rem; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: 0.5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small, .small { - font-size: 0.875em; -} - -mark, .mark { - padding: 0.2em; - background-color: #fcf8e3; -} - -sub, -sup { - position: relative; - font-size: 0.75em; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -a { - color: #0d6efd; - text-decoration: underline; -} -a:hover { - color: #0a58ca; -} - -a:not([href]):not([class]), a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: var(--bs-font-monospace); - font-size: 1em; - direction: ltr /* rtl:ignore */; - unicode-bidi: bidi-override; -} - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - font-size: 0.875em; -} -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -code { - font-size: 0.875em; - color: #d63384; - word-wrap: break-word; -} -a > code { - color: inherit; -} - -kbd { - padding: 0.2rem 0.4rem; - font-size: 0.875em; - color: #fff; - background-color: #212529; - border-radius: 0.2rem; -} -kbd kbd { - padding: 0; - font-size: 1em; - font-weight: 700; -} - -figure { - margin: 0 0 1rem; -} - -img, -svg { - vertical-align: middle; -} - -table { - caption-side: bottom; - border-collapse: collapse; -} - -caption { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - color: #6c757d; - text-align: left; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -thead, -tbody, -tfoot, -tr, -td, -th { - border-color: inherit; - border-style: solid; - border-width: 0; -} - -label { - display: inline-block; -} - -button { - border-radius: 0; -} - -button:focus:not(:focus-visible) { - outline: 0; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -select { - text-transform: none; -} - -[role=button] { - cursor: pointer; -} - -select { - word-wrap: normal; -} -select:disabled { - opacity: 1; -} - -[list]::-webkit-calendar-picker-indicator { - display: none; -} - -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; -} -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { - cursor: pointer; -} - -::-moz-focus-inner { - padding: 0; - border-style: none; -} - -textarea { - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - float: left; - width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: calc(1.275rem + 0.3vw); - line-height: inherit; -} -@media (min-width: 1200px) { - legend { - font-size: 1.5rem; - } -} -legend + * { - clear: left; -} - -::-webkit-datetime-edit-fields-wrapper, -::-webkit-datetime-edit-text, -::-webkit-datetime-edit-minute, -::-webkit-datetime-edit-hour-field, -::-webkit-datetime-edit-day-field, -::-webkit-datetime-edit-month-field, -::-webkit-datetime-edit-year-field { - padding: 0; -} - -::-webkit-inner-spin-button { - height: auto; -} - -[type=search] { - outline-offset: -2px; - -webkit-appearance: textfield; -} - -/* rtl:raw: -[type="tel"], -[type="url"], -[type="email"], -[type="number"] { - direction: ltr; -} -*/ -::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-color-swatch-wrapper { - padding: 0; -} - -::file-selector-button { - font: inherit; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -iframe { - border: 0; -} - -summary { - display: list-item; - cursor: pointer; -} - -progress { - vertical-align: baseline; -} - -[hidden] { - display: none !important; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-size: calc(1.625rem + 4.5vw); - font-weight: 300; - line-height: 1.2; -} -@media (min-width: 1200px) { - .display-1 { - font-size: 5rem; - } -} - -.display-2 { - font-size: calc(1.575rem + 3.9vw); - font-weight: 300; - line-height: 1.2; -} -@media (min-width: 1200px) { - .display-2 { - font-size: 4.5rem; - } -} - -.display-3 { - font-size: calc(1.525rem + 3.3vw); - font-weight: 300; - line-height: 1.2; -} -@media (min-width: 1200px) { - .display-3 { - font-size: 4rem; - } -} - -.display-4 { - font-size: calc(1.475rem + 2.7vw); - font-weight: 300; - line-height: 1.2; -} -@media (min-width: 1200px) { - .display-4 { - font-size: 3.5rem; - } -} - -.display-5 { - font-size: calc(1.425rem + 2.1vw); - font-weight: 300; - line-height: 1.2; -} -@media (min-width: 1200px) { - .display-5 { - font-size: 3rem; - } -} - -.display-6 { - font-size: calc(1.375rem + 1.5vw); - font-weight: 300; - line-height: 1.2; -} -@media (min-width: 1200px) { - .display-6 { - font-size: 2.5rem; - } -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} -.list-inline-item:not(:last-child) { - margin-right: 0.5rem; -} - -.initialism { - font-size: 0.875em; - text-transform: uppercase; -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; -} -.blockquote > :last-child { - margin-bottom: 0; -} - -.blockquote-footer { - margin-top: -1rem; - margin-bottom: 1rem; - font-size: 0.875em; - color: #6c757d; -} -.blockquote-footer::before { - content: "— "; -} - -.img-fluid { - max-width: 100%; - height: auto; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: 0.25rem; - max-width: 100%; - height: auto; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} - -.figure-caption { - font-size: 0.875em; - color: #6c757d; -} - -.container, -.container-fluid, -.container-xxl, -.container-xl, -.container-lg, -.container-md, -.container-sm { - width: 100%; - padding-right: var(--bs-gutter-x, 0.75rem); - padding-left: var(--bs-gutter-x, 0.75rem); - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -@media (min-width: 1400px) { - .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1320px; - } -} -.row { - --bs-gutter-x: 1.5rem; - --bs-gutter-y: 0; - display: flex; - flex-wrap: wrap; - margin-top: calc(var(--bs-gutter-y) * -1); - margin-right: calc(var(--bs-gutter-x) / -2); - margin-left: calc(var(--bs-gutter-x) / -2); -} -.row > * { - flex-shrink: 0; - width: 100%; - max-width: 100%; - padding-right: calc(var(--bs-gutter-x) / 2); - padding-left: calc(var(--bs-gutter-x) / 2); - margin-top: var(--bs-gutter-y); -} - -.col { - flex: 1 0 0%; -} - -.row-cols-auto > * { - flex: 0 0 auto; - width: auto; -} - -.row-cols-1 > * { - flex: 0 0 auto; - width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 auto; - width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 auto; - width: 33.3333333333%; -} - -.row-cols-4 > * { - flex: 0 0 auto; - width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 auto; - width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 auto; - width: 16.6666666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; -} - -.col-1 { - flex: 0 0 auto; - width: 8.3333333333%; -} - -.col-2 { - flex: 0 0 auto; - width: 16.6666666667%; -} - -.col-3 { - flex: 0 0 auto; - width: 25%; -} - -.col-4 { - flex: 0 0 auto; - width: 33.3333333333%; -} - -.col-5 { - flex: 0 0 auto; - width: 41.6666666667%; -} - -.col-6 { - flex: 0 0 auto; - width: 50%; -} - -.col-7 { - flex: 0 0 auto; - width: 58.3333333333%; -} - -.col-8 { - flex: 0 0 auto; - width: 66.6666666667%; -} - -.col-9 { - flex: 0 0 auto; - width: 75%; -} - -.col-10 { - flex: 0 0 auto; - width: 83.3333333333%; -} - -.col-11 { - flex: 0 0 auto; - width: 91.6666666667%; -} - -.col-12 { - flex: 0 0 auto; - width: 100%; -} - -.offset-1 { - margin-left: 8.3333333333%; -} - -.offset-2 { - margin-left: 16.6666666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.3333333333%; -} - -.offset-5 { - margin-left: 41.6666666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.3333333333%; -} - -.offset-8 { - margin-left: 66.6666666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.3333333333%; -} - -.offset-11 { - margin-left: 91.6666666667%; -} - -.g-0, -.gx-0 { - --bs-gutter-x: 0; -} - -.g-0, -.gy-0 { - --bs-gutter-y: 0; -} - -.g-1, -.gx-1 { - --bs-gutter-x: 0.25rem; -} - -.g-1, -.gy-1 { - --bs-gutter-y: 0.25rem; -} - -.g-2, -.gx-2 { - --bs-gutter-x: 0.5rem; -} - -.g-2, -.gy-2 { - --bs-gutter-y: 0.5rem; -} - -.g-3, -.gx-3 { - --bs-gutter-x: 1rem; -} - -.g-3, -.gy-3 { - --bs-gutter-y: 1rem; -} - -.g-4, -.gx-4 { - --bs-gutter-x: 1.5rem; -} - -.g-4, -.gy-4 { - --bs-gutter-y: 1.5rem; -} - -.g-5, -.gx-5 { - --bs-gutter-x: 3rem; -} - -.g-5, -.gy-5 { - --bs-gutter-y: 3rem; -} - -@media (min-width: 576px) { - .col-sm { - flex: 1 0 0%; - } - - .row-cols-sm-auto > * { - flex: 0 0 auto; - width: auto; - } - - .row-cols-sm-1 > * { - flex: 0 0 auto; - width: 100%; - } - - .row-cols-sm-2 > * { - flex: 0 0 auto; - width: 50%; - } - - .row-cols-sm-3 > * { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .row-cols-sm-4 > * { - flex: 0 0 auto; - width: 25%; - } - - .row-cols-sm-5 > * { - flex: 0 0 auto; - width: 20%; - } - - .row-cols-sm-6 > * { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-sm-auto { - flex: 0 0 auto; - width: auto; - } - - .col-sm-1 { - flex: 0 0 auto; - width: 8.3333333333%; - } - - .col-sm-2 { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-sm-3 { - flex: 0 0 auto; - width: 25%; - } - - .col-sm-4 { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .col-sm-5 { - flex: 0 0 auto; - width: 41.6666666667%; - } - - .col-sm-6 { - flex: 0 0 auto; - width: 50%; - } - - .col-sm-7 { - flex: 0 0 auto; - width: 58.3333333333%; - } - - .col-sm-8 { - flex: 0 0 auto; - width: 66.6666666667%; - } - - .col-sm-9 { - flex: 0 0 auto; - width: 75%; - } - - .col-sm-10 { - flex: 0 0 auto; - width: 83.3333333333%; - } - - .col-sm-11 { - flex: 0 0 auto; - width: 91.6666666667%; - } - - .col-sm-12 { - flex: 0 0 auto; - width: 100%; - } - - .offset-sm-0 { - margin-left: 0; - } - - .offset-sm-1 { - margin-left: 8.3333333333%; - } - - .offset-sm-2 { - margin-left: 16.6666666667%; - } - - .offset-sm-3 { - margin-left: 25%; - } - - .offset-sm-4 { - margin-left: 33.3333333333%; - } - - .offset-sm-5 { - margin-left: 41.6666666667%; - } - - .offset-sm-6 { - margin-left: 50%; - } - - .offset-sm-7 { - margin-left: 58.3333333333%; - } - - .offset-sm-8 { - margin-left: 66.6666666667%; - } - - .offset-sm-9 { - margin-left: 75%; - } - - .offset-sm-10 { - margin-left: 83.3333333333%; - } - - .offset-sm-11 { - margin-left: 91.6666666667%; - } - - .g-sm-0, -.gx-sm-0 { - --bs-gutter-x: 0; - } - - .g-sm-0, -.gy-sm-0 { - --bs-gutter-y: 0; - } - - .g-sm-1, -.gx-sm-1 { - --bs-gutter-x: 0.25rem; - } - - .g-sm-1, -.gy-sm-1 { - --bs-gutter-y: 0.25rem; - } - - .g-sm-2, -.gx-sm-2 { - --bs-gutter-x: 0.5rem; - } - - .g-sm-2, -.gy-sm-2 { - --bs-gutter-y: 0.5rem; - } - - .g-sm-3, -.gx-sm-3 { - --bs-gutter-x: 1rem; - } - - .g-sm-3, -.gy-sm-3 { - --bs-gutter-y: 1rem; - } - - .g-sm-4, -.gx-sm-4 { - --bs-gutter-x: 1.5rem; - } - - .g-sm-4, -.gy-sm-4 { - --bs-gutter-y: 1.5rem; - } - - .g-sm-5, -.gx-sm-5 { - --bs-gutter-x: 3rem; - } - - .g-sm-5, -.gy-sm-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 768px) { - .col-md { - flex: 1 0 0%; - } - - .row-cols-md-auto > * { - flex: 0 0 auto; - width: auto; - } - - .row-cols-md-1 > * { - flex: 0 0 auto; - width: 100%; - } - - .row-cols-md-2 > * { - flex: 0 0 auto; - width: 50%; - } - - .row-cols-md-3 > * { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .row-cols-md-4 > * { - flex: 0 0 auto; - width: 25%; - } - - .row-cols-md-5 > * { - flex: 0 0 auto; - width: 20%; - } - - .row-cols-md-6 > * { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-md-auto { - flex: 0 0 auto; - width: auto; - } - - .col-md-1 { - flex: 0 0 auto; - width: 8.3333333333%; - } - - .col-md-2 { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-md-3 { - flex: 0 0 auto; - width: 25%; - } - - .col-md-4 { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .col-md-5 { - flex: 0 0 auto; - width: 41.6666666667%; - } - - .col-md-6 { - flex: 0 0 auto; - width: 50%; - } - - .col-md-7 { - flex: 0 0 auto; - width: 58.3333333333%; - } - - .col-md-8 { - flex: 0 0 auto; - width: 66.6666666667%; - } - - .col-md-9 { - flex: 0 0 auto; - width: 75%; - } - - .col-md-10 { - flex: 0 0 auto; - width: 83.3333333333%; - } - - .col-md-11 { - flex: 0 0 auto; - width: 91.6666666667%; - } - - .col-md-12 { - flex: 0 0 auto; - width: 100%; - } - - .offset-md-0 { - margin-left: 0; - } - - .offset-md-1 { - margin-left: 8.3333333333%; - } - - .offset-md-2 { - margin-left: 16.6666666667%; - } - - .offset-md-3 { - margin-left: 25%; - } - - .offset-md-4 { - margin-left: 33.3333333333%; - } - - .offset-md-5 { - margin-left: 41.6666666667%; - } - - .offset-md-6 { - margin-left: 50%; - } - - .offset-md-7 { - margin-left: 58.3333333333%; - } - - .offset-md-8 { - margin-left: 66.6666666667%; - } - - .offset-md-9 { - margin-left: 75%; - } - - .offset-md-10 { - margin-left: 83.3333333333%; - } - - .offset-md-11 { - margin-left: 91.6666666667%; - } - - .g-md-0, -.gx-md-0 { - --bs-gutter-x: 0; - } - - .g-md-0, -.gy-md-0 { - --bs-gutter-y: 0; - } - - .g-md-1, -.gx-md-1 { - --bs-gutter-x: 0.25rem; - } - - .g-md-1, -.gy-md-1 { - --bs-gutter-y: 0.25rem; - } - - .g-md-2, -.gx-md-2 { - --bs-gutter-x: 0.5rem; - } - - .g-md-2, -.gy-md-2 { - --bs-gutter-y: 0.5rem; - } - - .g-md-3, -.gx-md-3 { - --bs-gutter-x: 1rem; - } - - .g-md-3, -.gy-md-3 { - --bs-gutter-y: 1rem; - } - - .g-md-4, -.gx-md-4 { - --bs-gutter-x: 1.5rem; - } - - .g-md-4, -.gy-md-4 { - --bs-gutter-y: 1.5rem; - } - - .g-md-5, -.gx-md-5 { - --bs-gutter-x: 3rem; - } - - .g-md-5, -.gy-md-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 992px) { - .col-lg { - flex: 1 0 0%; - } - - .row-cols-lg-auto > * { - flex: 0 0 auto; - width: auto; - } - - .row-cols-lg-1 > * { - flex: 0 0 auto; - width: 100%; - } - - .row-cols-lg-2 > * { - flex: 0 0 auto; - width: 50%; - } - - .row-cols-lg-3 > * { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .row-cols-lg-4 > * { - flex: 0 0 auto; - width: 25%; - } - - .row-cols-lg-5 > * { - flex: 0 0 auto; - width: 20%; - } - - .row-cols-lg-6 > * { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-lg-auto { - flex: 0 0 auto; - width: auto; - } - - .col-lg-1 { - flex: 0 0 auto; - width: 8.3333333333%; - } - - .col-lg-2 { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-lg-3 { - flex: 0 0 auto; - width: 25%; - } - - .col-lg-4 { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .col-lg-5 { - flex: 0 0 auto; - width: 41.6666666667%; - } - - .col-lg-6 { - flex: 0 0 auto; - width: 50%; - } - - .col-lg-7 { - flex: 0 0 auto; - width: 58.3333333333%; - } - - .col-lg-8 { - flex: 0 0 auto; - width: 66.6666666667%; - } - - .col-lg-9 { - flex: 0 0 auto; - width: 75%; - } - - .col-lg-10 { - flex: 0 0 auto; - width: 83.3333333333%; - } - - .col-lg-11 { - flex: 0 0 auto; - width: 91.6666666667%; - } - - .col-lg-12 { - flex: 0 0 auto; - width: 100%; - } - - .offset-lg-0 { - margin-left: 0; - } - - .offset-lg-1 { - margin-left: 8.3333333333%; - } - - .offset-lg-2 { - margin-left: 16.6666666667%; - } - - .offset-lg-3 { - margin-left: 25%; - } - - .offset-lg-4 { - margin-left: 33.3333333333%; - } - - .offset-lg-5 { - margin-left: 41.6666666667%; - } - - .offset-lg-6 { - margin-left: 50%; - } - - .offset-lg-7 { - margin-left: 58.3333333333%; - } - - .offset-lg-8 { - margin-left: 66.6666666667%; - } - - .offset-lg-9 { - margin-left: 75%; - } - - .offset-lg-10 { - margin-left: 83.3333333333%; - } - - .offset-lg-11 { - margin-left: 91.6666666667%; - } - - .g-lg-0, -.gx-lg-0 { - --bs-gutter-x: 0; - } - - .g-lg-0, -.gy-lg-0 { - --bs-gutter-y: 0; - } - - .g-lg-1, -.gx-lg-1 { - --bs-gutter-x: 0.25rem; - } - - .g-lg-1, -.gy-lg-1 { - --bs-gutter-y: 0.25rem; - } - - .g-lg-2, -.gx-lg-2 { - --bs-gutter-x: 0.5rem; - } - - .g-lg-2, -.gy-lg-2 { - --bs-gutter-y: 0.5rem; - } - - .g-lg-3, -.gx-lg-3 { - --bs-gutter-x: 1rem; - } - - .g-lg-3, -.gy-lg-3 { - --bs-gutter-y: 1rem; - } - - .g-lg-4, -.gx-lg-4 { - --bs-gutter-x: 1.5rem; - } - - .g-lg-4, -.gy-lg-4 { - --bs-gutter-y: 1.5rem; - } - - .g-lg-5, -.gx-lg-5 { - --bs-gutter-x: 3rem; - } - - .g-lg-5, -.gy-lg-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1200px) { - .col-xl { - flex: 1 0 0%; - } - - .row-cols-xl-auto > * { - flex: 0 0 auto; - width: auto; - } - - .row-cols-xl-1 > * { - flex: 0 0 auto; - width: 100%; - } - - .row-cols-xl-2 > * { - flex: 0 0 auto; - width: 50%; - } - - .row-cols-xl-3 > * { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .row-cols-xl-4 > * { - flex: 0 0 auto; - width: 25%; - } - - .row-cols-xl-5 > * { - flex: 0 0 auto; - width: 20%; - } - - .row-cols-xl-6 > * { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-xl-auto { - flex: 0 0 auto; - width: auto; - } - - .col-xl-1 { - flex: 0 0 auto; - width: 8.3333333333%; - } - - .col-xl-2 { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-xl-3 { - flex: 0 0 auto; - width: 25%; - } - - .col-xl-4 { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .col-xl-5 { - flex: 0 0 auto; - width: 41.6666666667%; - } - - .col-xl-6 { - flex: 0 0 auto; - width: 50%; - } - - .col-xl-7 { - flex: 0 0 auto; - width: 58.3333333333%; - } - - .col-xl-8 { - flex: 0 0 auto; - width: 66.6666666667%; - } - - .col-xl-9 { - flex: 0 0 auto; - width: 75%; - } - - .col-xl-10 { - flex: 0 0 auto; - width: 83.3333333333%; - } - - .col-xl-11 { - flex: 0 0 auto; - width: 91.6666666667%; - } - - .col-xl-12 { - flex: 0 0 auto; - width: 100%; - } - - .offset-xl-0 { - margin-left: 0; - } - - .offset-xl-1 { - margin-left: 8.3333333333%; - } - - .offset-xl-2 { - margin-left: 16.6666666667%; - } - - .offset-xl-3 { - margin-left: 25%; - } - - .offset-xl-4 { - margin-left: 33.3333333333%; - } - - .offset-xl-5 { - margin-left: 41.6666666667%; - } - - .offset-xl-6 { - margin-left: 50%; - } - - .offset-xl-7 { - margin-left: 58.3333333333%; - } - - .offset-xl-8 { - margin-left: 66.6666666667%; - } - - .offset-xl-9 { - margin-left: 75%; - } - - .offset-xl-10 { - margin-left: 83.3333333333%; - } - - .offset-xl-11 { - margin-left: 91.6666666667%; - } - - .g-xl-0, -.gx-xl-0 { - --bs-gutter-x: 0; - } - - .g-xl-0, -.gy-xl-0 { - --bs-gutter-y: 0; - } - - .g-xl-1, -.gx-xl-1 { - --bs-gutter-x: 0.25rem; - } - - .g-xl-1, -.gy-xl-1 { - --bs-gutter-y: 0.25rem; - } - - .g-xl-2, -.gx-xl-2 { - --bs-gutter-x: 0.5rem; - } - - .g-xl-2, -.gy-xl-2 { - --bs-gutter-y: 0.5rem; - } - - .g-xl-3, -.gx-xl-3 { - --bs-gutter-x: 1rem; - } - - .g-xl-3, -.gy-xl-3 { - --bs-gutter-y: 1rem; - } - - .g-xl-4, -.gx-xl-4 { - --bs-gutter-x: 1.5rem; - } - - .g-xl-4, -.gy-xl-4 { - --bs-gutter-y: 1.5rem; - } - - .g-xl-5, -.gx-xl-5 { - --bs-gutter-x: 3rem; - } - - .g-xl-5, -.gy-xl-5 { - --bs-gutter-y: 3rem; - } -} -@media (min-width: 1400px) { - .col-xxl { - flex: 1 0 0%; - } - - .row-cols-xxl-auto > * { - flex: 0 0 auto; - width: auto; - } - - .row-cols-xxl-1 > * { - flex: 0 0 auto; - width: 100%; - } - - .row-cols-xxl-2 > * { - flex: 0 0 auto; - width: 50%; - } - - .row-cols-xxl-3 > * { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .row-cols-xxl-4 > * { - flex: 0 0 auto; - width: 25%; - } - - .row-cols-xxl-5 > * { - flex: 0 0 auto; - width: 20%; - } - - .row-cols-xxl-6 > * { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-xxl-auto { - flex: 0 0 auto; - width: auto; - } - - .col-xxl-1 { - flex: 0 0 auto; - width: 8.3333333333%; - } - - .col-xxl-2 { - flex: 0 0 auto; - width: 16.6666666667%; - } - - .col-xxl-3 { - flex: 0 0 auto; - width: 25%; - } - - .col-xxl-4 { - flex: 0 0 auto; - width: 33.3333333333%; - } - - .col-xxl-5 { - flex: 0 0 auto; - width: 41.6666666667%; - } - - .col-xxl-6 { - flex: 0 0 auto; - width: 50%; - } - - .col-xxl-7 { - flex: 0 0 auto; - width: 58.3333333333%; - } - - .col-xxl-8 { - flex: 0 0 auto; - width: 66.6666666667%; - } - - .col-xxl-9 { - flex: 0 0 auto; - width: 75%; - } - - .col-xxl-10 { - flex: 0 0 auto; - width: 83.3333333333%; - } - - .col-xxl-11 { - flex: 0 0 auto; - width: 91.6666666667%; - } - - .col-xxl-12 { - flex: 0 0 auto; - width: 100%; - } - - .offset-xxl-0 { - margin-left: 0; - } - - .offset-xxl-1 { - margin-left: 8.3333333333%; - } - - .offset-xxl-2 { - margin-left: 16.6666666667%; - } - - .offset-xxl-3 { - margin-left: 25%; - } - - .offset-xxl-4 { - margin-left: 33.3333333333%; - } - - .offset-xxl-5 { - margin-left: 41.6666666667%; - } - - .offset-xxl-6 { - margin-left: 50%; - } - - .offset-xxl-7 { - margin-left: 58.3333333333%; - } - - .offset-xxl-8 { - margin-left: 66.6666666667%; - } - - .offset-xxl-9 { - margin-left: 75%; - } - - .offset-xxl-10 { - margin-left: 83.3333333333%; - } - - .offset-xxl-11 { - margin-left: 91.6666666667%; - } - - .g-xxl-0, -.gx-xxl-0 { - --bs-gutter-x: 0; - } - - .g-xxl-0, -.gy-xxl-0 { - --bs-gutter-y: 0; - } - - .g-xxl-1, -.gx-xxl-1 { - --bs-gutter-x: 0.25rem; - } - - .g-xxl-1, -.gy-xxl-1 { - --bs-gutter-y: 0.25rem; - } - - .g-xxl-2, -.gx-xxl-2 { - --bs-gutter-x: 0.5rem; - } - - .g-xxl-2, -.gy-xxl-2 { - --bs-gutter-y: 0.5rem; - } - - .g-xxl-3, -.gx-xxl-3 { - --bs-gutter-x: 1rem; - } - - .g-xxl-3, -.gy-xxl-3 { - --bs-gutter-y: 1rem; - } - - .g-xxl-4, -.gx-xxl-4 { - --bs-gutter-x: 1.5rem; - } - - .g-xxl-4, -.gy-xxl-4 { - --bs-gutter-y: 1.5rem; - } - - .g-xxl-5, -.gx-xxl-5 { - --bs-gutter-x: 3rem; - } - - .g-xxl-5, -.gy-xxl-5 { - --bs-gutter-y: 3rem; - } -} -.table { - --bs-table-bg: transparent; - --bs-table-accent-bg: transparent; - --bs-table-striped-color: #212529; - --bs-table-striped-bg: rgba(0, 0, 0, 0.05); - --bs-table-active-color: #212529; - --bs-table-active-bg: rgba(0, 0, 0, 0.1); - --bs-table-hover-color: #212529; - --bs-table-hover-bg: rgba(0, 0, 0, 0.075); - width: 100%; - margin-bottom: 1rem; - color: #212529; - vertical-align: top; - border-color: #dee2e6; -} -.table > :not(caption) > * > * { - padding: 0.5rem 0.5rem; - background-color: var(--bs-table-bg); - border-bottom-width: 1px; - box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); -} -.table > tbody { - vertical-align: inherit; -} -.table > thead { - vertical-align: bottom; -} -.table > :not(:last-child) > :last-child > * { - border-bottom-color: currentColor; -} - -.caption-top { - caption-side: top; -} - -.table-sm > :not(caption) > * > * { - padding: 0.25rem 0.25rem; -} - -.table-bordered > :not(caption) > * { - border-width: 1px 0; -} -.table-bordered > :not(caption) > * > * { - border-width: 0 1px; -} - -.table-borderless > :not(caption) > * > * { - border-bottom-width: 0; -} - -.table-striped > tbody > tr:nth-of-type(odd) { - --bs-table-accent-bg: var(--bs-table-striped-bg); - color: var(--bs-table-striped-color); -} - -.table-active { - --bs-table-accent-bg: var(--bs-table-active-bg); - color: var(--bs-table-active-color); -} - -.table-hover > tbody > tr:hover { - --bs-table-accent-bg: var(--bs-table-hover-bg); - color: var(--bs-table-hover-color); -} - -.table-primary { - --bs-table-bg: #cfe2ff; - --bs-table-striped-bg: #c5d7f2; - --bs-table-striped-color: #000; - --bs-table-active-bg: #bacbe6; - --bs-table-active-color: #000; - --bs-table-hover-bg: #bfd1ec; - --bs-table-hover-color: #000; - color: #000; - border-color: #bacbe6; -} - -.table-secondary { - --bs-table-bg: #e2e3e5; - --bs-table-striped-bg: #d7d8da; - --bs-table-striped-color: #000; - --bs-table-active-bg: #cbccce; - --bs-table-active-color: #000; - --bs-table-hover-bg: #d1d2d4; - --bs-table-hover-color: #000; - color: #000; - border-color: #cbccce; -} - -.table-success { - --bs-table-bg: #d1e7dd; - --bs-table-striped-bg: #c7dbd2; - --bs-table-striped-color: #000; - --bs-table-active-bg: #bcd0c7; - --bs-table-active-color: #000; - --bs-table-hover-bg: #c1d6cc; - --bs-table-hover-color: #000; - color: #000; - border-color: #bcd0c7; -} - -.table-info { - --bs-table-bg: #cff4fc; - --bs-table-striped-bg: #c5e8ef; - --bs-table-striped-color: #000; - --bs-table-active-bg: #badce3; - --bs-table-active-color: #000; - --bs-table-hover-bg: #bfe2e9; - --bs-table-hover-color: #000; - color: #000; - border-color: #badce3; -} - -.table-warning { - --bs-table-bg: #fff3cd; - --bs-table-striped-bg: #f2e7c3; - --bs-table-striped-color: #000; - --bs-table-active-bg: #e6dbb9; - --bs-table-active-color: #000; - --bs-table-hover-bg: #ece1be; - --bs-table-hover-color: #000; - color: #000; - border-color: #e6dbb9; -} - -.table-danger { - --bs-table-bg: #f8d7da; - --bs-table-striped-bg: #eccccf; - --bs-table-striped-color: #000; - --bs-table-active-bg: #dfc2c4; - --bs-table-active-color: #000; - --bs-table-hover-bg: #e5c7ca; - --bs-table-hover-color: #000; - color: #000; - border-color: #dfc2c4; -} - -.table-light { - --bs-table-bg: #f8f9fa; - --bs-table-striped-bg: #ecedee; - --bs-table-striped-color: #000; - --bs-table-active-bg: #dfe0e1; - --bs-table-active-color: #000; - --bs-table-hover-bg: #e5e6e7; - --bs-table-hover-color: #000; - color: #000; - border-color: #dfe0e1; -} - -.table-dark { - --bs-table-bg: #212529; - --bs-table-striped-bg: #2c3034; - --bs-table-striped-color: #fff; - --bs-table-active-bg: #373b3e; - --bs-table-active-color: #fff; - --bs-table-hover-bg: #323539; - --bs-table-hover-color: #fff; - color: #fff; - border-color: #373b3e; -} - -.table-responsive { - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} - -@media (max-width: 575.98px) { - .table-responsive-sm { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 767.98px) { - .table-responsive-md { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 991.98px) { - .table-responsive-lg { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 1199.98px) { - .table-responsive-xl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -@media (max-width: 1399.98px) { - .table-responsive-xxl { - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } -} -.form-label { - margin-bottom: 0.5rem; -} - -.col-form-label { - padding-top: calc(0.375rem + 1px); - padding-bottom: calc(0.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; -} - -.col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - font-size: 1.25rem; -} - -.col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); - font-size: 0.875rem; -} - -.form-text { - margin-top: 0.25rem; - font-size: 0.875em; - color: #6c757d; -} - -.form-control { - display: block; - width: 100%; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ced4da; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: 0.25rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control { - transition: none; - } -} -.form-control[type=file] { - overflow: hidden; -} -.form-control[type=file]:not(:disabled):not([readonly]) { - cursor: pointer; -} -.form-control:focus { - color: #212529; - background-color: #fff; - border-color: #86b7fe; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-control::-webkit-date-and-time-value { - height: 1.5em; -} -.form-control::-moz-placeholder { - color: #6c757d; - opacity: 1; -} -.form-control::placeholder { - color: #6c757d; - opacity: 1; -} -.form-control:disabled, .form-control[readonly] { - background-color: #e9ecef; - opacity: 1; -} -.form-control::file-selector-button { - padding: 0.375rem 0.75rem; - margin: -0.375rem -0.75rem; - -webkit-margin-end: 0.75rem; - margin-inline-end: 0.75rem; - color: #212529; - background-color: #e9ecef; - pointer-events: none; - border-color: inherit; - border-style: solid; - border-width: 0; - border-inline-end-width: 1px; - border-radius: 0; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control::file-selector-button { - transition: none; - } -} -.form-control:hover:not(:disabled):not([readonly])::file-selector-button { - background-color: #dde0e3; -} -.form-control::-webkit-file-upload-button { - padding: 0.375rem 0.75rem; - margin: -0.375rem -0.75rem; - -webkit-margin-end: 0.75rem; - margin-inline-end: 0.75rem; - color: #212529; - background-color: #e9ecef; - pointer-events: none; - border-color: inherit; - border-style: solid; - border-width: 0; - border-inline-end-width: 1px; - border-radius: 0; - -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control::-webkit-file-upload-button { - -webkit-transition: none; - transition: none; - } -} -.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { - background-color: #dde0e3; -} - -.form-control-plaintext { - display: block; - width: 100%; - padding: 0.375rem 0; - margin-bottom: 0; - line-height: 1.5; - color: #212529; - background-color: transparent; - border: solid transparent; - border-width: 1px 0; -} -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm { - min-height: calc(1.5em + 0.5rem + 2px); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.2rem; -} -.form-control-sm::file-selector-button { - padding: 0.25rem 0.5rem; - margin: -0.25rem -0.5rem; - -webkit-margin-end: 0.5rem; - margin-inline-end: 0.5rem; -} -.form-control-sm::-webkit-file-upload-button { - padding: 0.25rem 0.5rem; - margin: -0.25rem -0.5rem; - -webkit-margin-end: 0.5rem; - margin-inline-end: 0.5rem; -} - -.form-control-lg { - min-height: calc(1.5em + 1rem + 2px); - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: 0.3rem; -} -.form-control-lg::file-selector-button { - padding: 0.5rem 1rem; - margin: -0.5rem -1rem; - -webkit-margin-end: 1rem; - margin-inline-end: 1rem; -} -.form-control-lg::-webkit-file-upload-button { - padding: 0.5rem 1rem; - margin: -0.5rem -1rem; - -webkit-margin-end: 1rem; - margin-inline-end: 1rem; -} - -textarea.form-control { - min-height: calc(1.5em + 0.75rem + 2px); -} -textarea.form-control-sm { - min-height: calc(1.5em + 0.5rem + 2px); -} -textarea.form-control-lg { - min-height: calc(1.5em + 1rem + 2px); -} - -.form-control-color { - max-width: 3rem; - height: auto; - padding: 0.375rem; -} -.form-control-color:not(:disabled):not([readonly]) { - cursor: pointer; -} -.form-control-color::-moz-color-swatch { - height: 1.5em; - border-radius: 0.25rem; -} -.form-control-color::-webkit-color-swatch { - height: 1.5em; - border-radius: 0.25rem; -} - -.form-select { - display: block; - width: 100%; - padding: 0.375rem 2.25rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - background-color: #fff; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right 0.75rem center; - background-size: 16px 12px; - border: 1px solid #ced4da; - border-radius: 0.25rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} -.form-select:focus { - border-color: #86b7fe; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-select[multiple], .form-select[size]:not([size="1"]) { - padding-right: 0.75rem; - background-image: none; -} -.form-select:disabled { - background-color: #e9ecef; -} -.form-select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 #212529; -} - -.form-select-sm { - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; -} - -.form-select-lg { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; -} - -.form-check { - display: block; - min-height: 1.5rem; - padding-left: 1.5em; - margin-bottom: 0.125rem; -} -.form-check .form-check-input { - float: left; - margin-left: -1.5em; -} - -.form-check-input { - width: 1em; - height: 1em; - margin-top: 0.25em; - vertical-align: top; - background-color: #fff; - background-repeat: no-repeat; - background-position: center; - background-size: contain; - border: 1px solid rgba(0, 0, 0, 0.25); - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - -webkit-print-color-adjust: exact; - color-adjust: exact; -} -.form-check-input[type=checkbox] { - border-radius: 0.25em; -} -.form-check-input[type=radio] { - border-radius: 50%; -} -.form-check-input:active { - filter: brightness(90%); -} -.form-check-input:focus { - border-color: #86b7fe; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-check-input:checked { - background-color: #0d6efd; - border-color: #0d6efd; -} -.form-check-input:checked[type=checkbox] { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); -} -.form-check-input:checked[type=radio] { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); -} -.form-check-input[type=checkbox]:indeterminate { - background-color: #0d6efd; - border-color: #0d6efd; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); -} -.form-check-input:disabled { - pointer-events: none; - filter: none; - opacity: 0.5; -} -.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { - opacity: 0.5; -} - -.form-switch { - padding-left: 2.5em; -} -.form-switch .form-check-input { - width: 2em; - margin-left: -2.5em; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); - background-position: left center; - border-radius: 2em; - transition: background-position 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-switch .form-check-input { - transition: none; - } -} -.form-switch .form-check-input:focus { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); -} -.form-switch .form-check-input:checked { - background-position: right center; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); -} - -.form-check-inline { - display: inline-block; - margin-right: 1rem; -} - -.btn-check { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.btn-check[disabled] + .btn, .btn-check:disabled + .btn { - pointer-events: none; - filter: none; - opacity: 0.65; -} - -.form-range { - width: 100%; - height: 1.5rem; - padding: 0; - background-color: transparent; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} -.form-range:focus { - outline: 0; -} -.form-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.form-range::-moz-focus-outer { - border: 0; -} -.form-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - background-color: #0d6efd; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -webkit-appearance: none; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .form-range::-webkit-slider-thumb { - -webkit-transition: none; - transition: none; - } -} -.form-range::-webkit-slider-thumb:active { - background-color: #b6d4fe; -} -.form-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} -.form-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - background-color: #0d6efd; - border: 0; - border-radius: 1rem; - -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -moz-appearance: none; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .form-range::-moz-range-thumb { - -moz-transition: none; - transition: none; - } -} -.form-range::-moz-range-thumb:active { - background-color: #b6d4fe; -} -.form-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} -.form-range:disabled { - pointer-events: none; -} -.form-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd; -} -.form-range:disabled::-moz-range-thumb { - background-color: #adb5bd; -} - -.form-floating { - position: relative; -} -.form-floating > .form-control, -.form-floating > .form-select { - height: calc(3.5rem + 2px); - padding: 1rem 0.75rem; -} -.form-floating > label { - position: absolute; - top: 0; - left: 0; - height: 100%; - padding: 1rem 0.75rem; - pointer-events: none; - border: 1px solid transparent; - transform-origin: 0 0; - transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-floating > label { - transition: none; - } -} -.form-floating > .form-control::-moz-placeholder { - color: transparent; -} -.form-floating > .form-control::placeholder { - color: transparent; -} -.form-floating > .form-control:not(:-moz-placeholder-shown) { - padding-top: 1.625rem; - padding-bottom: 0.625rem; -} -.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) { - padding-top: 1.625rem; - padding-bottom: 0.625rem; -} -.form-floating > .form-control:-webkit-autofill { - padding-top: 1.625rem; - padding-bottom: 0.625rem; -} -.form-floating > .form-select { - padding-top: 1.625rem; - padding-bottom: 0.625rem; -} -.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { - opacity: 0.65; - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); -} -.form-floating > .form-control:focus ~ label, -.form-floating > .form-control:not(:placeholder-shown) ~ label, -.form-floating > .form-select ~ label { - opacity: 0.65; - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); -} -.form-floating > .form-control:-webkit-autofill ~ label { - opacity: 0.65; - transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); -} - -.input-group { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: stretch; - width: 100%; -} -.input-group > .form-control, -.input-group > .form-select { - position: relative; - flex: 1 1 auto; - width: 1%; - min-width: 0; -} -.input-group > .form-control:focus, -.input-group > .form-select:focus { - z-index: 3; -} -.input-group .btn { - position: relative; - z-index: 2; -} -.input-group .btn:focus { - z-index: 3; -} - -.input-group-text { - display: flex; - align-items: center; - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: center; - white-space: nowrap; - background-color: #e9ecef; - border: 1px solid #ced4da; - border-radius: 0.25rem; -} - -.input-group-lg > .form-control, -.input-group-lg > .form-select, -.input-group-lg > .input-group-text, -.input-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: 0.3rem; -} - -.input-group-sm > .form-control, -.input-group-sm > .form-select, -.input-group-sm > .input-group-text, -.input-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.2rem; -} - -.input-group-lg > .form-select, -.input-group-sm > .form-select { - padding-right: 3rem; -} - -.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu), -.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu), -.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { - margin-left: -1px; - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: #198754; -} - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - color: #fff; - background-color: rgba(25, 135, 84, 0.9); - border-radius: 0.25rem; -} - -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .form-control:valid, .form-control.is-valid { - border-color: #198754; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:valid:focus, .form-control.is-valid:focus { - border-color: #198754; - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); -} - -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .form-select:valid, .form-select.is-valid { - border-color: #198754; -} -.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { - padding-right: 4.125rem; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-select:valid:focus, .form-select.is-valid:focus { - border-color: #198754; - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); -} - -.was-validated .form-check-input:valid, .form-check-input.is-valid { - border-color: #198754; -} -.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { - background-color: #198754; -} -.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); -} -.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: #198754; -} - -.form-check-inline .form-check-input ~ .valid-feedback { - margin-left: 0.5em; -} - -.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid, -.was-validated .input-group .form-select:valid, -.input-group .form-select.is-valid { - z-index: 1; -} -.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus, -.was-validated .input-group .form-select:valid:focus, -.input-group .form-select.is-valid:focus { - z-index: 3; -} - -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 0.875em; - color: #dc3545; -} - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - color: #fff; - background-color: rgba(220, 53, 69, 0.9); - border-radius: 0.25rem; -} - -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .form-control:invalid, .form-control.is-invalid { - border-color: #dc3545; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); -} - -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .form-select:invalid, .form-select.is-invalid { - border-color: #dc3545; -} -.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { - padding-right: 4.125rem; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-position: right 0.75rem center, center right 2.25rem; - background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); -} - -.was-validated .form-check-input:invalid, .form-check-input.is-invalid { - border-color: #dc3545; -} -.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { - background-color: #dc3545; -} -.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); -} -.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: #dc3545; -} - -.form-check-inline .form-check-input ~ .invalid-feedback { - margin-left: 0.5em; -} - -.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid, -.was-validated .input-group .form-select:invalid, -.input-group .form-select.is-invalid { - z-index: 2; -} -.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus, -.was-validated .input-group .form-select:invalid:focus, -.input-group .form-select.is-invalid:focus { - z-index: 3; -} - -.btn { - display: inline-block; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: center; - text-decoration: none; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: 0.375rem 0.75rem; - font-size: 1rem; - border-radius: 0.25rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .btn { - transition: none; - } -} -.btn:hover { - color: #212529; -} -.btn-check:focus + .btn, .btn:focus { - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} -.btn:disabled, .btn.disabled, fieldset:disabled .btn { - pointer-events: none; - opacity: 0.65; -} - -.btn-primary { - color: #fff; - background-color: #0d6efd; - border-color: #0d6efd; -} -.btn-primary:hover { - color: #fff; - background-color: #0b5ed7; - border-color: #0a58ca; -} -.btn-check:focus + .btn-primary, .btn-primary:focus { - color: #fff; - background-color: #0b5ed7; - border-color: #0a58ca; - box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); -} -.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #0a58ca; - border-color: #0a53be; -} -.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); -} -.btn-primary:disabled, .btn-primary.disabled { - color: #fff; - background-color: #0d6efd; - border-color: #0d6efd; -} - -.btn-secondary { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-secondary:hover { - color: #fff; - background-color: #5c636a; - border-color: #565e64; -} -.btn-check:focus + .btn-secondary, .btn-secondary:focus { - color: #fff; - background-color: #5c636a; - border-color: #565e64; - box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); -} -.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle { - color: #fff; - background-color: #565e64; - border-color: #51585e; -} -.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); -} -.btn-secondary:disabled, .btn-secondary.disabled { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-success { - color: #fff; - background-color: #198754; - border-color: #198754; -} -.btn-success:hover { - color: #fff; - background-color: #157347; - border-color: #146c43; -} -.btn-check:focus + .btn-success, .btn-success:focus { - color: #fff; - background-color: #157347; - border-color: #146c43; - box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); -} -.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #146c43; - border-color: #13653f; -} -.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); -} -.btn-success:disabled, .btn-success.disabled { - color: #fff; - background-color: #198754; - border-color: #198754; -} - -.btn-info { - color: #000; - background-color: #0dcaf0; - border-color: #0dcaf0; -} -.btn-info:hover { - color: #000; - background-color: #31d2f2; - border-color: #25cff2; -} -.btn-check:focus + .btn-info, .btn-info:focus { - color: #000; - background-color: #31d2f2; - border-color: #25cff2; - box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); -} -.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle { - color: #000; - background-color: #3dd5f3; - border-color: #25cff2; -} -.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); -} -.btn-info:disabled, .btn-info.disabled { - color: #000; - background-color: #0dcaf0; - border-color: #0dcaf0; -} - -.btn-warning { - color: #000; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-warning:hover { - color: #000; - background-color: #ffca2c; - border-color: #ffc720; -} -.btn-check:focus + .btn-warning, .btn-warning:focus { - color: #000; - background-color: #ffca2c; - border-color: #ffc720; - box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); -} -.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle { - color: #000; - background-color: #ffcd39; - border-color: #ffc720; -} -.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); -} -.btn-warning:disabled, .btn-warning.disabled { - color: #000; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-danger { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-danger:hover { - color: #fff; - background-color: #bb2d3b; - border-color: #b02a37; -} -.btn-check:focus + .btn-danger, .btn-danger:focus { - color: #fff; - background-color: #bb2d3b; - border-color: #b02a37; - box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); -} -.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #b02a37; - border-color: #a52834; -} -.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); -} -.btn-danger:disabled, .btn-danger.disabled { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-light { - color: #000; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-light:hover { - color: #000; - background-color: #f9fafb; - border-color: #f9fafb; -} -.btn-check:focus + .btn-light, .btn-light:focus { - color: #000; - background-color: #f9fafb; - border-color: #f9fafb; - box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); -} -.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle { - color: #000; - background-color: #f9fafb; - border-color: #f9fafb; -} -.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); -} -.btn-light:disabled, .btn-light.disabled { - color: #000; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-dark { - color: #fff; - background-color: #212529; - border-color: #212529; -} -.btn-dark:hover { - color: #fff; - background-color: #1c1f23; - border-color: #1a1e21; -} -.btn-check:focus + .btn-dark, .btn-dark:focus { - color: #fff; - background-color: #1c1f23; - border-color: #1a1e21; - box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); -} -.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #1a1e21; - border-color: #191c1f; -} -.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); -} -.btn-dark:disabled, .btn-dark.disabled { - color: #fff; - background-color: #212529; - border-color: #212529; -} - -.btn-outline-primary { - color: #0d6efd; - border-color: #0d6efd; -} -.btn-outline-primary:hover { - color: #fff; - background-color: #0d6efd; - border-color: #0d6efd; -} -.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus { - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); -} -.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show { - color: #fff; - background-color: #0d6efd; - border-color: #0d6efd; -} -.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); -} -.btn-outline-primary:disabled, .btn-outline-primary.disabled { - color: #0d6efd; - background-color: transparent; -} - -.btn-outline-secondary { - color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:hover { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus { - box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); -} -.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); -} -.btn-outline-secondary:disabled, .btn-outline-secondary.disabled { - color: #6c757d; - background-color: transparent; -} - -.btn-outline-success { - color: #198754; - border-color: #198754; -} -.btn-outline-success:hover { - color: #fff; - background-color: #198754; - border-color: #198754; -} -.btn-check:focus + .btn-outline-success, .btn-outline-success:focus { - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); -} -.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show { - color: #fff; - background-color: #198754; - border-color: #198754; -} -.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); -} -.btn-outline-success:disabled, .btn-outline-success.disabled { - color: #198754; - background-color: transparent; -} - -.btn-outline-info { - color: #0dcaf0; - border-color: #0dcaf0; -} -.btn-outline-info:hover { - color: #000; - background-color: #0dcaf0; - border-color: #0dcaf0; -} -.btn-check:focus + .btn-outline-info, .btn-outline-info:focus { - box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); -} -.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show { - color: #000; - background-color: #0dcaf0; - border-color: #0dcaf0; -} -.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); -} -.btn-outline-info:disabled, .btn-outline-info.disabled { - color: #0dcaf0; - background-color: transparent; -} - -.btn-outline-warning { - color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:hover { - color: #000; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); -} -.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show { - color: #000; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); -} -.btn-outline-warning:disabled, .btn-outline-warning.disabled { - color: #ffc107; - background-color: transparent; -} - -.btn-outline-danger { - color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:hover { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus { - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); -} -.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); -} -.btn-outline-danger:disabled, .btn-outline-danger.disabled { - color: #dc3545; - background-color: transparent; -} - -.btn-outline-light { - color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:hover { - color: #000; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-check:focus + .btn-outline-light, .btn-outline-light:focus { - box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); -} -.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show { - color: #000; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); -} -.btn-outline-light:disabled, .btn-outline-light.disabled { - color: #f8f9fa; - background-color: transparent; -} - -.btn-outline-dark { - color: #212529; - border-color: #212529; -} -.btn-outline-dark:hover { - color: #fff; - background-color: #212529; - border-color: #212529; -} -.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus { - box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); -} -.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show { - color: #fff; - background-color: #212529; - border-color: #212529; -} -.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus { - box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); -} -.btn-outline-dark:disabled, .btn-outline-dark.disabled { - color: #212529; - background-color: transparent; -} - -.btn-link { - font-weight: 400; - color: #0d6efd; - text-decoration: underline; -} -.btn-link:hover { - color: #0a58ca; -} -.btn-link:disabled, .btn-link.disabled { - color: #6c757d; -} - -.btn-lg, .btn-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - border-radius: 0.3rem; -} - -.btn-sm, .btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - border-radius: 0.2rem; -} - -.fade { - transition: opacity 0.15s linear; -} -@media (prefers-reduced-motion: reduce) { - .fade { - transition: none; - } -} -.fade:not(.show) { - opacity: 0; -} - -.collapse:not(.show) { - display: none; -} - -.collapsing { - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; - } -} - -.dropup, -.dropend, -.dropdown, -.dropstart { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; -} -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} -.dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropdown-menu { - position: absolute; - z-index: 1000; - display: none; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0; - font-size: 1rem; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; -} -.dropdown-menu[data-bs-popper] { - top: 100%; - left: 0; - margin-top: 0.125rem; -} - -.dropdown-menu-start { - --bs-position: start; -} -.dropdown-menu-start[data-bs-popper] { - right: auto /* rtl:ignore */; - left: 0 /* rtl:ignore */; -} - -.dropdown-menu-end { - --bs-position: end; -} -.dropdown-menu-end[data-bs-popper] { - right: 0 /* rtl:ignore */; - left: auto /* rtl:ignore */; -} - -@media (min-width: 576px) { - .dropdown-menu-sm-start { - --bs-position: start; - } - .dropdown-menu-sm-start[data-bs-popper] { - right: auto /* rtl:ignore */; - left: 0 /* rtl:ignore */; - } - - .dropdown-menu-sm-end { - --bs-position: end; - } - .dropdown-menu-sm-end[data-bs-popper] { - right: 0 /* rtl:ignore */; - left: auto /* rtl:ignore */; - } -} -@media (min-width: 768px) { - .dropdown-menu-md-start { - --bs-position: start; - } - .dropdown-menu-md-start[data-bs-popper] { - right: auto /* rtl:ignore */; - left: 0 /* rtl:ignore */; - } - - .dropdown-menu-md-end { - --bs-position: end; - } - .dropdown-menu-md-end[data-bs-popper] { - right: 0 /* rtl:ignore */; - left: auto /* rtl:ignore */; - } -} -@media (min-width: 992px) { - .dropdown-menu-lg-start { - --bs-position: start; - } - .dropdown-menu-lg-start[data-bs-popper] { - right: auto /* rtl:ignore */; - left: 0 /* rtl:ignore */; - } - - .dropdown-menu-lg-end { - --bs-position: end; - } - .dropdown-menu-lg-end[data-bs-popper] { - right: 0 /* rtl:ignore */; - left: auto /* rtl:ignore */; - } -} -@media (min-width: 1200px) { - .dropdown-menu-xl-start { - --bs-position: start; - } - .dropdown-menu-xl-start[data-bs-popper] { - right: auto /* rtl:ignore */; - left: 0 /* rtl:ignore */; - } - - .dropdown-menu-xl-end { - --bs-position: end; - } - .dropdown-menu-xl-end[data-bs-popper] { - right: 0 /* rtl:ignore */; - left: auto /* rtl:ignore */; - } -} -@media (min-width: 1400px) { - .dropdown-menu-xxl-start { - --bs-position: start; - } - .dropdown-menu-xxl-start[data-bs-popper] { - right: auto /* rtl:ignore */; - left: 0 /* rtl:ignore */; - } - - .dropdown-menu-xxl-end { - --bs-position: end; - } - .dropdown-menu-xxl-end[data-bs-popper] { - right: 0 /* rtl:ignore */; - left: auto /* rtl:ignore */; - } -} -.dropup .dropdown-menu[data-bs-popper] { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: 0.125rem; -} -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropend .dropdown-menu[data-bs-popper] { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: 0.125rem; -} -.dropend .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} -.dropend .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropend .dropdown-toggle::after { - vertical-align: 0; -} - -.dropstart .dropdown-menu[data-bs-popper] { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: 0.125rem; -} -.dropstart .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; -} -.dropstart .dropdown-toggle::after { - display: none; -} -.dropstart .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} -.dropstart .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropstart .dropdown-toggle::before { - vertical-align: 0; -} - -.dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; - border-top: 1px solid rgba(0, 0, 0, 0.15); -} - -.dropdown-item { - display: block; - padding: 0.25rem 1rem; - clear: both; - font-weight: 400; - color: #212529; - text-align: inherit; - text-decoration: none; - white-space: nowrap; - background-color: transparent; - border: 0; -} -.dropdown-item:hover, .dropdown-item:focus { - color: #1e2125; - background-color: #e9ecef; -} -.dropdown-item.active, .dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #0d6efd; -} -.dropdown-item.disabled, .dropdown-item:disabled { - color: #adb5bd; - pointer-events: none; - background-color: transparent; -} - -.dropdown-menu.show { - display: block; -} - -.dropdown-header { - display: block; - padding: 0.5rem 1rem; - margin-bottom: 0; - font-size: 0.875rem; - color: #6c757d; - white-space: nowrap; -} - -.dropdown-item-text { - display: block; - padding: 0.25rem 1rem; - color: #212529; -} - -.dropdown-menu-dark { - color: #dee2e6; - background-color: #343a40; - border-color: rgba(0, 0, 0, 0.15); -} -.dropdown-menu-dark .dropdown-item { - color: #dee2e6; -} -.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus { - color: #fff; - background-color: rgba(255, 255, 255, 0.15); -} -.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active { - color: #fff; - background-color: #0d6efd; -} -.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled { - color: #adb5bd; -} -.dropdown-menu-dark .dropdown-divider { - border-color: rgba(0, 0, 0, 0.15); -} -.dropdown-menu-dark .dropdown-item-text { - color: #dee2e6; -} -.dropdown-menu-dark .dropdown-header { - color: #adb5bd; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - flex: 1 1 auto; -} -.btn-group > .btn-check:checked + .btn, -.btn-group > .btn-check:focus + .btn, -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn-check:checked + .btn, -.btn-group-vertical > .btn-check:focus + .btn, -.btn-group-vertical > .btn:hover, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 1; -} - -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} -.btn-toolbar .input-group { - width: auto; -} - -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) { - margin-left: -1px; -} -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:nth-child(n+3), -.btn-group > :not(.btn-check) + .btn, -.btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; -} -.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { - margin-left: 0; -} -.dropstart .dropdown-toggle-split::before { - margin-right: 0; -} - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - width: 100%; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) { - margin-top: -1px; -} -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn ~ .btn, -.btn-group-vertical > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: 0.5rem 1rem; - color: #0d6efd; - text-decoration: none; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .nav-link { - transition: none; - } -} -.nav-link:hover, .nav-link:focus { - color: #0a58ca; -} -.nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default; -} - -.nav-tabs { - border-bottom: 1px solid #dee2e6; -} -.nav-tabs .nav-link { - margin-bottom: -1px; - background: none; - border: 1px solid transparent; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} -.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - border-color: #e9ecef #e9ecef #dee2e6; - isolation: isolate; -} -.nav-tabs .nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent; -} -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: #495057; - background-color: #fff; - border-color: #dee2e6 #dee2e6 #fff; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav-pills .nav-link { - background: none; - border: 0; - border-radius: 0.25rem; -} -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: #fff; - background-color: #0d6efd; -} - -.nav-fill > .nav-link, -.nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; -} - -.nav-justified > .nav-link, -.nav-justified .nav-item { - flex-basis: 0; - flex-grow: 1; - text-align: center; -} - -.nav-fill .nav-item .nav-link, -.nav-justified .nav-item .nav-link { - width: 100%; -} - -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} - -.navbar { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} -.navbar > .container, -.navbar > .container-fluid, -.navbar > .container-sm, -.navbar > .container-md, -.navbar > .container-lg, -.navbar > .container-xl, -.navbar > .container-xxl { - display: flex; - flex-wrap: inherit; - align-items: center; - justify-content: space-between; -} -.navbar-brand { - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; - margin-right: 1rem; - font-size: 1.25rem; - text-decoration: none; - white-space: nowrap; -} -.navbar-nav { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} -.navbar-nav .dropdown-menu { - position: static; -} - -.navbar-text { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; -} - -.navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: 0.25rem; - transition: box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .navbar-toggler { - transition: none; - } -} -.navbar-toggler:hover { - text-decoration: none; -} -.navbar-toggler:focus { - text-decoration: none; - outline: 0; - box-shadow: 0 0 0 0.25rem; -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - background-repeat: no-repeat; - background-position: center; - background-size: 100%; -} - -.navbar-nav-scroll { - max-height: var(--bs-scroll-height, 75vh); - overflow-y: auto; -} - -@media (min-width: 576px) { - .navbar-expand-sm { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-sm .navbar-nav { - flex-direction: row; - } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-sm .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-sm .navbar-toggler { - display: none; - } -} -@media (min-width: 768px) { - .navbar-expand-md { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-md .navbar-nav { - flex-direction: row; - } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-md .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-md .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-md .navbar-toggler { - display: none; - } -} -@media (min-width: 992px) { - .navbar-expand-lg { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-lg .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-lg .navbar-toggler { - display: none; - } -} -@media (min-width: 1200px) { - .navbar-expand-xl { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-xl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-xl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xl .navbar-toggler { - display: none; - } -} -@media (min-width: 1400px) { - .navbar-expand-xxl { - flex-wrap: nowrap; - justify-content: flex-start; - } - .navbar-expand-xxl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xxl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xxl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-xxl .navbar-nav-scroll { - overflow: visible; - } - .navbar-expand-xxl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xxl .navbar-toggler { - display: none; - } -} -.navbar-expand { - flex-wrap: nowrap; - justify-content: flex-start; -} -.navbar-expand .navbar-nav { - flex-direction: row; -} -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} -.navbar-expand .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; -} -.navbar-expand .navbar-nav-scroll { - overflow: visible; -} -.navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} -.navbar-expand .navbar-toggler { - display: none; -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.55); -} -.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { - color: rgba(0, 0, 0, 0.7); -} -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} -.navbar-light .navbar-nav .show > .nav-link, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.55); - border-color: rgba(0, 0, 0, 0.1); -} -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.55); -} -.navbar-light .navbar-text a, -.navbar-light .navbar-text a:hover, -.navbar-light .navbar-text a:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-dark .navbar-brand { - color: #fff; -} -.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { - color: #fff; -} -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.55); -} -.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { - color: rgba(255, 255, 255, 0.75); -} -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} -.navbar-dark .navbar-nav .show > .nav-link, -.navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.55); - border-color: rgba(255, 255, 255, 0.1); -} -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.55); -} -.navbar-dark .navbar-text a, -.navbar-dark .navbar-text a:hover, -.navbar-dark .navbar-text a:focus { - color: #fff; -} - -.card { - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 0.25rem; -} -.card > hr { - margin-right: 0; - margin-left: 0; -} -.card > .list-group { - border-top: inherit; - border-bottom: inherit; -} -.card > .list-group:first-child { - border-top-width: 0; - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} -.card > .list-group:last-child { - border-bottom-width: 0; - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); -} -.card > .card-header + .list-group, -.card > .list-group + .card-footer { - border-top: 0; -} - -.card-body { - flex: 1 1 auto; - padding: 1rem 1rem; -} - -.card-title { - margin-bottom: 0.5rem; -} - -.card-subtitle { - margin-top: -0.25rem; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link:hover { - text-decoration: none; -} -.card-link + .card-link { - margin-left: 1rem; -} - -.card-header { - padding: 0.5rem 1rem; - margin-bottom: 0; - background-color: rgba(0, 0, 0, 0.03); - border-bottom: 1px solid rgba(0, 0, 0, 0.125); -} -.card-header:first-child { - border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; -} - -.card-footer { - padding: 0.5rem 1rem; - background-color: rgba(0, 0, 0, 0.03); - border-top: 1px solid rgba(0, 0, 0, 0.125); -} -.card-footer:last-child { - border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); -} - -.card-header-tabs { - margin-right: -0.5rem; - margin-bottom: -0.5rem; - margin-left: -0.5rem; - border-bottom: 0; -} - -.card-header-pills { - margin-right: -0.5rem; - margin-left: -0.5rem; -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1rem; - border-radius: calc(0.25rem - 1px); -} - -.card-img, -.card-img-top, -.card-img-bottom { - width: 100%; -} - -.card-img, -.card-img-top { - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} - -.card-img, -.card-img-bottom { - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); -} - -.card-group > .card { - margin-bottom: 0.75rem; -} -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; - } - .card-group > .card { - flex: 1 0 0%; - margin-bottom: 0; - } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-top, -.card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-bottom, -.card-group > .card:not(:last-child) .card-footer { - border-bottom-right-radius: 0; - } - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-top, -.card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-bottom, -.card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; - } -} - -.accordion-button { - position: relative; - display: flex; - align-items: center; - width: 100%; - padding: 1rem 1.25rem; - font-size: 1rem; - color: #212529; - text-align: left; - background-color: #fff; - border: 0; - border-radius: 0; - overflow-anchor: none; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; -} -@media (prefers-reduced-motion: reduce) { - .accordion-button { - transition: none; - } -} -.accordion-button:not(.collapsed) { - color: #0c63e4; - background-color: #e7f1ff; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); -} -.accordion-button:not(.collapsed)::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); - transform: rotate(-180deg); -} -.accordion-button::after { - flex-shrink: 0; - width: 1.25rem; - height: 1.25rem; - margin-left: auto; - content: ""; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-size: 1.25rem; - transition: transform 0.2s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .accordion-button::after { - transition: none; - } -} -.accordion-button:hover { - z-index: 2; -} -.accordion-button:focus { - z-index: 3; - border-color: #86b7fe; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} - -.accordion-header { - margin-bottom: 0; -} - -.accordion-item { - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} -.accordion-item:first-of-type { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} -.accordion-item:first-of-type .accordion-button { - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} -.accordion-item:not(:first-of-type) { - border-top: 0; -} -.accordion-item:last-of-type { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} -.accordion-item:last-of-type .accordion-button.collapsed { - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); -} -.accordion-item:last-of-type .accordion-collapse { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.accordion-body { - padding: 1rem 1.25rem; -} - -.accordion-flush .accordion-collapse { - border-width: 0; -} -.accordion-flush .accordion-item { - border-right: 0; - border-left: 0; - border-radius: 0; -} -.accordion-flush .accordion-item:first-child { - border-top: 0; -} -.accordion-flush .accordion-item:last-child { - border-bottom: 0; -} -.accordion-flush .accordion-item .accordion-button { - border-radius: 0; -} - -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: 0 0; - margin-bottom: 1rem; - list-style: none; -} - -.breadcrumb-item + .breadcrumb-item { - padding-left: 0.5rem; -} -.breadcrumb-item + .breadcrumb-item::before { - float: left; - padding-right: 0.5rem; - color: #6c757d; - content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; -} -.breadcrumb-item.active { - color: #6c757d; -} - -.pagination { - display: flex; - padding-left: 0; - list-style: none; -} - -.page-link { - position: relative; - display: block; - color: #0d6efd; - text-decoration: none; - background-color: #fff; - border: 1px solid #dee2e6; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .page-link { - transition: none; - } -} -.page-link:hover { - z-index: 2; - color: #0a58ca; - background-color: #e9ecef; - border-color: #dee2e6; -} -.page-link:focus { - z-index: 3; - color: #0a58ca; - background-color: #e9ecef; - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); -} - -.page-item:not(:first-child) .page-link { - margin-left: -1px; -} -.page-item.active .page-link { - z-index: 3; - color: #fff; - background-color: #0d6efd; - border-color: #0d6efd; -} -.page-item.disabled .page-link { - color: #6c757d; - pointer-events: none; - background-color: #fff; - border-color: #dee2e6; -} - -.page-link { - padding: 0.375rem 0.75rem; -} - -.page-item:first-child .page-link { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} -.page-item:last-child .page-link { - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; -} - -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; -} -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 0.3rem; - border-bottom-left-radius: 0.3rem; -} -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; -} - -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; -} -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: 0.2rem; - border-bottom-left-radius: 0.2rem; -} -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: 0.2rem; - border-bottom-right-radius: 0.2rem; -} - -.badge { - display: inline-block; - padding: 0.35em 0.65em; - font-size: 0.75em; - font-weight: 700; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: 0.25rem; -} -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -.alert { - position: relative; - padding: 1rem 1rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: 700; -} - -.alert-dismissible { - padding-right: 3rem; -} -.alert-dismissible .btn-close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 1.25rem 1rem; -} - -.alert-primary { - color: #084298; - background-color: #cfe2ff; - border-color: #b6d4fe; -} -.alert-primary .alert-link { - color: #06357a; -} - -.alert-secondary { - color: #41464b; - background-color: #e2e3e5; - border-color: #d3d6d8; -} -.alert-secondary .alert-link { - color: #34383c; -} - -.alert-success { - color: #0f5132; - background-color: #d1e7dd; - border-color: #badbcc; -} -.alert-success .alert-link { - color: #0c4128; -} - -.alert-info { - color: #055160; - background-color: #cff4fc; - border-color: #b6effb; -} -.alert-info .alert-link { - color: #04414d; -} - -.alert-warning { - color: #664d03; - background-color: #fff3cd; - border-color: #ffecb5; -} -.alert-warning .alert-link { - color: #523e02; -} - -.alert-danger { - color: #842029; - background-color: #f8d7da; - border-color: #f5c2c7; -} -.alert-danger .alert-link { - color: #6a1a21; -} - -.alert-light { - color: #636464; - background-color: #fefefe; - border-color: #fdfdfe; -} -.alert-light .alert-link { - color: #4f5050; -} - -.alert-dark { - color: #141619; - background-color: #d3d3d4; - border-color: #bcbebf; -} -.alert-dark .alert-link { - color: #101214; -} - -@-webkit-keyframes progress-bar-stripes { - 0% { - background-position-x: 1rem; - } -} - -@keyframes progress-bar-stripes { - 0% { - background-position-x: 1rem; - } -} -.progress { - display: flex; - height: 1rem; - overflow: hidden; - font-size: 0.75rem; - background-color: #e9ecef; - border-radius: 0.25rem; -} - -.progress-bar { - display: flex; - flex-direction: column; - justify-content: center; - overflow: hidden; - color: #fff; - text-align: center; - white-space: nowrap; - background-color: #0d6efd; - transition: width 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; - } -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem; -} - -.progress-bar-animated { - -webkit-animation: 1s linear infinite progress-bar-stripes; - animation: 1s linear infinite progress-bar-stripes; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - -webkit-animation: none; - animation: none; - } -} - -.list-group { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - border-radius: 0.25rem; -} - -.list-group-numbered { - list-style-type: none; - counter-reset: section; -} -.list-group-numbered > li::before { - content: counters(section, ".") ". "; - counter-increment: section; -} - -.list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit; -} -.list-group-item-action:hover, .list-group-item-action:focus { - z-index: 1; - color: #495057; - text-decoration: none; - background-color: #f8f9fa; -} -.list-group-item-action:active { - color: #212529; - background-color: #e9ecef; -} - -.list-group-item { - position: relative; - display: block; - padding: 0.5rem 1rem; - color: #212529; - text-decoration: none; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} -.list-group-item:first-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} -.list-group-item:last-child { - border-bottom-right-radius: inherit; - border-bottom-left-radius: inherit; -} -.list-group-item.disabled, .list-group-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: #fff; -} -.list-group-item.active { - z-index: 2; - color: #fff; - background-color: #0d6efd; - border-color: #0d6efd; -} -.list-group-item + .list-group-item { - border-top-width: 0; -} -.list-group-item + .list-group-item.active { - margin-top: -1px; - border-top-width: 1px; -} - -.list-group-horizontal { - flex-direction: row; -} -.list-group-horizontal > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; -} -.list-group-horizontal > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; -} -.list-group-horizontal > .list-group-item.active { - margin-top: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; -} - -@media (min-width: 576px) { - .list-group-horizontal-sm { - flex-direction: row; - } - .list-group-horizontal-sm > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-sm > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-sm > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 768px) { - .list-group-horizontal-md { - flex-direction: row; - } - .list-group-horizontal-md > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-md > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-md > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 992px) { - .list-group-horizontal-lg { - flex-direction: row; - } - .list-group-horizontal-lg > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-lg > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-lg > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 1200px) { - .list-group-horizontal-xl { - flex-direction: row; - } - .list-group-horizontal-xl > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-xl > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-xl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 1400px) { - .list-group-horizontal-xxl { - flex-direction: row; - } - .list-group-horizontal-xxl > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-xxl > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-xxl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xxl > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -.list-group-flush { - border-radius: 0; -} -.list-group-flush > .list-group-item { - border-width: 0 0 1px; -} -.list-group-flush > .list-group-item:last-child { - border-bottom-width: 0; -} - -.list-group-item-primary { - color: #084298; - background-color: #cfe2ff; -} -.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { - color: #084298; - background-color: #bacbe6; -} -.list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #084298; - border-color: #084298; -} - -.list-group-item-secondary { - color: #41464b; - background-color: #e2e3e5; -} -.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { - color: #41464b; - background-color: #cbccce; -} -.list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #41464b; - border-color: #41464b; -} - -.list-group-item-success { - color: #0f5132; - background-color: #d1e7dd; -} -.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { - color: #0f5132; - background-color: #bcd0c7; -} -.list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #0f5132; - border-color: #0f5132; -} - -.list-group-item-info { - color: #055160; - background-color: #cff4fc; -} -.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { - color: #055160; - background-color: #badce3; -} -.list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #055160; - border-color: #055160; -} - -.list-group-item-warning { - color: #664d03; - background-color: #fff3cd; -} -.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { - color: #664d03; - background-color: #e6dbb9; -} -.list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #664d03; - border-color: #664d03; -} - -.list-group-item-danger { - color: #842029; - background-color: #f8d7da; -} -.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { - color: #842029; - background-color: #dfc2c4; -} -.list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #842029; - border-color: #842029; -} - -.list-group-item-light { - color: #636464; - background-color: #fefefe; -} -.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { - color: #636464; - background-color: #e5e5e5; -} -.list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #636464; - border-color: #636464; -} - -.list-group-item-dark { - color: #141619; - background-color: #d3d3d4; -} -.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { - color: #141619; - background-color: #bebebf; -} -.list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #141619; - border-color: #141619; -} - -.btn-close { - box-sizing: content-box; - width: 1em; - height: 1em; - padding: 0.25em 0.25em; - color: #000; - background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; - border: 0; - border-radius: 0.25rem; - opacity: 0.5; -} -.btn-close:hover { - color: #000; - text-decoration: none; - opacity: 0.75; -} -.btn-close:focus { - outline: 0; - box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); - opacity: 1; -} -.btn-close:disabled, .btn-close.disabled { - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - opacity: 0.25; -} - -.btn-close-white { - filter: invert(1) grayscale(100%) brightness(200%); -} - -.toast { - width: 350px; - max-width: 100%; - font-size: 0.875rem; - pointer-events: auto; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; -} -.toast:not(.showing):not(.show) { - opacity: 0; -} -.toast.hide { - display: none; -} - -.toast-container { - width: -webkit-max-content; - width: -moz-max-content; - width: max-content; - max-width: 100%; - pointer-events: none; -} -.toast-container > :not(:last-child) { - margin-bottom: 0.75rem; -} - -.toast-header { - display: flex; - align-items: center; - padding: 0.5rem 0.75rem; - color: #6c757d; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} -.toast-header .btn-close { - margin-right: -0.375rem; - margin-left: 0.75rem; -} - -.toast-body { - padding: 0.75rem; - word-wrap: break-word; -} - -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1060; - display: none; - width: 100%; - height: 100%; - overflow-x: hidden; - overflow-y: auto; - outline: 0; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 0.5rem; - pointer-events: none; -} -.modal.fade .modal-dialog { - transition: transform 0.3s ease-out; - transform: translate(0, -50px); -} -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; - } -} -.modal.show .modal-dialog { - transform: none; -} -.modal.modal-static .modal-dialog { - transform: scale(1.02); -} - -.modal-dialog-scrollable { - height: calc(100% - 1rem); -} -.modal-dialog-scrollable .modal-content { - max-height: 100%; - overflow: hidden; -} -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - 1rem); -} - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop.show { - opacity: 0.5; -} - -.modal-header { - display: flex; - flex-shrink: 0; - align-items: center; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} -.modal-header .btn-close { - padding: 0.5rem 0.5rem; - margin: -0.5rem -0.5rem -0.5rem auto; -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5; -} - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: 1rem; -} - -.modal-footer { - display: flex; - flex-wrap: wrap; - flex-shrink: 0; - align-items: center; - justify-content: flex-end; - padding: 0.75rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: calc(0.3rem - 1px); - border-bottom-left-radius: calc(0.3rem - 1px); -} -.modal-footer > * { - margin: 0.25rem; -} - -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto; - } - - .modal-dialog-scrollable { - height: calc(100% - 3.5rem); - } - - .modal-dialog-centered { - min-height: calc(100% - 3.5rem); - } - - .modal-sm { - max-width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg, -.modal-xl { - max-width: 800px; - } -} -@media (min-width: 1200px) { - .modal-xl { - max-width: 1140px; - } -} -.modal-fullscreen { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; -} -.modal-fullscreen .modal-content { - height: 100%; - border: 0; - border-radius: 0; -} -.modal-fullscreen .modal-header { - border-radius: 0; -} -.modal-fullscreen .modal-body { - overflow-y: auto; -} -.modal-fullscreen .modal-footer { - border-radius: 0; -} - -@media (max-width: 575.98px) { - .modal-fullscreen-sm-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-sm-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-sm-down .modal-header { - border-radius: 0; - } - .modal-fullscreen-sm-down .modal-body { - overflow-y: auto; - } - .modal-fullscreen-sm-down .modal-footer { - border-radius: 0; - } -} -@media (max-width: 767.98px) { - .modal-fullscreen-md-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-md-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-md-down .modal-header { - border-radius: 0; - } - .modal-fullscreen-md-down .modal-body { - overflow-y: auto; - } - .modal-fullscreen-md-down .modal-footer { - border-radius: 0; - } -} -@media (max-width: 991.98px) { - .modal-fullscreen-lg-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-lg-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-lg-down .modal-header { - border-radius: 0; - } - .modal-fullscreen-lg-down .modal-body { - overflow-y: auto; - } - .modal-fullscreen-lg-down .modal-footer { - border-radius: 0; - } -} -@media (max-width: 1199.98px) { - .modal-fullscreen-xl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-xl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-xl-down .modal-header { - border-radius: 0; - } - .modal-fullscreen-xl-down .modal-body { - overflow-y: auto; - } - .modal-fullscreen-xl-down .modal-footer { - border-radius: 0; - } -} -@media (max-width: 1399.98px) { - .modal-fullscreen-xxl-down { - width: 100vw; - max-width: none; - height: 100%; - margin: 0; - } - .modal-fullscreen-xxl-down .modal-content { - height: 100%; - border: 0; - border-radius: 0; - } - .modal-fullscreen-xxl-down .modal-header { - border-radius: 0; - } - .modal-fullscreen-xxl-down .modal-body { - overflow-y: auto; - } - .modal-fullscreen-xxl-down .modal-footer { - border-radius: 0; - } -} -.tooltip { - position: absolute; - z-index: 1080; - display: block; - margin: 0; - font-family: var(--bs-font-sans-serif); - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - opacity: 0; -} -.tooltip.show { - opacity: 0.9; -} -.tooltip .tooltip-arrow { - position: absolute; - display: block; - width: 0.8rem; - height: 0.4rem; -} -.tooltip .tooltip-arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] { - padding: 0.4rem 0; -} -.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { - bottom: 0; -} -.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { - top: -1px; - border-width: 0.4rem 0.4rem 0; - border-top-color: #000; -} - -.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] { - padding: 0 0.4rem; -} -.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { - left: 0; - width: 0.4rem; - height: 0.8rem; -} -.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { - right: -1px; - border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: #000; -} - -.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] { - padding: 0.4rem 0; -} -.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { - top: 0; -} -.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { - bottom: -1px; - border-width: 0 0.4rem 0.4rem; - border-bottom-color: #000; -} - -.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] { - padding: 0 0.4rem; -} -.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { - right: 0; - width: 0.4rem; - height: 0.8rem; -} -.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { - left: -1px; - border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: #000; -} - -.tooltip-inner { - max-width: 200px; - padding: 0.25rem 0.5rem; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 0.25rem; -} - -.popover { - position: absolute; - top: 0; - left: 0 /* rtl:ignore */; - z-index: 1070; - display: block; - max-width: 276px; - font-family: var(--bs-font-sans-serif); - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; -} -.popover .popover-arrow { - position: absolute; - display: block; - width: 1rem; - height: 0.5rem; -} -.popover .popover-arrow::before, .popover .popover-arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { - bottom: calc(-0.5rem - 1px); -} -.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { - bottom: 0; - border-width: 0.5rem 0.5rem 0; - border-top-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { - bottom: 1px; - border-width: 0.5rem 0.5rem 0; - border-top-color: #fff; -} - -.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { - left: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; -} -.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { - left: 0; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { - left: 1px; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: #fff; -} - -.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { - top: calc(-0.5rem - 1px); -} -.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { - top: 0; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { - top: 1px; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: #fff; -} -.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 1rem; - margin-left: -0.5rem; - content: ""; - border-bottom: 1px solid #f0f0f0; -} - -.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { - right: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; -} -.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { - right: 0; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { - right: 1px; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: #fff; -} - -.popover-header { - padding: 0.5rem 1rem; - margin-bottom: 0; - font-size: 1rem; - background-color: #f0f0f0; - border-bottom: 1px solid #d8d8d8; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} -.popover-header:empty { - display: none; -} - -.popover-body { - padding: 1rem 1rem; - color: #212529; -} - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner::after { - display: block; - clear: both; - content: ""; -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - transition: transform 0.6s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -/* rtl:begin:ignore */ -.carousel-item-next:not(.carousel-item-start), -.active.carousel-item-end { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-end), -.active.carousel-item-start { - transform: translateX(-100%); -} - -/* rtl:end:ignore */ -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; -} -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-start, -.carousel-fade .carousel-item-prev.carousel-item-end { - z-index: 1; - opacity: 1; -} -.carousel-fade .active.carousel-item-start, -.carousel-fade .active.carousel-item-end { - z-index: 0; - opacity: 0; - transition: opacity 0s 0.6s; -} -@media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-start, -.carousel-fade .active.carousel-item-end { - transition: none; - } -} - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - padding: 0; - color: #fff; - text-align: center; - background: none; - border: 0; - opacity: 0.5; - transition: opacity 0.15s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-control-prev, -.carousel-control-next { - transition: none; - } -} -.carousel-control-prev:hover, .carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; -} - -.carousel-control-prev { - left: 0; -} - -.carousel-control-next { - right: 0; -} - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 2rem; - height: 2rem; - background-repeat: no-repeat; - background-position: 50%; - background-size: 100% 100%; -} - -/* rtl:options: { - "autoRename": true, - "stringMap":[ { - "name" : "prev-next", - "search" : "prev", - "replace" : "next" - } ] -} */ -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 2; - display: flex; - justify-content: center; - padding: 0; - margin-right: 15%; - margin-bottom: 1rem; - margin-left: 15%; - list-style: none; -} -.carousel-indicators [data-bs-target] { - box-sizing: content-box; - flex: 0 1 auto; - width: 30px; - height: 3px; - padding: 0; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border: 0; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: 0.5; - transition: opacity 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-indicators [data-bs-target] { - transition: none; - } -} -.carousel-indicators .active { - opacity: 1; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 1.25rem; - left: 15%; - padding-top: 1.25rem; - padding-bottom: 1.25rem; - color: #fff; - text-align: center; -} - -.carousel-dark .carousel-control-prev-icon, -.carousel-dark .carousel-control-next-icon { - filter: invert(1) grayscale(100); -} -.carousel-dark .carousel-indicators [data-bs-target] { - background-color: #000; -} -.carousel-dark .carousel-caption { - color: #000; -} - -@-webkit-keyframes spinner-border { - to { - transform: rotate(360deg) /* rtl:ignore */; - } -} - -@keyframes spinner-border { - to { - transform: rotate(360deg) /* rtl:ignore */; - } -} -.spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: -0.125em; - border: 0.25em solid currentColor; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: 0.75s linear infinite spinner-border; - animation: 0.75s linear infinite spinner-border; -} - -.spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: 0.2em; -} - -@-webkit-keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} - -@keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} -.spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: -0.125em; - background-color: currentColor; - border-radius: 50%; - opacity: 0; - -webkit-animation: 0.75s linear infinite spinner-grow; - animation: 0.75s linear infinite spinner-grow; -} - -.spinner-grow-sm { - width: 1rem; - height: 1rem; -} - -@media (prefers-reduced-motion: reduce) { - .spinner-border, -.spinner-grow { - -webkit-animation-duration: 1.5s; - animation-duration: 1.5s; - } -} -.offcanvas { - position: fixed; - bottom: 0; - z-index: 1050; - display: flex; - flex-direction: column; - max-width: 100%; - visibility: hidden; - background-color: #fff; - background-clip: padding-box; - outline: 0; - transition: transform 0.3s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .offcanvas { - transition: none; - } -} - -.offcanvas-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 1rem 1rem; -} -.offcanvas-header .btn-close { - padding: 0.5rem 0.5rem; - margin: -0.5rem -0.5rem -0.5rem auto; -} - -.offcanvas-title { - margin-bottom: 0; - line-height: 1.5; -} - -.offcanvas-body { - flex-grow: 1; - padding: 1rem 1rem; - overflow-y: auto; -} - -.offcanvas-start { - top: 0; - left: 0; - width: 400px; - border-right: 1px solid rgba(0, 0, 0, 0.2); - transform: translateX(-100%); -} - -.offcanvas-end { - top: 0; - right: 0; - width: 400px; - border-left: 1px solid rgba(0, 0, 0, 0.2); - transform: translateX(100%); -} - -.offcanvas-top { - top: 0; - right: 0; - left: 0; - height: 30vh; - max-height: 100%; - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - transform: translateY(-100%); -} - -.offcanvas-bottom { - right: 0; - left: 0; - height: 30vh; - max-height: 100%; - border-top: 1px solid rgba(0, 0, 0, 0.2); - transform: translateY(100%); -} - -.offcanvas.show { - transform: none; -} - -.clearfix::after { - display: block; - clear: both; - content: ""; -} - -.link-primary { - color: #0d6efd; -} -.link-primary:hover, .link-primary:focus { - color: #0a58ca; -} - -.link-secondary { - color: #6c757d; -} -.link-secondary:hover, .link-secondary:focus { - color: #565e64; -} - -.link-success { - color: #198754; -} -.link-success:hover, .link-success:focus { - color: #146c43; -} - -.link-info { - color: #0dcaf0; -} -.link-info:hover, .link-info:focus { - color: #3dd5f3; -} - -.link-warning { - color: #ffc107; -} -.link-warning:hover, .link-warning:focus { - color: #ffcd39; -} - -.link-danger { - color: #dc3545; -} -.link-danger:hover, .link-danger:focus { - color: #b02a37; -} - -.link-light { - color: #f8f9fa; -} -.link-light:hover, .link-light:focus { - color: #f9fafb; -} - -.link-dark { - color: #212529; -} -.link-dark:hover, .link-dark:focus { - color: #1a1e21; -} - -.ratio { - position: relative; - width: 100%; -} -.ratio::before { - display: block; - padding-top: var(--bs-aspect-ratio); - content: ""; -} -.ratio > * { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.ratio-1x1 { - --bs-aspect-ratio: 100%; -} - -.ratio-4x3 { - --bs-aspect-ratio: calc(3 / 4 * 100%); -} - -.ratio-16x9 { - --bs-aspect-ratio: calc(9 / 16 * 100%); -} - -.ratio-21x9 { - --bs-aspect-ratio: calc(9 / 21 * 100%); -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -.sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; -} - -@media (min-width: 576px) { - .sticky-sm-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} -@media (min-width: 768px) { - .sticky-md-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} -@media (min-width: 992px) { - .sticky-lg-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} -@media (min-width: 1200px) { - .sticky-xl-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} -@media (min-width: 1400px) { - .sticky-xxl-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} -.visually-hidden, -.visually-hidden-focusable:not(:focus):not(:focus-within) { - position: absolute !important; - width: 1px !important; - height: 1px !important; - padding: 0 !important; - margin: -1px !important; - overflow: hidden !important; - clip: rect(0, 0, 0, 0) !important; - white-space: nowrap !important; - border: 0 !important; -} - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - content: ""; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - -.float-start { - float: left !important; -} - -.float-end { - float: right !important; -} - -.float-none { - float: none !important; -} - -.overflow-auto { - overflow: auto !important; -} - -.overflow-hidden { - overflow: hidden !important; -} - -.overflow-visible { - overflow: visible !important; -} - -.overflow-scroll { - overflow: scroll !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-grid { - display: grid !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -.d-none { - display: none !important; -} - -.shadow { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; -} - -.shadow-sm { - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; -} - -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; -} - -.shadow-none { - box-shadow: none !important; -} - -.position-static { - position: static !important; -} - -.position-relative { - position: relative !important; -} - -.position-absolute { - position: absolute !important; -} - -.position-fixed { - position: fixed !important; -} - -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important; -} - -.top-0 { - top: 0 !important; -} - -.top-50 { - top: 50% !important; -} - -.top-100 { - top: 100% !important; -} - -.bottom-0 { - bottom: 0 !important; -} - -.bottom-50 { - bottom: 50% !important; -} - -.bottom-100 { - bottom: 100% !important; -} - -.start-0 { - left: 0 !important; -} - -.start-50 { - left: 50% !important; -} - -.start-100 { - left: 100% !important; -} - -.end-0 { - right: 0 !important; -} - -.end-50 { - right: 50% !important; -} - -.end-100 { - right: 100% !important; -} - -.translate-middle { - transform: translate(-50%, -50%) !important; -} - -.translate-middle-x { - transform: translateX(-50%) !important; -} - -.translate-middle-y { - transform: translateY(-50%) !important; -} - -.border { - border: 1px solid #dee2e6 !important; -} - -.border-0 { - border: 0 !important; -} - -.border-top { - border-top: 1px solid #dee2e6 !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-end { - border-right: 1px solid #dee2e6 !important; -} - -.border-end-0 { - border-right: 0 !important; -} - -.border-bottom { - border-bottom: 1px solid #dee2e6 !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-start { - border-left: 1px solid #dee2e6 !important; -} - -.border-start-0 { - border-left: 0 !important; -} - -.border-primary { - border-color: #0d6efd !important; -} - -.border-secondary { - border-color: #6c757d !important; -} - -.border-success { - border-color: #198754 !important; -} - -.border-info { - border-color: #0dcaf0 !important; -} - -.border-warning { - border-color: #ffc107 !important; -} - -.border-danger { - border-color: #dc3545 !important; -} - -.border-light { - border-color: #f8f9fa !important; -} - -.border-dark { - border-color: #212529 !important; -} - -.border-white { - border-color: #fff !important; -} - -.border-1 { - border-width: 1px !important; -} - -.border-2 { - border-width: 2px !important; -} - -.border-3 { - border-width: 3px !important; -} - -.border-4 { - border-width: 4px !important; -} - -.border-5 { - border-width: 5px !important; -} - -.w-25 { - width: 25% !important; -} - -.w-50 { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.w-auto { - width: auto !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.vw-100 { - width: 100vw !important; -} - -.min-vw-100 { - min-width: 100vw !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.h-auto { - height: auto !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.vh-100 { - height: 100vh !important; -} - -.min-vh-100 { - min-height: 100vh !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.gap-0 { - gap: 0 !important; -} - -.gap-1 { - gap: 0.25rem !important; -} - -.gap-2 { - gap: 0.5rem !important; -} - -.gap-3 { - gap: 1rem !important; -} - -.gap-4 { - gap: 1.5rem !important; -} - -.gap-5 { - gap: 3rem !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.justify-content-evenly { - justify-content: space-evenly !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -.order-first { - order: -1 !important; -} - -.order-0 { - order: 0 !important; -} - -.order-1 { - order: 1 !important; -} - -.order-2 { - order: 2 !important; -} - -.order-3 { - order: 3 !important; -} - -.order-4 { - order: 4 !important; -} - -.order-5 { - order: 5 !important; -} - -.order-last { - order: 6 !important; -} - -.m-0 { - margin: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mx-0 { - margin-right: 0 !important; - margin-left: 0 !important; -} - -.mx-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; -} - -.mx-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; -} - -.mx-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; -} - -.mx-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; -} - -.mx-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; -} - -.mx-auto { - margin-right: auto !important; - margin-left: auto !important; -} - -.my-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -.my-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; -} - -.my-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; -} - -.my-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; -} - -.my-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.my-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; -} - -.my-auto { - margin-top: auto !important; - margin-bottom: auto !important; -} - -.mt-0 { - margin-top: 0 !important; -} - -.mt-1 { - margin-top: 0.25rem !important; -} - -.mt-2 { - margin-top: 0.5rem !important; -} - -.mt-3 { - margin-top: 1rem !important; -} - -.mt-4 { - margin-top: 1.5rem !important; -} - -.mt-5 { - margin-top: 3rem !important; -} - -.mt-auto { - margin-top: auto !important; -} - -.me-0 { - margin-right: 0 !important; -} - -.me-1 { - margin-right: 0.25rem !important; -} - -.me-2 { - margin-right: 0.5rem !important; -} - -.me-3 { - margin-right: 1rem !important; -} - -.me-4 { - margin-right: 1.5rem !important; -} - -.me-5 { - margin-right: 3rem !important; -} - -.me-auto { - margin-right: auto !important; -} - -.mb-0 { - margin-bottom: 0 !important; -} - -.mb-1 { - margin-bottom: 0.25rem !important; -} - -.mb-2 { - margin-bottom: 0.5rem !important; -} - -.mb-3 { - margin-bottom: 1rem !important; -} - -.mb-4 { - margin-bottom: 1.5rem !important; -} - -.mb-5 { - margin-bottom: 3rem !important; -} - -.mb-auto { - margin-bottom: auto !important; -} - -.ms-0 { - margin-left: 0 !important; -} - -.ms-1 { - margin-left: 0.25rem !important; -} - -.ms-2 { - margin-left: 0.5rem !important; -} - -.ms-3 { - margin-left: 1rem !important; -} - -.ms-4 { - margin-left: 1.5rem !important; -} - -.ms-5 { - margin-left: 3rem !important; -} - -.ms-auto { - margin-left: auto !important; -} - -.p-0 { - padding: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.px-0 { - padding-right: 0 !important; - padding-left: 0 !important; -} - -.px-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; -} - -.px-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; -} - -.px-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; -} - -.px-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; -} - -.px-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; -} - -.py-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; -} - -.py-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; -} - -.py-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; -} - -.py-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; -} - -.py-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; -} - -.py-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; -} - -.pt-0 { - padding-top: 0 !important; -} - -.pt-1 { - padding-top: 0.25rem !important; -} - -.pt-2 { - padding-top: 0.5rem !important; -} - -.pt-3 { - padding-top: 1rem !important; -} - -.pt-4 { - padding-top: 1.5rem !important; -} - -.pt-5 { - padding-top: 3rem !important; -} - -.pe-0 { - padding-right: 0 !important; -} - -.pe-1 { - padding-right: 0.25rem !important; -} - -.pe-2 { - padding-right: 0.5rem !important; -} - -.pe-3 { - padding-right: 1rem !important; -} - -.pe-4 { - padding-right: 1.5rem !important; -} - -.pe-5 { - padding-right: 3rem !important; -} - -.pb-0 { - padding-bottom: 0 !important; -} - -.pb-1 { - padding-bottom: 0.25rem !important; -} - -.pb-2 { - padding-bottom: 0.5rem !important; -} - -.pb-3 { - padding-bottom: 1rem !important; -} - -.pb-4 { - padding-bottom: 1.5rem !important; -} - -.pb-5 { - padding-bottom: 3rem !important; -} - -.ps-0 { - padding-left: 0 !important; -} - -.ps-1 { - padding-left: 0.25rem !important; -} - -.ps-2 { - padding-left: 0.5rem !important; -} - -.ps-3 { - padding-left: 1rem !important; -} - -.ps-4 { - padding-left: 1.5rem !important; -} - -.ps-5 { - padding-left: 3rem !important; -} - -.font-monospace { - font-family: var(--bs-font-monospace) !important; -} - -.fs-1 { - font-size: calc(1.375rem + 1.5vw) !important; -} - -.fs-2 { - font-size: calc(1.325rem + 0.9vw) !important; -} - -.fs-3 { - font-size: calc(1.3rem + 0.6vw) !important; -} - -.fs-4 { - font-size: calc(1.275rem + 0.3vw) !important; -} - -.fs-5 { - font-size: 1.25rem !important; -} - -.fs-6 { - font-size: 1rem !important; -} - -.fst-italic { - font-style: italic !important; -} - -.fst-normal { - font-style: normal !important; -} - -.fw-light { - font-weight: 300 !important; -} - -.fw-lighter { - font-weight: lighter !important; -} - -.fw-normal { - font-weight: 400 !important; -} - -.fw-bold { - font-weight: 700 !important; -} - -.fw-bolder { - font-weight: bolder !important; -} - -.lh-1 { - line-height: 1 !important; -} - -.lh-sm { - line-height: 1.25 !important; -} - -.lh-base { - line-height: 1.5 !important; -} - -.lh-lg { - line-height: 2 !important; -} - -.text-start { - text-align: left !important; -} - -.text-end { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -.text-decoration-none { - text-decoration: none !important; -} - -.text-decoration-underline { - text-decoration: underline !important; -} - -.text-decoration-line-through { - text-decoration: line-through !important; -} - -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.text-wrap { - white-space: normal !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -/* rtl:begin:remove */ -.text-break { - word-wrap: break-word !important; - word-break: break-word !important; -} - -/* rtl:end:remove */ -.text-primary { - color: #0d6efd !important; -} - -.text-secondary { - color: #6c757d !important; -} - -.text-success { - color: #198754 !important; -} - -.text-info { - color: #0dcaf0 !important; -} - -.text-warning { - color: #ffc107 !important; -} - -.text-danger { - color: #dc3545 !important; -} - -.text-light { - color: #f8f9fa !important; -} - -.text-dark { - color: #212529 !important; -} - -.text-white { - color: #fff !important; -} - -.text-body { - color: #212529 !important; -} - -.text-muted { - color: #6c757d !important; -} - -.text-black-50 { - color: rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50 { - color: rgba(255, 255, 255, 0.5) !important; -} - -.text-reset { - color: inherit !important; -} - -.bg-primary { - background-color: #0d6efd !important; -} - -.bg-secondary { - background-color: #6c757d !important; -} - -.bg-success { - background-color: #198754 !important; -} - -.bg-info { - background-color: #0dcaf0 !important; -} - -.bg-warning { - background-color: #ffc107 !important; -} - -.bg-danger { - background-color: #dc3545 !important; -} - -.bg-light { - background-color: #f8f9fa !important; -} - -.bg-dark { - background-color: #212529 !important; -} - -.bg-body { - background-color: #fff !important; -} - -.bg-white { - background-color: #fff !important; -} - -.bg-transparent { - background-color: transparent !important; -} - -.bg-gradient { - background-image: var(--bs-gradient) !important; -} - -.user-select-all { - -webkit-user-select: all !important; - -moz-user-select: all !important; - user-select: all !important; -} - -.user-select-auto { - -webkit-user-select: auto !important; - -moz-user-select: auto !important; - user-select: auto !important; -} - -.user-select-none { - -webkit-user-select: none !important; - -moz-user-select: none !important; - user-select: none !important; -} - -.pe-none { - pointer-events: none !important; -} - -.pe-auto { - pointer-events: auto !important; -} - -.rounded { - border-radius: 0.25rem !important; -} - -.rounded-0 { - border-radius: 0 !important; -} - -.rounded-1 { - border-radius: 0.2rem !important; -} - -.rounded-2 { - border-radius: 0.25rem !important; -} - -.rounded-3 { - border-radius: 0.3rem !important; -} - -.rounded-circle { - border-radius: 50% !important; -} - -.rounded-pill { - border-radius: 50rem !important; -} - -.rounded-top { - border-top-left-radius: 0.25rem !important; - border-top-right-radius: 0.25rem !important; -} - -.rounded-end { - border-top-right-radius: 0.25rem !important; - border-bottom-right-radius: 0.25rem !important; -} - -.rounded-bottom { - border-bottom-right-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; -} - -.rounded-start { - border-bottom-left-radius: 0.25rem !important; - border-top-left-radius: 0.25rem !important; -} - -.visible { - visibility: visible !important; -} - -.invisible { - visibility: hidden !important; -} - -@media (min-width: 576px) { - .float-sm-start { - float: left !important; - } - - .float-sm-end { - float: right !important; - } - - .float-sm-none { - float: none !important; - } - - .d-sm-inline { - display: inline !important; - } - - .d-sm-inline-block { - display: inline-block !important; - } - - .d-sm-block { - display: block !important; - } - - .d-sm-grid { - display: grid !important; - } - - .d-sm-table { - display: table !important; - } - - .d-sm-table-row { - display: table-row !important; - } - - .d-sm-table-cell { - display: table-cell !important; - } - - .d-sm-flex { - display: flex !important; - } - - .d-sm-inline-flex { - display: inline-flex !important; - } - - .d-sm-none { - display: none !important; - } - - .flex-sm-fill { - flex: 1 1 auto !important; - } - - .flex-sm-row { - flex-direction: row !important; - } - - .flex-sm-column { - flex-direction: column !important; - } - - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - - .flex-sm-wrap { - flex-wrap: wrap !important; - } - - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .gap-sm-0 { - gap: 0 !important; - } - - .gap-sm-1 { - gap: 0.25rem !important; - } - - .gap-sm-2 { - gap: 0.5rem !important; - } - - .gap-sm-3 { - gap: 1rem !important; - } - - .gap-sm-4 { - gap: 1.5rem !important; - } - - .gap-sm-5 { - gap: 3rem !important; - } - - .justify-content-sm-start { - justify-content: flex-start !important; - } - - .justify-content-sm-end { - justify-content: flex-end !important; - } - - .justify-content-sm-center { - justify-content: center !important; - } - - .justify-content-sm-between { - justify-content: space-between !important; - } - - .justify-content-sm-around { - justify-content: space-around !important; - } - - .justify-content-sm-evenly { - justify-content: space-evenly !important; - } - - .align-items-sm-start { - align-items: flex-start !important; - } - - .align-items-sm-end { - align-items: flex-end !important; - } - - .align-items-sm-center { - align-items: center !important; - } - - .align-items-sm-baseline { - align-items: baseline !important; - } - - .align-items-sm-stretch { - align-items: stretch !important; - } - - .align-content-sm-start { - align-content: flex-start !important; - } - - .align-content-sm-end { - align-content: flex-end !important; - } - - .align-content-sm-center { - align-content: center !important; - } - - .align-content-sm-between { - align-content: space-between !important; - } - - .align-content-sm-around { - align-content: space-around !important; - } - - .align-content-sm-stretch { - align-content: stretch !important; - } - - .align-self-sm-auto { - align-self: auto !important; - } - - .align-self-sm-start { - align-self: flex-start !important; - } - - .align-self-sm-end { - align-self: flex-end !important; - } - - .align-self-sm-center { - align-self: center !important; - } - - .align-self-sm-baseline { - align-self: baseline !important; - } - - .align-self-sm-stretch { - align-self: stretch !important; - } - - .order-sm-first { - order: -1 !important; - } - - .order-sm-0 { - order: 0 !important; - } - - .order-sm-1 { - order: 1 !important; - } - - .order-sm-2 { - order: 2 !important; - } - - .order-sm-3 { - order: 3 !important; - } - - .order-sm-4 { - order: 4 !important; - } - - .order-sm-5 { - order: 5 !important; - } - - .order-sm-last { - order: 6 !important; - } - - .m-sm-0 { - margin: 0 !important; - } - - .m-sm-1 { - margin: 0.25rem !important; - } - - .m-sm-2 { - margin: 0.5rem !important; - } - - .m-sm-3 { - margin: 1rem !important; - } - - .m-sm-4 { - margin: 1.5rem !important; - } - - .m-sm-5 { - margin: 3rem !important; - } - - .m-sm-auto { - margin: auto !important; - } - - .mx-sm-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - - .mx-sm-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - - .mx-sm-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - - .mx-sm-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - - .mx-sm-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - - .mx-sm-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - - .mx-sm-auto { - margin-right: auto !important; - margin-left: auto !important; - } - - .my-sm-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - - .my-sm-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - - .my-sm-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - - .my-sm-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - - .my-sm-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - - .my-sm-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - - .my-sm-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - - .mt-sm-0 { - margin-top: 0 !important; - } - - .mt-sm-1 { - margin-top: 0.25rem !important; - } - - .mt-sm-2 { - margin-top: 0.5rem !important; - } - - .mt-sm-3 { - margin-top: 1rem !important; - } - - .mt-sm-4 { - margin-top: 1.5rem !important; - } - - .mt-sm-5 { - margin-top: 3rem !important; - } - - .mt-sm-auto { - margin-top: auto !important; - } - - .me-sm-0 { - margin-right: 0 !important; - } - - .me-sm-1 { - margin-right: 0.25rem !important; - } - - .me-sm-2 { - margin-right: 0.5rem !important; - } - - .me-sm-3 { - margin-right: 1rem !important; - } - - .me-sm-4 { - margin-right: 1.5rem !important; - } - - .me-sm-5 { - margin-right: 3rem !important; - } - - .me-sm-auto { - margin-right: auto !important; - } - - .mb-sm-0 { - margin-bottom: 0 !important; - } - - .mb-sm-1 { - margin-bottom: 0.25rem !important; - } - - .mb-sm-2 { - margin-bottom: 0.5rem !important; - } - - .mb-sm-3 { - margin-bottom: 1rem !important; - } - - .mb-sm-4 { - margin-bottom: 1.5rem !important; - } - - .mb-sm-5 { - margin-bottom: 3rem !important; - } - - .mb-sm-auto { - margin-bottom: auto !important; - } - - .ms-sm-0 { - margin-left: 0 !important; - } - - .ms-sm-1 { - margin-left: 0.25rem !important; - } - - .ms-sm-2 { - margin-left: 0.5rem !important; - } - - .ms-sm-3 { - margin-left: 1rem !important; - } - - .ms-sm-4 { - margin-left: 1.5rem !important; - } - - .ms-sm-5 { - margin-left: 3rem !important; - } - - .ms-sm-auto { - margin-left: auto !important; - } - - .p-sm-0 { - padding: 0 !important; - } - - .p-sm-1 { - padding: 0.25rem !important; - } - - .p-sm-2 { - padding: 0.5rem !important; - } - - .p-sm-3 { - padding: 1rem !important; - } - - .p-sm-4 { - padding: 1.5rem !important; - } - - .p-sm-5 { - padding: 3rem !important; - } - - .px-sm-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - - .px-sm-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - - .px-sm-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - - .px-sm-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - - .px-sm-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - - .px-sm-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - - .py-sm-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - - .py-sm-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - - .py-sm-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - - .py-sm-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - - .py-sm-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - - .py-sm-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - - .pt-sm-0 { - padding-top: 0 !important; - } - - .pt-sm-1 { - padding-top: 0.25rem !important; - } - - .pt-sm-2 { - padding-top: 0.5rem !important; - } - - .pt-sm-3 { - padding-top: 1rem !important; - } - - .pt-sm-4 { - padding-top: 1.5rem !important; - } - - .pt-sm-5 { - padding-top: 3rem !important; - } - - .pe-sm-0 { - padding-right: 0 !important; - } - - .pe-sm-1 { - padding-right: 0.25rem !important; - } - - .pe-sm-2 { - padding-right: 0.5rem !important; - } - - .pe-sm-3 { - padding-right: 1rem !important; - } - - .pe-sm-4 { - padding-right: 1.5rem !important; - } - - .pe-sm-5 { - padding-right: 3rem !important; - } - - .pb-sm-0 { - padding-bottom: 0 !important; - } - - .pb-sm-1 { - padding-bottom: 0.25rem !important; - } - - .pb-sm-2 { - padding-bottom: 0.5rem !important; - } - - .pb-sm-3 { - padding-bottom: 1rem !important; - } - - .pb-sm-4 { - padding-bottom: 1.5rem !important; - } - - .pb-sm-5 { - padding-bottom: 3rem !important; - } - - .ps-sm-0 { - padding-left: 0 !important; - } - - .ps-sm-1 { - padding-left: 0.25rem !important; - } - - .ps-sm-2 { - padding-left: 0.5rem !important; - } - - .ps-sm-3 { - padding-left: 1rem !important; - } - - .ps-sm-4 { - padding-left: 1.5rem !important; - } - - .ps-sm-5 { - padding-left: 3rem !important; - } - - .text-sm-start { - text-align: left !important; - } - - .text-sm-end { - text-align: right !important; - } - - .text-sm-center { - text-align: center !important; - } -} -@media (min-width: 768px) { - .float-md-start { - float: left !important; - } - - .float-md-end { - float: right !important; - } - - .float-md-none { - float: none !important; - } - - .d-md-inline { - display: inline !important; - } - - .d-md-inline-block { - display: inline-block !important; - } - - .d-md-block { - display: block !important; - } - - .d-md-grid { - display: grid !important; - } - - .d-md-table { - display: table !important; - } - - .d-md-table-row { - display: table-row !important; - } - - .d-md-table-cell { - display: table-cell !important; - } - - .d-md-flex { - display: flex !important; - } - - .d-md-inline-flex { - display: inline-flex !important; - } - - .d-md-none { - display: none !important; - } - - .flex-md-fill { - flex: 1 1 auto !important; - } - - .flex-md-row { - flex-direction: row !important; - } - - .flex-md-column { - flex-direction: column !important; - } - - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-md-grow-0 { - flex-grow: 0 !important; - } - - .flex-md-grow-1 { - flex-grow: 1 !important; - } - - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - - .flex-md-wrap { - flex-wrap: wrap !important; - } - - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .gap-md-0 { - gap: 0 !important; - } - - .gap-md-1 { - gap: 0.25rem !important; - } - - .gap-md-2 { - gap: 0.5rem !important; - } - - .gap-md-3 { - gap: 1rem !important; - } - - .gap-md-4 { - gap: 1.5rem !important; - } - - .gap-md-5 { - gap: 3rem !important; - } - - .justify-content-md-start { - justify-content: flex-start !important; - } - - .justify-content-md-end { - justify-content: flex-end !important; - } - - .justify-content-md-center { - justify-content: center !important; - } - - .justify-content-md-between { - justify-content: space-between !important; - } - - .justify-content-md-around { - justify-content: space-around !important; - } - - .justify-content-md-evenly { - justify-content: space-evenly !important; - } - - .align-items-md-start { - align-items: flex-start !important; - } - - .align-items-md-end { - align-items: flex-end !important; - } - - .align-items-md-center { - align-items: center !important; - } - - .align-items-md-baseline { - align-items: baseline !important; - } - - .align-items-md-stretch { - align-items: stretch !important; - } - - .align-content-md-start { - align-content: flex-start !important; - } - - .align-content-md-end { - align-content: flex-end !important; - } - - .align-content-md-center { - align-content: center !important; - } - - .align-content-md-between { - align-content: space-between !important; - } - - .align-content-md-around { - align-content: space-around !important; - } - - .align-content-md-stretch { - align-content: stretch !important; - } - - .align-self-md-auto { - align-self: auto !important; - } - - .align-self-md-start { - align-self: flex-start !important; - } - - .align-self-md-end { - align-self: flex-end !important; - } - - .align-self-md-center { - align-self: center !important; - } - - .align-self-md-baseline { - align-self: baseline !important; - } - - .align-self-md-stretch { - align-self: stretch !important; - } - - .order-md-first { - order: -1 !important; - } - - .order-md-0 { - order: 0 !important; - } - - .order-md-1 { - order: 1 !important; - } - - .order-md-2 { - order: 2 !important; - } - - .order-md-3 { - order: 3 !important; - } - - .order-md-4 { - order: 4 !important; - } - - .order-md-5 { - order: 5 !important; - } - - .order-md-last { - order: 6 !important; - } - - .m-md-0 { - margin: 0 !important; - } - - .m-md-1 { - margin: 0.25rem !important; - } - - .m-md-2 { - margin: 0.5rem !important; - } - - .m-md-3 { - margin: 1rem !important; - } - - .m-md-4 { - margin: 1.5rem !important; - } - - .m-md-5 { - margin: 3rem !important; - } - - .m-md-auto { - margin: auto !important; - } - - .mx-md-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - - .mx-md-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - - .mx-md-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - - .mx-md-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - - .mx-md-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - - .mx-md-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - - .mx-md-auto { - margin-right: auto !important; - margin-left: auto !important; - } - - .my-md-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - - .my-md-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - - .my-md-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - - .my-md-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - - .my-md-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - - .my-md-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - - .my-md-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - - .mt-md-0 { - margin-top: 0 !important; - } - - .mt-md-1 { - margin-top: 0.25rem !important; - } - - .mt-md-2 { - margin-top: 0.5rem !important; - } - - .mt-md-3 { - margin-top: 1rem !important; - } - - .mt-md-4 { - margin-top: 1.5rem !important; - } - - .mt-md-5 { - margin-top: 3rem !important; - } - - .mt-md-auto { - margin-top: auto !important; - } - - .me-md-0 { - margin-right: 0 !important; - } - - .me-md-1 { - margin-right: 0.25rem !important; - } - - .me-md-2 { - margin-right: 0.5rem !important; - } - - .me-md-3 { - margin-right: 1rem !important; - } - - .me-md-4 { - margin-right: 1.5rem !important; - } - - .me-md-5 { - margin-right: 3rem !important; - } - - .me-md-auto { - margin-right: auto !important; - } - - .mb-md-0 { - margin-bottom: 0 !important; - } - - .mb-md-1 { - margin-bottom: 0.25rem !important; - } - - .mb-md-2 { - margin-bottom: 0.5rem !important; - } - - .mb-md-3 { - margin-bottom: 1rem !important; - } - - .mb-md-4 { - margin-bottom: 1.5rem !important; - } - - .mb-md-5 { - margin-bottom: 3rem !important; - } - - .mb-md-auto { - margin-bottom: auto !important; - } - - .ms-md-0 { - margin-left: 0 !important; - } - - .ms-md-1 { - margin-left: 0.25rem !important; - } - - .ms-md-2 { - margin-left: 0.5rem !important; - } - - .ms-md-3 { - margin-left: 1rem !important; - } - - .ms-md-4 { - margin-left: 1.5rem !important; - } - - .ms-md-5 { - margin-left: 3rem !important; - } - - .ms-md-auto { - margin-left: auto !important; - } - - .p-md-0 { - padding: 0 !important; - } - - .p-md-1 { - padding: 0.25rem !important; - } - - .p-md-2 { - padding: 0.5rem !important; - } - - .p-md-3 { - padding: 1rem !important; - } - - .p-md-4 { - padding: 1.5rem !important; - } - - .p-md-5 { - padding: 3rem !important; - } - - .px-md-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - - .px-md-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - - .px-md-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - - .px-md-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - - .px-md-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - - .px-md-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - - .py-md-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - - .py-md-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - - .py-md-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - - .py-md-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - - .py-md-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - - .py-md-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - - .pt-md-0 { - padding-top: 0 !important; - } - - .pt-md-1 { - padding-top: 0.25rem !important; - } - - .pt-md-2 { - padding-top: 0.5rem !important; - } - - .pt-md-3 { - padding-top: 1rem !important; - } - - .pt-md-4 { - padding-top: 1.5rem !important; - } - - .pt-md-5 { - padding-top: 3rem !important; - } - - .pe-md-0 { - padding-right: 0 !important; - } - - .pe-md-1 { - padding-right: 0.25rem !important; - } - - .pe-md-2 { - padding-right: 0.5rem !important; - } - - .pe-md-3 { - padding-right: 1rem !important; - } - - .pe-md-4 { - padding-right: 1.5rem !important; - } - - .pe-md-5 { - padding-right: 3rem !important; - } - - .pb-md-0 { - padding-bottom: 0 !important; - } - - .pb-md-1 { - padding-bottom: 0.25rem !important; - } - - .pb-md-2 { - padding-bottom: 0.5rem !important; - } - - .pb-md-3 { - padding-bottom: 1rem !important; - } - - .pb-md-4 { - padding-bottom: 1.5rem !important; - } - - .pb-md-5 { - padding-bottom: 3rem !important; - } - - .ps-md-0 { - padding-left: 0 !important; - } - - .ps-md-1 { - padding-left: 0.25rem !important; - } - - .ps-md-2 { - padding-left: 0.5rem !important; - } - - .ps-md-3 { - padding-left: 1rem !important; - } - - .ps-md-4 { - padding-left: 1.5rem !important; - } - - .ps-md-5 { - padding-left: 3rem !important; - } - - .text-md-start { - text-align: left !important; - } - - .text-md-end { - text-align: right !important; - } - - .text-md-center { - text-align: center !important; - } -} -@media (min-width: 992px) { - .float-lg-start { - float: left !important; - } - - .float-lg-end { - float: right !important; - } - - .float-lg-none { - float: none !important; - } - - .d-lg-inline { - display: inline !important; - } - - .d-lg-inline-block { - display: inline-block !important; - } - - .d-lg-block { - display: block !important; - } - - .d-lg-grid { - display: grid !important; - } - - .d-lg-table { - display: table !important; - } - - .d-lg-table-row { - display: table-row !important; - } - - .d-lg-table-cell { - display: table-cell !important; - } - - .d-lg-flex { - display: flex !important; - } - - .d-lg-inline-flex { - display: inline-flex !important; - } - - .d-lg-none { - display: none !important; - } - - .flex-lg-fill { - flex: 1 1 auto !important; - } - - .flex-lg-row { - flex-direction: row !important; - } - - .flex-lg-column { - flex-direction: column !important; - } - - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - - .flex-lg-wrap { - flex-wrap: wrap !important; - } - - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .gap-lg-0 { - gap: 0 !important; - } - - .gap-lg-1 { - gap: 0.25rem !important; - } - - .gap-lg-2 { - gap: 0.5rem !important; - } - - .gap-lg-3 { - gap: 1rem !important; - } - - .gap-lg-4 { - gap: 1.5rem !important; - } - - .gap-lg-5 { - gap: 3rem !important; - } - - .justify-content-lg-start { - justify-content: flex-start !important; - } - - .justify-content-lg-end { - justify-content: flex-end !important; - } - - .justify-content-lg-center { - justify-content: center !important; - } - - .justify-content-lg-between { - justify-content: space-between !important; - } - - .justify-content-lg-around { - justify-content: space-around !important; - } - - .justify-content-lg-evenly { - justify-content: space-evenly !important; - } - - .align-items-lg-start { - align-items: flex-start !important; - } - - .align-items-lg-end { - align-items: flex-end !important; - } - - .align-items-lg-center { - align-items: center !important; - } - - .align-items-lg-baseline { - align-items: baseline !important; - } - - .align-items-lg-stretch { - align-items: stretch !important; - } - - .align-content-lg-start { - align-content: flex-start !important; - } - - .align-content-lg-end { - align-content: flex-end !important; - } - - .align-content-lg-center { - align-content: center !important; - } - - .align-content-lg-between { - align-content: space-between !important; - } - - .align-content-lg-around { - align-content: space-around !important; - } - - .align-content-lg-stretch { - align-content: stretch !important; - } - - .align-self-lg-auto { - align-self: auto !important; - } - - .align-self-lg-start { - align-self: flex-start !important; - } - - .align-self-lg-end { - align-self: flex-end !important; - } - - .align-self-lg-center { - align-self: center !important; - } - - .align-self-lg-baseline { - align-self: baseline !important; - } - - .align-self-lg-stretch { - align-self: stretch !important; - } - - .order-lg-first { - order: -1 !important; - } - - .order-lg-0 { - order: 0 !important; - } - - .order-lg-1 { - order: 1 !important; - } - - .order-lg-2 { - order: 2 !important; - } - - .order-lg-3 { - order: 3 !important; - } - - .order-lg-4 { - order: 4 !important; - } - - .order-lg-5 { - order: 5 !important; - } - - .order-lg-last { - order: 6 !important; - } - - .m-lg-0 { - margin: 0 !important; - } - - .m-lg-1 { - margin: 0.25rem !important; - } - - .m-lg-2 { - margin: 0.5rem !important; - } - - .m-lg-3 { - margin: 1rem !important; - } - - .m-lg-4 { - margin: 1.5rem !important; - } - - .m-lg-5 { - margin: 3rem !important; - } - - .m-lg-auto { - margin: auto !important; - } - - .mx-lg-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - - .mx-lg-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - - .mx-lg-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - - .mx-lg-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - - .mx-lg-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - - .mx-lg-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - - .mx-lg-auto { - margin-right: auto !important; - margin-left: auto !important; - } - - .my-lg-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - - .my-lg-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - - .my-lg-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - - .my-lg-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - - .my-lg-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - - .my-lg-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - - .my-lg-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - - .mt-lg-0 { - margin-top: 0 !important; - } - - .mt-lg-1 { - margin-top: 0.25rem !important; - } - - .mt-lg-2 { - margin-top: 0.5rem !important; - } - - .mt-lg-3 { - margin-top: 1rem !important; - } - - .mt-lg-4 { - margin-top: 1.5rem !important; - } - - .mt-lg-5 { - margin-top: 3rem !important; - } - - .mt-lg-auto { - margin-top: auto !important; - } - - .me-lg-0 { - margin-right: 0 !important; - } - - .me-lg-1 { - margin-right: 0.25rem !important; - } - - .me-lg-2 { - margin-right: 0.5rem !important; - } - - .me-lg-3 { - margin-right: 1rem !important; - } - - .me-lg-4 { - margin-right: 1.5rem !important; - } - - .me-lg-5 { - margin-right: 3rem !important; - } - - .me-lg-auto { - margin-right: auto !important; - } - - .mb-lg-0 { - margin-bottom: 0 !important; - } - - .mb-lg-1 { - margin-bottom: 0.25rem !important; - } - - .mb-lg-2 { - margin-bottom: 0.5rem !important; - } - - .mb-lg-3 { - margin-bottom: 1rem !important; - } - - .mb-lg-4 { - margin-bottom: 1.5rem !important; - } - - .mb-lg-5 { - margin-bottom: 3rem !important; - } - - .mb-lg-auto { - margin-bottom: auto !important; - } - - .ms-lg-0 { - margin-left: 0 !important; - } - - .ms-lg-1 { - margin-left: 0.25rem !important; - } - - .ms-lg-2 { - margin-left: 0.5rem !important; - } - - .ms-lg-3 { - margin-left: 1rem !important; - } - - .ms-lg-4 { - margin-left: 1.5rem !important; - } - - .ms-lg-5 { - margin-left: 3rem !important; - } - - .ms-lg-auto { - margin-left: auto !important; - } - - .p-lg-0 { - padding: 0 !important; - } - - .p-lg-1 { - padding: 0.25rem !important; - } - - .p-lg-2 { - padding: 0.5rem !important; - } - - .p-lg-3 { - padding: 1rem !important; - } - - .p-lg-4 { - padding: 1.5rem !important; - } - - .p-lg-5 { - padding: 3rem !important; - } - - .px-lg-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - - .px-lg-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - - .px-lg-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - - .px-lg-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - - .px-lg-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - - .px-lg-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - - .py-lg-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - - .py-lg-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - - .py-lg-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - - .py-lg-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - - .py-lg-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - - .py-lg-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - - .pt-lg-0 { - padding-top: 0 !important; - } - - .pt-lg-1 { - padding-top: 0.25rem !important; - } - - .pt-lg-2 { - padding-top: 0.5rem !important; - } - - .pt-lg-3 { - padding-top: 1rem !important; - } - - .pt-lg-4 { - padding-top: 1.5rem !important; - } - - .pt-lg-5 { - padding-top: 3rem !important; - } - - .pe-lg-0 { - padding-right: 0 !important; - } - - .pe-lg-1 { - padding-right: 0.25rem !important; - } - - .pe-lg-2 { - padding-right: 0.5rem !important; - } - - .pe-lg-3 { - padding-right: 1rem !important; - } - - .pe-lg-4 { - padding-right: 1.5rem !important; - } - - .pe-lg-5 { - padding-right: 3rem !important; - } - - .pb-lg-0 { - padding-bottom: 0 !important; - } - - .pb-lg-1 { - padding-bottom: 0.25rem !important; - } - - .pb-lg-2 { - padding-bottom: 0.5rem !important; - } - - .pb-lg-3 { - padding-bottom: 1rem !important; - } - - .pb-lg-4 { - padding-bottom: 1.5rem !important; - } - - .pb-lg-5 { - padding-bottom: 3rem !important; - } - - .ps-lg-0 { - padding-left: 0 !important; - } - - .ps-lg-1 { - padding-left: 0.25rem !important; - } - - .ps-lg-2 { - padding-left: 0.5rem !important; - } - - .ps-lg-3 { - padding-left: 1rem !important; - } - - .ps-lg-4 { - padding-left: 1.5rem !important; - } - - .ps-lg-5 { - padding-left: 3rem !important; - } - - .text-lg-start { - text-align: left !important; - } - - .text-lg-end { - text-align: right !important; - } - - .text-lg-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .float-xl-start { - float: left !important; - } - - .float-xl-end { - float: right !important; - } - - .float-xl-none { - float: none !important; - } - - .d-xl-inline { - display: inline !important; - } - - .d-xl-inline-block { - display: inline-block !important; - } - - .d-xl-block { - display: block !important; - } - - .d-xl-grid { - display: grid !important; - } - - .d-xl-table { - display: table !important; - } - - .d-xl-table-row { - display: table-row !important; - } - - .d-xl-table-cell { - display: table-cell !important; - } - - .d-xl-flex { - display: flex !important; - } - - .d-xl-inline-flex { - display: inline-flex !important; - } - - .d-xl-none { - display: none !important; - } - - .flex-xl-fill { - flex: 1 1 auto !important; - } - - .flex-xl-row { - flex-direction: row !important; - } - - .flex-xl-column { - flex-direction: column !important; - } - - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - - .flex-xl-wrap { - flex-wrap: wrap !important; - } - - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .gap-xl-0 { - gap: 0 !important; - } - - .gap-xl-1 { - gap: 0.25rem !important; - } - - .gap-xl-2 { - gap: 0.5rem !important; - } - - .gap-xl-3 { - gap: 1rem !important; - } - - .gap-xl-4 { - gap: 1.5rem !important; - } - - .gap-xl-5 { - gap: 3rem !important; - } - - .justify-content-xl-start { - justify-content: flex-start !important; - } - - .justify-content-xl-end { - justify-content: flex-end !important; - } - - .justify-content-xl-center { - justify-content: center !important; - } - - .justify-content-xl-between { - justify-content: space-between !important; - } - - .justify-content-xl-around { - justify-content: space-around !important; - } - - .justify-content-xl-evenly { - justify-content: space-evenly !important; - } - - .align-items-xl-start { - align-items: flex-start !important; - } - - .align-items-xl-end { - align-items: flex-end !important; - } - - .align-items-xl-center { - align-items: center !important; - } - - .align-items-xl-baseline { - align-items: baseline !important; - } - - .align-items-xl-stretch { - align-items: stretch !important; - } - - .align-content-xl-start { - align-content: flex-start !important; - } - - .align-content-xl-end { - align-content: flex-end !important; - } - - .align-content-xl-center { - align-content: center !important; - } - - .align-content-xl-between { - align-content: space-between !important; - } - - .align-content-xl-around { - align-content: space-around !important; - } - - .align-content-xl-stretch { - align-content: stretch !important; - } - - .align-self-xl-auto { - align-self: auto !important; - } - - .align-self-xl-start { - align-self: flex-start !important; - } - - .align-self-xl-end { - align-self: flex-end !important; - } - - .align-self-xl-center { - align-self: center !important; - } - - .align-self-xl-baseline { - align-self: baseline !important; - } - - .align-self-xl-stretch { - align-self: stretch !important; - } - - .order-xl-first { - order: -1 !important; - } - - .order-xl-0 { - order: 0 !important; - } - - .order-xl-1 { - order: 1 !important; - } - - .order-xl-2 { - order: 2 !important; - } - - .order-xl-3 { - order: 3 !important; - } - - .order-xl-4 { - order: 4 !important; - } - - .order-xl-5 { - order: 5 !important; - } - - .order-xl-last { - order: 6 !important; - } - - .m-xl-0 { - margin: 0 !important; - } - - .m-xl-1 { - margin: 0.25rem !important; - } - - .m-xl-2 { - margin: 0.5rem !important; - } - - .m-xl-3 { - margin: 1rem !important; - } - - .m-xl-4 { - margin: 1.5rem !important; - } - - .m-xl-5 { - margin: 3rem !important; - } - - .m-xl-auto { - margin: auto !important; - } - - .mx-xl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - - .mx-xl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - - .mx-xl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - - .mx-xl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - - .mx-xl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - - .mx-xl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - - .mx-xl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - - .my-xl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - - .my-xl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - - .my-xl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - - .my-xl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - - .my-xl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - - .my-xl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - - .my-xl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - - .mt-xl-0 { - margin-top: 0 !important; - } - - .mt-xl-1 { - margin-top: 0.25rem !important; - } - - .mt-xl-2 { - margin-top: 0.5rem !important; - } - - .mt-xl-3 { - margin-top: 1rem !important; - } - - .mt-xl-4 { - margin-top: 1.5rem !important; - } - - .mt-xl-5 { - margin-top: 3rem !important; - } - - .mt-xl-auto { - margin-top: auto !important; - } - - .me-xl-0 { - margin-right: 0 !important; - } - - .me-xl-1 { - margin-right: 0.25rem !important; - } - - .me-xl-2 { - margin-right: 0.5rem !important; - } - - .me-xl-3 { - margin-right: 1rem !important; - } - - .me-xl-4 { - margin-right: 1.5rem !important; - } - - .me-xl-5 { - margin-right: 3rem !important; - } - - .me-xl-auto { - margin-right: auto !important; - } - - .mb-xl-0 { - margin-bottom: 0 !important; - } - - .mb-xl-1 { - margin-bottom: 0.25rem !important; - } - - .mb-xl-2 { - margin-bottom: 0.5rem !important; - } - - .mb-xl-3 { - margin-bottom: 1rem !important; - } - - .mb-xl-4 { - margin-bottom: 1.5rem !important; - } - - .mb-xl-5 { - margin-bottom: 3rem !important; - } - - .mb-xl-auto { - margin-bottom: auto !important; - } - - .ms-xl-0 { - margin-left: 0 !important; - } - - .ms-xl-1 { - margin-left: 0.25rem !important; - } - - .ms-xl-2 { - margin-left: 0.5rem !important; - } - - .ms-xl-3 { - margin-left: 1rem !important; - } - - .ms-xl-4 { - margin-left: 1.5rem !important; - } - - .ms-xl-5 { - margin-left: 3rem !important; - } - - .ms-xl-auto { - margin-left: auto !important; - } - - .p-xl-0 { - padding: 0 !important; - } - - .p-xl-1 { - padding: 0.25rem !important; - } - - .p-xl-2 { - padding: 0.5rem !important; - } - - .p-xl-3 { - padding: 1rem !important; - } - - .p-xl-4 { - padding: 1.5rem !important; - } - - .p-xl-5 { - padding: 3rem !important; - } - - .px-xl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - - .px-xl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - - .px-xl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - - .px-xl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - - .px-xl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - - .px-xl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - - .py-xl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - - .py-xl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - - .py-xl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - - .py-xl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - - .py-xl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - - .py-xl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - - .pt-xl-0 { - padding-top: 0 !important; - } - - .pt-xl-1 { - padding-top: 0.25rem !important; - } - - .pt-xl-2 { - padding-top: 0.5rem !important; - } - - .pt-xl-3 { - padding-top: 1rem !important; - } - - .pt-xl-4 { - padding-top: 1.5rem !important; - } - - .pt-xl-5 { - padding-top: 3rem !important; - } - - .pe-xl-0 { - padding-right: 0 !important; - } - - .pe-xl-1 { - padding-right: 0.25rem !important; - } - - .pe-xl-2 { - padding-right: 0.5rem !important; - } - - .pe-xl-3 { - padding-right: 1rem !important; - } - - .pe-xl-4 { - padding-right: 1.5rem !important; - } - - .pe-xl-5 { - padding-right: 3rem !important; - } - - .pb-xl-0 { - padding-bottom: 0 !important; - } - - .pb-xl-1 { - padding-bottom: 0.25rem !important; - } - - .pb-xl-2 { - padding-bottom: 0.5rem !important; - } - - .pb-xl-3 { - padding-bottom: 1rem !important; - } - - .pb-xl-4 { - padding-bottom: 1.5rem !important; - } - - .pb-xl-5 { - padding-bottom: 3rem !important; - } - - .ps-xl-0 { - padding-left: 0 !important; - } - - .ps-xl-1 { - padding-left: 0.25rem !important; - } - - .ps-xl-2 { - padding-left: 0.5rem !important; - } - - .ps-xl-3 { - padding-left: 1rem !important; - } - - .ps-xl-4 { - padding-left: 1.5rem !important; - } - - .ps-xl-5 { - padding-left: 3rem !important; - } - - .text-xl-start { - text-align: left !important; - } - - .text-xl-end { - text-align: right !important; - } - - .text-xl-center { - text-align: center !important; - } -} -@media (min-width: 1400px) { - .float-xxl-start { - float: left !important; - } - - .float-xxl-end { - float: right !important; - } - - .float-xxl-none { - float: none !important; - } - - .d-xxl-inline { - display: inline !important; - } - - .d-xxl-inline-block { - display: inline-block !important; - } - - .d-xxl-block { - display: block !important; - } - - .d-xxl-grid { - display: grid !important; - } - - .d-xxl-table { - display: table !important; - } - - .d-xxl-table-row { - display: table-row !important; - } - - .d-xxl-table-cell { - display: table-cell !important; - } - - .d-xxl-flex { - display: flex !important; - } - - .d-xxl-inline-flex { - display: inline-flex !important; - } - - .d-xxl-none { - display: none !important; - } - - .flex-xxl-fill { - flex: 1 1 auto !important; - } - - .flex-xxl-row { - flex-direction: row !important; - } - - .flex-xxl-column { - flex-direction: column !important; - } - - .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-xxl-grow-0 { - flex-grow: 0 !important; - } - - .flex-xxl-grow-1 { - flex-grow: 1 !important; - } - - .flex-xxl-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-xxl-shrink-1 { - flex-shrink: 1 !important; - } - - .flex-xxl-wrap { - flex-wrap: wrap !important; - } - - .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - - .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .gap-xxl-0 { - gap: 0 !important; - } - - .gap-xxl-1 { - gap: 0.25rem !important; - } - - .gap-xxl-2 { - gap: 0.5rem !important; - } - - .gap-xxl-3 { - gap: 1rem !important; - } - - .gap-xxl-4 { - gap: 1.5rem !important; - } - - .gap-xxl-5 { - gap: 3rem !important; - } - - .justify-content-xxl-start { - justify-content: flex-start !important; - } - - .justify-content-xxl-end { - justify-content: flex-end !important; - } - - .justify-content-xxl-center { - justify-content: center !important; - } - - .justify-content-xxl-between { - justify-content: space-between !important; - } - - .justify-content-xxl-around { - justify-content: space-around !important; - } - - .justify-content-xxl-evenly { - justify-content: space-evenly !important; - } - - .align-items-xxl-start { - align-items: flex-start !important; - } - - .align-items-xxl-end { - align-items: flex-end !important; - } - - .align-items-xxl-center { - align-items: center !important; - } - - .align-items-xxl-baseline { - align-items: baseline !important; - } - - .align-items-xxl-stretch { - align-items: stretch !important; - } - - .align-content-xxl-start { - align-content: flex-start !important; - } - - .align-content-xxl-end { - align-content: flex-end !important; - } - - .align-content-xxl-center { - align-content: center !important; - } - - .align-content-xxl-between { - align-content: space-between !important; - } - - .align-content-xxl-around { - align-content: space-around !important; - } - - .align-content-xxl-stretch { - align-content: stretch !important; - } - - .align-self-xxl-auto { - align-self: auto !important; - } - - .align-self-xxl-start { - align-self: flex-start !important; - } - - .align-self-xxl-end { - align-self: flex-end !important; - } - - .align-self-xxl-center { - align-self: center !important; - } - - .align-self-xxl-baseline { - align-self: baseline !important; - } - - .align-self-xxl-stretch { - align-self: stretch !important; - } - - .order-xxl-first { - order: -1 !important; - } - - .order-xxl-0 { - order: 0 !important; - } - - .order-xxl-1 { - order: 1 !important; - } - - .order-xxl-2 { - order: 2 !important; - } - - .order-xxl-3 { - order: 3 !important; - } - - .order-xxl-4 { - order: 4 !important; - } - - .order-xxl-5 { - order: 5 !important; - } - - .order-xxl-last { - order: 6 !important; - } - - .m-xxl-0 { - margin: 0 !important; - } - - .m-xxl-1 { - margin: 0.25rem !important; - } - - .m-xxl-2 { - margin: 0.5rem !important; - } - - .m-xxl-3 { - margin: 1rem !important; - } - - .m-xxl-4 { - margin: 1.5rem !important; - } - - .m-xxl-5 { - margin: 3rem !important; - } - - .m-xxl-auto { - margin: auto !important; - } - - .mx-xxl-0 { - margin-right: 0 !important; - margin-left: 0 !important; - } - - .mx-xxl-1 { - margin-right: 0.25rem !important; - margin-left: 0.25rem !important; - } - - .mx-xxl-2 { - margin-right: 0.5rem !important; - margin-left: 0.5rem !important; - } - - .mx-xxl-3 { - margin-right: 1rem !important; - margin-left: 1rem !important; - } - - .mx-xxl-4 { - margin-right: 1.5rem !important; - margin-left: 1.5rem !important; - } - - .mx-xxl-5 { - margin-right: 3rem !important; - margin-left: 3rem !important; - } - - .mx-xxl-auto { - margin-right: auto !important; - margin-left: auto !important; - } - - .my-xxl-0 { - margin-top: 0 !important; - margin-bottom: 0 !important; - } - - .my-xxl-1 { - margin-top: 0.25rem !important; - margin-bottom: 0.25rem !important; - } - - .my-xxl-2 { - margin-top: 0.5rem !important; - margin-bottom: 0.5rem !important; - } - - .my-xxl-3 { - margin-top: 1rem !important; - margin-bottom: 1rem !important; - } - - .my-xxl-4 { - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; - } - - .my-xxl-5 { - margin-top: 3rem !important; - margin-bottom: 3rem !important; - } - - .my-xxl-auto { - margin-top: auto !important; - margin-bottom: auto !important; - } - - .mt-xxl-0 { - margin-top: 0 !important; - } - - .mt-xxl-1 { - margin-top: 0.25rem !important; - } - - .mt-xxl-2 { - margin-top: 0.5rem !important; - } - - .mt-xxl-3 { - margin-top: 1rem !important; - } - - .mt-xxl-4 { - margin-top: 1.5rem !important; - } - - .mt-xxl-5 { - margin-top: 3rem !important; - } - - .mt-xxl-auto { - margin-top: auto !important; - } - - .me-xxl-0 { - margin-right: 0 !important; - } - - .me-xxl-1 { - margin-right: 0.25rem !important; - } - - .me-xxl-2 { - margin-right: 0.5rem !important; - } - - .me-xxl-3 { - margin-right: 1rem !important; - } - - .me-xxl-4 { - margin-right: 1.5rem !important; - } - - .me-xxl-5 { - margin-right: 3rem !important; - } - - .me-xxl-auto { - margin-right: auto !important; - } - - .mb-xxl-0 { - margin-bottom: 0 !important; - } - - .mb-xxl-1 { - margin-bottom: 0.25rem !important; - } - - .mb-xxl-2 { - margin-bottom: 0.5rem !important; - } - - .mb-xxl-3 { - margin-bottom: 1rem !important; - } - - .mb-xxl-4 { - margin-bottom: 1.5rem !important; - } - - .mb-xxl-5 { - margin-bottom: 3rem !important; - } - - .mb-xxl-auto { - margin-bottom: auto !important; - } - - .ms-xxl-0 { - margin-left: 0 !important; - } - - .ms-xxl-1 { - margin-left: 0.25rem !important; - } - - .ms-xxl-2 { - margin-left: 0.5rem !important; - } - - .ms-xxl-3 { - margin-left: 1rem !important; - } - - .ms-xxl-4 { - margin-left: 1.5rem !important; - } - - .ms-xxl-5 { - margin-left: 3rem !important; - } - - .ms-xxl-auto { - margin-left: auto !important; - } - - .p-xxl-0 { - padding: 0 !important; - } - - .p-xxl-1 { - padding: 0.25rem !important; - } - - .p-xxl-2 { - padding: 0.5rem !important; - } - - .p-xxl-3 { - padding: 1rem !important; - } - - .p-xxl-4 { - padding: 1.5rem !important; - } - - .p-xxl-5 { - padding: 3rem !important; - } - - .px-xxl-0 { - padding-right: 0 !important; - padding-left: 0 !important; - } - - .px-xxl-1 { - padding-right: 0.25rem !important; - padding-left: 0.25rem !important; - } - - .px-xxl-2 { - padding-right: 0.5rem !important; - padding-left: 0.5rem !important; - } - - .px-xxl-3 { - padding-right: 1rem !important; - padding-left: 1rem !important; - } - - .px-xxl-4 { - padding-right: 1.5rem !important; - padding-left: 1.5rem !important; - } - - .px-xxl-5 { - padding-right: 3rem !important; - padding-left: 3rem !important; - } - - .py-xxl-0 { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - - .py-xxl-1 { - padding-top: 0.25rem !important; - padding-bottom: 0.25rem !important; - } - - .py-xxl-2 { - padding-top: 0.5rem !important; - padding-bottom: 0.5rem !important; - } - - .py-xxl-3 { - padding-top: 1rem !important; - padding-bottom: 1rem !important; - } - - .py-xxl-4 { - padding-top: 1.5rem !important; - padding-bottom: 1.5rem !important; - } - - .py-xxl-5 { - padding-top: 3rem !important; - padding-bottom: 3rem !important; - } - - .pt-xxl-0 { - padding-top: 0 !important; - } - - .pt-xxl-1 { - padding-top: 0.25rem !important; - } - - .pt-xxl-2 { - padding-top: 0.5rem !important; - } - - .pt-xxl-3 { - padding-top: 1rem !important; - } - - .pt-xxl-4 { - padding-top: 1.5rem !important; - } - - .pt-xxl-5 { - padding-top: 3rem !important; - } - - .pe-xxl-0 { - padding-right: 0 !important; - } - - .pe-xxl-1 { - padding-right: 0.25rem !important; - } - - .pe-xxl-2 { - padding-right: 0.5rem !important; - } - - .pe-xxl-3 { - padding-right: 1rem !important; - } - - .pe-xxl-4 { - padding-right: 1.5rem !important; - } - - .pe-xxl-5 { - padding-right: 3rem !important; - } - - .pb-xxl-0 { - padding-bottom: 0 !important; - } - - .pb-xxl-1 { - padding-bottom: 0.25rem !important; - } - - .pb-xxl-2 { - padding-bottom: 0.5rem !important; - } - - .pb-xxl-3 { - padding-bottom: 1rem !important; - } - - .pb-xxl-4 { - padding-bottom: 1.5rem !important; - } - - .pb-xxl-5 { - padding-bottom: 3rem !important; - } - - .ps-xxl-0 { - padding-left: 0 !important; - } - - .ps-xxl-1 { - padding-left: 0.25rem !important; - } - - .ps-xxl-2 { - padding-left: 0.5rem !important; - } - - .ps-xxl-3 { - padding-left: 1rem !important; - } - - .ps-xxl-4 { - padding-left: 1.5rem !important; - } - - .ps-xxl-5 { - padding-left: 3rem !important; - } - - .text-xxl-start { - text-align: left !important; - } - - .text-xxl-end { - text-align: right !important; - } - - .text-xxl-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .fs-1 { - font-size: 2.5rem !important; - } - - .fs-2 { - font-size: 2rem !important; - } - - .fs-3 { - font-size: 1.75rem !important; - } - - .fs-4 { - font-size: 1.5rem !important; - } -} -@media print { - .d-print-inline { - display: inline !important; - } - - .d-print-inline-block { - display: inline-block !important; - } - - .d-print-block { - display: block !important; - } - - .d-print-grid { - display: grid !important; - } - - .d-print-table { - display: table !important; - } - - .d-print-table-row { - display: table-row !important; - } - - .d-print-table-cell { - display: table-cell !important; - } - - .d-print-flex { - display: flex !important; - } - - .d-print-inline-flex { - display: inline-flex !important; - } - - .d-print-none { - display: none !important; - } -} - -/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file +@charset "UTF-8"; + +:root { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +.h6, .h5, .h4, .h3, .h2, .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +.h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + .h1 { + font-size: 2.5rem; + } +} + +.h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + .h2 { + font-size: 2rem; + } +} + +.h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + .h3 { + font-size: 1.75rem; + } +} + +.h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + .h4 { + font-size: 1.5rem; + } +} + +.h5 { + font-size: 1.25rem; +} + +.h6 { + font-size: 1rem; +} + +.p { + margin-top: 0; + margin-bottom: 1rem; +} + + +abbr[title], +abbr[data-bs-original-title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, .small { + font-size: 0.875em; +} + +mark, .mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: #0d6efd; + text-decoration: underline; +} +a:hover { + color: #0a58ca; +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; + direction: ltr ; + unicode-bidi: bidi-override; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: #d63384; + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 0.875em; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 1em; + font-weight: 700; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: #6c757d; + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role=button] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]::-webkit-calendar-picker-indicator { + display: none; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +[type=search] { + outline-offset: -2px; + -webkit-appearance: textfield; +} + + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::file-selector-button { + font: inherit; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: #6c757d; +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + width: 100%; + padding-right: var(--bs-gutter-x, 0.75rem); + padding-left: var(--bs-gutter-x, 0.75rem); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(var(--bs-gutter-y) * -1); + margin-right: calc(var(--bs-gutter-x) / -2); + margin-left: calc(var(--bs-gutter-x) / -2); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) / 2); + padding-left: calc(var(--bs-gutter-x) / 2); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0%; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.3333333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.6666666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.3333333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.6666666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.3333333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.6666666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.3333333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.6666666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + + .col-sm-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-sm-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-sm-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-sm-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-sm-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-sm-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-sm-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-sm-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.3333333333%; + } + + .offset-sm-2 { + margin-left: 16.6666666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.3333333333%; + } + + .offset-sm-5 { + margin-left: 41.6666666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.3333333333%; + } + + .offset-sm-8 { + margin-left: 66.6666666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.3333333333%; + } + + .offset-sm-11 { + margin-left: 91.6666666667%; + } + + .g-sm-0, +.gx-sm-0 { + --bs-gutter-x: 0; + } + + .g-sm-0, +.gy-sm-0 { + --bs-gutter-y: 0; + } + + .g-sm-1, +.gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + + .g-sm-1, +.gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + + .g-sm-2, +.gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + + .g-sm-2, +.gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + + .g-sm-3, +.gx-sm-3 { + --bs-gutter-x: 1rem; + } + + .g-sm-3, +.gy-sm-3 { + --bs-gutter-y: 1rem; + } + + .g-sm-4, +.gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + + .g-sm-4, +.gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + + .g-sm-5, +.gx-sm-5 { + --bs-gutter-x: 3rem; + } + + .g-sm-5, +.gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + + .col-md-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-md-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-md-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-md-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-md-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-md-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-md-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-md-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.3333333333%; + } + + .offset-md-2 { + margin-left: 16.6666666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.3333333333%; + } + + .offset-md-5 { + margin-left: 41.6666666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.3333333333%; + } + + .offset-md-8 { + margin-left: 66.6666666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.3333333333%; + } + + .offset-md-11 { + margin-left: 91.6666666667%; + } + + .g-md-0, +.gx-md-0 { + --bs-gutter-x: 0; + } + + .g-md-0, +.gy-md-0 { + --bs-gutter-y: 0; + } + + .g-md-1, +.gx-md-1 { + --bs-gutter-x: 0.25rem; + } + + .g-md-1, +.gy-md-1 { + --bs-gutter-y: 0.25rem; + } + + .g-md-2, +.gx-md-2 { + --bs-gutter-x: 0.5rem; + } + + .g-md-2, +.gy-md-2 { + --bs-gutter-y: 0.5rem; + } + + .g-md-3, +.gx-md-3 { + --bs-gutter-x: 1rem; + } + + .g-md-3, +.gy-md-3 { + --bs-gutter-y: 1rem; + } + + .g-md-4, +.gx-md-4 { + --bs-gutter-x: 1.5rem; + } + + .g-md-4, +.gy-md-4 { + --bs-gutter-y: 1.5rem; + } + + .g-md-5, +.gx-md-5 { + --bs-gutter-x: 3rem; + } + + .g-md-5, +.gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + + .col-lg-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-lg-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-lg-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-lg-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-lg-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-lg-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-lg-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-lg-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.3333333333%; + } + + .offset-lg-2 { + margin-left: 16.6666666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.3333333333%; + } + + .offset-lg-5 { + margin-left: 41.6666666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.3333333333%; + } + + .offset-lg-8 { + margin-left: 66.6666666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.3333333333%; + } + + .offset-lg-11 { + margin-left: 91.6666666667%; + } + + .g-lg-0, +.gx-lg-0 { + --bs-gutter-x: 0; + } + + .g-lg-0, +.gy-lg-0 { + --bs-gutter-y: 0; + } + + .g-lg-1, +.gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + + .g-lg-1, +.gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + + .g-lg-2, +.gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + + .g-lg-2, +.gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + + .g-lg-3, +.gx-lg-3 { + --bs-gutter-x: 1rem; + } + + .g-lg-3, +.gy-lg-3 { + --bs-gutter-y: 1rem; + } + + .g-lg-4, +.gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + + .g-lg-4, +.gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + + .g-lg-5, +.gx-lg-5 { + --bs-gutter-x: 3rem; + } + + .g-lg-5, +.gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xl-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-xl-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xl-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-xl-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xl-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-xl-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xl-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-xl-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.3333333333%; + } + + .offset-xl-2 { + margin-left: 16.6666666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.3333333333%; + } + + .offset-xl-5 { + margin-left: 41.6666666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.3333333333%; + } + + .offset-xl-8 { + margin-left: 66.6666666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.3333333333%; + } + + .offset-xl-11 { + margin-left: 91.6666666667%; + } + + .g-xl-0, +.gx-xl-0 { + --bs-gutter-x: 0; + } + + .g-xl-0, +.gy-xl-0 { + --bs-gutter-y: 0; + } + + .g-xl-1, +.gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + + .g-xl-1, +.gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + + .g-xl-2, +.gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + + .g-xl-2, +.gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + + .g-xl-3, +.gx-xl-3 { + --bs-gutter-x: 1rem; + } + + .g-xl-3, +.gy-xl-3 { + --bs-gutter-y: 1rem; + } + + .g-xl-4, +.gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + + .g-xl-4, +.gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + + .g-xl-5, +.gx-xl-5 { + --bs-gutter-x: 3rem; + } + + .g-xl-5, +.gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + + .col-xxl-1 { + flex: 0 0 auto; + width: 8.3333333333%; + } + + .col-xxl-2 { + flex: 0 0 auto; + width: 16.6666666667%; + } + + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + + .col-xxl-4 { + flex: 0 0 auto; + width: 33.3333333333%; + } + + .col-xxl-5 { + flex: 0 0 auto; + width: 41.6666666667%; + } + + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + + .col-xxl-7 { + flex: 0 0 auto; + width: 58.3333333333%; + } + + .col-xxl-8 { + flex: 0 0 auto; + width: 66.6666666667%; + } + + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + + .col-xxl-10 { + flex: 0 0 auto; + width: 83.3333333333%; + } + + .col-xxl-11 { + flex: 0 0 auto; + width: 91.6666666667%; + } + + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + + .offset-xxl-0 { + margin-left: 0; + } + + .offset-xxl-1 { + margin-left: 8.3333333333%; + } + + .offset-xxl-2 { + margin-left: 16.6666666667%; + } + + .offset-xxl-3 { + margin-left: 25%; + } + + .offset-xxl-4 { + margin-left: 33.3333333333%; + } + + .offset-xxl-5 { + margin-left: 41.6666666667%; + } + + .offset-xxl-6 { + margin-left: 50%; + } + + .offset-xxl-7 { + margin-left: 58.3333333333%; + } + + .offset-xxl-8 { + margin-left: 66.6666666667%; + } + + .offset-xxl-9 { + margin-left: 75%; + } + + .offset-xxl-10 { + margin-left: 83.3333333333%; + } + + .offset-xxl-11 { + margin-left: 91.6666666667%; + } + + .g-xxl-0, +.gx-xxl-0 { + --bs-gutter-x: 0; + } + + .g-xxl-0, +.gy-xxl-0 { + --bs-gutter-y: 0; + } + + .g-xxl-1, +.gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + + .g-xxl-1, +.gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + + .g-xxl-2, +.gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + + .g-xxl-2, +.gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + + .g-xxl-3, +.gx-xxl-3 { + --bs-gutter-x: 1rem; + } + + .g-xxl-3, +.gy-xxl-3 { + --bs-gutter-y: 1rem; + } + + .g-xxl-4, +.gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + + .g-xxl-4, +.gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + + .g-xxl-5, +.gx-xxl-5 { + --bs-gutter-x: 3rem; + } + + .g-xxl-5, +.gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-bg: transparent; + --bs-table-accent-bg: transparent; + --bs-table-striped-color: #212529; + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: #212529; + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: #212529; + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: #212529; + vertical-align: top; + border-color: #dee2e6; +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table > :not(:last-child) > :last-child > * { + border-bottom-color: currentColor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > * { + border-width: 1px 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 1px; +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} + +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); +} + +.table-hover > tbody > tr:hover { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); +} + +.table-primary { + --bs-table-bg: #cfe2ff; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: #000; + border-color: #bacbe6; +} + +.table-secondary { + --bs-table-bg: #e2e3e5; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: #000; + border-color: #cbccce; +} + +.table-success { + --bs-table-bg: #d1e7dd; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: #000; + border-color: #bcd0c7; +} + +.table-info { + --bs-table-bg: #cff4fc; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: #000; + border-color: #badce3; +} + +.table-warning { + --bs-table-bg: #fff3cd; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: #000; + border-color: #e6dbb9; +} + +.table-danger { + --bs-table-bg: #f8d7da; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: #000; + border-color: #dfc2c4; +} + +.table-light { + --bs-table-bg: #f8f9fa; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: #000; + border-color: #dfe0e1; +} + +.table-dark { + --bs-table-bg: #212529; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #373b3e; +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: #6c757d; +} + +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type=file] { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: #212529; + background-color: #fff; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + height: 1.5em; +} +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #dde0e3; +} +.form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #212529; + background-color: #e9ecef; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #dde0e3; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} + +textarea.form-control { + min-height: calc(1.5em + 0.75rem + 2px); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); +} + +.form-control-color { + max-width: 3rem; + height: auto; + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + height: 1.5em; + border-radius: 0.25rem; +} +.form-control-color::-webkit-color-swatch { + height: 1.5em; + border-radius: 0.25rem; +} + +.form-select { + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: #e9ecef; +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #212529; +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: 1px solid rgba(0, 0, 0, 0.25); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + color-adjust: exact; +} +.form-check-input[type=checkbox] { + border-radius: 0.25em; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type=checkbox] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-select { + height: calc(3.5rem + 2px); + padding: 1rem 0.75rem; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + height: 100%; + padding: 1rem 0.75rem; + pointer-events: none; + border: 1px solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus { + z-index: 3; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 3; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} + +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #198754; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(25, 135, 84, 0.9); + border-radius: 0.25rem; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #198754; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, .form-select.is-valid { + border-color: #198754; +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + border-color: #198754; + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} + +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: #198754; +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: #198754; +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #198754; +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid, +.was-validated .input-group .form-select:valid, +.input-group .form-select.is-valid { + z-index: 1; +} +.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus, +.was-validated .input-group .form-select:valid:focus, +.input-group .form-select.is-valid:focus { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, .form-select.is-invalid { + border-color: #dc3545; +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: #dc3545; +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: #dc3545; +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid, +.was-validated .input-group .form-select:invalid, +.input-group .form-select.is-invalid { + z-index: 2; +} +.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus, +.was-validated .input-group .form-select:invalid:focus, +.input-group .form-select.is-invalid:focus { + z-index: 3; +} + +.btn { + display: inline-block; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #212529; +} +.btn-check:focus + .btn, .btn:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + pointer-events: none; + opacity: 0.65; +} + +.btn-primary { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-primary:hover { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; +} +.btn-check:focus + .btn-primary, .btn-primary:focus { + color: #fff; + background-color: #0b5ed7; + border-color: #0a58ca; + box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); +} +.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0a58ca; + border-color: #0a53be; +} +.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5); +} +.btn-primary:disabled, .btn-primary.disabled { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-secondary:hover { + color: #fff; + background-color: #5c636a; + border-color: #565e64; +} +.btn-check:focus + .btn-secondary, .btn-secondary:focus { + color: #fff; + background-color: #5c636a; + border-color: #565e64; + box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); +} +.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #565e64; + border-color: #51585e; +} +.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5); +} +.btn-secondary:disabled, .btn-secondary.disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-success { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-success:hover { + color: #fff; + background-color: #157347; + border-color: #146c43; +} +.btn-check:focus + .btn-success, .btn-success:focus { + color: #fff; + background-color: #157347; + border-color: #146c43; + box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); +} +.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #146c43; + border-color: #13653f; +} +.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5); +} +.btn-success:disabled, .btn-success.disabled { + color: #fff; + background-color: #198754; + border-color: #198754; +} + +.btn-info { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-info:hover { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; +} +.btn-check:focus + .btn-info, .btn-info:focus { + color: #000; + background-color: #31d2f2; + border-color: #25cff2; + box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); +} +.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle { + color: #000; + background-color: #3dd5f3; + border-color: #25cff2; +} +.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5); +} +.btn-info:disabled, .btn-info.disabled { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} + +.btn-warning { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-warning:hover { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; +} +.btn-check:focus + .btn-warning, .btn-warning:focus { + color: #000; + background-color: #ffca2c; + border-color: #ffc720; + box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); +} +.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle { + color: #000; + background-color: #ffcd39; + border-color: #ffc720; +} +.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5); +} +.btn-warning:disabled, .btn-warning.disabled { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-danger:hover { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; +} +.btn-check:focus + .btn-danger, .btn-danger:focus { + color: #fff; + background-color: #bb2d3b; + border-color: #b02a37; + box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); +} +.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #b02a37; + border-color: #a52834; +} +.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5); +} +.btn-danger:disabled, .btn-danger.disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-light { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-light:hover { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:focus + .btn-light, .btn-light:focus { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); +} +.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle { + color: #000; + background-color: #f9fafb; + border-color: #f9fafb; +} +.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5); +} +.btn-light:disabled, .btn-light.disabled { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-dark { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-dark:hover { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; +} +.btn-check:focus + .btn-dark, .btn-dark:focus { + color: #fff; + background-color: #1c1f23; + border-color: #1a1e21; + box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); +} +.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1a1e21; + border-color: #191c1f; +} +.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5); +} +.btn-dark:disabled, .btn-dark.disabled { + color: #fff; + background-color: #212529; + border-color: #212529; +} + +.btn-outline-primary { + color: #0d6efd; + border-color: #0d6efd; +} +.btn-outline-primary:hover { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); +} +.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show { + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5); +} +.btn-outline-primary:disabled, .btn-outline-primary.disabled { + color: #0d6efd; + background-color: transparent; +} + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; +} +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus { + box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); +} +.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} +.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5); +} +.btn-outline-secondary:disabled, .btn-outline-secondary.disabled { + color: #6c757d; + background-color: transparent; +} + +.btn-outline-success { + color: #198754; + border-color: #198754; +} +.btn-outline-success:hover { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-check:focus + .btn-outline-success, .btn-outline-success:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); +} +.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show { + color: #fff; + background-color: #198754; + border-color: #198754; +} +.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5); +} +.btn-outline-success:disabled, .btn-outline-success.disabled { + color: #198754; + background-color: transparent; +} + +.btn-outline-info { + color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-outline-info:hover { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-check:focus + .btn-outline-info, .btn-outline-info:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); +} +.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show { + color: #000; + background-color: #0dcaf0; + border-color: #0dcaf0; +} +.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5); +} +.btn-outline-info:disabled, .btn-outline-info.disabled { + color: #0dcaf0; + background-color: transparent; +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; +} +.btn-outline-warning:hover { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus { + box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); +} +.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show { + color: #000; + background-color: #ffc107; + border-color: #ffc107; +} +.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5); +} +.btn-outline-warning:disabled, .btn-outline-warning.disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; +} +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); +} +.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} +.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5); +} +.btn-outline-danger:disabled, .btn-outline-danger.disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-outline-light:hover { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:focus + .btn-outline-light, .btn-outline-light:focus { + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); +} +.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show { + color: #000; + background-color: #f8f9fa; + border-color: #f8f9fa; +} +.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5); +} +.btn-outline-light:disabled, .btn-outline-light.disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-dark { + color: #212529; + border-color: #212529; +} +.btn-outline-dark:hover { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus { + box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); +} +.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show { + color: #fff; + background-color: #212529; + border-color: #212529; +} +.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus { + box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5); +} +.btn-outline-dark:disabled, .btn-outline-dark.disabled { + color: #212529; + background-color: transparent; +} + +.btn-link { + font-weight: 400; + color: #0d6efd; + text-decoration: underline; +} +.btn-link:hover { + color: #0a58ca; +} +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} + +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + z-index: 1000; + display: none; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: 0.125rem; +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto ; + left: 0 ; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0 ; + left: auto ; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto ; + left: 0 ; + } + + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0 ; + left: auto ; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto ; + left: 0 ; + } + + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0 ; + left: auto ; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto ; + left: 0 ; + } + + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0 ; + left: auto ; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto ; + left: 0 ; + } + + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0 ; + left: auto ; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto ; + left: 0 ; + } + + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0 ; + left: auto ; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid rgba(0, 0, 0, 0.15); +} + +.dropdown-item { + display: block; + padding: 0.25rem 1rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:hover, .dropdown-item:focus { + color: #1e2125; + background-color: #e9ecef; +} +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #0d6efd; +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1rem; + color: #212529; +} + +.dropdown-menu-dark { + color: #dee2e6; + background-color: #343a40; + border-color: rgba(0, 0, 0, 0.15); +} +.dropdown-menu-dark .dropdown-item { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus { + color: #fff; + background-color: rgba(255, 255, 255, 0.15); +} +.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active { + color: #fff; + background-color: #0d6efd; +} +.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled { + color: #adb5bd; +} +.dropdown-menu-dark .dropdown-divider { + border-color: rgba(0, 0, 0, 0.15); +} +.dropdown-menu-dark .dropdown-item-text { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-header { + color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn ~ .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; + color: #0d6efd; + text-decoration: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, .nav-link:focus { + color: #0a58ca; +} +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} +.nav-tabs .nav-link { + margin-bottom: -1px; + background: none; + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; + isolation: isolate; +} +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + background: none; + border: 0; + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #0d6efd; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + text-decoration: none; + white-space: nowrap; +} +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; + transition: box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 0.25rem; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.55); +} +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.55); + border-color: rgba(0, 0, 0, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.55); +} +.navbar-light .navbar-text a, +.navbar-light .navbar-text a:hover, +.navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.55); +} +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.55); + border-color: rgba(255, 255, 255, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.55); +} +.navbar-dark .navbar-text a, +.navbar-dark .navbar-text a:hover, +.navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: 1rem 1rem; +} + +.card-title { + margin-bottom: 0.5rem; +} + +.card-subtitle { + margin-top: -0.25rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} +.card-link + .card-link { + margin-left: 1rem; +} + +.card-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-footer { + padding: 0.5rem 1rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.5rem; + margin-bottom: -0.5rem; + margin-left: -0.5rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.5rem; + margin-left: -0.5rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1rem; + border-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-group > .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, +.card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, +.card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, +.card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, +.card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: 1rem 1.25rem; + font-size: 1rem; + color: #212529; + text-align: left; + background-color: #fff; + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: #0c63e4; + background-color: #e7f1ff; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); +} +.accordion-button:not(.collapsed)::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + transform: rotate(-180deg); +} +.accordion-button::after { + flex-shrink: 0; + width: 1.25rem; + height: 1.25rem; + margin-left: auto; + content: ""; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-size: 1.25rem; + transition: transform 0.2s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.accordion-item:first-of-type { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.accordion-body { + padding: 1rem 1.25rem; +} + +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button { + border-radius: 0; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0 0; + margin-bottom: 1rem; + list-style: none; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: 0.5rem; + color: #6c757d; + content: var(--bs-breadcrumb-divider, "/") ; +} +.breadcrumb-item.active { + color: #6c757d; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + color: #0d6efd; + text-decoration: none; + background-color: #fff; + border: 1px solid #dee2e6; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: #0a58ca; + background-color: #e9ecef; + border-color: #dee2e6; +} +.page-link:focus { + z-index: 3; + color: #0a58ca; + background-color: #e9ecef; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +.page-item:not(:first-child) .page-link { + margin-left: -1px; +} +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + background-color: #fff; + border-color: #dee2e6; +} + +.page-link { + padding: 0.375rem 0.75rem; +} + +.page-item:first-child .page-link { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.35em 0.65em; + font-size: 0.75em; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.alert { + position: relative; + padding: 1rem 1rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + color: #084298; + background-color: #cfe2ff; + border-color: #b6d4fe; +} +.alert-primary .alert-link { + color: #06357a; +} + +.alert-secondary { + color: #41464b; + background-color: #e2e3e5; + border-color: #d3d6d8; +} +.alert-secondary .alert-link { + color: #34383c; +} + +.alert-success { + color: #0f5132; + background-color: #d1e7dd; + border-color: #badbcc; +} +.alert-success .alert-link { + color: #0c4128; +} + +.alert-info { + color: #055160; + background-color: #cff4fc; + border-color: #b6effb; +} +.alert-info .alert-link { + color: #04414d; +} + +.alert-warning { + color: #664d03; + background-color: #fff3cd; + border-color: #ffecb5; +} +.alert-warning .alert-link { + color: #523e02; +} + +.alert-danger { + color: #842029; + background-color: #f8d7da; + border-color: #f5c2c7; +} +.alert-danger .alert-link { + color: #6a1a21; +} + +.alert-light { + color: #636464; + background-color: #fefefe; + border-color: #fdfdfe; +} +.alert-light .alert-link { + color: #4f5050; +} + +.alert-dark { + color: #141619; + background-color: #d3d3d4; + border-color: #bcbebf; +} +.alert-dark .alert-link { + color: #101214; +} + +@-webkit-keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #0d6efd; + transition: width 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: 1s linear infinite progress-bar-stripes; + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 0.25rem; +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > li::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.5rem 1rem; + color: #212529; + text-decoration: none; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 1px; +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #084298; + background-color: #cfe2ff; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #084298; + background-color: #bacbe6; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #084298; + border-color: #084298; +} + +.list-group-item-secondary { + color: #41464b; + background-color: #e2e3e5; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #41464b; + background-color: #cbccce; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #41464b; + border-color: #41464b; +} + +.list-group-item-success { + color: #0f5132; + background-color: #d1e7dd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #0f5132; + background-color: #bcd0c7; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f5132; + border-color: #0f5132; +} + +.list-group-item-info { + color: #055160; + background-color: #cff4fc; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #055160; + background-color: #badce3; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #055160; + border-color: #055160; +} + +.list-group-item-warning { + color: #664d03; + background-color: #fff3cd; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #664d03; + background-color: #e6dbb9; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #664d03; + border-color: #664d03; +} + +.list-group-item-danger { + color: #842029; + background-color: #f8d7da; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #842029; + background-color: #dfc2c4; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #842029; + border-color: #842029; +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #636464; + background-color: #e5e5e5; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #636464; + border-color: #636464; +} + +.list-group-item-dark { + color: #141619; + background-color: #d3d3d4; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #141619; + background-color: #bebebf; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #141619; + border-color: #141619; +} + +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #000; + background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat; + border: 0; + border-radius: 0.25rem; + opacity: 0.5; +} +.btn-close:hover { + color: #000; + text-decoration: none; + opacity: 0.75; +} +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + opacity: 1; +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: 0.25; +} + +.btn-close-white { + filter: invert(1) grayscale(100%) brightness(200%); +} + +.toast { + width: 350px; + max-width: 100%; + font-size: 0.875rem; + pointer-events: auto; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} +.toast:not(.showing):not(.show) { + opacity: 0; +} +.toast.hide { + display: none; +} + +.toast-container { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.5rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.toast-header .btn-close { + margin-right: -0.375rem; + margin-left: 0.75rem; +} + +.toast-body { + padding: 0.75rem; + word-wrap: break-word; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1060; + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - 1rem); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.modal-header .btn-close { + padding: 0.5rem 0.5rem; + margin: -0.5rem -0.5rem -0.5rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + flex-wrap: wrap; + flex-shrink: 0; + align-items: center; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); +} +.modal-footer > * { + margin: 0.25rem; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + + .modal-dialog-scrollable { + height: calc(100% - 3.5rem); + } + + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, +.modal-xl { + max-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} +.modal-fullscreen .modal-footer { + border-radius: 0; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } +} +.tooltip { + position: absolute; + z-index: 1080; + display: block; + margin: 0; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .tooltip-arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] { + padding: 0.4rem 0; +} +.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { + bottom: 0; +} +.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { + top: -1px; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] { + padding: 0 0.4rem; +} +.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { + right: -1px; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] { + padding: 0.4rem 0; +} +.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { + top: 0; +} +.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] { + padding: 0 0.4rem; +} +.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { + left: -1px; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0 ; + z-index: 1070; + display: block; + max-width: 276px; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .popover-arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; +} +.popover .popover-arrow::before, .popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { + bottom: calc(-0.5rem - 1px); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { + top: calc(-0.5rem - 1px); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f0f0f0; +} + +.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f0f0f0; + border-bottom: 1px solid #d8d8d8; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 1rem 1rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, +.carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + list-style: none; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} + +.carousel-dark .carousel-control-prev-icon, +.carousel-dark .carousel-control-next-icon { + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} + +@-webkit-keyframes spinner-border { + to { + transform: rotate(360deg) ; + } +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) ; + } +} +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: 0.75s linear infinite spinner-border; + animation: 0.75s linear infinite spinner-border; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: 0.75s linear infinite spinner-grow; + animation: 0.75s linear infinite spinner-grow; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, +.spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; + } +} +.offcanvas { + position: fixed; + bottom: 0; + z-index: 1050; + display: flex; + flex-direction: column; + max-width: 100%; + visibility: hidden; + background-color: #fff; + background-clip: padding-box; + outline: 0; + transition: transform 0.3s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} + +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem 1rem; +} +.offcanvas-header .btn-close { + padding: 0.5rem 0.5rem; + margin: -0.5rem -0.5rem -0.5rem auto; +} + +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5; +} + +.offcanvas-body { + flex-grow: 1; + padding: 1rem 1rem; + overflow-y: auto; +} + +.offcanvas-start { + top: 0; + left: 0; + width: 400px; + border-right: 1px solid rgba(0, 0, 0, 0.2); + transform: translateX(-100%); +} + +.offcanvas-end { + top: 0; + right: 0; + width: 400px; + border-left: 1px solid rgba(0, 0, 0, 0.2); + transform: translateX(100%); +} + +.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + transform: translateY(-100%); +} + +.offcanvas-bottom { + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-top: 1px solid rgba(0, 0, 0, 0.2); + transform: translateY(100%); +} + +.offcanvas.show { + transform: none; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.link-primary { + color: #0d6efd; +} +.link-primary:hover, .link-primary:focus { + color: #0a58ca; +} + +.link-secondary { + color: #6c757d; +} +.link-secondary:hover, .link-secondary:focus { + color: #565e64; +} + +.link-success { + color: #198754; +} +.link-success:hover, .link-success:focus { + color: #146c43; +} + +.link-info { + color: #0dcaf0; +} +.link-info:hover, .link-info:focus { + color: #3dd5f3; +} + +.link-warning { + color: #ffc107; +} +.link-warning:hover, .link-warning:focus { + color: #ffcd39; +} + +.link-danger { + color: #dc3545; +} +.link-danger:hover, .link-danger:focus { + color: #b02a37; +} + +.link-light { + color: #f8f9fa; +} +.link-light:hover, .link-light:focus { + color: #f9fafb; +} + +.link-dark { + color: #212529; +} +.link-dark:hover, .link-dark:focus { + color: #1a1e21; +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: calc(3 / 4 * 100%); +} + +.ratio-16x9 { + --bs-aspect-ratio: calc(9 / 16 * 100%); +} + +.ratio-21x9 { + --bs-aspect-ratio: calc(9 / 21 * 100%); +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + transform: translateX(-50%) !important; +} + +.translate-middle-y { + transform: translateY(-50%) !important; +} + +.border { + border: 1px solid #dee2e6 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: 1px solid #dee2e6 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: 1px solid #dee2e6 !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: 1px solid #dee2e6 !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #0d6efd !important; +} + +.border-secondary { + border-color: #6c757d !important; +} + +.border-success { + border-color: #198754 !important; +} + +.border-info { + border-color: #0dcaf0 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #212529 !important; +} + +.border-white { + border-color: #fff !important; +} + +.border-1 { + border-width: 1px !important; +} + +.border-2 { + border-width: 2px !important; +} + +.border-3 { + border-width: 3px !important; +} + +.border-4 { + border-width: 4px !important; +} + +.border-5 { + border-width: 5px !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-normal { + font-weight: 400 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + + +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + + +.text-primary { + color: #0d6efd !important; +} + +.text-secondary { + color: #6c757d !important; +} + +.text-success { + color: #198754 !important; +} + +.text-info { + color: #0dcaf0 !important; +} + +.text-warning { + color: #ffc107 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +.text-light { + color: #f8f9fa !important; +} + +.text-dark { + color: #212529 !important; +} + +.text-white { + color: #fff !important; +} + +.text-body { + color: #212529 !important; +} + +.text-muted { + color: #6c757d !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-reset { + color: inherit !important; +} + +.bg-primary { + background-color: #0d6efd !important; +} + +.bg-secondary { + background-color: #6c757d !important; +} + +.bg-success { + background-color: #198754 !important; +} + +.bg-info { + background-color: #0dcaf0 !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +.bg-dark { + background-color: #212529 !important; +} + +.bg-body { + background-color: #fff !important; +} + +.bg-white { + background-color: #fff !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: 0.2rem !important; +} + +.rounded-2 { + border-radius: 0.25rem !important; +} + +.rounded-3 { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-end { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-start { + border-bottom-left-radius: 0.25rem !important; + border-top-left-radius: 0.25rem !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + + .float-sm-end { + float: right !important; + } + + .float-sm-none { + float: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-grid { + display: grid !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: flex !important; + } + + .d-sm-inline-flex { + display: inline-flex !important; + } + + .d-sm-none { + display: none !important; + } + + .flex-sm-fill { + flex: 1 1 auto !important; + } + + .flex-sm-row { + flex-direction: row !important; + } + + .flex-sm-column { + flex-direction: column !important; + } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-sm-wrap { + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-sm-0 { + gap: 0 !important; + } + + .gap-sm-1 { + gap: 0.25rem !important; + } + + .gap-sm-2 { + gap: 0.5rem !important; + } + + .gap-sm-3 { + gap: 1rem !important; + } + + .gap-sm-4 { + gap: 1.5rem !important; + } + + .gap-sm-5 { + gap: 3rem !important; + } + + .justify-content-sm-start { + justify-content: flex-start !important; + } + + .justify-content-sm-end { + justify-content: flex-end !important; + } + + .justify-content-sm-center { + justify-content: center !important; + } + + .justify-content-sm-between { + justify-content: space-between !important; + } + + .justify-content-sm-around { + justify-content: space-around !important; + } + + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + + .align-items-sm-start { + align-items: flex-start !important; + } + + .align-items-sm-end { + align-items: flex-end !important; + } + + .align-items-sm-center { + align-items: center !important; + } + + .align-items-sm-baseline { + align-items: baseline !important; + } + + .align-items-sm-stretch { + align-items: stretch !important; + } + + .align-content-sm-start { + align-content: flex-start !important; + } + + .align-content-sm-end { + align-content: flex-end !important; + } + + .align-content-sm-center { + align-content: center !important; + } + + .align-content-sm-between { + align-content: space-between !important; + } + + .align-content-sm-around { + align-content: space-around !important; + } + + .align-content-sm-stretch { + align-content: stretch !important; + } + + .align-self-sm-auto { + align-self: auto !important; + } + + .align-self-sm-start { + align-self: flex-start !important; + } + + .align-self-sm-end { + align-self: flex-end !important; + } + + .align-self-sm-center { + align-self: center !important; + } + + .align-self-sm-baseline { + align-self: baseline !important; + } + + .align-self-sm-stretch { + align-self: stretch !important; + } + + .order-sm-first { + order: -1 !important; + } + + .order-sm-0 { + order: 0 !important; + } + + .order-sm-1 { + order: 1 !important; + } + + .order-sm-2 { + order: 2 !important; + } + + .order-sm-3 { + order: 3 !important; + } + + .order-sm-4 { + order: 4 !important; + } + + .order-sm-5 { + order: 5 !important; + } + + .order-sm-last { + order: 6 !important; + } + + .m-sm-0 { + margin: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-sm-0 { + margin-top: 0 !important; + } + + .mt-sm-1 { + margin-top: 0.25rem !important; + } + + .mt-sm-2 { + margin-top: 0.5rem !important; + } + + .mt-sm-3 { + margin-top: 1rem !important; + } + + .mt-sm-4 { + margin-top: 1.5rem !important; + } + + .mt-sm-5 { + margin-top: 3rem !important; + } + + .mt-sm-auto { + margin-top: auto !important; + } + + .me-sm-0 { + margin-right: 0 !important; + } + + .me-sm-1 { + margin-right: 0.25rem !important; + } + + .me-sm-2 { + margin-right: 0.5rem !important; + } + + .me-sm-3 { + margin-right: 1rem !important; + } + + .me-sm-4 { + margin-right: 1.5rem !important; + } + + .me-sm-5 { + margin-right: 3rem !important; + } + + .me-sm-auto { + margin-right: auto !important; + } + + .mb-sm-0 { + margin-bottom: 0 !important; + } + + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + + .mb-sm-3 { + margin-bottom: 1rem !important; + } + + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + + .mb-sm-5 { + margin-bottom: 3rem !important; + } + + .mb-sm-auto { + margin-bottom: auto !important; + } + + .ms-sm-0 { + margin-left: 0 !important; + } + + .ms-sm-1 { + margin-left: 0.25rem !important; + } + + .ms-sm-2 { + margin-left: 0.5rem !important; + } + + .ms-sm-3 { + margin-left: 1rem !important; + } + + .ms-sm-4 { + margin-left: 1.5rem !important; + } + + .ms-sm-5 { + margin-left: 3rem !important; + } + + .ms-sm-auto { + margin-left: auto !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-sm-0 { + padding-top: 0 !important; + } + + .pt-sm-1 { + padding-top: 0.25rem !important; + } + + .pt-sm-2 { + padding-top: 0.5rem !important; + } + + .pt-sm-3 { + padding-top: 1rem !important; + } + + .pt-sm-4 { + padding-top: 1.5rem !important; + } + + .pt-sm-5 { + padding-top: 3rem !important; + } + + .pe-sm-0 { + padding-right: 0 !important; + } + + .pe-sm-1 { + padding-right: 0.25rem !important; + } + + .pe-sm-2 { + padding-right: 0.5rem !important; + } + + .pe-sm-3 { + padding-right: 1rem !important; + } + + .pe-sm-4 { + padding-right: 1.5rem !important; + } + + .pe-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-0 { + padding-bottom: 0 !important; + } + + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pb-sm-3 { + padding-bottom: 1rem !important; + } + + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pb-sm-5 { + padding-bottom: 3rem !important; + } + + .ps-sm-0 { + padding-left: 0 !important; + } + + .ps-sm-1 { + padding-left: 0.25rem !important; + } + + .ps-sm-2 { + padding-left: 0.5rem !important; + } + + .ps-sm-3 { + padding-left: 1rem !important; + } + + .ps-sm-4 { + padding-left: 1.5rem !important; + } + + .ps-sm-5 { + padding-left: 3rem !important; + } + + .text-sm-start { + text-align: left !important; + } + + .text-sm-end { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + + .float-md-end { + float: right !important; + } + + .float-md-none { + float: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-grid { + display: grid !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: flex !important; + } + + .d-md-inline-flex { + display: inline-flex !important; + } + + .d-md-none { + display: none !important; + } + + .flex-md-fill { + flex: 1 1 auto !important; + } + + .flex-md-row { + flex-direction: row !important; + } + + .flex-md-column { + flex-direction: column !important; + } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-md-grow-0 { + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-md-wrap { + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-md-0 { + gap: 0 !important; + } + + .gap-md-1 { + gap: 0.25rem !important; + } + + .gap-md-2 { + gap: 0.5rem !important; + } + + .gap-md-3 { + gap: 1rem !important; + } + + .gap-md-4 { + gap: 1.5rem !important; + } + + .gap-md-5 { + gap: 3rem !important; + } + + .justify-content-md-start { + justify-content: flex-start !important; + } + + .justify-content-md-end { + justify-content: flex-end !important; + } + + .justify-content-md-center { + justify-content: center !important; + } + + .justify-content-md-between { + justify-content: space-between !important; + } + + .justify-content-md-around { + justify-content: space-around !important; + } + + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + + .align-items-md-start { + align-items: flex-start !important; + } + + .align-items-md-end { + align-items: flex-end !important; + } + + .align-items-md-center { + align-items: center !important; + } + + .align-items-md-baseline { + align-items: baseline !important; + } + + .align-items-md-stretch { + align-items: stretch !important; + } + + .align-content-md-start { + align-content: flex-start !important; + } + + .align-content-md-end { + align-content: flex-end !important; + } + + .align-content-md-center { + align-content: center !important; + } + + .align-content-md-between { + align-content: space-between !important; + } + + .align-content-md-around { + align-content: space-around !important; + } + + .align-content-md-stretch { + align-content: stretch !important; + } + + .align-self-md-auto { + align-self: auto !important; + } + + .align-self-md-start { + align-self: flex-start !important; + } + + .align-self-md-end { + align-self: flex-end !important; + } + + .align-self-md-center { + align-self: center !important; + } + + .align-self-md-baseline { + align-self: baseline !important; + } + + .align-self-md-stretch { + align-self: stretch !important; + } + + .order-md-first { + order: -1 !important; + } + + .order-md-0 { + order: 0 !important; + } + + .order-md-1 { + order: 1 !important; + } + + .order-md-2 { + order: 2 !important; + } + + .order-md-3 { + order: 3 !important; + } + + .order-md-4 { + order: 4 !important; + } + + .order-md-5 { + order: 5 !important; + } + + .order-md-last { + order: 6 !important; + } + + .m-md-0 { + margin: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-md-0 { + margin-top: 0 !important; + } + + .mt-md-1 { + margin-top: 0.25rem !important; + } + + .mt-md-2 { + margin-top: 0.5rem !important; + } + + .mt-md-3 { + margin-top: 1rem !important; + } + + .mt-md-4 { + margin-top: 1.5rem !important; + } + + .mt-md-5 { + margin-top: 3rem !important; + } + + .mt-md-auto { + margin-top: auto !important; + } + + .me-md-0 { + margin-right: 0 !important; + } + + .me-md-1 { + margin-right: 0.25rem !important; + } + + .me-md-2 { + margin-right: 0.5rem !important; + } + + .me-md-3 { + margin-right: 1rem !important; + } + + .me-md-4 { + margin-right: 1.5rem !important; + } + + .me-md-5 { + margin-right: 3rem !important; + } + + .me-md-auto { + margin-right: auto !important; + } + + .mb-md-0 { + margin-bottom: 0 !important; + } + + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + + .mb-md-3 { + margin-bottom: 1rem !important; + } + + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + + .mb-md-5 { + margin-bottom: 3rem !important; + } + + .mb-md-auto { + margin-bottom: auto !important; + } + + .ms-md-0 { + margin-left: 0 !important; + } + + .ms-md-1 { + margin-left: 0.25rem !important; + } + + .ms-md-2 { + margin-left: 0.5rem !important; + } + + .ms-md-3 { + margin-left: 1rem !important; + } + + .ms-md-4 { + margin-left: 1.5rem !important; + } + + .ms-md-5 { + margin-left: 3rem !important; + } + + .ms-md-auto { + margin-left: auto !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-md-0 { + padding-top: 0 !important; + } + + .pt-md-1 { + padding-top: 0.25rem !important; + } + + .pt-md-2 { + padding-top: 0.5rem !important; + } + + .pt-md-3 { + padding-top: 1rem !important; + } + + .pt-md-4 { + padding-top: 1.5rem !important; + } + + .pt-md-5 { + padding-top: 3rem !important; + } + + .pe-md-0 { + padding-right: 0 !important; + } + + .pe-md-1 { + padding-right: 0.25rem !important; + } + + .pe-md-2 { + padding-right: 0.5rem !important; + } + + .pe-md-3 { + padding-right: 1rem !important; + } + + .pe-md-4 { + padding-right: 1.5rem !important; + } + + .pe-md-5 { + padding-right: 3rem !important; + } + + .pb-md-0 { + padding-bottom: 0 !important; + } + + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + + .pb-md-3 { + padding-bottom: 1rem !important; + } + + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + + .pb-md-5 { + padding-bottom: 3rem !important; + } + + .ps-md-0 { + padding-left: 0 !important; + } + + .ps-md-1 { + padding-left: 0.25rem !important; + } + + .ps-md-2 { + padding-left: 0.5rem !important; + } + + .ps-md-3 { + padding-left: 1rem !important; + } + + .ps-md-4 { + padding-left: 1.5rem !important; + } + + .ps-md-5 { + padding-left: 3rem !important; + } + + .text-md-start { + text-align: left !important; + } + + .text-md-end { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + + .float-lg-end { + float: right !important; + } + + .float-lg-none { + float: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-grid { + display: grid !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: flex !important; + } + + .d-lg-inline-flex { + display: inline-flex !important; + } + + .d-lg-none { + display: none !important; + } + + .flex-lg-fill { + flex: 1 1 auto !important; + } + + .flex-lg-row { + flex-direction: row !important; + } + + .flex-lg-column { + flex-direction: column !important; + } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-lg-wrap { + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-lg-0 { + gap: 0 !important; + } + + .gap-lg-1 { + gap: 0.25rem !important; + } + + .gap-lg-2 { + gap: 0.5rem !important; + } + + .gap-lg-3 { + gap: 1rem !important; + } + + .gap-lg-4 { + gap: 1.5rem !important; + } + + .gap-lg-5 { + gap: 3rem !important; + } + + .justify-content-lg-start { + justify-content: flex-start !important; + } + + .justify-content-lg-end { + justify-content: flex-end !important; + } + + .justify-content-lg-center { + justify-content: center !important; + } + + .justify-content-lg-between { + justify-content: space-between !important; + } + + .justify-content-lg-around { + justify-content: space-around !important; + } + + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + + .align-items-lg-start { + align-items: flex-start !important; + } + + .align-items-lg-end { + align-items: flex-end !important; + } + + .align-items-lg-center { + align-items: center !important; + } + + .align-items-lg-baseline { + align-items: baseline !important; + } + + .align-items-lg-stretch { + align-items: stretch !important; + } + + .align-content-lg-start { + align-content: flex-start !important; + } + + .align-content-lg-end { + align-content: flex-end !important; + } + + .align-content-lg-center { + align-content: center !important; + } + + .align-content-lg-between { + align-content: space-between !important; + } + + .align-content-lg-around { + align-content: space-around !important; + } + + .align-content-lg-stretch { + align-content: stretch !important; + } + + .align-self-lg-auto { + align-self: auto !important; + } + + .align-self-lg-start { + align-self: flex-start !important; + } + + .align-self-lg-end { + align-self: flex-end !important; + } + + .align-self-lg-center { + align-self: center !important; + } + + .align-self-lg-baseline { + align-self: baseline !important; + } + + .align-self-lg-stretch { + align-self: stretch !important; + } + + .order-lg-first { + order: -1 !important; + } + + .order-lg-0 { + order: 0 !important; + } + + .order-lg-1 { + order: 1 !important; + } + + .order-lg-2 { + order: 2 !important; + } + + .order-lg-3 { + order: 3 !important; + } + + .order-lg-4 { + order: 4 !important; + } + + .order-lg-5 { + order: 5 !important; + } + + .order-lg-last { + order: 6 !important; + } + + .m-lg-0 { + margin: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-lg-0 { + margin-top: 0 !important; + } + + .mt-lg-1 { + margin-top: 0.25rem !important; + } + + .mt-lg-2 { + margin-top: 0.5rem !important; + } + + .mt-lg-3 { + margin-top: 1rem !important; + } + + .mt-lg-4 { + margin-top: 1.5rem !important; + } + + .mt-lg-5 { + margin-top: 3rem !important; + } + + .mt-lg-auto { + margin-top: auto !important; + } + + .me-lg-0 { + margin-right: 0 !important; + } + + .me-lg-1 { + margin-right: 0.25rem !important; + } + + .me-lg-2 { + margin-right: 0.5rem !important; + } + + .me-lg-3 { + margin-right: 1rem !important; + } + + .me-lg-4 { + margin-right: 1.5rem !important; + } + + .me-lg-5 { + margin-right: 3rem !important; + } + + .me-lg-auto { + margin-right: auto !important; + } + + .mb-lg-0 { + margin-bottom: 0 !important; + } + + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + + .mb-lg-3 { + margin-bottom: 1rem !important; + } + + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + + .mb-lg-5 { + margin-bottom: 3rem !important; + } + + .mb-lg-auto { + margin-bottom: auto !important; + } + + .ms-lg-0 { + margin-left: 0 !important; + } + + .ms-lg-1 { + margin-left: 0.25rem !important; + } + + .ms-lg-2 { + margin-left: 0.5rem !important; + } + + .ms-lg-3 { + margin-left: 1rem !important; + } + + .ms-lg-4 { + margin-left: 1.5rem !important; + } + + .ms-lg-5 { + margin-left: 3rem !important; + } + + .ms-lg-auto { + margin-left: auto !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-lg-0 { + padding-top: 0 !important; + } + + .pt-lg-1 { + padding-top: 0.25rem !important; + } + + .pt-lg-2 { + padding-top: 0.5rem !important; + } + + .pt-lg-3 { + padding-top: 1rem !important; + } + + .pt-lg-4 { + padding-top: 1.5rem !important; + } + + .pt-lg-5 { + padding-top: 3rem !important; + } + + .pe-lg-0 { + padding-right: 0 !important; + } + + .pe-lg-1 { + padding-right: 0.25rem !important; + } + + .pe-lg-2 { + padding-right: 0.5rem !important; + } + + .pe-lg-3 { + padding-right: 1rem !important; + } + + .pe-lg-4 { + padding-right: 1.5rem !important; + } + + .pe-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-0 { + padding-bottom: 0 !important; + } + + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pb-lg-3 { + padding-bottom: 1rem !important; + } + + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pb-lg-5 { + padding-bottom: 3rem !important; + } + + .ps-lg-0 { + padding-left: 0 !important; + } + + .ps-lg-1 { + padding-left: 0.25rem !important; + } + + .ps-lg-2 { + padding-left: 0.5rem !important; + } + + .ps-lg-3 { + padding-left: 1rem !important; + } + + .ps-lg-4 { + padding-left: 1.5rem !important; + } + + .ps-lg-5 { + padding-left: 3rem !important; + } + + .text-lg-start { + text-align: left !important; + } + + .text-lg-end { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + + .float-xl-end { + float: right !important; + } + + .float-xl-none { + float: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-grid { + display: grid !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: flex !important; + } + + .d-xl-inline-flex { + display: inline-flex !important; + } + + .d-xl-none { + display: none !important; + } + + .flex-xl-fill { + flex: 1 1 auto !important; + } + + .flex-xl-row { + flex-direction: row !important; + } + + .flex-xl-column { + flex-direction: column !important; + } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-xl-wrap { + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-xl-0 { + gap: 0 !important; + } + + .gap-xl-1 { + gap: 0.25rem !important; + } + + .gap-xl-2 { + gap: 0.5rem !important; + } + + .gap-xl-3 { + gap: 1rem !important; + } + + .gap-xl-4 { + gap: 1.5rem !important; + } + + .gap-xl-5 { + gap: 3rem !important; + } + + .justify-content-xl-start { + justify-content: flex-start !important; + } + + .justify-content-xl-end { + justify-content: flex-end !important; + } + + .justify-content-xl-center { + justify-content: center !important; + } + + .justify-content-xl-between { + justify-content: space-between !important; + } + + .justify-content-xl-around { + justify-content: space-around !important; + } + + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + + .align-items-xl-start { + align-items: flex-start !important; + } + + .align-items-xl-end { + align-items: flex-end !important; + } + + .align-items-xl-center { + align-items: center !important; + } + + .align-items-xl-baseline { + align-items: baseline !important; + } + + .align-items-xl-stretch { + align-items: stretch !important; + } + + .align-content-xl-start { + align-content: flex-start !important; + } + + .align-content-xl-end { + align-content: flex-end !important; + } + + .align-content-xl-center { + align-content: center !important; + } + + .align-content-xl-between { + align-content: space-between !important; + } + + .align-content-xl-around { + align-content: space-around !important; + } + + .align-content-xl-stretch { + align-content: stretch !important; + } + + .align-self-xl-auto { + align-self: auto !important; + } + + .align-self-xl-start { + align-self: flex-start !important; + } + + .align-self-xl-end { + align-self: flex-end !important; + } + + .align-self-xl-center { + align-self: center !important; + } + + .align-self-xl-baseline { + align-self: baseline !important; + } + + .align-self-xl-stretch { + align-self: stretch !important; + } + + .order-xl-first { + order: -1 !important; + } + + .order-xl-0 { + order: 0 !important; + } + + .order-xl-1 { + order: 1 !important; + } + + .order-xl-2 { + order: 2 !important; + } + + .order-xl-3 { + order: 3 !important; + } + + .order-xl-4 { + order: 4 !important; + } + + .order-xl-5 { + order: 5 !important; + } + + .order-xl-last { + order: 6 !important; + } + + .m-xl-0 { + margin: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-xl-0 { + margin-top: 0 !important; + } + + .mt-xl-1 { + margin-top: 0.25rem !important; + } + + .mt-xl-2 { + margin-top: 0.5rem !important; + } + + .mt-xl-3 { + margin-top: 1rem !important; + } + + .mt-xl-4 { + margin-top: 1.5rem !important; + } + + .mt-xl-5 { + margin-top: 3rem !important; + } + + .mt-xl-auto { + margin-top: auto !important; + } + + .me-xl-0 { + margin-right: 0 !important; + } + + .me-xl-1 { + margin-right: 0.25rem !important; + } + + .me-xl-2 { + margin-right: 0.5rem !important; + } + + .me-xl-3 { + margin-right: 1rem !important; + } + + .me-xl-4 { + margin-right: 1.5rem !important; + } + + .me-xl-5 { + margin-right: 3rem !important; + } + + .me-xl-auto { + margin-right: auto !important; + } + + .mb-xl-0 { + margin-bottom: 0 !important; + } + + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + + .mb-xl-3 { + margin-bottom: 1rem !important; + } + + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + + .mb-xl-5 { + margin-bottom: 3rem !important; + } + + .mb-xl-auto { + margin-bottom: auto !important; + } + + .ms-xl-0 { + margin-left: 0 !important; + } + + .ms-xl-1 { + margin-left: 0.25rem !important; + } + + .ms-xl-2 { + margin-left: 0.5rem !important; + } + + .ms-xl-3 { + margin-left: 1rem !important; + } + + .ms-xl-4 { + margin-left: 1.5rem !important; + } + + .ms-xl-5 { + margin-left: 3rem !important; + } + + .ms-xl-auto { + margin-left: auto !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-xl-0 { + padding-top: 0 !important; + } + + .pt-xl-1 { + padding-top: 0.25rem !important; + } + + .pt-xl-2 { + padding-top: 0.5rem !important; + } + + .pt-xl-3 { + padding-top: 1rem !important; + } + + .pt-xl-4 { + padding-top: 1.5rem !important; + } + + .pt-xl-5 { + padding-top: 3rem !important; + } + + .pe-xl-0 { + padding-right: 0 !important; + } + + .pe-xl-1 { + padding-right: 0.25rem !important; + } + + .pe-xl-2 { + padding-right: 0.5rem !important; + } + + .pe-xl-3 { + padding-right: 1rem !important; + } + + .pe-xl-4 { + padding-right: 1.5rem !important; + } + + .pe-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-0 { + padding-bottom: 0 !important; + } + + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pb-xl-3 { + padding-bottom: 1rem !important; + } + + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pb-xl-5 { + padding-bottom: 3rem !important; + } + + .ps-xl-0 { + padding-left: 0 !important; + } + + .ps-xl-1 { + padding-left: 0.25rem !important; + } + + .ps-xl-2 { + padding-left: 0.5rem !important; + } + + .ps-xl-3 { + padding-left: 1rem !important; + } + + .ps-xl-4 { + padding-left: 1.5rem !important; + } + + .ps-xl-5 { + padding-left: 3rem !important; + } + + .text-xl-start { + text-align: left !important; + } + + .text-xl-end { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + + .float-xxl-end { + float: right !important; + } + + .float-xxl-none { + float: none !important; + } + + .d-xxl-inline { + display: inline !important; + } + + .d-xxl-inline-block { + display: inline-block !important; + } + + .d-xxl-block { + display: block !important; + } + + .d-xxl-grid { + display: grid !important; + } + + .d-xxl-table { + display: table !important; + } + + .d-xxl-table-row { + display: table-row !important; + } + + .d-xxl-table-cell { + display: table-cell !important; + } + + .d-xxl-flex { + display: flex !important; + } + + .d-xxl-inline-flex { + display: inline-flex !important; + } + + .d-xxl-none { + display: none !important; + } + + .flex-xxl-fill { + flex: 1 1 auto !important; + } + + .flex-xxl-row { + flex-direction: row !important; + } + + .flex-xxl-column { + flex-direction: column !important; + } + + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + + .gap-xxl-0 { + gap: 0 !important; + } + + .gap-xxl-1 { + gap: 0.25rem !important; + } + + .gap-xxl-2 { + gap: 0.5rem !important; + } + + .gap-xxl-3 { + gap: 1rem !important; + } + + .gap-xxl-4 { + gap: 1.5rem !important; + } + + .gap-xxl-5 { + gap: 3rem !important; + } + + .justify-content-xxl-start { + justify-content: flex-start !important; + } + + .justify-content-xxl-end { + justify-content: flex-end !important; + } + + .justify-content-xxl-center { + justify-content: center !important; + } + + .justify-content-xxl-between { + justify-content: space-between !important; + } + + .justify-content-xxl-around { + justify-content: space-around !important; + } + + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + + .align-items-xxl-start { + align-items: flex-start !important; + } + + .align-items-xxl-end { + align-items: flex-end !important; + } + + .align-items-xxl-center { + align-items: center !important; + } + + .align-items-xxl-baseline { + align-items: baseline !important; + } + + .align-items-xxl-stretch { + align-items: stretch !important; + } + + .align-content-xxl-start { + align-content: flex-start !important; + } + + .align-content-xxl-end { + align-content: flex-end !important; + } + + .align-content-xxl-center { + align-content: center !important; + } + + .align-content-xxl-between { + align-content: space-between !important; + } + + .align-content-xxl-around { + align-content: space-around !important; + } + + .align-content-xxl-stretch { + align-content: stretch !important; + } + + .align-self-xxl-auto { + align-self: auto !important; + } + + .align-self-xxl-start { + align-self: flex-start !important; + } + + .align-self-xxl-end { + align-self: flex-end !important; + } + + .align-self-xxl-center { + align-self: center !important; + } + + .align-self-xxl-baseline { + align-self: baseline !important; + } + + .align-self-xxl-stretch { + align-self: stretch !important; + } + + .order-xxl-first { + order: -1 !important; + } + + .order-xxl-0 { + order: 0 !important; + } + + .order-xxl-1 { + order: 1 !important; + } + + .order-xxl-2 { + order: 2 !important; + } + + .order-xxl-3 { + order: 3 !important; + } + + .order-xxl-4 { + order: 4 !important; + } + + .order-xxl-5 { + order: 5 !important; + } + + .order-xxl-last { + order: 6 !important; + } + + .m-xxl-0 { + margin: 0 !important; + } + + .m-xxl-1 { + margin: 0.25rem !important; + } + + .m-xxl-2 { + margin: 0.5rem !important; + } + + .m-xxl-3 { + margin: 1rem !important; + } + + .m-xxl-4 { + margin: 1.5rem !important; + } + + .m-xxl-5 { + margin: 3rem !important; + } + + .m-xxl-auto { + margin: auto !important; + } + + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .mt-xxl-0 { + margin-top: 0 !important; + } + + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + + .mt-xxl-3 { + margin-top: 1rem !important; + } + + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + + .mt-xxl-5 { + margin-top: 3rem !important; + } + + .mt-xxl-auto { + margin-top: auto !important; + } + + .me-xxl-0 { + margin-right: 0 !important; + } + + .me-xxl-1 { + margin-right: 0.25rem !important; + } + + .me-xxl-2 { + margin-right: 0.5rem !important; + } + + .me-xxl-3 { + margin-right: 1rem !important; + } + + .me-xxl-4 { + margin-right: 1.5rem !important; + } + + .me-xxl-5 { + margin-right: 3rem !important; + } + + .me-xxl-auto { + margin-right: auto !important; + } + + .mb-xxl-0 { + margin-bottom: 0 !important; + } + + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + + .mb-xxl-auto { + margin-bottom: auto !important; + } + + .ms-xxl-0 { + margin-left: 0 !important; + } + + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + + .ms-xxl-3 { + margin-left: 1rem !important; + } + + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + + .ms-xxl-5 { + margin-left: 3rem !important; + } + + .ms-xxl-auto { + margin-left: auto !important; + } + + .p-xxl-0 { + padding: 0 !important; + } + + .p-xxl-1 { + padding: 0.25rem !important; + } + + .p-xxl-2 { + padding: 0.5rem !important; + } + + .p-xxl-3 { + padding: 1rem !important; + } + + .p-xxl-4 { + padding: 1.5rem !important; + } + + .p-xxl-5 { + padding: 3rem !important; + } + + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .pt-xxl-0 { + padding-top: 0 !important; + } + + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + + .pt-xxl-3 { + padding-top: 1rem !important; + } + + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + + .pt-xxl-5 { + padding-top: 3rem !important; + } + + .pe-xxl-0 { + padding-right: 0 !important; + } + + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + + .pe-xxl-3 { + padding-right: 1rem !important; + } + + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + + .pe-xxl-5 { + padding-right: 3rem !important; + } + + .pb-xxl-0 { + padding-bottom: 0 !important; + } + + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + + .ps-xxl-0 { + padding-left: 0 !important; + } + + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + + .ps-xxl-3 { + padding-left: 1rem !important; + } + + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + + .ps-xxl-5 { + padding-left: 3rem !important; + } + + .text-xxl-start { + text-align: left !important; + } + + .text-xxl-end { + text-align: right !important; + } + + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + + .fs-2 { + font-size: 2rem !important; + } + + .fs-3 { + font-size: 1.75rem !important; + } + + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-grid { + display: grid !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: flex !important; + } + + .d-print-inline-flex { + display: inline-flex !important; + } + + .d-print-none { + display: none !important; + } +} + diff --git a/assets/css/hesabix-admin.css b/assets/css/hesabix-admin.css new file mode 100644 index 0000000..f5212b0 --- /dev/null +++ b/assets/css/hesabix-admin.css @@ -0,0 +1,2816 @@ +/* + * Hesabix Admin CSS + * + * @package Hesabix + * @author Mohammad Rezai + * @author URI https://pirouz.xyz + * @since 1.0.0 + */ + +*, +.rtl h1, +.rtl h2, +.rtl h3, +.rtl h4, +.rtl h5, +.rtl h6 { + box-sizing: border-box; + font-family: 'IRANYekanWeb'; +} + + +.hesabix-stats-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 2rem; + grid-column: 1 / -1; +} + +.hesabix-spinner { + width: 40px; + height: 40px; + border: 4px solid #e3e6ea; + border-top: 4px solid #007cba; + border-radius: 50%; + animation: hesabix-spin 1s linear infinite; + margin-bottom: 1rem; +} + +@keyframes hesabix-spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + + +.hesabix-stats-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 60px 20px; + text-align: center; +} + +.hesabix-stats-loading .hesabix-spinner { + width: 40px; + height: 40px; + border: 4px solid #f3f3f3; + border-top: 4px solid #0073aa; + border-radius: 50%; + animation: spin 1s linear infinite; + margin-bottom: 20px; +} + +.hesabix-stats-loading p { + color: #666; + font-size: 16px; + margin: 0; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + + + +.hesabix-feature-card.not-connected .hesabix-feature-icon svg { + color: #dc3545; +} + +.hesabix-feature-card.not-connected .hesabix-feature-icon { + background: rgba(220, 53, 69, 0.1) !important; +} + +.hesabix-feature-card.connected .hesabix-feature-icon svg { + animation: hesabix-pulse 1.2s infinite; + color: #667eea; + border-radius: 50%; +} + +@keyframes hesabix-pulse { + 0% { + box-shadow: 0 0 0 0 #667eea; + opacity: 1; + } + + 70% { + box-shadow: 0 0 0 10px rgba(40, 167, 69, 0.5); + } + + 100% { + box-shadow: 0 0 0 0 rgba(40, 167, 69, 0); + } +} + +body.hesabix-admin { + font-family: 'IRANYekanWeb'; + background: #f8f9fa; + margin: 0; + padding: 0; + direction: rtl; + text-align: right; + line-height: 1.6; + color: #333; +} + + +.hesabix-container { + max-width: 1400px; + margin: 0 auto; + padding: 20px; +} + +.hesabix-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 20px; + margin-bottom: 40px; + padding: 30px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + border-radius: 15px; + color: white; + box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3); +} + +.hesabix-info { + flex: 1; +} + +.hesabix-actions { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.hesabix-logo { + width: 80px; + height: 80px; + background: rgba(255, 255, 255, 0.2); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.hesabix-logo img { + width: 50px; + height: 50px; + filter: brightness(0) invert(1); +} + +.hesabix-title { + margin: 0 0 10px 0; + font-size: 2.5rem; + font-weight: 700; +} + +.hesabix-subtitle { + font-size: 1.1rem; + margin: 0 0 15px 0; + opacity: 0.9; +} + +.hesabix-badges { + display: flex; + gap: 10px; +} + +.hesabix-badge { + padding: 5px 12px; + border-radius: 20px; + font-size: 0.9rem; + font-weight: 600; + display: flex; + align-items: center; + gap: 8px; +} + +.hesabix-badge.version { + background: rgba(255, 255, 255, 0.2); +} + +.hesabix-badge.status { + background: #28a745; + color: white; + border: 1px solid #28a745; +} + +.hesabix-badge.warning { + background: #ffc107; + color: #212529; + border: 1px solid #ffc107; +} + +.hesabix-badge.danger { + background: #dc3545; + color: white; + border: 1px solid #dc3545; +} + +.hesabix-badge.info { + background: #17a2b8; +} + +.hesabix-update-badge { + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 8px; + background: rgba(102, 126, 234, 0.1); + color: #667eea; + border: 1px solid rgba(102, 126, 234, 0.2); +} + +.hesabix-update-badge:hover { + background: rgba(102, 126, 234, 0.15); + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(102, 126, 234, 0.2); +} + +.hesabix-update-badge:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none; +} + + +.hesabix-badge.status { + cursor: default; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 8px; +} + +.hesabix-badge.warning { + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 8px; +} + +.hesabix-badge.warning:hover { + background: #e0a800; + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(255, 193, 7, 0.3); +} + +.hesabix-badge.danger { + cursor: default; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 8px; +} + +.hesabix-spinner-small { + width: 12px; + height: 12px; + border: 2px solid #e3e6ea; + border-top: 2px solid #667eea; + border-radius: 50%; + animation: hesabix-spin 1s linear infinite; +} + + +.hesabix-card { + background: white; + border-radius: 15px; + padding: 30px; + margin-bottom: 30px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.hesabix-card:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); +} + +.hesabix-card-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 25px; + padding-bottom: 15px; + border-bottom: 3px solid #667eea; +} + +.hesabix-card-title { + margin: 0; + font-size: 1.8rem; + color: #333; + font-weight: 700; +} + +.hesabix-card-subtitle { + margin: 5px 0 0 0; + color: #666; + font-size: 1rem; +} + + +.hesabix-grid { + display: grid; + gap: 25px; +} + +.hesabix-grid-2 { + grid-template-columns: repeat(2, 1fr); +} + +.hesabix-grid-3 { + grid-template-columns: repeat(3, 1fr); +} + +.hesabix-grid-4 { + grid-template-columns: repeat(4, 1fr); +} + + +.hesabix-feature-card { + padding: 25px; + border-radius: 12px; + background: #f8f9fa; + border-left: 4px solid #667eea; + transition: transform 0.3s ease, box-shadow 0.3s ease; + text-align: center; +} + +.hesabix-feature-card:hover { + transform: translateY(-5px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); +} + +.hesabix-feature-icon { + font-size: 2.5rem; + color: #667eea; + margin-bottom: 15px; + width: 80px; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + background: rgba(102, 126, 234, 0.1); + border-radius: 50%; + margin: 0 auto 15px auto; +} + +.hesabix-feature-card h3 { + margin: 0 0 10px 0; + font-size: 1.3rem; + color: #333; +} + +.hesabix-feature-card p { + margin: 0; + color: #666; + line-height: 1.6; +} + + +.hesabix-btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 12px 24px; + border-radius: 8px; + text-decoration: none; + font-weight: 600; + transition: all 0.3s ease; + border: none; + cursor: pointer; + font-size: 0.95rem; + text-align: center; + justify-content: center; + min-width: 120px; +} + +.hesabix-btn:hover { + transform: translateY(-2px); + text-decoration: none; +} + +.hesabix-btn-primary { + background: #667eea; + color: white; +} + +.hesabix-btn-primary:hover { + background: #5a6fd8; + color: white; +} + +.hesabix-btn-success { + background: #28a745; + color: white; +} + +.hesabix-btn-success:hover { + background: #218838; + color: white; +} + +.hesabix-btn-warning { + background: #ffc107; + color: #212529; +} + +.hesabix-btn-warning:hover { + background: #e0a800; + color: #212529; +} + +.hesabix-btn-danger { + background: #dc3545; + color: white; +} + +.hesabix-btn-danger:hover { + background: #c82333; + color: white; +} + +.hesabix-btn-info { + background: #17a2b8; + color: white; +} + +.hesabix-btn-info:hover { + background: #138496; + color: white; +} + +.hesabix-btn-secondary { + background: #6c757d; + color: white; +} + +.hesabix-btn-secondary:hover { + background: #5a6268; + color: white; +} + +.hesabix-btn-outline { + background: transparent; + border: 2px solid #667eea; + color: #667eea; +} + +.hesabix-btn-outline:hover { + background: #667eea; + color: white; +} + +.hesabix-btn-sm { + padding: 8px 16px; + font-size: 0.85rem; + min-width: 80px; +} + +.hesabix-btn-lg { + padding: 15px 30px; + font-size: 1.1rem; + min-width: 150px; +} + +.hesabix-btn-group { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + + +.hesabix-form-actions { + display: flex; + justify-content: flex-end; + gap: 15px; + margin-top: 30px; + padding-top: 20px; + border-top: 2px solid #e9ecef; +} + + +.hesabix-form-group { + margin-bottom: 28px; +} + +.hesabix-form-label { + margin-bottom: 10px; + font-size: 1rem; + font-weight: 600; + color: #374151; +} + +.hesabix-form-control { + width: 100%; + padding: 12px 15px; + border: 2px solid #e9ecef; + border-radius: 8px; + font-size: 1rem; + transition: border-color 0.3s ease, box-shadow 0.3s ease; + background: white; +} + +.hesabix-form-control:focus { + outline: none; + border-color: #667eea; + box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); +} + +.hesabix-form-control.error { + border-color: #dc3545; +} + +.hesabix-form-control.success { + border-color: #28a745; +} + +.hesabix-form-text { + display: block; + margin-top: 10px; + color: #6c757d; + font-size: 0.95rem; + background: #f8fafc; + border-radius: 6px; + padding: 10px 14px; + border-right: 3px solid #667eea; + font-weight: 500; + line-height: 1.7; +} + +.hesabix-form-text.error { + color: #dc3545; +} + +.hesabix-form-text.success { + color: #28a745; +} + + +.hesabix-table { + width: 100%; + border-collapse: collapse; + background: white; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + margin-bottom: 20px; +} + +.hesabix-table th { + background: #667eea; + color: white; + padding: 15px; + text-align: right; + font-weight: 600; + font-size: 0.95rem; +} + +.hesabix-table td { + padding: 12px 15px; + text-align: right; + border-bottom: 1px solid #e9ecef; + vertical-align: middle; +} + +.hesabix-table tr:hover { + background: #f8f9fa; +} + +.hesabix-table tr:last-child td { + border-bottom: none; +} + + +.hesabix-table-container { + overflow-x: auto; + border-radius: 12px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + background: white; + margin-bottom: 20px; +} + +.hesabix-table-container .hesabix-table { + margin-bottom: 0; + box-shadow: none; + border-radius: 0; +} + + +@media (max-width: 768px) { + .hesabix-table-container { + border-radius: 8px; + margin: 0 -10px 20px -10px; + } + + .hesabix-table-container .hesabix-table { + min-width: 600px; + } + + .hesabix-table-container .hesabix-table th, + .hesabix-table-container .hesabix-table td { + padding: 10px 8px; + font-size: 0.9rem; + } + + .hesabix-table-container .hesabix-table th { + font-size: 0.85rem; + padding: 12px 8px; + } + + + .hesabix-table-container .hesabix-switch { + transform: scale(0.9); + margin: 0 auto; + display: block; + } + + + .hesabix-table-container .hesabix-input { + font-size: 0.85rem; + padding: 6px 8px; + min-width: 80px; + } +} + +@media (max-width: 480px) { + .hesabix-table-container { + margin: 0 -15px 20px -15px; + border-radius: 6px; + } + + .hesabix-table-container .hesabix-table { + min-width: 500px; + } + + .hesabix-table-container .hesabix-table th, + .hesabix-table-container .hesabix-table td { + padding: 8px 6px; + font-size: 0.8rem; + } + + .hesabix-table-container .hesabix-table th { + font-size: 0.8rem; + padding: 10px 6px; + } + + .hesabix-table-container .hesabix-switch { + transform: scale(0.8); + } + + .hesabix-table-container .hesabix-input { + font-size: 0.8rem; + padding: 4px 6px; + min-width: 60px; + } +} + + +.hesabix-section:has(.hesabix-table-container) { + background: #f8f9fa; + border-radius: 12px; + padding: 20px; + margin-bottom: 30px; +} + +.hesabix-section:has(.hesabix-table-container) .hesabix-section-title { + margin-bottom: 15px; + color: #495057; + font-size: 1.1rem; +} + +.hesabix-section:has(.hesabix-table-container) .hesabix-section-description { + margin-bottom: 20px; + color: #6c757d; + font-size: 0.95rem; + line-height: 1.5; +} + + +.hesabix-field-group { + margin-bottom: 25px; + padding: 15px; + background: white; + border-radius: 8px; + border: 1px solid #e9ecef; +} + +.hesabix-field-label { + display: block; + font-weight: 600; + color: #495057; + margin-bottom: 10px; + font-size: 0.95rem; +} + +.hesabix-radio-group { + display: flex; + flex-direction: column; + gap: 12px; +} + +.hesabix-radio { + display: flex; + align-items: center; + gap: 10px; + padding: 10px; + border-radius: 6px; + cursor: pointer; + transition: background-color 0.2s ease; +} + +.hesabix-radio:hover { + background: #f8f9fa; +} + +.hesabix-radio input[type="radio"] { + margin: 0; +} + +.hesabix-radio-custom { + width: 18px; + height: 18px; + border: 2px solid #dee2e6; + border-radius: 50%; + position: relative; + transition: all 0.2s ease; +} + +.hesabix-radio input[type="radio"]:checked+.hesabix-radio-custom { + border-color: #667eea; + background: #667eea; +} + +.hesabix-radio input[type="radio"]:checked+.hesabix-radio-custom::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 6px; + height: 6px; + background: white; + border-radius: 50%; +} + + +@media (max-width: 768px) { + .hesabix-field-group { + padding: 12px; + margin-bottom: 20px; + } + + .hesabix-field-label { + font-size: 0.9rem; + margin-bottom: 8px; + } + + .hesabix-radio { + padding: 8px; + font-size: 0.9rem; + } + + .hesabix-radio-custom { + width: 16px; + height: 16px; + } + + .hesabix-radio input[type="radio"]:checked+.hesabix-radio-custom::after { + width: 5px; + height: 5px; + } +} + +@media (max-width: 480px) { + .hesabix-field-group { + padding: 10px; + margin-bottom: 15px; + } + + .hesabix-field-label { + font-size: 0.85rem; + margin-bottom: 6px; + } + + .hesabix-radio { + padding: 6px; + font-size: 0.85rem; + } + + .hesabix-radio-custom { + width: 14px; + height: 14px; + } + + .hesabix-radio input[type="radio"]:checked+.hesabix-radio-custom::after { + width: 4px; + height: 4px; + } +} + + +.hesabix-alert { + padding: 15px 20px; + border-radius: 10px; + margin-bottom: 20px; + border: 1px solid transparent; + display: flex; + align-items: center; + gap: 10px; +} + +.hesabix-alert-success { + background: #d4edda; + border-color: #c3e6cb !important; + color: #155724; +} + +.hesabix-alert-danger { + background: #f8d7da; + border-color: #f5c6cb !important; + color: #721c24; +} + +.hesabix-alert-warning { + background: #fff3cd; + border-color: #ffeaa7 !important; + color: #856404; +} + +.hesabix-alert-info { + background: #d1ecf1; + border-color: #bee5eb !important; + color: #0c5460; +} + +.hesabix-alert-primary { + background: #cce7ff; + border-color: #b3d9ff !important; + color: #004085; +} + + +.hesabix-progress { + width: 100%; + height: 20px; + background: #e9ecef; + border-radius: 10px; + overflow: hidden; + margin: 10px 0; +} + +.hesabix-progress-bar { + height: 100%; + background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); + border-radius: 10px; + transition: width 0.3s ease; + display: flex; + align-items: center; + justify-content: center; + color: white; + font-size: 0.8rem; + font-weight: 600; +} + + +.hesabix-tabs { + display: flex; + border-bottom: 2px solid #e9ecef; + margin-bottom: 30px; + overflow-x: auto; + justify-content: flex-start; + text-align: right; + gap: 5px; + padding: 0 10px; +} + +.hesabix-tab { + padding: 15px 20px; + background: none; + border: none; + cursor: pointer; + font-weight: 600; + color: #6c757d; + transition: all 0.3s ease; + white-space: nowrap; + border-bottom: 3px solid transparent; + border-radius: 8px 8px 0 0; + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + min-height: 50px; +} + +.hesabix-tab:hover { + color: #667eea; + background: rgba(102, 126, 234, 0.08); + transform: translateY(-2px); +} + +.hesabix-tab.active { + color: #667eea; + border-bottom-color: #667eea; + background: rgba(102, 126, 234, 0.12); + box-shadow: 0 2px 8px rgba(102, 126, 234, 0.15); + transform: none !important; +} + +.hesabix-tab-content { + display: none; +} + +.hesabix-tab-content.active { + display: block; +} + + +.hesabix-modal { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + z-index: 9999; + align-items: center; + justify-content: center; +} + +.hesabix-modal.show { + display: flex; +} + +.hesabix-modal-content { + background: white; + border-radius: 15px; + padding: 30px; + max-width: 600px; + width: 90%; + max-height: 80vh; + overflow-y: auto; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); +} + +.hesabix-modal-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 2px solid #e9ecef; +} + +.hesabix-modal-title { + margin: 0; + font-size: 1.5rem; + color: #333; +} + +.hesabix-modal-close { + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + color: #6c757d; + padding: 0; + width: 30px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + transition: all 0.3s ease; +} + +.hesabix-modal-close:hover { + background: #f8f9fa; + color: #333; +} + + +.hesabix-loading { + display: inline-block; + width: 20px; + height: 20px; + border: 3px solid #f3f3f3; + border-top: 3px solid #667eea; + border-radius: 50%; + animation: hesabix-spin 1s linear infinite; +} + +@keyframes hesabix-spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + + +.hesabix-text-center { + text-align: center; +} + +.hesabix-text-right { + text-align: right; +} + +.hesabix-text-left { + text-align: left; +} + +.hesabix-mt-0 { + margin-top: 0; +} + +.hesabix-mt-1 { + margin-top: 0.25rem; +} + +.hesabix-mt-2 { + margin-top: 0.5rem; +} + +.hesabix-mt-3 { + margin-top: 1rem; +} + +.hesabix-mt-4 { + margin-top: 1.5rem; +} + +.hesabix-mt-5 { + margin-top: 3rem; +} + +.hesabix-mb-0 { + margin-bottom: 0; +} + +.hesabix-mb-1 { + margin-bottom: 0.25rem; +} + +.hesabix-mb-2 { + margin-bottom: 0.5rem; +} + +.hesabix-mb-3 { + margin-bottom: 1rem; +} + +.hesabix-mb-4 { + margin-bottom: 1.5rem; +} + +.hesabix-mb-5 { + margin-bottom: 3rem; +} + +.hesabix-p-0 { + padding: 0; +} + +.hesabix-p-1 { + padding: 0.25rem; +} + +.hesabix-p-2 { + padding: 0.5rem; +} + +.hesabix-p-3 { + padding: 1rem; +} + +.hesabix-p-4 { + padding: 1.5rem; +} + +.hesabix-p-5 { + padding: 3rem; +} + +.hesabix-d-none { + display: none; +} + +.hesabix-d-block { + display: block; +} + +.hesabix-d-flex { + display: flex; +} + +.hesabix-d-grid { + display: grid; +} + +.hesabix-w-100 { + width: 100%; +} + +.hesabix-h-100 { + height: 100%; +} + + +@media (max-width: 768px) { + .hesabix-container { + padding: 15px; + } + + .hesabix-header { + flex-direction: column; + text-align: center; + padding: 20px; + gap: 15px; + } + + .hesabix-logo { + width: 60px; + height: 60px; + } + + .hesabix-title { + font-size: 1.8rem; + } + + .hesabix-subtitle { + font-size: 1rem; + } + + .hesabix-card { + padding: 20px; + } + + .hesabix-grid-2, + .hesabix-grid-3, + .hesabix-grid-4 { + grid-template-columns: 1fr; + gap: 20px; + } + + .hesabix-feature-card { + padding: 20px; + } + + .hesabix-feature-icon { + width: 60px; + height: 60px; + font-size: 2rem; + } + + .hesabix-btn-group { + flex-direction: column; + } + + .hesabix-btn { + width: 100%; + } + + .hesabix-tabs { + flex-direction: column; + gap: 2px; + } + + .hesabix-tab { + text-align: center; + border-bottom: none; + border-right: 3px solid transparent; + border-radius: 0 8px 8px 0; + min-height: 45px; + } + + .hesabix-tab.active { + border-right-color: #667eea; + border-bottom-color: transparent; + } + + #hesabix_sync_orders { + flex-direction: column; + gap: 10px; + } + + .order-sync-card { + grid-column: 1/1 !important; + } +} + +@media (max-width: 480px) { + .hesabix-container { + padding: 10px; + } + + .hesabix-header { + padding: 15px; + } + + .hesabix-title { + font-size: 1.5rem; + } + + .hesabix-subtitle { + font-size: 0.9rem; + } + + .hesabix-card-title { + font-size: 1.4rem; + } + + .hesabix-feature-card h3 { + font-size: 1.1rem; + } +} + + +.wp-admin .hesabix-admin { + margin-top: 32px; +} + +.wp-admin .hesabix-admin .hesabix-container { + margin-top: 20px; +} + + +.hesabix-admin ::-webkit-scrollbar { + width: 8px; +} + +.hesabix-admin ::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 4px; +} + +.hesabix-admin ::-webkit-scrollbar-thumb { + background: #667eea; + border-radius: 4px; +} + +.hesabix-admin ::-webkit-scrollbar-thumb:hover { + background: #5a6fd8; +} + + +@keyframes hesabix-fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.hesabix-fade-in { + animation: hesabix-fadeIn 0.5s ease-out; +} + + +@media print { + .hesabix-admin { + background: white; + } + + .hesabix-card { + box-shadow: none; + border: 1px solid #ddd; + } + + .hesabix-btn { + display: none; + } +} + + +.hesabix-setup-steps { + display: flex; + flex-direction: column; + gap: 20px; +} + +.hesabix-setup-step { + display: flex; + align-items: flex-start; + gap: 20px; + padding: 20px; + background: #f8f9fa; + border-radius: 12px; + border-left: 4px solid #667eea; + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.hesabix-setup-step:hover { + transform: translateX(-5px); + box-shadow: 0 4px 15px rgba(102, 126, 234, 0.2); +} + +.hesabix-step-number { + width: 40px; + height: 40px; + background: #667eea; + color: white; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 1.2rem; + flex-shrink: 0; +} + +.hesabix-step-content h4 { + margin: 0 0 8px 0; + color: #333; + font-size: 1.2rem; + font-weight: 600; +} + +.hesabix-step-content p { + margin: 0; + color: #666; + line-height: 1.6; +} + + +.hand { + cursor: pointer; +} + +.hesabix-tab-icon { + width: 18px; + height: 18px; + opacity: 0.8; + transition: opacity 0.3s ease; +} + +.hesabix-tab:hover .hesabix-tab-icon { + opacity: 1; +} + +.hesabix-tab.active .hesabix-tab-icon { + opacity: 1; +} + +.hesabix-bold { + font-weight: bold; +} + +.hesabix-plugin-tutorial-chapter { + color: #667eea; + font-weight: bold; + border-bottom: 1px solid #e9ecef; + margin-bottom: 5px; + padding-bottom: 10px; + margin-top: 10px; + transition: color 0.3s ease; +} + +.hesabix-plugin-tutorial-chapter:hover { + color: #5a6fd8; + cursor: pointer; +} + + +.hesabix-section { + margin-bottom: 32px; + padding-bottom: 24px; + +} + +.hesabix-section:last-child { + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; +} + +.hesabix-section-title { + font-size: 18px; + font-weight: 600; + color: #374151; + margin-bottom: 16px; + padding-bottom: 8px; + border-bottom: 2px solid #e5e7eb; +} + + +.hesabix-card form table { + width: 100%; + border-collapse: collapse; + margin-bottom: 0; +} + +.hesabix-card form table th { + padding: 10px 12px; + text-align: right; + font-weight: 600; + color: #374151; + + width: 20%; + vertical-align: middle; + font-size: 15px; + position: relative; + + font-family: 'IRANYekanWeb'; +} + +.hesabix-card form table th label { + font-weight: 600; + color: #374151; + font-size: 15px; + margin: 0; + display: block; + line-height: 1.5; + text-align: right; + padding: 0; + background: none; + border: none; + box-shadow: none; + font-family: 'IRANYekanWeb'; +} + +.hesabix-card form table th label:focus { + outline: none; + box-shadow: none; + border: none; +} + +.hesabix-card form table td { + padding: 20px; + border-bottom: 1px solid #e2e8f0; + vertical-align: top; + display: flex; + flex-direction: column; + background: white; + position: relative; +} + +.hesabix-card form input[type="text"], +.hesabix-card form input[type="password"], +.hesabix-card form input[type="email"], +.hesabix-card form input[type="number"], +.hesabix-card form select, +.hesabix-card form textarea { + width: 100%; + max-width: 450px; + padding: 14px 18px; + border: 2px solid #e2e8f0; + border-radius: 10px; + font-size: 14px; + transition: all 0.3s ease; + background: white; + font-family: 'IRANYekanWeb'; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.hesabix-card form input[type="text"]:focus, +.hesabix-card form input[type="password"]:focus, +.hesabix-card form input[type="email"]:focus, +.hesabix-card form input[type="number"]:focus, +.hesabix-card form select:focus, +.hesabix-card form textarea:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15), 0 4px 12px rgba(59, 130, 246, 0.1); + transform: translateY(-1px); +} + +.hesabix-card form input[type="checkbox"] { + width: 18px; + height: 18px; + border: 2px solid #d1d5db; + border-radius: 4px; + cursor: pointer; +} + +.hesabix-card form input[type="radio"] { + width: 18px; + height: 18px; + border: 2px solid #d1d5db; + cursor: pointer; +} + +.hesabix-card form label { + font-weight: 500; + color: #374151; + display: block; +} + +.hesabix-card form .description { + color: #64748b; + font-size: 13px; + margin-top: 8px; + line-height: 1.5; + padding: 8px 12px; + background: #f8fafc; + border-radius: 6px; + border-right: 3px solid #3b82f6; + font-weight: 500; + display: inline-block; + max-width: 450px; +} + + +.hesabix-btn.loading { + position: relative; + color: transparent; +} + +.hesabix-btn.loading::after { + content: ''; + color: white !important; + position: absolute; + top: 50%; + left: 50%; + width: 16px; + height: 16px; + margin: -8px 0 0 -8px; + border: 2px solid transparent; + border-top: 2px solid currentColor; + border-radius: 50%; + animation: hesabix-spin 1s linear infinite; +} + +.hesabix-message { + padding: 12px 16px; + border-radius: 6px; + font-size: 14px; + font-weight: 500; + margin-top: 16px; + border: 1px solid; +} + +.hesabix-message.success { + background-color: #f0fdf4; + border-color: #22c55e; + color: #166534; +} + +.hesabix-message.error { + background-color: #fef2f2; + border-color: #ef4444; + color: #991b1b; +} + +.hesabix-message svg { + flex-shrink: 0; +} + + +.hesabix-message { + padding: 12px 16px; + border-radius: 8px; + margin-bottom: 16px; + font-weight: 500; +} + +.hesabix-message.success { + background: #d1fae5; + color: #065f46; + border: 1px solid #a7f3d0; + padding: 12px 16px; +} + +.hesabix-message.error { + background: #fee2e2; + color: #991b1b; + border: 1px solid #fecaca; + padding: 12px 16px; +} + +.hesabix-message.warning { + background: #fef3c7; + color: #92400e; + border: 1px solid #fde68a; + padding: 12px 16px; +} + + +.hesabix-switch { + position: relative; + display: inline-block; + width: 46px; + height: 24px; + vertical-align: middle; + margin-left: 10px; +} + +.hesabix-switch input { + opacity: 0; + width: 0; + height: 0; +} + +.hesabix-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + transition: .4s; + border-radius: 24px; +} + +.hesabix-slider:before { + position: absolute; + content: ""; + height: 18px; + width: 18px; + left: 3px; + bottom: 3px; + background-color: white; + transition: .4s; + border-radius: 50%; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); +} + +.hesabix-switch input:checked+.hesabix-slider { + background-color: #667eea; +} + +.hesabix-switch input:checked+.hesabix-slider:before { + transform: translateX(22px); +} + +.hesabix-switch .hesabix-slider { + box-shadow: 0 2px 4px rgba(102, 126, 234, 0.08); +} + + +#log-history-list { + display: grid !important; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)) !important; + gap: 10px !important; + margin-top: 12px !important; +} + +.log-date-btn { + position: relative !important; + border: 2px solid #e1e5e9 !important; + border-radius: 6px !important; + padding: 12px 16px !important; + background: #fff !important; + cursor: pointer !important; + transition: all 0.3s ease !important; + display: flex !important; + align-items: center !important; + gap: 10px !important; + font-size: 13px !important; + font-weight: 500 !important; + color: #23282d !important; + text-decoration: none !important; +} + +.log-date-btn:hover { + border-color: #0073aa !important; + box-shadow: 0 2px 6px rgba(0, 115, 170, 0.12) !important; + transform: translateY(-1px) !important; + color: #23282d !important; +} + +.log-date-btn.active { + border-color: #0073aa !important; + background: #f0f8ff !important; + box-shadow: 0 2px 6px rgba(0, 115, 170, 0.18) !important; + color: #23282d !important; + padding-right: 44px !important; +} + +.log-date-btn:focus { + outline: none !important; + box-shadow: 0 0 0 3px rgba(0, 115, 170, 0.1) !important; +} + +.log-date-btn.active::after { + content: '📄' !important; + position: absolute !important; + right: 16px !important; + top: 50% !important; + transform: translateY(-50%) !important; + width: 20px !important; + border-radius: 50% !important; + background: #0073aa !important; + color: #fff !important; + font-size: 10px !important; + font-weight: bold !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + padding: 2px !important; + padding-top: 4px !important; +} + +.hesabix-btn:disabled, +.hesabix-btn[disabled] { + opacity: 0.5 !important; + pointer-events: none !important; + filter: grayscale(0.3); + cursor: not-allowed !important; +} + +.hesabix-version-card { + direction: rtl !important; + background: linear-gradient(135deg, #374896 0%, #422361 50%, #5d495f 100%) !important; + color: #fff; + box-shadow: 0 8px 32px rgba(102, 126, 234, 0.25), 0 4px 16px rgba(240, 147, 251, 0.15); + border-radius: 24px; + padding: 40px; + margin-bottom: 32px; + display: flex; + align-items: center; + gap: 32px; + position: relative; + overflow: hidden; + transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.hesabix-version-card:hover { + box-shadow: 0 12px 40px rgba(102, 126, 234, 0.35), 0 8px 24px rgba(240, 147, 251, 0.25); +} + +.hesabix-version-card .hesabix-version-icon { + width: 40px; + height: 40px; + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(10px); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.7); + animation: hesabix-pulse 2s infinite cubic-bezier(0.66, 0, 0, 1); + margin-left: 24px; + position: relative; + z-index: 2; + border: 2px solid rgba(255, 255, 255, 0.2); +} + +.hesabix-version-card .hesabix-version-icon svg { + width: 20px; + height: 20px; + color: #fff; + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1)); +} + +@keyframes hesabix-pulse { + 0% { + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.7); + transform: scale(1); + } + + 50% { + box-shadow: 0 0 0 20px rgba(255, 255, 255, 0); + transform: scale(1.05); + } + + 100% { + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); + transform: scale(1); + } +} + +@keyframes hesabix-shimmer { + + 0%, + 100% { + transform: rotate(0deg); + } + + 50% { + transform: rotate(180deg); + } +} + +@keyframes hesabix-glow { + + 0%, + 100% { + opacity: 0.3; + } + + 50% { + opacity: 0.7; + } +} + +.hesabix-version-card .hesabix-version-info { + display: flex; + flex-direction: column; + gap: 12px; + position: relative; + z-index: 2; + flex: 1; +} + +.hesabix-version-card .hesabix-version-title { + font-size: 1.5rem; + font-weight: 800; + margin-bottom: 4px; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + letter-spacing: -0.5px; +} + +.hesabix-version-card .hesabix-version-row { + font-size: 1.1rem; + font-weight: 500; + margin-bottom: 4px; + opacity: 0.95; + display: flex; + align-items: center; + gap: 8px; + padding: 8px 16px; + background: rgba(255, 255, 255, 0.1); + border-radius: 12px; + backdrop-filter: blur(5px); + border: 1px solid rgba(255, 255, 255, 0.1); + transition: all 0.3s ease; +} + +.hesabix-version-card .hesabix-version-row:hover { + background: rgba(255, 255, 255, 0.15); + transform: translateX(-4px); +} + +.hesabix-version-card .hesabix-version-row::before { + content: '•'; + width: 10px; + height: 12px; + color: #fff; + font-weight: bold; + font-size: 1.2rem; + margin-top: auto; + margin-bottom: auto; +} + +.hesabix-version-section { + margin-bottom: 20px; + padding: 16px; + background: rgba(255, 255, 255, 0.08); + border-radius: 12px; + border: 1px solid rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); +} + +.hesabix-version-section:last-child { + margin-bottom: 0; +} + +.hesabix-version-section-title { + font-size: 1.1rem; + font-weight: 700; + color: #fff; + margin-bottom: 12px; + padding-bottom: 8px; + border-bottom: 2px solid rgba(255, 255, 255, 0.2); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.hesabix-version-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 8px; +} + +.hesabix-version-row { + display: flex; + justify-content: center; + align-items: center; + padding: 8px 12px; + background: rgba(255, 255, 255, 0.05); + border-radius: 8px; + border: 1px solid rgba(255, 255, 255, 0.1); + transition: all 0.3s ease; +} + +.hesabix-version-row:hover { + background: rgba(255, 255, 255, 0.1); + transform: translateX(-2px); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.hesabix-version-label { + font-weight: 600; + color: rgba(255, 255, 255, 0.9); + font-size: 0.95rem; +} + +.hesabix-version-value { + font-weight: 500; + color: #fff; + font-size: 0.95rem; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); +} + + +@media (max-width: 768px) { + .hesabix-version-card { + flex-direction: column; + text-align: center; + padding: 30px 24px; + gap: 24px; + } + + .hesabix-version-card .hesabix-version-icon { + margin-left: 10px; + width: 40px; + height: 40px; + } + + .hesabix-version-card .hesabix-version-icon svg { + width: 20px; + height: 20px; + } + + .hesabix-version-card .hesabix-version-title { + font-size: 0.8rem; + } + + .hesabix-version-card .hesabix-version-row { + font-size: 1rem; + padding: 6px 12px; + } + + .hesabix-version-grid { + grid-template-columns: 1fr; + } + + .hesabix-version-section { + padding: 12px; + } + + .hesabix-version-section-title { + font-size: 1rem; + } + + .hesabix-version-label, + .hesabix-version-value { + font-size: 0.9rem; + } +} + +.wp-die-message, +p { + margin-top: 0.25em !important; +} + +.signature-button { + position: relative; + overflow: hidden; +} + +.signature-button::before { + content: ''; + position: absolute; + top: 0; + left: -75%; + width: 30%; + height: 100%; + background: linear-gradient(100deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.1) 25%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.1) 75%, rgba(255, 255, 255, 0) 100%); + transform: skewX(-18deg); + animation: shine-anim 5s infinite; + pointer-events: none; +} + +@keyframes shine-anim { + 0% { + left: -75%; + } + + 100% { + left: 130%; + } +} + +@media screen and (max-width: 782px) { + .hesabix-logo img { + width: 35px !important; + height: 35px !important; + } +} + + +.hesabix-status-selector { + margin: 20px 0; +} + +.hesabix-status-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 12px; + margin-top: 12px; +} + +.hesabix-status-item { + position: relative; + border: 2px solid #e1e5e9; + border-radius: 8px; + padding: 16px; + background: #fff; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 12px; +} + +.hesabix-status-item:hover { + border-color: #0073aa; + box-shadow: 0 2px 8px rgba(0, 115, 170, 0.15); + transform: translateY(-1px); +} + +.hesabix-status-item.selected { + border-color: #0073aa; + background: #f0f8ff; + box-shadow: 0 2px 8px rgba(0, 115, 170, 0.2); +} + +.hesabix-status-item input[type="checkbox"] { + position: absolute; + opacity: 0; + pointer-events: none; +} + +.hesabix-status-icon { + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.hesabix-status-icon svg { + width: 16px; + height: 16px; + fill: currentColor; +} + +.hesabix-status-content { + flex: 1; +} + +.hesabix-status-title { + font-weight: 600; + color: #23282d; + margin-bottom: 4px; + font-size: 14px; +} + +.hesabix-status-description { + font-size: 12px; + color: #666; + line-height: 1.4; +} + + +.hesabix-status-pending .hesabix-status-icon { + background: #ffba00; + color: #fff; +} + +.hesabix-status-processing .hesabix-status-icon { + background: #0073aa; + color: #fff; +} + +.hesabix-status-on-hold .hesabix-status-icon { + background: #f7b100; + color: #fff; +} + +.hesabix-status-completed .hesabix-status-icon { + background: #46b450; + color: #fff; +} + +.hesabix-status-cancelled .hesabix-status-icon { + background: #dc3232; + color: #fff; +} + +.hesabix-status-refunded .hesabix-status-icon { + background: #a0a5aa; + color: #fff; +} + +.hesabix-status-failed .hesabix-status-icon { + background: #dc3232; + color: #fff; +} + +.hesabix-status-checkout-draft .hesabix-status-icon { + background: #6c757d; + color: #fff; +} + + +.hesabix-status-item.selected.hesabix-status-pending { + border-color: #ffba00; + background: #fffbf0; +} + +.hesabix-status-item.selected.hesabix-status-processing { + border-color: #0073aa; + background: #f0f8ff; +} + +.hesabix-status-item.selected.hesabix-status-on-hold { + border-color: #f7b100; + background: #fffbf0; +} + +.hesabix-status-item.selected.hesabix-status-completed { + border-color: #46b450; + background: #f0fff0; +} + +.hesabix-status-item.selected.hesabix-status-cancelled { + border-color: #dc3232; + background: #fff0f0; +} + +.hesabix-status-item.selected.hesabix-status-refunded { + border-color: #a0a5aa; + background: #f8f9fa; +} + +.hesabix-status-item.selected.hesabix-status-failed { + border-color: #dc3232; + background: #fff0f0; +} + +.hesabix-status-item.selected.hesabix-status-checkout-draft { + border-color: #6c757d; + background: #f8f9fa; +} + + +@media (max-width: 768px) { + .hesabix-status-grid { + grid-template-columns: 1fr; + } + + .hesabix-status-item { + padding: 12px; + } +} + + +.hesabix-status-counter { + margin-top: 12px; + padding: 8px 12px; + background: #f8f9fa; + border-radius: 4px; + font-size: 12px; + color: #666; + border: 1px solid #e1e5e9; +} + +.hesabix-status-counter strong { + color: #0073aa; +} + + +.hesabix-date-presets { + margin-bottom: 16px; +} + +.hesabix-date-presets>div { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 10px; + margin-top: 12px; +} + +.hesabix-date-preset-btn { + position: relative; + border: 2px solid #e1e5e9; + border-radius: 6px; + padding: 12px 16px; + background: #fff; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 10px; + font-size: 13px; + font-weight: 500; + color: #23282d; +} + +.hesabix-date-preset-btn:hover { + border-color: #0073aa; + box-shadow: 0 2px 6px rgba(0, 115, 170, 0.12); + transform: translateY(-1px); +} + +.hesabix-date-preset-btn.active { + border-color: #0073aa; + background: #f0f8ff; + box-shadow: 0 2px 6px rgba(0, 115, 170, 0.18); + padding-right: 44px; +} + +.hesabix-date-preset-btn:focus { + outline: none; + box-shadow: 0 0 0 3px rgba(0, 115, 170, 0.1); +} + +.hesabix-date-preset-btn.active::after { + content: '✓'; + position: absolute; + right: 16px; + top: 50%; + transform: translateY(-50%); + width: 20px; + height: 20px; + border-radius: 50%; + background: #0073aa; + color: #fff; + font-size: 12px; + font-weight: bold; + display: flex; + align-items: center; + justify-content: center; + padding: 2px !important; + padding-top: 4px !important; +} + +.hesabix-date-range-container { + margin: 16px 0; +} + +.hesabix-date-range-wrapper { + display: flex; + align-items: flex-end; + gap: 16px; + flex-wrap: wrap; +} + +.hesabix-date-field { + display: flex; + flex-direction: column; + gap: 6px; + flex: 1; + min-width: 160px; +} + +.hesabix-date-label { + font-size: 14px; + font-weight: 500; + color: #374151; + margin-bottom: 4px; +} + +.hesabix-date-input { + padding: 10px 12px; + border: 1px solid #d1d5db; + border-radius: 6px; + font-size: 14px; + background: #ffffff; + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} + +.hesabix-date-input:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); +} + +.hesabix-date-input.error { + border-color: #dc2626; + box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1); +} + +.hesabix-date-arrow { + display: flex; + align-items: center; + justify-content: center; + color: #6b7280; + margin-bottom: 8px; + flex-shrink: 0; +} + +.hesabix-selected-range { + animation: hesabix-fade-in 0.3s ease; +} + +@keyframes hesabix-fade-in { + from { + opacity: 0; + transform: translateY(-10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + + +@media (max-width: 768px) { + .hesabix-date-range-wrapper { + flex-direction: column; + align-items: stretch; + } + + .hesabix-date-field { + min-width: unset; + } + + .hesabix-date-arrow { + transform: rotate(-90deg); + margin: 8px 0; + } + + .hesabix-date-presets>div { + grid-template-columns: 1fr !important; + } + + .hesabix-date-preset-btn { + width: 100%; + justify-content: flex-start; + } + + #log-history-list { + grid-template-columns: 1fr !important; + } + + .log-date-btn { + width: 100% !important; + justify-content: flex-start !important; + } +} + + +.hesabix-freight-switch-container { + margin: 16px 0; +} + +.hesabix-freight-options { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 12px; + margin-bottom: 16px; +} + +.hesabix-freight-option { + position: relative; + border: 2px solid #e1e5e9; + border-radius: 8px; + padding: 16px; + background: #fff; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 12px; +} + +.hesabix-freight-option:hover { + border-color: #0073aa; + box-shadow: 0 2px 8px rgba(0, 115, 170, 0.15); + transform: translateY(-1px); +} + +.hesabix-freight-option.active { + border-color: #0073aa; + background: #f0f8ff; + box-shadow: 0 2px 8px rgba(0, 115, 170, 0.2); +} + +.hesabix-freight-option-content { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 8px; + width: 100%; +} + +.hesabix-freight-icon { + width: 24px; + height: 24px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + background: #f8f9fa; + transition: all 0.3s ease; +} + +.hesabix-freight-option.active .hesabix-freight-icon { + background: #0073aa; + color: #fff; +} + +.hesabix-freight-icon svg { + width: 16px; + height: 16px; + fill: currentColor; +} + +.hesabix-freight-option:not(.active) .hesabix-freight-icon { + color: #6b7280; +} + +.hesabix-freight-title { + font-weight: 600; + color: #23282d; + margin-bottom: 4px; + font-size: 14px; +} + +.hesabix-freight-desc { + font-size: 12px; + color: #666; + line-height: 1.4; +} + +.hesabix-freight-option.active .hesabix-freight-title { + color: #0073aa; +} + +.hesabix-freight-option.active .hesabix-freight-desc { + color: #0369a1; +} + + +.hesabix-freight-option[data-value="disabled"] .hesabix-freight-icon { + background: #dc2626; + color: #fff; +} + +.hesabix-freight-option[data-value="disabled"].active .hesabix-freight-title { + color: #dc2626; +} + +.hesabix-freight-option[data-value="disabled"].active .hesabix-freight-desc { + color: #b91c1c; +} + +.hesabix-freight-option[data-value="disabled"].active { + border-color: #dc2626; + background: #fef2f2; +} + + +.hesabix-freight-option[data-value="0"] .hesabix-freight-icon { + background: #16a34a; + color: #fff; +} + +.hesabix-freight-option[data-value="0"].active .hesabix-freight-title { + color: #16a34a; +} + +.hesabix-freight-option[data-value="0"].active .hesabix-freight-desc { + color: #15803d; +} + +.hesabix-freight-option[data-value="0"].active { + border-color: #16a34a; + background: #f0fdf4; +} + + +.hesabix-freight-option[data-value="1"] .hesabix-freight-icon { + background: #eab308; + color: #fff; +} + +.hesabix-freight-option[data-value="1"].active .hesabix-freight-title { + color: #eab308; +} + +.hesabix-freight-option[data-value="1"].active .hesabix-freight-desc { + color: #ca8a04; +} + +.hesabix-freight-option[data-value="1"].active { + border-color: #eab308; + background: #fefce8; +} + + +@media (max-width: 768px) { + .hesabix-freight-options { + grid-template-columns: 1fr; + } + + .hesabix-freight-option { + padding: 14px; + } + + .hesabix-freight-option-content { + gap: 10px; + } + + .hesabix-card-header { + flex-direction: column !important; + align-items: flex-start !important; + gap: 10px !important; + } + + .hesabix-card-header .hesabix-card-subtitle { + font-size: 0.8rem !important; + } + + .hesabix-alert { + display: block !important; + } + + .hesabix-card form table th { + width: 100% !important; + } + + .form-table td fieldset label { + display: flex !important; + flex-direction: column !important; + gap: 10px !important; + } + + .hesabix-form-actions { + display: flex !important; + flex-direction: column !important; + gap: 10px !important; + align-items: flex-start !important; + } +} + +ul { + list-style: disc; +} + +@media screen and (min-width: 992px) { + .hesabix-alert ul { + margin-right: 45px; + } +} + + +.custom-api-address-field { + display: none; +} + +.custom-api-address-field.show { + display: table-row; +} + + +.hesabix-api-error-container { + text-align: center; + padding: 40px 20px; + background: #fff; + border-radius: 10px; + box-shadow: 0 4px 20px rgba(102, 126, 234, 0.1); + margin: 20px 0; + border: 1px solid #e9ecef; + max-width: 500px; + margin-left: auto; + margin-right: auto; +} + +.hesabix-api-error-container .hesabix-error-icon { + margin-bottom: 20px; + display: flex; + justify-content: center; +} + +.hesabix-api-error-container .hesabix-error-icon svg { + width: 64px; + height: 64px; + color: #dc3545; + opacity: 0.8; +} + +.hesabix-api-error-container h3 { + color: #dc3545; + margin-bottom: 15px; + font-size: 18px; + font-weight: 600; + margin-top: 0; +} + +.hesabix-api-error-container p { + color: #6c757d; + margin-bottom: 25px; + font-size: 14px; + line-height: 1.6; + margin-top: 0; +} + +.hesabix-api-error-container .hesabix-error-actions { + margin-top: 25px; +} + +.hesabix-api-error-container .hesabix-btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 12px 24px; + border-radius: 8px; + text-decoration: none; + font-weight: 600; + transition: all 0.3s ease; + border: none; + cursor: pointer; + font-size: 0.95rem; + text-align: center; + justify-content: center; + min-width: 120px; + background: #667eea; + color: white; +} + +.hesabix-api-error-container .hesabix-btn:hover { + background: #5a6fd8; + color: white; + transform: translateY(-2px); + text-decoration: none; +} + +.hesabix-api-error-container .hesabix-btn svg { + width: 16px; + height: 16px; + fill: currentColor; +} + +@media (max-width: 768px) { + .hesabix-api-error-container { + padding: 30px 15px; + margin: 15px 10px; + } + + .hesabix-api-error-container .hesabix-error-icon svg { + width: 48px; + height: 48px; + } + + .hesabix-api-error-container h3 { + font-size: 16px; + } + + .hesabix-api-error-container p { + font-size: 13px; + } +} + + +.hesabix-radio-text { + flex: 1; + font-size: 0.95rem; + color: #495057; + line-height: 1.4; +} + +.hesabix-radio input[type="radio"] { + display: none; +} + + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + + +.hesabix-table-container.disabled-fields { + opacity: 0.6; + pointer-events: none; +} + +.hesabix-table-container.disabled-fields input[type="checkbox"], +.hesabix-table-container.disabled-fields input[type="text"] { + opacity: 0.5; + cursor: not-allowed; +} + +.hesabix-table-container.disabled-fields .hesabix-switch { + opacity: 0.5; + cursor: not-allowed; +} + +table tr:last-child td { + border-bottom: none; +} + +#footer-left { + display: flex; + justify-content: center; + align-items: center; + gap: 2px; +} + +#footer-left .signature-button { + margin-right: 10px; +} + +.hesabix-date-input-jalali { + font-family: 'Tahoma', 'Arial', sans-serif; + font-size: 14px; + padding: 8px 12px; + border: 1px solid #d1d5db; + border-radius: 6px; + background-color: #ffffff; + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} + +.hesabix-date-input-jalali:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); +} + +.hesabix-date-input-jalali.error { + border-color: #dc2626; + box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1); +} + +.hesabix-date-input-jalali::placeholder { + color: #9ca3af; + font-size: 13px; +} + +.hesabix-date-field { + display: flex; + flex-direction: column; + gap: 4px; +} + +.hesabix-date-label { + font-weight: 500; + color: #374151; + font-size: 14px; +} + +.hesabix-date-range-wrapper { + display: flex; + align-items: flex-end; + gap: 12px; + flex-wrap: wrap; +} + +.hesabix-date-arrow { + display: flex; + align-items: center; + color: #6b7280; + margin-bottom: 4px; +} + +@media (max-width: 768px) { + .hesabix-date-range-wrapper { + flex-direction: column; + align-items: stretch; + gap: 8px; + } + + .hesabix-date-arrow { + display: none; + } + + .hesabix-date-input-jalali { + width: 100%; + } +} + +.hesabix-date-field input { + padding: 10px 12px !important; +} \ No newline at end of file diff --git a/admin/fonts/eot/IRANYekanWebBlack.eot b/assets/fonts/eot/IRANYekanWebBlack.eot similarity index 100% rename from admin/fonts/eot/IRANYekanWebBlack.eot rename to assets/fonts/eot/IRANYekanWebBlack.eot diff --git a/admin/fonts/eot/IRANYekanWebBold.eot b/assets/fonts/eot/IRANYekanWebBold.eot similarity index 100% rename from admin/fonts/eot/IRANYekanWebBold.eot rename to assets/fonts/eot/IRANYekanWebBold.eot diff --git a/admin/fonts/eot/IRANYekanWebExtraBlack.eot b/assets/fonts/eot/IRANYekanWebExtraBlack.eot similarity index 100% rename from admin/fonts/eot/IRANYekanWebExtraBlack.eot rename to assets/fonts/eot/IRANYekanWebExtraBlack.eot diff --git a/admin/fonts/eot/IRANYekanWebExtraBold.eot b/assets/fonts/eot/IRANYekanWebExtraBold.eot similarity index 100% rename from admin/fonts/eot/IRANYekanWebExtraBold.eot rename to assets/fonts/eot/IRANYekanWebExtraBold.eot diff --git a/admin/fonts/eot/IRANYekanWebLight.eot b/assets/fonts/eot/IRANYekanWebLight.eot similarity index 100% rename from admin/fonts/eot/IRANYekanWebLight.eot rename to assets/fonts/eot/IRANYekanWebLight.eot diff --git a/admin/fonts/eot/IRANYekanWebMedium.eot b/assets/fonts/eot/IRANYekanWebMedium.eot similarity index 100% rename from admin/fonts/eot/IRANYekanWebMedium.eot rename to assets/fonts/eot/IRANYekanWebMedium.eot diff --git a/admin/fonts/eot/IRANYekanWebRegular.eot b/assets/fonts/eot/IRANYekanWebRegular.eot similarity index 100% rename from admin/fonts/eot/IRANYekanWebRegular.eot rename to assets/fonts/eot/IRANYekanWebRegular.eot diff --git a/admin/fonts/eot/IRANYekanWebThin.eot b/assets/fonts/eot/IRANYekanWebThin.eot similarity index 100% rename from admin/fonts/eot/IRANYekanWebThin.eot rename to assets/fonts/eot/IRANYekanWebThin.eot diff --git a/admin/fonts/svg/IRANYekanWebRegular.svg b/assets/fonts/svg/IRANYekanWebRegular.svg similarity index 99% rename from admin/fonts/svg/IRANYekanWebRegular.svg rename to assets/fonts/svg/IRANYekanWebRegular.svg index e0997ef..b92610d 100644 --- a/admin/fonts/svg/IRANYekanWebRegular.svg +++ b/assets/fonts/svg/IRANYekanWebRegular.svg @@ -1,1548 +1,1548 @@ - - - - -Created by FontForge 20170924 at Wed Sep 16 22:18:33 2020 - By www-data -Copyright (c) 2019 by www.fontiran.com (Moslem Ebrahimi). All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Created by FontForge 20170924 at Wed Sep 16 22:18:33 2020 + By www-data +Copyright (c) 2019 by www.fontiran.com (Moslem Ebrahimi). All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/fonts/svg/iranyekanwebblack.svg b/assets/fonts/svg/iranyekanwebblack.svg similarity index 99% rename from admin/fonts/svg/iranyekanwebblack.svg rename to assets/fonts/svg/iranyekanwebblack.svg index 7852c95..878552d 100644 --- a/admin/fonts/svg/iranyekanwebblack.svg +++ b/assets/fonts/svg/iranyekanwebblack.svg @@ -1,1474 +1,1474 @@ - - - - -Created by FontForge 20161003 at Sun Dec 16 22:19:23 2018 - By www-data -Copyright (c) 2019 by fontiran.com. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Created by FontForge 20161003 at Sun Dec 16 22:19:23 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/fonts/svg/iranyekanwebbold.svg b/assets/fonts/svg/iranyekanwebbold.svg similarity index 99% rename from admin/fonts/svg/iranyekanwebbold.svg rename to assets/fonts/svg/iranyekanwebbold.svg index 6a6006b..88b7867 100644 --- a/admin/fonts/svg/iranyekanwebbold.svg +++ b/assets/fonts/svg/iranyekanwebbold.svg @@ -1,1569 +1,1569 @@ - - - - -Created by FontForge 20161003 at Sun Dec 16 22:19:37 2018 - By www-data -Copyright (c) 2019 by fontiran.com. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Created by FontForge 20161003 at Sun Dec 16 22:19:37 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/fonts/svg/iranyekanwebextrablack.svg b/assets/fonts/svg/iranyekanwebextrablack.svg similarity index 99% rename from admin/fonts/svg/iranyekanwebextrablack.svg rename to assets/fonts/svg/iranyekanwebextrablack.svg index 815b866..01c9d7d 100644 --- a/admin/fonts/svg/iranyekanwebextrablack.svg +++ b/assets/fonts/svg/iranyekanwebextrablack.svg @@ -1,1486 +1,1486 @@ - - - - -Created by FontForge 20161003 at Sun Dec 16 22:19:45 2018 - By www-data -Copyright (c) 2019 by fontiran.com. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Created by FontForge 20161003 at Sun Dec 16 22:19:45 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/fonts/svg/iranyekanwebextrabold.svg b/assets/fonts/svg/iranyekanwebextrabold.svg similarity index 99% rename from admin/fonts/svg/iranyekanwebextrabold.svg rename to assets/fonts/svg/iranyekanwebextrabold.svg index 21e8a53..1dcb7ea 100644 --- a/admin/fonts/svg/iranyekanwebextrabold.svg +++ b/assets/fonts/svg/iranyekanwebextrabold.svg @@ -1,1472 +1,1472 @@ - - - - -Created by FontForge 20161003 at Sun Dec 16 22:19:55 2018 - By www-data -Copyright (c) 2018 by fontiran.com. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Created by FontForge 20161003 at Sun Dec 16 22:19:55 2018 + By www-data +Copyright (c) 2018 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/fonts/svg/iranyekanweblight.svg b/assets/fonts/svg/iranyekanweblight.svg similarity index 99% rename from admin/fonts/svg/iranyekanweblight.svg rename to assets/fonts/svg/iranyekanweblight.svg index da89c03..9c0c619 100644 --- a/admin/fonts/svg/iranyekanweblight.svg +++ b/assets/fonts/svg/iranyekanweblight.svg @@ -1,1619 +1,1619 @@ - - - - -Created by FontForge 20161003 at Sun Dec 16 22:20:09 2018 - By www-data -Copyright (c) 2019 by fontiran.com. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Created by FontForge 20161003 at Sun Dec 16 22:20:09 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/fonts/svg/iranyekanwebmedium.svg b/assets/fonts/svg/iranyekanwebmedium.svg similarity index 99% rename from admin/fonts/svg/iranyekanwebmedium.svg rename to assets/fonts/svg/iranyekanwebmedium.svg index 3e2ce2c..e7fd092 100644 --- a/admin/fonts/svg/iranyekanwebmedium.svg +++ b/assets/fonts/svg/iranyekanwebmedium.svg @@ -1,1573 +1,1573 @@ - - - - -Created by FontForge 20161003 at Sun Dec 16 22:20:19 2018 - By www-data -Copyright (c) 2019 by fontiran.com. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Created by FontForge 20161003 at Sun Dec 16 22:20:19 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/fonts/svg/iranyekanwebthin.svg b/assets/fonts/svg/iranyekanwebthin.svg similarity index 99% rename from admin/fonts/svg/iranyekanwebthin.svg rename to assets/fonts/svg/iranyekanwebthin.svg index 2cd7c74..f83cc44 100644 --- a/admin/fonts/svg/iranyekanwebthin.svg +++ b/assets/fonts/svg/iranyekanwebthin.svg @@ -1,1639 +1,1639 @@ - - - - -Created by FontForge 20161003 at Sun Dec 16 22:20:45 2018 - By www-data -Copyright (c) 2019 by fontiran.com. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + +Created by FontForge 20161003 at Sun Dec 16 22:20:45 2018 + By www-data +Copyright (c) 2019 by fontiran.com. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/fonts/ttf/IRANYekanWebBlack.ttf b/assets/fonts/ttf/IRANYekanWebBlack.ttf similarity index 100% rename from admin/fonts/ttf/IRANYekanWebBlack.ttf rename to assets/fonts/ttf/IRANYekanWebBlack.ttf diff --git a/admin/fonts/ttf/IRANYekanWebBold.ttf b/assets/fonts/ttf/IRANYekanWebBold.ttf similarity index 100% rename from admin/fonts/ttf/IRANYekanWebBold.ttf rename to assets/fonts/ttf/IRANYekanWebBold.ttf diff --git a/admin/fonts/ttf/IRANYekanWebExtraBlack.ttf b/assets/fonts/ttf/IRANYekanWebExtraBlack.ttf similarity index 100% rename from admin/fonts/ttf/IRANYekanWebExtraBlack.ttf rename to assets/fonts/ttf/IRANYekanWebExtraBlack.ttf diff --git a/admin/fonts/ttf/IRANYekanWebExtraBold.ttf b/assets/fonts/ttf/IRANYekanWebExtraBold.ttf similarity index 100% rename from admin/fonts/ttf/IRANYekanWebExtraBold.ttf rename to assets/fonts/ttf/IRANYekanWebExtraBold.ttf diff --git a/admin/fonts/ttf/IRANYekanWebLight.ttf b/assets/fonts/ttf/IRANYekanWebLight.ttf similarity index 100% rename from admin/fonts/ttf/IRANYekanWebLight.ttf rename to assets/fonts/ttf/IRANYekanWebLight.ttf diff --git a/admin/fonts/ttf/IRANYekanWebMedium.ttf b/assets/fonts/ttf/IRANYekanWebMedium.ttf similarity index 100% rename from admin/fonts/ttf/IRANYekanWebMedium.ttf rename to assets/fonts/ttf/IRANYekanWebMedium.ttf diff --git a/admin/fonts/ttf/IRANYekanWebRegular.ttf b/assets/fonts/ttf/IRANYekanWebRegular.ttf similarity index 100% rename from admin/fonts/ttf/IRANYekanWebRegular.ttf rename to assets/fonts/ttf/IRANYekanWebRegular.ttf diff --git a/admin/fonts/ttf/IRANYekanWebThin.ttf b/assets/fonts/ttf/IRANYekanWebThin.ttf similarity index 100% rename from admin/fonts/ttf/IRANYekanWebThin.ttf rename to assets/fonts/ttf/IRANYekanWebThin.ttf diff --git a/admin/fonts/woff/IRANYekanWebBlack.woff b/assets/fonts/woff/IRANYekanWebBlack.woff similarity index 100% rename from admin/fonts/woff/IRANYekanWebBlack.woff rename to assets/fonts/woff/IRANYekanWebBlack.woff diff --git a/admin/fonts/woff/IRANYekanWebBold.woff b/assets/fonts/woff/IRANYekanWebBold.woff similarity index 100% rename from admin/fonts/woff/IRANYekanWebBold.woff rename to assets/fonts/woff/IRANYekanWebBold.woff diff --git a/admin/fonts/woff/IRANYekanWebExtraBlack.woff b/assets/fonts/woff/IRANYekanWebExtraBlack.woff similarity index 100% rename from admin/fonts/woff/IRANYekanWebExtraBlack.woff rename to assets/fonts/woff/IRANYekanWebExtraBlack.woff diff --git a/admin/fonts/woff/IRANYekanWebExtraBold.woff b/assets/fonts/woff/IRANYekanWebExtraBold.woff similarity index 100% rename from admin/fonts/woff/IRANYekanWebExtraBold.woff rename to assets/fonts/woff/IRANYekanWebExtraBold.woff diff --git a/admin/fonts/woff/IRANYekanWebLight.woff b/assets/fonts/woff/IRANYekanWebLight.woff similarity index 100% rename from admin/fonts/woff/IRANYekanWebLight.woff rename to assets/fonts/woff/IRANYekanWebLight.woff diff --git a/admin/fonts/woff/IRANYekanWebMedium.woff b/assets/fonts/woff/IRANYekanWebMedium.woff similarity index 100% rename from admin/fonts/woff/IRANYekanWebMedium.woff rename to assets/fonts/woff/IRANYekanWebMedium.woff diff --git a/admin/fonts/woff/IRANYekanWebRegular.woff b/assets/fonts/woff/IRANYekanWebRegular.woff similarity index 100% rename from admin/fonts/woff/IRANYekanWebRegular.woff rename to assets/fonts/woff/IRANYekanWebRegular.woff diff --git a/admin/fonts/woff/IRANYekanWebThin.woff b/assets/fonts/woff/IRANYekanWebThin.woff similarity index 100% rename from admin/fonts/woff/IRANYekanWebThin.woff rename to assets/fonts/woff/IRANYekanWebThin.woff diff --git a/admin/fonts/woff2/IRANYekanWebBlack.woff2 b/assets/fonts/woff2/IRANYekanWebBlack.woff2 similarity index 100% rename from admin/fonts/woff2/IRANYekanWebBlack.woff2 rename to assets/fonts/woff2/IRANYekanWebBlack.woff2 diff --git a/admin/fonts/woff2/IRANYekanWebBold.woff2 b/assets/fonts/woff2/IRANYekanWebBold.woff2 similarity index 100% rename from admin/fonts/woff2/IRANYekanWebBold.woff2 rename to assets/fonts/woff2/IRANYekanWebBold.woff2 diff --git a/admin/fonts/woff2/IRANYekanWebExtraBlack.woff2 b/assets/fonts/woff2/IRANYekanWebExtraBlack.woff2 similarity index 100% rename from admin/fonts/woff2/IRANYekanWebExtraBlack.woff2 rename to assets/fonts/woff2/IRANYekanWebExtraBlack.woff2 diff --git a/admin/fonts/woff2/IRANYekanWebExtraBold.woff2 b/assets/fonts/woff2/IRANYekanWebExtraBold.woff2 similarity index 100% rename from admin/fonts/woff2/IRANYekanWebExtraBold.woff2 rename to assets/fonts/woff2/IRANYekanWebExtraBold.woff2 diff --git a/admin/fonts/woff2/IRANYekanWebLight.woff2 b/assets/fonts/woff2/IRANYekanWebLight.woff2 similarity index 100% rename from admin/fonts/woff2/IRANYekanWebLight.woff2 rename to assets/fonts/woff2/IRANYekanWebLight.woff2 diff --git a/admin/fonts/woff2/IRANYekanWebMedium.woff2 b/assets/fonts/woff2/IRANYekanWebMedium.woff2 similarity index 100% rename from admin/fonts/woff2/IRANYekanWebMedium.woff2 rename to assets/fonts/woff2/IRANYekanWebMedium.woff2 diff --git a/admin/fonts/woff2/IRANYekanWebRegular.woff2 b/assets/fonts/woff2/IRANYekanWebRegular.woff2 similarity index 100% rename from admin/fonts/woff2/IRANYekanWebRegular.woff2 rename to assets/fonts/woff2/IRANYekanWebRegular.woff2 diff --git a/admin/fonts/woff2/IRANYekanWebThin.woff2 b/assets/fonts/woff2/IRANYekanWebThin.woff2 similarity index 100% rename from admin/fonts/woff2/IRANYekanWebThin.woff2 rename to assets/fonts/woff2/IRANYekanWebThin.woff2 diff --git a/assets/img/heart.gif b/assets/img/heart.gif new file mode 100644 index 0000000000000000000000000000000000000000..d379e57043ea36a02a8b5b79aecc81bbe90ebfc0 GIT binary patch literal 476496 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,vy7_bU02Upjr1KFtt4 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

UVU8xHPXMFSfaw3!x3Ms~ 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 Hu0mjfd1+&J literal 0 HcmV?d00001 diff --git a/admin/img/icons/box-open.svg b/assets/img/icons/box-open.svg similarity index 100% rename from admin/img/icons/box-open.svg rename to assets/img/icons/box-open.svg diff --git a/admin/img/icons/cog.svg b/assets/img/icons/cog.svg similarity index 100% rename from admin/img/icons/cog.svg rename to assets/img/icons/cog.svg diff --git a/admin/img/icons/file-alt.svg b/assets/img/icons/file-alt.svg similarity index 100% rename from admin/img/icons/file-alt.svg rename to assets/img/icons/file-alt.svg diff --git a/admin/img/icons/file-export.svg b/assets/img/icons/file-export.svg similarity index 100% rename from admin/img/icons/file-export.svg rename to assets/img/icons/file-export.svg diff --git a/admin/img/icons/file-invoice-dollar.svg b/assets/img/icons/file-invoice-dollar.svg similarity index 100% rename from admin/img/icons/file-invoice-dollar.svg rename to assets/img/icons/file-invoice-dollar.svg diff --git a/admin/img/icons/home.svg b/assets/img/icons/home.svg similarity index 100% rename from admin/img/icons/home.svg rename to assets/img/icons/home.svg diff --git a/admin/img/icons/money-check-alt.svg b/assets/img/icons/money-check-alt.svg similarity index 100% rename from admin/img/icons/money-check-alt.svg rename to assets/img/icons/money-check-alt.svg diff --git a/admin/img/icons/sync-alt.svg b/assets/img/icons/sync-alt.svg similarity index 100% rename from admin/img/icons/sync-alt.svg rename to assets/img/icons/sync-alt.svg diff --git a/admin/img/icons/users.svg b/assets/img/icons/users.svg similarity index 100% rename from admin/img/icons/users.svg rename to assets/img/icons/users.svg diff --git a/admin/img/logo.png b/assets/img/logo.png similarity index 100% rename from admin/img/logo.png rename to assets/img/logo.png diff --git a/admin/img/menu-icon.png b/assets/img/menu-icon.png similarity index 100% rename from admin/img/menu-icon.png rename to assets/img/menu-icon.png diff --git a/admin/js/bootstrap.bundle.min.js b/assets/js/bootstrap.bundle.min.js similarity index 99% rename from admin/js/bootstrap.bundle.min.js rename to assets/js/bootstrap.bundle.min.js index 637329a..c682e1b 100644 --- a/admin/js/bootstrap.bundle.min.js +++ b/assets/js/bootstrap.bundle.min.js @@ -1,7 +1,7 @@ -/*! - * Bootstrap v5.0.0-beta2 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";function t(t,e){for(var n=0;n0,i._pointerEvent=Boolean(window.PointerEvent),i._addEventListeners(),i}i(o,t);var r=o.prototype;return r.next=function(){this._isSliding||this._slide("next")},r.nextWhenVisible=function(){!document.hidden&&g(this._element)&&this.next()},r.prev=function(){this._isSliding||this._slide("prev")},r.pause=function(t){t||(this._isPaused=!0),Y(".carousel-item-next, .carousel-item-prev",this._element)&&(f(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},r.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},r.to=function(t){var e=this;this._activeElement=Y(".active.carousel-item",this._element);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)B.one(this._element,"slid.bs.carousel",(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?"next":"prev";this._slide(i,this._items[t])}},r.dispose=function(){t.prototype.dispose.call(this),B.off(this._element,".bs.carousel"),this._items=null,this._config=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},r._getConfig=function(t){return t=n({},X,t),p("carousel",t,Q),t},r._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&(b?this.next():this.prev()),e<0&&(b?this.prev():this.next())}},r._addEventListeners=function(){var t=this;this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",(function(e){return t.pause(e)})),B.on(this._element,"mouseleave.bs.carousel",(function(e){return t.cycle(e)}))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()},r._addTouchEventListeners=function(){var t=this,e=function(e){!t._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType?t._pointerEvent||(t.touchStartX=e.touches[0].clientX):t.touchStartX=e.clientX},n=function(e){!t._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType||(t.touchDeltaX=e.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};F(".carousel-item img",this._element).forEach((function(t){B.on(t,"dragstart.bs.carousel",(function(t){return t.preventDefault()}))})),this._pointerEvent?(B.on(this._element,"pointerdown.bs.carousel",(function(t){return e(t)})),B.on(this._element,"pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.carousel",(function(t){return e(t)})),B.on(this._element,"touchmove.bs.carousel",(function(e){return function(e){e.touches&&e.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.touches[0].clientX-t.touchStartX}(e)})),B.on(this._element,"touchend.bs.carousel",(function(t){return n(t)})))},r._keydown=function(t){/input|textarea/i.test(t.target.tagName)||("ArrowLeft"===t.key?(t.preventDefault(),b?this.next():this.prev()):"ArrowRight"===t.key&&(t.preventDefault(),b?this.prev():this.next()))},r._getItemIndex=function(t){return this._items=t&&t.parentNode?F(".carousel-item",t.parentNode):[],this._items.indexOf(t)},r._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+("prev"===t?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},r._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(Y(".active.carousel-item",this._element));return B.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n})},r._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=Y(".active",this._indicatorsElement);e.classList.remove("active"),e.removeAttribute("aria-current");for(var n=F("[data-bs-target]",this._indicatorsElement),i=0;i0)for(var i=0;i=0}function _t(t){return((ut(t)?t.ownerDocument:t.document)||window.document).documentElement}function bt(t){return"html"===lt(t)?t:t.assignedSlot||t.parentNode||t.host||_t(t)}function yt(t){if(!ft(t)||"fixed"===mt(t).position)return null;var e=t.offsetParent;if(e){var n=_t(e);if("body"===lt(e)&&"static"===mt(e).position&&"static"!==mt(n).position)return n}return e}function wt(t){for(var e=ct(t),n=yt(t);n&&vt(n)&&"static"===mt(n).position;)n=yt(n);return n&&"body"===lt(n)&&"static"===mt(n).position?e:n||function(t){for(var e=bt(t);ft(e)&&["html","body"].indexOf(lt(e))<0;){var n=mt(e);if("none"!==n.transform||"none"!==n.perspective||n.willChange&&"auto"!==n.willChange)return e;e=e.parentNode}return null}(t)||e}function Et(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Tt(t,e,n){return Math.max(t,Math.min(e,n))}function kt(t){return Object.assign(Object.assign({},{top:0,right:0,bottom:0,left:0}),t)}function At(t,e){return e.reduce((function(e,n){return e[n]=t,e}),{})}var Lt={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,n=t.state,i=t.name,o=n.elements.arrow,r=n.modifiersData.popperOffsets,s=ht(n.placement),a=Et(s),l=[it,nt].indexOf(s)>=0?"height":"width";if(o&&r){var c=n.modifiersData[i+"#persistent"].padding,u=pt(o),f="y"===a?tt:it,d="y"===a?et:nt,h=n.rects.reference[l]+n.rects.reference[a]-r[a]-n.rects.popper[l],p=r[a]-n.rects.reference[a],g=wt(o),m=g?"y"===a?g.clientHeight||0:g.clientWidth||0:0,v=h/2-p/2,_=c[f],b=m-u[l]-c[d],y=m/2-u[l]/2+v,w=Tt(_,y,b),E=a;n.modifiersData[i]=((e={})[E]=w,e.centerOffset=w-y,e)}},effect:function(t){var e=t.state,n=t.options,i=t.name,o=n.element,r=void 0===o?"[data-popper-arrow]":o,s=n.padding,a=void 0===s?0:s;null!=r&&("string"!=typeof r||(r=e.elements.popper.querySelector(r)))&>(e.elements.popper,r)&&(e.elements.arrow=r,e.modifiersData[i+"#persistent"]={padding:kt("number"!=typeof a?a:At(a,ot))})},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},Ot={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Dt(t){var e,n=t.popper,i=t.popperRect,o=t.placement,r=t.offsets,s=t.position,a=t.gpuAcceleration,l=t.adaptive,c=t.roundOffsets?function(t){var e=t.x,n=t.y,i=window.devicePixelRatio||1;return{x:Math.round(e*i)/i||0,y:Math.round(n*i)/i||0}}(r):r,u=c.x,f=void 0===u?0:u,d=c.y,h=void 0===d?0:d,p=r.hasOwnProperty("x"),g=r.hasOwnProperty("y"),m=it,v=tt,_=window;if(l){var b=wt(n);b===ct(n)&&(b=_t(n)),o===tt&&(v=et,h-=b.clientHeight-i.height,h*=a?1:-1),o===it&&(m=nt,f-=b.clientWidth-i.width,f*=a?1:-1)}var y,w=Object.assign({position:s},l&&Ot);return a?Object.assign(Object.assign({},w),{},((y={})[v]=g?"0":"",y[m]=p?"0":"",y.transform=(_.devicePixelRatio||1)<2?"translate("+f+"px, "+h+"px)":"translate3d("+f+"px, "+h+"px, 0)",y)):Object.assign(Object.assign({},w),{},((e={})[v]=g?h+"px":"",e[m]=p?f+"px":"",e.transform="",e))}var xt={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,n=t.options,i=n.gpuAcceleration,o=void 0===i||i,r=n.adaptive,s=void 0===r||r,a=n.roundOffsets,l=void 0===a||a,c={placement:ht(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign(Object.assign({},e.styles.popper),Dt(Object.assign(Object.assign({},c),{},{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign(Object.assign({},e.styles.arrow),Dt(Object.assign(Object.assign({},c),{},{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{},{"data-popper-placement":e.placement})},data:{}},Ct={passive:!0},St={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,n=t.instance,i=t.options,o=i.scroll,r=void 0===o||o,s=i.resize,a=void 0===s||s,l=ct(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return r&&c.forEach((function(t){t.addEventListener("scroll",n.update,Ct)})),a&&l.addEventListener("resize",n.update,Ct),function(){r&&c.forEach((function(t){t.removeEventListener("scroll",n.update,Ct)})),a&&l.removeEventListener("resize",n.update,Ct)}},data:{}},jt={left:"right",right:"left",bottom:"top",top:"bottom"};function Nt(t){return t.replace(/left|right|bottom|top/g,(function(t){return jt[t]}))}var Pt={start:"end",end:"start"};function It(t){return t.replace(/start|end/g,(function(t){return Pt[t]}))}function Mt(t){var e=t.getBoundingClientRect();return{width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function Bt(t){var e=ct(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ht(t){return Mt(_t(t)).left+Bt(t).scrollLeft}function Rt(t){var e=mt(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+i)}function Wt(t,e){void 0===e&&(e=[]);var n=function t(e){return["html","body","#document"].indexOf(lt(e))>=0?e.ownerDocument.body:ft(e)&&Rt(e)?e:t(bt(e))}(t),i="body"===lt(n),o=ct(n),r=i?[o].concat(o.visualViewport||[],Rt(n)?n:[]):n,s=e.concat(r);return i?s:s.concat(Wt(bt(r)))}function Kt(t){return Object.assign(Object.assign({},t),{},{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Ut(t,e){return"viewport"===e?Kt(function(t){var e=ct(t),n=_t(t),i=e.visualViewport,o=n.clientWidth,r=n.clientHeight,s=0,a=0;return i&&(o=i.width,r=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=i.offsetLeft,a=i.offsetTop)),{width:o,height:r,x:s+Ht(t),y:a}}(t)):ft(e)?function(t){var e=Mt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Kt(function(t){var e=_t(t),n=Bt(t),i=t.ownerDocument.body,o=Math.max(e.scrollWidth,e.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),r=Math.max(e.scrollHeight,e.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),s=-n.scrollLeft+Ht(t),a=-n.scrollTop;return"rtl"===mt(i||e).direction&&(s+=Math.max(e.clientWidth,i?i.clientWidth:0)-o),{width:o,height:r,x:s,y:a}}(_t(t)))}function zt(t){return t.split("-")[1]}function Ft(t){var e,n=t.reference,i=t.element,o=t.placement,r=o?ht(o):null,s=o?zt(o):null,a=n.x+n.width/2-i.width/2,l=n.y+n.height/2-i.height/2;switch(r){case tt:e={x:a,y:n.y-i.height};break;case et:e={x:a,y:n.y+n.height};break;case nt:e={x:n.x+n.width,y:l};break;case it:e={x:n.x-i.width,y:l};break;default:e={x:n.x,y:n.y}}var c=r?Et(r):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case"start":e[c]=e[c]-(n[u]/2-i[u]/2);break;case"end":e[c]=e[c]+(n[u]/2-i[u]/2)}}return e}function Yt(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=void 0===i?t.placement:i,r=n.boundary,s=void 0===r?"clippingParents":r,a=n.rootBoundary,l=void 0===a?"viewport":a,c=n.elementContext,u=void 0===c?"popper":c,f=n.altBoundary,d=void 0!==f&&f,h=n.padding,p=void 0===h?0:h,g=kt("number"!=typeof p?p:At(p,ot)),m="popper"===u?"reference":"popper",v=t.elements.reference,_=t.rects.popper,b=t.elements[d?m:u],y=function(t,e,n){var i="clippingParents"===e?function(t){var e=Wt(bt(t)),n=["absolute","fixed"].indexOf(mt(t).position)>=0&&ft(t)?wt(t):t;return ut(n)?e.filter((function(t){return ut(t)&>(t,n)&&"body"!==lt(t)})):[]}(t):[].concat(e),o=[].concat(i,[n]),r=o[0],s=o.reduce((function(e,n){var i=Ut(t,n);return e.top=Math.max(i.top,e.top),e.right=Math.min(i.right,e.right),e.bottom=Math.min(i.bottom,e.bottom),e.left=Math.max(i.left,e.left),e}),Ut(t,r));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(ut(b)?b:b.contextElement||_t(t.elements.popper),s,l),w=Mt(v),E=Ft({reference:w,element:_,strategy:"absolute",placement:o}),T=Kt(Object.assign(Object.assign({},_),E)),k="popper"===u?T:w,A={top:y.top-k.top+g.top,bottom:k.bottom-y.bottom+g.bottom,left:y.left-k.left+g.left,right:k.right-y.right+g.right},L=t.modifiersData.offset;if("popper"===u&&L){var O=L[o];Object.keys(A).forEach((function(t){var e=[nt,et].indexOf(t)>=0?1:-1,n=[tt,et].indexOf(t)>=0?"y":"x";A[t]+=O[n]*e}))}return A}function qt(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=n.boundary,r=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?st:l,u=zt(i),f=u?a?rt:rt.filter((function(t){return zt(t)===u})):ot,d=f.filter((function(t){return c.indexOf(t)>=0}));0===d.length&&(d=f);var h=d.reduce((function(e,n){return e[n]=Yt(t,{placement:n,boundary:o,rootBoundary:r,padding:s})[ht(n)],e}),{});return Object.keys(h).sort((function(t,e){return h[t]-h[e]}))}var Vt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name;if(!e.modifiersData[i]._skip){for(var o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,f=n.rootBoundary,d=n.altBoundary,h=n.flipVariations,p=void 0===h||h,g=n.allowedAutoPlacements,m=e.options.placement,v=ht(m),_=l||(v!==m&&p?function(t){if("auto"===ht(t))return[];var e=Nt(t);return[It(t),e,It(e)]}(m):[Nt(m)]),b=[m].concat(_).reduce((function(t,n){return t.concat("auto"===ht(n)?qt(e,{placement:n,boundary:u,rootBoundary:f,padding:c,flipVariations:p,allowedAutoPlacements:g}):n)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,T=!0,k=b[0],A=0;A=0,C=x?"width":"height",S=Yt(e,{placement:L,boundary:u,rootBoundary:f,altBoundary:d,padding:c}),j=x?D?nt:it:D?et:tt;y[C]>w[C]&&(j=Nt(j));var N=Nt(j),P=[];if(r&&P.push(S[O]<=0),a&&P.push(S[j]<=0,S[N]<=0),P.every((function(t){return t}))){k=L,T=!1;break}E.set(L,P)}if(T)for(var I=function(t){var e=b.find((function(e){var n=E.get(e);if(n)return n.slice(0,t).every((function(t){return t}))}));if(e)return k=e,"break"},M=p?3:1;M>0&&"break"!==I(M);M--);e.placement!==k&&(e.modifiersData[i]._skip=!0,e.placement=k,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Xt(t,e,n){return void 0===n&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function Qt(t){return[tt,nt,et,it].some((function(e){return t[e]>=0}))}var $t={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,n=t.name,i=e.rects.reference,o=e.rects.popper,r=e.modifiersData.preventOverflow,s=Yt(e,{elementContext:"reference"}),a=Yt(e,{altBoundary:!0}),l=Xt(s,i),c=Xt(a,o,r),u=Qt(l),f=Qt(c);e.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:f},e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{},{"data-popper-reference-hidden":u,"data-popper-escaped":f})}},Gt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.offset,r=void 0===o?[0,0]:o,s=st.reduce((function(t,n){return t[n]=function(t,e,n){var i=ht(t),o=[it,tt].indexOf(i)>=0?-1:1,r="function"==typeof n?n(Object.assign(Object.assign({},e),{},{placement:t})):n,s=r[0],a=r[1];return s=s||0,a=(a||0)*o,[it,nt].indexOf(i)>=0?{x:a,y:s}:{x:s,y:a}}(n,e.rects,r),t}),{}),a=s[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[i]=s}},Zt={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,n=t.name;e.modifiersData[n]=Ft({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Jt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,f=n.padding,d=n.tether,h=void 0===d||d,p=n.tetherOffset,g=void 0===p?0:p,m=Yt(e,{boundary:l,rootBoundary:c,padding:f,altBoundary:u}),v=ht(e.placement),_=zt(e.placement),b=!_,y=Et(v),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,T=e.rects.reference,k=e.rects.popper,A="function"==typeof g?g(Object.assign(Object.assign({},e.rects),{},{placement:e.placement})):g,L={x:0,y:0};if(E){if(r){var O="y"===y?tt:it,D="y"===y?et:nt,x="y"===y?"height":"width",C=E[y],S=E[y]+m[O],j=E[y]-m[D],N=h?-k[x]/2:0,P="start"===_?T[x]:k[x],I="start"===_?-k[x]:-T[x],M=e.elements.arrow,B=h&&M?pt(M):{width:0,height:0},H=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=H[O],W=H[D],K=Tt(0,T[x],B[x]),U=b?T[x]/2-N-K-R-A:P-K-R-A,z=b?-T[x]/2+N+K+W+A:I+K+W+A,F=e.elements.arrow&&wt(e.elements.arrow),Y=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,q=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,V=E[y]+U-q-Y,X=E[y]+z-q,Q=Tt(h?Math.min(S,V):S,C,h?Math.max(j,X):j);E[y]=Q,L[y]=Q-C}if(a){var $="x"===y?tt:it,G="x"===y?et:nt,Z=E[w],J=Tt(Z+m[$],Z,Z-m[G]);E[w]=J,L[w]=J-Z}e.modifiersData[i]=L}},requiresIfExists:["offset"]};function te(t,e,n){void 0===n&&(n=!1);var i,o,r=_t(e),s=Mt(t),a=ft(e),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(a||!a&&!n)&&(("body"!==lt(e)||Rt(r))&&(l=(i=e)!==ct(i)&&ft(i)?{scrollLeft:(o=i).scrollLeft,scrollTop:o.scrollTop}:Bt(i)),ft(e)?((c=Mt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=Ht(r))),{x:s.left+l.scrollLeft-c.x,y:s.top+l.scrollTop-c.y,width:s.width,height:s.height}}var ee={placement:"bottom",modifiers:[],strategy:"absolute"};function ne(){for(var t=arguments.length,e=new Array(t),n=0;n0&&r--,"ArrowDown"===t.key&&rdocument.documentElement.clientHeight;e||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");var n=u(this._dialog);B.off(this._element,"transitionend"),B.one(this._element,"transitionend",(function(){t._element.classList.remove("modal-static"),e||(B.one(t._element,"transitionend",(function(){t._element.style.overflowY=""})),h(t._element,n))})),h(this._element,n),this._element.focus()}},r._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;(!this._isBodyOverflowing&&t&&!b||this._isBodyOverflowing&&!t&&b)&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),(this._isBodyOverflowing&&!t&&!b||!this._isBodyOverflowing&&t&&b)&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},r._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},r._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ce={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Se=function(t){function o(e,n){var i;if(void 0===ae)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");return(i=t.call(this,e)||this)._isEnabled=!0,i._timeout=0,i._hoverState="",i._activeTrigger={},i._popper=null,i.config=i._getConfig(n),i.tip=null,i._setListeners(),i}i(o,t);var r=o.prototype;return r.enable=function(){this._isEnabled=!0},r.disable=function(){this._isEnabled=!1},r.toggleEnabled=function(){this._isEnabled=!this._isEnabled},r.toggle=function(t){if(this._isEnabled)if(t){var e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}},r.dispose=function(){clearTimeout(this._timeout),B.off(this._element,this.constructor.EVENT_KEY),B.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.parentNode&&this.tip.parentNode.removeChild(this.tip),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.config=null,this.tip=null,t.prototype.dispose.call(this)},r.show=function(){var t=this;if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(this.isWithContent()&&this._isEnabled){var e=B.trigger(this._element,this.constructor.Event.SHOW),n=function t(e){if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){var n=e.getRootNode();return n instanceof ShadowRoot?n:null}return e instanceof ShadowRoot?e:e.parentNode?t(e.parentNode):null}(this._element),i=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(!e.defaultPrevented&&i){var o=this.getTipElement(),r=s(this.constructor.NAME);o.setAttribute("id",r),this._element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&o.classList.add("fade");var a="function"==typeof this.config.placement?this.config.placement.call(this,o,this._element):this.config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);var c=this._getContainer();E(o,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||c.appendChild(o),B.trigger(this._element,this.constructor.Event.INSERTED),this._popper=se(this._element,o,this._getPopperConfig(l)),o.classList.add("show");var f,d,p="function"==typeof this.config.customClass?this.config.customClass():this.config.customClass;p&&(f=o.classList).add.apply(f,p.split(" ")),"ontouchstart"in document.documentElement&&(d=[]).concat.apply(d,document.body.children).forEach((function(t){B.on(t,"mouseover",(function(){}))}));var g=function(){var e=t._hoverState;t._hoverState=null,B.trigger(t._element,t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(this.tip.classList.contains("fade")){var m=u(this.tip);B.one(this.tip,"transitionend",g),h(this.tip,m)}else g()}}},r.hide=function(){var t=this;if(this._popper){var e=this.getTipElement(),n=function(){"show"!==t._hoverState&&e.parentNode&&e.parentNode.removeChild(e),t._cleanTipClass(),t._element.removeAttribute("aria-describedby"),B.trigger(t._element,t.constructor.Event.HIDDEN),t._popper&&(t._popper.destroy(),t._popper=null)};if(!B.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented){var i;if(e.classList.remove("show"),"ontouchstart"in document.documentElement&&(i=[]).concat.apply(i,document.body.children).forEach((function(t){return B.off(t,"mouseover",m)})),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this.tip.classList.contains("fade")){var o=u(e);B.one(e,"transitionend",n),h(e,o)}else n();this._hoverState=""}}},r.update=function(){null!==this._popper&&this._popper.update()},r.isWithContent=function(){return Boolean(this.getTitle())},r.getTipElement=function(){if(this.tip)return this.tip;var t=document.createElement("div");return t.innerHTML=this.config.template,this.tip=t.children[0],this.tip},r.setContent=function(){var t=this.getTipElement();this.setElementContent(Y(".tooltip-inner",t),this.getTitle()),t.classList.remove("fade","show")},r.setElementContent=function(t,e){if(null!==t)return"object"==typeof e&&d(e)?(e.jquery&&(e=e[0]),void(this.config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this.config.html?(this.config.sanitize&&(e=ke(e,this.config.allowList,this.config.sanitizeFn)),t.innerHTML=e):t.textContent=e)},r.getTitle=function(){var t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this._element):this.config.title),t},r.updateAttachment=function(t){return"right"===t?"end":"left"===t?"start":t},r._initializeOnDelegatedTarget=function(t,e){var n=this.constructor.DATA_KEY;return(e=e||T(t.delegateTarget,n))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),E(t.delegateTarget,n,e)),e},r._getOffset=function(){var t=this,e=this.config.offset;return"string"==typeof e?e.split(",").map((function(t){return Number.parseInt(t,10)})):"function"==typeof e?function(n){return e(n,t._element)}:e},r._getPopperConfig=function(t){var e=this,i={placement:t,modifiers:[{name:"flip",options:{altBoundary:!0,fallbackPlacements:this.config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this.config.boundary}},{name:"arrow",options:{element:"."+this.constructor.NAME+"-arrow"}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:function(t){return e._handlePopperPlacementChange(t)}}],onFirstUpdate:function(t){t.options.placement!==t.placement&&e._handlePopperPlacementChange(t)}};return n({},i,"function"==typeof this.config.popperConfig?this.config.popperConfig(i):this.config.popperConfig)},r._addAttachmentClass=function(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))},r._getContainer=function(){return!1===this.config.container?document.body:d(this.config.container)?this.config.container:Y(this.config.container)},r._getAttachment=function(t){return De[t.toUpperCase()]},r._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)B.on(t._element,t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;B.on(t._element,n,t.config.selector,(function(e){return t._enter(e)})),B.on(t._element,i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t._element&&t.hide()},B.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=n({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},r._fixTitle=function(){var t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))},r._enter=function(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},r._leave=function(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},r._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},r._getConfig=function(t){var e=z.getDataAttributes(this._element);return Object.keys(e).forEach((function(t){Le.has(t)&&delete e[t]})),t&&"object"==typeof t.container&&t.container.jquery&&(t.container=t.container[0]),"number"==typeof(t=n({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),p("tooltip",t,this.constructor.DefaultType),t.sanitize&&(t.template=ke(t.template,t.allowList,t.sanitizeFn)),t},r._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},r._cleanTipClass=function(){var t=this.getTipElement(),e=t.getAttribute("class").match(Ae);null!==e&&e.length>0&&e.map((function(t){return t.trim()})).forEach((function(e){return t.classList.remove(e)}))},r._handlePopperPlacementChange=function(t){var e=t.state;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))},o.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.tooltip"),n="object"==typeof t&&t;if((e||!/dispose|hide/.test(t))&&(e||(e=new o(this,n)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(o,null,[{key:"Default",get:function(){return xe}},{key:"NAME",get:function(){return"tooltip"}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return Ce}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Oe}}]),o}(H);y("tooltip",Se);var je=new RegExp("(^|\\s)bs-popover\\S+","g"),Ne=n({},Se.Default,{placement:"right",offset:[0,8],trigger:"click",content:"",template:''}),Pe=n({},Se.DefaultType,{content:"(string|element|function)"}),Ie={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Me=function(t){function n(){return t.apply(this,arguments)||this}i(n,t);var o=n.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.setContent=function(){var t=this.getTipElement();this.setElementContent(Y(".popover-header",t),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this._element)),this.setElementContent(Y(".popover-body",t),e),t.classList.remove("fade","show")},o._addAttachmentClass=function(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))},o._getContent=function(){return this._element.getAttribute("data-bs-content")||this.config.content},o._cleanTipClass=function(){var t=this.getTipElement(),e=t.getAttribute("class").match(je);null!==e&&e.length>0&&e.map((function(t){return t.trim()})).forEach((function(e){return t.classList.remove(e)}))},n.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.popover"),i="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new n(this,i),E(this,"bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(n,null,[{key:"Default",get:function(){return Ne}},{key:"NAME",get:function(){return"popover"}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return Ie}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Pe}}]),n}(Se);y("popover",Me);var Be={offset:10,method:"auto",target:""},He={offset:"number",method:"string",target:"(string|element)"},Re=function(t){function o(e,n){var i;return(i=t.call(this,e)||this)._scrollElement="BODY"===e.tagName?window:e,i._config=i._getConfig(n),i._selector=i._config.target+" .nav-link, "+i._config.target+" .list-group-item, "+i._config.target+" .dropdown-item",i._offsets=[],i._targets=[],i._activeTarget=null,i._scrollHeight=0,B.on(i._scrollElement,"scroll.bs.scrollspy",(function(){return i._process()})),i.refresh(),i._process(),i}i(o,t);var r=o.prototype;return r.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,i="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),F(this._selector).map((function(t){var e=l(t),o=e?Y(e):null;if(o){var r=o.getBoundingClientRect();if(r.width||r.height)return[z[n](o).top+i,e]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},r.dispose=function(){t.prototype.dispose.call(this),B.off(this._scrollElement,".bs.scrollspy"),this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},r._getConfig=function(t){if("string"!=typeof(t=n({},Be,"object"==typeof t&&t?t:{})).target&&d(t.target)){var e=t.target.id;e||(e=s("scrollspy"),t.target.id=e),t.target="#"+e}return p("scrollspy",t,He),t},r._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},r._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},r._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},r._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t li > .active":".active";e=(e=F(o,i))[e.length-1]}var r=e?B.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(!(B.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==r&&r.defaultPrevented)){this._activate(this._element,i);var s=function(){B.trigger(e,"hidden.bs.tab",{relatedTarget:t._element}),B.trigger(t._element,"shown.bs.tab",{relatedTarget:e})};n?this._activate(n,n.parentNode,s):s()}}},o._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?q(e,".active"):F(":scope > li > .active",e))[0],r=n&&o&&o.classList.contains("fade"),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=u(o);o.classList.remove("show"),B.one(o,"transitionend",s),h(o,a)}else s()},o._transitionComplete=function(t,e,n){if(e){e.classList.remove("active");var i=Y(":scope > .dropdown-menu .active",e.parentNode);i&&i.classList.remove("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),v(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&t.parentNode.classList.contains("dropdown-menu")&&(t.closest(".dropdown")&&F(".dropdown-toggle").forEach((function(t){return t.classList.add("active")})),t.setAttribute("aria-expanded",!0)),n&&n()},n.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.tab")||new n(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(n,null,[{key:"DATA_KEY",get:function(){return"bs.tab"}}]),n}(H);B.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){t.preventDefault(),(T(this,"bs.tab")||new We(this)).show()})),y("tab",We);var Ke={animation:"boolean",autohide:"boolean",delay:"number"},Ue={animation:!0,autohide:!0,delay:5e3},ze=function(t){function o(e,n){var i;return(i=t.call(this,e)||this)._config=i._getConfig(n),i._timeout=null,i._setListeners(),i}i(o,t);var r=o.prototype;return r.show=function(){var t=this;if(!B.trigger(this._element,"show.bs.toast").defaultPrevented){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var e=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),B.trigger(t._element,"shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),v(this._element),this._element.classList.add("showing"),this._config.animation){var n=u(this._element);B.one(this._element,"transitionend",e),h(this._element,n)}else e()}},r.hide=function(){var t=this;if(this._element.classList.contains("show")&&!B.trigger(this._element,"hide.bs.toast").defaultPrevented){var e=function(){t._element.classList.add("hide"),B.trigger(t._element,"hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=u(this._element);B.one(this._element,"transitionend",e),h(this._element,n)}else e()}},r.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),B.off(this._element,"click.dismiss.bs.toast"),t.prototype.dispose.call(this),this._config=null},r._getConfig=function(t){return t=n({},Ue,z.getDataAttributes(this._element),"object"==typeof t&&t?t:{}),p("toast",t,this.constructor.DefaultType),t},r._setListeners=function(){var t=this;B.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',(function(){return t.hide()}))},r._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},o.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.toast");if(e||(e=new o(this,"object"==typeof t&&t)),"string"==typeof t){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t](this)}}))},e(o,null,[{key:"DefaultType",get:function(){return Ke}},{key:"Default",get:function(){return Ue}},{key:"DATA_KEY",get:function(){return"bs.toast"}}]),o}(H);return y("toast",ze),{Alert:R,Button:W,Carousel:$,Collapse:J,Dropdown:ve,Modal:ye,Popover:Me,ScrollSpy:Re,Tab:We,Toast:ze,Tooltip:Se}})); +/*! + * Bootstrap v5.0.0-beta2 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";function t(t,e){for(var n=0;n0,i._pointerEvent=Boolean(window.PointerEvent),i._addEventListeners(),i}i(o,t);var r=o.prototype;return r.next=function(){this._isSliding||this._slide("next")},r.nextWhenVisible=function(){!document.hidden&&g(this._element)&&this.next()},r.prev=function(){this._isSliding||this._slide("prev")},r.pause=function(t){t||(this._isPaused=!0),Y(".carousel-item-next, .carousel-item-prev",this._element)&&(f(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},r.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},r.to=function(t){var e=this;this._activeElement=Y(".active.carousel-item",this._element);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)B.one(this._element,"slid.bs.carousel",(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?"next":"prev";this._slide(i,this._items[t])}},r.dispose=function(){t.prototype.dispose.call(this),B.off(this._element,".bs.carousel"),this._items=null,this._config=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},r._getConfig=function(t){return t=n({},X,t),p("carousel",t,Q),t},r._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&(b?this.next():this.prev()),e<0&&(b?this.prev():this.next())}},r._addEventListeners=function(){var t=this;this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",(function(e){return t.pause(e)})),B.on(this._element,"mouseleave.bs.carousel",(function(e){return t.cycle(e)}))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()},r._addTouchEventListeners=function(){var t=this,e=function(e){!t._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType?t._pointerEvent||(t.touchStartX=e.touches[0].clientX):t.touchStartX=e.clientX},n=function(e){!t._pointerEvent||"pen"!==e.pointerType&&"touch"!==e.pointerType||(t.touchDeltaX=e.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};F(".carousel-item img",this._element).forEach((function(t){B.on(t,"dragstart.bs.carousel",(function(t){return t.preventDefault()}))})),this._pointerEvent?(B.on(this._element,"pointerdown.bs.carousel",(function(t){return e(t)})),B.on(this._element,"pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.carousel",(function(t){return e(t)})),B.on(this._element,"touchmove.bs.carousel",(function(e){return function(e){e.touches&&e.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.touches[0].clientX-t.touchStartX}(e)})),B.on(this._element,"touchend.bs.carousel",(function(t){return n(t)})))},r._keydown=function(t){/input|textarea/i.test(t.target.tagName)||("ArrowLeft"===t.key?(t.preventDefault(),b?this.next():this.prev()):"ArrowRight"===t.key&&(t.preventDefault(),b?this.prev():this.next()))},r._getItemIndex=function(t){return this._items=t&&t.parentNode?F(".carousel-item",t.parentNode):[],this._items.indexOf(t)},r._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+("prev"===t?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},r._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(Y(".active.carousel-item",this._element));return B.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n})},r._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=Y(".active",this._indicatorsElement);e.classList.remove("active"),e.removeAttribute("aria-current");for(var n=F("[data-bs-target]",this._indicatorsElement),i=0;i0)for(var i=0;i=0}function _t(t){return((ut(t)?t.ownerDocument:t.document)||window.document).documentElement}function bt(t){return"html"===lt(t)?t:t.assignedSlot||t.parentNode||t.host||_t(t)}function yt(t){if(!ft(t)||"fixed"===mt(t).position)return null;var e=t.offsetParent;if(e){var n=_t(e);if("body"===lt(e)&&"static"===mt(e).position&&"static"!==mt(n).position)return n}return e}function wt(t){for(var e=ct(t),n=yt(t);n&&vt(n)&&"static"===mt(n).position;)n=yt(n);return n&&"body"===lt(n)&&"static"===mt(n).position?e:n||function(t){for(var e=bt(t);ft(e)&&["html","body"].indexOf(lt(e))<0;){var n=mt(e);if("none"!==n.transform||"none"!==n.perspective||n.willChange&&"auto"!==n.willChange)return e;e=e.parentNode}return null}(t)||e}function Et(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Tt(t,e,n){return Math.max(t,Math.min(e,n))}function kt(t){return Object.assign(Object.assign({},{top:0,right:0,bottom:0,left:0}),t)}function At(t,e){return e.reduce((function(e,n){return e[n]=t,e}),{})}var Lt={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,n=t.state,i=t.name,o=n.elements.arrow,r=n.modifiersData.popperOffsets,s=ht(n.placement),a=Et(s),l=[it,nt].indexOf(s)>=0?"height":"width";if(o&&r){var c=n.modifiersData[i+"#persistent"].padding,u=pt(o),f="y"===a?tt:it,d="y"===a?et:nt,h=n.rects.reference[l]+n.rects.reference[a]-r[a]-n.rects.popper[l],p=r[a]-n.rects.reference[a],g=wt(o),m=g?"y"===a?g.clientHeight||0:g.clientWidth||0:0,v=h/2-p/2,_=c[f],b=m-u[l]-c[d],y=m/2-u[l]/2+v,w=Tt(_,y,b),E=a;n.modifiersData[i]=((e={})[E]=w,e.centerOffset=w-y,e)}},effect:function(t){var e=t.state,n=t.options,i=t.name,o=n.element,r=void 0===o?"[data-popper-arrow]":o,s=n.padding,a=void 0===s?0:s;null!=r&&("string"!=typeof r||(r=e.elements.popper.querySelector(r)))&>(e.elements.popper,r)&&(e.elements.arrow=r,e.modifiersData[i+"#persistent"]={padding:kt("number"!=typeof a?a:At(a,ot))})},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},Ot={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Dt(t){var e,n=t.popper,i=t.popperRect,o=t.placement,r=t.offsets,s=t.position,a=t.gpuAcceleration,l=t.adaptive,c=t.roundOffsets?function(t){var e=t.x,n=t.y,i=window.devicePixelRatio||1;return{x:Math.round(e*i)/i||0,y:Math.round(n*i)/i||0}}(r):r,u=c.x,f=void 0===u?0:u,d=c.y,h=void 0===d?0:d,p=r.hasOwnProperty("x"),g=r.hasOwnProperty("y"),m=it,v=tt,_=window;if(l){var b=wt(n);b===ct(n)&&(b=_t(n)),o===tt&&(v=et,h-=b.clientHeight-i.height,h*=a?1:-1),o===it&&(m=nt,f-=b.clientWidth-i.width,f*=a?1:-1)}var y,w=Object.assign({position:s},l&&Ot);return a?Object.assign(Object.assign({},w),{},((y={})[v]=g?"0":"",y[m]=p?"0":"",y.transform=(_.devicePixelRatio||1)<2?"translate("+f+"px, "+h+"px)":"translate3d("+f+"px, "+h+"px, 0)",y)):Object.assign(Object.assign({},w),{},((e={})[v]=g?h+"px":"",e[m]=p?f+"px":"",e.transform="",e))}var xt={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,n=t.options,i=n.gpuAcceleration,o=void 0===i||i,r=n.adaptive,s=void 0===r||r,a=n.roundOffsets,l=void 0===a||a,c={placement:ht(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign(Object.assign({},e.styles.popper),Dt(Object.assign(Object.assign({},c),{},{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign(Object.assign({},e.styles.arrow),Dt(Object.assign(Object.assign({},c),{},{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{},{"data-popper-placement":e.placement})},data:{}},Ct={passive:!0},St={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,n=t.instance,i=t.options,o=i.scroll,r=void 0===o||o,s=i.resize,a=void 0===s||s,l=ct(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return r&&c.forEach((function(t){t.addEventListener("scroll",n.update,Ct)})),a&&l.addEventListener("resize",n.update,Ct),function(){r&&c.forEach((function(t){t.removeEventListener("scroll",n.update,Ct)})),a&&l.removeEventListener("resize",n.update,Ct)}},data:{}},jt={left:"right",right:"left",bottom:"top",top:"bottom"};function Nt(t){return t.replace(/left|right|bottom|top/g,(function(t){return jt[t]}))}var Pt={start:"end",end:"start"};function It(t){return t.replace(/start|end/g,(function(t){return Pt[t]}))}function Mt(t){var e=t.getBoundingClientRect();return{width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function Bt(t){var e=ct(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ht(t){return Mt(_t(t)).left+Bt(t).scrollLeft}function Rt(t){var e=mt(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+i)}function Wt(t,e){void 0===e&&(e=[]);var n=function t(e){return["html","body","#document"].indexOf(lt(e))>=0?e.ownerDocument.body:ft(e)&&Rt(e)?e:t(bt(e))}(t),i="body"===lt(n),o=ct(n),r=i?[o].concat(o.visualViewport||[],Rt(n)?n:[]):n,s=e.concat(r);return i?s:s.concat(Wt(bt(r)))}function Kt(t){return Object.assign(Object.assign({},t),{},{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Ut(t,e){return"viewport"===e?Kt(function(t){var e=ct(t),n=_t(t),i=e.visualViewport,o=n.clientWidth,r=n.clientHeight,s=0,a=0;return i&&(o=i.width,r=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=i.offsetLeft,a=i.offsetTop)),{width:o,height:r,x:s+Ht(t),y:a}}(t)):ft(e)?function(t){var e=Mt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Kt(function(t){var e=_t(t),n=Bt(t),i=t.ownerDocument.body,o=Math.max(e.scrollWidth,e.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),r=Math.max(e.scrollHeight,e.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),s=-n.scrollLeft+Ht(t),a=-n.scrollTop;return"rtl"===mt(i||e).direction&&(s+=Math.max(e.clientWidth,i?i.clientWidth:0)-o),{width:o,height:r,x:s,y:a}}(_t(t)))}function zt(t){return t.split("-")[1]}function Ft(t){var e,n=t.reference,i=t.element,o=t.placement,r=o?ht(o):null,s=o?zt(o):null,a=n.x+n.width/2-i.width/2,l=n.y+n.height/2-i.height/2;switch(r){case tt:e={x:a,y:n.y-i.height};break;case et:e={x:a,y:n.y+n.height};break;case nt:e={x:n.x+n.width,y:l};break;case it:e={x:n.x-i.width,y:l};break;default:e={x:n.x,y:n.y}}var c=r?Et(r):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case"start":e[c]=e[c]-(n[u]/2-i[u]/2);break;case"end":e[c]=e[c]+(n[u]/2-i[u]/2)}}return e}function Yt(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=void 0===i?t.placement:i,r=n.boundary,s=void 0===r?"clippingParents":r,a=n.rootBoundary,l=void 0===a?"viewport":a,c=n.elementContext,u=void 0===c?"popper":c,f=n.altBoundary,d=void 0!==f&&f,h=n.padding,p=void 0===h?0:h,g=kt("number"!=typeof p?p:At(p,ot)),m="popper"===u?"reference":"popper",v=t.elements.reference,_=t.rects.popper,b=t.elements[d?m:u],y=function(t,e,n){var i="clippingParents"===e?function(t){var e=Wt(bt(t)),n=["absolute","fixed"].indexOf(mt(t).position)>=0&&ft(t)?wt(t):t;return ut(n)?e.filter((function(t){return ut(t)&>(t,n)&&"body"!==lt(t)})):[]}(t):[].concat(e),o=[].concat(i,[n]),r=o[0],s=o.reduce((function(e,n){var i=Ut(t,n);return e.top=Math.max(i.top,e.top),e.right=Math.min(i.right,e.right),e.bottom=Math.min(i.bottom,e.bottom),e.left=Math.max(i.left,e.left),e}),Ut(t,r));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(ut(b)?b:b.contextElement||_t(t.elements.popper),s,l),w=Mt(v),E=Ft({reference:w,element:_,strategy:"absolute",placement:o}),T=Kt(Object.assign(Object.assign({},_),E)),k="popper"===u?T:w,A={top:y.top-k.top+g.top,bottom:k.bottom-y.bottom+g.bottom,left:y.left-k.left+g.left,right:k.right-y.right+g.right},L=t.modifiersData.offset;if("popper"===u&&L){var O=L[o];Object.keys(A).forEach((function(t){var e=[nt,et].indexOf(t)>=0?1:-1,n=[tt,et].indexOf(t)>=0?"y":"x";A[t]+=O[n]*e}))}return A}function qt(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=n.boundary,r=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?st:l,u=zt(i),f=u?a?rt:rt.filter((function(t){return zt(t)===u})):ot,d=f.filter((function(t){return c.indexOf(t)>=0}));0===d.length&&(d=f);var h=d.reduce((function(e,n){return e[n]=Yt(t,{placement:n,boundary:o,rootBoundary:r,padding:s})[ht(n)],e}),{});return Object.keys(h).sort((function(t,e){return h[t]-h[e]}))}var Vt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name;if(!e.modifiersData[i]._skip){for(var o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,f=n.rootBoundary,d=n.altBoundary,h=n.flipVariations,p=void 0===h||h,g=n.allowedAutoPlacements,m=e.options.placement,v=ht(m),_=l||(v!==m&&p?function(t){if("auto"===ht(t))return[];var e=Nt(t);return[It(t),e,It(e)]}(m):[Nt(m)]),b=[m].concat(_).reduce((function(t,n){return t.concat("auto"===ht(n)?qt(e,{placement:n,boundary:u,rootBoundary:f,padding:c,flipVariations:p,allowedAutoPlacements:g}):n)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,T=!0,k=b[0],A=0;A=0,C=x?"width":"height",S=Yt(e,{placement:L,boundary:u,rootBoundary:f,altBoundary:d,padding:c}),j=x?D?nt:it:D?et:tt;y[C]>w[C]&&(j=Nt(j));var N=Nt(j),P=[];if(r&&P.push(S[O]<=0),a&&P.push(S[j]<=0,S[N]<=0),P.every((function(t){return t}))){k=L,T=!1;break}E.set(L,P)}if(T)for(var I=function(t){var e=b.find((function(e){var n=E.get(e);if(n)return n.slice(0,t).every((function(t){return t}))}));if(e)return k=e,"break"},M=p?3:1;M>0&&"break"!==I(M);M--);e.placement!==k&&(e.modifiersData[i]._skip=!0,e.placement=k,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Xt(t,e,n){return void 0===n&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function Qt(t){return[tt,nt,et,it].some((function(e){return t[e]>=0}))}var $t={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,n=t.name,i=e.rects.reference,o=e.rects.popper,r=e.modifiersData.preventOverflow,s=Yt(e,{elementContext:"reference"}),a=Yt(e,{altBoundary:!0}),l=Xt(s,i),c=Xt(a,o,r),u=Qt(l),f=Qt(c);e.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:f},e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{},{"data-popper-reference-hidden":u,"data-popper-escaped":f})}},Gt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.offset,r=void 0===o?[0,0]:o,s=st.reduce((function(t,n){return t[n]=function(t,e,n){var i=ht(t),o=[it,tt].indexOf(i)>=0?-1:1,r="function"==typeof n?n(Object.assign(Object.assign({},e),{},{placement:t})):n,s=r[0],a=r[1];return s=s||0,a=(a||0)*o,[it,nt].indexOf(i)>=0?{x:a,y:s}:{x:s,y:a}}(n,e.rects,r),t}),{}),a=s[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[i]=s}},Zt={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,n=t.name;e.modifiersData[n]=Ft({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Jt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,f=n.padding,d=n.tether,h=void 0===d||d,p=n.tetherOffset,g=void 0===p?0:p,m=Yt(e,{boundary:l,rootBoundary:c,padding:f,altBoundary:u}),v=ht(e.placement),_=zt(e.placement),b=!_,y=Et(v),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,T=e.rects.reference,k=e.rects.popper,A="function"==typeof g?g(Object.assign(Object.assign({},e.rects),{},{placement:e.placement})):g,L={x:0,y:0};if(E){if(r){var O="y"===y?tt:it,D="y"===y?et:nt,x="y"===y?"height":"width",C=E[y],S=E[y]+m[O],j=E[y]-m[D],N=h?-k[x]/2:0,P="start"===_?T[x]:k[x],I="start"===_?-k[x]:-T[x],M=e.elements.arrow,B=h&&M?pt(M):{width:0,height:0},H=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=H[O],W=H[D],K=Tt(0,T[x],B[x]),U=b?T[x]/2-N-K-R-A:P-K-R-A,z=b?-T[x]/2+N+K+W+A:I+K+W+A,F=e.elements.arrow&&wt(e.elements.arrow),Y=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,q=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,V=E[y]+U-q-Y,X=E[y]+z-q,Q=Tt(h?Math.min(S,V):S,C,h?Math.max(j,X):j);E[y]=Q,L[y]=Q-C}if(a){var $="x"===y?tt:it,G="x"===y?et:nt,Z=E[w],J=Tt(Z+m[$],Z,Z-m[G]);E[w]=J,L[w]=J-Z}e.modifiersData[i]=L}},requiresIfExists:["offset"]};function te(t,e,n){void 0===n&&(n=!1);var i,o,r=_t(e),s=Mt(t),a=ft(e),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(a||!a&&!n)&&(("body"!==lt(e)||Rt(r))&&(l=(i=e)!==ct(i)&&ft(i)?{scrollLeft:(o=i).scrollLeft,scrollTop:o.scrollTop}:Bt(i)),ft(e)?((c=Mt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=Ht(r))),{x:s.left+l.scrollLeft-c.x,y:s.top+l.scrollTop-c.y,width:s.width,height:s.height}}var ee={placement:"bottom",modifiers:[],strategy:"absolute"};function ne(){for(var t=arguments.length,e=new Array(t),n=0;n0&&r--,"ArrowDown"===t.key&&rdocument.documentElement.clientHeight;e||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");var n=u(this._dialog);B.off(this._element,"transitionend"),B.one(this._element,"transitionend",(function(){t._element.classList.remove("modal-static"),e||(B.one(t._element,"transitionend",(function(){t._element.style.overflowY=""})),h(t._element,n))})),h(this._element,n),this._element.focus()}},r._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;(!this._isBodyOverflowing&&t&&!b||this._isBodyOverflowing&&!t&&b)&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),(this._isBodyOverflowing&&!t&&!b||!this._isBodyOverflowing&&t&&b)&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},r._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},r._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ce={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Se=function(t){function o(e,n){var i;if(void 0===ae)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");return(i=t.call(this,e)||this)._isEnabled=!0,i._timeout=0,i._hoverState="",i._activeTrigger={},i._popper=null,i.config=i._getConfig(n),i.tip=null,i._setListeners(),i}i(o,t);var r=o.prototype;return r.enable=function(){this._isEnabled=!0},r.disable=function(){this._isEnabled=!1},r.toggleEnabled=function(){this._isEnabled=!this._isEnabled},r.toggle=function(t){if(this._isEnabled)if(t){var e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}},r.dispose=function(){clearTimeout(this._timeout),B.off(this._element,this.constructor.EVENT_KEY),B.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.parentNode&&this.tip.parentNode.removeChild(this.tip),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.config=null,this.tip=null,t.prototype.dispose.call(this)},r.show=function(){var t=this;if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(this.isWithContent()&&this._isEnabled){var e=B.trigger(this._element,this.constructor.Event.SHOW),n=function t(e){if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){var n=e.getRootNode();return n instanceof ShadowRoot?n:null}return e instanceof ShadowRoot?e:e.parentNode?t(e.parentNode):null}(this._element),i=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(!e.defaultPrevented&&i){var o=this.getTipElement(),r=s(this.constructor.NAME);o.setAttribute("id",r),this._element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&o.classList.add("fade");var a="function"==typeof this.config.placement?this.config.placement.call(this,o,this._element):this.config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);var c=this._getContainer();E(o,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||c.appendChild(o),B.trigger(this._element,this.constructor.Event.INSERTED),this._popper=se(this._element,o,this._getPopperConfig(l)),o.classList.add("show");var f,d,p="function"==typeof this.config.customClass?this.config.customClass():this.config.customClass;p&&(f=o.classList).add.apply(f,p.split(" ")),"ontouchstart"in document.documentElement&&(d=[]).concat.apply(d,document.body.children).forEach((function(t){B.on(t,"mouseover",(function(){}))}));var g=function(){var e=t._hoverState;t._hoverState=null,B.trigger(t._element,t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(this.tip.classList.contains("fade")){var m=u(this.tip);B.one(this.tip,"transitionend",g),h(this.tip,m)}else g()}}},r.hide=function(){var t=this;if(this._popper){var e=this.getTipElement(),n=function(){"show"!==t._hoverState&&e.parentNode&&e.parentNode.removeChild(e),t._cleanTipClass(),t._element.removeAttribute("aria-describedby"),B.trigger(t._element,t.constructor.Event.HIDDEN),t._popper&&(t._popper.destroy(),t._popper=null)};if(!B.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented){var i;if(e.classList.remove("show"),"ontouchstart"in document.documentElement&&(i=[]).concat.apply(i,document.body.children).forEach((function(t){return B.off(t,"mouseover",m)})),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this.tip.classList.contains("fade")){var o=u(e);B.one(e,"transitionend",n),h(e,o)}else n();this._hoverState=""}}},r.update=function(){null!==this._popper&&this._popper.update()},r.isWithContent=function(){return Boolean(this.getTitle())},r.getTipElement=function(){if(this.tip)return this.tip;var t=document.createElement("div");return t.innerHTML=this.config.template,this.tip=t.children[0],this.tip},r.setContent=function(){var t=this.getTipElement();this.setElementContent(Y(".tooltip-inner",t),this.getTitle()),t.classList.remove("fade","show")},r.setElementContent=function(t,e){if(null!==t)return"object"==typeof e&&d(e)?(e.jquery&&(e=e[0]),void(this.config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this.config.html?(this.config.sanitize&&(e=ke(e,this.config.allowList,this.config.sanitizeFn)),t.innerHTML=e):t.textContent=e)},r.getTitle=function(){var t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this._element):this.config.title),t},r.updateAttachment=function(t){return"right"===t?"end":"left"===t?"start":t},r._initializeOnDelegatedTarget=function(t,e){var n=this.constructor.DATA_KEY;return(e=e||T(t.delegateTarget,n))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),E(t.delegateTarget,n,e)),e},r._getOffset=function(){var t=this,e=this.config.offset;return"string"==typeof e?e.split(",").map((function(t){return Number.parseInt(t,10)})):"function"==typeof e?function(n){return e(n,t._element)}:e},r._getPopperConfig=function(t){var e=this,i={placement:t,modifiers:[{name:"flip",options:{altBoundary:!0,fallbackPlacements:this.config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this.config.boundary}},{name:"arrow",options:{element:"."+this.constructor.NAME+"-arrow"}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:function(t){return e._handlePopperPlacementChange(t)}}],onFirstUpdate:function(t){t.options.placement!==t.placement&&e._handlePopperPlacementChange(t)}};return n({},i,"function"==typeof this.config.popperConfig?this.config.popperConfig(i):this.config.popperConfig)},r._addAttachmentClass=function(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))},r._getContainer=function(){return!1===this.config.container?document.body:d(this.config.container)?this.config.container:Y(this.config.container)},r._getAttachment=function(t){return De[t.toUpperCase()]},r._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)B.on(t._element,t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;B.on(t._element,n,t.config.selector,(function(e){return t._enter(e)})),B.on(t._element,i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t._element&&t.hide()},B.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=n({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},r._fixTitle=function(){var t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))},r._enter=function(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},r._leave=function(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},r._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},r._getConfig=function(t){var e=z.getDataAttributes(this._element);return Object.keys(e).forEach((function(t){Le.has(t)&&delete e[t]})),t&&"object"==typeof t.container&&t.container.jquery&&(t.container=t.container[0]),"number"==typeof(t=n({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),p("tooltip",t,this.constructor.DefaultType),t.sanitize&&(t.template=ke(t.template,t.allowList,t.sanitizeFn)),t},r._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},r._cleanTipClass=function(){var t=this.getTipElement(),e=t.getAttribute("class").match(Ae);null!==e&&e.length>0&&e.map((function(t){return t.trim()})).forEach((function(e){return t.classList.remove(e)}))},r._handlePopperPlacementChange=function(t){var e=t.state;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))},o.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.tooltip"),n="object"==typeof t&&t;if((e||!/dispose|hide/.test(t))&&(e||(e=new o(this,n)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(o,null,[{key:"Default",get:function(){return xe}},{key:"NAME",get:function(){return"tooltip"}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return Ce}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Oe}}]),o}(H);y("tooltip",Se);var je=new RegExp("(^|\\s)bs-popover\\S+","g"),Ne=n({},Se.Default,{placement:"right",offset:[0,8],trigger:"click",content:"",template:''}),Pe=n({},Se.DefaultType,{content:"(string|element|function)"}),Ie={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Me=function(t){function n(){return t.apply(this,arguments)||this}i(n,t);var o=n.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.setContent=function(){var t=this.getTipElement();this.setElementContent(Y(".popover-header",t),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this._element)),this.setElementContent(Y(".popover-body",t),e),t.classList.remove("fade","show")},o._addAttachmentClass=function(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))},o._getContent=function(){return this._element.getAttribute("data-bs-content")||this.config.content},o._cleanTipClass=function(){var t=this.getTipElement(),e=t.getAttribute("class").match(je);null!==e&&e.length>0&&e.map((function(t){return t.trim()})).forEach((function(e){return t.classList.remove(e)}))},n.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.popover"),i="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new n(this,i),E(this,"bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(n,null,[{key:"Default",get:function(){return Ne}},{key:"NAME",get:function(){return"popover"}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return Ie}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Pe}}]),n}(Se);y("popover",Me);var Be={offset:10,method:"auto",target:""},He={offset:"number",method:"string",target:"(string|element)"},Re=function(t){function o(e,n){var i;return(i=t.call(this,e)||this)._scrollElement="BODY"===e.tagName?window:e,i._config=i._getConfig(n),i._selector=i._config.target+" .nav-link, "+i._config.target+" .list-group-item, "+i._config.target+" .dropdown-item",i._offsets=[],i._targets=[],i._activeTarget=null,i._scrollHeight=0,B.on(i._scrollElement,"scroll.bs.scrollspy",(function(){return i._process()})),i.refresh(),i._process(),i}i(o,t);var r=o.prototype;return r.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,i="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),F(this._selector).map((function(t){var e=l(t),o=e?Y(e):null;if(o){var r=o.getBoundingClientRect();if(r.width||r.height)return[z[n](o).top+i,e]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},r.dispose=function(){t.prototype.dispose.call(this),B.off(this._scrollElement,".bs.scrollspy"),this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},r._getConfig=function(t){if("string"!=typeof(t=n({},Be,"object"==typeof t&&t?t:{})).target&&d(t.target)){var e=t.target.id;e||(e=s("scrollspy"),t.target.id=e),t.target="#"+e}return p("scrollspy",t,He),t},r._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},r._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},r._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},r._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t li > .active":".active";e=(e=F(o,i))[e.length-1]}var r=e?B.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(!(B.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==r&&r.defaultPrevented)){this._activate(this._element,i);var s=function(){B.trigger(e,"hidden.bs.tab",{relatedTarget:t._element}),B.trigger(t._element,"shown.bs.tab",{relatedTarget:e})};n?this._activate(n,n.parentNode,s):s()}}},o._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?q(e,".active"):F(":scope > li > .active",e))[0],r=n&&o&&o.classList.contains("fade"),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=u(o);o.classList.remove("show"),B.one(o,"transitionend",s),h(o,a)}else s()},o._transitionComplete=function(t,e,n){if(e){e.classList.remove("active");var i=Y(":scope > .dropdown-menu .active",e.parentNode);i&&i.classList.remove("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),v(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&t.parentNode.classList.contains("dropdown-menu")&&(t.closest(".dropdown")&&F(".dropdown-toggle").forEach((function(t){return t.classList.add("active")})),t.setAttribute("aria-expanded",!0)),n&&n()},n.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.tab")||new n(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(n,null,[{key:"DATA_KEY",get:function(){return"bs.tab"}}]),n}(H);B.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){t.preventDefault(),(T(this,"bs.tab")||new We(this)).show()})),y("tab",We);var Ke={animation:"boolean",autohide:"boolean",delay:"number"},Ue={animation:!0,autohide:!0,delay:5e3},ze=function(t){function o(e,n){var i;return(i=t.call(this,e)||this)._config=i._getConfig(n),i._timeout=null,i._setListeners(),i}i(o,t);var r=o.prototype;return r.show=function(){var t=this;if(!B.trigger(this._element,"show.bs.toast").defaultPrevented){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var e=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),B.trigger(t._element,"shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),v(this._element),this._element.classList.add("showing"),this._config.animation){var n=u(this._element);B.one(this._element,"transitionend",e),h(this._element,n)}else e()}},r.hide=function(){var t=this;if(this._element.classList.contains("show")&&!B.trigger(this._element,"hide.bs.toast").defaultPrevented){var e=function(){t._element.classList.add("hide"),B.trigger(t._element,"hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=u(this._element);B.one(this._element,"transitionend",e),h(this._element,n)}else e()}},r.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),B.off(this._element,"click.dismiss.bs.toast"),t.prototype.dispose.call(this),this._config=null},r._getConfig=function(t){return t=n({},Ue,z.getDataAttributes(this._element),"object"==typeof t&&t?t:{}),p("toast",t,this.constructor.DefaultType),t},r._setListeners=function(){var t=this;B.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',(function(){return t.hide()}))},r._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},o.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.toast");if(e||(e=new o(this,"object"==typeof t&&t)),"string"==typeof t){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t](this)}}))},e(o,null,[{key:"DefaultType",get:function(){return Ke}},{key:"Default",get:function(){return Ue}},{key:"DATA_KEY",get:function(){return"bs.toast"}}]),o}(H);return y("toast",ze),{Alert:R,Button:W,Carousel:$,Collapse:J,Dropdown:ve,Modal:ye,Popover:Me,ScrollSpy:Re,Tab:We,Toast:ze,Tooltip:Se}})); //# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/assets/js/hesabix-admin.js b/assets/js/hesabix-admin.js new file mode 100644 index 0000000..54affca --- /dev/null +++ b/assets/js/hesabix-admin.js @@ -0,0 +1,1875 @@ +/* + * Hesabix Admin JavaScript + * + * @package Hesabix + * @author Mohammad Rezai + * @author URI https://pirouz.xyz + * @since 1.0.0 + */ + +jQuery(function($) { + 'use strict'; + + const HesabixAdmin = { + jalaliMonths: ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'], + + gregorianToJalali: function(gy, gm, gd) { + const g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; + let jy = (gy <= 1600) ? 0 : 979; + gy -= (gy <= 1600) ? 621 : 1600; + let gy2 = (gm > 2) ? (gy + 1) : gy; + let days = (365 * gy) + parseInt((gy2 + 3) / 4) - parseInt((gy2 + 99) / 100) + parseInt((gy2 + 399) / 400) - 80 + gd + g_d_m[gm - 1]; + jy += 33 * parseInt(days / 12053); + days %= 12053; + jy += 4 * parseInt(days / 1461); + days %= 1461; + jy += parseInt((days - 1) / 365); + if (days > 365) days = (days - 1) % 365; + let jm = (days < 186) ? 1 + parseInt(days / 31) : 7 + parseInt((days - 186) / 30); + let jd = 1 + ((days < 186) ? (days % 31) : ((days - 186) % 30)); + return [jy, jm, jd]; + }, + + jalaliToGregorian: function(jy, jm, jd) { + let gy = (jy <= 979) ? 621 : 1600; + jy -= (jy <= 979) ? 0 : 979; + let gy2 = (jm > 2) ? (jy + 1) : jy; + let days = (365 * jy) + parseInt((jy + 3) / 4) - parseInt((jy + 99) / 100) + parseInt((jy + 399) / 400) + 80 + jd + ((jm < 7) ? (jm - 1) * 31 : ((jm - 7) * 30) + 186); + gy += 400 * parseInt(days / 146097); + days %= 146097; + if (days > 36524) { + gy += 100 * parseInt(--days / 36524); + days %= 36524; + if (days >= 365) days++; + } + gy += 4 * parseInt(days / 1461); + days %= 1461; + if (days > 365) { + gy += parseInt((days - 1) / 365); + days = (days - 1) % 365; + } + let gd = days + 1; + let sal_a = [0, 31, ((gy % 4 == 0 && gy % 100 != 0) || (gy % 400 == 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + let gm; + for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) gd -= sal_a[gm]; + return [gy, gm, gd]; + }, + + formatJalaliDate: function(date) { + const jalali = this.gregorianToJalali(date.getFullYear(), date.getMonth() + 1, date.getDate()); + const monthName = this.jalaliMonths[jalali[1] - 1]; + return `${jalali[2]} ${monthName} ${jalali[0]}`; + }, + + formatJalaliDateShort: function(date) { + const jalali = this.gregorianToJalali(date.getFullYear(), date.getMonth() + 1, date.getDate()); + return `${jalali[0]}/${String(jalali[1]).padStart(2, '0')}/${String(jalali[2]).padStart(2, '0')}`; + }, + + jalaliDateToGregorian: function(jalaliString) { + const parts = jalaliString.split('/'); + if (parts.length !== 3) return null; + + const jy = parseInt(parts[0]); + const jm = parseInt(parts[1]); + const jd = parseInt(parts[2]); + + if (isNaN(jy) || isNaN(jm) || isNaN(jd)) return null; + + const gregorian = this.jalaliToGregorian(jy, jm, jd); + return new Date(gregorian[0], gregorian[1] - 1, gregorian[2]); + }, + + init: function() { + this.initHomeStats(); + this.initUpdateChecker(); + this.initExportImport(); + this.initSyncOperations(); + this.initProductOperations(); + this.initSettingsOperations(); + this.initApiOperations(); + this.initTabSystem(); + this.initStatusSelector(); + this.initFreightSwitch(); + this.initCustomApiAddress(); + }, + + initHomeStats: function() { + if ($('#hesabix-stats-container').length > 0) { + this.loadHomeStats(); + } + }, + + initUpdateChecker: function() { + if (document.querySelectorAll('#hesabix-check-update').length > 0) { + setTimeout(() => this.checkHesabixUpdate(), 1000); + } + }, + + loadHomeStats: function() { + const $iconContainer = $('#hesabix-home-connection-card .hesabix-feature-icon'); + $iconContainer.find('svg').remove(); + if ($iconContainer.find('.hesabix-spinner-small').length === 0) { + $iconContainer.append(''); + } + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'admin_get_home_stats', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + this.renderStats(response.data); + } else { + this.showStatsError(); + } + }, + error: () => this.showStatsError() + }); + }, + + renderStats: function(data) { + $('#hesabix-home-products-count').text(data.products_count); + $('#hesabix-home-products-label').text(data.products_label); + $('#hesabix-home-customers-count').text(data.customers_count); + $('#hesabix-home-customers-label').text(data.customers_label); + $('#hesabix-home-orders-count').text(data.orders_count); + $('#hesabix-home-orders-label').text(data.orders_label); + + const $iconContainer = $('#hesabix-home-connection-card .hesabix-feature-icon'); + $iconContainer.find('.hesabix-spinner-small').remove(); + if ($iconContainer.find('svg').length === 0) { + $iconContainer.append(''); + } + + const connectionClass = data.is_connected ? 'connected' : 'not-connected'; + $('#hesabix-home-connection-card').removeClass('connected not-connected').addClass(connectionClass); + + const connectionIcon = data.is_connected ? + 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z' : + 'M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z'; + + $('#hesabix-home-connection-icon').attr('d', connectionIcon); + $('#hesabix-home-connection-text').text(data.connected_text); + $('#hesabix-home-status-label').text(data.status_label); + }, + + showStatsError: function() { + $('#hesabix-home-products-count').html('خطا'); + $('#hesabix-home-products-label').text('محصولات'); + $('#hesabix-home-customers-count').html('خطا'); + $('#hesabix-home-customers-label').text('مشتریان'); + $('#hesabix-home-orders-count').html('خطا'); + $('#hesabix-home-orders-label').text('سفارشات'); + $('#hesabix-home-connection-card').removeClass('connected not-connected'); + $('#hesabix-home-connection-icon').attr('d', ''); + $('#hesabix-home-connection-text').html('خطا'); + $('#hesabix-home-status-label').text('وضعیت اتصال'); + }, + + checkHesabixUpdate: function() { + const updateButtons = document.querySelectorAll('#hesabix-check-update'); + updateButtons.forEach(el => { + const btn = $(el); + btn.prop('disabled', true); + btn.find('.update-text').hide(); + btn.find('.update-loading').show(); + }); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'admin_check_for_updates', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + this.showUpdateResult(response.data); + } else { + this.showUpdateError(response.message); + } + }, + error: () => this.showUpdateError('خطا در بررسی بروزرسانی'), + complete: () => { + updateButtons.forEach(el => { + const btn = $(el); + btn.prop('disabled', false); + btn.find('.update-text').show(); + btn.find('.update-loading').hide(); + }); + } + }); + }, + + showUpdateResult: function(data) { + const updateButtons = document.querySelectorAll('#hesabix-check-update'); + updateButtons.forEach(el => { + const btn = $(el); + if (data.is_update_available) { + btn.removeClass('hesabix-update-badge').addClass('hesabix-badge warning'); + btn.html(` + + + + + نسخه جدید ${data.latest_version} موجود است + + `); + btn.attr('onclick', `window.open('${data.download_url}', '_blank')`); + this.showUpdateNotification(data); + } else { + btn.removeClass('hesabix-update-badge').addClass('hesabix-badge status'); + btn.html(` + + + + + نسخه فعلی بروز است + + `); + btn.removeAttr('onclick'); + } + }); + }, + + showUpdateError: function(message) { + const updateButtons = document.querySelectorAll('#hesabix-check-update'); + updateButtons.forEach(el => { + const btn = $(el); + btn.removeClass('hesabix-update-badge').addClass('hesabix-badge danger'); + btn.html(` + + + + + ${message} + + `); + btn.removeAttr('onclick'); + }); + }, + + showUpdateNotification: function(data) { + const notification = $(` +
+
+

نسخه جدید موجود است!

+ +
+

+ نسخه ${data.latest_version} از پلاگین حسابیکس منتشر شده است. + نسخه فعلی شما: ${data.current_version} +

+
+ + +
+
+ `); + + notification.find('.hesabix-notification-close').on('click', () => { + notification.fadeOut(() => notification.remove()); + }); + + $('body').append(notification); + setTimeout(() => { + notification.fadeOut(() => notification.remove()); + }, 10000); + }, + + initExportImport: function() { + this.initExportProducts(); + this.initImportProducts(); + this.initExportOpeningQuantity(); + this.initExportCustomers(); + }, + + initExportProducts: function() { + $('#hesabix_export_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-export-product-submit'); + $btn.attr('disabled', 'disabled').removeClass('button-primary') + .html(' خروج محصولات...'); + $('#exportProductsProgress').show(); + $('#exportProductsProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.exportProducts(1, 1, 1, 0); + }); + }, + + exportProducts: function(batch, totalBatch, total, updateCount) { + $.post(ajaxurl, { + action: 'adminExportProducts', + batch: batch, + totalBatch: totalBatch, + total: total, + updateCount: updateCount + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + res.batch = parseInt(res.batch); + if (res.batch < res.totalBatch) { + const progress = Math.round((res.batch * 100) / res.totalBatch); + $('#exportProductsProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); + this.exportProducts(res.batch + 1, res.totalBatch, res.total, res.updateCount); + } else { + $('#exportProductsProgressBar').css('width', '100%').attr('aria-valuenow', 100); + setTimeout(() => top.location.replace(res.redirectUrl), 1000); + } + } else { + alert('خطا در استخراج محصولات'); + } + }); + }, + + initImportProducts: function() { + $('#hesabix_import_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-import-product-submit'); + $btn.attr('disabled', 'disabled').removeClass('button-primary') + .html(' در حال ورود کالاها از حسابیکس, لطفاً صبر کنید...'); + $('#importProductsProgress').show(); + $('#importProductsProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.importProducts(1, 1, 1, 0); + }); + }, + + importProducts: function(batch, totalBatch, total, updateCount) { + $.post(ajaxurl, { + action: 'adminImportProducts', + batch: batch, + totalBatch: totalBatch, + total: total, + updateCount: updateCount + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + res.batch = parseInt(res.batch); + if (res.batch < res.totalBatch) { + const progress = Math.round((res.batch * 100) / res.totalBatch); + $('#importProductsProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); + this.importProducts(res.batch + 1, res.totalBatch, res.total, res.updateCount); + } else { + $('#importProductsProgressBar').css('width', '100%').attr('aria-valuenow', 100); + setTimeout(() => top.location.replace(res.redirectUrl), 1000); + } + } else { + alert('خطا در وارد کردن محصولات'); + } + }); + }, + + initExportOpeningQuantity: function() { + $('#hesabix_export_products_opening_quantity').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-export-product-opening-quantity-submit'); + $btn.attr('disabled', 'disabled').removeClass('button-primary') + .html(' استخراج موجودی اول دوره...'); + $('#exportProductsOpeningQuantityProgress').show(); + $('#exportProductsOpeningQuantityProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.exportProductsOpeningQuantity(1, 1, 1); + }); + }, + + exportProductsOpeningQuantity: function(batch, totalBatch, total) { + $.post(ajaxurl, { + action: 'adminExportProductsOpeningQuantity', + batch: batch, + totalBatch: totalBatch, + total: total + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + res.batch = parseInt(res.batch); + if (res.batch < res.totalBatch) { + const progress = Math.round((res.batch * 100) / res.totalBatch); + $('#exportProductsOpeningQuantityProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); + this.exportProductsOpeningQuantity(res.batch + 1, res.totalBatch, res.total); + } else { + $('#exportProductsOpeningQuantityProgressBar').css('width', '100%').attr('aria-valuenow', 100); + setTimeout(() => top.location.replace(res.redirectUrl), 1000); + } + } else { + alert('خطا در استخراج موجودی اول دوره'); + } + }); + }, + + initExportCustomers: function() { + $('#hesabix_export_customers').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-export-customer-submit'); + $btn.attr('disabled', 'disabled').removeClass('button-primary') + .html(' خروجی مشتریان، لطفاً صبر کنید...'); + $('#exportCustomersProgress').show(); + $('#exportCustomersProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.exportCustomers(1, 1, 1, 0); + }); + }, + + exportCustomers: function(batch, totalBatch, total, updateCount) { + $.post(ajaxurl, { + action: 'adminExportCustomers', + batch: batch, + totalBatch: totalBatch, + total: total, + updateCount: updateCount + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + res.batch = parseInt(res.batch); + if (res.batch < res.totalBatch) { + const progress = Math.round((res.batch * 100) / res.totalBatch); + $('#exportCustomersProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); + this.exportCustomers(res.batch + 1, res.totalBatch, res.total, res.updateCount); + } else { + $('#exportCustomersProgressBar').css('width', '100%').attr('aria-valuenow', 100); + setTimeout(() => top.location.replace(res.redirectUrl), 1000); + } + } else { + alert('خطا در استخراج مشتریان'); + } + }); + }, + + initSyncOperations: function() { + this.initSyncChanges(); + this.initSyncProducts(); + this.initSyncOrders(); + this.initUpdateCustomers(); + this.initUpdateProducts(); + this.initUpdateWcProducts(); + this.initUpdateProductsWithFilter(); + }, + + initSyncChanges: function() { + $('#hesabix_sync_changes').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-sync-changes-submit'); + const $btnText = $btn.find('.sync-changes-text'); + let $btnLoading = $btn.find('.sync-changes-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.sync-changes-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $btnLoading.show(); + $('#hesabix-sync-overlay').fadeIn(300); + + $.post(ajaxurl, { action: 'adminSyncChanges' }, () => { + $('#hesabix-sync-overlay').fadeOut(300); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + this.loadSyncStats(); + this.showSyncMessage('success', 'همگام‌سازی تغییرات با موفقیت انجام شد.'); + }); + }); + }, + + initSyncProducts: function() { + $('#hesabix_sync_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-sync-products-submit'); + const $btnText = $btn.find('.sync-products-text'); + let $btnLoading = $btn.find('.sync-products-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.sync-products-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $btnLoading.show(); + $('#hesabix-sync-overlay').fadeIn(300); + + $.post(ajaxurl, { + action: 'admin_sync_products', + batch: 1, + totalBatch: 1, + total: 1, + nonce: hesabix_ajax.nonce + }, (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + $('#hesabix-sync-overlay').fadeOut(300); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + this.loadSyncStats(); + if (response && response.success) { + this.showSyncMessage('success', response.message || 'همگام‌سازی قیمت و موجودی با موفقیت انجام شد.'); + } else { + this.showSyncMessage('error', (response && response.message) ? response.message : 'خطا در همگام‌سازی قیمت و موجودی'); + } + }); + }); + }, + + initSyncOrders: function() { + $('#hesabix_sync_orders').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-sync-orders-submit'); + const $btnText = $btn.find('.sync-orders-text'); + let $btnLoading = $btn.find('.sync-orders-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.sync-orders-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $btnLoading.show(); + $('#hesabix-sync-overlay').fadeIn(300); + + const date = $('#hesabix_sync_order_date').val(); + const endDate = $('#hesabix_sync_order_end_date').val(); + + $.post(ajaxurl, { + action: 'admin_sync_orders', + date: date, + endDate: endDate, + batch: 1, + totalBatch: 1, + total: 1, + updateCount: 0 + }, (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + $('#hesabix-sync-overlay').fadeOut(300); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + this.loadSyncStats(); + if (response && response.success) { + this.showSyncMessage('success', response.message || 'همگام‌سازی سفارشات با موفقیت انجام شد.'); + } else { + this.showSyncMessage('error', (response && response.message) ? response.message : 'خطا در همگام‌سازی سفارشات'); + } + }); + }); + }, + + initUpdateCustomers: function() { + $('#hesabix_update_customers').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-update-customers-submit'); + const $btnText = $btn.find('.update-customers-text'); + let $btnLoading = $btn.find('.update-customers-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.update-customers-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $btnLoading.show(); + $('#hesabix-sync-overlay').fadeIn(300); + + $.post(ajaxurl, { + action: 'hesabix_update_customers', + nonce: hesabix_ajax.nonce + }, (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + $('#hesabix-sync-overlay').fadeOut(300); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + this.loadSyncStats(); + if (response && response.success) { + this.showSyncMessage('success', response.data.message || 'بروزرسانی مشتریان حسابیکس با موفقیت انجام شد.'); + } else { + this.showSyncMessage('error', (response && response.data && response.data.message) ? response.data.message : 'خطا در بروزرسانی مشتریان حسابیکس'); + } + }); + }); + }, + + initUpdateProducts: function() { + $('#hesabix_update_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-update-products-submit'); + const $btnText = $btn.find('.update-products-text'); + let $btnLoading = $btn.find('.update-products-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.update-products-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $('#hesabix-sync-overlay').fadeIn(300); + $('#updateProductsProgress').show(); + $('#updateProductsProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.updateProductsAjax(1, 1, 1); + }); + }, + + initUpdateWcProducts: function() { + $('#hesabix_update_wc_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-update-wc-products-submit'); + const $btnText = $btn.find('.update-wc-products-text'); + let $btnLoading = $btn.find('.update-wc-products-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.update-wc-products-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $('#hesabix-sync-overlay').fadeIn(300); + $('#updateWcProductsProgress').show(); + $('#updateWcProductsProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.updateWcProductsAjax(1, 1, 1); + }); + }, + + updateWcProductsAjax: function(batch, totalBatch, total) { + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'admin_update_wc_products', + nonce: hesabix_ajax.nonce, + batch: batch, + totalBatch: totalBatch, + total: total + }, + success: (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + if (response && response.success) { + this.loadSyncStats(); + $('#hesabix-sync-overlay').fadeOut(300); + this.showSyncMessage('success', response.message || 'بروزرسانی محصولات ووکامرس با موفقیت انجام شد.'); + } else { + $('#hesabix-sync-overlay').fadeOut(300); + this.showSyncMessage('error', (response && response.message) ? response.message : 'خطا در بروزرسانی محصولات ووکامرس'); + } + const $btn = $('#hesabix-update-wc-products-submit'); + const $btnText = $btn.find('.update-wc-products-text'); + const $btnLoading = $btn.find('.update-wc-products-loading'); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + $('#updateWcProductsProgress').hide(); + }, + error: (response) => console.log(response) + }); + }, + + updateProductsAjax: function(batch, totalBatch, total) { + $.post(ajaxurl, { + action: 'admin_update_products', + batch: batch, + totalBatch: totalBatch, + total: total + }, (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + if (response && response.success) { + this.loadSyncStats(); + $('#hesabix-sync-overlay').fadeOut(300); + this.showSyncMessage('success', response.message || 'بروزرسانی محصولات با موفقیت انجام شد.'); + } else { + $('#hesabix-sync-overlay').fadeOut(300); + this.showSyncMessage('error', (response && response.message) ? response.message : 'خطا در بروزرسانی محصولات'); + } + const $btn = $('#hesabix-update-products-submit'); + const $btnText = $btn.find('.update-products-text'); + const $btnLoading = $btn.find('.update-products-loading'); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + $('#updateProductsProgress').hide(); + }); + }, + + initUpdateProductsWithFilter: function() { + $('#hesabix_update_products_with_filter').submit((e) => { + e.preventDefault(); + const submitButton = $('#hesabix-update-products-with-filter-submit'); + const offset = document.getElementById("hesabix-update-products-offset").value; + const rpp = document.getElementById("hesabix-update-products-rpp").value; + + submitButton.removeClass('button-primary') + .html(' بروزرسانی محصولات لطفا صبر کنید...') + .attr('disabled', 'disabled'); + + this.updateProductsWithFilter(offset, rpp); + }); + }, + + updateProductsWithFilter: function(offset, rpp) { + if (offset && rpp) { + $.post(ajaxurl, { + action: 'adminUpdateProductsWithFilter', + offset: offset, + rpp: rpp + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + if (!res.error) { + top.location.replace(res.redirectUrl); + } + } else { + alert('خطا در بروزرسانی محصولات'); + } + }); + } else { + alert('فیلد ها را به درستی وارد نمایید'); + const submitButton = $('#hesabix-update-products-with-filter-submit'); + submitButton.addClass('button-primary') + .html('بروزرسانی محصولات در حسابیکس بر اساس فروشگاه در بازه ID مشخص شده') + .removeAttr('disabled'); + } + }, + + showSyncMessage: function(type, message) { + $('.hesabix-sync-message').remove(); + const messageClass = type === 'success' ? 'hesabix-alert-success' : 'hesabix-alert-danger'; + const messageHtml = '
' + + '' + + '' + + '' + message + '
'; + + const $title = $(".hesabix-tab-page-title:contains('همگام‌سازی اطلاعات')"); + if ($title.length) { + $title.before(messageHtml); + $('html, body').animate({ scrollTop: $title.offset().top - 300 }, 500); + } else { + $('body').prepend(messageHtml); + $('html, body').animate({ scrollTop: 0 }, 500); + } + }, + + loadSyncStats: function() { + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_get_sync_stats_ajax', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success && response.data) { + $('#sync-store-products-count').html(response.data.storeProductsCount); + $('#sync-hesabix-products-count').html(response.data.hesabixProductsCount); + $('#sync-linked-products-count').html(response.data.linkedProductsCount); + } else { + $('#sync-store-products-count, #sync-hesabix-products-count, #sync-linked-products-count').html('ارور'); + } + }, + error: () => { + $('#sync-store-products-count, #sync-hesabix-products-count, #sync-linked-products-count').html('ارور'); + } + }); + }, + + initProductOperations: function() { + this.initInvoiceSubmission(); + this.initProductItemOperations(); + this.initPluginDataOperations(); + }, + + initInvoiceSubmission: function() { + $(".btn-submit-invoice").on("click", function() { + const orderId = $(this).attr("data-order-id"); + const btnEl = $('.btn-submit-invoice[data-order-id=' + orderId + ']'); + btnEl.attr('aria-disabled', true).addClass('disabled').html('ثبت فاکتور...'); + HesabixAdmin.submitInvoice(orderId); + }); + }, + + submitInvoice: function(orderId) { + $.post(ajaxurl, { + action: 'adminSubmitInvoice', + orderId: orderId + }, (response) => { + if (response !== 'failed') { + location.reload(); + } else { + alert('خطا در ثبت فاکتور'); + } + }); + }, + + initProductItemOperations: function() { + $(".hesabix-item-save").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + const attributeId = $(this).data('id'); + const code = $("#hesabix-item-" + attributeId).val(); + + $.post(ajaxurl, { + action: 'adminChangeProductCode', + productId: productId, + attributeId: attributeId, + code: code + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + alert(res.error ? res.message : 'کد کالای متصل با موفقیت تغییر کرد.'); + if (productId === attributeId) { + $("#hesabix_hesabix_item_code_0").val(code); + } else { + $("#hesabix_hesabix_item_code_" + attributeId).val(code); + } + } else { + alert('خطا در هنگام تغییر کد کالای متصل.'); + } + }); + $(this).prop('disabled', true); + }); + + $(".hesabix-item-delete-link").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + const attributeId = $(this).data('id'); + + $.post(ajaxurl, { + action: 'adminDeleteProductLink', + productId: productId, + attributeId: attributeId + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + $("#hesabix-item-" + attributeId).val(''); + if (productId === attributeId) { + $("#hesabix_hesabix_item_code_0").val(''); + } else { + $("#hesabix_hesabix_item_code_" + attributeId).val(''); + } + setTimeout(() => { + alert(res.error ? res.message : 'ارتباط محصول با موفقیت حذف شد'); + }, 100); + } else { + alert('خطا در هنگام حذف ارتباط'); + } + }); + $(this).prop('disabled', true); + }); + + $(".hesabix-item-update").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + const attributeId = $(this).data('id'); + + $.post(ajaxurl, { + action: 'adminUpdateProduct', + productId: productId, + attributeId: attributeId + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + if (res.newPrice != null) { + $("#hesabix-item-price-" + attributeId).text(res.newPrice); + } + if (res.newQuantity != null) { + $("#hesabix-item-quantity-" + attributeId).text(res.newQuantity); + } + if (res.error) { + alert(res.message); + } + } else { + alert('خطا در هنگام بروزرسانی محصول'); + } + }); + $(this).prop('disabled', true); + }); + + $("#hesabix-item-save-all").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + const itemsCode = $(".hesabix-item-code"); + const itemsData = []; + + for (let i = 0; i < itemsCode.length; i++) { + const item = itemsCode[i]; + const attributeId = $(item).data('id'); + const code = $(item).val(); + itemsData.push({ attributeId: attributeId, code: code }); + } + + $.post(ajaxurl, { + action: 'adminChangeProductsCode', + productId: productId, + itemsData: itemsData + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + alert(res.error ? res.message : 'کد کالاهای متصل با موفقیت تغییر کرد.'); + location.reload(); + } else { + alert('خطا در هنگام تغییر کد کالاهای متصل'); + } + }); + $(this).prop('disabled', true); + }); + + $("#hesabix-item-delete-link-all").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + + $.post(ajaxurl, { + action: 'adminDeleteProductsLink', + productId: productId + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + const itemsCode = $(".hesabix-item-code"); + for (let i = 0; i < itemsCode.length; i++) { + const item = itemsCode[i]; + $(item).val(''); + } + $('[id^="hesabix_hesabix_item_code_"]').val(''); + setTimeout(() => { + alert(res.error ? res.message : 'ارتباط محصولات با موفقیت حذف شد.'); + }, 100); + } else { + alert('خطا در هنگام حذف ارتباط'); + } + }); + $(this).prop('disabled', true); + }); + + $("#hesabix-item-update-all").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + + $.post(ajaxurl, { + action: 'adminUpdateProductAndVariations', + productId: productId + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + if (res.error) { + alert(res.message); + return; + } + for (let i = 0; i < res.newData.length; i++) { + if (res.newData[i].newPrice != null) { + $("#hesabix-item-price-" + res.newData[i].attributeId).text(res.newData[i].newPrice); + } + if (res.newData[i].newQuantity != null) { + $("#hesabix-item-quantity-" + res.newData[i].attributeId).text(res.newData[i].newQuantity); + } + } + } else { + alert('خطا در هنگام بروزرسانی محصول'); + } + }); + $(this).prop('disabled', true); + }); + }, + + initPluginDataOperations: function() { + $('#hesabix-clear-plugin-data').click(function() { + if (confirm('هشدار: با انجام این عملیات کلیه اطلاعات افزونه شامل روابط بین کالاها، مشتریان و فاکتور ها و همینطور تنظیمات افزونه حذف می گردد. آیا از انجام این عملیات مطمئن هستید؟')) { + $(this).addClass('disabled').html('حذف دیتای افزونه...'); + $.post(ajaxurl, { action: 'adminClearPluginData' }, (response) => { + $(this).removeClass('disabled').html('حذف دیتای افزونه'); + if (response !== 'failed') { + alert('دیتای افزونه با موفقیت حذف شد.'); + } else { + alert('خطا در هنگام حذف دیتای افزونه.'); + } + }); + } + }); + + $('#hesabix-install-plugin-data').click(function() { + if (confirm('با انجام این عملیات جدول افزونه در دیتابیس وردپرس ایجاد و تنظیمات پیش فرض افزونه تنظیم می گردد. آیا از انجام این عملیات مطمئن هستید؟')) { + $(this).addClass('disabled').html('نصب دیتای افزونه...'); + $.post(ajaxurl, { action: 'adminInstallPluginData' }, (response) => { + $(this).removeClass('disabled').html('نصب دیتای افزونه'); + if (response !== 'failed') { + alert('دیتای افزونه با موفقیت نصب شد.'); + } else { + alert('خطا در هنگام نصب دیتای افزونه.'); + } + }); + } + }); + }, + + initSettingsOperations: function() { + this.initApiKeyChange(); + this.initAdditionalFields(); + }, + + initApiKeyChange: function() { + let oldApiKey = ''; + $("#changeBusinessWarning").hide(); + + $("#hesabix_account_api").focusin(function() { + oldApiKey = $("#hesabix_account_api").val(); + }); + + $("#hesabix_account_api").focusout(function() { + const newApiKey = $("#hesabix_account_api").val(); + if (oldApiKey != '' && oldApiKey != newApiKey) { + $("#changeBusinessWarning").show(); + } + }); + }, + + initAdditionalFields: function() { + const radio = $('input:radio[name="addFieldsRadio"]'); + const radioChecked = $('input:radio[name="addFieldsRadio"]:checked'); + const textInput = $('.contact_text_input'); + + if (radioChecked.val() === '2') { + textInput.prop("disabled", false); + } else { + textInput.prop("disabled", true); + } + + $(radio).on('click', function() { + if ($(this).val() === '2') { + textInput.prop("disabled", false); + } else { + textInput.prop("disabled", true); + } + }); + }, + + initApiOperations: function() { + $(document).ready(() => { + $(document).on('click', '#save-api-settings', (e) => { + e.preventDefault(); + this.saveApiSettings(); + }); + $(document).on('click', '#test-connection', (e) => { + e.preventDefault(); + this.testApiConnection(); + }); + $('#hesabix_api_form').on('submit', (e) => { + e.preventDefault(); + this.saveApiSettings(); + }); + }); + }, + + saveApiSettings: function() { + const saveBtn = $('#save-api-settings'); + const originalText = saveBtn.html(); + saveBtn.addClass('loading').prop('disabled', true); + + const formData = { + action: 'adminSaveApiSettings', + nonce: hesabix_ajax.nonce, + api_key: $('#hesabix_account_api').val(), + api_address: $('#hesabix_api_address').val(), + custom_api_address: $('#hesabix_custom_api_address').val() + }; + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData, + success: (response) => { + if (response.success) { + this.showMessage('success', response.data.message); + } else { + this.showMessage('error', response.data.message || 'خطا در ذخیره تنظیمات'); + } + }, + error: () => this.showMessage('error', 'خطا در ارتباط با سرور'), + complete: () => { + saveBtn.removeClass('loading').prop('disabled', false).html(originalText); + } + }); + }, + + testApiConnection: function() { + const testBtn = $('#test-connection'); + const originalText = testBtn.html(); + testBtn.addClass('loading').prop('disabled', true); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'adminTestApiConnection', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + this.showMessage('success', response.data.message); + } else { + this.showMessage('error', response.data.message || 'خطا در بررسی اتصال'); + } + }, + error: () => this.showMessage('error', 'خطا در ارتباط با سرور'), + complete: () => { + testBtn.removeClass('loading').prop('disabled', false).html(originalText); + } + }); + }, + + showMessage: function(type, message) { + $('.hesabix-message').remove(); + const messageClass = type === 'success' ? 'hesabix-alert-success' : 'hesabix-alert-danger'; + const messageHtml = ` +
+
+ ${message} +
+
+ `; + const form = $('#hesabix_api_form'); + if (form.length > 0) { + form.before(messageHtml); + } else { + $('.hesabix-admin').prepend(messageHtml); + } + }, + + initTabSystem: function() { + const $tabs = $('.hesabix-tab'); + const $tabContent = $('.hesabix-tab-content'); + + $tabs.on('click', (e) => { + e.preventDefault(); + const $tab = $(e.currentTarget); + const tabName = $tab.attr('data-tab'); + + if (!$tab.hasClass('active')) { + $tabContent.html('

در حال بارگذاری...

'); + $tabs.removeClass('active'); + $tab.addClass('active'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_load_tab_content', + tab: tabName, + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + $tabContent.html(response.data.content); + this.initStatusSelector(); + this.initFreightSwitch(); + if (tabName === 'api') { + this.initCustomApiAddress(); + } + $(document).trigger('hesabix_content_loaded'); + this.initTabSpecificFunctions(tabName); + } else { + $tabContent.html('
خطا در بارگذاری محتوا
'); + } + }, + error: () => { + $tabContent.html('
خطا در بارگذاری محتوا
'); + } + }); + } + }); + }, + + initTabSpecificFunctions: function(tabName) { + switch(tabName) { + case 'home': + this.loadHomeStats(); + break; + case 'sync': + this.loadSyncStats(); + this.initDateRangeSelector(); + this.initSyncProducts(); + this.initSyncOrders(); + this.initUpdateCustomers(); + this.initUpdateProducts(); + this.initUpdateWcProducts(); + break; + case 'extra': + this.initSaveExtraSettings(); + break; + case 'catalog': + this.initSaveCatalogSettings(); + break; + case 'invoice': + this.initSaveInvoiceSettings(); + break; + case 'customers': + this.initSaveCustomersSettings(); + this.initSaveCustomersFields(); + break; + case 'logs': + this.initLogAjax(); + break; + } + }, + + initStatusSelector: function() { + $('.hesabix-status-selector').each(function() { + const $container = $(this); + const $grid = $container.find('.hesabix-status-grid'); + const $hiddenInput = $container.find('input[type="hidden"]'); + + function updateHiddenInput() { + const selectedValues = []; + $grid.find('.hesabix-status-item.selected input[type="checkbox"]').each(function() { + selectedValues.push($(this).val()); + }); + $hiddenInput.val(selectedValues.join(',')); + } + + $grid.on('click', '.hesabix-status-item', function(e) { + e.preventDefault(); + const $item = $(this); + const $checkbox = $item.find('input[type="checkbox"]'); + + if ($item.hasClass('selected')) { + $item.removeClass('selected'); + $checkbox.prop('checked', false); + } else { + $grid.find('.hesabix-status-item.selected').removeClass('selected'); + $grid.find('input[type="checkbox"]').prop('checked', false); + $item.addClass('selected'); + $checkbox.prop('checked', true); + } + updateHiddenInput(); + }); + updateHiddenInput(); + }); + }, + + initFreightSwitch: function() { + const $freightOptions = $('.hesabix-freight-option'); + let $freightCodeField = $('tr.hesabix-freight-code-field'); + + if ($freightCodeField.length === 0) { + $freightCodeField = $('#hesabix_invoice_freight_code').closest('tr'); + } + if ($freightCodeField.length === 0) { + $freightCodeField = $('tr').filter(function() { + return $(this).find('#hesabix_invoice_freight_code').length > 0; + }); + } + + $freightOptions.on('click', function() { + const $option = $(this); + const value = $option.data('value'); + $freightOptions.removeClass('active'); + $option.addClass('active'); + $('#hesabix_invoice_freight').val(value); + + const valueStr = String(value); + if (valueStr === '1') { + $freightCodeField.removeClass('hidden').addClass('required-field').css('display', 'table-row'); + } else { + $freightCodeField.addClass('hidden').removeClass('required-field').css('display', 'none'); + } + + $option.animate({ scale: 0.95 }, 100).animate({ scale: 1 }, 100); + }); + + const initialValue = $('#hesabix_invoice_freight').val(); + const initialValueStr = String(initialValue); + if (initialValueStr === '1') { + $freightCodeField.removeClass('hidden').addClass('required-field').css('display', 'table-row'); + } else { + $freightCodeField.addClass('hidden').removeClass('required-field').css('display', 'none'); + } + }, + + initCustomApiAddress: function() { + const apiAddressSelect = $('#hesabix_api_address'); + const customAddressField = $('.custom-api-address-field'); + + function toggleCustomField() { + const selectedValue = apiAddressSelect.val(); + if (selectedValue === 'custom') { + customAddressField.addClass('show'); + } else { + customAddressField.removeClass('show'); + } + } + + toggleCustomField(); + apiAddressSelect.on('change', toggleCustomField); + }, + + initSaveExtraSettings: function() { + $('#ajax-save-extra-settings').on('click', (e) => { + e.preventDefault(); + const form = $('#hesabix_extra_form'); + const formData = form.serialize(); + const $btn = $('#ajax-save-extra-settings'); + $btn.addClass('loading').prop('disabled', true); + $('#extra-settings-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData + '&action=hesabix_save_extra_settings_ajax&nonce=' + hesabix_ajax.nonce, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
تنظیمات با موفقیت ذخیره شد.
' : + '
خطا در ذخیره تنظیمات!
'; + $('#extra-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: $('#extra-settings-message').offset().top }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره تنظیمات!
'; + $('#extra-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: $('#extra-settings-message').offset().top }, 500); + } + }); + }); + }, + + initSaveCatalogSettings: function() { + $('#ajax-save-catalog-settings').on('click', (e) => { + e.preventDefault(); + const form = $('#hesabix_catalog_form'); + const formData = form.serialize(); + const $btn = $('#ajax-save-catalog-settings'); + $btn.addClass('loading').prop('disabled', true); + $('#catalog-settings-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData + '&action=hesabix_save_catalog_settings_ajax&nonce=' + hesabix_ajax.nonce, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
تنظیمات با موفقیت ذخیره شد.
' : + '
خطا در ذخیره تنظیمات!
'; + $('#catalog-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره تنظیمات!
'; + $('#catalog-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + } + }); + }); + }, + + initSaveInvoiceSettings: function() { + $('#ajax-save-invoice-settings').on('click', (e) => { + e.preventDefault(); + const form = $('#hesabix_invoice_form'); + const formData = form.serialize(); + const $btn = $('#ajax-save-invoice-settings'); + $btn.addClass('loading').prop('disabled', true); + $('#invoice-settings-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData + '&action=hesabix_save_invoice_settings_ajax&nonce=' + hesabix_ajax.nonce, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
تنظیمات با موفقیت ذخیره شد.
' : + '
خطا در ذخیره تنظیمات!
'; + $('#invoice-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: $('#invoice-settings-message').offset().top }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره تنظیمات!
'; + $('#invoice-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: $('#invoice-settings-message').offset().top }, 500); + } + }); + }); + }, + + initSaveCustomersSettings: function() { + $('#ajax-save-customers-settings').on('click', (e) => { + e.preventDefault(); + const form = $('#hesabix_customers_form'); + const formData = form.serialize(); + const $btn = $('#ajax-save-customers-settings'); + $btn.addClass('loading').prop('disabled', true); + $('#customers-settings-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData + '&action=hesabix_save_customers_settings_ajax&nonce=' + hesabix_ajax.nonce, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
تنظیمات با موفقیت ذخیره شد.
' : + '
خطا در ذخیره تنظیمات!
'; + $('#customers-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره تنظیمات!
'; + $('#customers-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + } + }); + }); + }, + + initSaveCustomersFields: function() { + $('input[name="addFieldsRadio"]').on('change', function() { + const selectedValue = $(this).val(); + const $fieldsTable = $('.hesabix-table-container'); + const $fieldInputs = $fieldsTable.find('input[type="checkbox"], input[type="text"]'); + + if (selectedValue === '2') { + $fieldInputs.prop('disabled', true); + $fieldsTable.addClass('disabled-fields'); + } else { + $fieldInputs.prop('disabled', false); + $fieldsTable.removeClass('disabled-fields'); + } + }); + + const currentSelection = $('input[name="addFieldsRadio"]:checked').val(); + if (currentSelection === '2') { + const $fieldsTable = $('.hesabix-table-container'); + const $fieldInputs = $fieldsTable.find('input[type="checkbox"], input[type="text"]'); + $fieldInputs.prop('disabled', true); + $fieldsTable.addClass('disabled-fields'); + } + + $('#ajax-save-customers-fields').on('click', (e) => { + e.preventDefault(); + const formData = new FormData(); + const radioValue = $('input[name="addFieldsRadio"]:checked').val(); + formData.append('addFieldsRadio', radioValue); + + const nationalCodeCheck = $('#nationalCodeCheck').is(':checked') ? 'yes' : 'no'; + const nationalCodeRequired = $('#nationalCodeRequired').is(':checked') ? 'yes' : 'no'; + const nationalCode = $('#nationalCode').val(); + formData.append('nationalCodeCheck', nationalCodeCheck); + formData.append('nationalCodeRequired', nationalCodeRequired); + formData.append('nationalCode', nationalCode); + + const economicCodeCheck = $('#economicCodeCheck').is(':checked') ? 'yes' : 'no'; + const economicCodeRequired = $('#economicCodeRequired').is(':checked') ? 'yes' : 'no'; + const economicCode = $('#economicCode').val(); + formData.append('economicCodeCheck', economicCodeCheck); + formData.append('economicCodeRequired', economicCodeRequired); + formData.append('economicCode', economicCode); + + const registrationNumberCheck = $('#registrationNumberCheck').is(':checked') ? 'yes' : 'no'; + const registrationNumberRequired = $('#registrationNumberRequired').is(':checked') ? 'yes' : 'no'; + const registrationNumber = $('#registrationNumber').val(); + formData.append('registrationNumberCheck', registrationNumberCheck); + formData.append('registrationNumberRequired', registrationNumberRequired); + formData.append('registrationNumber', registrationNumber); + + const websiteCheck = $('#websiteCheck').is(':checked') ? 'yes' : 'no'; + const websiteRequired = $('#websiteRequired').is(':checked') ? 'yes' : 'no'; + const website = $('#website').val(); + formData.append('websiteCheck', websiteCheck); + formData.append('websiteRequired', websiteRequired); + formData.append('website', website); + + formData.append('action', 'hesabix_save_customers_fields_ajax'); + formData.append('nonce', hesabix_ajax.nonce); + + const $btn = $('#ajax-save-customers-fields'); + $btn.addClass('loading').prop('disabled', true); + $('#customers-fields-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData, + processData: false, + contentType: false, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
فیلدهای اضافی با موفقیت ذخیره شد.
' : + '
خطا در ذخیره فیلدهای اضافی!
'; + $('#customers-fields-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره فیلدهای اضافی!
'; + $('#customers-fields-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + } + }); + }); + }, + + initLogAjax: function() { + this.initGetLogFile(); + this.initDeleteLogFile(); + this.initDeleteAllLogs(); + }, + + initGetLogFile: function() { + $('#get-log-file').on('click', (e) => { + e.preventDefault(); + const $btn = $(e.currentTarget); + const originalText = $btn.html(); + $btn.prop('disabled', true).html('در حال بارگذاری...'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_get_log_file_ajax', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + $('#log-content').html(response.data.content); + $('#log-modal').show(); + } else { + alert('خطا در بارگذاری فایل لاگ'); + } + }, + error: () => alert('خطا در بارگذاری فایل لاگ'), + complete: () => { + $btn.prop('disabled', false).html(originalText); + } + }); + }); + }, + + initDeleteLogFile: function() { + $('#delete-log-file').on('click', (e) => { + e.preventDefault(); + if (confirm('آیا از حذف فایل لاگ اطمینان دارید؟')) { + const $btn = $(e.currentTarget); + const originalText = $btn.html(); + $btn.prop('disabled', true).html('در حال حذف...'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_delete_log_file_ajax', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + alert('فایل لاگ با موفقیت حذف شد'); + location.reload(); + } else { + alert('خطا در حذف فایل لاگ'); + } + }, + error: () => alert('خطا در حذف فایل لاگ'), + complete: () => { + $btn.prop('disabled', false).html(originalText); + } + }); + } + }); + }, + + initDeleteAllLogs: function() { + $('#delete-all-logs').on('click', (e) => { + e.preventDefault(); + if (confirm('آیا از حذف تمام فایل‌های لاگ اطمینان دارید؟')) { + const $btn = $(e.currentTarget); + const originalText = $btn.html(); + $btn.prop('disabled', true).html('در حال حذف...'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_delete_all_logs_ajax', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + alert('تمام فایل‌های لاگ با موفقیت حذف شدند'); + location.reload(); + } else { + alert('خطا در حذف فایل‌های لاگ'); + } + }, + error: () => alert('خطا در حذف فایل‌های لاگ'), + complete: () => { + $btn.prop('disabled', false).html(originalText); + } + }); + } + }); + }, + + initDateRangeSelector: function() { + const $form = $('#hesabix_sync_orders'); + const $presetBtns = $('.hesabix-date-preset-btn'); + const $customContainer = $('.hesabix-date-range-container'); + const $selectedRange = $('.hesabix-selected-range'); + const $rangeDisplay = $('#hesabix-range-display'); + const $submitBtn = $('#hesabix-sync-orders-submit'); + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const $validationMsg = $('.hesabix-date-validation-message'); + + if ($startDate.length === 0 || $endDate.length === 0) return; + + this.setPresetRange(7); + $presetBtns.filter('[data-days="7"]').addClass('active'); + + $presetBtns.on('click', (e) => { + e.preventDefault(); + const $btn = $(e.currentTarget); + $presetBtns.removeClass('active'); + $btn.addClass('active'); + + if ($btn.data('custom')) { + this.showCustomRange(); + } else { + const days = parseInt($btn.data('days')); + this.setPresetRange(days); + this.hideCustomRange(); + } + }); + + $startDateJalali.add($endDateJalali).on('input', (e) => { + const $input = $(e.target); + const value = $input.val(); + + if (value.length === 10 && /^\d{4}\/\d{2}\/\d{2}$/.test(value)) { + const gregorianDate = this.jalaliDateToGregorian(value); + if (gregorianDate) { + const isStartDate = $input.attr('id').includes('start'); + const targetInput = isStartDate ? $startDate : $endDate; + targetInput.val(this.formatDateForInput(gregorianDate)); + this.validateDateRange(); + this.updateRangeDisplay(); + } + } + }); + + $startDateJalali.add($endDateJalali).on('blur', (e) => { + const $input = $(e.target); + const value = $input.val(); + + if (value && !/^\d{4}\/\d{2}\/\d{2}$/.test(value)) { + $input.addClass('error'); + } else { + $input.removeClass('error'); + } + }); + + $form.on('submit', (e) => { + if (!this.validateDateRange()) { + e.preventDefault(); + alert('Please select a valid date range before synchronizing orders.'); + return false; + } + }); + + setTimeout(() => { + this.updateRangeDisplay(); + this.showSelectedRange(); + }, 100); + }, + + setPresetRange: function(days) { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const endDate = new Date(); + const startDate = new Date(); + startDate.setDate(endDate.getDate() - days); + + $startDate.val(this.formatDateForInput(startDate)); + $endDate.val(this.formatDateForInput(endDate)); + $startDateJalali.val(this.formatJalaliDateShort(startDate)); + $endDateJalali.val(this.formatJalaliDateShort(endDate)); + + this.updateRangeDisplay(); + this.enableSubmitButton(); + this.showSelectedRange(); + }, + + showCustomRange: function() { + $('.hesabix-date-range-container').slideDown(300); + $('#hesabix_sync_order_date').focus(); + this.validateDateRange(); + }, + + hideCustomRange: function() { + $('.hesabix-date-range-container').slideUp(300); + this.clearValidation(); + }, + + validateDateRange: function() { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const $validationMsg = $('.hesabix-date-validation-message'); + const $submitBtn = $('#hesabix-sync-orders-submit'); + const $selectedRange = $('.hesabix-selected-range'); + + const startVal = $startDate.val(); + const endVal = $endDate.val(); + + if (!startVal || !endVal) { + this.disableSubmitButton(); + this.hideSelectedRange(); + return false; + } + + const startDate = new Date(startVal); + const endDate = new Date(endVal); + + if (startDate >= endDate) { + this.showValidationError(); + this.disableSubmitButton(); + this.hideSelectedRange(); + return false; + } + + this.clearValidation(); + this.enableSubmitButton(); + this.showSelectedRange(); + return true; + }, + + showValidationError: function() { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const $validationMsg = $('.hesabix-date-validation-message'); + + $startDate.add($endDate).addClass('error'); + $startDateJalali.add($endDateJalali).addClass('error'); + $validationMsg.slideDown(200); + }, + + clearValidation: function() { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const $validationMsg = $('.hesabix-date-validation-message'); + + $startDate.add($endDate).removeClass('error'); + $startDateJalali.add($endDateJalali).removeClass('error'); + $validationMsg.slideUp(200); + }, + + updateRangeDisplay: function() { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $rangeDisplay = $('#hesabix-range-display'); + + const startVal = $startDate.val(); + const endVal = $endDate.val(); + + if (startVal && endVal) { + const startDate = new Date(startVal); + const endDate = new Date(endVal); + + if (startDate < endDate) { + const formattedStart = this.formatDateForDisplay(startDate); + const formattedEnd = this.formatDateForDisplay(endDate); + const daysDiff = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24)); + + $rangeDisplay.html(`${formattedStart} - ${formattedEnd} (${daysDiff} روز)`); + } + } + }, + + showSelectedRange: function() { + const $selectedRange = $('.hesabix-selected-range'); + if (!$selectedRange.is(':visible')) { + $selectedRange.slideDown(300); + } + }, + + hideSelectedRange: function() { + $('.hesabix-selected-range').slideUp(300); + }, + + enableSubmitButton: function() { + $('#hesabix-sync-orders-submit').prop('disabled', false).removeClass('disabled'); + }, + + disableSubmitButton: function() { + $('#hesabix-sync-orders-submit').prop('disabled', true).addClass('disabled'); + }, + + formatDateForInput: function(date) { + return date.getFullYear() + '-' + + String(date.getMonth() + 1).padStart(2, '0') + '-' + + String(date.getDate()).padStart(2, '0'); + }, + + formatDateForDisplay: function(date) { + return this.formatJalaliDate(date); + } + }; + + window.loadHomeStats = HesabixAdmin.loadHomeStats.bind(HesabixAdmin); + window.checkHesabixUpdate = HesabixAdmin.checkHesabixUpdate.bind(HesabixAdmin); + window.loadSyncStats = HesabixAdmin.loadSyncStats.bind(HesabixAdmin); + window.hesabix_load_tab_content = HesabixAdmin.initTabSystem.bind(HesabixAdmin); + + HesabixAdmin.init(); +}); + +function hesabixTutorialJumpTo(time) { + const vidEl = document.getElementById('hesabix-tutorial-video'); + vidEl.play(); + vidEl.pause(); + vidEl.currentTime = time; + vidEl.play(); +} \ No newline at end of file diff --git a/assets/js/hesabix.js b/assets/js/hesabix.js new file mode 100644 index 0000000..54affca --- /dev/null +++ b/assets/js/hesabix.js @@ -0,0 +1,1875 @@ +/* + * Hesabix Admin JavaScript + * + * @package Hesabix + * @author Mohammad Rezai + * @author URI https://pirouz.xyz + * @since 1.0.0 + */ + +jQuery(function($) { + 'use strict'; + + const HesabixAdmin = { + jalaliMonths: ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'], + + gregorianToJalali: function(gy, gm, gd) { + const g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; + let jy = (gy <= 1600) ? 0 : 979; + gy -= (gy <= 1600) ? 621 : 1600; + let gy2 = (gm > 2) ? (gy + 1) : gy; + let days = (365 * gy) + parseInt((gy2 + 3) / 4) - parseInt((gy2 + 99) / 100) + parseInt((gy2 + 399) / 400) - 80 + gd + g_d_m[gm - 1]; + jy += 33 * parseInt(days / 12053); + days %= 12053; + jy += 4 * parseInt(days / 1461); + days %= 1461; + jy += parseInt((days - 1) / 365); + if (days > 365) days = (days - 1) % 365; + let jm = (days < 186) ? 1 + parseInt(days / 31) : 7 + parseInt((days - 186) / 30); + let jd = 1 + ((days < 186) ? (days % 31) : ((days - 186) % 30)); + return [jy, jm, jd]; + }, + + jalaliToGregorian: function(jy, jm, jd) { + let gy = (jy <= 979) ? 621 : 1600; + jy -= (jy <= 979) ? 0 : 979; + let gy2 = (jm > 2) ? (jy + 1) : jy; + let days = (365 * jy) + parseInt((jy + 3) / 4) - parseInt((jy + 99) / 100) + parseInt((jy + 399) / 400) + 80 + jd + ((jm < 7) ? (jm - 1) * 31 : ((jm - 7) * 30) + 186); + gy += 400 * parseInt(days / 146097); + days %= 146097; + if (days > 36524) { + gy += 100 * parseInt(--days / 36524); + days %= 36524; + if (days >= 365) days++; + } + gy += 4 * parseInt(days / 1461); + days %= 1461; + if (days > 365) { + gy += parseInt((days - 1) / 365); + days = (days - 1) % 365; + } + let gd = days + 1; + let sal_a = [0, 31, ((gy % 4 == 0 && gy % 100 != 0) || (gy % 400 == 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + let gm; + for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) gd -= sal_a[gm]; + return [gy, gm, gd]; + }, + + formatJalaliDate: function(date) { + const jalali = this.gregorianToJalali(date.getFullYear(), date.getMonth() + 1, date.getDate()); + const monthName = this.jalaliMonths[jalali[1] - 1]; + return `${jalali[2]} ${monthName} ${jalali[0]}`; + }, + + formatJalaliDateShort: function(date) { + const jalali = this.gregorianToJalali(date.getFullYear(), date.getMonth() + 1, date.getDate()); + return `${jalali[0]}/${String(jalali[1]).padStart(2, '0')}/${String(jalali[2]).padStart(2, '0')}`; + }, + + jalaliDateToGregorian: function(jalaliString) { + const parts = jalaliString.split('/'); + if (parts.length !== 3) return null; + + const jy = parseInt(parts[0]); + const jm = parseInt(parts[1]); + const jd = parseInt(parts[2]); + + if (isNaN(jy) || isNaN(jm) || isNaN(jd)) return null; + + const gregorian = this.jalaliToGregorian(jy, jm, jd); + return new Date(gregorian[0], gregorian[1] - 1, gregorian[2]); + }, + + init: function() { + this.initHomeStats(); + this.initUpdateChecker(); + this.initExportImport(); + this.initSyncOperations(); + this.initProductOperations(); + this.initSettingsOperations(); + this.initApiOperations(); + this.initTabSystem(); + this.initStatusSelector(); + this.initFreightSwitch(); + this.initCustomApiAddress(); + }, + + initHomeStats: function() { + if ($('#hesabix-stats-container').length > 0) { + this.loadHomeStats(); + } + }, + + initUpdateChecker: function() { + if (document.querySelectorAll('#hesabix-check-update').length > 0) { + setTimeout(() => this.checkHesabixUpdate(), 1000); + } + }, + + loadHomeStats: function() { + const $iconContainer = $('#hesabix-home-connection-card .hesabix-feature-icon'); + $iconContainer.find('svg').remove(); + if ($iconContainer.find('.hesabix-spinner-small').length === 0) { + $iconContainer.append(''); + } + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'admin_get_home_stats', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + this.renderStats(response.data); + } else { + this.showStatsError(); + } + }, + error: () => this.showStatsError() + }); + }, + + renderStats: function(data) { + $('#hesabix-home-products-count').text(data.products_count); + $('#hesabix-home-products-label').text(data.products_label); + $('#hesabix-home-customers-count').text(data.customers_count); + $('#hesabix-home-customers-label').text(data.customers_label); + $('#hesabix-home-orders-count').text(data.orders_count); + $('#hesabix-home-orders-label').text(data.orders_label); + + const $iconContainer = $('#hesabix-home-connection-card .hesabix-feature-icon'); + $iconContainer.find('.hesabix-spinner-small').remove(); + if ($iconContainer.find('svg').length === 0) { + $iconContainer.append(''); + } + + const connectionClass = data.is_connected ? 'connected' : 'not-connected'; + $('#hesabix-home-connection-card').removeClass('connected not-connected').addClass(connectionClass); + + const connectionIcon = data.is_connected ? + 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z' : + 'M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z'; + + $('#hesabix-home-connection-icon').attr('d', connectionIcon); + $('#hesabix-home-connection-text').text(data.connected_text); + $('#hesabix-home-status-label').text(data.status_label); + }, + + showStatsError: function() { + $('#hesabix-home-products-count').html('خطا'); + $('#hesabix-home-products-label').text('محصولات'); + $('#hesabix-home-customers-count').html('خطا'); + $('#hesabix-home-customers-label').text('مشتریان'); + $('#hesabix-home-orders-count').html('خطا'); + $('#hesabix-home-orders-label').text('سفارشات'); + $('#hesabix-home-connection-card').removeClass('connected not-connected'); + $('#hesabix-home-connection-icon').attr('d', ''); + $('#hesabix-home-connection-text').html('خطا'); + $('#hesabix-home-status-label').text('وضعیت اتصال'); + }, + + checkHesabixUpdate: function() { + const updateButtons = document.querySelectorAll('#hesabix-check-update'); + updateButtons.forEach(el => { + const btn = $(el); + btn.prop('disabled', true); + btn.find('.update-text').hide(); + btn.find('.update-loading').show(); + }); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'admin_check_for_updates', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + this.showUpdateResult(response.data); + } else { + this.showUpdateError(response.message); + } + }, + error: () => this.showUpdateError('خطا در بررسی بروزرسانی'), + complete: () => { + updateButtons.forEach(el => { + const btn = $(el); + btn.prop('disabled', false); + btn.find('.update-text').show(); + btn.find('.update-loading').hide(); + }); + } + }); + }, + + showUpdateResult: function(data) { + const updateButtons = document.querySelectorAll('#hesabix-check-update'); + updateButtons.forEach(el => { + const btn = $(el); + if (data.is_update_available) { + btn.removeClass('hesabix-update-badge').addClass('hesabix-badge warning'); + btn.html(` + + + + + نسخه جدید ${data.latest_version} موجود است + + `); + btn.attr('onclick', `window.open('${data.download_url}', '_blank')`); + this.showUpdateNotification(data); + } else { + btn.removeClass('hesabix-update-badge').addClass('hesabix-badge status'); + btn.html(` + + + + + نسخه فعلی بروز است + + `); + btn.removeAttr('onclick'); + } + }); + }, + + showUpdateError: function(message) { + const updateButtons = document.querySelectorAll('#hesabix-check-update'); + updateButtons.forEach(el => { + const btn = $(el); + btn.removeClass('hesabix-update-badge').addClass('hesabix-badge danger'); + btn.html(` + + + + + ${message} + + `); + btn.removeAttr('onclick'); + }); + }, + + showUpdateNotification: function(data) { + const notification = $(` +
+
+

نسخه جدید موجود است!

+ +
+

+ نسخه ${data.latest_version} از پلاگین حسابیکس منتشر شده است. + نسخه فعلی شما: ${data.current_version} +

+
+ + +
+
+ `); + + notification.find('.hesabix-notification-close').on('click', () => { + notification.fadeOut(() => notification.remove()); + }); + + $('body').append(notification); + setTimeout(() => { + notification.fadeOut(() => notification.remove()); + }, 10000); + }, + + initExportImport: function() { + this.initExportProducts(); + this.initImportProducts(); + this.initExportOpeningQuantity(); + this.initExportCustomers(); + }, + + initExportProducts: function() { + $('#hesabix_export_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-export-product-submit'); + $btn.attr('disabled', 'disabled').removeClass('button-primary') + .html(' خروج محصولات...'); + $('#exportProductsProgress').show(); + $('#exportProductsProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.exportProducts(1, 1, 1, 0); + }); + }, + + exportProducts: function(batch, totalBatch, total, updateCount) { + $.post(ajaxurl, { + action: 'adminExportProducts', + batch: batch, + totalBatch: totalBatch, + total: total, + updateCount: updateCount + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + res.batch = parseInt(res.batch); + if (res.batch < res.totalBatch) { + const progress = Math.round((res.batch * 100) / res.totalBatch); + $('#exportProductsProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); + this.exportProducts(res.batch + 1, res.totalBatch, res.total, res.updateCount); + } else { + $('#exportProductsProgressBar').css('width', '100%').attr('aria-valuenow', 100); + setTimeout(() => top.location.replace(res.redirectUrl), 1000); + } + } else { + alert('خطا در استخراج محصولات'); + } + }); + }, + + initImportProducts: function() { + $('#hesabix_import_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-import-product-submit'); + $btn.attr('disabled', 'disabled').removeClass('button-primary') + .html(' در حال ورود کالاها از حسابیکس, لطفاً صبر کنید...'); + $('#importProductsProgress').show(); + $('#importProductsProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.importProducts(1, 1, 1, 0); + }); + }, + + importProducts: function(batch, totalBatch, total, updateCount) { + $.post(ajaxurl, { + action: 'adminImportProducts', + batch: batch, + totalBatch: totalBatch, + total: total, + updateCount: updateCount + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + res.batch = parseInt(res.batch); + if (res.batch < res.totalBatch) { + const progress = Math.round((res.batch * 100) / res.totalBatch); + $('#importProductsProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); + this.importProducts(res.batch + 1, res.totalBatch, res.total, res.updateCount); + } else { + $('#importProductsProgressBar').css('width', '100%').attr('aria-valuenow', 100); + setTimeout(() => top.location.replace(res.redirectUrl), 1000); + } + } else { + alert('خطا در وارد کردن محصولات'); + } + }); + }, + + initExportOpeningQuantity: function() { + $('#hesabix_export_products_opening_quantity').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-export-product-opening-quantity-submit'); + $btn.attr('disabled', 'disabled').removeClass('button-primary') + .html(' استخراج موجودی اول دوره...'); + $('#exportProductsOpeningQuantityProgress').show(); + $('#exportProductsOpeningQuantityProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.exportProductsOpeningQuantity(1, 1, 1); + }); + }, + + exportProductsOpeningQuantity: function(batch, totalBatch, total) { + $.post(ajaxurl, { + action: 'adminExportProductsOpeningQuantity', + batch: batch, + totalBatch: totalBatch, + total: total + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + res.batch = parseInt(res.batch); + if (res.batch < res.totalBatch) { + const progress = Math.round((res.batch * 100) / res.totalBatch); + $('#exportProductsOpeningQuantityProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); + this.exportProductsOpeningQuantity(res.batch + 1, res.totalBatch, res.total); + } else { + $('#exportProductsOpeningQuantityProgressBar').css('width', '100%').attr('aria-valuenow', 100); + setTimeout(() => top.location.replace(res.redirectUrl), 1000); + } + } else { + alert('خطا در استخراج موجودی اول دوره'); + } + }); + }, + + initExportCustomers: function() { + $('#hesabix_export_customers').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-export-customer-submit'); + $btn.attr('disabled', 'disabled').removeClass('button-primary') + .html(' خروجی مشتریان، لطفاً صبر کنید...'); + $('#exportCustomersProgress').show(); + $('#exportCustomersProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.exportCustomers(1, 1, 1, 0); + }); + }, + + exportCustomers: function(batch, totalBatch, total, updateCount) { + $.post(ajaxurl, { + action: 'adminExportCustomers', + batch: batch, + totalBatch: totalBatch, + total: total, + updateCount: updateCount + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + res.batch = parseInt(res.batch); + if (res.batch < res.totalBatch) { + const progress = Math.round((res.batch * 100) / res.totalBatch); + $('#exportCustomersProgressBar').css('width', progress + '%').attr('aria-valuenow', progress); + this.exportCustomers(res.batch + 1, res.totalBatch, res.total, res.updateCount); + } else { + $('#exportCustomersProgressBar').css('width', '100%').attr('aria-valuenow', 100); + setTimeout(() => top.location.replace(res.redirectUrl), 1000); + } + } else { + alert('خطا در استخراج مشتریان'); + } + }); + }, + + initSyncOperations: function() { + this.initSyncChanges(); + this.initSyncProducts(); + this.initSyncOrders(); + this.initUpdateCustomers(); + this.initUpdateProducts(); + this.initUpdateWcProducts(); + this.initUpdateProductsWithFilter(); + }, + + initSyncChanges: function() { + $('#hesabix_sync_changes').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-sync-changes-submit'); + const $btnText = $btn.find('.sync-changes-text'); + let $btnLoading = $btn.find('.sync-changes-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.sync-changes-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $btnLoading.show(); + $('#hesabix-sync-overlay').fadeIn(300); + + $.post(ajaxurl, { action: 'adminSyncChanges' }, () => { + $('#hesabix-sync-overlay').fadeOut(300); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + this.loadSyncStats(); + this.showSyncMessage('success', 'همگام‌سازی تغییرات با موفقیت انجام شد.'); + }); + }); + }, + + initSyncProducts: function() { + $('#hesabix_sync_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-sync-products-submit'); + const $btnText = $btn.find('.sync-products-text'); + let $btnLoading = $btn.find('.sync-products-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.sync-products-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $btnLoading.show(); + $('#hesabix-sync-overlay').fadeIn(300); + + $.post(ajaxurl, { + action: 'admin_sync_products', + batch: 1, + totalBatch: 1, + total: 1, + nonce: hesabix_ajax.nonce + }, (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + $('#hesabix-sync-overlay').fadeOut(300); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + this.loadSyncStats(); + if (response && response.success) { + this.showSyncMessage('success', response.message || 'همگام‌سازی قیمت و موجودی با موفقیت انجام شد.'); + } else { + this.showSyncMessage('error', (response && response.message) ? response.message : 'خطا در همگام‌سازی قیمت و موجودی'); + } + }); + }); + }, + + initSyncOrders: function() { + $('#hesabix_sync_orders').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-sync-orders-submit'); + const $btnText = $btn.find('.sync-orders-text'); + let $btnLoading = $btn.find('.sync-orders-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.sync-orders-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $btnLoading.show(); + $('#hesabix-sync-overlay').fadeIn(300); + + const date = $('#hesabix_sync_order_date').val(); + const endDate = $('#hesabix_sync_order_end_date').val(); + + $.post(ajaxurl, { + action: 'admin_sync_orders', + date: date, + endDate: endDate, + batch: 1, + totalBatch: 1, + total: 1, + updateCount: 0 + }, (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + $('#hesabix-sync-overlay').fadeOut(300); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + this.loadSyncStats(); + if (response && response.success) { + this.showSyncMessage('success', response.message || 'همگام‌سازی سفارشات با موفقیت انجام شد.'); + } else { + this.showSyncMessage('error', (response && response.message) ? response.message : 'خطا در همگام‌سازی سفارشات'); + } + }); + }); + }, + + initUpdateCustomers: function() { + $('#hesabix_update_customers').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-update-customers-submit'); + const $btnText = $btn.find('.update-customers-text'); + let $btnLoading = $btn.find('.update-customers-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.update-customers-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $btnLoading.show(); + $('#hesabix-sync-overlay').fadeIn(300); + + $.post(ajaxurl, { + action: 'hesabix_update_customers', + nonce: hesabix_ajax.nonce + }, (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + $('#hesabix-sync-overlay').fadeOut(300); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + this.loadSyncStats(); + if (response && response.success) { + this.showSyncMessage('success', response.data.message || 'بروزرسانی مشتریان حسابیکس با موفقیت انجام شد.'); + } else { + this.showSyncMessage('error', (response && response.data && response.data.message) ? response.data.message : 'خطا در بروزرسانی مشتریان حسابیکس'); + } + }); + }); + }, + + initUpdateProducts: function() { + $('#hesabix_update_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-update-products-submit'); + const $btnText = $btn.find('.update-products-text'); + let $btnLoading = $btn.find('.update-products-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.update-products-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $('#hesabix-sync-overlay').fadeIn(300); + $('#updateProductsProgress').show(); + $('#updateProductsProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.updateProductsAjax(1, 1, 1); + }); + }, + + initUpdateWcProducts: function() { + $('#hesabix_update_wc_products').submit((e) => { + e.preventDefault(); + const $btn = $('#hesabix-update-wc-products-submit'); + const $btnText = $btn.find('.update-wc-products-text'); + let $btnLoading = $btn.find('.update-wc-products-loading'); + + if ($btnLoading.length === 0) { + $btn.append(''); + $btnLoading = $btn.find('.update-wc-products-loading'); + } + + $btn.attr('disabled', 'disabled'); + $btnText.hide(); + $('#hesabix-sync-overlay').fadeIn(300); + $('#updateWcProductsProgress').show(); + $('#updateWcProductsProgressBar').css('width', '0%').attr('aria-valuenow', 0); + this.updateWcProductsAjax(1, 1, 1); + }); + }, + + updateWcProductsAjax: function(batch, totalBatch, total) { + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'admin_update_wc_products', + nonce: hesabix_ajax.nonce, + batch: batch, + totalBatch: totalBatch, + total: total + }, + success: (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + if (response && response.success) { + this.loadSyncStats(); + $('#hesabix-sync-overlay').fadeOut(300); + this.showSyncMessage('success', response.message || 'بروزرسانی محصولات ووکامرس با موفقیت انجام شد.'); + } else { + $('#hesabix-sync-overlay').fadeOut(300); + this.showSyncMessage('error', (response && response.message) ? response.message : 'خطا در بروزرسانی محصولات ووکامرس'); + } + const $btn = $('#hesabix-update-wc-products-submit'); + const $btnText = $btn.find('.update-wc-products-text'); + const $btnLoading = $btn.find('.update-wc-products-loading'); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + $('#updateWcProductsProgress').hide(); + }, + error: (response) => console.log(response) + }); + }, + + updateProductsAjax: function(batch, totalBatch, total) { + $.post(ajaxurl, { + action: 'admin_update_products', + batch: batch, + totalBatch: totalBatch, + total: total + }, (response) => { + if (typeof response === 'string') { + try { response = JSON.parse(response); } catch (e) { } + } + if (response && response.success) { + this.loadSyncStats(); + $('#hesabix-sync-overlay').fadeOut(300); + this.showSyncMessage('success', response.message || 'بروزرسانی محصولات با موفقیت انجام شد.'); + } else { + $('#hesabix-sync-overlay').fadeOut(300); + this.showSyncMessage('error', (response && response.message) ? response.message : 'خطا در بروزرسانی محصولات'); + } + const $btn = $('#hesabix-update-products-submit'); + const $btnText = $btn.find('.update-products-text'); + const $btnLoading = $btn.find('.update-products-loading'); + $btn.removeAttr('disabled'); + $btnLoading.hide(); + $btnText.show(); + $('#updateProductsProgress').hide(); + }); + }, + + initUpdateProductsWithFilter: function() { + $('#hesabix_update_products_with_filter').submit((e) => { + e.preventDefault(); + const submitButton = $('#hesabix-update-products-with-filter-submit'); + const offset = document.getElementById("hesabix-update-products-offset").value; + const rpp = document.getElementById("hesabix-update-products-rpp").value; + + submitButton.removeClass('button-primary') + .html(' بروزرسانی محصولات لطفا صبر کنید...') + .attr('disabled', 'disabled'); + + this.updateProductsWithFilter(offset, rpp); + }); + }, + + updateProductsWithFilter: function(offset, rpp) { + if (offset && rpp) { + $.post(ajaxurl, { + action: 'adminUpdateProductsWithFilter', + offset: offset, + rpp: rpp + }, (response) => { + if (response !== 'failed') { + const res = JSON.parse(response); + if (!res.error) { + top.location.replace(res.redirectUrl); + } + } else { + alert('خطا در بروزرسانی محصولات'); + } + }); + } else { + alert('فیلد ها را به درستی وارد نمایید'); + const submitButton = $('#hesabix-update-products-with-filter-submit'); + submitButton.addClass('button-primary') + .html('بروزرسانی محصولات در حسابیکس بر اساس فروشگاه در بازه ID مشخص شده') + .removeAttr('disabled'); + } + }, + + showSyncMessage: function(type, message) { + $('.hesabix-sync-message').remove(); + const messageClass = type === 'success' ? 'hesabix-alert-success' : 'hesabix-alert-danger'; + const messageHtml = '
' + + '' + + '' + + '' + message + '
'; + + const $title = $(".hesabix-tab-page-title:contains('همگام‌سازی اطلاعات')"); + if ($title.length) { + $title.before(messageHtml); + $('html, body').animate({ scrollTop: $title.offset().top - 300 }, 500); + } else { + $('body').prepend(messageHtml); + $('html, body').animate({ scrollTop: 0 }, 500); + } + }, + + loadSyncStats: function() { + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_get_sync_stats_ajax', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success && response.data) { + $('#sync-store-products-count').html(response.data.storeProductsCount); + $('#sync-hesabix-products-count').html(response.data.hesabixProductsCount); + $('#sync-linked-products-count').html(response.data.linkedProductsCount); + } else { + $('#sync-store-products-count, #sync-hesabix-products-count, #sync-linked-products-count').html('ارور'); + } + }, + error: () => { + $('#sync-store-products-count, #sync-hesabix-products-count, #sync-linked-products-count').html('ارور'); + } + }); + }, + + initProductOperations: function() { + this.initInvoiceSubmission(); + this.initProductItemOperations(); + this.initPluginDataOperations(); + }, + + initInvoiceSubmission: function() { + $(".btn-submit-invoice").on("click", function() { + const orderId = $(this).attr("data-order-id"); + const btnEl = $('.btn-submit-invoice[data-order-id=' + orderId + ']'); + btnEl.attr('aria-disabled', true).addClass('disabled').html('ثبت فاکتور...'); + HesabixAdmin.submitInvoice(orderId); + }); + }, + + submitInvoice: function(orderId) { + $.post(ajaxurl, { + action: 'adminSubmitInvoice', + orderId: orderId + }, (response) => { + if (response !== 'failed') { + location.reload(); + } else { + alert('خطا در ثبت فاکتور'); + } + }); + }, + + initProductItemOperations: function() { + $(".hesabix-item-save").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + const attributeId = $(this).data('id'); + const code = $("#hesabix-item-" + attributeId).val(); + + $.post(ajaxurl, { + action: 'adminChangeProductCode', + productId: productId, + attributeId: attributeId, + code: code + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + alert(res.error ? res.message : 'کد کالای متصل با موفقیت تغییر کرد.'); + if (productId === attributeId) { + $("#hesabix_hesabix_item_code_0").val(code); + } else { + $("#hesabix_hesabix_item_code_" + attributeId).val(code); + } + } else { + alert('خطا در هنگام تغییر کد کالای متصل.'); + } + }); + $(this).prop('disabled', true); + }); + + $(".hesabix-item-delete-link").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + const attributeId = $(this).data('id'); + + $.post(ajaxurl, { + action: 'adminDeleteProductLink', + productId: productId, + attributeId: attributeId + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + $("#hesabix-item-" + attributeId).val(''); + if (productId === attributeId) { + $("#hesabix_hesabix_item_code_0").val(''); + } else { + $("#hesabix_hesabix_item_code_" + attributeId).val(''); + } + setTimeout(() => { + alert(res.error ? res.message : 'ارتباط محصول با موفقیت حذف شد'); + }, 100); + } else { + alert('خطا در هنگام حذف ارتباط'); + } + }); + $(this).prop('disabled', true); + }); + + $(".hesabix-item-update").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + const attributeId = $(this).data('id'); + + $.post(ajaxurl, { + action: 'adminUpdateProduct', + productId: productId, + attributeId: attributeId + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + if (res.newPrice != null) { + $("#hesabix-item-price-" + attributeId).text(res.newPrice); + } + if (res.newQuantity != null) { + $("#hesabix-item-quantity-" + attributeId).text(res.newQuantity); + } + if (res.error) { + alert(res.message); + } + } else { + alert('خطا در هنگام بروزرسانی محصول'); + } + }); + $(this).prop('disabled', true); + }); + + $("#hesabix-item-save-all").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + const itemsCode = $(".hesabix-item-code"); + const itemsData = []; + + for (let i = 0; i < itemsCode.length; i++) { + const item = itemsCode[i]; + const attributeId = $(item).data('id'); + const code = $(item).val(); + itemsData.push({ attributeId: attributeId, code: code }); + } + + $.post(ajaxurl, { + action: 'adminChangeProductsCode', + productId: productId, + itemsData: itemsData + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + alert(res.error ? res.message : 'کد کالاهای متصل با موفقیت تغییر کرد.'); + location.reload(); + } else { + alert('خطا در هنگام تغییر کد کالاهای متصل'); + } + }); + $(this).prop('disabled', true); + }); + + $("#hesabix-item-delete-link-all").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + + $.post(ajaxurl, { + action: 'adminDeleteProductsLink', + productId: productId + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + const itemsCode = $(".hesabix-item-code"); + for (let i = 0; i < itemsCode.length; i++) { + const item = itemsCode[i]; + $(item).val(''); + } + $('[id^="hesabix_hesabix_item_code_"]').val(''); + setTimeout(() => { + alert(res.error ? res.message : 'ارتباط محصولات با موفقیت حذف شد.'); + }, 100); + } else { + alert('خطا در هنگام حذف ارتباط'); + } + }); + $(this).prop('disabled', true); + }); + + $("#hesabix-item-update-all").on('click', function() { + const productId = $("#panel_product_data_hesabix").data('product-id'); + + $.post(ajaxurl, { + action: 'adminUpdateProductAndVariations', + productId: productId + }, (response) => { + $(this).prop('disabled', false); + if (response !== 'failed') { + const res = JSON.parse(response); + if (res.error) { + alert(res.message); + return; + } + for (let i = 0; i < res.newData.length; i++) { + if (res.newData[i].newPrice != null) { + $("#hesabix-item-price-" + res.newData[i].attributeId).text(res.newData[i].newPrice); + } + if (res.newData[i].newQuantity != null) { + $("#hesabix-item-quantity-" + res.newData[i].attributeId).text(res.newData[i].newQuantity); + } + } + } else { + alert('خطا در هنگام بروزرسانی محصول'); + } + }); + $(this).prop('disabled', true); + }); + }, + + initPluginDataOperations: function() { + $('#hesabix-clear-plugin-data').click(function() { + if (confirm('هشدار: با انجام این عملیات کلیه اطلاعات افزونه شامل روابط بین کالاها، مشتریان و فاکتور ها و همینطور تنظیمات افزونه حذف می گردد. آیا از انجام این عملیات مطمئن هستید؟')) { + $(this).addClass('disabled').html('حذف دیتای افزونه...'); + $.post(ajaxurl, { action: 'adminClearPluginData' }, (response) => { + $(this).removeClass('disabled').html('حذف دیتای افزونه'); + if (response !== 'failed') { + alert('دیتای افزونه با موفقیت حذف شد.'); + } else { + alert('خطا در هنگام حذف دیتای افزونه.'); + } + }); + } + }); + + $('#hesabix-install-plugin-data').click(function() { + if (confirm('با انجام این عملیات جدول افزونه در دیتابیس وردپرس ایجاد و تنظیمات پیش فرض افزونه تنظیم می گردد. آیا از انجام این عملیات مطمئن هستید؟')) { + $(this).addClass('disabled').html('نصب دیتای افزونه...'); + $.post(ajaxurl, { action: 'adminInstallPluginData' }, (response) => { + $(this).removeClass('disabled').html('نصب دیتای افزونه'); + if (response !== 'failed') { + alert('دیتای افزونه با موفقیت نصب شد.'); + } else { + alert('خطا در هنگام نصب دیتای افزونه.'); + } + }); + } + }); + }, + + initSettingsOperations: function() { + this.initApiKeyChange(); + this.initAdditionalFields(); + }, + + initApiKeyChange: function() { + let oldApiKey = ''; + $("#changeBusinessWarning").hide(); + + $("#hesabix_account_api").focusin(function() { + oldApiKey = $("#hesabix_account_api").val(); + }); + + $("#hesabix_account_api").focusout(function() { + const newApiKey = $("#hesabix_account_api").val(); + if (oldApiKey != '' && oldApiKey != newApiKey) { + $("#changeBusinessWarning").show(); + } + }); + }, + + initAdditionalFields: function() { + const radio = $('input:radio[name="addFieldsRadio"]'); + const radioChecked = $('input:radio[name="addFieldsRadio"]:checked'); + const textInput = $('.contact_text_input'); + + if (radioChecked.val() === '2') { + textInput.prop("disabled", false); + } else { + textInput.prop("disabled", true); + } + + $(radio).on('click', function() { + if ($(this).val() === '2') { + textInput.prop("disabled", false); + } else { + textInput.prop("disabled", true); + } + }); + }, + + initApiOperations: function() { + $(document).ready(() => { + $(document).on('click', '#save-api-settings', (e) => { + e.preventDefault(); + this.saveApiSettings(); + }); + $(document).on('click', '#test-connection', (e) => { + e.preventDefault(); + this.testApiConnection(); + }); + $('#hesabix_api_form').on('submit', (e) => { + e.preventDefault(); + this.saveApiSettings(); + }); + }); + }, + + saveApiSettings: function() { + const saveBtn = $('#save-api-settings'); + const originalText = saveBtn.html(); + saveBtn.addClass('loading').prop('disabled', true); + + const formData = { + action: 'adminSaveApiSettings', + nonce: hesabix_ajax.nonce, + api_key: $('#hesabix_account_api').val(), + api_address: $('#hesabix_api_address').val(), + custom_api_address: $('#hesabix_custom_api_address').val() + }; + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData, + success: (response) => { + if (response.success) { + this.showMessage('success', response.data.message); + } else { + this.showMessage('error', response.data.message || 'خطا در ذخیره تنظیمات'); + } + }, + error: () => this.showMessage('error', 'خطا در ارتباط با سرور'), + complete: () => { + saveBtn.removeClass('loading').prop('disabled', false).html(originalText); + } + }); + }, + + testApiConnection: function() { + const testBtn = $('#test-connection'); + const originalText = testBtn.html(); + testBtn.addClass('loading').prop('disabled', true); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'adminTestApiConnection', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + this.showMessage('success', response.data.message); + } else { + this.showMessage('error', response.data.message || 'خطا در بررسی اتصال'); + } + }, + error: () => this.showMessage('error', 'خطا در ارتباط با سرور'), + complete: () => { + testBtn.removeClass('loading').prop('disabled', false).html(originalText); + } + }); + }, + + showMessage: function(type, message) { + $('.hesabix-message').remove(); + const messageClass = type === 'success' ? 'hesabix-alert-success' : 'hesabix-alert-danger'; + const messageHtml = ` +
+
+ ${message} +
+
+ `; + const form = $('#hesabix_api_form'); + if (form.length > 0) { + form.before(messageHtml); + } else { + $('.hesabix-admin').prepend(messageHtml); + } + }, + + initTabSystem: function() { + const $tabs = $('.hesabix-tab'); + const $tabContent = $('.hesabix-tab-content'); + + $tabs.on('click', (e) => { + e.preventDefault(); + const $tab = $(e.currentTarget); + const tabName = $tab.attr('data-tab'); + + if (!$tab.hasClass('active')) { + $tabContent.html('

در حال بارگذاری...

'); + $tabs.removeClass('active'); + $tab.addClass('active'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_load_tab_content', + tab: tabName, + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + $tabContent.html(response.data.content); + this.initStatusSelector(); + this.initFreightSwitch(); + if (tabName === 'api') { + this.initCustomApiAddress(); + } + $(document).trigger('hesabix_content_loaded'); + this.initTabSpecificFunctions(tabName); + } else { + $tabContent.html('
خطا در بارگذاری محتوا
'); + } + }, + error: () => { + $tabContent.html('
خطا در بارگذاری محتوا
'); + } + }); + } + }); + }, + + initTabSpecificFunctions: function(tabName) { + switch(tabName) { + case 'home': + this.loadHomeStats(); + break; + case 'sync': + this.loadSyncStats(); + this.initDateRangeSelector(); + this.initSyncProducts(); + this.initSyncOrders(); + this.initUpdateCustomers(); + this.initUpdateProducts(); + this.initUpdateWcProducts(); + break; + case 'extra': + this.initSaveExtraSettings(); + break; + case 'catalog': + this.initSaveCatalogSettings(); + break; + case 'invoice': + this.initSaveInvoiceSettings(); + break; + case 'customers': + this.initSaveCustomersSettings(); + this.initSaveCustomersFields(); + break; + case 'logs': + this.initLogAjax(); + break; + } + }, + + initStatusSelector: function() { + $('.hesabix-status-selector').each(function() { + const $container = $(this); + const $grid = $container.find('.hesabix-status-grid'); + const $hiddenInput = $container.find('input[type="hidden"]'); + + function updateHiddenInput() { + const selectedValues = []; + $grid.find('.hesabix-status-item.selected input[type="checkbox"]').each(function() { + selectedValues.push($(this).val()); + }); + $hiddenInput.val(selectedValues.join(',')); + } + + $grid.on('click', '.hesabix-status-item', function(e) { + e.preventDefault(); + const $item = $(this); + const $checkbox = $item.find('input[type="checkbox"]'); + + if ($item.hasClass('selected')) { + $item.removeClass('selected'); + $checkbox.prop('checked', false); + } else { + $grid.find('.hesabix-status-item.selected').removeClass('selected'); + $grid.find('input[type="checkbox"]').prop('checked', false); + $item.addClass('selected'); + $checkbox.prop('checked', true); + } + updateHiddenInput(); + }); + updateHiddenInput(); + }); + }, + + initFreightSwitch: function() { + const $freightOptions = $('.hesabix-freight-option'); + let $freightCodeField = $('tr.hesabix-freight-code-field'); + + if ($freightCodeField.length === 0) { + $freightCodeField = $('#hesabix_invoice_freight_code').closest('tr'); + } + if ($freightCodeField.length === 0) { + $freightCodeField = $('tr').filter(function() { + return $(this).find('#hesabix_invoice_freight_code').length > 0; + }); + } + + $freightOptions.on('click', function() { + const $option = $(this); + const value = $option.data('value'); + $freightOptions.removeClass('active'); + $option.addClass('active'); + $('#hesabix_invoice_freight').val(value); + + const valueStr = String(value); + if (valueStr === '1') { + $freightCodeField.removeClass('hidden').addClass('required-field').css('display', 'table-row'); + } else { + $freightCodeField.addClass('hidden').removeClass('required-field').css('display', 'none'); + } + + $option.animate({ scale: 0.95 }, 100).animate({ scale: 1 }, 100); + }); + + const initialValue = $('#hesabix_invoice_freight').val(); + const initialValueStr = String(initialValue); + if (initialValueStr === '1') { + $freightCodeField.removeClass('hidden').addClass('required-field').css('display', 'table-row'); + } else { + $freightCodeField.addClass('hidden').removeClass('required-field').css('display', 'none'); + } + }, + + initCustomApiAddress: function() { + const apiAddressSelect = $('#hesabix_api_address'); + const customAddressField = $('.custom-api-address-field'); + + function toggleCustomField() { + const selectedValue = apiAddressSelect.val(); + if (selectedValue === 'custom') { + customAddressField.addClass('show'); + } else { + customAddressField.removeClass('show'); + } + } + + toggleCustomField(); + apiAddressSelect.on('change', toggleCustomField); + }, + + initSaveExtraSettings: function() { + $('#ajax-save-extra-settings').on('click', (e) => { + e.preventDefault(); + const form = $('#hesabix_extra_form'); + const formData = form.serialize(); + const $btn = $('#ajax-save-extra-settings'); + $btn.addClass('loading').prop('disabled', true); + $('#extra-settings-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData + '&action=hesabix_save_extra_settings_ajax&nonce=' + hesabix_ajax.nonce, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
تنظیمات با موفقیت ذخیره شد.
' : + '
خطا در ذخیره تنظیمات!
'; + $('#extra-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: $('#extra-settings-message').offset().top }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره تنظیمات!
'; + $('#extra-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: $('#extra-settings-message').offset().top }, 500); + } + }); + }); + }, + + initSaveCatalogSettings: function() { + $('#ajax-save-catalog-settings').on('click', (e) => { + e.preventDefault(); + const form = $('#hesabix_catalog_form'); + const formData = form.serialize(); + const $btn = $('#ajax-save-catalog-settings'); + $btn.addClass('loading').prop('disabled', true); + $('#catalog-settings-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData + '&action=hesabix_save_catalog_settings_ajax&nonce=' + hesabix_ajax.nonce, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
تنظیمات با موفقیت ذخیره شد.
' : + '
خطا در ذخیره تنظیمات!
'; + $('#catalog-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره تنظیمات!
'; + $('#catalog-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + } + }); + }); + }, + + initSaveInvoiceSettings: function() { + $('#ajax-save-invoice-settings').on('click', (e) => { + e.preventDefault(); + const form = $('#hesabix_invoice_form'); + const formData = form.serialize(); + const $btn = $('#ajax-save-invoice-settings'); + $btn.addClass('loading').prop('disabled', true); + $('#invoice-settings-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData + '&action=hesabix_save_invoice_settings_ajax&nonce=' + hesabix_ajax.nonce, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
تنظیمات با موفقیت ذخیره شد.
' : + '
خطا در ذخیره تنظیمات!
'; + $('#invoice-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: $('#invoice-settings-message').offset().top }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره تنظیمات!
'; + $('#invoice-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: $('#invoice-settings-message').offset().top }, 500); + } + }); + }); + }, + + initSaveCustomersSettings: function() { + $('#ajax-save-customers-settings').on('click', (e) => { + e.preventDefault(); + const form = $('#hesabix_customers_form'); + const formData = form.serialize(); + const $btn = $('#ajax-save-customers-settings'); + $btn.addClass('loading').prop('disabled', true); + $('#customers-settings-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData + '&action=hesabix_save_customers_settings_ajax&nonce=' + hesabix_ajax.nonce, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
تنظیمات با موفقیت ذخیره شد.
' : + '
خطا در ذخیره تنظیمات!
'; + $('#customers-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره تنظیمات!
'; + $('#customers-settings-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + } + }); + }); + }, + + initSaveCustomersFields: function() { + $('input[name="addFieldsRadio"]').on('change', function() { + const selectedValue = $(this).val(); + const $fieldsTable = $('.hesabix-table-container'); + const $fieldInputs = $fieldsTable.find('input[type="checkbox"], input[type="text"]'); + + if (selectedValue === '2') { + $fieldInputs.prop('disabled', true); + $fieldsTable.addClass('disabled-fields'); + } else { + $fieldInputs.prop('disabled', false); + $fieldsTable.removeClass('disabled-fields'); + } + }); + + const currentSelection = $('input[name="addFieldsRadio"]:checked').val(); + if (currentSelection === '2') { + const $fieldsTable = $('.hesabix-table-container'); + const $fieldInputs = $fieldsTable.find('input[type="checkbox"], input[type="text"]'); + $fieldInputs.prop('disabled', true); + $fieldsTable.addClass('disabled-fields'); + } + + $('#ajax-save-customers-fields').on('click', (e) => { + e.preventDefault(); + const formData = new FormData(); + const radioValue = $('input[name="addFieldsRadio"]:checked').val(); + formData.append('addFieldsRadio', radioValue); + + const nationalCodeCheck = $('#nationalCodeCheck').is(':checked') ? 'yes' : 'no'; + const nationalCodeRequired = $('#nationalCodeRequired').is(':checked') ? 'yes' : 'no'; + const nationalCode = $('#nationalCode').val(); + formData.append('nationalCodeCheck', nationalCodeCheck); + formData.append('nationalCodeRequired', nationalCodeRequired); + formData.append('nationalCode', nationalCode); + + const economicCodeCheck = $('#economicCodeCheck').is(':checked') ? 'yes' : 'no'; + const economicCodeRequired = $('#economicCodeRequired').is(':checked') ? 'yes' : 'no'; + const economicCode = $('#economicCode').val(); + formData.append('economicCodeCheck', economicCodeCheck); + formData.append('economicCodeRequired', economicCodeRequired); + formData.append('economicCode', economicCode); + + const registrationNumberCheck = $('#registrationNumberCheck').is(':checked') ? 'yes' : 'no'; + const registrationNumberRequired = $('#registrationNumberRequired').is(':checked') ? 'yes' : 'no'; + const registrationNumber = $('#registrationNumber').val(); + formData.append('registrationNumberCheck', registrationNumberCheck); + formData.append('registrationNumberRequired', registrationNumberRequired); + formData.append('registrationNumber', registrationNumber); + + const websiteCheck = $('#websiteCheck').is(':checked') ? 'yes' : 'no'; + const websiteRequired = $('#websiteRequired').is(':checked') ? 'yes' : 'no'; + const website = $('#website').val(); + formData.append('websiteCheck', websiteCheck); + formData.append('websiteRequired', websiteRequired); + formData.append('website', website); + + formData.append('action', 'hesabix_save_customers_fields_ajax'); + formData.append('nonce', hesabix_ajax.nonce); + + const $btn = $('#ajax-save-customers-fields'); + $btn.addClass('loading').prop('disabled', true); + $('#customers-fields-message').hide(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: formData, + processData: false, + contentType: false, + success: (response) => { + $btn.removeClass('loading').prop('disabled', false); + const msg = response.success ? + '
فیلدهای اضافی با موفقیت ذخیره شد.
' : + '
خطا در ذخیره فیلدهای اضافی!
'; + $('#customers-fields-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + }, + error: () => { + $btn.removeClass('loading').prop('disabled', false); + const msg = '
خطا در ذخیره فیلدهای اضافی!
'; + $('#customers-fields-message').html(msg).fadeIn(); + $('html, body').animate({ scrollTop: 0 }, 500); + } + }); + }); + }, + + initLogAjax: function() { + this.initGetLogFile(); + this.initDeleteLogFile(); + this.initDeleteAllLogs(); + }, + + initGetLogFile: function() { + $('#get-log-file').on('click', (e) => { + e.preventDefault(); + const $btn = $(e.currentTarget); + const originalText = $btn.html(); + $btn.prop('disabled', true).html('در حال بارگذاری...'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_get_log_file_ajax', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + $('#log-content').html(response.data.content); + $('#log-modal').show(); + } else { + alert('خطا در بارگذاری فایل لاگ'); + } + }, + error: () => alert('خطا در بارگذاری فایل لاگ'), + complete: () => { + $btn.prop('disabled', false).html(originalText); + } + }); + }); + }, + + initDeleteLogFile: function() { + $('#delete-log-file').on('click', (e) => { + e.preventDefault(); + if (confirm('آیا از حذف فایل لاگ اطمینان دارید؟')) { + const $btn = $(e.currentTarget); + const originalText = $btn.html(); + $btn.prop('disabled', true).html('در حال حذف...'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_delete_log_file_ajax', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + alert('فایل لاگ با موفقیت حذف شد'); + location.reload(); + } else { + alert('خطا در حذف فایل لاگ'); + } + }, + error: () => alert('خطا در حذف فایل لاگ'), + complete: () => { + $btn.prop('disabled', false).html(originalText); + } + }); + } + }); + }, + + initDeleteAllLogs: function() { + $('#delete-all-logs').on('click', (e) => { + e.preventDefault(); + if (confirm('آیا از حذف تمام فایل‌های لاگ اطمینان دارید؟')) { + const $btn = $(e.currentTarget); + const originalText = $btn.html(); + $btn.prop('disabled', true).html('در حال حذف...'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + data: { + action: 'hesabix_delete_all_logs_ajax', + nonce: hesabix_ajax.nonce + }, + success: (response) => { + if (response.success) { + alert('تمام فایل‌های لاگ با موفقیت حذف شدند'); + location.reload(); + } else { + alert('خطا در حذف فایل‌های لاگ'); + } + }, + error: () => alert('خطا در حذف فایل‌های لاگ'), + complete: () => { + $btn.prop('disabled', false).html(originalText); + } + }); + } + }); + }, + + initDateRangeSelector: function() { + const $form = $('#hesabix_sync_orders'); + const $presetBtns = $('.hesabix-date-preset-btn'); + const $customContainer = $('.hesabix-date-range-container'); + const $selectedRange = $('.hesabix-selected-range'); + const $rangeDisplay = $('#hesabix-range-display'); + const $submitBtn = $('#hesabix-sync-orders-submit'); + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const $validationMsg = $('.hesabix-date-validation-message'); + + if ($startDate.length === 0 || $endDate.length === 0) return; + + this.setPresetRange(7); + $presetBtns.filter('[data-days="7"]').addClass('active'); + + $presetBtns.on('click', (e) => { + e.preventDefault(); + const $btn = $(e.currentTarget); + $presetBtns.removeClass('active'); + $btn.addClass('active'); + + if ($btn.data('custom')) { + this.showCustomRange(); + } else { + const days = parseInt($btn.data('days')); + this.setPresetRange(days); + this.hideCustomRange(); + } + }); + + $startDateJalali.add($endDateJalali).on('input', (e) => { + const $input = $(e.target); + const value = $input.val(); + + if (value.length === 10 && /^\d{4}\/\d{2}\/\d{2}$/.test(value)) { + const gregorianDate = this.jalaliDateToGregorian(value); + if (gregorianDate) { + const isStartDate = $input.attr('id').includes('start'); + const targetInput = isStartDate ? $startDate : $endDate; + targetInput.val(this.formatDateForInput(gregorianDate)); + this.validateDateRange(); + this.updateRangeDisplay(); + } + } + }); + + $startDateJalali.add($endDateJalali).on('blur', (e) => { + const $input = $(e.target); + const value = $input.val(); + + if (value && !/^\d{4}\/\d{2}\/\d{2}$/.test(value)) { + $input.addClass('error'); + } else { + $input.removeClass('error'); + } + }); + + $form.on('submit', (e) => { + if (!this.validateDateRange()) { + e.preventDefault(); + alert('Please select a valid date range before synchronizing orders.'); + return false; + } + }); + + setTimeout(() => { + this.updateRangeDisplay(); + this.showSelectedRange(); + }, 100); + }, + + setPresetRange: function(days) { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const endDate = new Date(); + const startDate = new Date(); + startDate.setDate(endDate.getDate() - days); + + $startDate.val(this.formatDateForInput(startDate)); + $endDate.val(this.formatDateForInput(endDate)); + $startDateJalali.val(this.formatJalaliDateShort(startDate)); + $endDateJalali.val(this.formatJalaliDateShort(endDate)); + + this.updateRangeDisplay(); + this.enableSubmitButton(); + this.showSelectedRange(); + }, + + showCustomRange: function() { + $('.hesabix-date-range-container').slideDown(300); + $('#hesabix_sync_order_date').focus(); + this.validateDateRange(); + }, + + hideCustomRange: function() { + $('.hesabix-date-range-container').slideUp(300); + this.clearValidation(); + }, + + validateDateRange: function() { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const $validationMsg = $('.hesabix-date-validation-message'); + const $submitBtn = $('#hesabix-sync-orders-submit'); + const $selectedRange = $('.hesabix-selected-range'); + + const startVal = $startDate.val(); + const endVal = $endDate.val(); + + if (!startVal || !endVal) { + this.disableSubmitButton(); + this.hideSelectedRange(); + return false; + } + + const startDate = new Date(startVal); + const endDate = new Date(endVal); + + if (startDate >= endDate) { + this.showValidationError(); + this.disableSubmitButton(); + this.hideSelectedRange(); + return false; + } + + this.clearValidation(); + this.enableSubmitButton(); + this.showSelectedRange(); + return true; + }, + + showValidationError: function() { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const $validationMsg = $('.hesabix-date-validation-message'); + + $startDate.add($endDate).addClass('error'); + $startDateJalali.add($endDateJalali).addClass('error'); + $validationMsg.slideDown(200); + }, + + clearValidation: function() { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $startDateJalali = $('#hesabix_sync_order_date_jalali'); + const $endDateJalali = $('#hesabix_sync_order_end_date_jalali'); + const $validationMsg = $('.hesabix-date-validation-message'); + + $startDate.add($endDate).removeClass('error'); + $startDateJalali.add($endDateJalali).removeClass('error'); + $validationMsg.slideUp(200); + }, + + updateRangeDisplay: function() { + const $startDate = $('#hesabix_sync_order_date'); + const $endDate = $('#hesabix_sync_order_end_date'); + const $rangeDisplay = $('#hesabix-range-display'); + + const startVal = $startDate.val(); + const endVal = $endDate.val(); + + if (startVal && endVal) { + const startDate = new Date(startVal); + const endDate = new Date(endVal); + + if (startDate < endDate) { + const formattedStart = this.formatDateForDisplay(startDate); + const formattedEnd = this.formatDateForDisplay(endDate); + const daysDiff = Math.ceil((endDate - startDate) / (1000 * 60 * 60 * 24)); + + $rangeDisplay.html(`${formattedStart} - ${formattedEnd} (${daysDiff} روز)`); + } + } + }, + + showSelectedRange: function() { + const $selectedRange = $('.hesabix-selected-range'); + if (!$selectedRange.is(':visible')) { + $selectedRange.slideDown(300); + } + }, + + hideSelectedRange: function() { + $('.hesabix-selected-range').slideUp(300); + }, + + enableSubmitButton: function() { + $('#hesabix-sync-orders-submit').prop('disabled', false).removeClass('disabled'); + }, + + disableSubmitButton: function() { + $('#hesabix-sync-orders-submit').prop('disabled', true).addClass('disabled'); + }, + + formatDateForInput: function(date) { + return date.getFullYear() + '-' + + String(date.getMonth() + 1).padStart(2, '0') + '-' + + String(date.getDate()).padStart(2, '0'); + }, + + formatDateForDisplay: function(date) { + return this.formatJalaliDate(date); + } + }; + + window.loadHomeStats = HesabixAdmin.loadHomeStats.bind(HesabixAdmin); + window.checkHesabixUpdate = HesabixAdmin.checkHesabixUpdate.bind(HesabixAdmin); + window.loadSyncStats = HesabixAdmin.loadSyncStats.bind(HesabixAdmin); + window.hesabix_load_tab_content = HesabixAdmin.initTabSystem.bind(HesabixAdmin); + + HesabixAdmin.init(); +}); + +function hesabixTutorialJumpTo(time) { + const vidEl = document.getElementById('hesabix-tutorial-video'); + vidEl.play(); + vidEl.pause(); + vidEl.currentTime = time; + vidEl.play(); +} \ No newline at end of file diff --git a/hesabix.php b/hesabix.php new file mode 100644 index 0000000..500844a --- /dev/null +++ b/hesabix.php @@ -0,0 +1,74 @@ +run(); +} + +run_hesabix(); + +add_filter('admin_footer_text', function ($footer_text) { + global $pagenow; + if ($pagenow === 'admin.php' && isset($_GET['page']) && $_GET['page'] === 'hesabix-option') { + return __('Hesabix Plugin developed with', 'hesabix') . + ' ' . + __('by', 'hesabix') . + '
' . __('Mohammad Rezai', 'hesabix') . '.' . + ' + + + + + + + + ' . __('Pirouz', 'hesabix') . ' + '; + } + return $footer_text; +}, 999); + diff --git a/includes/class-hesabix-activator.php b/includes/class-hesabix-activator.php new file mode 100644 index 0000000..5e4c987 --- /dev/null +++ b/includes/class-hesabix-activator.php @@ -0,0 +1,56 @@ +prefix . "hesabix"; + $charset_collate = $wpdb->get_charset_collate(); + + $sql = " + CREATE TABLE $table_name ( + id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + obj_type varchar(32) NOT NULL, + id_hesabix int(11) UNSIGNED NOT NULL, + id_ps int(11) UNSIGNED NOT NULL, + id_ps_attribute int(11) UNSIGNED NOT NULL DEFAULT 0, + uid_hesabix int(11) UNSIGNED NOT NULL, + PRIMARY KEY (id) + ) $charset_collate;"; + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); + dbDelta($sql); + + update_option('hesabix_db_version', self::$hesabix_db_version); + } +} diff --git a/includes/class-ssbhesabix-api.php b/includes/class-hesabix-api.php similarity index 63% rename from includes/class-ssbhesabix-api.php rename to includes/class-hesabix-api.php index 5fc9ca2..7bfc33f 100644 --- a/includes/class-ssbhesabix-api.php +++ b/includes/class-hesabix-api.php @@ -1,532 +1,550 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - */ - -class Ssbhesabix_Api -{ - //================================================================================================ - public function apiRequest($method, $data = array()) - { - if ($method == null) - return false; - - $endpoint = 'https://hesabix.ir/' . $method; - - $apiAddress = get_option('ssbhesabix_api_address', 0); - - if ($apiAddress == 1) - $endpoint = 'https://next.hesabix.ir/' . $method; - - $body = array_merge(array( - 'API-KEY' => get_option('ssbhesabix_account_api'), - ), $data); - - //Debug mode - if (get_option('ssbhesabix_debug_mode')) { - HesabixLogService::log(array("Debug Mode - Data: " . print_r($data, true))); - } - - $options = array( - 'body' => wp_json_encode($body), - 'headers' => array( - 'Content-Type' => 'application/json', - 'API-KEY' => get_option('ssbhesabix_account_api'), - 'activeBid' => get_option('ssbhesabix_account_bid'), - 'activeYear' => get_option('ssbhesabix_account_year'), - ), - 'timeout' => 60, - 'redirection' => 5, - 'blocking' => true, - 'httpversion' => '1.0', - 'sslverify' => false, - 'data_format' => 'body', - ); - - //HesabixLogService::writeLogObj($options); - - $wp_remote_post = wp_remote_post($endpoint, $options); - $result = json_decode(wp_remote_retrieve_body($wp_remote_post)); - - //Debug mode - if (get_option('ssbhesabix_debug_mode')) { - HesabixLogService::log(array("Debug Mode - Result: " . print_r($result, true))); - } - - //fix API limit request - Maximum request per minutes is 60 times, - sleep(1); - - if ($result == null) { - return 'No response from Hesabix'; - } else { - if (!isset($result->Success)) { - switch ($result->ErrorCode) { - case '100': - return 'InternalServerError'; - case '101': - return 'TooManyRequests'; - case '103': - return 'MissingData'; - case '104': - return 'MissingParameter' . '. ErrorMessage: ' . $result->ErrorMessage; - case '105': - return 'ApiDisabled'; - case '106': - return 'UserIsNotOwner'; - case '107': - return 'BusinessNotFound'; - case '108': - return 'BusinessExpired'; - case '110': - return 'IdMustBeZero'; - case '111': - return 'IdMustNotBeZero'; - case '112': - return 'ObjectNotFound' . '. ErrorMessage: ' . $result->ErrorMessage; - case '113': - return 'MissingApiKey'; - case '114': - return 'ParameterIsOutOfRange' . '. ErrorMessage: ' . $result->ErrorMessage; - case '190': - return 'ApplicationError' . '. ErrorMessage: ' . $result->ErrorMessage; - } - } else { - return $result; - } - } - return false; - } - //================================================================================================ - //Contact functions - public function contactGet($code) - { - $method = 'contact/get'; - $data = array( - 'code' => $code, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function contactGetById($idList) - { - $method = 'contact/getById'; - $data = array( - 'idList' => $idList, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function contactGetContacts($queryInfo) - { - $method = 'contact/getcontacts'; - $data = array( - 'queryInfo' => $queryInfo, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function contactSave($contact) - { - $method = 'api/person/mod'; - return $this->apiRequest($method, $contact); - } - //================================================================================================ - public function contactBatchSave($contacts) - { - $method = 'api/person/group/mod'; - $data = array( - 'items' => $contacts, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function contactDelete($code) - { - $method = 'contact/delete'; - $data = array( - 'code' => $code, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function contactGetByPhoneOrEmail($phone, $email) - { - $method = 'contact/findByPhoneOrEmail'; - $data = array( - 'mobile' => $phone, - 'email' => $email, - 'phone' => $phone, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - //Items functions - public function itemGet($code) - { - $method = 'item/get'; - $data = array( - 'code' => $code, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function itemGetByBarcode($barcode) - { - $method = 'item/getByBarcode'; - $data = array( - 'barcode' => $barcode, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function itemGetById($idList) - { - $method = 'item/getById'; - $data = array( - 'idList' => $idList, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function itemGetItems($queryInfo = null) - { - $method = 'api/commodity/search/extra'; - $data = array( - 'queryInfo' => $queryInfo, - ); - - return $this->apiRequest($method, $data); - } - - public function itemGetItemsByCodes($values = []) - { - $method = 'api/commodity/search/bycodes'; - return $this->apiRequest($method, $values); - } - //================================================================================================ - public function itemSave($item) - { - $method = 'api/commodity/mod/0'; - return $this->apiRequest($method, $item); - } - //================================================================================================ - public function itemBatchSave($items) - { - $method = 'api/commodity/group/mod'; - $data = array( - 'items' => $items, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function itemDelete($code) - { - $method = 'item/delete'; - $data = array( - 'code' => $code, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function itemGetQuantity($warehouseCode, $codes) - { - $method = 'item/GetQuantity'; - $data = array( - 'warehouseCode' => $warehouseCode, - 'codes' => $codes, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - //Invoice functions - public function invoiceGet($number, $type = 0) - { - $method = 'invoice/get'; - $data = array( - 'number' => $number, - 'type' => $type, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function invoiceGetById($id) - { - $method = 'invoice/getById'; - $data = array( - 'id' => $id, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function invoiceGetByIdList($idList) - { - $method = 'invoice/getById'; - $data = array( - 'idList' => $idList, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function invoiceGetInvoices($queryinfo, $type = 0) - { - $method = 'invoice/getinvoices'; - $data = array( - 'type' => $type, - 'queryInfo' => $queryinfo, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function invoiceSave($invoice, $GUID = '') - { - $method = 'invoice/save'; - $data = array( - 'invoice' => $invoice, - ); - if ($GUID != '') - $data['requestUniqueId'] = $GUID; - $this->saveStatistics(); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function invoiceDelete($number, $type = 0) - { - $method = 'invoice/delete'; - $data = array( - 'code' => $number, - 'type' => $type, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function invoiceSavePayment($number, $financialData, $accountPath, $date, $amount, $transactionNumber = null, $description = null, $transactionFee = 0) - { - $method = 'invoice/savepayment'; - $data = array( - 'number' => (int) $number, - 'date' => $date, - 'amount' => $amount, - 'transactionNumber' => $transactionNumber, - 'description' => $description, - 'transactionFee' => $transactionFee, - ); - - $data = array_merge($data, $financialData); - if ($accountPath != []) - $data = array_merge($data, $accountPath); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function invoiceGetOnlineInvoiceURL($number, $type = 0) - { - $method = 'invoice/getonlineinvoiceurl'; - $data = array( - 'number' => $number, - 'type' => $type, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function itemUpdateOpeningQuantity($items) - { - $method = 'item/UpdateOpeningQuantity'; - $data = array( - 'items' => $items, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function saveWarehouseReceipt($receipt) - { - $method = 'invoice/SaveWarehouseReceipt'; - $data = array( - 'deleteOldReceipts' => true, - 'receipt' => $receipt, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function warehouseReceiptGetByIdList($idList) - { - $method = 'invoice/getWarehouseReceipt'; - $data = array( - 'idList' => $idList, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function getWarehouseReceipt($objectId) - { - $method = 'warehouse/GetById'; - $data = array( - 'id' => $objectId, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - //Settings functions - public function settingSetChangeHook($url, $hookPassword) - { - $method = 'hooks/setting/SetChangeHook'; - $data = array( - 'url' => $url, - 'hookPassword' => $hookPassword, - ); - - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function settingGetChanges($start = 0) - { - $method = 'hooks/setting/GetChanges'; - $data = array( - 'start' => $start, - ); - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function settingGetAccounts() - { - $method = 'hooks/setting/GetAccounts'; - return $this->apiRequest($method); - } - //================================================================================================ - public function settingGetBanks() - { - $method = 'hooks/setting/getBanks'; - return $this->apiRequest($method); - } - //================================================================================================ - public function settingGetCashes() - { - $method = 'setting/GetCashes'; - return $this->apiRequest($method); - } - //================================================================================================ - public function settingGetProjects() - { - $method = 'api/projects/list'; - return $this->apiRequest($method); - } - //================================================================================================ - public function settingGetSalesmen() - { - $method = 'api/person/list/salesmen'; - return $this->apiRequest($method); - } - //================================================================================================ - public function settingGetCurrency() - { - $method = 'hooks/setting/getCurrency'; - - return $this->apiRequest($method); - } - //================================================================================================ - public function settingGetFiscalYear() - { - $method = 'hooks/setting/GetFiscalYear'; - - return $this->apiRequest($method); - } - //================================================================================================ - public function settingGetWarehouses() - { - $method = 'api/storeroom/list'; - return $this->apiRequest($method); - } - //================================================================================================ - public function fixClearTags() - { - $method = 'fix/clearTag'; - return $this->apiRequest($method); - } - //================================================================================================ - public function settingGetSubscriptionInfo() - { - $method = 'hooks/setting/getBusinessInfo'; - return $this->apiRequest($method); - } - //========================================================================================================================= - public function getLastChangeId($start = 1000000000) - { - $method = 'setting/GetChanges'; - $data = array( - 'start' => $start, - ); - return $this->apiRequest($method, $data); - } - //================================================================================================ - public function saveStatistics() - { - $plugin_version = constant('SSBHESABIX_VERSION'); - - $endpoint = "https://hesabix.ir/statistics/save"; - $body = array( - "Platform" => "Woocommerce/" . $plugin_version, - "Website" => get_site_url(), - 'APIKEY' => get_option('ssbhesabix_account_api'), - "IP" => $_SERVER['REMOTE_ADDR'] - ); - - $options = array( - 'body' => wp_json_encode($body), - 'headers' => array( - 'Content-Type' => 'application/json', - ), - 'timeout' => 60, - 'redirection' => 5, - 'blocking' => true, - 'httpversion' => '1.0', - 'sslverify' => false, - 'data_format' => 'body', - ); - - $wp_remote_post = wp_remote_post($endpoint, $options); - $result = json_decode(wp_remote_retrieve_body($wp_remote_post)); - } - //================================================================================================ - public function checkMobileAndNationalCode($nationalCode, $billingPhone) - { - $method = 'inquiry/checkMobileAndNationalCode'; - $data = array( - 'nationalCode' => $nationalCode, - 'mobile' => $billingPhone, - ); - return $this->apiRequest($method, $data); - } - //================================================================================================ + get_option('hesabix_account_api'), + 'reqType' => 'woocommercePlugin', + ), $data); + + + if (get_option('hesabix_debug_mode') == 'yes') { + HesabixLogService::log(array("Debug Mode - Data: " . print_r($data, true))); + } + + $options = array( + 'body' => wp_json_encode($body), + 'headers' => array( + 'Content-Type' => 'application/json', + 'API-KEY' => get_option('hesabix_account_api'), + 'activeBid' => get_option('hesabix_account_bid'), + 'activeYear' => get_option('hesabix_account_year'), + ), + 'timeout' => 15, + 'redirection' => 5, + 'blocking' => true, + 'data_format' => 'body', + ); + + $wp_remote_post = wp_remote_post($endpoint, $options); + if ($method == 'api/commodity/search/extra') { + + } + $result = json_decode(wp_remote_retrieve_body($wp_remote_post)); + + + if (get_option('hesabix_debug_mode') == 'yes') { + HesabixLogService::log(array("Debug Mode - Result: " . print_r($result, true))); + } + + + sleep(1); + + if ($result == null) { + return 'No response from Hesabix'; + } else { + if (!isset($result->Success)) { + switch ($result->ErrorCode) { + case '100': + return 'InternalServerError'; + case '101': + return 'TooManyRequests'; + case '103': + return 'MissingData'; + case '104': + return 'MissingParameter' . '. ErrorMessage: ' . $result->ErrorMessage; + case '105': + return 'ApiDisabled'; + case '106': + return 'UserIsNotOwner'; + case '107': + return 'BusinessNotFound'; + case '108': + return 'BusinessExpired'; + case '110': + return 'IdMustBeZero'; + case '111': + return 'IdMustNotBeZero'; + case '112': + return 'ObjectNotFound' . '. ErrorMessage: ' . $result->ErrorMessage; + case '113': + return 'MissingApiKey'; + case '114': + return 'ParameterIsOutOfRange' . '. ErrorMessage: ' . $result->ErrorMessage; + case '190': + return 'ApplicationError' . '. ErrorMessage: ' . $result->ErrorMessage; + } + } else { + return $result; + } + } + return false; + } + + + public function contactGet($code) + { + $method = 'contact/get'; + $data = array( + 'code' => $code, + ); + + return $this->apiRequest($method, $data); + } + + public function contactGetById($idList) + { + $method = 'contact/getById'; + $data = array( + 'idList' => $idList, + ); + + return $this->apiRequest($method, $data); + } + + public function contactGetContacts($queryInfo) + { + $method = 'contact/getcontacts'; + $data = array( + 'queryInfo' => $queryInfo, + ); + + return $this->apiRequest($method, $data); + } + + public function contactSave($contact) + { + $method = 'hooks/modify/person'; + return $this->apiRequest($method, $contact); + } + + public function contactBatchSave($contacts) + { + $method = 'api/person/group/mod'; + $data = array( + 'items' => $contacts, + ); + + return $this->apiRequest($method, $data); + } + + public function contactDelete($code) + { + $method = 'contact/delete'; + $data = array( + 'code' => $code, + ); + + return $this->apiRequest($method, $data); + } + + public function contactGetByPhoneOrEmail($phone, $email) + { + $method = 'contact/findByPhoneOrEmail'; + $data = array( + 'mobile' => $phone, + 'email' => $email, + 'phone' => $phone, + ); + + return $this->apiRequest($method, $data); + } + + + public function itemGet($code) + { + $method = 'item/get'; + $data = array( + 'code' => $code, + ); + + return $this->apiRequest($method, $data); + } + + public function itemGetByBarcode($barcode) + { + $method = 'item/getByBarcode'; + $data = array( + 'barcode' => $barcode, + ); + + return $this->apiRequest($method, $data); + } + + public function itemGetById($idList) + { + $method = 'item/getById'; + $data = array( + 'idList' => $idList, + ); + + return $this->apiRequest($method, $data); + } + + public function itemGetItems($queryInfo = null) + { + $method = 'api/commodity/search/extra'; + $data = array( + 'queryInfo' => $queryInfo, + ); + + return $this->apiRequest($method, $data); + } + + public function itemGetItemsByCodes($values = []) + { + $method = 'api/commodity/search/bycodes'; + return $this->apiRequest($method, $values); + } + + public function itemSave($item) + { + $method = 'api/commodity/mod'; + return $this->apiRequest($method, $item); + } + + public function itemBatchSave($items) + { + $method = 'api/commodity/group/mod'; + $data = array( + 'items' => $items, + ); + + return $this->apiRequest($method, $data); + } + + public function itemDelete($code) + { + $method = 'item/delete'; + $data = array( + 'code' => $code, + ); + + return $this->apiRequest($method, $data); + } + + public function itemGetQuantity($warehouseCode, $codes) + { + $method = 'item/GetQuantity'; + $data = array( + 'warehouseCode' => $warehouseCode, + 'codes' => $codes, + ); + + return $this->apiRequest($method, $data); + } + + + public function invoiceGet($number, $type = 0) + { + $method = 'invoice/get'; + $data = array( + 'number' => $number, + 'type' => $type, + ); + + return $this->apiRequest($method, $data); + } + + public function invoiceGetById($id) + { + $method = 'invoice/getById'; + $data = array( + 'id' => $id, + ); + + return $this->apiRequest($method, $data); + } + + public function invoiceGetByIdList($idList) + { + $method = 'invoice/getById'; + $data = array( + 'idList' => $idList, + ); + + return $this->apiRequest($method, $data); + } + + public function invoiceGetInvoices($queryinfo, $type = 0) + { + $method = 'invoice/getinvoices'; + $data = array( + 'type' => $type, + 'queryInfo' => $queryinfo, + ); + + return $this->apiRequest($method, $data); + } + + public function invoiceSave($invoice) + { + $method = 'api/sell/v2/mod'; + $this->saveStatistics(); + + return $this->apiRequest($method, $invoice); + } + + public function invoiceDelete($number, $type = 0) + { + $method = 'invoice/delete'; + $data = array( + 'code' => $number, + 'type' => $type, + ); + + return $this->apiRequest($method, $data); + } + + public function invoiceSavePayment($number, $financialData, $accountPath, $date, $amount, $transactionNumber = null, $description = null, $transactionFee = 0) + { + $method = 'invoice/savepayment'; + $data = array( + 'number' => (int) $number, + 'date' => $date, + 'amount' => $amount, + 'transactionNumber' => $transactionNumber, + 'description' => $description, + 'transactionFee' => $transactionFee, + ); + + $data = array_merge($data, $financialData); + if ($accountPath != []) + $data = array_merge($data, $accountPath); + + return $this->apiRequest($method, $data); + } + + public function invoiceGetOnlineInvoiceURL($number, $type = 0) + { + $method = 'invoice/getonlineinvoiceurl'; + $data = array( + 'number' => $number, + 'type' => $type, + ); + + return $this->apiRequest($method, $data); + } + + public function itemUpdateOpeningQuantity($items) + { + $method = 'item/UpdateOpeningQuantity'; + $data = array( + 'items' => $items, + ); + + return $this->apiRequest($method, $data); + } + + public function saveWarehouseReceipt($receipt) + { + $method = 'invoice/SaveWarehouseReceipt'; + $data = array( + 'deleteOldReceipts' => true, + 'receipt' => $receipt, + ); + + return $this->apiRequest($method, $data); + } + + public function warehouseReceiptGetByIdList($idList) + { + $method = 'invoice/getWarehouseReceipt'; + $data = array( + 'idList' => $idList, + ); + + return $this->apiRequest($method, $data); + } + + public function getWarehouseReceipt($objectId) + { + $method = 'warehouse/GetById'; + $data = array( + 'id' => $objectId, + ); + + return $this->apiRequest($method, $data); + } + + + public function settingSetChangeHook($url, $hookPassword) + { + $method = 'hooks/setting/SetChangeHook'; + $data = array( + 'url' => $url, + 'hookPassword' => $hookPassword, + ); + + return $this->apiRequest($method, $data); + } + + public function settingGetChanges($start = 0) + { + $method = 'hooks/setting/GetChanges'; + $data = array( + 'start' => $start, + ); + return $this->apiRequest($method, $data); + } + + public function settingGetAccounts() + { + $method = 'hooks/setting/GetAccounts'; + return $this->apiRequest($method); + } + + public function settingGetBanks() + { + $method = 'hooks/setting/getBanks'; + return $this->apiRequest($method); + } + + public function settingGetCashes() + { + $method = 'setting/GetCashes'; + return $this->apiRequest($method); + } + + public function settingGetProjects() + { + $method = 'api/projects/list'; + return $this->apiRequest($method); + } + + public function settingGetSalesmen() + { + $method = 'api/person/list/salesmen'; + return $this->apiRequest($method); + } + + public function settingGetCurrency() + { + $method = 'hooks/setting/getCurrency'; + + return $this->apiRequest($method); + } + + public function settingGetFiscalYear() + { + $method = 'hooks/setting/GetFiscalYear'; + + return $this->apiRequest($method); + } + + public function settingGetWarehouses() + { + $method = 'api/storeroom/list'; + return $this->apiRequest($method); + } + + public function fixClearTags() + { + $method = 'fix/clearTag'; + return $this->apiRequest($method); + } + + public function settingGetSubscriptionInfo() + { + $method = 'hooks/setting/getBusinessInfo'; + return $this->apiRequest($method); + } + + public function getLastChangeId($start = 1000000000) + { + $method = 'setting/GetChanges'; + $data = array( + 'start' => $start, + ); + return $this->apiRequest($method, $data); + } + + public function saveStatistics() + { + $plugin_version = constant('HESABIX_VERSION'); + + $endpoint = "https://app.hesabix.ir/statistics/save"; + + $apiAddress = get_option('hesabix_api_address', 0); + + if ($apiAddress == 1) + $endpoint = 'https://next.hesabix.ir/statistics/save'; + if ($apiAddress == 2) + $endpoint = 'https://hesabix.dragonizzer.ir/statistics/save'; + if ($apiAddress == 'custom') { + $customAddress = get_option('hesabix_custom_api_address', ''); + if (!empty($customAddress)) { + + $customAddress = rtrim($customAddress, '/'); + $endpoint = $customAddress . '/statistics/save'; + } + } + + $body = array( + "Platform" => "Woocommerce/" . $plugin_version, + "Website" => get_site_url(), + 'APIKEY' => get_option('hesabix_account_api'), + "IP" => $_SERVER['REMOTE_ADDR'] + ); + + $options = array( + 'body' => wp_json_encode($body), + 'headers' => array( + 'Content-Type' => 'application/json', + ), + 'timeout' => 60, + 'redirection' => 5, + 'blocking' => true, + 'httpversion' => '1.0', + 'sslverify' => false, + 'data_format' => 'body', + ); + + $wp_remote_post = wp_remote_post($endpoint, $options); + $result = json_decode(wp_remote_retrieve_body($wp_remote_post)); + } + + public function checkMobileAndNationalCode($nationalCode, $billingPhone) + { + $method = 'inquiry/checkMobileAndNationalCode'; + $data = array( + 'nationalCode' => $nationalCode, + 'mobile' => $billingPhone, + ); + return $this->apiRequest($method, $data); + } + } \ No newline at end of file diff --git a/includes/class-hesabix-deactivator.php b/includes/class-hesabix-deactivator.php new file mode 100644 index 0000000..e3afd78 --- /dev/null +++ b/includes/class-hesabix-deactivator.php @@ -0,0 +1,16 @@ +actions = array(); + $this->filters = array(); + + } + + public function add_action($hook, $component, $callback, $priority = 10, $accepted_args = 1) + { + $this->actions = $this->add($this->actions, $hook, $component, $callback, $priority, $accepted_args); + } + + public function add_filter($hook, $component, $callback, $priority = 10, $accepted_args = 1) + { + $this->filters = $this->add($this->filters, $hook, $component, $callback, $priority, $accepted_args); + } + + private function add($hooks, $hook, $component, $callback, $priority, $accepted_args) + { + + $hooks[] = array( + 'hook' => $hook, + 'component' => $component, + 'callback' => $callback, + 'priority' => $priority, + 'accepted_args' => $accepted_args + ); + + return $hooks; + + } + + public function run() + { + + foreach ($this->filters as $hook) { + add_filter($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']); + } + + foreach ($this->actions as $hook) { + add_action($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']); + } + + } + +} diff --git a/includes/class-hesabix-validation.php b/includes/class-hesabix-validation.php new file mode 100644 index 0000000..0a9b060 --- /dev/null +++ b/includes/class-hesabix-validation.php @@ -0,0 +1,406 @@ += 0 && $salesTax <= 100) { + return $salesTax; + } else { + return 0; + } + } + + public static function itemSalesInfoValidation($salesInfo) + { + return mb_substr($salesInfo, 0, 99); + } + + public static function itemPurchaseCostValidation($purchaseCost) + { + if ($purchaseCost >= 0) { + return $purchaseCost; + } else { + return 0; + } + } + + public static function itemPurchaseInfoValidation($purchaseInfo) + { + return mb_substr($purchaseInfo, 0, 99); + } + + public static function itemTagValidation($tag) + { + return mb_substr($tag, 0, 254); + } + + public static function contactCodeValidation($code) + { + $code = preg_replace('/[^0-9]/', '', $code); + return mb_substr($code, 0, 5); + } + + public static function contactDisplayNameValidation($displayName) + { + return mb_substr($displayName, 0, 99); + } + + public static function contactCompanyValidation($company) + { + return mb_substr($company, 0, 99); + } + + public static function contactTitleValidation($title) + { + return mb_substr($title, 0, 49); + } + + public static function contactFirstNameValidation($firstName) + { + return mb_substr($firstName, 0, 49); + } + + public static function contactLastNameValidation($lastName) + { + return mb_substr($lastName, 0, 49); + } + + public static function contactAddressValidation($address) + { + return mb_substr($address, 0, 149); + } + + public static function contactCountryValidation($country) + { + return mb_substr($country, 0, 49); + } + + public static function contactStateValidation($state) + { + if (is_numeric($state)) { + if (is_plugin_active("persian-woocommerce-shipping/woocommerce-shipping.php")) { + $state = PWS()::get_state($state); + } + } + return mb_substr($state, 0, 49); + } + + public static function contactCityValidation($city) + { + if (is_numeric($city)) { + if (is_plugin_active("persian-woocommerce-shipping/woocommerce-shipping.php")) { + $city = PWS()::get_city($city); + } + } + return mb_substr($city, 0, 49); + } + + public static function contactPostalCodeValidation($postalCode) + { + $postalCode = preg_replace('/[^0-9]/', '', $postalCode); + $postalCode = self::formatFarsiNumbers($postalCode); + return mb_substr($postalCode, 0, 10); + } + + public static function contactPhoneValidation($phone) + { + $phone = preg_replace('/[^0-9]/', '', $phone); + $phone = self::formatFarsiNumbers($phone); + return mb_substr($phone, 0, 14); + } + + public static function contactMobileValidation($mobile) + { + $mobile = preg_replace('/[^0-9]/', '', $mobile); + return mb_substr($mobile, 0, 14); + } + + public static function contactFaxValidation($fax) + { + $fax = preg_replace('/[^0-9]/', '', $fax); + return mb_substr($fax, 0, 14); + } + + public static function contactEmailValidation($email) + { + $isValid = true; + $atIndex = strrpos($email, "@"); + if (is_bool($atIndex) && !$atIndex) { + $isValid = false; + } else { + $domain = substr($email, $atIndex + 1); + $local = substr($email, 0, $atIndex); + $localLen = strlen($local); + $domainLen = strlen($domain); + if ($localLen < 1 || $localLen > 64) { + + $isValid = false; + } else if ($domainLen < 1 || $domainLen > 255) { + + $isValid = false; + } else if ($local[0] == '.' || $local[$localLen - 1] == '.') { + + $isValid = false; + } else if (preg_match('/\\.\\./', $local)) { + + $isValid = false; + } else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) { + + $isValid = false; + } else if (preg_match('/\\.\\./', $domain)) { + + $isValid = false; + } else if + ( + !preg_match( + '/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', + str_replace("\\\\", "", $local) + ) + ) { + + + if ( + !preg_match( + '/^"(\\\\"|[^"])+"$/', + str_replace("\\\\", "", $local) + ) + ) { + $isValid = false; + } + } + } + + if ($isValid) { + return $email; + } else { + return null; + } + } + + public static function contactWebsiteValidation($website) + { + return mb_substr($website, 0, 119); + } + + public static function contactNoteValidation($note) + { + return mb_substr($note, 0, 499); + } + + public static function contactCategoryValidation($category) + { + return $category; + } + + public static function contactTagValidation($tag) + { + return mb_substr($tag, 0, 254); + } + + public static function invoiceFinancialYearValidation($financialYear) + { + return $financialYear; + } + + public static function invoiceCurrencyRateValidation($currencyRate) + { + if ($currencyRate > 0) { + return $currencyRate; + } else { + return 1; + } + } + + public static function invoiceNumberValidation($number) + { + return mb_substr($number, 0, 49); + } + + public static function invoiceContactTitleValidation($contactTitle) + { + return mb_substr($contactTitle, 0, 199); + } + + public static function invoiceDueDateValidation($dueDate) + { + return $dueDate; + } + + public static function invoiceNoteValidation($note) + { + return mb_substr($note, 0, 499); + } + + public static function invoiceReferenceValidation($reference) + { + return mb_substr($reference, 0, 49); + } + + public static function invoiceTagValidation($tag) + { + return mb_substr($tag, 0, 254); + } + + public function invoiceItemsValidation($items) + { + return $items; + } + + public static function invoiceItemDescriptionValidation($description) + { + return self::remove_emoji($description, 249); + } + + public static function invoiceItemQuantityValidation($quantity) + { + if ($quantity > 0) { + return $quantity; + } else { + return 1; + } + } + + public static function invoiceItemUnitValidation($unit) + { + return mb_substr($unit, 0, 29); + } + + public static function invoiceItemUnitPriceValidation($unitPrice) + { + if ($unitPrice >= 0) { + return $unitPrice; + } else { + return 0; + } + } + + public static function invoiceItemAmountValidation($amount) + { + if ($amount >= 0) { + return $amount; + } else { + return 0; + } + } + + public static function invoiceItemDiscountValidation($discount) + { + if ($discount >= 0) { + return $discount; + } else { + return 0; + } + } + + public static function invoiceItemTaxValidation($tax) + { + if ($tax >= 0) { + return $tax; + } else { + return 0; + } + } + + public static function invoiceItemTotalAmountValidation($totalAmount) + { + if ($totalAmount >= 0) { + return $totalAmount; + } else { + return 0; + } + } + + public static function remove_emoji($string, $length = 200): string + { + $regex_alphanumeric = '/[\x{1F100}-\x{1F1FF}]/u'; + $clear_string = preg_replace($regex_alphanumeric, '', $string); + + $regex_symbols = '/[\x{1F300}-\x{1F5FF}]/u'; + $clear_string = preg_replace($regex_symbols, '', $clear_string); + + $regex_emoticons = '/[\x{1F600}-\x{1F64F}]/u'; + $clear_string = preg_replace($regex_emoticons, '', $clear_string); + + $regex_transport = '/[\x{1F680}-\x{1F6FF}]/u'; + $clear_string = preg_replace($regex_transport, '', $clear_string); + + $regex_supplemental = '/[\x{1F900}-\x{1F9FF}]/u'; + $clear_string = preg_replace($regex_supplemental, '', $clear_string); + + $regex_misc = '/[\x{2600}-\x{26FF}\x{1F7E9}-\x{1F7EF}]/u'; + $clear_string = preg_replace($regex_misc, '', $clear_string); + + $regex_dingbats = '/[\x{2700}-\x{27BF}]/u'; + $clear_string = preg_replace($regex_dingbats, '', $clear_string); + + $truncated_string = mb_substr($clear_string, 0, $length); + + return $truncated_string; + } + +} diff --git a/includes/class-ssbhesabix-webhook.php b/includes/class-hesabix-webhook.php similarity index 62% rename from includes/class-ssbhesabix-webhook.php rename to includes/class-hesabix-webhook.php index 0dce617..bb35d2e 100644 --- a/includes/class-ssbhesabix-webhook.php +++ b/includes/class-hesabix-webhook.php @@ -1,352 +1,358 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - * @author Babak Alizadeh - */ - -class Ssbhesabix_Webhook -{ - public $invoicesObjectId = array(); - public $invoiceItemsCode = array(); - public $itemsObjectId = array(); - public $contactsObjectId = array(); - public $warehouseReceiptsObjectId = array(); - - public function __construct() - { - //hesabixLogService::writeLogStr("Calling Webhook"); - $wpFaService = new HesabixWpFaService(); - - $hesabixApi = new Ssbhesabix_Api(); - - $lastChange = get_option('ssbhesabix_last_log_check_id'); - $changes = $hesabixApi->settingGetChanges($lastChange + 1); - - if ($changes->Success) { - update_option('ssbhesabix_business_expired', 0); - - foreach ($changes->Result as $item) { - if (!$item->API) { - switch ($item->ObjectType) { - case 'Invoice': - if ($item->Action == 123) { - $wpFa1 = $wpFaService->getWpFaByHesabixId('order', $item->Extra2); - if($wpFa1) { - $wpFaService->delete($wpFa1); - HesabixLogService::writeLogStr("The invoice link with the order deleted. Invoice number: " . $item->Extra2 . ", Order id: " . $wpFa1->idWp); - } - } - $this->invoicesObjectId[] = $item->ObjectId; - foreach (explode(',', $item->Extra) as $invoiceItem) { - if ($invoiceItem != '') { - $this->invoiceItemsCode[] = $invoiceItem; - } - } - break; - case 'WarehouseReceipt': - if ($item->Action == 261) { - global $wpdb; - $hesabixApi = new Ssbhesabix_Api(); - $receipt = $hesabixApi->getWarehouseReceipt($item->ObjectId); -// HesabixLogService::writeLogObj($receipt->Result->Items); - foreach ($receipt->Result->Items as $receiptItem) { - $wpFa = $wpFaService->getWpFaByHesabixId('product', $receiptItem->ItemCode); - $wpdb->insert($wpdb->prefix . 'ssbhesabix', array( - 'id_hesabix' => (int)$item->ObjectId, - 'obj_type' => "receiptItems", - 'id_ps' => $wpFa->idWp, - 'id_ps_attribute' => $wpFa->idWpAttribute - )); - } - - if (get_option('ssbhesabix_item_update_quantity', 'no') == 'no') { - HesabixLogService::writeLogStr("Sync Products Quantity is Off"); - } - } - if ($item->Action == 263) { - global $wpdb; - $rows = $wpdb->get_results("SELECT * FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id_hesabix` = $item->ObjectId"); - $receiptID = $item->ObjectId; - foreach ($rows as $row) { - $post_id = ($row->id_ps_attribute && $row->id_ps_attribute > 0) ? $row->id_ps_attribute : $row->id_ps; - //$product = wc_get_product( $post_id ); - - if (get_option('ssbhesabix_item_update_quantity', 'no') == 'no') { - HesabixLogService::writeLogStr("Sync Products Quantity is Off"); - } - - $productId = $row->id_ps; - $attributeId = $row->id_ps_attribute; - - if (get_option('ssbhesabix_item_update_quantity', 'no') == 'yes') - update_post_meta($attributeId, '_manage_stock', 'yes'); - - if ($productId == $attributeId) $attributeId = 0; - $result = array(); - - $wpFaService = new HesabixWpFaService(); - $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); - if ($wpFa) { - - $api = new Ssbhesabix_Api(); - $warehouse = get_option('ssbhesabix_item_update_quantity_based_on', "-1"); - if ($warehouse == "-1") - $response = $api->itemGet($wpFa->idHesabix); - else { - $response = $api->itemGetQuantity($warehouse, array($wpFa->idHesabix)); - } - - if ($response->Success) { - $item = $warehouse == "-1" ? $response->Result : $response->Result[0]; - $newProps = Ssbhesabix_Admin_Functions::setItemChanges($item); - } else { - HesabixLogService::writeLogStr("Product is not defined in Hesabix"); - } - } - } - - $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id_hesabix' => $receiptID)); - break; - } - $this->warehouseReceiptsObjectId[] = $item->ObjectId; - break; - case 'Product': - if ($item->Action == 53) { - $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Extra); - if ($wpFa) { - global $wpdb; - $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id' => $wpFa->id)); - } - break; - } - - $this->itemsObjectId[] = $item->ObjectId; - break; - case 'Contact': - if ($item->Action == 33) { - $id_obj = $wpFaService->getWpFaIdByHesabixId('customer', $item->Extra); - global $wpdb; - $wpdb->delete($wpdb->prefix . 'ssbhesabix', array('id' => $id_obj)); - break; - } - - $this->contactsObjectId[] = $item->ObjectId; - break; - } - } - } - - $this->invoiceItemsCode = array_unique($this->invoiceItemsCode); - $this->contactsObjectId = array_unique($this->contactsObjectId); - $this->itemsObjectId = array_unique($this->itemsObjectId); - $this->invoicesObjectId = array_unique($this->invoicesObjectId); - - $this->setChanges(); - - $lastChange = end($changes->Result); - if (is_object($lastChange)) - update_option('ssbhesabix_last_log_check_id', $lastChange->Id); - else if ($changes->LastId) - update_option('ssbhesabix_last_log_check_id', $changes->LastId); - - } else { - HesabixLogService::log(array("ssbhesabix - Cannot check last changes. Error Message: " . (string)$changes->ErrorMessage . ". Error Code: " . (string)$changes->ErrorCode)); - if ($changes->ErrorCode == 108) { - update_option('ssbhesabix_business_expired', 1); - add_action('admin_notices', array(__CLASS__, 'ssbhesabix_business_expired_notice')); - } - return false; - } - - return true; - } -//================================================================================================================================= - public function ssbhesabix_business_expired_notice() - { - echo '

' . __('Cannot connect to Hesabix. Business expired.', 'ssbhesabix') . '

'; - } -//================================================================================================================================= - public function setChanges() - { - //Items - $items = array(); - - if (!empty($this->warehouseReceiptsObjectId)) { - $receipts = $this->getObjectsByIdList($this->warehouseReceiptsObjectId, 'WarehouseReceipt'); - if ($receipts != false) { - foreach ($receipts as $receipt) { - foreach ($receipt->Items as $item) - array_push($this->invoiceItemsCode, $item->ItemCode); - } - } - } - - if (!empty($this->itemsObjectId)) { - $objects = $this->getObjectsByIdList($this->itemsObjectId, 'item'); - if ($objects != false) { - foreach ($objects as $object) { - array_push($items, $object); - } - } - } - - if (!empty($this->invoiceItemsCode)) { - $objects = $this->getObjectsByCodeList($this->invoiceItemsCode); - - if ($objects != false) { - foreach ($objects as $object) { - array_push($items, $object); - } - } - } - - if (!empty($items)) { - update_option("ssbhesabix_inside_product_edit", 1); - try { - foreach ($items as $item) { - Ssbhesabix_Admin_Functions::setItemChanges($item); - } - } catch (Exception $e) { - } finally { - update_option("ssbhesabix_inside_product_edit", 0); - } - } - - return true; - } -//================================================================================================================================= - public function setInvoiceChanges($invoice) - { - if (!is_object($invoice)) return false; - - $wpFaService = new HesabixWpFaService(); - - $number = $invoice->Number; - $json = json_decode($invoice->Tag); - if (is_object($json)) { - $id_order = $json->id_order; - } else { - $id_order = 0; - } - - if ($invoice->InvoiceType == 0) { - if ($id_order == 0) { - HesabixLogService::log(array("This invoice is not defined in OnlineStore. Invoice Number: " . $number)); - } else { - //check if order exist in wooCommerce - $id_obj = $wpFaService->getWpFaId('order', $id_order); - if ($id_obj != false) { - global $wpdb; - $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id` = $id_obj"); - if (is_object($row) && $row->id_hesabix != $number) { - $id_hesabix_old = $row->id_hesabix; - //ToDo: number must be int in hesabix - $wpdb->update($wpdb->prefix . 'ssbhesabix', array('id_hesabix' => $number), array('id' => $id_obj)); - HesabixLogService::log(array("Invoice Number changed. Old Number: $id_hesabix_old. New ID: $number")); - } - } - } - } - } -//================================================================================================================================= - public function setContactChanges($contact) - { - if (!is_object($contact)) return false; - - $code = $contact->Code; - - $json = json_decode($contact->Tag); - if (is_object($json)) { - $id_customer = $json->id_customer; - } else { - $id_customer = 0; - } - - if ($id_customer == 0) { - HesabixLogService::log(array("This Customer is not define in OnlineStore. Customer code: $code")); - return false; - } - - $wpFaService = new HesabixWpFaService(); - $id_obj = $wpFaService->getWpFaId('customer', $id_customer); - - if ($id_obj != false) { - global $wpdb; - $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "ssbhesabix` WHERE `id` = $id_obj"); - - if (is_object($row) && $row->id_hesabix != $code) { - $id_hesabix_old = $row->id_hesabix; - $wpdb->update($wpdb->prefix . 'ssbhesabix', array('id_hesabix' => (int)$code), array('id' => $id_obj)); - - HesabixLogService::log(array("Contact Code changed. Old ID: $id_hesabix_old. New ID: $code")); - } - } - - return true; - } -//================================================================================================================================= - public function getObjectsByIdList($idList, $type) - { - $hesabixApi = new Ssbhesabix_Api(); - $warehouseCode = get_option('ssbhesabix_item_update_quantity_based_on'); - switch ($type) { - case 'item': - if($warehouseCode == '-1') { - $result = $hesabixApi->itemGetById($idList); - } else { - $items = $hesabixApi->itemGetById($idList); - $codeList = []; - foreach ($items->Result as $item) { - array_push($codeList, $item->Code); - } - $result = $hesabixApi->itemGetQuantity($warehouseCode, $codeList); - } - break; - case 'contact': - $result = $hesabixApi->contactGetById($idList); - break; - case 'invoice': - $result = $hesabixApi->invoiceGetInvoices(array("Filters" => array("Property" => "Id", "Operator" => "in", "Value" => $idList))); - break; - case 'WarehouseReceipt': - $result = $hesabixApi->warehouseReceiptGetByIdList($idList); - break; - default: - return false; - } - - if (is_object($result) && $result->Success) { - return $result->Result; - } - - return false; - } -//================================================================================================================================= - public function getObjectsByCodeList($codeList) - { - $hesabixApi = new Ssbhesabix_Api(); - - $warehouse = get_option('ssbhesabix_item_update_quantity_based_on', "-1"); - if ($warehouse == "-1") - $result = $hesabixApi->itemGetItemsByCodes($codeList); - else { - $result = $hesabixApi->itemGetQuantity($warehouse, $codeList); - } - - //$result = $hesabixApi->itemGetItems($queryInfo); - - if (is_object($result) && $result->Success) { - return $warehouse == "-1" ? $result->Result->List : $result->Result; - } - - return false; - } -} +settingGetChanges($lastChange + 1); + + if ($changes->Success) { + update_option('hesabix_business_expired', 0); + + foreach ($changes->Result as $item) { + if (!$item->API) { + switch ($item->ObjectType) { + case 'Invoice': + if ($item->Action == 123) { + $wpFa1 = $wpFaService->getWpFaByHesabixId('order', $item->Extra2); + if ($wpFa1) { + $wpFaService->delete($wpFa1); + HesabixLogService::writeLogStr("The invoice link with the order deleted. Invoice number: " . $item->Extra2 . ", Order id: " . $wpFa1->idWp); + } + } + $this->invoicesObjectId[] = $item->ObjectId; + foreach (explode(',', $item->Extra) as $invoiceItem) { + if ($invoiceItem != '') { + $this->invoiceItemsCode[] = $invoiceItem; + } + } + break; + case 'WarehouseReceipt': + if ($item->Action == 261) { + global $wpdb; + $hesabixApi = new Hesabix_Api(); + $receipt = $hesabixApi->getWarehouseReceipt($item->ObjectId); + + foreach ($receipt->Result->Items as $receiptItem) { + $wpFa = $wpFaService->getWpFaByHesabixId('product', $receiptItem->ItemCode); + $wpdb->insert($wpdb->prefix . 'hesabix', array( + 'id_hesabix' => (int) $item->ObjectId, + 'obj_type' => "receiptItems", + 'id_ps' => $wpFa->idWp, + 'id_ps_attribute' => $wpFa->idWpAttribute + )); + } + + if (get_option('hesabix_item_update_quantity', 'no') == 'no') { + HesabixLogService::writeLogStr("Sync Products Quantity is Off"); + } + } + if ($item->Action == 263) { + global $wpdb; + $rows = $wpdb->get_results("SELECT * FROM `" . $wpdb->prefix . "hesabix` WHERE `id_hesabix` = $item->ObjectId"); + $receiptID = $item->ObjectId; + foreach ($rows as $row) { + $post_id = ($row->id_ps_attribute && $row->id_ps_attribute > 0) ? $row->id_ps_attribute : $row->id_ps; + + + if (get_option('hesabix_item_update_quantity', 'no') == 'no') { + HesabixLogService::writeLogStr("Sync Products Quantity is Off"); + } + + $productId = $row->id_ps; + $attributeId = $row->id_ps_attribute; + + if (get_option('hesabix_item_update_quantity', 'no') == 'yes') + update_post_meta($attributeId, '_manage_stock', 'yes'); + + if ($productId == $attributeId) + $attributeId = 0; + $result = array(); + + $wpFaService = new HesabixWpFaService(); + $wpFa = $wpFaService->getWpFa('product', $productId, $attributeId); + if ($wpFa) { + + $api = new Hesabix_Api(); + // $warehouse = get_option('hesabix_item_update_quantity_based_on', "-1"); + // if ($warehouse == "-1") + // $response = $api->itemGet($wpFa->idHesabix); + // else { + // $response = $api->itemGetQuantity($warehouse, array($wpFa->idHesabix)); + // } + + $response = $api->itemGet($wpFa->idHesabix); + if ($response->Success) { + // $item = $warehouse == "-1" ? $response->Result : $response->Result[0]; + $item = $response->Result; + $newProps = Hesabix_Admin_Functions::setItemChanges($item); + } else { + HesabixLogService::writeLogStr("Product is not defined in Hesabix"); + } + } + } + + $wpdb->delete($wpdb->prefix . 'hesabix', array('id_hesabix' => $receiptID)); + break; + } + $this->warehouseReceiptsObjectId[] = $item->ObjectId; + break; + case 'Product': + if ($item->Action == 53) { + $wpFa = $wpFaService->getWpFaByHesabixId('product', $item->Extra); + if ($wpFa) { + global $wpdb; + $wpdb->delete($wpdb->prefix . 'hesabix', array('id' => $wpFa->id)); + } + break; + } + + $this->itemsObjectId[] = $item->ObjectId; + break; + case 'Contact': + if ($item->Action == 33) { + $id_obj = $wpFaService->getWpFaIdByHesabixId('customer', $item->Extra); + global $wpdb; + $wpdb->delete($wpdb->prefix . 'hesabix', array('id' => $id_obj)); + break; + } + + $this->contactsObjectId[] = $item->ObjectId; + break; + } + } + } + + $this->invoiceItemsCode = array_unique($this->invoiceItemsCode); + $this->contactsObjectId = array_unique($this->contactsObjectId); + $this->itemsObjectId = array_unique($this->itemsObjectId); + $this->invoicesObjectId = array_unique($this->invoicesObjectId); + + $this->setChanges(); + + $lastChange = end($changes->Result); + if (is_object($lastChange)) + update_option('hesabix_last_log_check_id', $lastChange->Id); + else if ($changes->LastId) + update_option('hesabix_last_log_check_id', $changes->LastId); + + } else { + HesabixLogService::log(array("hesabix - Cannot check last changes. Error Message: " . (string) $changes->ErrorMessage . ". Error Code: " . (string) $changes->ErrorCode)); + if ($changes->ErrorCode == 108) { + update_option('hesabix_business_expired', 1); + add_action('admin_notices', array(__CLASS__, 'hesabix_business_expired_notice')); + } + return false; + } + + return true; + } + + public function hesabix_business_expired_notice() + { + echo '

' . __('Cannot connect to Hesabix. Business expired.', 'hesabix') . '

'; + } + + public function setChanges() + { + + $items = array(); + + if (!empty($this->warehouseReceiptsObjectId)) { + $receipts = $this->getObjectsByIdList($this->warehouseReceiptsObjectId, 'WarehouseReceipt'); + if ($receipts != false) { + foreach ($receipts as $receipt) { + foreach ($receipt->Items as $item) + array_push($this->invoiceItemsCode, $item->ItemCode); + } + } + } + + if (!empty($this->itemsObjectId)) { + $objects = $this->getObjectsByIdList($this->itemsObjectId, 'item'); + if ($objects != false) { + foreach ($objects as $object) { + array_push($items, $object); + } + } + } + + if (!empty($this->invoiceItemsCode)) { + $objects = $this->getObjectsByCodeList($this->invoiceItemsCode); + + if ($objects != false) { + foreach ($objects as $object) { + array_push($items, $object); + } + } + } + + if (!empty($items)) { + update_option("hesabix_inside_product_edit", 1); + try { + foreach ($items as $item) { + Hesabix_Admin_Functions::setItemChanges($item); + } + } catch (Exception $e) { + } finally { + update_option("hesabix_inside_product_edit", 0); + } + } + + return true; + } + + public function setInvoiceChanges($invoice) + { + if (!is_object($invoice)) + return false; + + $wpFaService = new HesabixWpFaService(); + + $number = $invoice->Number; + $json = json_decode($invoice->Tag); + if (is_object($json)) { + $id_order = $json->id_order; + } else { + $id_order = 0; + } + + if ($invoice->InvoiceType == 0) { + if ($id_order == 0) { + HesabixLogService::log(array("This invoice is not defined in OnlineStore. Invoice Number: " . $number)); + } else { + + $id_obj = $wpFaService->getWpFaId('order', $id_order); + if ($id_obj != false) { + global $wpdb; + $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "hesabix` WHERE `id` = $id_obj"); + if (is_object($row) && $row->id_hesabix != $number) { + $id_hesabix_old = $row->id_hesabix; + + $wpdb->update($wpdb->prefix . 'hesabix', array('id_hesabix' => $number), array('id' => $id_obj)); + HesabixLogService::log(array("Invoice Number changed. Old Number: $id_hesabix_old. New ID: $number")); + } + } + } + } + } + + public function setContactChanges($contact) + { + if (!is_object($contact)) + return false; + + $code = $contact->Code; + + $json = json_decode($contact->Tag); + if (is_object($json)) { + $id_customer = $json->id_customer; + } else { + $id_customer = 0; + } + + if ($id_customer == 0) { + HesabixLogService::log(array("This Customer is not define in OnlineStore. Customer code: $code")); + return false; + } + + $wpFaService = new HesabixWpFaService(); + $id_obj = $wpFaService->getWpFaId('customer', $id_customer); + + if ($id_obj != false) { + global $wpdb; + $row = $wpdb->get_row("SELECT `id_hesabix` FROM `" . $wpdb->prefix . "hesabix` WHERE `id` = $id_obj"); + + if (is_object($row) && $row->id_hesabix != $code) { + $id_hesabix_old = $row->id_hesabix; + $wpdb->update($wpdb->prefix . 'hesabix', array('id_hesabix' => (int) $code), array('id' => $id_obj)); + + HesabixLogService::log(array("Contact Code changed. Old ID: $id_hesabix_old. New ID: $code")); + } + } + + return true; + } + + public function getObjectsByIdList($idList, $type) + { + $hesabixApi = new Hesabix_Api(); + // $warehouseCode = get_option('hesabix_item_update_quantity_based_on'); + switch ($type) { + case 'item': + // if ($warehouseCode == '-1') { + $result = $hesabixApi->itemGetById($idList); + // } else { + // $items = $hesabixApi->itemGetById($idList); + // $codeList = []; + // foreach ($items->Result as $item) { + // array_push($codeList, $item->Code); + // } + // $result = $hesabixApi->itemGetQuantity($warehouseCode, $codeList); + // } + break; + case 'contact': + $result = $hesabixApi->contactGetById($idList); + break; + case 'invoice': + $result = $hesabixApi->invoiceGetInvoices(array("Filters" => array("Property" => "Id", "Operator" => "in", "Value" => $idList))); + break; + case 'WarehouseReceipt': + $result = $hesabixApi->warehouseReceiptGetByIdList($idList); + break; + default: + return false; + } + + if (is_object($result) && $result->Success) { + return $result->Result; + } + + return false; + } + + public function getObjectsByCodeList($codeList) + { + $hesabixApi = new Hesabix_Api(); + + // $warehouse = get_option('hesabix_item_update_quantity_based_on', "-1"); + // if ($warehouse == "-1") + // $result = $hesabixApi->itemGetItemsByCodes($codeList); + // else { + // $result = $hesabixApi->itemGetQuantity($warehouse, $codeList); + // } + + $result = $hesabixApi->itemGetItemsByCodes($codeList); + + + if (is_object($result) && $result->Success) { + // return $warehouse == "-1" ? $result->Result->List : $result->Result; + return $result->Result->List; + } + + return false; + } +} diff --git a/includes/class-hesabix.php b/includes/class-hesabix.php new file mode 100644 index 0000000..4c2b458 --- /dev/null +++ b/includes/class-hesabix.php @@ -0,0 +1,159 @@ +version = HESABIX_VERSION; + } else { + $this->version = '0.0.1'; + } + $this->plugin_name = 'hesabix'; + $this->load_dependencies(); + $this->set_locale(); + $this->define_admin_hooks(); + } + + private function load_dependencies() + { + require_once plugin_dir_path(dirname(__FILE__)) . '/includes/class-hesabix-loader.php'; + require_once plugin_dir_path(dirname(__FILE__)) . '/includes/class-hesabix-i18n.php'; + require_once plugin_dir_path(dirname(__FILE__)) . '/admin/class-hesabix-admin.php'; + require_once plugin_dir_path(dirname(__FILE__)) . '/includes/class-hesabix-api.php'; + $this->loader = new Hesabix_Loader(); + require_once plugin_dir_path(dirname(__FILE__)) . '/includes/class-hesabix-validation.php'; + $this->loader = new Hesabix_Loader(); + + } + + private function set_locale() + { + $plugin_i18n = new Hesabix_i18n(); + $this->loader->add_action('plugins_loaded', $plugin_i18n, 'load_plugin_textdomain'); + } + + private function define_admin_hooks() + { + $plugin_admin = new Hesabix_Admin($this->get_plugin_name(), $this->get_version()); + + $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_styles'); + $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts'); + $this->loader->add_filter('query_vars', $plugin_admin, 'hesabix_query_vars'); + $this->loader->add_action('parse_request', $plugin_admin, 'hesabix_parse_request'); + $this->loader->add_action('wp_ajax_nopriv_handle_webhook_request', $plugin_admin, 'hesabix_parse_request'); + $this->loader->add_action('wp_ajax_handle_webhook_request', $plugin_admin, 'hesabix_parse_request'); + + if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) { + + $this->loader->add_action('init', $plugin_admin, 'hesabix_init_internal'); + + if (get_option('hesabix_live_mode')) { + if (get_option('hesabix_hesabix_default_currency') === 0) { + $this->loader->add_action('admin_notices', $plugin_admin, 'hesabix_currency_notice'); + } + if (get_option('hesabix_show_hesabix_code_in_excel_export', 'no') == 'yes' || get_option('hesabix_show_hesabix_code_in_excel_export', 0) == 1) { + $this->loader->add_filter('woocommerce_product_export_column_names', $plugin_admin, 'admin_product_add_column'); + $this->loader->add_filter('woocommerce_product_export_product_default_columns', $plugin_admin, 'admin_product_add_column'); + $this->loader->add_filter('woocommerce_product_export_rows', $plugin_admin, 'admin_product_export_rows', 10, 2); + } + if (get_option('hesabix_show_product_code_in_products_page') === 'yes' || get_option('hesabix_show_product_code_in_products_page', 0) == 1) { + $this->loader->add_filter('manage_edit-product_columns', $plugin_admin, 'admin_products_hesabixId_column', 12); + $this->loader->add_action('manage_product_posts_custom_column', $plugin_admin, 'admin_products_hesabixId_column_content', 10, 2); + $this->loader->add_filter('manage_edit-product_sortable_columns', $plugin_admin, 'admin_products_hesabixId_column'); + } + $this->loader->add_action('custom_product_tabs', $plugin_admin, 'hesabix_general_notices'); + $this->loader->add_filter('bulk_actions-edit-shop_order', $plugin_admin, 'custom_orders_list_bulk_action', 20, 1); + $this->loader->add_filter('handle_bulk_actions-edit-shop_order', $plugin_admin, 'custom_orders_list_bulk_action_run', 10, 3); + if (get_option('woocommerce_custom_orders_table_enabled') == 'yes') { + $this->loader->add_filter('woocommerce_shop_order_list_table_columns', $plugin_admin, 'custom_hesabix_column_order_list', 20); + $this->loader->add_action('woocommerce_shop_order_list_table_custom_column', $plugin_admin, 'custom_orders_list_column_content', 10, 2); + } else { + $this->loader->add_filter('manage_edit-shop_order_columns', $plugin_admin, 'custom_hesabix_column_order_list', 20); + $this->loader->add_action('manage_shop_order_posts_custom_column', $plugin_admin, 'custom_orders_list_column_content', 20, 2); + } + $this->loader->add_filter('woocommerce_checkout_fields', $plugin_admin, 'add_additional_fields_to_checkout', 10, 3); + $this->loader->add_action('woocommerce_admin_order_data_after_billing_address', $plugin_admin, 'show_additional_fields_in_order_detail', 10, 3); + $this->loader->add_action('woocommerce_order_status_changed', $plugin_admin, 'hesabix_hook_order_status_change', 10, 3); + $this->loader->add_filter('woocommerce_order_status_changed', $plugin_admin, 'hesabix_hook_payment_confirmation', 11, 3); + $this->loader->add_action('woocommerce_new_order', $plugin_admin, 'hesabix_hook_new_order', 11, 2); + $this->loader->add_action('edit_user_profile', $plugin_admin, 'hesabix_hook_edit_user'); + $this->loader->add_action('user_register', $plugin_admin, 'hesabix_hook_user_register'); + $this->loader->add_action('personal_options_update', $plugin_admin, 'hesabix_hook_user_register'); + $this->loader->add_action('profile_update', $plugin_admin, 'hesabix_hook_user_register'); + $this->loader->add_action('delete_user', $plugin_admin, 'hesabix_hook_delete_user'); + $this->loader->add_action('woocommerce_update_product', $plugin_admin, 'hesabix_hook_new_product'); + $this->loader->add_action('before_delete_post', $plugin_admin, 'hesabix_hook_delete_product'); + $this->loader->add_action('woocommerce_product_options_general_product_data', $plugin_admin, 'hesabix_hook_product_options_general_product_data'); + $this->loader->add_action('woocommerce_process_product_meta', $plugin_admin, 'hesabix_hook_process_product_meta'); + $this->loader->add_action('woocommerce_product_after_variable_attributes', $plugin_admin, 'hesabix_hook_product_after_variable_attributes', 10, 3); + $this->loader->add_action('woocommerce_save_product_variation', $plugin_admin, 'hesabix_hook_save_product_variation', 10, 3); + $this->loader->add_filter('woocommerce_product_data_tabs', $plugin_admin, 'add_hesabix_product_data_tab'); + $this->loader->add_action('woocommerce_product_data_panels', $plugin_admin, 'add_hesabix_product_data_fields'); + + } elseif (!get_option('hesabix_live_mode')) { + if (get_option('hesabix_business_expired')) { + $this->loader->add_action('admin_notices', $plugin_admin, 'hesabix_business_expired_notice'); + } else { + $this->loader->add_action('admin_notices', $plugin_admin, 'hesabix_live_mode_notice'); + } + } + $this->loader->add_filter('wp_ajax_adminExportProducts', $plugin_admin, 'adminExportProductsCallback'); + $this->loader->add_filter('wp_ajax_adminImportProducts', $plugin_admin, 'adminImportProductsCallback'); + $this->loader->add_filter('wp_ajax_adminExportProductsOpeningQuantity', $plugin_admin, 'adminExportProductsOpeningQuantityCallback'); + $this->loader->add_filter('wp_ajax_adminExportCustomers', $plugin_admin, 'adminExportCustomersCallback'); + $this->loader->add_filter('wp_ajax_adminSyncChanges', $plugin_admin, 'adminSyncChangesCallback'); + $this->loader->add_filter('wp_ajax_admin_sync_products', $plugin_admin, 'admin_sync_products_callback'); + $this->loader->add_filter('wp_ajax_admin_sync_orders', $plugin_admin, 'admin_sync_orders_callback'); + $this->loader->add_filter('wp_ajax_admin_update_products', $plugin_admin, 'admin_update_products_callback'); + $this->loader->add_filter('wp_ajax_admin_update_wc_products', $plugin_admin, 'admin_update_wc_products_callback'); + $this->loader->add_filter('wp_ajax_adminUpdateProductsWithFilter', $plugin_admin, 'adminUpdateProductsWithFilterCallback'); + $this->loader->add_filter('wp_ajax_adminSubmitInvoice', $plugin_admin, 'adminSubmitInvoiceCallback'); + $this->loader->add_filter('wp_ajax_hesabix_update_customers', $plugin_admin, 'hesabix_update_customers_ajax'); + $this->loader->add_filter('wp_ajax_adminCleanLogFile', $plugin_admin, 'adminCleanLogFileCallback'); + $this->loader->add_filter('wp_ajax_adminClearPluginData', $plugin_admin, 'adminClearPluginDataCallback', 10, 4); + $this->loader->add_filter('wp_ajax_adminInstallPluginData', $plugin_admin, 'adminInstallPluginDataCallback', 10, 4); + $this->loader->add_filter('wp_ajax_adminChangeProductCode', $plugin_admin, 'adminChangeProductCodeCallback'); + $this->loader->add_filter('wp_ajax_adminDeleteProductLink', $plugin_admin, 'adminDeleteProductLinkCallback'); + $this->loader->add_filter('wp_ajax_adminUpdateProduct', $plugin_admin, 'adminUpdateProductCallback'); + $this->loader->add_filter('wp_ajax_adminChangeProductsCode', $plugin_admin, 'adminChangeProductsCodeCallback'); + $this->loader->add_filter('wp_ajax_adminDeleteProductsLink', $plugin_admin, 'adminDeleteProductsLinkCallback'); + $this->loader->add_filter('wp_ajax_adminUpdateProductAndVariations', $plugin_admin, 'adminUpdateProductAndVariationsCallback'); + $this->loader->add_filter('wp_ajax_admin_get_home_stats', $plugin_admin, 'admin_get_home_stats_callback'); + $this->loader->add_filter('wp_ajax_admin_check_for_updates', $plugin_admin, 'admin_check_for_updates_callback'); + $this->loader->add_filter('wp_ajax_adminSaveApiSettings', $plugin_admin, 'adminSaveApiSettingsCallback'); + $this->loader->add_filter('wp_ajax_adminTestApiConnection', $plugin_admin, 'adminTestApiConnectionCallback'); + + + } + } + + public function run() + { + $this->loader->run(); + } + public function get_plugin_name() + { + return $this->plugin_name; + } + public function get_loader() + { + return $this->loader; + } + public function get_version() + { + return $this->version; + } +} diff --git a/includes/class-ssbhesabix-activator.php b/includes/class-ssbhesabix-activator.php deleted file mode 100644 index 4d58713..0000000 --- a/includes/class-ssbhesabix-activator.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - */ -class Ssbhesabix_Activator { - public static $ssbhesabix_db_version = '1.1'; - - /** - * Short Description. (use period) - * - * Long Description. - * - * @since 1.0.0 - */ -//=============================================================================================================== - public static function activate() { - add_option('ssbhesabix_webhook_password', bin2hex(openssl_random_pseudo_bytes(16))); - add_option('ssbhesabix_last_log_check_id', 0); - add_option('ssbhesabix_live_mode', 0); - add_option('ssbhesabix_debug_mode', 0); - add_option('ssbhesabix_contact_address_status', 1); - add_option('ssbhesabix_contact_node_family', 'مشتریان فروشگاه آن‌لاین'); - add_option('ssbhesabix_contact_automaatic_save_node_family', 'yes'); - add_option('ssbhesabix_contact_automatically_save_in_hesabix', 'yes'); - add_option('ssbhesabix_activation_date', date("Y-m-d")); - add_option('ssbhesabix_use_export_product_opening_quantity', false); - add_option('ssbhesabix_business_expired', 0); - add_option('ssbhesabix_do_not_submit_product_automatically', "no"); - add_option('ssbhesabix_do_not_update_product_price_in_hesabix', "no"); - add_option('ssbhesabix_contact_add_additional_checkout_fields_hesabix', 1); - - self::ssbhesabix_create_database_table(); - } -//=============================================================================================================== - public static function ssbhesabix_create_database_table() - { - global $wpdb; - $table_name = $wpdb->prefix . "ssbhesabix"; - $charset_collate = $wpdb->get_charset_collate(); - - $sql = " - CREATE TABLE $table_name ( - id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, - obj_type varchar(32) NOT NULL, - id_hesabix int(11) UNSIGNED NOT NULL, - id_ps int(11) UNSIGNED NOT NULL, - id_ps_attribute int(11) UNSIGNED NOT NULL DEFAULT 0, - PRIMARY KEY (id) - ) $charset_collate;"; - - require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); - dbDelta($sql); - - update_option('ssbhesabix_db_version', self::$ssbhesabix_db_version); - } -//=============================================================================================================== -} diff --git a/includes/class-ssbhesabix-deactivator.php b/includes/class-ssbhesabix-deactivator.php deleted file mode 100644 index 86dd543..0000000 --- a/includes/class-ssbhesabix-deactivator.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - */ -class Ssbhesabix_Deactivator { - - /** - * Short Description. (use period) - * - * Long Description. - * - * @since 1.0.0 - */ - public static function deactivate() { - - } - -} diff --git a/includes/class-ssbhesabix-i18n.php b/includes/class-ssbhesabix-i18n.php deleted file mode 100644 index f0ab1e0..0000000 --- a/includes/class-ssbhesabix-i18n.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - * @author Babak Alizadeh - */ -class Ssbhesabix_i18n { - - - /** - * Load the plugin text domain for translation. - * - * @since 1.0.0 - */ - public function load_plugin_textdomain() { - - load_plugin_textdomain( - 'ssbhesabix', - false, - dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' - ); - - } -} diff --git a/includes/class-ssbhesabix-loader.php b/includes/class-ssbhesabix-loader.php deleted file mode 100644 index 8a9cc4b..0000000 --- a/includes/class-ssbhesabix-loader.php +++ /dev/null @@ -1,123 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - * @author Babak Alizadeh - */ - -class Ssbhesabix_Loader { - - /** - * The array of actions registered with WordPress. - * - * @since 1.0.0 - * @access protected - * @var array $actions The actions registered with WordPress to fire when the plugin loads. - */ - protected $actions; - - /** - * The array of filters registered with WordPress. - * - * @since 1.0.0 - * @access protected - * @var array $filters The filters registered with WordPress to fire when the plugin loads. - */ - protected $filters; - - /** - * Initialize the collections used to maintain the actions and filters. - * - * @since 1.0.0 - */ - public function __construct() { - - $this->actions = array(); - $this->filters = array(); - - } - - /** - * Add a new action to the collection to be registered with WordPress. - * - * @since 1.0.0 - * @param string $hook The name of the WordPress action that is being registered. - * @param object $component A reference to the instance of the object on which the action is defined. - * @param string $callback The name of the function definition on the $component. - * @param int $priority Optional. The priority at which the function should be fired. Default is 10. - * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1. - */ - public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { - $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args ); - } - - /** - * Add a new filter to the collection to be registered with WordPress. - * - * @since 1.0.0 - * @param string $hook The name of the WordPress filter that is being registered. - * @param object $component A reference to the instance of the object on which the filter is defined. - * @param string $callback The name of the function definition on the $component. - * @param int $priority Optional. The priority at which the function should be fired. Default is 10. - * @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1 - */ - public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { - $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args ); - } - - /** - * A utility function that is used to register the actions and hooks into a single - * collection. - * - * @since 1.0.0 - * @access private - * @param array $hooks The collection of hooks that is being registered (that is, actions or filters). - * @param string $hook The name of the WordPress filter that is being registered. - * @param object $component A reference to the instance of the object on which the filter is defined. - * @param string $callback The name of the function definition on the $component. - * @param int $priority The priority at which the function should be fired. - * @param int $accepted_args The number of arguments that should be passed to the $callback. - * @return array The collection of actions and filters registered with WordPress. - */ - private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) { - - $hooks[] = array( - 'hook' => $hook, - 'component' => $component, - 'callback' => $callback, - 'priority' => $priority, - 'accepted_args' => $accepted_args - ); - - return $hooks; - - } - - /** - * Register the filters and actions with WordPress. - * - * @since 1.0.0 - */ - public function run() { - - foreach ( $this->filters as $hook ) { - add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] ); - } - - foreach ( $this->actions as $hook ) { - add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] ); - } - - } - -} diff --git a/includes/class-ssbhesabix-validation.php b/includes/class-ssbhesabix-validation.php deleted file mode 100644 index 02e23ef..0000000 --- a/includes/class-ssbhesabix-validation.php +++ /dev/null @@ -1,318 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - * @author Babak Alizadeh - */ - -class Ssbhesabix_Validation -{ - public static function itemCodeValidation($code) - { - $code = preg_replace('/[^0-9]/', '', $code); - $code = self::formatFarsiNumbers($code); - return mb_substr($code, 0, 5); - } -//============================================================================================= - public static function itemNameValidation($name) - { - $name = self::formatFarsiNumbers($name); - return self::remove_emoji($name, 199); - } -//============================================================================================= - public static function formatFarsiNumbers($str) { - $farsiNumbers = ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"]; - $englishNumbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - for ($i = 0; $i < 10; $i++) - $str = str_replace($farsiNumbers[$i], $englishNumbers[$i], $str); - return $str; - } -//============================================================================================= - public static function itemBarcodeValidation($barcode) - { - $barcode = self::formatFarsiNumbers($barcode); - return mb_substr($barcode, 0, 999); - } -//============================================================================================= - public static function itemCategoryValidation($category) {return $category;} -//============================================================================================= - public static function itemDescriptionValidation($description) {return mb_substr($description, 0, 199);} -//============================================================================================= - public static function itemMainUnitValidation($mainUnit) {return mb_substr($mainUnit, 0, 29);} -//============================================================================================= - public static function itemSubUnitValidation($subUnit) {return mb_substr($subUnit, 0, 29);} -//============================================================================================= - public static function itemConversionFactorValidation($conversionFactor) - { - if ($conversionFactor < 0) { - return 0; - } else { - return $conversionFactor; - } - } -//============================================================================================= - public static function itemSalesTaxValidation($salesTax) - { - if ($salesTax >= 0 && $salesTax <= 100) { - return $salesTax; - } else { - return 0; - } - } -//============================================================================================= - public static function itemSalesInfoValidation($salesInfo) {return mb_substr($salesInfo, 0, 99);} -//============================================================================================= - public static function itemPurchaseCostValidation($purchaseCost) - { - if ($purchaseCost >= 0) { - return $purchaseCost; - } else { - return 0; - } - } -//============================================================================================= - public static function itemPurchaseInfoValidation($purchaseInfo) {return mb_substr($purchaseInfo, 0, 99);} -//============================================================================================= - public static function itemTagValidation($tag) {return mb_substr($tag, 0, 254);} -//============================================================================================= - public static function contactCodeValidation($code) - { - $code = preg_replace('/[^0-9]/', '', $code); - return mb_substr($code, 0, 5); - } -//============================================================================================= - public static function contactDisplayNameValidation($displayName) {return mb_substr($displayName, 0, 99);} -//============================================================================================= - public static function contactCompanyValidation($company) {return mb_substr($company, 0, 99);} -//============================================================================================= - public static function contactTitleValidation($title) {return mb_substr($title, 0, 49);} -//============================================================================================= - public static function contactFirstNameValidation($firstName) {return mb_substr($firstName, 0, 49);} -//============================================================================================= - public static function contactLastNameValidation($lastName) {return mb_substr($lastName, 0, 49);} -//============================================================================================= - public static function contactAddressValidation($address) {return mb_substr($address, 0, 149);} -//============================================================================================= - public static function contactCountryValidation($country) {return mb_substr($country, 0, 49);} -//============================================================================================= - public static function contactStateValidation($state) { - if ( is_numeric( $state ) ) { - if(is_plugin_active("persian-woocommerce-shipping/woocommerce-shipping.php")) { - $state = PWS()::get_state( $state ); - } - } - return mb_substr($state, 0, 49); - } -//============================================================================================= - public static function contactCityValidation($city) { - if ( is_numeric( $city ) ) { - if(is_plugin_active("persian-woocommerce-shipping/woocommerce-shipping.php")) { - $city = PWS()::get_city($city); - } - } - return mb_substr($city, 0, 49); - } -//============================================================================================= - public static function contactPostalCodeValidation($postalCode) - { - $postalCode = preg_replace('/[^0-9]/', '', $postalCode); - $postalCode = self::formatFarsiNumbers($postalCode); - return mb_substr($postalCode, 0, 10); - } -//============================================================================================= - public static function contactPhoneValidation($phone) - { - $phone = preg_replace('/[^0-9]/', '', $phone); - $phone = self::formatFarsiNumbers($phone); - return mb_substr($phone, 0, 14); - } -//============================================================================================= - public static function contactMobileValidation($mobile) - { - $mobile = preg_replace('/[^0-9]/', '', $mobile); - return mb_substr($mobile, 0, 14); - } -//============================================================================================= - public static function contactFaxValidation($fax) - { - $fax = preg_replace('/[^0-9]/', '', $fax); - return mb_substr($fax, 0, 14); - } -//============================================================================================= - public static function contactEmailValidation($email) - { - $isValid = true; - $atIndex = strrpos($email, "@"); - if (is_bool($atIndex) && !$atIndex) { - $isValid = false; - } else { - $domain = substr($email, $atIndex + 1); - $local = substr($email, 0, $atIndex); - $localLen = strlen($local); - $domainLen = strlen($domain); - if ($localLen < 1 || $localLen > 64) { - // local part length exceeded - $isValid = false; - } else if ($domainLen < 1 || $domainLen > 255) { - // domain part length exceeded - $isValid = false; - } else if ($local[0] == '.' || $local[$localLen - 1] == '.') { - // local part starts or ends with '.' - $isValid = false; - } else if (preg_match('/\\.\\./', $local)) { - // local part has two consecutive dots - $isValid = false; - } else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) { - // character not valid in domain part - $isValid = false; - } else if (preg_match('/\\.\\./', $domain)) { - // domain part has two consecutive dots - $isValid = false; - } else if - (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', - str_replace("\\\\", "", $local))) { - // character not valid in local part unless - // local part is quoted - if (!preg_match('/^"(\\\\"|[^"])+"$/', - str_replace("\\\\", "", $local))) { - $isValid = false; - } - } - } - - if ($isValid) { - return $email; - } else { - return null; - } - } -//============================================================================================= - public static function contactWebsiteValidation($website) {return mb_substr($website, 0, 119);} -//============================================================================================= - public static function contactNoteValidation($note) {return mb_substr($note, 0, 499);} -//============================================================================================= - public static function contactCategoryValidation($category) {return $category;} -//============================================================================================= - public static function contactTagValidation($tag) {return mb_substr($tag, 0, 254);} -//============================================================================================= - public static function invoiceFinancialYearValidation($financialYear) {return $financialYear;} -//============================================================================================= - public static function invoiceCurrencyRateValidation($currencyRate) - { - if ($currencyRate > 0) { - return $currencyRate; - } else { - return 1; - } - } -//============================================================================================= - public static function invoiceNumberValidation($number) {return mb_substr($number, 0, 49);} -//============================================================================================= - public static function invoiceContactTitleValidation($contactTitle) {return mb_substr($contactTitle, 0, 199);} -//============================================================================================= - public static function invoiceDueDateValidation($dueDate) {return $dueDate;} -//============================================================================================= - public static function invoiceNoteValidation($note) {return mb_substr($note, 0, 499);} -//============================================================================================= - public static function invoiceReferenceValidation($reference) {return mb_substr($reference, 0, 49);} -//============================================================================================= - public static function invoiceTagValidation($tag) {return mb_substr($tag, 0, 254);} -//============================================================================================= - public function invoiceItemsValidation($items) {return $items;} -//============================================================================================= - public static function invoiceItemDescriptionValidation($description) { - return self::remove_emoji($description, 249); - } -//============================================================================================= - public static function invoiceItemQuantityValidation($quantity) - { - if ($quantity > 0) { - return $quantity; - } else { - return 1; - } - } -//============================================================================================= - public static function invoiceItemUnitValidation($unit) {return mb_substr($unit, 0, 29);} -//============================================================================================= - public static function invoiceItemUnitPriceValidation($unitPrice) - { - if ($unitPrice >= 0) { - return $unitPrice; - } else { - return 0; - } - } -//============================================================================================= - public static function invoiceItemAmountValidation($amount) - { - if ($amount >= 0) { - return $amount; - } else { - return 0; - } - } -//============================================================================================= - public static function invoiceItemDiscountValidation($discount) - { - if ($discount >= 0) { - return $discount; - } else { - return 0; - } - } -//============================================================================================= - public static function invoiceItemTaxValidation($tax) - { - if ($tax >= 0) { - return $tax; - } else { - return 0; - } - } -//============================================================================================= - public static function invoiceItemTotalAmountValidation($totalAmount) - { - if ($totalAmount >= 0) { - return $totalAmount; - } else { - return 0; - } - } -//============================================================================================= - public static function remove_emoji($string, $length = 200) : string - { - $regex_alphanumeric = '/[\x{1F100}-\x{1F1FF}]/u'; - $clear_string = preg_replace($regex_alphanumeric, '', $string); - - $regex_symbols = '/[\x{1F300}-\x{1F5FF}]/u'; - $clear_string = preg_replace($regex_symbols, '', $clear_string); - - $regex_emoticons = '/[\x{1F600}-\x{1F64F}]/u'; - $clear_string = preg_replace($regex_emoticons, '', $clear_string); - - $regex_transport = '/[\x{1F680}-\x{1F6FF}]/u'; - $clear_string = preg_replace($regex_transport, '', $clear_string); - - $regex_supplemental = '/[\x{1F900}-\x{1F9FF}]/u'; - $clear_string = preg_replace($regex_supplemental, '', $clear_string); - - $regex_misc = '/[\x{2600}-\x{26FF}\x{1F7E9}-\x{1F7EF}]/u'; - $clear_string = preg_replace($regex_misc, '', $clear_string); - - $regex_dingbats = '/[\x{2700}-\x{27BF}]/u'; - $clear_string = preg_replace($regex_dingbats, '', $clear_string); - - $truncated_string = mb_substr($clear_string, 0, $length); - - return $truncated_string; - } -//============================================================================================= -} diff --git a/includes/class-ssbhesabix.php b/includes/class-ssbhesabix.php deleted file mode 100644 index 2b10951..0000000 --- a/includes/class-ssbhesabix.php +++ /dev/null @@ -1,343 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - * @author Babak Alizadeh - */ - -class Ssbhesabix -{ - - /** - * The loader that's responsible for maintaining and registering all hooks that power - * the plugin. - * - * @since 1.0.0 - * @access protected - * @var Ssbhesabix_Loader $loader Maintains and registers all hooks for the plugin. - */ - protected $loader; - - /** - * The unique identifier of this plugin. - * - * @since 1.0.0 - * @access protected - * @var string $plugin_name The string used to uniquely identify this plugin. - */ - protected $plugin_name; - - /** - * The current version of the plugin. - * - * @since 1.0.0 - * @access protected - * @var string $version The current version of the plugin. - */ - protected $version; -//========================================================================================================== - /** - * Define the core functionality of the plugin. - * - * Set the plugin name and the plugin version that can be used throughout the plugin. - * Load the dependencies, define the locale, and set the hooks for the admin area and - * the public-facing side of the site. - * - * @since 1.0.0 - */ - public function __construct() - { - if (defined('SSBHESABIX_VERSION')) { - $this->version = SSBHESABIX_VERSION; - } else { - $this->version = '0.40.1'; - } - $this->plugin_name = 'ssbhesabix'; - - $this->load_dependencies(); - $this->set_locale(); - $this->define_admin_hooks(); - } -//========================================================================================================== - /** - * Load the required dependencies for this plugin. - * - * Include the following files that make up the plugin: - * - * - Ssbhesabix_Loader. Orchestrates the hooks of the plugin. - * - Ssbhesabix_i18n. Defines internationalization functionality. - * - Ssbhesabix_Admin. Defines all hooks for the admin area. - * - Ssbhesabix_Public. Defines all hooks for the public side of the site. - * - * Create an instance of the loader which will be used to register the hooks - * with WordPress. - * - * @since 1.0.0 - * @access private - */ - private function load_dependencies() - { - - /** - * The class responsible for orchestrating the actions and filters of the - * core plugin. - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-ssbhesabix-loader.php'; - - /** - * The class responsible for defining internationalization functionality - * of the plugin. - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-ssbhesabix-i18n.php'; - - /** - * The class responsible for defining all actions that occur in the admin area. - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'admin/class-ssbhesabix-admin.php'; - - /** - * The class responsible for defining all hesabix API methods - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-ssbhesabix-api.php'; - - $this->loader = new Ssbhesabix_Loader(); - - /** - * The class responsible for defining all hesabix data Validations - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-ssbhesabix-validation.php'; - - $this->loader = new Ssbhesabix_Loader(); - - } -//===================================================================================== - /** - * Define the locale for this plugin for internationalization. - * - * Uses the Plugin_Name_i18n class in order to set the domain and to register the hook - * with WordPress. - * - * @since 1.0.0 - * @access private - */ - private function set_locale() - { - $plugin_i18n = new Ssbhesabix_i18n(); - - $this->loader->add_action('plugins_loaded', $plugin_i18n, 'load_plugin_textdomain'); - } -//===================================================================================== - /** - * Register all of the hooks related to the admin area functionality - * of the plugin. - * - * @since 1.0.0 - * @access private - */ - private function define_admin_hooks() - { - $plugin_admin = new Ssbhesabix_Admin($this->get_plugin_name(), $this->get_version()); - - //Related to check DB ver on plugin update - //$this->loader->add_action('plugins_loaded', $plugin_admin, 'ssbhesabix_update_db_check'); - - $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_styles'); - $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts'); - - //Related to webhook set - $this->loader->add_filter('query_vars', $plugin_admin, 'ssbhesabix_query_vars'); - $this->loader->add_action('parse_request', $plugin_admin, 'ssbhesabix_parse_request'); - - $this->loader->add_action('wp_ajax_nopriv_handle_webhook_request', $plugin_admin, 'ssbhesabix_parse_request'); - $this->loader->add_action('wp_ajax_handle_webhook_request', $plugin_admin, 'ssbhesabix_parse_request'); - - if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) { - - $this->loader->add_action('init', $plugin_admin, 'ssbhesabix_init_internal'); - - //Check plugin live mode - if (get_option('ssbhesabix_live_mode')) { - if (get_option('ssbhesabix_hesabix_default_currency') === 0) { - $this->loader->add_action('admin_notices', $plugin_admin, 'ssbhesabix_currency_notice'); - } - - if(get_option('ssbhesabix_show_hesabix_code_in_excel_export', 'no') == 'yes' || get_option('ssbhesabix_show_hesabix_code_in_excel_export', 0) == 1) { - ///////////ADD COLUMN TO WOOCOMMERCE CSV - $this->loader->add_filter( 'woocommerce_product_export_column_names', $plugin_admin, 'admin_product_add_column' ); - $this->loader->add_filter( 'woocommerce_product_export_product_default_columns', $plugin_admin, 'admin_product_add_column' ); - $this->loader->add_filter('woocommerce_product_export_rows', $plugin_admin, 'admin_product_export_rows', 10, 2); - } - // these lines add hesabix id to the all products list page and make it sortable as well - /////////////////////////////////////////////////////////////////////////////////////////////////////// - if(get_option('ssbhesabix_show_product_code_in_products_page') === 'yes') { - $this->loader->add_filter( 'manage_edit-product_columns', $plugin_admin,'admin_products_hesabixId_column', 12 ); - $this->loader->add_action( 'manage_product_posts_custom_column', $plugin_admin, 'admin_products_hesabixId_column_content', 10, 2 ); - $this->loader->add_filter( 'manage_edit-product_sortable_columns', $plugin_admin,'admin_products_hesabixId_column'); - } - - $this->loader->add_action('custom_product_tabs', $plugin_admin, 'ssbhesabix_general_notices'); - - // add filter and action for woocommerce order list - - $this->loader->add_filter('bulk_actions-edit-shop_order', $plugin_admin, 'custom_orders_list_bulk_action', 20, 1); - $this->loader->add_filter('handle_bulk_actions-edit-shop_order', $plugin_admin, 'custom_orders_list_bulk_action_run', 10, 3); - - if (get_option('woocommerce_custom_orders_table_enabled') == 'yes') { - $this->loader->add_filter( 'woocommerce_shop_order_list_table_columns', $plugin_admin, 'custom_hesabix_column_order_list', 20); - $this->loader->add_action( 'woocommerce_shop_order_list_table_custom_column', $plugin_admin, 'custom_orders_list_column_content', 10, 2 ); - } else { - $this->loader->add_filter('manage_edit-shop_order_columns', $plugin_admin, 'custom_hesabix_column_order_list', 20); - $this->loader->add_action('manage_shop_order_posts_custom_column', $plugin_admin, 'custom_orders_list_column_content', 20, 2); - } - - // check add fields to checkout page by hesabix plugin - if(get_option('ssbhesabix_contact_add_additional_checkout_fields_hesabix') == 1) { - $this->loader->add_filter('woocommerce_checkout_fields', $plugin_admin, 'add_additional_fields_to_checkout', 10, 3); - } - - // show checkout additional fields in order detail - if(get_option('ssbhesabix_contact_add_additional_checkout_fields_hesabix') == 1) { - $this->loader->add_action('woocommerce_admin_order_data_after_billing_address', $plugin_admin, 'show_additional_fields_in_order_detail', 10, 3); - } - - //Runs when a new order added. - $this->loader->add_action('woocommerce_order_status_changed', $plugin_admin, 'ssbhesabix_hook_order_status_change', 10, 3); - - //Runs when an order paid. -// $this->loader->add_action('woocommerce_payment_complete', $plugin_admin, 'ssbhesabix_hook_payment_confirmation', 10, 1); -// $this->loader->add_filter('woocommerce_payment_complete_order_status', $plugin_admin, 'ssbhesabix_hook_payment_confirmation', 10, 1); -// $this->loader->add_filter('woocommerce_order_status_completed', $plugin_admin, 'ssbhesabix_hook_payment_confirmation', 10, 1); - $this->loader->add_filter('woocommerce_order_status_changed', $plugin_admin, 'ssbhesabix_hook_payment_confirmation', 11, 3); - - $this->loader->add_action('woocommerce_new_order', $plugin_admin, 'ssbhesabix_hook_new_order', 11, 2); - - //Runs when a user's profile is first created. - $this->loader->add_action('edit_user_profile', $plugin_admin, 'ssbhesabix_hook_edit_user'); - - $this->loader->add_action('user_register', $plugin_admin, 'ssbhesabix_hook_user_register'); -// $this->loader->add_action('woocommerce_new_customer', $plugin_admin, 'ssbhesabix_hook_user_register'); -// $this->loader->add_action('woocommerce_created_customer', $plugin_admin, 'ssbhesabix_hook_user_register'); - //Runs when a user updates personal options from the admin screen. - $this->loader->add_action('personal_options_update', $plugin_admin, 'ssbhesabix_hook_user_register'); - //Runs when a user's profile is updated. - $this->loader->add_action('profile_update', $plugin_admin, 'ssbhesabix_hook_user_register'); - //Runs when a user is deleted. - $this->loader->add_action('delete_user', $plugin_admin, 'ssbhesabix_hook_delete_user'); - - //Runs when a product is added. -// $this->loader->add_action('woocommerce_new_product', $plugin_admin, 'ssbhesabix_hook_new_product'); -// $this->loader->add_action('woocommerce_new_product_variation', $plugin_admin, 'ssbhesabix_hook_new_product_variation', 10, 2); - //Runs when a product is updated. - $this->loader->add_action('woocommerce_update_product', $plugin_admin, 'ssbhesabix_hook_new_product'); -// $this->loader->add_action('woocommerce_update_product_variation', $plugin_admin, 'ssbhesabix_hook_new_product'); - //Runs when a product is deleted. - $this->loader->add_action('before_delete_post', $plugin_admin, 'ssbhesabix_hook_delete_product'); - //$this->loader->add_action('woocommerce_delete_product_variation', $plugin_admin, 'ssbhesabix_hook_delete_product_variation'); - - //Display hesabix item code in Product data section - $this->loader->add_action('woocommerce_product_options_general_product_data', $plugin_admin, 'ssbhesabix_hook_product_options_general_product_data'); - $this->loader->add_action('woocommerce_process_product_meta', $plugin_admin, 'ssbhesabix_hook_process_product_meta'); - //Display hesabix item code in Product variable attribute section - $this->loader->add_action('woocommerce_product_after_variable_attributes', $plugin_admin, 'ssbhesabix_hook_product_after_variable_attributes', 10, 3); - $this->loader->add_action('woocommerce_save_product_variation', $plugin_admin, 'ssbhesabix_hook_save_product_variation', 10, 3); - - $this->loader->add_filter('woocommerce_product_data_tabs', $plugin_admin, 'add_hesabix_product_data_tab'); - $this->loader->add_action('woocommerce_product_data_panels', $plugin_admin, 'add_hesabix_product_data_fields'); - - } elseif (!get_option('ssbhesabix_live_mode')) { - if (get_option('ssbhesabix_business_expired')) - $this->loader->add_action('admin_notices', $plugin_admin, 'ssbhesabix_business_expired_notice'); - else - $this->loader->add_action('admin_notices', $plugin_admin, 'ssbhesabix_live_mode_notice'); - } - - /* - * Action - Ajax 'Export Tabs' from hesabix/Export - * @since 1.0.0 - */ - $this->loader->add_filter('wp_ajax_adminExportProducts', $plugin_admin, 'adminExportProductsCallback'); - $this->loader->add_filter('wp_ajax_adminImportProducts', $plugin_admin, 'adminImportProductsCallback'); - $this->loader->add_filter('wp_ajax_adminExportProductsOpeningQuantity', $plugin_admin, 'adminExportProductsOpeningQuantityCallback'); - $this->loader->add_filter('wp_ajax_adminExportCustomers', $plugin_admin, 'adminExportCustomersCallback'); - - /* - * Action - Ajax 'Sync Tabs' from hesabix/Sync - * @since 1.0.0 - */ - $this->loader->add_filter('wp_ajax_adminSyncChanges', $plugin_admin, 'adminSyncChangesCallback'); - $this->loader->add_filter('wp_ajax_adminSyncProducts', $plugin_admin, 'adminSyncProductsCallback'); - $this->loader->add_filter('wp_ajax_adminSyncOrders', $plugin_admin, 'adminSyncOrdersCallback'); - $this->loader->add_filter('wp_ajax_adminUpdateProducts', $plugin_admin, 'adminUpdateProductsCallback'); - $this->loader->add_filter('wp_ajax_adminUpdateProductsWithFilter', $plugin_admin, 'adminUpdateProductsWithFilterCallback'); - $this->loader->add_filter('wp_ajax_adminSubmitInvoice', $plugin_admin, 'adminSubmitInvoiceCallback'); - - /* - * Action - Ajax 'Log Tab' from hesabix/Log - * @since 1.0.0 - */ - $this->loader->add_filter('wp_ajax_adminCleanLogFile', $plugin_admin, 'adminCleanLogFileCallback'); - - $this->loader->add_filter('wp_ajax_adminSyncProductsManually', $plugin_admin, 'adminSyncProductsManuallyCallback', 10, 4); - $this->loader->add_filter('wp_ajax_adminClearPluginData', $plugin_admin, 'adminClearPluginDataCallback', 10, 4); - $this->loader->add_filter('wp_ajax_adminInstallPluginData', $plugin_admin, 'adminInstallPluginDataCallback', 10, 4); - - $this->loader->add_filter('wp_ajax_adminChangeProductCode', $plugin_admin, 'adminChangeProductCodeCallback'); - $this->loader->add_filter('wp_ajax_adminDeleteProductLink', $plugin_admin, 'adminDeleteProductLinkCallback'); - $this->loader->add_filter('wp_ajax_adminUpdateProduct', $plugin_admin, 'adminUpdateProductCallback'); - $this->loader->add_filter('wp_ajax_adminChangeProductsCode', $plugin_admin, 'adminChangeProductsCodeCallback'); - $this->loader->add_filter('wp_ajax_adminDeleteProductsLink', $plugin_admin, 'adminDeleteProductsLinkCallback'); - $this->loader->add_filter('wp_ajax_adminUpdateProductAndVariations', $plugin_admin, 'adminUpdateProductAndVariationsCallback'); - - } else { - $this->loader->add_action('admin_notices', $plugin_admin, 'ssbhesabix_missing_notice'); - } - } -//===================================================================================== - /** - * Run the loader to execute all of the hooks with WordPress. - * - * @since 1.0.0 - */ - public function run() {$this->loader->run();} -//===================================================================================== - /** - * The name of the plugin used to uniquely identify it within the context of - * WordPress and to define internationalization functionality. - * - * @return string The name of the plugin. - * @since 1.0.0 - */ - public function get_plugin_name() {return $this->plugin_name;} -//===================================================================================== - /** - * The reference to the class that orchestrates the hooks with the plugin. - * - * @return Ssbhesabix_Loader Orchestrates the hooks of the plugin. - * @since 1.0.0 - */ - public function get_loader() {return $this->loader;} -//===================================================================================== - /** - * Retrieve the version number of the plugin. - * - * @return string The version number of the plugin. - * @since 1.0.0 - */ - public function get_version() {return $this->version;} -//===================================================================================== -} diff --git a/includes/hesabix-webhook.php b/includes/hesabix-webhook.php new file mode 100644 index 0000000..c4f2d93 --- /dev/null +++ b/includes/hesabix-webhook.php @@ -0,0 +1,33 @@ +Password != get_option('hesabix_webhook_password')) { + die('Invalid password.'); +} + +include(dirname(__FILE__) . '/class-hesabix-webhook.php'); +HesabixLogService::writeLogStr("Hesabix Webhook Called"); +new Hesabix_Webhook(); diff --git a/includes/index.php b/includes/index.php deleted file mode 100644 index e71af0e..0000000 --- a/includes/index.php +++ /dev/null @@ -1 +0,0 @@ - - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - * @author Babak Alizadeh - */ - -/* Check security token */ -if (!(defined('STDIN') || (strtolower(php_sapi_name()) == 'cli' && (!isset($_SERVER['REMOTE_ADDR']) - || empty($_SERVER['REMOTE_ADDR']))))) { - if (substr(wp_hash(AUTH_KEY . 'ssbhesabix/webhook'), 0, 10) != $_GET['token']) { - die('Bad token'); - } -} - -$post = file_get_contents('php://input'); -$result = json_decode($post); - -if (!is_object($result)) { - die('Invalid request.'); -} - -if ($result->Password != get_option('ssbhesabix_webhook_password')) { - die('Invalid password.'); -} - -include(dirname(__FILE__) . '/class-ssbhesabix-webhook.php'); -HesabixLogService::writeLogStr("Hesabix Webhook Called"); -new Ssbhesabix_Webhook(); diff --git a/index.php b/index.php deleted file mode 100644 index e71af0e..0000000 --- a/index.php +++ /dev/null @@ -1 +0,0 @@ -pa(WMndDoHIiRJ}Qqq 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%0Ao1|*VYe7%(Ks1#HguMnU?{`{ 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 Tokens Menu" +msgstr "کلید API را در حسابیکس از منوی تنظیمات->توکن دسترسی پیدا کنید" + +msgid "" +"No products were exported, All products were exported or there are no product" +msgstr "" +"هیچ محصولی استخراج نشد، تمامی محصولات قبلا استخراج شده‌اند یا محصولی وجود " +"ندارد." + +msgid "" +"No products were imported, All products were imported or there are no product" +msgstr "" +"هیچ محصولی وارد نشد، تمامی محصولات قبلا وارد شده‌اند یا محصولی وجود ندارد." + +msgid "Export products completed. %s products added/updated." +msgstr "استخراج محصولات به اتمام رسید. ‪‬%s محصول استخراج شد." + +msgid "Import products completed. %s products added/updated." +msgstr "ورود محصولات به اتمام رسید. ‪‬%s محصول وارد شد." + +msgid "Export products fail. Hesabix has already contained products." +msgstr "خروجی محصولات با خطا مواجه شد. حسابیکس از قبل حاوی محصولاتی است." + +msgid "Export products fail. Please check the log file." +msgstr "خروجی محصولات با خطا مواجه شد. لطفا لاگ را بررسی کنید." + +msgid "Import products fail. Please check the log file." +msgstr "ورود محصولات با خطا مواجه شد. لطفا لاگ را بررسی کنید." + +msgid "Export product opening quantity completed." +msgstr "استخراج موجودی اول دوره با موفقیت به پایان رسید." + +msgid "" +"Export product opening quantity fail. No Shareholder exists, Please define " +"Shareholder in Hesabix" +msgstr "" +"استخراج موجودی اول دوره با خطا مواجه شد. سهامدار تعریف نشده است، لطفا ابتدا " +"سهامداران را در حسابیکس تعریف کنید." + +msgid "No product available for Export product opening quantity." +msgstr "محصولی جهت استخراج موجودی اول دوره در دسترس نمی‌باشد." + +msgid "Export product opening quantity fail. Please check the log file." +msgstr "استخراج موجودی اول دوره با خطا مواجه شد. لطفا لاگ را بررسی کنید." + +msgid "" +"No customers were exported, All customers were exported or there are no " +"customer" +msgstr "" +"هیچ مشتری استخراج نشد، تمامی مشتریان قبلا استخراج شده‌اند یا مشتری وجود " +"ندارد." + +msgid "Export customers completed. %s customers added." +msgstr "استخراج مشتریان به اتمام رسید. %s مشتری استخراج شد." + +msgid "Export customers fail. Please check the log file." +msgstr "استخراج مشتریان با خطا مواجه شد. لطفا لاگ را بررسی کنید." + +msgid "Export can take several minutes." +msgstr "استخراج ممکن است چند دقیقه زمان ببرد." + +msgid "Export customers fail. Hesabix has already contained customers." +msgstr "خروجی مشتریان با خطا مواجه شد. حسابیکس از قبل حاوی مشتریان است." + +msgid "Export Products" +msgstr "خروجی محصولات" + +msgid "Import Products" +msgstr "ورود محصولات" + +msgid "Export and add all online store products to Hesabix" +msgstr "افزودن تمامی محصولات فروشگاه آنلاین در حسابیکس" + +msgid "Import and add all products from Hesabix to online store" +msgstr "افزودن تمامی محصولات حسابیکس به فروشگاه آنلاین" + +msgid "Export Products opening quantity" +msgstr "استخراج موجودی اول دوره" + +msgid "" +"Export the products quantity and record the 'products opening quantity' in " +"the Hesabix" +msgstr "استخراج موجودی محصولات و ثبت موجودی اول دوره در حسابیکس" + +msgid "Export Customers" +msgstr "خروجی مشتریان" + +msgid "Export and add all online store customers to Hesabix." +msgstr "افزودن تمامی مشتریان فروشگاه آنلاین در حسابیکس" + +msgid "Sync completed, All hesabix changes synced successfully." +msgstr "همسان‌سازی پایان یافت. تمامی تغییرات با حسابیکس همسان شد." + +msgid "Sync completed, All products price/quantity synced successfully." +msgstr "همسان سازی پایان یافت. قیمت/موجودی تمامی محصولات به روز شدند." + +msgid "Sync products fail. Please check the log file." +msgstr "همسان‌سازی محصولات با خطا مواجه شد. لطفا لاگ را بررسی کنید." + +msgid "Order sync completed. %s order added." +msgstr "همسان‌سازی پایان یافت. %s فاکتور به‌روزرسانی/افزوده شد." + +msgid "The date entered is not within the fiscal year." +msgstr "تاریخ وارد شده در محدوده سال مالی نمی‌باشد." + +msgid "Invoices are not synced before installing the plugin." +msgstr "" +"فاکتورهایی که قبل از زمان نصب این پلاگین صادر شده‌اند، امکان همسان‌سازی " +"ندارند." + +msgid "Cannot sync orders. Please enter valid Date format." +msgstr "امکان همسان سازی سفارشات نیست. لطفا تاریخ معتبری وارد نمایید." + +msgid "Sync can take several minutes." +msgstr "همسان‌سازی ممکن است چند دقیقه زمان ببرد." + +msgid "Enable or Disable Debug Mode" +msgstr "فعال کردن دیباگ مود" + +msgid "" +"Set request amount per batch for sync products based on woocommerce in " +"Hesabix" +msgstr "" +"تعداد درخواست ها در هر پارت برای همسان سازی محصولات در حسابیکس بر اساس " +"فروشگاه آنلاین" + +msgid "" +"Set request amount per batch for sync products based on Hesabix in " +"Woocommerce" +msgstr "" +"تعداد درخواست ها در هر پارت برای همسان سازی محصولات در فروشگاه آنلاین بر " +"اساس حسابیکس" + +msgid "Set request amount per batch for import products" +msgstr "تعداد درخواست ها در هر پارت برای ورود محصولات" + +msgid "Set request amount per batch for export products" +msgstr "تعداد درخواست ها در هر پارت برای استخراج محصولات" + +msgid "select" +msgstr "انتخاب کنید" + +msgid "Plugin Default" +msgstr "مقدار پیش فرض افزونه" + +msgid "Set request amount per batch for export opening quantity of products" +msgstr "تعداد درخواست ها در هر پارت برای استخراج موجودی اول دوره کالا ها" + +msgid "Sync Changes" +msgstr "همسان‌سازی تغییرات" + +msgid "Sync all Hesabix changes with Online Store." +msgstr "همسان‌سازی تمامی تعییرات حسابیکس با فروشگاه آن‌لاین" + +msgid "Sync Products Quantity and Price" +msgstr "همسان‌سازی قیمت و موجودی محصولات" + +msgid "Sync quantity and price of products in hesabix with online store." +msgstr "همسان‌سازی قیمت و موجودی محصولات حسابیکس با فروشگاه آن‌لاین" + +msgid "Sync Orders" +msgstr "همسان‌سازی سفارشات" + +msgid "Sync/Add orders in online store with hesabix from above date." +msgstr "همسان‌سازی سفارشات فروشگاه آن‌لاین با حسابیکس از تاریخ فوق" + +msgid "Cannot check the last change ID. Error Message: " +msgstr "امکان بررسی آخرین تغییرات وجود ندارد. شرح خطا:" + +msgid "" +"The fiscal year has passed or not arrived. Please check the fiscal year " +"settings in Hesabix." +msgstr "" +"سال مالی گذشته است یا هنوز فرا نرسیده است، لطفا تنظیمات سال مالی در حسابیکس " +"را بررسی کنید." + +msgid "Hesabix and WooCommerce default currency must be same." +msgstr "واحد پول پیش‌فرض حسابیکس و ووکامرس باید یکی باشد." + +msgid "Cannot check the Hesabix default currency. Error Message: " +msgstr "امکان دریافت واحد پول پیش‌فرض حسابیکس وجود ندارد. شرح خطا:" + +msgid "API Setting updated. Test Successfully" +msgstr "تنظیمات API به روزرسانی شد، اتصال موفقیت آمیز بود." + +msgid "Cannot set Hesabix webHook. Error Message:" +msgstr "امکان تنظیم وب‌هوک در حسابیکس وجود ندارد. شرح خطا:" + +msgid "Cannot connect to Hesabix. Business expired." +msgstr "امکان اتصال به حسابیکس وجود ندارد، کسب و کار منقضی شده است." + +msgid "" +"Cannot connect to Hesabix servers. Please check your Internet connection" +msgstr "اتصال به حسابیکس برقرار نیست، لطفا اتصال اینترنت را بررسی نمایید." + +msgid "No need to set!" +msgstr "عدم نیاز به تعریف!" + +msgid "Choose" +msgstr "انتخاب کنید" + +msgid "Define at least one bank in Hesabix" +msgstr "حداقل یک حساب بانکی در حسابیکس تعریف کنید." + +msgid "Cannot get Banks detail." +msgstr "امکان دریافت اطلاعات بانک‌ها نیست." + +msgid "Select a page…" +msgstr "انتخاب ‫دسته‌بندی" + +msgid "Settings were saved successfully." +msgstr "تنظیمات به‌روزرسانی شد." + +msgid "https://hesabix.ir/" +msgstr "‏https://hesabix.ir/" + +msgid "Connect Hesabix Online Accounting to WooCommerce." +msgstr "\tاتصال نرم‌افزار حسابداری ابری حسابیکس به ووکامرس" + +msgid "Log" +msgstr "لاگ" + +msgid "Events and bugs log" +msgstr "لاگ رویدادها و خطاها" + +msgid "Clean current log" +msgstr "پاک کردن لاگ جاری" + +msgid "Download log file" +msgstr "دانلود فایل لاگ" + +msgid "The log file was cleared." +msgstr "فایل لاگ پاک شد." + +msgid "Log file not found." +msgstr "فایل لاگ پیدا نشد." + +msgid "Update Products in Hesabix based on store" +msgstr "به روزرسانی محصولات در حسابیکس بر اساس فروشگاه" + +msgid "Update products in hesabix based on products definition in store." +msgstr "" +"به روزرسانی محصولات در حسابیکس بر اساس مشخصات آنها در فروشگاه. محصولات جدید " +"به حسابیکس اضافه می شوند و محصولات قبلی ویرایش می شوند." + +msgid "Update completed successfully." +msgstr "به روزرسانی با موفقیت انجام شد." + +msgid "Update failed. Please check the log file." +msgstr "به روزرسانی ناموفق بود. لطفاً لاگ را بررسی کنید." + +msgid "Number of products in store:" +msgstr "تعداد محصولات در فروشگاه:" + +msgid "Number of products in hesabix:" +msgstr "تعداد محصولات در حسابیکس:" + +msgid "Number of linked products:" +msgstr "تعداد محصولات لینک شده:" + +msgid "Save and next page" +msgstr "ذخیره و صفحه بعد" + +msgid "Invoice in Hesabix" +msgstr "فاکتور حسابیکس" + +msgid "Submit Invoice" +msgstr "ثبت فاکتور" + +msgid "Submit Invoice in Hesabix" +msgstr "ثبت فاکتور در حسابیکس" + +msgid "Submit Product in Hesabix" +msgstr "ثبت محصول در حسابیکس" + +msgid "" +"Do not submit product in Hesabix automatically by saving product in " +"woocommerce" +msgstr "با ذخیره محصول در ووکامرس، محصول را بصورت اتوماتیک در حسابیکس ثبت نکن" + +msgid "Remove The Titles for Attributes When Saving Product To Hesabix" +msgstr "عنوان متغیر های یک محصول را با ذخیره/بروزرسانی در نام محصول حذف کن" + +msgid "Submit Price in Hesabix" +msgstr "ثبت قیمت در حسابیکس" + +msgid "" +"Do not update product price in Hesabix by editing product in woocommerce" +msgstr "با ویرایش محصول در ووکامرس، قیمت محصول را در حسابیکس بروز نکن" + +msgid "Barcode in Hesabix" +msgstr "بارکد در حسابیکس" + +msgid "National Code in Hesabix" +msgstr "کد ملی در حسابیکس" + +msgid "" +"Do not update product barcode in Hesabix by saving product in woocommerce" +msgstr "با ذخیره محصول در ووکامرس، بارکد محصول را در حسابیکس بروز نکن" + +msgid "" +"Do not update product category in Hesabix by saving product in woocommerce" +msgstr "با ذخیره محصول در ووکامرس، دسته بندی محصول را در حسابیکس بروز نکن" + +msgid "Do not update product code in Hesabix by saving product in woocommerce" +msgstr "با ذخیره محصول در ووکامرس، کد محصول را در حسابیکس بروز نکن" + +msgid "Shipping method" +msgstr "روش حمل و نقل" + +msgid "Invoice's Salesman" +msgstr "فروشنده فاکتور" + +msgid "Invoice Salesman Percentage" +msgstr "درصد پورسانت فروشنده فاکتور" + +msgid "Invoice's Project" +msgstr "پروژه فاکتور" + +msgid "Submit Cash in Transit" +msgstr "ثبت در وجوه در راه" + +msgid "Submit Invoice Receipt Cash in Transit" +msgstr "ثبت رسید دریافت فاکتور در وجوه در راه" + +msgid "Default Invoice Transaction Fee Percentage" +msgstr "درصد کارمزد تراکنش به صورت پیش فرض" + +msgid "Plugin Tutorial Video" +msgstr "ویدیوی خودآموز افزونه" + +msgid "Titles" +msgstr "عناوین" + +msgid "Accounting quantity (Total inventory)" +msgstr "موجودی حسابداری (موجودی کل)" + +msgid "Cannot get warehouses." +msgstr "امکان دریافت اطلاعات انبارها نیست." + +msgid "Update product's quantity based on" +msgstr "بروزرسانی موجودی کالا بر اساس" + +msgid "Do not update purchase and sales titles in hesabix" +msgstr "توضیحات (عنوان های) خرید و فروش را در حسابیکس بروز نکن" + +msgid "Warehouse system is not active in Hesabix." +msgstr "سیستم انبارداری در حسابیکس فعال نیست." + +msgid "API Address" +msgstr "آدرس API" + +msgid "Contact Code in Hesabix" +msgstr "کد شخص در حسابیکس" + +msgid "" +"The contact code of this user in Hesabix, if you want to map this user to a " +"contact in Hesabix, enter the Contact code." +msgstr "" +"این فیلد کد شخص در حسابیکس است، اگر می‌خواهید این کاربر را به شخصی در " +"حسابیکس ارتباط دهید، کد شخص را وارد نمایید." + +msgid "" +"To check the phone with national code, you need to enter both billing phone " +"correctly." +msgstr "" +"این فیلد کد ملی شخص در حسابیکس است، اگر می‌خواهید شماره تماس با کد ملی چک " +"شود باید شماره تماس صورتحساب را به درستی وارد نمایید." + +msgid "" +"Error: Select maximum 10 orders. Due to some limitations in Hesabix API, " +"sending too many requests in one minute is not possible." +msgstr "" +"خطا: حداکثر ۱۰ سفارش را انتخاب کنید. بدلیل محدودیت رابط برنامه نویسی " +"حسابیکس، ارسال درخواست های زیاد در یک دقیقه امکان پذیر نیست." + +msgid "Selected orders invoices have been saved. Number of saved invoices: " +msgstr "فاکتور سفارش های انتخاب شده ثبت شد. تعداد فاکتور های ثبت شده: " + +msgid "Update sale price" +msgstr "بروزرسانی قیمت فروش ویژه" + +msgid "The Sale price does not change" +msgstr "قیمت فروش ویژه تغییر نکند" + +msgid "The Sale price gets removed" +msgstr "قیمت فروش ویژه حذف گردد" + +msgid "The sale price get changes in proportion to the regular price" +msgstr "قیمت فروش ویژه به تناسب قیمت اصلی تغییر یابد" + +msgid "Submit invoice base on Dokan orders" +msgstr "ثبت فاکتور بر اساس سفارشات افزونه دکان" + +msgid "Submit parent order" +msgstr "ثبت سفارش مادر" + +msgid "Submit children orders" +msgstr "ثبت زیر سفارش ها" + +msgid "Inactive" +msgstr "غیر فعال" + +msgid "Plugin Features" +msgstr "امکانات افزونه" + +msgid "Complete integration between WooCommerce and Hesabix" +msgstr "یکپارچگی کامل ووکامرس و حسابیکس" + +msgid "Product Management" +msgstr "مدیریت محصولات" + +msgid "" +"Automatic synchronization of products between WooCommerce and Hesabix with " +"inventory management" +msgstr "همگام‌سازی خودکار محصولات بین ووکامرس و حسابیکس همراه با مدیریت موجودی" + +msgid "Customer Management" +msgstr "مدیریت مشتریان" + +msgid "Synchronize customer information and contact details between platforms" +msgstr "همگام‌سازی اطلاعات و جزئیات تماس مشتریان بین پلتفرم‌ها" + +msgid "Invoice Management" +msgstr "مدیریت فاکتورها" + +msgid "Automatic invoice creation and payment tracking in Hesabix" +msgstr "ایجاد خودکار فاکتور و پیگیری پرداخت‌ها در حسابیکس" + +msgid "Real-time Sync" +msgstr "همگام‌سازی لحظه‌ای" + +msgid "" +"Real-time synchronization of data changes between WooCommerce and Hesabix" +msgstr "همگام‌سازی لحظه‌ای تغییرات داده‌ها بین ووکامرس و حسابیکس" + +msgid "Payment Tracking" +msgstr "پیگیری پرداخت‌ها" + +msgid "Automatic payment confirmation and receipt generation in Hesabix" +msgstr "تأیید خودکار پرداخت و صدور رسید در حسابیکس" + +msgid "Advanced Reports" +msgstr "گزارش‌های پیشرفته" + +msgid "Comprehensive reporting and analytics for your business operations" +msgstr "گزارش‌گیری و تحلیل جامع برای عملیات کسب‌وکار شما" + +msgid "Hesabix: WooCommerce" +msgstr "حسابیکس: ووکامرس" + +msgid "Connect Hesabix Online Accounting to WooCommerce" +msgstr "اتصال حسابداری آنلاین حسابیکس به ووکامرس" + +msgid "Version %s" +msgstr "نسخه %s" + +msgid "Login to Hesabix" +msgstr "ورود به حسابیکس" + +msgid "Plugin Guide" +msgstr "راهنمای افزونه" + +msgid "Checking for Updates..." +msgstr "در حال بررسی بروزرسانی..." + +msgid "New version %s is available" +msgstr "نسخه جدید %s موجود است" + +msgid "Current version is up to date" +msgstr "نسخه فعلی بروز است" + +msgid "New version available!" +msgstr "نسخه جدید موجود است!" + +msgid "" +"Version %s of Hesabix plugin has been released. Your current version: %s" +msgstr "نسخه %s از پلاگین حسابیکس منتشر شده است. نسخه فعلی شما: %s" + +msgid "Download new version" +msgstr "دانلود نسخه جدید" + +msgid "Close" +msgstr "بستن" + +msgid "API Connection Status" +msgstr "وضعیت اتصال API" + +msgid "Check your Hesabix API connection status" +msgstr "وضعیت اتصال API حسابیکس خود را بررسی کنید" + +msgid "Connection Status" +msgstr "وضعیت اتصال" + +msgid "API Server" +msgstr "سرور API" + +msgid "Business Information" +msgstr "اطلاعات کسب‌وکار" + +msgid "Your Hesabix business details" +msgstr "جزئیات کسب‌وکار حسابیکس شما" + +msgid "Business Name" +msgstr "نام کسب‌وکار" + +msgid "Subscription Plan" +msgstr "طرح اشتراک" + +msgid "Document Credit" +msgstr "اعتبار سند" + +msgid "Expiry Date" +msgstr "تاریخ انقضا" + +msgid "API Configuration" +msgstr "پیکربندی API" + +msgid "Configure your Hesabix API settings" +msgstr "تنظیمات API حسابیکس خود را پیکربندی کنید" + +msgid "Important Notes" +msgstr "نکات مهم" + +msgid "" +"To connect to Hesabix API and activate this plugin, you need to enter your " +"API key and login token here." +msgstr "" +"برای اتصال به API حسابیکس و فعال‌سازی این افزونه، باید کلید API و توکن ورود " +"خود را در اینجا وارد کنید." + +msgid "" +"If you use login token for Hesabix API connection, you don't need to enter " +"email and password." +msgstr "" +"اگر از توکن ورود برای اتصال API حسابیکس استفاده می‌کنید، نیازی به وارد کردن " +"ایمیل و رمز عبور نیست." + +msgid "" +"To find login token and API key, go to Settings > API Settings in Hesabix." +msgstr "" +"برای یافتن توکن ورود و کلید API، در حسابیکس به تنظیمات > تنظیمات API مراجعه " +"کنید." + +msgid "" +"If you want to connect another business to the plugin, first remove and " +"reinstall the plugin to clear the previous business connections." +msgstr "" +"اگر می‌خواهید کسب‌وکار دیگری را به افزونه متصل کنید، ابتدا افزونه را حذف و " +"مجدد نصب کنید تا ارتباطات کسب‌وکار قبلی پاک شود." + +msgid "Save Changes" +msgstr "ذخیره تغییرات" + +msgid "Warning" +msgstr "هشدار" + +msgid "" +"To connect another business to the plugin, first remove and reinstall the " +"plugin to clear the previous business connections." +msgstr "" +"برای اتصال کسب‌وکار دیگری به افزونه، ابتدا افزونه را حذف و مجدد نصب کنید تا " +"ارتباطات کسب‌وکار قبلی پاک شود." + +msgid "Test Connection" +msgstr "تست اتصال" + +msgid "Settings saved successfully" +msgstr "تنظیمات با موفقیت ذخیره شد" + +msgid "Connection successful!" +msgstr "اتصال موفقیت‌ آمیز بود!" + +msgid "Connection failed. Please check your API key and try again." +msgstr "اتصال ناموفق بود. لطفاً کلید API خود را بررسی کرده و دوباره تلاش کنید." + +msgid "API key not configured" +msgstr "کلید API پیکربندی نشده است" + +msgid "Error saving settings" +msgstr "خطا در ذخیره تنظیمات" + +msgid "Error testing connection" +msgstr "خطا در تست اتصال" + +msgid "Configure your Hesabix API connection and settings" +msgstr "اتصال و تنظیمات API حسابیکس را پیکربندی کنید" + +msgid "" +"Configure product sync and catalog options between WooCommerce and Hesabix" +msgstr "تنظیم گزینه‌های همگام‌سازی و کاتالوگ محصولات بین ووکامرس و حسابیکس" + +msgid "Changes synchronization completed successfully." +msgstr "همگام‌سازی تغییرات با موفقیت انجام شد." + +msgid "Product price and inventory synchronization completed successfully." +msgstr "همگام‌سازی قیمت و موجودی محصولات با موفقیت انجام شد." + +msgid "Error in product synchronization. Please check the log." +msgstr "خطا در همگام‌سازی محصولات. لطفاً لاگ را بررسی کنید." + +msgid "Order synchronization completed successfully." +msgstr "همگام‌سازی سفارشات با موفقیت انجام شد." + +msgid "%s orders added" +msgstr "%s سفارش افزوده شد" + +msgid "Error in order synchronization. Please enter a valid date." +msgstr "خطا در همگام‌سازی سفارشات. لطفاً تاریخ معتبر وارد کنید." + +msgid "Product update completed successfully." +msgstr "بروزرسانی محصولات با موفقیت انجام شد." + +msgid "Error in product update." +msgstr "خطا در بروزرسانی محصولات." + +msgid "Product update (filtered) completed successfully." +msgstr "بروزرسانی محصولات (فیلتر) با موفقیت انجام شد." + +msgid "Error in product update (filtered)." +msgstr "خطا در بروزرسانی محصولات (فیلتر)." + +msgid "" +"This page is for synchronizing information between the store and Hesabix. " +"Please check the settings before starting." +msgstr "" +"این صفحه برای همگام‌سازی اطلاعات بین فروشگاه و حسابیکس است. لطفاً قبل از " +"شروع، تنظیمات را بررسی کنید." + +msgid "Information Synchronization" +msgstr "همگام‌سازی اطلاعات" + +msgid "Store Products Count" +msgstr "تعداد محصولات فروشگاه" + +msgid "Hesabix Products Count" +msgstr "تعداد محصولات حسابیکس" + +msgid "Linked Products" +msgstr "محصولات لینک‌ شده" + +msgid "General Changes Synchronization" +msgstr "همگام‌سازی تغییرات کلی" + +msgid "Synchronize Changes" +msgstr "همگام‌سازی تغییرات" + +msgid "This operation synchronizes all changes (products, customers, orders)." +msgstr "این عملیات همه تغییرات (کالا، مشتری، سفارش) را همگام می‌کند." + +msgid "Product Price and Inventory Synchronization" +msgstr "همگام‌سازی قیمت و موجودی محصولات" + +msgid "Synchronize Price and Inventory" +msgstr "همگام‌سازی قیمت و موجودی" + +msgid "" +"Based on the products tab settings, product prices and inventory are " +"synchronized." +msgstr "بر اساس تنظیمات تب محصولات، قیمت و موجودی محصولات همگام می‌شود." + +msgid "Order Synchronization (Time Range)" +msgstr "همگام‌سازی سفارشات (بازه زمانی)" + +msgid "to" +msgstr "تا" + +msgid "Synchronize Orders" +msgstr "همگام‌سازی سفارشات" + +msgid "" +"Store orders that are not registered in Hesabix are checked and registered " +"in the selected range." +msgstr "" +"سفارشات فروشگاه که در حسابیکس ثبت نشده‌اند، در بازه انتخابی بررسی و ثبت " +"می‌شوند." + +msgid "Update Hesabix Products Based on Woocommerce" +msgstr "بروزرسانی محصولات حسابیکس بر اساس ووکامرس" + +msgid "Update Hesabix Products" +msgstr "بروزرسانی محصولات حسابیکس" + +msgid "" +"Product features such as name and price in Hesabix are updated based on the " +"store (inventory does not change)." +msgstr "" +"ویژگی محصولات مثل نام و قیمت در حسابیکس، بر اساس فروشگاه بروزرسانی می‌شود " +"(موجودی تغییر نمی‌کند)." + +msgid "Error" +msgstr "خطا" + +msgid "Operation in Progress..." +msgstr "عملیات در حال انجام..." + +msgid "Please wait while the synchronization is being completed." +msgstr "لطفاً منتظر بمانید تا همگام‌سازی کامل شود." + +msgid "Quick Select:" +msgstr "انتخاب سریع:" + +msgid "Last 7 Days" +msgstr "۷ روز اخیر" + +msgid "Last 30 Days" +msgstr "۳۰ روز اخیر" + +msgid "Last 3 Months" +msgstr "۳ ماه اخیر" + +msgid "Custom Range" +msgstr "بازه دلخواه" + +msgid "From Date:" +msgstr "از تاریخ:" + +msgid "To Date:" +msgstr "تا تاریخ:" + +msgid "Please enter date in Jalali format (YYYY/MM/DD)" +msgstr "لطفاً تاریخ را به فرمت جلالی وارد کنید (YYYY/MM/DD)" + +msgid "Invalid Jalali date format" +msgstr "فرمت تاریخ جلالی نامعتبر است" + +msgid "End date must be after start date." +msgstr "تاریخ پایان باید بعد از تاریخ شروع باشد." + +msgid "Selected Range:" +msgstr "بازه انتخاب شده:" + +msgid "" +"Customers existing in the store that are not registered in Hesabix will be " +"checked and registered in Hesabix." +msgstr "" +"مشتریانی که در فروشگاه وجود دارند اما در حسابیکس ثبت نشده‌اند، بررسی و در " +"حسابیکس ثبت خواهند شد." + +msgid "" +"Store orders that are not registered in Hesabix are checked and registered " +"in the selected date range. Choose a preset option or select a custom date " +"range." +msgstr "" +"سفارشات فروشگاه که در حسابیکس ثبت نشده‌اند، در بازه زمانی انتخاب شده بررسی و " +"ثبت می‌شوند. یک گزینه از پیش تعریف شده انتخاب کنید یا بازه زمانی دلخواه خود " +"را انتخاب کنید." + +msgid "Update Woocommerce Products Based on Hesabix" +msgstr "بروزرسانی محصولات ووکامرس بر اساس حسابیکس" + +msgid "Update Woocommerce Products" +msgstr "بروزرسانی محصولات ووکامرس" + +msgid "" +"Configure when invoices should be created in Hesabix and when return " +"invoices should be generated for orders." +msgstr "" +"تنظیم کنید که فاکتورها چه زمانی در حسابیکس ایجاد شوند و چه زمانی برای " +"سفارشات فاکتور برگشت تولید شود." + +msgid "Important Notice" +msgstr "اطلاعیه مهم" + +msgid "" +"If you choose to save shipping costs as a service, you must first create a " +"service in Hesabix and enter its code in the Freight Service Code field." +msgstr "" +"اگر هزینه حمل و نقل را به عنوان خدمت ذخیره کنید، ابتدا باید خدمتی در حسابیکس " +"ایجاد کنید و کد آن را در فیلد کد خدمت حمل و نقل وارد کنید." + +msgid "The \"Save as Service\" option is for tax compliance systems." +msgstr "گزینه \"ذخیره به عنوان خدمت\" برای سیستم‌های انطباق مالیاتی است." + +msgid "" +"Please ensure this field is correctly entered to avoid invoice creation " +"issues." +msgstr "" +"لطفاً اطمینان حاصل کنید که این فیلد به درستی وارد شده تا از مشکلات ایجاد " +"فاکتور جلوگیری شود." + +msgid "Configure invoice generation and freight settings" +msgstr "تنظیم تولید فاکتور و تنظیمات حمل و نقل" + +msgid "Pirouz" +msgstr "پیروز" + +msgid "Update Hesabix Customers" +msgstr "بروزرسانی مشتریان حسابیکس" + +msgid "days" +msgstr "روز" + +msgid "" +"Product features such as name and price in Woocommerce are updated based on " +"Hesabix (inventory does not change)." +msgstr "" +"ویژگی‌های محصول مانند نام و قیمت در ووکامرس بر اساس حسابیکس بروزرسانی می‌شود " +"(موجودی تغییر نمی‌کند)." + +msgid "Configure customer management and additional checkout fields" +msgstr "تنظیم مدیریت مشتریان و فیلدهای اضافی تسویه حساب" + +msgid "Basic Settings" +msgstr "تنظیمات پایه" + +msgid "" +"Configure additional fields that will be displayed on the checkout page for " +"customer information collection." +msgstr "" +"فیلدهای اضافی که در صفحه تسویه حساب برای جمع‌آوری اطلاعات مشتری نمایش داده " +"می‌شوند را تنظیم کنید." + +msgid "Field Source" +msgstr "منبع فیلد" + +msgid "Additional Checkout Fields" +msgstr "فیلدهای اضافی تسویه حساب" + +msgid "Customer Settings" +msgstr "تنظیمات مشتری" + +msgid "Save Shipping Costs" +msgstr "ذخیره هزینه حمل و نقل" + +msgid "Don't Save" +msgstr "ذخیره نکن" + +msgid "Save as Service" +msgstr "ذخیره به عنوان خدمت" + +msgid "Choose how shipping costs should be handled in invoices" +msgstr "انتخاب کنید که هزینه حمل و نقل چگونه در فاکتورها مدیریت شود" + +msgid "Enter Freight Service Code" +msgstr "کد خدمت حمل و نقل را وارد کنید" + +msgid "" +"Required when \"Save as Service\" is selected. Create this service in " +"Hesabix first." +msgstr "" +"هنگامی که \"ذخیره به عنوان خدمت\" انتخاب شده، الزامی است. ابتدا این خدمت را " +"در حسابیکس ایجاد کنید." + +msgid "Please read these warnings carefully" +msgstr "لطفاً این هشدارها را با دقت بخوانید" + +msgid "Code Management" +msgstr "مدیریت کد" + +msgid "" +"The plugin uses product codes, customer codes, and invoice numbers for " +"identification. Do not change these codes in Hesabix after they have been " +"created." +msgstr "" +"این افزونه از کدهای محصول، کدهای مشتری و شماره‌های فاکتور برای شناسایی " +"استفاده می‌کند. پس از ایجاد این کدها در حسابیکس، آن‌ها را تغییر ندهید." + +msgid "Plugin Removal" +msgstr "حذف افزونه" + +msgid "" +"Removing the plugin from WordPress will delete the relationship table from " +"the database and all connections will be lost." +msgstr "" +"حذف افزونه از وردپرس جدول روابط را از پایگاه داده حذف می‌کند و تمام اتصالات " +"از دست خواهد رفت." + +msgid "Need Help?" +msgstr "نیاز به کمک دارید؟" + +msgid "Get support and documentation" +msgstr "دریافت پشتیبانی و مستندات" + +msgid "Complete Guide" +msgstr "راهنمای کامل" + +msgid "Go to Hesabix" +msgstr "رفتن به حسابیکس" + +msgid "Visit Website" +msgstr "بازدید از وب‌سایت" + +msgid "Important Warnings" +msgstr "هشدارهای مهم" + +msgid "This page is for advanced plugin settings." +msgstr "این صفحه برای تنظیمات پیشرفته افزونه می‌باشد." + +msgid "" +"Number of concurrent requests for synchronizing Hesabix products in " +"WooCommerce" +msgstr "تعداد درخواست همزمان برای همگام‌سازی محصولات حسابیکس در ووکامرس" + +msgid "Plugin default: 100" +msgstr "پیش‌فرض افزونه: 100" + +msgid "Failed to save settings" +msgstr "خطا در ذخیره تنظیمات" + +msgid "Customer fields saved successfully" +msgstr "فیلدهای مشتری با موفقیت ذخیره شد" + +msgid "Hesabix Plugin developed with" +msgstr "افزونه حسابیکس با" + +msgid "by" +msgstr "توسط" + +msgid "Mohammad Rezai" +msgstr "محمد رضائی" + +msgid "Online Store Customers" +msgstr "مشتریان فروشگاه آن‌لاین" + +msgid "Hesabix Settings" +msgstr "تنظیمات حسابیکس" + +msgid "Manual Product Synchronization with Hesabix" +msgstr "همسان سازی دستی کالاهای فروشگاه با حسابیکس" + +msgid "View Important Tips" +msgstr "مشاهده نکات مهم" + +msgid "The following codes were not found in Hesabix:" +msgstr "کدهای زیر در حسابیکس پیدا نشد:" + +msgid "Attention!" +msgstr "توجه!" + +msgid "Save changes for each page before going to the next page." +msgstr "تغییرات هر صفحه را ذخیره کنید و سپس به صفحه بعد بروید." + +msgid "Hesabix code is the 6-digit code (accounting item code)." +msgstr "کد حسابیکس همان کد 6 رقمی (کد حسابداری کالا) است." + +msgid "Make sure the item is defined in Hesabix." +msgstr "از وجود تعریف کالا در حسابیکس اطمینان حاصل کنید." + +msgid "" +"This page is for when you have already defined an item in both the store and " +"Hesabix but there is no connection between them. You can manually establish " +"this connection using this page." +msgstr "" +"این صفحه برای زمانی است که شما از قبل یک کالا را هم در فروشگاه و هم در " +"حسابیکس تعریف کرده اید اما اتصالی بین آنها وجود ندارد. به کمک این صفحه می " +"توانید این اتصال را بصورت دستی برقرار کنید." + +msgid "" +"For convenience, this table is sorted by product name, so also sort the list " +"of items in Hesabix by name and start entering the corresponding codes in " +"this table." +msgstr "" +"برای راحتی کار، این جدول بر اساس نام محصول مرتب سازی شده است، بنابراین در " +"حسابیکس نیز لیست کالاها را بر اساس نام مرتب سازی کرده و از روی آن شروع به " +"وارد کردن کدهای متناظر در این جدول نمایید." + +msgid "Product Name" +msgstr "نام کالا" + +msgid "Product ID" +msgstr "شناسه محصول" + +msgid "Hesabix Code" +msgstr "کد حسابیکس" + +msgid "records" +msgstr "رکورد" + +msgid "pages" +msgstr "صفحه" + +msgid "Current page:" +msgstr "صفحه جاری:" + +msgid "Go" +msgstr "برو" + +msgid "rows per page" +msgstr "ردیف در هر صفحه" + +msgid "< Previous page" +msgstr "< صفحه قبل" + +msgid "Next page >" +msgstr "صفحه بعد >" + +msgid "Duplicate Product Codes" +msgstr "کد محصولات تکراری" + +msgid "Attribute ID" +msgstr "شناسه متغیر" + +msgid "Hesabix Plugin Tools" +msgstr "ابزارهای افزونه حسابیکس" + +msgid "Delete Plugin Data" +msgstr "حذف دیتای افزونه" + +msgid "Install Plugin Data" +msgstr "نصب دیتای افزونه" + +msgid "Freight service code is not defined" +msgstr "کد هزینه حمل و نقل تعریف نشده است" + +msgid "Freight Cost" +msgstr "هزینه حمل و نقل" + +msgid "Cash in Transit not found in Hesabix" +msgstr "وجوه در راه در حسابیکس یافت نشد" + +msgid "Cash in Transit" +msgstr "وجوه در راه" + +msgid "Range ID should not be more than 200" +msgstr "بازه ID نباید بیشتر از 200 عدد باشد" + +msgid "Please enter a valid product code" +msgstr "کد کالای معتبر وارد نمایید" + +msgid "Disconnected" +msgstr "قطع" + +msgid "Comprehensive Hesabix System Information" +msgstr "اطلاعات جامع سیستم حسابیکس" + +msgid "Main Information" +msgstr "اطلاعات اصلی" + +msgid "Plugin Version:" +msgstr "نسخه افزونه:" + +msgid "Connection Status:" +msgstr "وضعیت اتصال:" + +msgid "Order Pending Payment" +msgstr "سفارش در انتظار پرداخت" + +msgid "Order Processing" +msgstr "سفارش در حال پردازش" + +msgid "Order On Hold" +msgstr "سفارش در حالت انتظار" + +msgid "Order Completed" +msgstr "سفارش تکمیل شده" + +msgid "Order Cancelled" +msgstr "سفارش لغو شده" + +msgid "Order Refunded" +msgstr "سفارش بازپرداخت شده" + +msgid "Order Failed" +msgstr "سفارش ناموفق" + +msgid "Order Draft" +msgstr "سفارش پیش‌نویس" + +msgid "Order Status" +msgstr "وضعیت سفارش" + +msgid "Freight cost is not saved in the invoice." +msgstr "هزینه حمل و نقل در فاکتور ذخیره نمی‌شود" + +msgid "Freight cost is saved as a product." +msgstr "هزینه حمل و نقل به عنوان بار ذخیره می‌شود" + +msgid "Freight cost is saved as a service." +msgstr "هزینه حمل و نقل به عنوان خدمت ذخیره می‌شود" + +msgid "Persons:" +msgstr "اشخاص :" + +msgid "Customer" +msgstr "مشتری" + +msgid "Marketer" +msgstr "بازاریاب" + +msgid "Employee" +msgstr "کارمند" + +msgid "Supplier" +msgstr "تامین‌کننده" + +msgid "Colleague" +msgstr "همکار" + +msgid "Salesman" +msgstr "فروشنده" + +msgid "Business Name:" +msgstr "نام کسب‌وکار:" + +msgid "Server Information" +msgstr "اطلاعات سرور" + +msgid "PHP Version:" +msgstr "نسخه PHP:" + +msgid "WordPress Version:" +msgstr "نسخه وردپرس:" + +msgid "WooCommerce Version:" +msgstr "نسخه ووکامرس:" + +msgid "MySQL Version:" +msgstr "نسخه MySQL:" + +msgid "Server Settings" +msgstr "تنظیمات سرور" + +msgid "Maximum Execution Time:" +msgstr "حداکثر زمان اجرا:" + +msgid "seconds" +msgstr "ثانیه" + +msgid "Memory Limit:" +msgstr "محدودیت حافظه:" + +msgid "Maximum Upload:" +msgstr "حداکثر آپلود:" + +msgid "Maximum POST:" +msgstr "حداکثر POST:" + +msgid "" +"Number of concurrent requests for synchronizing WooCommerce products in " +"Hesabix" +msgstr "تعداد درخواست همزمان برای همگام‌سازی محصولات ووکامرس در حسابیکس" + +msgid "Select" +msgstr "انتخاب کنید" + +msgid "Plugin default: 500" +msgstr "پیش‌فرض افزونه: 500" + +msgid "Orders synchronized successfully." +msgstr "همگام‌سازی سفارشات با موفقیت انجام شد." + +msgid "Number of concurrent requests for importing products" +msgstr "تعداد درخواست همزمان برای ایمپورت محصولات" + +msgid "Number of concurrent requests for exporting products" +msgstr "تعداد درخواست همزمان برای اکسپورت محصولات" + +msgid "Number of concurrent requests for exporting initial product inventory" +msgstr "تعداد درخواست همزمان برای اکسپورت موجودی اولیه محصولات" + +msgid "" +"By clicking the \"Delete All Logs\" button, all log files will be deleted." +msgstr "با کلیک روی دکمه \"حذف تمام لاگ‌ها\"، تمام فایل‌های لاگ حذف خواهند شد." + +msgid "" +"To delete the current log, click the \"Delete Current Log\" button when the " +"log file is selected." +msgstr "" +"برای حذف لاگ فعلی، وقتی فایل لاگ انتخاب شده روی دکمه \"حذف لاگ فعلی\" کلیک " +"کنید." + +msgid "The log history list displays logs from the last 10 days." +msgstr "لیست تاریخچه لاگ، لاگ‌های 10 روز گذشته را نمایش می‌دهد." + +msgid "Delete All Logs" +msgstr "حذف تمام لاگ‌ها" + +msgid "Download Current Log" +msgstr "دانلود لاگ فعلی" + +msgid "Delete Current Log" +msgstr "حذف لاگ فعلی" + +msgid "Log History (Last 10 Days)" +msgstr "تاریخچه لاگ (10 روز گذشته)" + +msgid "No logs found." +msgstr "هیچ لاگی یافت نشد." + +msgid "Log Content" +msgstr "محتوای لاگ" + +msgid "Loading..." +msgstr "در حال بارگذاری..." + +msgid "Error fetching log!" +msgstr "خطا در دریافت لاگ!" + +msgid "Error connecting to server!" +msgstr "خطا در اتصال به سرور!" + +msgid "log loaded successfully." +msgstr "لاگ با موفقیت بارگذاری شد." + +msgid "Are you sure you want to delete this log?" +msgstr "آیا مطمئن هستید که می‌خواهید این لاگ را حذف کنید؟" + +msgid "Log deleted." +msgstr "لاگ حذف شد." + +msgid "Log deleted successfully." +msgstr "لاگ با موفقیت حذف شد." + +msgid "Error deleting log!" +msgstr "خطا در حذف لاگ!" + +msgid "Are you sure you want to delete all logs?" +msgstr "آیا مطمئن هستید که می‌خواهید تمام لاگ‌ها را حذف کنید؟" + +msgid "All logs deleted." +msgstr "تمام لاگ‌ها حذف شدند." + +msgid "All logs deleted successfully." +msgstr "تمام لاگ‌ها با موفقیت حذف شدند." + +msgid "Error deleting all logs!" +msgstr "خطا در حذف تمام لاگ‌ها!" + +msgid "Custom Address" +msgstr "آدرس سفارشی" + +msgid "Custom API Address" +msgstr "آدرس API سفارشی" + +msgid "Enter your custom API address (e.g., your-domain.com)" +msgstr "آدرس API سفارشی خود را وارد کنید (مثال: your-domain.com)" + +msgid "API Connection Required" +msgstr "اتصال API مورد نیاز است" + +msgid "" +"This tab requires a valid API connection. Please configure your API settings " +"from the API tab first." +msgstr "" +"این تب نیازمند اتصال API معتبر است. لطفا ابتدا تنظیمات API خود را از تب API " +"پیکربندی کنید." + +msgid "Go to API Settings" +msgstr "رفتن به تنظیمات API" + +msgid "Customers successfully updated in Hesabix." +msgstr "مشتریان با موفقیت در حسابیکس بروزرسانی شدند." + +msgid "Error updating customers: " +msgstr "خطا در بروزرسانی مشتریان: " + +msgid "Additional checkout fields configuration" +msgstr "تنظیمات فیلدهای اضافی تسویه حساب" + +msgid "Show national code field" +msgstr "نمایش فیلد کد ملی" + +msgid "Make national code field required" +msgstr "اجباری کردن فیلد کد ملی" + +msgid "Enter meta code" +msgstr "کد متا را وارد کنید" + +msgid "Meta code for national code field" +msgstr "کد متا برای فیلد کد ملی" + +msgid "Show economic code field" +msgstr "نمایش فیلد کد اقتصادی" + +msgid "Make economic code field required" +msgstr "اجباری کردن فیلد کد اقتصادی" + +msgid "Meta code for economic code field" +msgstr "کد متا برای فیلد کد اقتصادی" + +msgid "Show registration number field" +msgstr "نمایش فیلد شماره ثبت" + +msgid "Make registration number field required" +msgstr "اجباری کردن فیلد شماره ثبت" + +msgid "Meta code for registration number field" +msgstr "کد متا برای فیلد شماره ثبت" + +msgid "Show website field" +msgstr "نمایش فیلد وب‌سایت" + +msgid "Make website field required" +msgstr "اجباری کردن فیلد وب‌سایت" + +msgid "Meta code for website field" +msgstr "کد متا برای فیلد وب‌سایت" + +msgid "Save Additional Fields" +msgstr "ذخیره فیلدهای اضافی" + +msgid "Failed to save customer fields" +msgstr "ذخیره فیلدهای مشتریان ناموفق بود" + +msgid "Error saving customer fields: " +msgstr "خطا در ذخیره فیلدهای مشتریان: " + +msgid "changes synced successfully" +msgstr "تغییرات با موفقیت همگام‌سازی شد" + +msgid "Error syncing prices and inventory. Please check the logs." +msgstr "خطا در همگام‌سازی قیمت‌ها و موجودی. لطفا لاگ‌ها را بررسی کنید." + +msgid "Prices and inventory synced successfully" +msgstr "قیمت‌ها و موجودی با موفقیت همگام‌سازی شد" + +msgid "Error updating products. Please check the logs." +msgstr "خطا در بروزرسانی محصولات. لطفا لاگ‌ها را بررسی کنید." + +msgid "Products updated successfully" +msgstr "محصولات با موفقیت بروزرسانی شدند" + +msgid "Security check failed" +msgstr "بررسی امنیتی ناموفق بود" + +msgid "Invalid nonce" +msgstr "نونس نامعتبر" diff --git a/languages/hesabix.pot b/languages/hesabix.pot new file mode 100644 index 0000000..05b0ea2 --- /dev/null +++ b/languages/hesabix.pot @@ -0,0 +1,1605 @@ +# Copyright (C) 2025 Mohammad Rezai +# This file is distributed under the GPL-3.0+. +msgid "" +msgstr "" +"Project-Id-Version: Hesabix: WooCommerce 1.0.0\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/hesabixWCPlugin\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2025-08-05T11:01:45+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.12.0\n" +"X-Domain: hesabix\n" + +#. Plugin Name of the plugin +#: hesabix.php +#: admin/partials/hesabix-admin-display.php:238 +msgid "Hesabix: WooCommerce" +msgstr "" + +#. Plugin URI of the plugin +#: hesabix.php +msgid "https://hesabix.ir/" +msgstr "" + +#. Description of the plugin +#: hesabix.php +msgid "Connect Hesabix Online Accounting to WooCommerce." +msgstr "" + +#. Author of the plugin +#: hesabix.php +#: hesabix.php:60 +msgid "Mohammad Rezai" +msgstr "" + +#. Author URI of the plugin +#: hesabix.php +msgid "https://pirouz.xyz" +msgstr "" + +#: admin/class-hesabix-admin.php:178 +#, php-format +msgid "Hesabix Plugin requires the %s to work!" +msgstr "" + +#: admin/class-hesabix-admin.php:178 +msgid "WooCommerce" +msgstr "" + +#: admin/class-hesabix-admin.php:183 +msgid "Hesabix Plugin need to connect to Hesabix Accounting, Please check the API credential!" +msgstr "" + +#: admin/class-hesabix-admin.php:188 +#: admin/partials/hesabix-admin-setting.php:2038 +#: includes/class-hesabix-webhook.php:166 +msgid "Cannot connect to Hesabix. Business expired." +msgstr "" + +#: admin/class-hesabix-admin.php:193 +msgid "Hesabix Plugin cannot works! because WooCommerce currency in not match with Hesabix." +msgstr "" + +#: admin/class-hesabix-admin.php:202 +msgid "Error: Select maximum 10 orders. Due to some limitations in Hesabix API, sending too many requests in one minute is not possible." +msgstr "" + +#: admin/class-hesabix-admin.php:206 +msgid "Selected orders invoices have been saved. Number of saved invoices: " +msgstr "" + +#: admin/class-hesabix-admin.php:325 +msgid "changes synced successfully" +msgstr "" + +#: admin/class-hesabix-admin.php:345 +msgid "Error syncing prices and inventory. Please check the logs." +msgstr "" + +#: admin/class-hesabix-admin.php:350 +msgid "Prices and inventory synced successfully" +msgstr "" + +#: admin/class-hesabix-admin.php:370 +msgid "Orders synchronized successfully." +msgstr "" + +#: admin/class-hesabix-admin.php:394 +#: admin/class-hesabix-admin.php:422 +msgid "Error updating products. Please check the logs." +msgstr "" + +#: admin/class-hesabix-admin.php:399 +#: admin/class-hesabix-admin.php:427 +msgid "Products updated successfully" +msgstr "" + +#: admin/class-hesabix-admin.php:624 +msgid "Invoice in Hesabix" +msgstr "" + +#: admin/class-hesabix-admin.php:625 +#: admin/class-hesabix-admin.php:661 +#: admin/class-hesabix-admin.php:681 +msgid "Submit Invoice" +msgstr "" + +#: admin/class-hesabix-admin.php:698 +msgid "Submit Invoice in Hesabix" +msgstr "" + +#: admin/class-hesabix-admin.php:742 +msgid "Contact Code in Hesabix" +msgstr "" + +#: admin/class-hesabix-admin.php:748 +msgid "The contact code of this user in Hesabix, if you want to map this user to a contact in Hesabix, enter the Contact code." +msgstr "" + +#: admin/class-hesabix-admin.php:970 +#: admin/class-hesabix-admin.php:1082 +msgid "The new Item code already used for another Item" +msgstr "" + +#: admin/class-hesabix-admin.php:1061 +msgid "Hesabix base item code" +msgstr "" + +#: admin/class-hesabix-admin.php:1063 +msgid "The base Item code of this product in Hesabix, if you want to map this product to another item in Hesabix, enter the new Item code." +msgstr "" + +#: admin/class-hesabix-admin.php:1113 +msgid "Hesabix variable item code" +msgstr "" + +#: admin/class-hesabix-admin.php:1115 +msgid "The variable Item code of this product variable in Hesabix, if you want to map this product to another item in Hesabix, enter the new Item code." +msgstr "" + +#: admin/class-hesabix-admin.php:1141 +#: admin/partials/hesabix-admin-display.php:13 +#: admin/partials/hesabix-admin-display.php:235 +msgid "Hesabix" +msgstr "" + +#: admin/class-hesabix-admin.php:1599 +#: admin/class-hesabix-admin.php:1662 +#: admin/partials/hesabix-admin-setting.php:855 +msgid "National code" +msgstr "" + +#: admin/class-hesabix-admin.php:1600 +msgid "please enter your National code" +msgstr "" + +#: admin/class-hesabix-admin.php:1610 +#: admin/class-hesabix-admin.php:1666 +#: admin/partials/hesabix-admin-setting.php:879 +msgid "Economic code" +msgstr "" + +#: admin/class-hesabix-admin.php:1611 +msgid "please enter your Economic code" +msgstr "" + +#: admin/class-hesabix-admin.php:1620 +#: admin/class-hesabix-admin.php:1669 +#: admin/partials/hesabix-admin-setting.php:905 +msgid "Registration number" +msgstr "" + +#: admin/class-hesabix-admin.php:1621 +msgid "please enter your Registration number" +msgstr "" + +#: admin/class-hesabix-admin.php:1631 +#: admin/class-hesabix-admin.php:1672 +#: admin/partials/hesabix-admin-setting.php:929 +msgid "Website" +msgstr "" + +#: admin/class-hesabix-admin.php:1632 +msgid "please enter your Website address" +msgstr "" + +#: admin/class-hesabix-admin.php:1699 +#: admin/partials/hesabix-admin-setting.php:279 +msgid "Connected" +msgstr "" + +#: admin/class-hesabix-admin.php:1699 +msgid "Not Connected" +msgstr "" + +#: admin/class-hesabix-admin.php:1700 +msgid "Total Products" +msgstr "" + +#: admin/class-hesabix-admin.php:1701 +msgid "Total Customers" +msgstr "" + +#: admin/class-hesabix-admin.php:1702 +msgid "Total Orders" +msgstr "" + +#: admin/class-hesabix-admin.php:1703 +msgid "Hesabix Status" +msgstr "" + +#: admin/class-hesabix-admin.php:1799 +#: admin/class-hesabix-admin.php:1805 +msgid "Failed to check for updates" +msgstr "" + +#: admin/class-hesabix-admin.php:1811 +msgid "Error checking for updates" +msgstr "" + +#: admin/class-hesabix-admin.php:1835 +#: admin/partials/hesabix-admin-setting.php:2455 +#: admin/partials/hesabix-admin-setting.php:2540 +#: admin/partials/hesabix-admin-setting.php:2578 +#: admin/partials/hesabix-admin-setting.php:2608 +msgid "Settings saved successfully" +msgstr "" + +#: admin/class-hesabix-admin.php:1852 +msgid "API key not configured" +msgstr "" + +#: admin/class-hesabix-admin.php:1859 +msgid "Connection failed. Please check your API key and try again." +msgstr "" + +#: admin/class-hesabix-admin.php:1864 +msgid "Connection successful!" +msgstr "" + +#: admin/class-hesabix-admin.php:1913 +msgid "API Connection Required" +msgstr "" + +#: admin/class-hesabix-admin.php:1914 +msgid "This tab requires a valid API connection. Please configure your API settings from the API tab first." +msgstr "" + +#: admin/class-hesabix-admin.php:1918 +msgid "Go to API Settings" +msgstr "" + +#: admin/class-hesabix-admin.php:2006 +msgid "Customers successfully updated in Hesabix." +msgstr "" + +#: admin/class-hesabix-admin.php:2018 +msgid "Error updating customers: " +msgstr "" + +#: admin/class-hesabix-admin.php:2057 +msgid "Customer fields saved successfully" +msgstr "" + +#: admin/class-hesabix-admin.php:2059 +msgid "Failed to save customer fields" +msgstr "" + +#: admin/class-hesabix-admin.php:2063 +msgid "Error saving customer fields: " +msgstr "" + +#: admin/partials/hesabix-admin-display.php:14 +msgid "Hesabix Settings" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:52 +msgid "Duplicate Product Codes" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:58 +msgid "Hesabix Code" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:59 +msgid "Product ID" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:60 +msgid "Attribute ID" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:84 +msgid "Hesabix Plugin Tools" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:88 +msgid "Delete Plugin Data" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:91 +msgid "Install Plugin Data" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:163 +msgid "Home" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:164 +msgid "API" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:165 +msgid "Catalog" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:166 +msgid "Customers" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:167 +msgid "Invoice" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:168 +msgid "Sync" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:169 +msgid "Log" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:170 +#: admin/partials/hesabix-admin-setting.php:257 +msgid "Extra Settings" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:218 +msgid "Hesabix Plugin requires the WooCommerce to work!" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:219 +msgid "Please install/activate woocommerce and try again" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:239 +msgid "Connect Hesabix Online Accounting to WooCommerce" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:242 +#: admin/partials/hesabix-admin-display.php:263 +#, php-format +msgid "Version %s" +msgstr "" + +#: admin/partials/hesabix-admin-display.php:248 +#: admin/partials/hesabix-admin-display.php:271 +msgid "Checking..." +msgstr "" + +#: admin/partials/hesabix-admin-display.php:257 +#: admin/partials/hesabix-admin-display.php:280 +msgid "Plugin Guide" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:45 +msgid "date is not in fiscal year" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:49 +#: admin/partials/hesabix-admin-functions.php:52 +#: admin/partials/hesabix-admin-functions.php:55 +msgid "Cannot connect to Hesabix for get FiscalDate." +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:398 +msgid "Shipping method" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:406 +msgid "Freight service code is not defined" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:419 +msgid "Freight Cost" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:428 +msgid "Freight method" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:673 +msgid "Cash in Transit not found in Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:1263 +msgid "no orders found" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:1811 +msgid "Range ID should not be more than 200" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:1814 +msgid "Please enter a valid product code" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:2093 +#: admin/partials/hesabix-admin-functions.php:2097 +#: admin/partials/hesabix-admin-functions.php:2102 +msgid "please enter a valid national code" +msgstr "" + +#: admin/partials/hesabix-admin-functions.php:2131 +msgid "please enter a valid Website URL" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:43 +msgid "Current Statistics" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:45 +msgid "Overview of your store and Hesabix integration" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:98 +msgid "Setup Guide" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:99 +msgid "Follow these steps to complete the integration" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:106 +msgid "Register in Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:107 +msgid "Visit hesabix.ir and create a free account. Choose your business and get your API keys from the settings menu." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:114 +msgid "Configure API Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:115 +msgid "Go to the API tab and enter your Hesabix API key, business ID, and fiscal year information." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:122 +msgid "Configure Sync Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:123 +msgid "Set up your catalog, customer, and invoice synchronization preferences in their respective tabs." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:130 +msgid "Start Synchronization" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:131 +msgid "Use the sync tab to manually synchronize your existing data or let the automatic sync handle new data." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:139 +msgid "Important Warnings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:140 +msgid "Please read these warnings carefully" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:149 +msgid "Code Management" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:152 +msgid "The plugin uses product codes, customer codes, and invoice numbers for identification. Do not change these codes in Hesabix after they have been created." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:162 +msgid "Plugin Removal" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:165 +msgid "Removing the plugin from WordPress will delete the relationship table from the database and all connections will be lost." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:173 +msgid "Need Help?" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:174 +msgid "Get support and documentation" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:189 +msgid "Complete Guide" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:202 +msgid "Go to Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:215 +msgid "Visit Website" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:223 +msgid "Plugin Tutorial Video" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:237 +msgid "Enable or Disable Debug Mode" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:255 +msgid "This page is for advanced plugin settings." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:270 +#: admin/partials/hesabix-admin-setting.php:1010 +msgid "Inactive" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:279 +msgid "Disconnected" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:304 +msgid "Comprehensive Hesabix System Information" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:309 +msgid "Main Information" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:312 +msgid "Plugin Version:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:316 +msgid "Connection Status:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:323 +msgid "Business Name:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:331 +msgid "Server Information" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:334 +msgid "PHP Version:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:338 +msgid "WordPress Version:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:342 +msgid "WooCommerce Version:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:346 +msgid "MySQL Version:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:353 +msgid "Server Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:357 +msgid "Maximum Execution Time:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:359 +msgid "seconds" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:362 +msgid "Memory Limit:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:366 +msgid "Maximum Upload:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:370 +msgid "Maximum POST:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:384 +msgid "Number of concurrent requests for synchronizing WooCommerce products in Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:389 +#: admin/partials/hesabix-admin-setting.php:422 +#: admin/partials/hesabix-admin-setting.php:448 +#: admin/partials/hesabix-admin-setting.php:463 +#: admin/partials/hesabix-admin-setting.php:488 +msgid "Select" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:412 +#: admin/partials/hesabix-admin-setting.php:479 +#: admin/partials/hesabix-admin-setting.php:510 +msgid "Plugin default: 500" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:416 +msgid "Number of concurrent requests for synchronizing Hesabix products in WooCommerce" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:443 +msgid "تعداد درخواست همزمان برای ایمپورت محصولات" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:454 +msgid "Plugin default: 100" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:458 +msgid "تعداد درخواست همزمان برای اکسپورت محصولات" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:483 +msgid "تعداد درخواست همزمان برای اکسپورت موجودی اولیه محصولات" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:519 +#: admin/partials/hesabix-admin-setting.php:689 +#: admin/partials/hesabix-admin-setting.php:797 +#: admin/partials/hesabix-admin-setting.php:1068 +#: admin/partials/hesabix-admin-setting.php:1239 +msgid "Save Changes" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:540 +#: admin/partials/hesabix-admin-setting.php:673 +msgid "Catalog Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:547 +msgid "Update Price" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:548 +msgid "Update Price after change in Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:555 +msgid "Update Quantity" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:556 +msgid "Update Quantity after change in Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:563 +msgid "Update product's quantity based on" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:571 +msgid "Remove The Titles for Attributes When Saving Product To Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:579 +msgid "Do not update purchase and sales titles in hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:587 +msgid "Do not submit product in Hesabix automatically by saving product in woocommerce" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:595 +msgid "Do not update product price in Hesabix by editing product in woocommerce" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:603 +msgid "Do not update product barcode in Hesabix by saving product in woocommerce" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:611 +msgid "Do not update product category in Hesabix by saving product in woocommerce" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:619 +msgid "Do not update product code in Hesabix by saving product in woocommerce" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:627 +msgid "Show Hesabix ID in Products Page" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:635 +msgid "Show Hesabix Code in Woocommerce Excel Export" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:643 +msgid "Set Special Sale as Discount in invoice" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:650 +msgid "The Sale price does not change" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:651 +msgid "The Sale price gets removed" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:652 +msgid "The sale price get changes in proportion to the regular price" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:655 +msgid "Update sale price" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:675 +msgid "Configure product sync and catalog options between WooCommerce and Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:708 +msgid "Customers Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:715 +msgid "Update Customer Address" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:716 +msgid "Choose when update Customer address in Hesabix." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:720 +msgid "Use first customer address" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:721 +msgid "update address with Invoice address" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:722 +msgid "update address with Delivery address" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:727 +msgid "Customer's Group" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:728 +msgid "Enter a Customer's Group in Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:735 +msgid "Save Customer's group" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:736 +msgid "Automatically save Customer's group in hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:742 +msgid "Customer's detail auto save and update" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:743 +msgid "Save and update Customer's detail automatically in hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:779 +msgid "Customer Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:781 +msgid "Configure customer management and additional checkout fields" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:786 +msgid "Basic Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:804 +msgid "Additional Checkout Fields" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:806 +msgid "Configure additional fields that will be displayed on the checkout page for customer information collection." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:810 +msgid "Field Source" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:816 +msgid "Customer add field to checkout by hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:822 +msgid "Customer add field to checkout by postmeta" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:829 +msgid "Additional checkout fields configuration" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:832 +msgid "Show" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:833 +msgid "Required" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:834 +msgid "Title" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:835 +msgid "Meta code in Postmeta" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:844 +msgid "Show national code field" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:852 +msgid "Make national code field required" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:859 +#: admin/partials/hesabix-admin-setting.php:883 +#: admin/partials/hesabix-admin-setting.php:910 +#: admin/partials/hesabix-admin-setting.php:933 +msgid "Enter meta code" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:860 +msgid "Meta code for national code field" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:868 +msgid "Show economic code field" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:876 +msgid "Make economic code field required" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:884 +msgid "Meta code for economic code field" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:893 +msgid "Show registration number field" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:902 +msgid "Make registration number field required" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:911 +msgid "Meta code for registration number field" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:919 +msgid "Show website field" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:926 +msgid "Make website field required" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:934 +msgid "Meta code for website field" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:946 +msgid "Save Additional Fields" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:962 +#: admin/partials/hesabix-admin-setting.php:1030 +msgid "Invoice Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:969 +msgid "Add invoice in which status" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:973 +msgid "Pending payment" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:974 +msgid "Processing" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:975 +msgid "On hold" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:976 +msgid "Completed" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:977 +msgid "Cancelled" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:978 +msgid "Refunded" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:979 +msgid "Failed" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:980 +msgid "Draft" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:985 +msgid "Save Shipping Costs" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:989 +msgid "Don't Save" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:990 +msgid "Save as Freight" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:991 +msgid "Save as Service" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:993 +msgid "Choose how shipping costs should be handled in invoices" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:997 +msgid "Service Code For Freight" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1000 +msgid "Enter Freight Service Code" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1001 +msgid "Required when \"Save as Service\" is selected. Create this service in Hesabix first." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1006 +msgid "Submit invoice base on Dokan orders" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1011 +msgid "Submit parent order" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1012 +msgid "Submit children orders" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1032 +msgid "Configure invoice generation and freight settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1043 +#: admin/partials/hesabix-admin-setting.php:2203 +msgid "Important Notice" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1046 +msgid "Configure when invoices should be created in Hesabix and when return invoices should be generated for orders." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1048 +msgid "If you choose to save shipping costs as a service, you must first create a service in Hesabix and enter its code in the Freight Service Code field." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1050 +msgid "The \"Save as Service\" option is for tax compliance systems." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1052 +msgid "Please ensure this field is correctly entered to avoid invoice creation issues." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1097 +#: admin/partials/hesabix-admin-setting.php:1149 +msgid "API Settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1104 +msgid "API Key" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1105 +msgid "Find API key in Setting->Access Tokens Menu" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1111 +msgid "API Address" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1118 +msgid "Custom Address" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1123 +msgid "Custom API Address" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1124 +msgid "Enter your custom API address (e.g., your-domain.com)" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1151 +msgid "Configure your Hesabix API connection and settings" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1157 +msgid "Business Information" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1167 +msgid "Business Name" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1178 +msgid "Subscription Plan" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1189 +msgid "Document Credit" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1200 +msgid "Expiry Date" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1207 +msgid "API Configuration" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1215 +msgid "Important Notes" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1219 +msgid "To connect to Hesabix API and activate this plugin, you need to enter your API key and login token here." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1221 +msgid "If you use login token for Hesabix API connection, you don't need to enter email and password." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1223 +msgid "To find login token and API key, go to Settings > API Settings in Hesabix." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1225 +msgid "If you want to connect another business to the plugin, first remove and reinstall the plugin to clear the previous business connections." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1246 +msgid "Test Connection" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1258 +msgid "Warning" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1261 +msgid "To connect another business to the plugin, first remove and reinstall the plugin to clear the previous business connections." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1288 +msgid "No products were exported, All products were exported or there are no product" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1292 +#, php-format +msgid "Export products completed. %s products added/updated." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1298 +msgid "Export products fail. Hesabix has already contained products." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1302 +msgid "Export products fail. Please check the log file." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1311 +msgid "No products were imported, All products were imported or there are no product" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1315 +#, php-format +msgid "Import products completed. %s products added/updated." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1320 +msgid "Import products fail. Please check the log file." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1326 +msgid "Export product opening quantity completed." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1333 +msgid "Export product opening quantity fail. No Shareholder exists, Please define Shareholder in Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1337 +msgid "No product available for Export product opening quantity." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1341 +msgid "Export product opening quantity fail. Please check the log file." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1351 +msgid "No customers were exported, All customers were exported or there are no customer" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1355 +#, php-format +msgid "Export customers completed. %s customers added." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1361 +msgid "Export customers fail. Hesabix has already contained customers." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1365 +msgid "Export customers fail. Please check the log file." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1372 +msgid "Export can take several minutes." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1382 +msgid "Export Products" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1386 +msgid "Export and add all online store products to Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1419 +msgid "Export Products opening quantity" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1423 +msgid "Export the products quantity and record the 'products opening quantity' in the Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1452 +msgid "Export Customers" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1456 +msgid "Export and add all online store customers to Hesabix." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1483 +msgid "Import Products" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1487 +msgid "Import and add all products from Hesabix to online store" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1522 +msgid "This page is for synchronizing information between the store and Hesabix. Please check the settings before starting." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1525 +msgid "Information Synchronization" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1535 +msgid "Store Products Count" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1547 +msgid "Hesabix Products Count" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1568 +msgid "Linked Products" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1575 +msgid "General Changes Synchronization" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1585 +msgid "Synchronize Changes" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1589 +msgid "This operation synchronizes all changes (products, customers, orders)." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1595 +msgid "Update Hesabix Products Based on Woocommerce" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1606 +msgid "Update Hesabix Products" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1610 +msgid "Product features such as name and price in Hesabix are updated based on the store (inventory does not change)." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1616 +msgid "Product Price and Inventory Synchronization" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1628 +#: admin/partials/hesabix-admin-setting.php:1637 +msgid "Synchronize Price and Inventory" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1642 +msgid "Based on the products tab settings, product prices and inventory are synchronized." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1647 +msgid "Order Synchronization (Time Range)" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1655 +msgid "Quick Select:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1659 +msgid "Last 7 Days" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1662 +msgid "Last 30 Days" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1665 +msgid "Last 3 Months" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1668 +msgid "Custom Range" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1677 +msgid "From Date:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1690 +msgid "To Date:" +msgstr "" + +msgid "Please enter date in Jalali format (YYYY/MM/DD)" +msgstr "" + +msgid "Invalid Jalali date format" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1698 +msgid "End date must be after start date." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1710 +msgid "Selected Range:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1725 +msgid "Synchronize Orders" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1730 +msgid "Store orders that are not registered in Hesabix are checked and registered in the selected date range. Choose a preset option or select a custom date range." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1734 +#: admin/partials/hesabix-admin-setting.php:1746 +msgid "Update Hesabix Customers" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1750 +msgid "Customers existing in the store that are not registered in Hesabix will be checked and registered in Hesabix." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1756 +msgid "Update Woocommerce Products Based on Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1769 +msgid "Update Woocommerce Products" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1773 +msgid "Product features such as name and price in Woocommerce are updated based on Hesabix (inventory does not change)." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1783 +msgid "Operation in Progress..." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:1993 +msgid "The fiscal year has passed or not arrived. Please check the fiscal year settings in Hesabix." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2013 +msgid "Hesabix and WooCommerce default currency must be same." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2020 +msgid "Cannot check the Hesabix default currency. Error Message: " +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2029 +msgid "API Setting updated. Test Successfully" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2045 +msgid "Cannot set Hesabix webHook. Error Message:" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2058 +msgid "Cannot connect to Hesabix servers. Please check your Internet connection" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2075 +#: admin/partials/hesabix-admin-setting.php:2123 +#: admin/partials/hesabix-admin-setting.php:2147 +msgid "Choose" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2083 +msgid "Define at least one bank in Hesabix" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2091 +#: admin/partials/hesabix-admin-setting.php:2096 +msgid "Cannot get Banks detail." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2132 +msgid "Cannot get Projects detail." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2136 +msgid "Cannot get projects detail." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2156 +msgid "Cannot get Salesmen detail." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2160 +msgid "Cannot get salesmen detail." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2170 +msgid "The log file was cleared." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2174 +msgid "Log file not found." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2206 +msgid "By clicking the \"Delete All Logs\" button, all log files will be deleted." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2208 +msgid "To delete the current log, click the \"Delete Current Log\" button when the log file is selected." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2210 +msgid "The log history list displays logs from the last 10 days." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2214 +msgid "Events and bugs log" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2225 +msgid "Delete All Logs" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2234 +msgid "Download Current Log" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2243 +msgid "Delete Current Log" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2248 +msgid "Log History (Last 10 Days)" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2256 +#: admin/partials/hesabix-admin-setting.php:2266 +#: admin/partials/hesabix-admin-setting.php:2341 +#: admin/partials/hesabix-admin-setting.php:2342 +#: admin/partials/hesabix-admin-setting.php:2368 +#: admin/partials/hesabix-admin-setting.php:2369 +msgid "No logs found." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2263 +msgid "Log Content" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2282 +#: admin/partials/hesabix-admin-setting.php:2304 +msgid "Loading..." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2291 +#: admin/partials/hesabix-admin-setting.php:2314 +#: admin/partials/hesabix-admin-setting.php:2315 +msgid "Error fetching log!" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2295 +#: admin/partials/hesabix-admin-setting.php:2319 +#: admin/partials/hesabix-admin-setting.php:2320 +#: admin/partials/hesabix-admin-setting.php:2349 +#: admin/partials/hesabix-admin-setting.php:2375 +msgid "Error connecting to server!" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2312 +msgid "log loaded successfully." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2326 +msgid "Are you sure you want to delete this log?" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2334 +msgid "Log deleted." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2335 +msgid "Log deleted successfully." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2345 +msgid "Error deleting log!" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2354 +msgid "Are you sure you want to delete all logs?" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2362 +msgid "All logs deleted." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2363 +msgid "All logs deleted successfully." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2371 +msgid "Error deleting all logs!" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2391 +#: admin/partials/hesabix-admin-setting.php:2398 +msgid "Accounting quantity (Total inventory)" +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2407 +#: admin/partials/hesabix-admin-setting.php:2411 +msgid "Cannot get warehouses." +msgstr "" + +#: admin/partials/hesabix-admin-setting.php:2457 +#: admin/partials/hesabix-admin-setting.php:2542 +#: admin/partials/hesabix-admin-setting.php:2580 +#: admin/partials/hesabix-admin-setting.php:2610 +msgid "Failed to save settings" +msgstr "" + +#: admin/partials/hesabix-html-output.php:220 +msgid "Order Pending Payment" +msgstr "" + +#: admin/partials/hesabix-html-output.php:223 +msgid "Order Processing" +msgstr "" + +#: admin/partials/hesabix-html-output.php:226 +msgid "Order On Hold" +msgstr "" + +#: admin/partials/hesabix-html-output.php:229 +msgid "Order Completed" +msgstr "" + +#: admin/partials/hesabix-html-output.php:232 +msgid "Order Cancelled" +msgstr "" + +#: admin/partials/hesabix-html-output.php:235 +msgid "Order Refunded" +msgstr "" + +#: admin/partials/hesabix-html-output.php:238 +msgid "Order Failed" +msgstr "" + +#: admin/partials/hesabix-html-output.php:241 +msgid "Order Draft" +msgstr "" + +#: admin/partials/hesabix-html-output.php:333 +msgid "Freight cost is not saved in the invoice." +msgstr "" + +#: admin/partials/hesabix-html-output.php:336 +msgid "Freight cost is saved as a product." +msgstr "" + +#: admin/partials/hesabix-html-output.php:339 +msgid "Freight cost is saved as a service." +msgstr "" + +#: admin/services/hesabixCustomerService.php:17 +msgid "Not Defined" +msgstr "" + +#: admin/services/hesabixCustomerService.php:25 +#: admin/services/hesabixCustomerService.php:104 +msgid "Persons:" +msgstr "" + +#: admin/services/hesabixCustomerService.php:59 +msgid "Customer ID in OnlineStore: " +msgstr "" + +#: admin/services/hesabixCustomerService.php:79 +msgid "Customer" +msgstr "" + +#: admin/services/hesabixCustomerService.php:80 +msgid "Marketer" +msgstr "" + +#: admin/services/hesabixCustomerService.php:81 +msgid "Employee" +msgstr "" + +#: admin/services/hesabixCustomerService.php:82 +msgid "Supplier" +msgstr "" + +#: admin/services/hesabixCustomerService.php:83 +msgid "Colleague" +msgstr "" + +#: admin/services/hesabixCustomerService.php:84 +msgid "Salesman" +msgstr "" + +#: admin/services/hesabixCustomerService.php:102 +msgid "Guest Customer" +msgstr "" + +#: admin/services/hesabixCustomerService.php:146 +msgid "Customer registered as a GuestCustomer." +msgstr "" + +#: hesabix.php:57 +msgid "Hesabix Plugin developed with" +msgstr "" + +#: hesabix.php:59 +msgid "by" +msgstr "" + +#: hesabix.php:69 +msgid "Pirouz" +msgstr "" + +#: includes/class-hesabix-activator.php:11 +msgid "Online Store Customers" +msgstr "" diff --git a/languages/ssbhesabix-fa_IR.mo b/languages/ssbhesabix-fa_IR.mo deleted file mode 100644 index 35da3f1b3240a2637a848b6dccff91f1170e4aa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31296 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 Settings->API Menu" -msgstr "کلید API را در حسابیکس از منوی تنظیمات->تنظیمات مالی->API پیدا کنید" - -msgid "Find Login token in Setting->Financial Settings->API Menu" -msgstr "توکن ورود را در حسابیکس از منوی تنظیمات->تنظیمات مالی->API پیدا کنید" - -#: admin/partials/ssbhesabix-admin-setting.php:323 -msgid "" -"No products were exported, All products were exported or there are no product" -msgstr "" -"هیچ محصولی استخراج نشد، تمامی محصولات قبلا استخراج شده‌اند یا محصولی وجود ندارد." - -msgid "" -"No products were imported, All products were imported or there are no product" -msgstr "" -"هیچ محصولی وارد نشد، تمامی محصولات قبلا وارد شده‌اند یا محصولی وجود ندارد." - - -#: admin/partials/ssbhesabix-admin-setting.php:327 -#, php-format -msgid "Export products completed. %s products added/updated." -msgstr "استخراج محصولات به اتمام رسید. ‪‬%s محصول استخراج شد." - -msgid "Import products completed. %s products added/updated." -msgstr "ورود محصولات به اتمام رسید. ‪‬%s محصول وارد شد." - -#: admin/partials/ssbhesabix-admin-setting.php:335 -msgid "Export products fail. Hesabix has already contained products." -msgstr "خروجی محصولات با خطا مواجه شد. حسابیکس از قبل حاوی محصولاتی است." - -#: admin/partials/ssbhesabix-admin-setting.php:339 -msgid "Export products fail. Please check the log file." -msgstr "خروجی محصولات با خطا مواجه شد. لطفا لاگ را بررسی کنید." - -msgid "Import products fail. Please check the log file." -msgstr "ورود محصولات با خطا مواجه شد. لطفا لاگ را بررسی کنید." - -#: admin/partials/ssbhesabix-admin-setting.php:340 -msgid "Export product opening quantity completed." -msgstr "استخراج موجودی اول دوره با موفقیت به پایان رسید." - -#: admin/partials/ssbhesabix-admin-setting.php:347 -msgid "" -"Export product opening quantity fail. No Shareholder exists, Please define " -"Shareholder in Hesabix" -msgstr "" -"استخراج موجودی اول دوره با خطا مواجه شد. سهامدار تعریف نشده است، لطفا ابتدا " -"سهامداران را در حسابیکس تعریف کنید." - -#: admin/partials/ssbhesabix-admin-setting.php:351 -msgid "No product available for Export product opening quantity." -msgstr "محصولی جهت استخراج موجودی اول دوره در دسترس نمی‌باشد." - -#: admin/partials/ssbhesabix-admin-setting.php:355 -msgid "Export product opening quantity fail. Please check the log file." -msgstr "استخراج موجودی اول دوره با خطا مواجه شد. لطفا لاگ را بررسی کنید." - -#: admin/partials/ssbhesabix-admin-setting.php:366 -msgid "" -"No customers were exported, All customers were exported or there are no " -"customer" -msgstr "" -"هیچ مشتری استخراج نشد، تمامی مشتریان قبلا استخراج شده‌اند یا مشتری وجود ندارد." - -#: admin/partials/ssbhesabix-admin-setting.php:370 -#, php-format -msgid "Export customers completed. %s customers added." -msgstr "استخراج مشتریان به اتمام رسید. %s مشتری استخراج شد." - -#: admin/partials/ssbhesabix-admin-setting.php:375 -msgid "Export customers fail. Please check the log file." -msgstr "استخراج مشتریان با خطا مواجه شد. لطفا لاگ را بررسی کنید." - -#: admin/partials/ssbhesabix-admin-setting.php:381 -msgid "Export can take several minutes." -msgstr "استخراج ممکن است چند دقیقه زمان ببرد." - -msgid "Export customers fail. Hesabix has already contained customers." -msgstr "خروجی مشتریان با خطا مواجه شد. حسابیکس از قبل حاوی مشتریان است." - -#: admin/partials/ssbhesabix-admin-setting.php:392 -msgid "Export Products" -msgstr "خروجی محصولات" - -msgid "Import Products" -msgstr "ورود محصولات" - -#: admin/partials/ssbhesabix-admin-setting.php:395 -msgid "Export and add all online store products to Hesabix" -msgstr "افزودن تمامی محصولات فروشگاه آنلاین در حسابیکس" - -msgid "Import and add all products from Hesabix to online store" -msgstr "افزودن تمامی محصولات حسابیکس به فروشگاه آنلاین" - -#: admin/partials/ssbhesabix-admin-setting.php:407 -msgid "Export Products opening quantity" -msgstr "استخراج موجودی اول دوره" - -#: admin/partials/ssbhesabix-admin-setting.php:410 -msgid "" -"Export the products quantity and record the 'products opening quantity' in the " -"Hesabix" -msgstr "استخراج موجودی محصولات و ثبت موجودی اول دوره در حسابیکس" - -#: admin/partials/ssbhesabix-admin-setting.php:422 -msgid "Export Customers" -msgstr "خروجی مشتریان" - -#: admin/partials/ssbhesabix-admin-setting.php:425 -msgid "Export and add all online store customers to Hesabix." -msgstr "افزودن تمامی مشتریان فروشگاه آنلاین در حسابیکس" - -#: admin/partials/ssbhesabix-admin-setting.php:437 -msgid "Sync completed, All hesabix changes synced successfully." -msgstr "همسان‌سازی پایان یافت. تمامی تغییرات با حسابیکس همسان شد." - -#: admin/partials/ssbhesabix-admin-setting.php:445 -msgid "Sync completed, All products price/quantity synced successfully." -msgstr "همسان سازی پایان یافت. قیمت/موجودی تمامی محصولات به روز شدند." - -#: admin/partials/ssbhesabix-admin-setting.php:449 -msgid "Sync products fail. Please check the log file." -msgstr "همسان‌سازی محصولات با خطا مواجه شد. لطفا لاگ را بررسی کنید." - -#: admin/partials/ssbhesabix-admin-setting.php:459 -#, php-format -msgid "Order sync completed. %s order added." -msgstr "همسان‌سازی پایان یافت. %s فاکتور به‌روزرسانی/افزوده شد." - -#: admin/partials/ssbhesabix-admin-setting.php:467 -msgid "The date entered is not within the fiscal year." -msgstr "تاریخ وارد شده در محدوده سال مالی نمی‌باشد." - -#: admin/partials/ssbhesabix-admin-setting.php:471 -msgid "Invoices are not synced before installing the plugin." -msgstr "" -"فاکتورهایی که قبل از زمان نصب این پلاگین صادر شده‌اند، امکان همسان‌سازی ندارند." - -#: admin/partials/ssbhesabix-admin-setting.php:475 -msgid "Cannot sync orders. Please enter valid Date format." -msgstr "امکان همسان سازی سفارشات نیست. لطفا تاریخ معتبری وارد نمایید." - -#: admin/partials/ssbhesabix-admin-setting.php:482 -msgid "Sync can take several minutes." -msgstr "همسان‌سازی ممکن است چند دقیقه زمان ببرد." - -#: admin/partials/ssbhesabix-admin-setting.php:183 -msgid "Enable or Disable Debug Mode" -msgstr "فعال کردن دیباگ مود" - -#: admin/partials/ssbhesabix-admin-setting.php:246 -msgid "Set request amount per batch for sync products based on woocommerce in Hesabix" -msgstr "تعداد درخواست ها در هر پارت برای همسان سازی محصولات در حسابیکس بر اساس فروشگاه آنلاین" - -#: admin/partials/ssbhesabix-admin-setting.php:263 -msgid "Set request amount per batch for sync products based on Hesabix in Woocommerce" -msgstr "تعداد درخواست ها در هر پارت برای همسان سازی محصولات در فروشگاه آنلاین بر اساس حسابیکس" - -#: admin/partials/ssbhesabix-admin-setting.php:280 -msgid "Set request amount per batch for import products" -msgstr "تعداد درخواست ها در هر پارت برای ورود محصولات" - -#: admin/partials/ssbhesabix-admin-setting.php:297 -msgid "Set request amount per batch for export products" -msgstr "تعداد درخواست ها در هر پارت برای استخراج محصولات" - -#: admin/partials/ssbhesabix-admin-setting.php:308 -msgid "select" -msgstr "انتخاب کنید" - -#: admin/partials/ssbhesabix-admin-setting.php:317 -msgid "Plugin Default" -msgstr "مقدار پیش فرض افزونه" - -#: admin/partials/ssbhesabix-admin-setting.php:314 -msgid "Set request amount per batch for export opening quantity of products" -msgstr "تعداد درخواست ها در هر پارت برای استخراج موجودی اول دوره کالا ها" - -#: admin/partials/ssbhesabix-admin-setting.php:494 -msgid "Sync Changes" -msgstr "همسان‌سازی تغییرات" - -#: admin/partials/ssbhesabix-admin-setting.php:497 -msgid "Sync all Hesabix changes with Online Store." -msgstr "همسان‌سازی تمامی تعییرات حسابیکس با فروشگاه آن‌لاین" - -#: admin/partials/ssbhesabix-admin-setting.php:509 -msgid "Sync Products Quantity and Price" -msgstr "همسان‌سازی قیمت و موجودی محصولات" - -#: admin/partials/ssbhesabix-admin-setting.php:512 -msgid "Sync quantity and price of products in hesabix with online store." -msgstr "همسان‌سازی قیمت و موجودی محصولات حسابیکس با فروشگاه آن‌لاین" - -#: admin/partials/ssbhesabix-admin-setting.php:525 -msgid "Sync Orders" -msgstr "همسان‌سازی سفارشات" - -#: admin/partials/ssbhesabix-admin-setting.php:528 -msgid "Sync/Add orders in online store with hesabix from above date." -msgstr "همسان‌سازی سفارشات فروشگاه آن‌لاین با حسابیکس از تاریخ فوق" - -#: admin/partials/ssbhesabix-admin-setting.php:557 -msgid "Cannot check the last change ID. Error Message: " -msgstr "امکان بررسی آخرین تغییرات وجود ندارد. شرح خطا:" - -#: admin/partials/ssbhesabix-admin-setting.php:567 -msgid "" -"The fiscal year has passed or not arrived. Please check the fiscal year " -"settings in Hesabix." -msgstr "" -"سال مالی گذشته است یا هنوز فرا نرسیده است، لطفا تنظیمات سال مالی در حسابیکس را " -"بررسی کنید." - -#: admin/partials/ssbhesabix-admin-setting.php:585 -msgid "Hesabix and WooCommerce default currency must be same." -msgstr "واحد پول پیش‌فرض حسابیکس و ووکامرس باید یکی باشد." - -#: admin/partials/ssbhesabix-admin-setting.php:590 -msgid "Cannot check the Hesabix default currency. Error Message: " -msgstr "امکان دریافت واحد پول پیش‌فرض حسابیکس وجود ندارد. شرح خطا:" - -#: admin/partials/ssbhesabix-admin-setting.php:598 -msgid "API Setting updated. Test Successfully" -msgstr "تنظیمات API به روزرسانی شد، اتصال موفقیت آمیز بود." - -#: admin/partials/ssbhesabix-admin-setting.php:605 -msgid "Cannot set Hesabix webHook. Error Message:" -msgstr "امکان تنظیم وب‌هوک در حسابیکس وجود ندارد. شرح خطا:" - -msgid "Cannot connect to Hesabix. Business expired." -msgstr "امکان اتصال به حسابیکس وجود ندارد، کسب و کار منقضی شده است." - -#: admin/partials/ssbhesabix-admin-setting.php:614 -msgid "Cannot connect to Hesabix servers. Please check your Internet connection" -msgstr "اتصال به حسابیکس برقرار نیست، لطفا اتصال اینترنت را بررسی نمایید." - -#: admin/partials/ssbhesabix-admin-setting.php:630 -msgid "No need to set!" -msgstr "عدم نیاز به تعریف!" - -#: admin/partials/ssbhesabix-admin-setting.php:630 -msgid "Choose" -msgstr "انتخاب کنید" - -#: admin/partials/ssbhesabix-admin-setting.php:638 -msgid "Define at least one bank in Hesabix" -msgstr "حداقل یک حساب بانکی در حسابیکس تعریف کنید." - -#: admin/partials/ssbhesabix-admin-setting.php:646 -#: admin/partials/ssbhesabix-admin-setting.php:650 -msgid "Cannot get Banks detail." -msgstr "امکان دریافت اطلاعات بانک‌ها نیست." - -#: admin/partials/ssbhesabix-html-output.php:288 -msgid "Select a page…" -msgstr "انتخاب ‫دسته‌بندی" - -#: admin/partials/ssbhesabix-html-output.php:379 -msgid "Settings were saved successfully." -msgstr "تنظیمات به‌روزرسانی شد." - -#. Plugin URI of the plugin/theme -msgid "https://hesabix.ir/" -msgstr "‏https://hesabix.ir/" - -#. Description of the plugin/theme -msgid "Connect Hesabix Online Accounting to WooCommerce." -msgstr "\tاتصال نرم‌افزار حسابداری ابری حسابیکس به ووکامرس" - -#. Author of the plugin/theme -msgid "Saeed Sattar Beglou" -msgstr "سعید ستاربگلو" - -msgid "Log" -msgstr "لاگ" - -msgid "Events and bugs log" -msgstr "لاگ رویدادها و خطاها" - -msgid "Clean current log" -msgstr "پاک کردن لاگ جاری" - -msgid "Download log file" -msgstr "دانلود فایل لاگ" - -msgid "The log file was cleared." -msgstr "فایل لاگ پاک شد." - -msgid "Log file not found." -msgstr "فایل لاگ پیدا نشد." - -msgid "Update Products in Hesabix based on store" -msgstr "به روزرسانی محصولات در حسابیکس بر اساس فروشگاه" - -msgid "Update products in hesabix based on products definition in store." -msgstr "به روزرسانی محصولات در حسابیکس بر اساس مشخصات آنها در فروشگاه. محصولات جدید به حسابیکس اضافه می شوند و محصولات قبلی ویرایش می شوند." - -msgid "Update completed successfully." -msgstr "به روزرسانی با موفقیت انجام شد." - -msgid "Update failed. Please check the log file." -msgstr "به روزرسانی ناموفق بود. لطفاً لاگ را بررسی کنید." - -msgid "Number of products in store:" -msgstr "تعداد محصولات در فروشگاه:" - -msgid "Number of products in hesabix:" -msgstr "تعداد محصولات در حسابیکس:" - -msgid "Number of linked products:" -msgstr "تعداد محصولات لینک شده:" - -msgid "Save and next page" -msgstr "ذخیره و صفحه بعد" - -msgid "Invoice in Hesabix" -msgstr "فاکتور حسابیکس" - -msgid "Submit Invoice" -msgstr "ثبت فاکتور" - -msgid "Submit Invoice in Hesabix" -msgstr "ثبت فاکتور در حسابیکس" - -msgid "Submit Product in Hesabix" -msgstr "ثبت محصول در حسابیکس" - -msgid "Do not submit product in Hesabix automatically by saving product in woocommerce" -msgstr "با ذخیره محصول در ووکامرس، محصول را بصورت اتوماتیک در حسابیکس ثبت نکن" - -msgid "Remove The Titles for Attributes When Saving Product To Hesabix" -msgstr "عنوان متغیر های یک محصول را با ذخیره/بروزرسانی در نام محصول حذف کن" - -msgid "Submit Price in Hesabix" -msgstr "ثبت قیمت در حسابیکس" - -msgid "Do not update product price in Hesabix by editing product in woocommerce" -msgstr "با ویرایش محصول در ووکامرس، قیمت محصول را در حسابیکس بروز نکن" - -msgid "Barcode in Hesabix" -msgstr "بارکد در حسابیکس" - -msgid "National Code in Hesabix" -msgstr "کد ملی در حسابیکس" - -msgid "Do not update product barcode in Hesabix by saving product in woocommerce" -msgstr "با ذخیره محصول در ووکامرس، بارکد محصول را در حسابیکس بروز نکن" - -msgid "Do not update product category in Hesabix by saving product in woocommerce" -msgstr "با ذخیره محصول در ووکامرس، دسته بندی محصول را در حسابیکس بروز نکن" - -msgid "Do not update product code in Hesabix by saving product in woocommerce" -msgstr "با ذخیره محصول در ووکامرس، کد محصول را در حسابیکس بروز نکن" - -msgid "Shipping method" -msgstr "روش حمل و نقل" - -msgid "Invoice's Salesman" -msgstr "فروشنده فاکتور" - -msgid "Invoice Salesman Percentage" -msgstr "درصد پورسانت فروشنده فاکتور" - -msgid "Invoice's Project" -msgstr "پروژه فاکتور" - -msgid "Submit Cash in Transit" -msgstr "ثبت در وجوه در راه" - -msgid "Submit Invoice Receipt Cash in Transit" -msgstr "ثبت رسید دریافت فاکتور در وجوه در راه" - -msgid "Default Invoice Transaction Fee Percentage" -msgstr "درصد کارمزد تراکنش به صورت پیش فرض" - -msgid "Plugin Tutorial Video" -msgstr "ویدیوی خودآموز افزونه" - -msgid "Titles" -msgstr "عناوین" - -msgid "Accounting quantity (Total inventory)" -msgstr "موجودی حسابداری (موجودی کل)" - -msgid "Cannot get warehouses." -msgstr "امکان دریافت اطلاعات انبارها نیست." - -msgid "Update product's quantity based on" -msgstr "بروزرسانی موجودی کالا بر اساس" - -msgid "Do not update purchase and sales titles in hesabix" -msgstr "توضیحات (عنوان های) خرید و فروش را در حسابیکس بروز نکن" - -msgid "Warehouse system is not active in Hesabix." -msgstr "سیستم انبارداری در حسابیکس فعال نیست." - -msgid "API Address" -msgstr "آدرس API" - -msgid "Contact Code in Hesabix" -msgstr "کد شخص در حسابیکس" - -msgid "" -"The contact code of this user in Hesabix, if you want to map this user " -"to a contact in Hesabix, enter the Contact code." -msgstr "" -"این فیلد کد شخص در حسابیکس است، اگر می‌خواهید این کاربر را به شخصی " -"در حسابیکس ارتباط دهید، کد شخص را وارد نمایید." - -msgid "" -"To check the phone with national code, " -"you need to enter both billing phone correctly." -msgstr "" -"این فیلد کد ملی شخص در حسابیکس است، اگر می‌خواهید شماره تماس با کد ملی چک شود " -"باید شماره تماس صورتحساب را به درستی وارد نمایید." - -msgid "Error: Select maximum 10 orders. Due to some limitations in Hesabix API, sending too many requests in one minute is not possible." -msgstr "خطا: حداکثر ۱۰ سفارش را انتخاب کنید. بدلیل محدودیت رابط برنامه نویسی حسابیکس، ارسال درخواست های زیاد در یک دقیقه امکان پذیر نیست." - -msgid "Selected orders invoices have been saved. Number of saved invoices: " -msgstr "فاکتور سفارش های انتخاب شده ثبت شد. تعداد فاکتور های ثبت شده: " - -msgid "Update sale price" -msgstr "بروزرسانی قیمت فروش ویژه" - -msgid "The Sale price does not change" -msgstr "قیمت فروش ویژه تغییر نکند" - -msgid "The Sale price gets removed" -msgstr "قیمت فروش ویژه حذف گردد" - -msgid "The sale price get changes in proportion to the regular price" -msgstr "قیمت فروش ویژه به تناسب قیمت اصلی تغییر یابد" - -msgid "Submit invoice base on Dokan orders" -msgstr "ثبت فاکتور بر اساس سفارشات افزونه دکان" - -msgid "Submit parent order" -msgstr "ثبت سفارش مادر" - -msgid "Submit children orders" -msgstr "ثبت زیر سفارش ها" - -msgid "Inactive" -msgstr "غیر فعال" - -#~ msgid "Sync completed, All products added/updated." -#~ msgstr "همسان‌سازی پایان یافت. تمامی محصولات به‌روزرسانی/افزوده شدند." - -#~ msgid "Sync completed, No product added/updated." -#~ msgstr "همسان‌سازی پایان یافت. هیچ محصولی به‌روزرسانی/افزوده شدند." - -#~ msgid "Sync completed; All hesabix changes synced successfully." -#~ msgstr "همسان‌سازی پایان یافت. تمامی تغییرات با حسابیکس همسان شد." - -#~ msgid "Sync completed; All products added/updated." -#~ msgstr "همسان‌سازی پایان یافت. تمامی محصولات به‌روزرسانی/افزوده شدند." - -#~ msgid "Sync completed; No product added/updated." -#~ msgstr "همسان‌سازی پایان یافت. هیچ محصولی به‌روزرسانی/افزوده شدند." - -#~ msgid "Export product completed. %s product added/updated." -#~ msgstr "استخراج پایان یافت. %s محصول به‌روزرسانی/افزوده شد." - -#~ msgid "Export customers completed. %s product added/updated." -#~ msgstr "استخراج مشتریان پایان یافت. %s مشتری به‌روزرسانی/افزوده شد." \ No newline at end of file diff --git a/ssbhesabix.php b/ssbhesabix.php deleted file mode 100644 index f50e764..0000000 --- a/ssbhesabix.php +++ /dev/null @@ -1,72 +0,0 @@ -run(); -} - -run_ssbhesabix(); diff --git a/uninstall.php b/uninstall.php index ee1d5f1..1ae5fb2 100644 --- a/uninstall.php +++ b/uninstall.php @@ -1,33 +1,28 @@ - * @author HamidReza Gharahzadeh - * @author Sepehr Najafi - * @since 1.0.0 - * - * @package ssbhesabix + * Hesabix Uninstall + * + * @package Hesabix + * @author Mohammad Rezai + * @author URI https://pirouz.xyz + * @since 1.0.0 */ -// If uninstall not called from WordPress, then exit. -if (!defined( 'WP_UNINSTALL_PLUGIN')) { - exit; +if (!defined('WP_UNINSTALL_PLUGIN')) { + exit; } -include_once(plugin_dir_path(__DIR__) . 'admin/services/hesabixLogService.php'); -require 'includes/class-ssbhesabix-api.php'; - -// delete tags in hesabix -$hesabixApi = new Ssbhesabix_Api(); -$result = $hesabixApi->fixClearTags(); -if (!$result->Success) { - hesabixLogService::log(array("ssbhesabix - Cannot clear tags. Error Message: " . (string)$result->ErrorMessage . ". Error Code: " . (string)$result->ErrorCode)); +if (defined('ABSPATH')) { + global $wpdb; + if (isset($wpdb->options)) { + $options = $wpdb->get_results("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '%hesabix%'"); + if ($options) { + foreach ($options as $option) { + delete_option($option->option_name); + } + } + } + if (isset($wpdb->prefix)) { + $wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}hesabix"); + } } - -global $wpdb; -$options = $wpdb->get_results("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '%ssbhesabix%'"); -foreach ($options as $option) { - delete_option($option->option_name); -} - -$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}ssbhesabix");