/* ------------------------------------------------------------------ */ /* پرداخت‌ها به تأمین‌کنندگان (تسویه حساب) */ /* ------------------------------------------------------------------ */ function ttbol_cs_install_payments_table() { global $wpdb; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; $charset = $wpdb->get_charset_collate(); $pay = ttbol_cs_t( 'payments' ); dbDelta( "CREATE TABLE {$pay} ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, supplier VARCHAR(190) NOT NULL DEFAULT '', amount BIGINT NOT NULL DEFAULT 0, pay_date DATE NOT NULL, note TEXT NULL, created_at DATETIME NOT NULL, PRIMARY KEY (id), KEY supplier (supplier(60)), KEY pay_date (pay_date) ) {$charset};" ); } register_activation_hook( __FILE__, 'ttbol_cs_install_payments_table' ); function ttbol_cs_supplier_total_due( $supplier ) { global $wpdb; $itm = ttbol_cs_t( 'items' ); $inv = ttbol_cs_t( 'invoices' ); return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COALESCE(SUM(i.qty_sold * i.unit_price),0) FROM {$itm} i INNER JOIN {$inv} v ON v.id = i.invoice_id WHERE v.supplier = %s", $supplier ) ); } function ttbol_cs_supplier_total_paid( $supplier ) { global $wpdb; $pay = ttbol_cs_t( 'payments' ); return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COALESCE(SUM(amount),0) FROM {$pay} WHERE supplier = %s", $supplier ) ); } add_action( 'admin_menu', function () { add_submenu_page( 'ttbol-cs', 'تسویه حساب', 'تسویه حساب', TTBOL_CS_CAP, 'ttbol-cs-balance', 'ttbol_cs_page_balance' ); } ); function ttbol_cs_page_balance() { if ( ! current_user_can( TTBOL_CS_CAP ) ) { wp_die( 'دسترسی ندارید.' ); } global $wpdb; $pay = ttbol_cs_t( 'payments' ); // اطمینان از وجود جدول (برای سایت‌هایی که پلاگین قبلاً فعال بوده و activation دوباره اجرا نشده) if ( $wpdb->get_var( "SHOW TABLES LIKE '{$pay}'" ) !== $pay ) { ttbol_cs_install_payments_table(); } // حذف پرداخت if ( isset( $_GET['delpay'] ) && check_admin_referer( 'ttbol_cs_delpay' ) ) { $wpdb->delete( $pay, array( 'id' => (int) $_GET['delpay'] ), array( '%d' ) ); echo '

پرداخت حذف شد.

'; } // ثبت پرداخت جدید if ( isset( $_POST['ttbol_cs_add_payment'] ) && check_admin_referer( 'ttbol_cs_balance' ) ) { $supplier = sanitize_text_field( wp_unslash( $_POST['supplier'] ?? '' ) ); $amount = (int) preg_replace( '/[^\d]/', '', ttbol_cs_fa_to_en( wp_unslash( $_POST['amount'] ?? '0' ) ) ); $date = sanitize_text_field( wp_unslash( $_POST['pay_date'] ?? '' ) ); $note = sanitize_textarea_field( wp_unslash( $_POST['note'] ?? '' ) ); if ( $supplier && $amount > 0 ) { $wpdb->insert( $pay, array( 'supplier' => $supplier, 'amount' => $amount, 'pay_date' => $date ? $date : current_time( 'Y-m-d' ), 'note' => $note, 'created_at' => current_time( 'mysql' ), ), array( '%s', '%d', '%s', '%s', '%s' ) ); echo '

پرداخت ثبت شد.

'; } else { echo '

تأمین‌کننده و مبلغ معتبر لازم است.

'; } } $suppliers = ttbol_cs_suppliers(); $sel = isset( $_GET['supplier'] ) ? sanitize_text_field( wp_unslash( $_GET['supplier'] ) ) : ''; echo '

تسویه حساب تأمین‌کنندگان

'; // خلاصه وضعیت همه تأمین‌کنندگان echo '

خلاصه وضعیت حساب

'; echo ''; foreach ( $suppliers as $s ) { $due = ttbol_cs_supplier_total_due( $s ); $paid = ttbol_cs_supplier_total_paid( $s ); $left = $due - $paid; $color = $left > 0 ? '#b32d2e' : ( $left < 0 ? '#996800' : '#007017' ); $link = admin_url( 'admin.php?page=ttbol-cs-balance&supplier=' . rawurlencode( $s ) ); echo ''; } echo '
تأمین‌کنندهکل بدهی (از فروش امانی)کل پرداخت‌شدهمانده حساب
' . esc_html( $s ) . ' ' . ttbol_cs_money( $due ) . ' تومان ' . ttbol_cs_money( $paid ) . ' تومان ' . ttbol_cs_money( $left ) . ' تومان
'; // فرم ثبت پرداخت جدید echo '

ثبت پرداخت جدید

'; echo '
'; wp_nonce_field( 'ttbol_cs_balance' ); echo '
تأمین‌کننده '; foreach ( $suppliers as $s ) { echo '
مبلغ پرداخت (تومان)
تاریخ پرداخت
توضیح
'; echo '

'; echo '
'; // تاریخچه پرداخت‌ها $where = $sel ? $wpdb->prepare( 'WHERE supplier = %s', $sel ) : ''; $rows = $wpdb->get_results( "SELECT * FROM {$pay} {$where} ORDER BY pay_date DESC, id DESC" ); echo '

تاریخچه پرداخت‌ها' . ( $sel ? ' — ' . esc_html( $sel ) : '' ) . '

'; if ( ! $rows ) { echo '

هنوز پرداختی ثبت نشده.

'; } else { echo ''; foreach ( $rows as $r ) { $del = wp_nonce_url( admin_url( 'admin.php?page=ttbol-cs-balance&delpay=' . $r->id . ( $sel ? '&supplier=' . rawurlencode( $sel ) : '' ) ), 'ttbol_cs_delpay' ); echo ''; } echo '
تأمین‌کنندهتاریخمبلغتوضیح
' . esc_html( $r->supplier ) . ' ' . esc_html( $r->pay_date ) . ' ' . ttbol_cs_money( $r->amount ) . ' تومان ' . esc_html( $r->note ) . ' حذف
'; } echo '
'; }