~/icsd.ir — bash
SYSTEM_ONLINE

💰 فصل ۶: مالیات و ارز در ووکامرس

در این فصل با تنظیمات حرفه‌ای مالیات بر ارزش افزوده، ارز تومان/ریال، نمایش قیمت‌ها و چندارزی شدن فروشگاه آشنا می‌شوید.

📐 پایه‌های مالیات در ووکامرس

فعال‌سازی مالیات

از WooCommerce → Settings → General، تیک Enable taxes را بزنید.

مفاهیم کلیدی

مفهوم توضیح
Tax Class کلاس مالیاتی – مثلاً Standard، Reduced، Zero
Tax Rate نرخ مالیات برای هر کلاس + هر منطقه
Prices include tax قیمت‌ها شامل مالیات هستند یا خیر
Display prices نمایش قیمت در سبد و سایت با/بدون مالیات

🇮🇷 مالیات بر ارزش افزوده ایران

برای فروشگاه ایرانی با مالیات ۱۰٪ (مرسوم در سال‌های اخیر):

تنظیم نرخ از پنل

  1. WooCommerce → Settings → Tax
  2. روی Standard rates کلیک کنید
  3. یک ردیف اضافه کنید با مقادیر:
Country code IR
State code * (همه استان‌ها)
Postcode/ZIP *
City *
Rate % 10.0000
Tax name مالیات بر ارزش افزوده

تنظیم برنامه‌نویسی نرخ مالیات

includes/setup-iran-tax.php
// در فعال‌سازی افزونه، نرخ مالیات ایران را خودکار اضافه کن
register_activation_hook(__FILE__, function() {
    global $wpdb;
    
    $exists = $wpdb->get_var(
        "SELECT tax_rate_id FROM {$wpdb->prefix}woocommerce_tax_rates 
         WHERE tax_rate_country = 'IR' AND tax_rate_class = ''"
    );
    
    if (!$exists) {
        $wpdb->insert($wpdb->prefix . 'woocommerce_tax_rates', [
            'tax_rate_country'  => 'IR',
            'tax_rate_state'    => '',
            'tax_rate'          => '10.0000',
            'tax_rate_name'     => 'مالیات بر ارزش افزوده',
            'tax_rate_priority' => 1,
            'tax_rate_compound' => 0,
            'tax_rate_shipping' => 1,
            'tax_rate_order'    => 0,
            'tax_rate_class'    => '',
        ]);
    }
});

معاف کردن محصولات خاص

// بعضی محصولات (مثل کالاهای اساسی) معاف از مالیات هستند
add_filter('woocommerce_product_get_tax_class', function($tax_class, $product) {
    $exempt_categories = ['food-staples', 'medicine'];
    $cats = wp_get_post_terms($product->get_id(), 'product_cat', ['fields' => 'slugs']);
    
    if (array_intersect($cats, $exempt_categories)) {
        return 'zero-rate';
    }
    return $tax_class;
}, 10, 2);

نمایش جداگانه مالیات در فاکتور

// نمایش مبلغ خالص + مالیات به‌صورت جدا
add_filter('woocommerce_get_order_item_totals', function($totals, $order, $tax_display) {
    if (isset($totals['cart_subtotal'])) {
        $subtotal = $order->get_subtotal();
        $tax = $order->get_total_tax();
        
        $totals['cart_subtotal']['value'] = wc_price($subtotal) . 
            ' (بدون مالیات)';
        $totals['tax_breakdown'] = [
            'label' => 'مالیات بر ارزش افزوده ۱۰٪:',
            'value' => wc_price($tax),
        ];
    }
    return $totals;
}, 10, 3);

💵 واحد پول تومان (راه‌حل کامل)

ووکامرس به‌صورت پیش‌فرض از تومان پشتیبانی می‌کند، اما برای پشتیبانی کامل (با درگاه‌هایی که ریال می‌خواهند) باید کارهای زیر را انجام دهید:

افزودن تومان به لیست ارزها (در صورت نیاز)

// اضافه کردن تومان (اگر در نسخه شما نبود)
add_filter('woocommerce_currencies', function($currencies) {
    $currencies['IRT'] = 'تومان ایران';
    return $currencies;
});

add_filter('woocommerce_currency_symbol', function($symbol, $currency) {
    if ($currency === 'IRT') return 'تومان';
    return $symbol;
}, 10, 2);

فرمت اعداد فارسی

