prefix . 'usedkit_tradeins'; } function usedkit_tradeins_install() { global $wpdb; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; dbDelta('CREATE TABLE ' . usedkit_tradeins_table() . ' ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, model varchar(200) NOT NULL, query varchar(200) NOT NULL, grade varchar(20) NOT NULL, offer decimal(19,4) NULL, currency varchar(10) NOT NULL, name varchar(200) NOT NULL, email varchar(200) NOT NULL, notes text NOT NULL, status varchar(20) NOT NULL, product_id bigint(20) unsigned NULL, created_at datetime NOT NULL, PRIMARY KEY (id), KEY status (status) ) ' . $wpdb->get_charset_collate() . ';'); update_option('usedkit_tradeins_version', USEDKIT_TRADEINS_VERSION); } add_action('admin_init', function () { if ((int) get_option('usedkit_tradeins_version') !== USEDKIT_TRADEINS_VERSION) { usedkit_tradeins_install(); } }); add_action('usedkit_tradein_request', function ($q, $name, $email, $notes) { global $wpdb; $wpdb->insert(usedkit_tradeins_table(), array( 'model' => mb_substr($q['model'], 0, 200), 'query' => mb_substr($q['query'], 0, 200), 'grade' => $q['condition'], 'offer' => $q['offer'] ?: null, 'currency' => $q['currency'], 'name' => mb_substr($name, 0, 200), 'email' => $email, 'notes' => $notes, 'status' => 'new', 'created_at' => current_time('mysql', true))); }, 10, 4); add_action('admin_menu', function () { global $wpdb; if (!get_option('usedkit_tradeins_version')) { return; } $n = (int) $wpdb->get_var('SELECT COUNT(*) FROM ' . usedkit_tradeins_table() . " WHERE status = 'new'"); // phpcs:ignore $any = $n || $wpdb->get_var('SELECT 1 FROM ' . usedkit_tradeins_table() . ' LIMIT 1'); // phpcs:ignore if (!$any) { return; // no trade-in form in use: no menu item } $label = __('Trade-ins', 'usedkit') . ($n ? ' ' . $n . '' : ''); add_submenu_page('woocommerce', __('Trade-ins', 'usedkit'), $label, 'manage_woocommerce', 'usedkit-tradeins', 'usedkit_tradeins_page'); }, 20); /** Make a trade-in a draft product; returns its id. */ function usedkit_tradein_to_product($t) { $p = new WC_Product_Simple(); $p->set_name($t['model']); $p->set_status('draft'); $p->set_manage_stock(true); $p->set_stock_quantity(1); if ($t['offer'] !== null) { $p->update_meta_data('_usedkit_cost', wc_format_decimal($t['offer'])); } $p->update_meta_data('_usedkit_bought', current_time('Y-m-d')); $p->update_meta_data('_usedkit_seller', $t['name']); $p->update_meta_data('_usedkit_seller_contact', $t['email']); if (in_array($t['grade'], array('excellent', 'good', 'fair'), true)) { $p->update_meta_data('_usedkit_condition', $t['grade']); } if (trim($t['notes']) !== '') { $p->update_meta_data('_usedkit_condition_note', $t['notes']); } $p->update_meta_data('_usedkit_tradein', (int) $t['id']); return $p->save(); } add_action('admin_post_usedkit_tradein_do', function () { $id = absint($_GET['tradein'] ?? 0); check_admin_referer('usedkit_tradein_' . $id); if (!current_user_can('manage_woocommerce')) { wp_die(esc_html__('Not allowed.', 'usedkit')); } global $wpdb; $t = $wpdb->get_row($wpdb->prepare('SELECT * FROM ' . usedkit_tradeins_table() . ' WHERE id = %d', $id), ARRAY_A); // phpcs:ignore if (!$t || $t['status'] !== 'new') { wp_safe_redirect(admin_url('admin.php?page=usedkit-tradeins')); exit; } if (sanitize_key($_GET['do'] ?? '') === 'buy') { $pid = usedkit_tradein_to_product($t); $wpdb->update(usedkit_tradeins_table(), array('status' => 'bought', 'product_id' => $pid), array('id' => $id)); wp_safe_redirect(admin_url('post.php?action=edit&post=' . $pid)); } else { $wpdb->update(usedkit_tradeins_table(), array('status' => 'declined'), array('id' => $id)); wp_safe_redirect(admin_url('admin.php?page=usedkit-tradeins')); } exit; }); function usedkit_tradeins_page() { if (!current_user_can('manage_woocommerce')) { return; } global $wpdb; $rows = $wpdb->get_results('SELECT * FROM ' . usedkit_tradeins_table() . " ORDER BY status = 'new' DESC, created_at DESC LIMIT 200", ARRAY_A); // phpcs:ignore $conds = usedkit_conditions(); ?>


$t['currency'], 'decimals' => 0))) : '—'; ?>
__('Bought: make a draft', 'usedkit'), 'decline' => __('Not buying', 'usedkit')) as $do => $label) { printf('%s ', $do === 'buy' ? ' button-primary' : '', esc_url(wp_nonce_url(admin_url('admin-post.php?action=usedkit_tradein_do&do=' . $do . '&tradein=' . $t['id']), 'usedkit_tradein_' . $t['id'])), esc_html($label)); } elseif ($t['status'] === 'bought' && $t['product_id']) : echo '' . esc_html__('Bought', 'usedkit') . ''; else : esc_html_e('Not bought', 'usedkit'); endif; ?>
query($wpdb->prepare('DELETE FROM ' . usedkit_tradeins_table() . ' WHERE created_at < %s', gmdate('Y-m-d H:i:s', time() - 365 * DAY_IN_SECONDS))); // phpcs:ignore } });