Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
7.3 kB
3
Indexable
function b2bking_get_min_tiered_price($product){

	if (!is_a($product,'WC_Product_Variation') && !is_a($product,'WC_Product')){
		$product = wc_get_product($product);
	}

	$price = wc_price($product->get_price());

	$priceoriginal = $price;
	if (!is_a($product,'WC_Product_Variation') && !is_a($product,'WC_Product')){
		return $price;
	}
	
	$user_id = get_current_user_id();
	$account_type = get_user_meta($user_id,'b2bking_account_type', true);
	if ($account_type === 'subaccount'){
		// for all intents and purposes set current user as the subaccount parent
		$parent_user_id = get_user_meta($user_id, 'b2bking_account_parent', true);
		$user_id = $parent_user_id;
	}

	$currentusergroupidnr = apply_filters('b2bking_b2b_group_for_pricing', b2bking()->get_user_group($user_id), $user_id);

	$is_b2b_user = get_user_meta( $user_id, 'b2bking_b2buser', true );
		
	// Search price tiers
	$price_tiers = get_post_meta($product->get_id(), 'b2bking_product_pricetiers_group_'.$currentusergroupidnr, true );

	// if no tiers, get regular
	if (empty($price_tiers)){
		$price_tiers = get_post_meta($product->get_id(), 'b2bking_product_pricetiers_group_b2c', true );
	}

	// apply percentage instead of final prices (optiinally)
	$price_tiers = b2bking()->convert_price_tiers($price_tiers, $product);

	if (!empty($price_tiers)){

		if ( '' !== $product->get_price() ) {
			if ( $product->is_on_sale() ) {
				$price = get_post_meta($product->get_id(),'_sale_price',true);
		    	
				if ($is_b2b_user === 'yes'){
					// Search if there is a specific price set for the user's group
					$b2b_price = b2bking()->tofloat(get_post_meta($product->get_id(), 'b2bking_sale_product_price_group_'.$currentusergroupidnr, true ));
										
					if (!empty($b2b_price)){
						$price = $b2b_price;
					}
				}

			} else {
				$price = get_post_meta($product->get_id(),'_regular_price',true);

				if ($is_b2b_user === 'yes'){
					// Search if there is a specific price set for the user's group
					$b2b_price = b2bking()->tofloat(get_post_meta($product->get_id(), 'b2bking_regular_product_price_group_'.$currentusergroupidnr, true ));
										
					if (!empty($b2b_price)){
						$price = $b2b_price;
					}
				}
			}
			$price_tiers = array_filter(explode(';', $price_tiers));
			$min_price = b2bking()->tofloat($price);
			$max_price = b2bking()->tofloat($price);

			// first eliminate all quantities larger than the quantity in cart
			foreach($price_tiers as $tier){
				$tier_values = explode(':', $tier);
				if (isset($tier_values[1])){
					if (b2bking()->tofloat($tier_values[1]) < $min_price){
						$min_price = b2bking()->tofloat($tier_values[1]);
					}
				}
				
			}

			$min_price = b2bking()->b2bking_wc_get_price_to_display( $product, array( 'price' => b2bking()->get_woocs_price($min_price ) ) );
			return wc_price($min_price);

		} else {
			return $price;
		}

	} else {
		// check if product is variable
		if ($product->is_type('variable')){

			$range = false;
			if (!$range){

				// check if any variation has tiered price and if not, return
				$have_tiered_price_in_any_variation = 'no';
				$children = $product->get_children();
				foreach ($children as $variation_id){
					// Search price tiers
					$price_tiers = get_post_meta($variation_id, 'b2bking_product_pricetiers_group_'.$currentusergroupidnr, true );
					// if no tiers, get regular
					if (empty($price_tiers)){
						$price_tiers = get_post_meta($variation_id, 'b2bking_product_pricetiers_group_b2c', true );
					}
					$price_tiers = b2bking()->convert_price_tiers($price_tiers, wc_get_product($variation_id));

					if (!empty($price_tiers)){
						$have_tiered_price_in_any_variation = 'yes';
						break;
					}
				}
				if ($have_tiered_price_in_any_variation === 'no'){
					$range = $price;
					return $price;
				}

				// parse all variations and get min and max price across all. Store it in cache.
				$min_price = 'no';
				$max_price = 'no';
				
				// get all variations, and check price for each.
				foreach ($children as $variation_id){

					$productvariation = wc_get_product($variation_id);
					// get sale/regular price / group price
					if ( '' !== $productvariation->get_price() ) {
						if ( $productvariation->is_on_sale() ) {
							$varprice = get_post_meta($variation_id,'_sale_price',true);
						   	
							if ($is_b2b_user === 'yes'){
								// Search if there is a specific price set for the user's group
								$b2b_price = b2bking()->tofloat(get_post_meta($variation_id, 'b2bking_sale_product_price_group_'.$currentusergroupidnr, true ));
													
								if (!empty($b2b_price)){
									$varprice = $b2b_price;
								}
							}

						} else {
							$varprice = get_post_meta($variation_id,'_regular_price',true);

							if ($is_b2b_user === 'yes'){
								// Search if there is a specific price set for the user's group
								$b2b_price = b2bking()->tofloat(get_post_meta($variation_id, 'b2bking_regular_product_price_group_'.$currentusergroupidnr, true ));
													
								if (!empty($b2b_price)){
									$varprice = $b2b_price;
								}
							}
						}

						$varprice = b2bking()->b2bking_wc_get_price_to_display( $productvariation, array( 'price' => $varprice ) ); 

						// Search price tiers
						$price_tiers = get_post_meta($variation_id, 'b2bking_product_pricetiers_group_'.$currentusergroupidnr, true );
						// if no tiers, get regular
						if (empty($price_tiers)){
							$price_tiers = get_post_meta($variation_id, 'b2bking_product_pricetiers_group_b2c', true );
						}

						$price_tiers = b2bking()->convert_price_tiers($price_tiers, $productvariation);

						if (!empty($price_tiers)){
							

							$price_tiers = array_filter(explode(';', $price_tiers));
							$var_min_price = b2bking()->tofloat($varprice);
							$var_max_price = b2bking()->tofloat($varprice);

							// first eliminate all quantities larger than the quantity in cart
							foreach($price_tiers as $tier){
								$tier_values = explode(':', $tier);
								if (b2bking()->tofloat($tier_values[1]) < $var_min_price){
									$var_min_price = b2bking()->tofloat($tier_values[1]);
								}
							}

							// clear cache mostly for variable products
							if (apply_filters('b2bking_clear_wc_products_cache', true)){
								WC_Cache_Helper::get_transient_version( 'product', true );
							}

							// adjust price for tax
							$var_min_price = b2bking()->b2bking_wc_get_price_to_display( $productvariation, array( 'price' => $var_min_price ) );
							$var_max_price = b2bking()->b2bking_wc_get_price_to_display( $productvariation, array( 'price' => $var_max_price ) );

						} else {

							$var_min_price = b2bking()->b2bking_wc_get_price_to_display( $productvariation, array( 'price' => $varprice ) );
							$var_max_price = b2bking()->b2bking_wc_get_price_to_display( $productvariation, array( 'price' => $varprice ) );
							
						}
					}

					if ($min_price === 'no'){
						$min_price = $var_min_price;
						$max_price = $var_max_price;
					} else {
						if ($var_min_price < $min_price){
							$min_price = $var_min_price;
						}
						if ($var_max_price > $max_price){
							$max_price = $var_max_price;
						}
					}
				}

				$range = wc_price($min_price);
									
			}

			return $range;
		} else {
			return $price;	
		}
	}
}