![]() 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 /** * Monitors a new order and attempts to create sub-orders * * If an order contains products from multiple vendor, we can't show the order * to each seller dashboard. That's why we need to divide the main order to * some sub-orders based on the number of sellers. * * @param int $parent_order_id * * @deprecated 3.8.0 * * @return void */ function dokan_create_sub_order( $parent_order_id ) { wc_deprecated_function( 'dokan_create_sub_order', '3.7.13', 'dokan()->order->create_sub_order()' ); } /** * Creates a sub order * * @param int $parent_order * @param int $seller_id * @param array $seller_products * * @deprecated 3.8.0 * * @return void */ function dokan_create_seller_order( $parent_order, $seller_id, $seller_products ) { wc_deprecated_function( 'dokan_create_sub_order', '3.7.13', 'dokan()->order->create_sub_order()' ); } /** * Create coupons for a sub-order if neccessary * * @param WC_Order $parent_order * @param int $order_id * @param array $product_ids * * @return void */ function dokan_create_sub_order_coupon( $parent_order, $order_id, $product_ids ) { $used_coupons = $parent_order->get_used_coupons(); if ( ! count( $used_coupons ) ) { return; } if ( $used_coupons ) { foreach ( $used_coupons as $coupon_code ) { $coupon = new WC_Coupon( $coupon_code ); if ( $coupon && ! is_wp_error( $coupon ) && array_intersect( $product_ids, $coupon->product_ids ) ) { // we found some match $item_id = wc_add_order_item( $order_id, [ 'order_item_name' => $coupon_code, 'order_item_type' => 'coupon', ] ); // Add line item meta if ( $item_id ) { wc_add_order_item_meta( $item_id, 'discount_amount', isset( WC()->cart->coupon_discount_amounts[ $coupon_code ] ) ? WC()->cart->coupon_discount_amounts[ $coupon_code ] : 0 ); } } } } } /** * Create shipping for a sub-order if neccessary * * @param WC_Order $parent_order * @param int $order_id * @param array $seller_products * * @throws Exception * * @return mixed */ function dokan_create_sub_order_shipping( $parent_order, $order_id, $seller_products ) { // Get all shipping methods for parent order $shipping_methods = $parent_order->get_shipping_methods(); $order_seller_id = dokan_get_seller_id_by_order( $order_id ); $applied_shipping_method = []; if ( $shipping_methods ) { foreach ( $shipping_methods as $key => $value ) { $product_id = $value['_product_ids']; $product_author = get_post_field( 'post_author', $product_id ); $applied_shipping_method[ $product_author ] = $value; } } $shipping_method = $applied_shipping_method[ $order_seller_id ]; $shipping_method = apply_filters( 'dokan_shipping_method', $shipping_method, $order_id, $parent_order ); // bail out if no shipping methods found if ( ! $shipping_method ) { return; } $shipping_products = []; $packages = []; // emulate shopping cart for calculating the shipping method foreach ( $seller_products as $product_item ) { $product = wc_get_product( $product_item['product_id'] ); if ( $product->needs_shipping() ) { $shipping_products[] = [ 'product_id' => $product_item['product_id'], 'variation_id' => $product_item['variation_id'], 'variation' => '', 'quantity' => $product_item['qty'], 'data' => $product, 'line_total' => $product_item['line_total'], 'line_tax' => $product_item['line_tax'], 'line_subtotal' => $product_item['line_subtotal'], 'line_subtotal_tax' => $product_item['line_subtotal_tax'], ]; } } if ( $shipping_products ) { $package = [ 'contents' => $shipping_products, 'contents_cost' => array_sum( wp_list_pluck( $shipping_products, 'line_total' ) ), 'applied_coupons' => [], 'seller_id' => $order_seller_id, 'destination' => [ 'country' => dokan_get_prop( $parent_order, 'shipping_country' ), 'state' => dokan_get_prop( $parent_order, 'shipping_state' ), 'postcode' => dokan_get_prop( $parent_order, 'shipping_postcode' ), 'city' => dokan_get_prop( $parent_order, 'shipping_city' ), 'address' => dokan_get_prop( $parent_order, 'shipping_address_1' ), 'address_2' => dokan_get_prop( $parent_order, 'shipping_address_2' ), ], ]; $wc_shipping = WC_Shipping::instance(); $pack = $wc_shipping->calculate_shipping_for_package( $package ); if ( array_key_exists( $shipping_method['method_id'], $pack['rates'] ) ) { $method = $pack['rates'][ $shipping_method['method_id'] ]; $cost = wc_format_decimal( $method->cost ); // we assumed that the key will be always 1, if different conditinos appear in future, we'll update the script $tax = wc_format_decimal( $method->taxes[1] ); $item_id = wc_add_order_item( $order_id, [ 'order_item_name' => $method->label, 'order_item_type' => 'shipping', ] ); if ( $item_id ) { wc_add_order_item_meta( $item_id, 'method_id', $method->id ); wc_add_order_item_meta( $item_id, 'cost', $cost ); } return [ 'cost' => $cost, 'tax' => $tax, ]; } } return 0; }