// تبدیل اعداد به فارسی در نمایش قیمت
add_filter('wc_price', function($return, $price, $args, $unformatted_price) {
    return convert_to_persian_numbers($return);
}, 10, 4);

function convert_to_persian_numbers($string) {
    $persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
    $english = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
    return str_replace($english, $persian, $string);
}

تبدیل تومان به ریال در پرداخت

// در درگاه پرداخت، اگر فروشگاه تومان است، × 10 کن
public function get_amount_for_gateway($order) {
    $amount = (int) $order->get_total();
    
    if (in_array($order->get_currency(), ['IRT', 'TOMAN', 'TMN'])) {
        return $amount * 10; // تبدیل به ریال
    }
    
    return $amount;
}

🌐 چندارزی – تبدیل لحظه‌ای

برای فروشگاه‌هایی که محصول را به مشتریان خارجی هم می‌فروشند:

روش ۱: استفاده از افزونه

  • WPML Currency Switcher – بهترین برای سایت چندزبانه
  • CURCY – WooCommerce Multi Currency – رایگان
  • Aelia Currency Switcher – حرفه‌ای

روش ۲: پیاده‌سازی سفارشی

includes/multi-currency.php
class Simple_Multi_Currency {
    
    private $rates = [];
    
    public function __construct() {
        $this->rates = $this->get_rates();
        
        add_filter('woocommerce_product_get_price', [$this, 'convert_price'], 10, 2);
        add_filter('woocommerce_product_get_regular_price', [$this, 'convert_price'], 10, 2);
        add_filter('woocommerce_currency_symbol', [$this, 'change_symbol'], 10, 2);
        
        add_action('init', [$this, 'detect_currency']);
        add_action('woocommerce_before_main_content', [$this, 'currency_switcher']);
    }
    
    private function get_rates() {
        // کش روزانه برای جلوگیری از فراخوانی مکرر API
        $rates = get_transient('icsd_currency_rates');
        if ($rates !== false) return $rates;
        
        // دریافت از Navasan API (رایگان برای ایران)
        $response = wp_remote_get('http://api.navasan.tech/latest/?api_key=YOUR_KEY');
        $data = json_decode(wp_remote_retrieve_body($response), true);
        
        $rates = [
            'IRT' => 1, // پایه
            'USD' => 1 / floatval($data['usd_buy']['value'] ?? 60000),
            'EUR' => 1 / floatval($data['eur']['value'] ?? 65000),
            'AED' => 1 / floatval($data['aed']['value'] ?? 16000),
        ];
        
        set_transient('icsd_currency_rates', $rates, DAY_IN_SECONDS);
        return $rates;
    }
    
    public function detect_currency() {
        if (isset($_GET['set_currency'])) {
            $currency = sanitize_text_field($_GET['set_currency']);
            if (isset($this->rates[$currency])) {
                setcookie('user_currency', $currency, time() + YEAR_IN_SECONDS, '/');
                $_COOKIE['user_currency'] = $currency;
            }
        }
    }
    
    public function get_user_currency() {
        return $_COOKIE['user_currency'] ?? 'IRT';
    }
    
    public function convert_price($price, $product) {
        if (empty($price)) return $price;
        
        $user_currency = $this->get_user_currency();
        if ($user_currency === 'IRT') return $price;
        
        $rate = $this->rates[$user_currency] ?? 1;
        return round(floatval($price) * $rate, 2);
    }
    
    public function change_symbol($symbol, $currency) {
        $user_currency = $this->get_user_currency();
        $symbols = [
            'USD' => '$', 'EUR' => '€', 'AED' => 'د.إ',
        ];
        return $symbols[$user_currency] ?? $symbol;
    }
    
