![]() Server : Apache/2.4.52 (Ubuntu) System : Linux webserver 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov 6 17:42:15 UTC 2 x86_64 User : www-data ( 33) PHP Version : 8.1.2-1ubuntu2.21 Disable Function : NONE Directory : /var/www/theprintave/wp-content/plugins/dokan-lite/includes/ |
<?php use WeDevs\Dokan\Cache; if ( ! function_exists( 'dokan_get_order_report_data' ) ) : /** * Generate SQL query and fetch the report data based on the arguments passed * * This function was cloned from WC_Admin_Report class. * * @since 1.0 * * @global WPDB $wpdb * @global WP_User $current_user * @param array $args * @param string $start_date * @param string $end_date * @return obj */ function dokan_get_order_report_data( $args, $start_date, $end_date ) { global $wpdb; $current_user = dokan_get_current_user_id(); $defaults = array( 'data' => array(), 'where' => array(), 'where_meta' => array(), 'query_type' => 'get_row', 'group_by' => '', 'order_by' => '', 'limit' => '', 'filter_range' => false, 'nocache' => false, 'debug' => false, ); $args = wp_parse_args( $args, $defaults ); extract( $args ); if ( empty( $data ) ) { return false; } $select = array(); foreach ( $data as $key => $value ) { $distinct = ''; if ( isset( $value['distinct'] ) ) { $distinct = 'DISTINCT'; } if ( $value['type'] == 'meta' ) { $get_key = "meta_{$key}.meta_value"; } elseif ( $value['type'] == 'post_data' ) { $get_key = "posts.{$key}"; } elseif ( $value['type'] == 'order_item_meta' ) { $get_key = "order_item_meta_{$key}.meta_value"; } elseif ( $value['type'] == 'order_item' ) { $get_key = "order_items.{$key}"; } elseif ( $value['type'] == 'dokan_orders' ) { $get_key = "do.{$key}"; } if ( $value['function'] ) { $get = "{$value['function']}({$distinct} {$get_key})"; } else { $get = "{$distinct} {$get_key}"; } $select[] = "{$get} as {$value['name']}"; } $query['select'] = 'SELECT ' . implode( ',', $select ); $query['from'] = "FROM {$wpdb->posts} AS posts"; // Joins $joins = array(); $joins['do'] = "LEFT JOIN {$wpdb->prefix}dokan_orders AS do ON posts.ID = do.order_id"; foreach ( $data as $key => $value ) { if ( $value['type'] == 'meta' ) { $joins[ "meta_{$key}" ] = "LEFT JOIN {$wpdb->postmeta} AS meta_{$key} ON posts.ID = meta_{$key}.post_id"; } elseif ( $value['type'] == 'order_item_meta' ) { $joins['order_items'] = "LEFT JOIN {$wpdb->prefix}woocommerce_order_items AS order_items ON posts.ID = order_items.order_id"; $joins[ "order_item_meta_{$key}" ] = "LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS order_item_meta_{$key} ON order_items.order_item_id = order_item_meta_{$key}.order_item_id"; } elseif ( $value['type'] == 'order_item' ) { $joins['order_items'] = "LEFT JOIN {$wpdb->prefix}woocommerce_order_items AS order_items ON posts.ID = order_items.order_id"; } } if ( ! empty( $where_meta ) ) { foreach ( $where_meta as $value ) { if ( ! is_array( $value ) ) { continue; } $key = is_array( $value['meta_key'] ) ? $value['meta_key'][0] : $value['meta_key']; if ( isset( $value['type'] ) && $value['type'] == 'order_item_meta' ) { $joins['order_items'] = "LEFT JOIN {$wpdb->prefix}woocommerce_order_items AS order_items ON posts.ID = order_items.order_id"; $joins[ "order_item_meta_{$key}" ] = "LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS order_item_meta_{$key} ON order_items.order_item_id = order_item_meta_{$key}.order_item_id"; } else { // If we have a where clause for meta, join the postmeta table $joins[ "meta_{$key}" ] = "LEFT JOIN {$wpdb->postmeta} AS meta_{$key} ON posts.ID = meta_{$key}.post_id"; } } } $query['join'] = implode( ' ', $joins ); $query['where'] = " WHERE posts.post_type = 'shop_order' AND posts.post_status != 'trash' AND do.seller_id = {$current_user} AND do.order_status IN ('" . implode( "','", esc_sql( apply_filters( 'woocommerce_reports_order_statuses', array( 'wc-completed', 'wc-processing', 'wc-on-hold' ) ) ) ) . "') "; if ( $filter_range && ! empty( $start_date ) && ! empty( $end_date ) ) { $query['where'] .= " AND DATE(post_date) >= '" . $start_date . "' AND DATE(post_date) <= '" . $end_date . "' "; } foreach ( $data as $key => $value ) { if ( $value['type'] == 'meta' ) { $query['where'] .= " AND meta_{$key}.meta_key = '{$key}'"; } elseif ( $value['type'] == 'order_item_meta' ) { $query['where'] .= " AND order_items.order_item_type = '{$value['order_item_type']}'"; $query['where'] .= " AND order_item_meta_{$key}.meta_key = '{$key}'"; } } if ( ! empty( $where_meta ) ) { $relation = isset( $where_meta['relation'] ) ? $where_meta['relation'] : 'AND'; $query['where'] .= ' AND ('; foreach ( $where_meta as $index => $value ) { if ( ! is_array( $value ) ) { continue; } $key = is_array( $value['meta_key'] ) ? $value['meta_key'][0] : $value['meta_key']; if ( strtolower( $value['operator'] ) == 'in' ) { if ( is_array( $value['meta_value'] ) ) { $value['meta_value'] = implode( "','", $value['meta_value'] ); } if ( ! empty( $value['meta_value'] ) ) { $where_value = "IN ('{$value['meta_value']}')"; } } else { $where_value = "{$value['operator']} '{$value['meta_value']}'"; } if ( ! empty( $where_value ) ) { if ( $index > 0 ) { $query['where'] .= ' ' . $relation; } if ( isset( $value['type'] ) && $value['type'] == 'order_item_meta' ) { if ( is_array( $value['meta_key'] ) ) { $query['where'] .= " ( order_item_meta_{$key}.meta_key IN ('" . implode( "','", $value['meta_key'] ) . "')"; } else { $query['where'] .= " ( order_item_meta_{$key}.meta_key = '{$value['meta_key']}'"; } $query['where'] .= " AND order_item_meta_{$key}.meta_value {$where_value} )"; } else { if ( is_array( $value['meta_key'] ) ) { $query['where'] .= " ( meta_{$key}.meta_key IN ('" . implode( "','", $value['meta_key'] ) . "')"; } else { $query['where'] .= " ( meta_{$key}.meta_key = '{$value['meta_key']}'"; } $query['where'] .= " AND meta_{$key}.meta_value {$where_value} )"; } } } $query['where'] .= ')'; } if ( ! empty( $where ) ) { foreach ( $where as $value ) { if ( strtolower( $value['operator'] ) == 'in' ) { if ( is_array( $value['value'] ) ) { $value['value'] = implode( "','", $value['value'] ); } if ( ! empty( $value['value'] ) ) { $where_value = "IN ('{$value['value']}')"; } } else { $where_value = "{$value['operator']} '{$value['value']}'"; } if ( ! empty( $where_value ) ) { $query['where'] .= " AND {$value['key']} {$where_value}"; } } } if ( $group_by ) { $query['group_by'] = "GROUP BY {$group_by}"; } if ( $order_by ) { $query['order_by'] = "ORDER BY {$order_by}"; } if ( $limit ) { $query['limit'] = "LIMIT {$limit}"; } $query = apply_filters( 'dokan_reports_get_order_report_query', $query ); $query = implode( ' ', $query ); $query_hash = md5( $query_type . $query ); if ( $debug ) { error_log( sprintf( '<pre>%s</pre>', print_r( $query, true ) ) ); } $cache_group = "report_data_seller_{$current_user}"; $cache_key = 'wc_report_' . $query_hash; $result = Cache::get_transient( $cache_key, $cache_group ); if ( $debug || $nocache || ( false === $result ) ) { $result = apply_filters( 'dokan_reports_get_order_report_data', $wpdb->$query_type( $query ), $data ); if ( $filter_range ) { if ( $end_date == date( 'Y-m-d', current_time( 'timestamp' ) ) ) { $expiration = 60 * 60 * 1; // 1 hour } else { $expiration = 60 * 60 * 24; // 24 hour } } else { $expiration = 60 * 60 * 24; // 24 hour } Cache::set_transient( $cache_key, $result, $cache_group, $expiration ); } return $result; } endif; if ( ! function_exists( 'dokan_dashboard_sales_overview' ) ) : /** * Generate seller dashboard overview chart * * @since 1.0 * @return void */ function dokan_dashboard_sales_overview() { $now = dokan_current_datetime(); $start_date = $now->modify( 'first day of this month' )->modify( 'today' )->format( 'Y-m-d' ); $end_date = $now->modify( 'today' )->format( 'Y-m-d' ); dokan_sales_overview_chart_data( $start_date, $end_date, 'day' ); } endif; if ( ! function_exists( 'dokan_sales_overview_chart_data' ) ) : /** * Prepares chart data for sales overview * * @since 1.0 * * @param string $start_date * @param string $end_date * @param string $group_by * * @return void */ function dokan_sales_overview_chart_data( $start_date, $end_date, $group_by ) { global $wp_locale; $now = dokan_current_datetime(); $start_date_to_time = $now->modify( $start_date )->getTimestamp(); $end_date_to_time = $now->modify( $end_date )->getTimestamp(); $chart_interval = dokan_get_interval_between_dates( $start_date_to_time, $end_date_to_time, $group_by ); if ( $group_by === 'day' ) { $group_by_query = 'YEAR(post_date), MONTH(post_date), DAY(post_date)'; $barwidth = 60 * 60 * 24 * 1000; } else { $group_by_query = 'YEAR(post_date), MONTH(post_date)'; $barwidth = 60 * 60 * 24 * 7 * 4 * 1000; } // Get orders and dates in range - we want the SUM of order totals, COUNT of order items, COUNT of orders, and the date $orders = dokan_get_order_report_data( array( 'data' => array( '_order_total' => array( 'type' => 'meta', 'function' => 'SUM', 'name' => 'total_sales', ), 'ID' => array( 'type' => 'post_data', 'function' => 'COUNT', 'name' => 'total_orders', 'distinct' => true, ), 'post_date' => array( 'type' => 'post_data', 'function' => '', 'name' => 'post_date', ), ), 'group_by' => $group_by_query, 'order_by' => 'post_date ASC', 'query_type' => 'get_results', 'filter_range' => true, 'debug' => false, ), $start_date, $end_date ); // Prepare data for report $order_counts = dokan_prepare_chart_data( $orders, 'post_date', 'total_orders', $chart_interval, $start_date_to_time, $group_by ); $order_amounts = dokan_prepare_chart_data( $orders, 'post_date', 'total_sales', $chart_interval, $start_date_to_time, $group_by ); // Encode in json format $chart_data = array( 'order_counts' => array_values( $order_counts ), 'order_amounts' => array_values( $order_amounts ), ); $chart_colours = array( 'order_counts' => '#3498db', 'order_amounts' => '#1abc9c', ); ?> <div class="chart-container"> <div class="chart-placeholder main" style="width: 100%; height: 350px;"></div> </div> <script type="text/javascript"> jQuery(function($) { var order_data = JSON.parse( '<?php echo wp_json_encode( $chart_data ); ?>' ); var isRtl = '<?php echo is_rtl() ? '1' : '0'; ?>'; var series = [ { label: "<?php echo esc_js( __( 'Sales total', 'dokan-lite' ) ); ?>", data: order_data.order_amounts, shadowSize: 0, hoverable: true, points: { show: true, radius: 5, lineWidth: 1, fillColor: '#fff', fill: true }, lines: { show: true, lineWidth: 2, fill: false }, shadowSize: 0, prepend_tooltip: "<?php echo esc_attr( get_woocommerce_currency_symbol() ); ?>" }, { label: "<?php echo esc_js( __( 'Number of orders', 'dokan-lite' ) ); ?>", data: order_data.order_counts, shadowSize: 0, hoverable: true, points: { show: true, radius: 5, lineWidth: 2, fillColor: '#fff', fill: true }, lines: { show: true, lineWidth: 3, fill: false }, shadowSize: 0, append_tooltip: " <?php echo esc_html__( 'Sales', 'dokan-lite' ); ?>" }, ]; var main_chart = jQuery.plot( jQuery('.chart-placeholder.main'), series, { legend: { show: true, position: 'nw' }, series: { lines: { show: true, lineWidth: 4, fill: false }, points: { show: true } }, grid: { borderColor: '#eee', color: '#aaa', borderWidth: 1, hoverable: true, show: true, aboveData: false, }, xaxis: { color: '#aaa', position: "bottom", tickColor: 'transparent', mode: "time", timeformat: "<?php if ( $group_by == 'day' ) echo '%d %b'; else echo '%b'; ?>", monthNames: <?php echo json_encode( array_values( $wp_locale->month_abbrev ) ); ?>, tickLength: 1, minTickSize: [1, "<?php echo esc_attr( $group_by ); ?>"], font: { color: "#aaa" }, transform: function (v) { return ( isRtl == '1' ) ? -v : v; }, inverseTransform: function (v) { return ( isRtl == '1' ) ? -v : v; } }, yaxes: [ { position: ( isRtl == '1' ) ? "right" : "left", min: 0, minTickSize: 1, tickDecimals: 0, color: '#d4d9dc', font: { color: "#aaa" } }, { position: ( isRtl == '1' ) ? "right" : "left", min: 0, tickDecimals: 2, alignTicksWithAxis: 1, color: 'transparent', font: { color: "#aaa" } } ], colors: ["<?php echo esc_attr( $chart_colours['order_counts'] ); ?>", "<?php echo esc_attr( $chart_colours['order_amounts'] ); ?>"] } ); jQuery('.chart-placeholder').resize(); }); </script> <?php } endif;