__( 'Odoo URL (e.g. https://odoo.example.com)', 'woodoo' ), 'woodoo_odoo_db' => __( 'Database Name', 'woodoo' ), 'woodoo_odoo_username' => __( 'Username / Login', 'woodoo' ), 'woodoo_odoo_api_key' => __( 'API Key', 'woodoo' ), ]; foreach ( $fields as $key => $label ) { register_setting( 'woodoo_settings', $key, [ 'sanitize_callback' => 'sanitize_text_field' ] ); } // Meeting settings $meeting_fields = [ 'woodoo_meeting_duration' => 30, // minutes 'woodoo_available_days' => [ 1, 2, 3, 4, 5 ], // Mon-Fri 'woodoo_available_from' => '09:00', 'woodoo_available_to' => '17:00', 'woodoo_meeting_title_prefix'=> 'Meeting via WooDoo', ]; foreach ( $meeting_fields as $key => $default ) { register_setting( 'woodoo_settings', $key ); } // Order sync toggle register_setting( 'woodoo_settings', 'woodoo_sync_orders', [ 'sanitize_callback' => 'rest_sanitize_boolean' ] ); } public static function enqueue_admin_assets( string $hook ): void { if ( strpos( $hook, 'woodoo-settings' ) === false && $hook !== 'user-edit.php' && $hook !== 'profile.php' ) { return; } wp_enqueue_style( 'woodoo-admin', WOODOO_URL . 'assets/css/woodoo-admin.css', [], WOODOO_VERSION ); wp_enqueue_script( 'woodoo-admin', WOODOO_URL . 'assets/js/woodoo-admin.js', [ 'jquery' ], WOODOO_VERSION, true ); wp_localize_script( 'woodoo-admin', 'WooDooAdmin', [ 'nonce' => wp_create_nonce( 'woodoo_admin' ), 'ajax_url' => admin_url( 'admin-ajax.php' ), 'i18n' => [ 'testing' => __( 'Testing…', 'woodoo' ), 'searching' => __( 'Searching…', 'woodoo' ), 'link_done' => __( 'Linked!', 'woodoo' ), 'error' => __( 'Error. Check console.', 'woodoo' ), ], ] ); } // ── Settings Page HTML ──────────────────────────────────────────────── public static function render_settings_page(): void { if ( ! current_user_can( 'manage_woocommerce' ) ) { wp_die( esc_html__( 'Access denied.', 'woodoo' ) ); } $days_map = [ 1 => __( 'Monday', 'woodoo' ), 2 => __( 'Tuesday', 'woodoo' ), 3 => __( 'Wednesday', 'woodoo' ), 4 => __( 'Thursday', 'woodoo' ), 5 => __( 'Friday', 'woodoo' ), 6 => __( 'Saturday', 'woodoo' ), 7 => __( 'Sunday', 'woodoo' ), ]; $saved_days = (array) get_option( 'woodoo_available_days', [ 1, 2, 3, 4, 5 ] ); ?>

ID, 'woodoo_odoo_partner_id', true ); $partner_name = get_user_meta( $user->ID, 'woodoo_odoo_partner_name', true ); ?>

ID, 'woodoo_so_count', true ); if ( $odoo_so_count ) : ?>


0 ) { update_user_meta( $user_id, 'woodoo_odoo_partner_id', $partner_id ); // Resolve name from Odoo $api = woodoo_api(); if ( $api ) { $partners = $api->read( 'res.partner', [ $partner_id ], [ 'name', 'email' ] ); if ( ! empty( $partners[0]['name'] ) ) { update_user_meta( $user_id, 'woodoo_odoo_partner_name', sanitize_text_field( $partners[0]['name'] ) ); } } } else { delete_user_meta( $user_id, 'woodoo_odoo_partner_id' ); delete_user_meta( $user_id, 'woodoo_odoo_partner_name' ); } } // ── Users List Column ───────────────────────────────────────────────── public static function add_users_column( array $columns ): array { $columns['woodoo_odoo'] = __( 'Odoo Partner', 'woodoo' ); return $columns; } public static function render_users_column( string $value, string $column, int $user_id ): string { if ( $column !== 'woodoo_odoo' ) return $value; $partner_id = get_user_meta( $user_id, 'woodoo_odoo_partner_id', true ); $partner_name = get_user_meta( $user_id, 'woodoo_odoo_partner_name', true ); if ( $partner_id ) { return '' . esc_html( $partner_name ?: "#$partner_id" ) . ''; } return ''; } // ── AJAX Handlers ───────────────────────────────────────────────────── public static function ajax_test_connection(): void { check_ajax_referer( 'woodoo_admin', 'nonce' ); if ( ! current_user_can( 'manage_woocommerce' ) ) wp_send_json_error( 'Forbidden', 403 ); $api = woodoo_api(); if ( ! $api ) { wp_send_json_error( 'Credentials not saved yet. Save settings first.' ); } wp_send_json_success( $api->test_connection() ); } public static function ajax_search_partners(): void { check_ajax_referer( 'woodoo_admin', 'nonce' ); if ( ! current_user_can( 'edit_users' ) ) wp_send_json_error( 'Forbidden', 403 ); $q = sanitize_text_field( wp_unslash( $_POST['query'] ?? '' ) ); $api = woodoo_api(); if ( ! $api || empty( $q ) ) wp_send_json_success( [] ); $results = $api->search_read( 'res.partner', [ '|', [ 'name', 'ilike', $q ], [ 'email', 'ilike', $q ] ], [ 'id', 'name', 'email', 'is_company' ], 10 ); wp_send_json_success( $results ); } public static function ajax_link_customer(): void { check_ajax_referer( 'woodoo_admin', 'nonce' ); if ( ! current_user_can( 'edit_users' ) ) wp_send_json_error( 'Forbidden', 403 ); $user_id = absint( $_POST['user_id'] ?? 0 ); $partner_id = absint( $_POST['partner_id'] ?? 0 ); if ( ! $user_id || ! $partner_id ) wp_send_json_error( 'Invalid IDs' ); $api = woodoo_api(); if ( ! $api ) wp_send_json_error( 'API not configured' ); $partners = $api->read( 'res.partner', [ $partner_id ], [ 'name', 'email' ] ); if ( empty( $partners ) ) wp_send_json_error( 'Partner not found in Odoo' ); update_user_meta( $user_id, 'woodoo_odoo_partner_id', $partner_id ); update_user_meta( $user_id, 'woodoo_odoo_partner_name', sanitize_text_field( $partners[0]['name'] ) ); wp_send_json_success( [ 'partner_id' => $partner_id, 'partner_name' => $partners[0]['name'], ] ); } }