    public function currency_switcher() {
        $current = $this->get_user_currency();
        echo '
'; foreach (array_keys($this->rates) as $cur) { $active = $cur === $current ? 'active' : ''; $url = add_query_arg('set_currency', $cur); echo "{$cur}"; } echo '
'; } } new Simple_Multi_Currency();

⚠️ نکته مهم: در فرآیند پرداخت، ارز مشتری به ارز پایه (تومان) تبدیل و ارسال می‌شود. مشتری در کارت بانکی خود مبلغ تومانی را می‌بیند.

🏷️ نمایش حرفه‌ای قیمت

قیمت با تخفیف زیبا

// نمایش درصد تخفیف کنار قیمت
add_filter('woocommerce_sale_flash', function($html, $post, $product) {
    if ($product->is_on_sale()) {
        $regular = floatval($product->get_regular_price());
        $sale    = floatval($product->get_sale_price());
        
        if ($regular > 0) {
            $percent = round((($regular - $sale) / $regular) * 100);
            return '' . $percent . '٪ تخفیف';
        }
    }
    return $html;
}, 10, 3);

نمایش قیمت اقساطی

// زیر قیمت، نمایش پرداخت ۳ قسطی (مثل اسنپ‌پی)
add_action('woocommerce_after_shop_loop_item_title', function() {
    global $product;
    $price = floatval($product->get_price());
    
    if ($price >= 1_000_000) {
        $monthly = round($price / 3);
        echo '
'; echo 'یا ۳ قسط ' . wc_price($monthly) . ''; echo '
'; } }, 15);

قیمت دلاری به‌صورت ثانویه

add_filter('woocommerce_get_price_html', function($price_html, $product) {
    $rate = get_option('icsd_usd_rate', 60000);
    $usd = round(floatval($product->get_price()) / $rate, 2);
    
    if ($usd > 0) {
        $price_html .= ' (~$' . $usd . ')';
    }
    return $price_html;
}, 10, 2);

🧾 صدور فاکتور رسمی

اضافه کردن فیلدهای فاکتور رسمی

// فیلدهای حقوقی در checkout
add_filter('woocommerce_checkout_fields', function($fields) {
    $fields['billing']['billing_company_type'] = [
        'label'    => 'نوع خریدار',
        'type'     => 'select',
        'options'  => [
            'real'  => 'حقیقی',
            'legal' => 'حقوقی',
        ],
        'class'    => ['form-row-wide'],
        'priority' => 25,
    ];
    
    $fields['billing']['billing_economic_code'] = [
        'label'    => 'شناسه ملی / کد اقتصادی',
        'type'     => 'text',
        'class'    => ['form-row-wide'],
        'priority' => 26,
        'required' => false,
    ];
    
    $fields['billing']['billing_national_id'] = [
        'label'    => 'کد ملی',
        'type'     => 'text',
        'class'    => ['form-row-wide'],
        'priority' => 27,
        'required' => true,
    ];
    
    return $fields;
});

// نمایش در پنل سفارش
add_action('woocommerce_admin_order_data_after_billing_address', function($order) {
    echo '

نوع خریدار: ' . esc_html($order->get_meta('_billing_company_type') === 'legal' ? 'حقوقی' : 'حقیقی') . '

'; echo '

کد ملی/اقتصادی: ' . esc_html($order->get_meta('_billing_economic_code') ?: $order->get_meta('_billing_national_id')) . '

'; });

تولید PDF فاکتور

برای ایجاد فاکتور PDF، می‌توانید از کتابخانه TCPDF یا dompdf استفاده کنید:

// نیاز به: composer require dompdf/dompdf
use DompdfDompdf;

add_action('woocommerce_admin_order_actions_end', function($order) {
    $url = admin_url('admin-post.php?action=download_invoice&order_id=' . $order->get_id());
    echo '📄 PDF فاکتور';
});

add_action('admin_post_download_invoice', function() {
    $order = wc_get_order(absint($_GET['order_id']));
    if (!$order || !current_user_can('manage_woocommerce')) wp_die('دسترسی مجاز نیست');
    
    ob_start();
    include __DIR__ . '/templates/invoice-template.php'; // قالب HTML
    $html = ob_get_clean();
    
    $dompdf = new Dompdf(['enable_remote' => true, 'defaultFont' => 'Vazirmatn']);
    $dompdf->loadHtml($html);
    $dompdf->setPaper('A4', 'portrait');
    $dompdf->render();
    
    $dompdf->stream('invoice-' . $order->get_order_number() . '.pdf', ['Attachment' => true]);
    exit;
});

💡 پیشنهاد: برای فاکتور رسمی، از افزونه WooCommerce PDF Invoices استفاده کنید — رایگان، قابل توسعه و سازگار با سامانه مودیان.

📝 خلاصه فصل

  • تنظیم مالیات بر ارزش افزوده ایران
  • پشتیبانی کامل از تومان و تبدیل به ریال
  • پیاده‌سازی چندارزی با کش
  • نمایش حرفه‌ای قیمت با تخفیف و اقساط
  • اضافه کردن فیلدهای فاکتور رسمی
  • تولید PDF فاکتور

نمایش سایت

رنگ سایت
حالت نمایش
اندازهٔ متن
خوانایی

این تنظیمات فقط روی مرورگر شما ذخیره می‌شود.