diff --git a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-orders.php b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-orders.php
index e12eb30..962e60e 100644
--- a/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-orders.php
+++ b/backend/app/plugins/wiaas/includes/admin/class-wiaas-admin-orders.php
@@ -7,6 +7,8 @@ class Wiaas_Admin_Orders {
add_filter( 'manage_edit-shop_order_columns', array(__CLASS__, 'add_additional_columns_to_orders_screen') );
add_action( 'manage_shop_order_posts_custom_column', array(__CLASS__, 'add_custom_columns_content') );
+
+ add_filter( 'woocommerce_admin_order_preview_get_order_details', array(__CLASS__, 'add_custom_data_to_order_preview') );
}
public static function add_additional_columns_to_orders_screen( $columns ){
@@ -45,6 +47,13 @@ class Wiaas_Admin_Orders {
echo $column_content;
}
+ public static function add_custom_data_to_order_preview ($order){
+
+ $order['commercial_lead_name'] = Wiaas_Order::get_order_commercial_lead_name( $order['data']['id'] );;
+
+ return $order;
+ }
+
}
diff --git a/backend/app/plugins/wiaas/includes/admin/custom-woocommerce-admin-classes/abstract-class-wc-admin-list-table.php b/backend/app/plugins/wiaas/includes/admin/custom-woocommerce-admin-classes/abstract-class-wc-admin-list-table.php
new file mode 100644
index 0000000..bd2f2a2
--- /dev/null
+++ b/backend/app/plugins/wiaas/includes/admin/custom-woocommerce-admin-classes/abstract-class-wc-admin-list-table.php
@@ -0,0 +1,276 @@
+list_table_type ) {
+ add_action( 'manage_posts_extra_tablenav', array( $this, 'maybe_render_blank_state' ) );
+ add_filter( 'view_mode_post_types', array( $this, 'disable_view_mode' ) );
+ add_action( 'restrict_manage_posts', array( $this, 'restrict_manage_posts' ) );
+ add_filter( 'request', array( $this, 'request_query' ) );
+ add_filter( 'post_row_actions', array( $this, 'row_actions' ), 100, 2 );
+ add_filter( 'default_hidden_columns', array( $this, 'default_hidden_columns' ), 10, 2 );
+ add_filter( 'list_table_primary_column', array( $this, 'list_table_primary_column' ), 10, 2 );
+ add_filter( 'manage_edit-' . $this->list_table_type . '_sortable_columns', array( $this, 'define_sortable_columns' ) );
+ add_filter( 'manage_' . $this->list_table_type . '_posts_columns', array( $this, 'define_columns' ) );
+ add_filter( 'bulk_actions-edit-' . $this->list_table_type, array( $this, 'define_bulk_actions' ) );
+ add_action( 'manage_' . $this->list_table_type . '_posts_custom_column', array( $this, 'render_columns' ), 10, 2 );
+ add_filter( 'handle_bulk_actions-edit-' . $this->list_table_type, array( $this, 'handle_bulk_actions' ), 10, 3 );
+ }
+ }
+
+ /**
+ * Show blank slate.
+ *
+ * @param string $which String which tablenav is being shown.
+ */
+ public function maybe_render_blank_state( $which ) {
+ global $post_type;
+
+ if ( $post_type === $this->list_table_type && 'bottom' === $which ) {
+ $counts = (array) wp_count_posts( $post_type );
+ unset( $counts['auto-draft'] );
+ $count = array_sum( $counts );
+
+ if ( 0 < $count ) {
+ return;
+ }
+
+ $this->render_blank_state();
+
+ echo '';
+ }
+ }
+
+ /**
+ * Render blank state. Extend to add content.
+ */
+ protected function render_blank_state() {}
+
+ /**
+ * Removes this type from list of post types that support "View Mode" switching.
+ * View mode is seen on posts where you can switch between list or excerpt. Our post types don't support
+ * it, so we want to hide the useless UI from the screen options tab.
+ *
+ * @param array $post_types Array of post types supporting view mode.
+ * @return array Array of post types supporting view mode, without this type.
+ */
+ public function disable_view_mode( $post_types ) {
+ unset( $post_types[ $this->list_table_type ] );
+ return $post_types;
+ }
+
+ /**
+ * See if we should render search filters or not.
+ */
+ public function restrict_manage_posts() {
+ global $typenow;
+
+ if ( $this->list_table_type === $typenow ) {
+ $this->render_filters();
+ }
+ }
+
+ /**
+ * Handle any filters.
+ *
+ * @param array $query_vars Query vars.
+ * @return array
+ */
+ public function request_query( $query_vars ) {
+ global $typenow;
+
+ if ( $this->list_table_type === $typenow ) {
+ return $this->query_filters( $query_vars );
+ }
+
+ return $query_vars;
+ }
+
+ /**
+ * Render any custom filters and search inputs for the list table.
+ */
+ protected function render_filters() {}
+
+ /**
+ * Handle any custom filters.
+ *
+ * @param array $query_vars Query vars.
+ * @return array
+ */
+ protected function query_filters( $query_vars ) {
+ return $query_vars;
+ }
+
+ /**
+ * Set row actions.
+ *
+ * @param array $actions Array of actions.
+ * @param WP_Post $post Current post object.
+ * @return array
+ */
+ public function row_actions( $actions, $post ) {
+ if ( $this->list_table_type === $post->post_type ) {
+ return $this->get_row_actions( $actions, $post );
+ }
+ return $actions;
+ }
+
+ /**
+ * Get row actions to show in the list table.
+ *
+ * @param array $actions Array of actions.
+ * @param WP_Post $post Current post object.
+ * @return array
+ */
+ protected function get_row_actions( $actions, $post ) {
+ return $actions;
+ }
+
+ /**
+ * Adjust which columns are displayed by default.
+ *
+ * @param array $hidden Current hidden columns.
+ * @param object $screen Current screen.
+ * @return array
+ */
+ public function default_hidden_columns( $hidden, $screen ) {
+ if ( isset( $screen->id ) && 'edit-' . $this->list_table_type === $screen->id ) {
+ $hidden = array_merge( $hidden, $this->define_hidden_columns() );
+ }
+ return $hidden;
+ }
+
+ /**
+ * Set list table primary column.
+ *
+ * @param string $default Default value.
+ * @param string $screen_id Current screen ID.
+ * @return string
+ */
+ public function list_table_primary_column( $default, $screen_id ) {
+ if ( 'edit-' . $this->list_table_type === $screen_id && $this->get_primary_column() ) {
+ return $this->get_primary_column();
+ }
+ return $default;
+ }
+
+ /**
+ * Define primary column.
+ *
+ * @return array
+ */
+ protected function get_primary_column() {
+ return '';
+ }
+
+ /**
+ * Define hidden columns.
+ *
+ * @return array
+ */
+ protected function define_hidden_columns() {
+ return array();
+ }
+
+ /**
+ * Define which columns are sortable.
+ *
+ * @param array $columns Existing columns.
+ * @return array
+ */
+ public function define_sortable_columns( $columns ) {
+ return $columns;
+ }
+
+ /**
+ * Define which columns to show on this screen.
+ *
+ * @param array $columns Existing columns.
+ * @return array
+ */
+ public function define_columns( $columns ) {
+ return $columns;
+ }
+
+ /**
+ * Define bulk actions.
+ *
+ * @param array $actions Existing actions.
+ * @return array
+ */
+ public function define_bulk_actions( $actions ) {
+ return $actions;
+ }
+
+ /**
+ * Pre-fetch any data for the row each column has access to it.
+ *
+ * @param int $post_id Post ID being shown.
+ */
+ protected function prepare_row_data( $post_id ) {}
+
+ /**
+ * Render individual columns.
+ *
+ * @param string $column Column ID to render.
+ * @param int $post_id Post ID being shown.
+ */
+ public function render_columns( $column, $post_id ) {
+ $this->prepare_row_data( $post_id );
+
+ if ( ! $this->object ) {
+ return;
+ }
+
+ if ( is_callable( array( $this, 'render_' . $column . '_column' ) ) ) {
+ $this->{"render_{$column}_column"}();
+ }
+ }
+
+ /**
+ * Handle bulk actions.
+ *
+ * @param string $redirect_to URL to redirect to.
+ * @param string $action Action name.
+ * @param array $ids List of ids.
+ * @return string
+ */
+ public function handle_bulk_actions( $redirect_to, $action, $ids ) {
+ return esc_url_raw( $redirect_to );
+ }
+}
diff --git a/backend/app/plugins/wiaas/includes/admin/custom-woocommerce-admin-classes/class-wc-admin-list-table-orders.php b/backend/app/plugins/wiaas/includes/admin/custom-woocommerce-admin-classes/class-wc-admin-list-table-orders.php
new file mode 100644
index 0000000..0214261
--- /dev/null
+++ b/backend/app/plugins/wiaas/includes/admin/custom-woocommerce-admin-classes/class-wc-admin-list-table-orders.php
@@ -0,0 +1,866 @@
+';
+ echo '
' . esc_html__( 'When you receive a new order, it will appear here.', 'woocommerce' ) . '
';
+ echo '' . esc_html__( 'Learn more about orders', 'woocommerce' ) . '';
+ echo '';
+ }
+
+ /**
+ * Define primary column.
+ *
+ * @return string
+ */
+ protected function get_primary_column() {
+ return 'order_number';
+ }
+
+ /**
+ * Get row actions to show in the list table.
+ *
+ * @param array $actions Array of actions.
+ * @param WP_Post $post Current post object.
+ * @return array
+ */
+ protected function get_row_actions( $actions, $post ) {
+ return array();
+ }
+
+ /**
+ * Define hidden columns.
+ *
+ * @return array
+ */
+ protected function define_hidden_columns() {
+ return array(
+ 'shipping_address',
+ 'billing_address',
+ 'wc_actions',
+ );
+ }
+
+ /**
+ * Define which columns are sortable.
+ *
+ * @param array $columns Existing columns.
+ * @return array
+ */
+ public function define_sortable_columns( $columns ) {
+ $custom = array(
+ 'order_number' => 'ID',
+ 'order_total' => 'order_total',
+ 'order_date' => 'date',
+ );
+ unset( $columns['comments'] );
+
+ return wp_parse_args( $custom, $columns );
+ }
+
+ /**
+ * Define which columns to show on this screen.
+ *
+ * @param array $columns Existing columns.
+ * @return array
+ */
+ public function define_columns( $columns ) {
+ $show_columns = array();
+ $show_columns['cb'] = $columns['cb'];
+ $show_columns['order_number'] = __( 'Order', 'woocommerce' );
+ $show_columns['order_date'] = __( 'Date', 'woocommerce' );
+ $show_columns['order_status'] = __( 'Status', 'woocommerce' );
+ $show_columns['billing_address'] = __( 'Billing', 'woocommerce' );
+ $show_columns['shipping_address'] = __( 'Ship to', 'woocommerce' );
+ $show_columns['order_total'] = __( 'Total', 'woocommerce' );
+ $show_columns['wc_actions'] = __( 'Actions', 'woocommerce' );
+
+ wp_enqueue_script( 'wc-orders' );
+
+ return $show_columns;
+ }
+
+ /**
+ * Define bulk actions.
+ *
+ * @param array $actions Existing actions.
+ * @return array
+ */
+ public function define_bulk_actions( $actions ) {
+ if ( isset( $actions['edit'] ) ) {
+ unset( $actions['edit'] );
+ }
+
+ $actions['mark_processing'] = __( 'Change status to processing', 'woocommerce' );
+ $actions['mark_on-hold'] = __( 'Change status to on-hold', 'woocommerce' );
+ $actions['mark_completed'] = __( 'Change status to completed', 'woocommerce' );
+ $actions['remove_personal_data'] = __( 'Remove personal data', 'woocommerce' );
+
+ return $actions;
+ }
+
+ /**
+ * Pre-fetch any data for the row each column has access to it. the_order global is there for bw compat.
+ *
+ * @param int $post_id Post ID being shown.
+ */
+ protected function prepare_row_data( $post_id ) {
+ global $the_order;
+
+ if ( empty( $this->object ) || $this->object->get_id() !== $post_id ) {
+ $this->object = wc_get_order( $post_id );
+ $the_order = $this->object;
+ }
+ }
+
+ /**
+ * Render columm: order_number.
+ */
+ protected function render_order_number_column() {
+ $buyer = '';
+
+ if ( $this->object->get_billing_first_name() || $this->object->get_billing_last_name() ) {
+ /* translators: 1: first name 2: last name */
+ $buyer = trim( sprintf( _x( '%1$s %2$s', 'full name', 'woocommerce' ), $this->object->get_billing_first_name(), $this->object->get_billing_last_name() ) );
+ } elseif ( $this->object->get_billing_company() ) {
+ $buyer = trim( $this->object->get_billing_company() );
+ } elseif ( $this->object->get_customer_id() ) {
+ $user = get_user_by( 'id', $this->object->get_customer_id() );
+ $buyer = ucwords( $user->display_name );
+ }
+
+ if ( $this->object->get_status() === 'trash' ) {
+ echo '#' . esc_attr( $this->object->get_order_number() ) . ' ' . esc_html( $buyer ) . '';
+ } else {
+ echo '' . esc_html( __( 'Preview', 'woocommerce' ) ) . '';
+ echo '#' . esc_attr( $this->object->get_order_number() ) . ' ' . esc_html( $buyer ) . '';
+ }
+ }
+
+ /**
+ * Render columm: order_status.
+ */
+ protected function render_order_status_column() {
+ $tooltip = '';
+ $comment_count = get_comment_count( $this->object->get_id() );
+ $approved_comments_count = absint( $comment_count['approved'] );
+
+ if ( $approved_comments_count ) {
+ $latest_notes = wc_get_order_notes(
+ array(
+ 'order_id' => $this->object->get_id(),
+ 'limit' => 1,
+ 'orderby' => 'date_created_gmt',
+ )
+ );
+
+ $latest_note = current( $latest_notes );
+
+ if ( isset( $latest_note->content ) && 1 === $approved_comments_count ) {
+ $tooltip = wc_sanitize_tooltip( $latest_note->content );
+ } elseif ( isset( $latest_note->content ) ) {
+ /* translators: %d: notes count */
+ $tooltip = wc_sanitize_tooltip( $latest_note->content . '
' . sprintf( _n( 'Plus %d other note', 'Plus %d other notes', ( $approved_comments_count - 1 ), 'woocommerce' ), $approved_comments_count - 1 ) . '' );
+ } else {
+ /* translators: %d: notes count */
+ $tooltip = wc_sanitize_tooltip( sprintf( _n( '%d note', '%d notes', $approved_comments_count, 'woocommerce' ), $approved_comments_count ) );
+ }
+ }
+
+ if ( $tooltip ) {
+ printf( '%s', esc_attr( sanitize_html_class( 'status-' . $this->object->get_status() ) ), wp_kses_post( $tooltip ), esc_html( wc_get_order_status_name( $this->object->get_status() ) ) );
+ } else {
+ printf( '%s', esc_attr( sanitize_html_class( 'status-' . $this->object->get_status() ) ), esc_html( wc_get_order_status_name( $this->object->get_status() ) ) );
+ }
+ }
+
+ /**
+ * Render columm: order_date.
+ */
+ protected function render_order_date_column() {
+ $order_timestamp = $this->object->get_date_created()->getTimestamp();
+
+ // Check if the order was created within the last 24 hours, and not in the future.
+ if ( $order_timestamp > strtotime( '-1 day', current_time( 'timestamp', true ) ) && $order_timestamp <= current_time( 'timestamp', true ) ) {
+ $show_date = sprintf(
+ /* translators: %s: human-readable time difference */
+ _x( '%s ago', '%s = human-readable time difference', 'woocommerce' ),
+ human_time_diff( $this->object->get_date_created()->getTimestamp(), current_time( 'timestamp', true ) )
+ );
+ } else {
+ $show_date = $this->object->get_date_created()->date_i18n( apply_filters( 'woocommerce_admin_order_date_format', __( 'M j, Y', 'woocommerce' ) ) );
+ }
+ printf(
+ '',
+ esc_attr( $this->object->get_date_created()->date( 'c' ) ),
+ esc_html( $this->object->get_date_created()->date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) ) ),
+ esc_html( $show_date )
+ );
+ }
+
+ /**
+ * Render columm: order_total.
+ */
+ protected function render_order_total_column() {
+ if ( $this->object->get_payment_method_title() ) {
+ /* translators: %s: method */
+ echo '' . wp_kses_post( $this->object->get_formatted_order_total() ) . '';
+ } else {
+ echo wp_kses_post( $this->object->get_formatted_order_total() );
+ }
+ }
+
+ /**
+ * Render columm: wc_actions.
+ */
+ protected function render_wc_actions_column() {
+ echo '';
+
+ do_action( 'woocommerce_admin_order_actions_start', $this->object );
+
+ $actions = array();
+
+ if ( $this->object->has_status( array( 'pending', 'on-hold' ) ) ) {
+ $actions['processing'] = array(
+ 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=processing&order_id=' . $this->object->get_id() ), 'woocommerce-mark-order-status' ),
+ 'name' => __( 'Processing', 'woocommerce' ),
+ 'action' => 'processing',
+ );
+ }
+
+ if ( $this->object->has_status( array( 'pending', 'on-hold', 'processing' ) ) ) {
+ $actions['complete'] = array(
+ 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=completed&order_id=' . $this->object->get_id() ), 'woocommerce-mark-order-status' ),
+ 'name' => __( 'Complete', 'woocommerce' ),
+ 'action' => 'complete',
+ );
+ }
+
+ $actions = apply_filters( 'woocommerce_admin_order_actions', $actions, $this->object );
+
+ echo wc_render_action_buttons( $actions ); // WPCS: XSS ok.
+
+ do_action( 'woocommerce_admin_order_actions_end', $this->object );
+
+ echo '
';
+ }
+
+ /**
+ * Render columm: billing_address.
+ */
+ protected function render_billing_address_column() {
+ $address = $this->object->get_formatted_billing_address();
+
+ if ( $address ) {
+ echo esc_html( preg_replace( '#
#i', ', ', $address ) );
+
+ if ( $this->object->get_payment_method() ) {
+ /* translators: %s: payment method */
+ echo '' . sprintf( __( 'via %s', 'woocommerce' ), esc_html( $this->object->get_payment_method_title() ) ) . ''; // WPCS: XSS ok.
+ }
+ } else {
+ echo '–';
+ }
+ }
+
+ /**
+ * Render columm: shipping_address.
+ */
+ protected function render_shipping_address_column() {
+ $address = $this->object->get_formatted_shipping_address();
+
+ if ( $address ) {
+ echo '' . esc_html( preg_replace( '#
#i', ', ', $address ) ) . '';
+ if ( $this->object->get_shipping_method() ) {
+ /* translators: %s: shipping method */
+ echo '' . sprintf( __( 'via %s', 'woocommerce' ), esc_html( $this->object->get_shipping_method() ) ) . ''; // WPCS: XSS ok.
+ }
+ } else {
+ echo '–';
+ }
+ }
+
+ /**
+ * Template for order preview.
+ *
+ * @since 3.3.0
+ */
+ public function order_preview_template() {
+ ?>
+
+ get_items(), $order );
+ $columns = apply_filters(
+ 'woocommerce_admin_order_preview_line_item_columns', array(
+ 'product' => __( 'Product', 'woocommerce' ),
+ 'quantity' => __( 'Quantity', 'woocommerce' ),
+ 'tax' => __( 'Tax', 'woocommerce' ),
+ 'total' => __( 'Total', 'woocommerce' ),
+ ), $order
+ );
+
+ if ( ! wc_tax_enabled() ) {
+ unset( $columns['tax'] );
+ }
+
+ $html = '
+
+
+
+ ';
+
+ foreach ( $columns as $column => $label ) {
+ $html .= '| ' . esc_html( $label ) . ' | ';
+ }
+
+ $html .= '
+
+
+ ';
+
+ foreach ( $line_items as $item_id => $item ) {
+
+ $product_object = is_callable( array( $item, 'get_product' ) ) ? $item->get_product() : null;
+ $row_class = apply_filters( 'woocommerce_admin_html_order_preview_item_class', '', $item, $order );
+
+ $html .= '';
+
+ foreach ( $columns as $column => $label ) {
+ $html .= '| ';
+ switch ( $column ) {
+ case 'product':
+ $html .= wp_kses_post( $item->get_name() );
+
+ if ( $product_object ) {
+ $html .= ' ' . esc_html( $product_object->get_sku() ) . ' ';
+ }
+
+ $meta_data = $item->get_formatted_meta_data( '' );
+
+ if ( $meta_data ) {
+ $html .= '';
+ }
+ break;
+ case 'quantity':
+ $html .= esc_html( $item->get_quantity() );
+ break;
+ case 'tax':
+ $html .= wc_price( $item->get_total_tax(), array( 'currency' => $order->get_currency() ) );
+ break;
+ case 'total':
+ $html .= wc_price( $item->get_total(), array( 'currency' => $order->get_currency() ) );
+ break;
+ default:
+ $html .= apply_filters( 'woocommerce_admin_order_preview_line_item_column_' . sanitize_key( $column ), '', $item, $item_id, $order );
+ break;
+ }
+ $html .= ' | ';
+ }
+
+ $html .= '
';
+ }
+
+ $html .= '
+
+
+
';
+
+ return $html;
+ }
+
+ /**
+ * Get actions to display in the preview as HTML.
+ *
+ * @param WC_Order $order Order object.
+ * @return string
+ */
+ public static function get_order_preview_actions_html( $order ) {
+ $actions = array();
+ $status_actions = array();
+
+ if ( $order->has_status( array( 'pending' ) ) ) {
+ $status_actions['on-hold'] = array(
+ 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=on-hold&order_id=' . $order->get_id() ), 'woocommerce-mark-order-status' ),
+ 'name' => __( 'On-hold', 'woocommerce' ),
+ 'title' => __( 'Change order status to on-hold', 'woocommerce' ),
+ 'action' => 'on-hold',
+ );
+ }
+
+ if ( $order->has_status( array( 'pending', 'on-hold' ) ) ) {
+ $status_actions['processing'] = array(
+ 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=processing&order_id=' . $order->get_id() ), 'woocommerce-mark-order-status' ),
+ 'name' => __( 'Processing', 'woocommerce' ),
+ 'title' => __( 'Change order status to processing', 'woocommerce' ),
+ 'action' => 'processing',
+ );
+ }
+
+ if ( $order->has_status( array( 'pending', 'on-hold', 'processing' ) ) ) {
+ $status_actions['complete'] = array(
+ 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=completed&order_id=' . $order->get_id() ), 'woocommerce-mark-order-status' ),
+ 'name' => __( 'Completed', 'woocommerce' ),
+ 'title' => __( 'Change order status to completed', 'woocommerce' ),
+ 'action' => 'complete',
+ );
+ }
+
+ if ( $status_actions ) {
+ $actions['status'] = array(
+ 'group' => __( 'Change status: ', 'woocommerce' ),
+ 'actions' => $status_actions,
+ );
+ }
+
+ return wc_render_action_buttons( apply_filters( 'woocommerce_admin_order_preview_actions', $actions, $order ) );
+ }
+
+ /**
+ * Get order details to send to the ajax endpoint for previews.
+ *
+ * @param WC_Order $order Order object.
+ * @return array
+ */
+ public static function order_preview_get_order_details( $order ) {
+ if ( ! $order ) {
+ return array();
+ }
+
+ $payment_via = $order->get_payment_method_title();
+ $payment_method = $order->get_payment_method();
+ $payment_gateways = WC()->payment_gateways() ? WC()->payment_gateways->payment_gateways() : array();
+ $transaction_id = $order->get_transaction_id();
+
+ if ( $transaction_id ) {
+
+ $url = isset( $payment_gateways[ $payment_method ] ) ? $payment_gateways[ $payment_method ]->get_transaction_url( $order ) : false;
+
+ if ( $url ) {
+ $payment_via .= ' (' . esc_html( $transaction_id ) . ')';
+ } else {
+ $payment_via .= ' (' . esc_html( $transaction_id ) . ')';
+ }
+ }
+
+ $billing_address = $order->get_formatted_billing_address();
+ $shipping_address = $order->get_formatted_shipping_address();
+
+ return apply_filters(
+ 'woocommerce_admin_order_preview_get_order_details', array(
+ 'data' => $order->get_data(),
+ 'order_number' => $order->get_order_number(),
+ 'item_html' => WC_Admin_List_Table_Orders::get_order_preview_item_html( $order ),
+ 'actions_html' => WC_Admin_List_Table_Orders::get_order_preview_actions_html( $order ),
+ 'ship_to_billing' => wc_ship_to_billing_address_only(),
+ 'needs_shipping' => $order->needs_shipping_address(),
+ 'formatted_billing_address' => $billing_address ? $billing_address : __( 'N/A', 'woocommerce' ),
+ 'formatted_shipping_address' => $shipping_address ? $shipping_address : __( 'N/A', 'woocommerce' ),
+ 'shipping_address_map_url' => $order->get_shipping_address_map_url(),
+ 'payment_via' => $payment_via,
+ 'shipping_via' => $order->get_shipping_method(),
+ 'status' => $order->get_status(),
+ 'status_name' => wc_get_order_status_name( $order->get_status() ),
+ ), $order
+ );
+ }
+
+ /**
+ * Handle bulk actions.
+ *
+ * @param string $redirect_to URL to redirect to.
+ * @param string $action Action name.
+ * @param array $ids List of ids.
+ * @return string
+ */
+ public function handle_bulk_actions( $redirect_to, $action, $ids ) {
+ $ids = array_map( 'absint', $ids );
+ $changed = 0;
+
+ if ( 'remove_personal_data' === $action ) {
+ $report_action = 'removed_personal_data';
+
+ foreach ( $ids as $id ) {
+ $order = wc_get_order( $id );
+
+ if ( $order ) {
+ do_action( 'woocommerce_remove_order_personal_data', $order );
+ $changed++;
+ }
+ }
+ } elseif ( false !== strpos( $action, 'mark_' ) ) {
+ $order_statuses = wc_get_order_statuses();
+ $new_status = substr( $action, 5 ); // Get the status name from action.
+ $report_action = 'marked_' . $new_status;
+
+ // Sanity check: bail out if this is actually not a status, or is not a registered status.
+ if ( isset( $order_statuses[ 'wc-' . $new_status ] ) ) {
+ // Initialize payment gateways in case order has hooked status transition actions.
+ wc()->payment_gateways();
+
+ foreach ( $ids as $id ) {
+ $order = wc_get_order( $id );
+ $order->update_status( $new_status, __( 'Order status changed by bulk edit:', 'woocommerce' ), true );
+ do_action( 'woocommerce_order_edit_status', $id, $new_status );
+ $changed++;
+ }
+ }
+ }
+
+ if ( $changed ) {
+ $redirect_to = add_query_arg(
+ array(
+ 'post_type' => $this->list_table_type,
+ 'bulk_action' => $report_action,
+ 'changed' => $changed,
+ 'ids' => join( ',', $ids ),
+ ), $redirect_to
+ );
+ }
+
+ return esc_url_raw( $redirect_to );
+ }
+
+ /**
+ * Show confirmation message that order status changed for number of orders.
+ */
+ public function bulk_admin_notices() {
+ global $post_type, $pagenow;
+
+ // Bail out if not on shop order list page.
+ if ( 'edit.php' !== $pagenow || 'shop_order' !== $post_type || ! isset( $_REQUEST['bulk_action'] ) ) { // WPCS: input var ok, CSRF ok.
+ return;
+ }
+
+ $order_statuses = wc_get_order_statuses();
+ $number = isset( $_REQUEST['changed'] ) ? absint( $_REQUEST['changed'] ) : 0; // WPCS: input var ok, CSRF ok.
+ $bulk_action = wc_clean( wp_unslash( $_REQUEST['bulk_action'] ) ); // WPCS: input var ok, CSRF ok.
+
+ // Check if any status changes happened.
+ foreach ( $order_statuses as $slug => $name ) {
+ if ( 'marked_' . str_replace( 'wc-', '', $slug ) === $bulk_action ) { // WPCS: input var ok, CSRF ok.
+ /* translators: %d: orders count */
+ $message = sprintf( _n( '%d order status changed.', '%d order statuses changed.', $number, 'woocommerce' ), number_format_i18n( $number ) );
+ echo '' . esc_html( $message ) . '
';
+ break;
+ }
+ }
+
+ if ( 'removed_personal_data' === $bulk_action ) { // WPCS: input var ok, CSRF ok.
+ /* translators: %d: orders count */
+ $message = sprintf( _n( 'Removed personal data from %d order.', 'Removed personal data from %d orders.', $number, 'woocommerce' ), number_format_i18n( $number ) );
+ echo '' . esc_html( $message ) . '
';
+ }
+ }
+
+ /**
+ * See if we should render search filters or not.
+ */
+ public function restrict_manage_posts() {
+ global $typenow;
+
+ if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ), true ) ) {
+ $this->render_filters();
+ }
+ }
+
+ /**
+ * Render any custom filters and search inputs for the list table.
+ */
+ protected function render_filters() {
+ $user_string = '';
+ $user_id = '';
+
+ if ( ! empty( $_GET['_customer_user'] ) ) { // WPCS: input var ok.
+ $user_id = absint( $_GET['_customer_user'] ); // WPCS: input var ok, sanitization ok.
+ $user = get_user_by( 'id', $user_id );
+
+ $user_string = sprintf(
+ /* translators: 1: user display name 2: user ID 3: user email */
+ esc_html__( '%1$s (#%2$s – %3$s)', 'woocommerce' ),
+ $user->display_name,
+ absint( $user->ID ),
+ $user->user_email
+ );
+ }
+ ?>
+
+ query_filters( $query_vars );
+ }
+
+ return $query_vars;
+ }
+
+ /**
+ * Handle any custom filters.
+ *
+ * @param array $query_vars Query vars.
+ * @return array
+ */
+ protected function query_filters( $query_vars ) {
+ global $wp_post_statuses;
+
+ // Filter the orders by the posted customer.
+ if ( ! empty( $_GET['_customer_user'] ) ) { // WPCS: input var ok.
+ // @codingStandardsIgnoreStart
+ $query_vars['meta_query'] = array(
+ array(
+ 'key' => '_customer_user',
+ 'value' => (int) $_GET['_customer_user'], // WPCS: input var ok, sanitization ok.
+ 'compare' => '=',
+ ),
+ );
+ // @codingStandardsIgnoreEnd
+ }
+
+ // Sorting.
+ if ( isset( $query_vars['orderby'] ) ) {
+ if ( 'order_total' === $query_vars['orderby'] ) {
+ // @codingStandardsIgnoreStart
+ $query_vars = array_merge( $query_vars, array(
+ 'meta_key' => '_order_total',
+ 'orderby' => 'meta_value_num',
+ ) );
+ // @codingStandardsIgnoreEnd
+ }
+ }
+
+ // Status.
+ if ( ! isset( $query_vars['post_status'] ) ) {
+ $post_statuses = wc_get_order_statuses();
+
+ foreach ( $post_statuses as $status => $value ) {
+ if ( isset( $wp_post_statuses[ $status ] ) && false === $wp_post_statuses[ $status ]->show_in_admin_all_list ) {
+ unset( $post_statuses[ $status ] );
+ }
+ }
+
+ $query_vars['post_status'] = array_keys( $post_statuses );
+ }
+ return $query_vars;
+ }
+
+ /**
+ * Change the label when searching orders.
+ *
+ * @param mixed $query Current search query.
+ * @return string
+ */
+ public function search_label( $query ) {
+ global $pagenow, $typenow;
+
+ if ( 'edit.php' !== $pagenow || 'shop_order' !== $typenow || ! get_query_var( 'shop_order_search' ) || ! isset( $_GET['s'] ) ) { // WPCS: input var ok.
+ return $query;
+ }
+
+ return wc_clean( wp_unslash( $_GET['s'] ) ); // WPCS: input var ok, sanitization ok.
+ }
+
+ /**
+ * Query vars for custom searches.
+ *
+ * @param mixed $public_query_vars Array of query vars.
+ * @return array
+ */
+ public function add_custom_query_var( $public_query_vars ) {
+ $public_query_vars[] = 'shop_order_search';
+ return $public_query_vars;
+ }
+
+ /**
+ * Search custom fields as well as content.
+ *
+ * @param WP_Query $wp Query object.
+ */
+ public function search_custom_fields( $wp ) {
+ global $pagenow;
+
+ if ( 'edit.php' !== $pagenow || empty( $wp->query_vars['s'] ) || 'shop_order' !== $wp->query_vars['post_type'] || ! isset( $_GET['s'] ) ) { // WPCS: input var ok.
+ return;
+ }
+
+ $post_ids = wc_order_search( wc_clean( wp_unslash( $_GET['s'] ) ) ); // WPCS: input var ok, sanitization ok.
+
+ if ( ! empty( $post_ids ) ) {
+ // Remove "s" - we don't want to search order name.
+ unset( $wp->query_vars['s'] );
+
+ // so we know we're doing this.
+ $wp->query_vars['shop_order_search'] = true;
+
+ // Search by found posts.
+ $wp->query_vars['post__in'] = array_merge( $post_ids, array( 0 ) );
+ }
+ }
+}
diff --git a/backend/app/plugins/wiaas/wiaas.php b/backend/app/plugins/wiaas/wiaas.php
index 582e624..67b74ca 100644
--- a/backend/app/plugins/wiaas/wiaas.php
+++ b/backend/app/plugins/wiaas/wiaas.php
@@ -61,6 +61,8 @@ include_once WIAAS_DIR . '/includes/wiaas-class-measurement-units.php';
include_once WIAAS_DIR . '/includes/class-wiaas-validation.php';
+include_once WIAAS_DIR . '/includes/admin/custom-woocommerce-admin-classes/class-wc-admin-list-table-orders.php';
+
function wiaas_redirect_to_login() {
wp_safe_redirect(get_site_url('', 'wp-login.php'));
}