Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
12 kB
2
Indexable
Never
function b2bking_has_fixed_price( $product ) {

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

	$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 = b2bking()->get_user_group($user_id);
	if (!$currentusergroupidnr || empty($currentusergroupidnr)){
		$currentusergroupidnr = 'invalid';
	}

	// Get current product
	$current_product_id = $product->get_id();

	$response = b2bking()->get_applicable_rules('fixed_price', $current_product_id);

	// abort early
	if ($response === 'norules'){
		return false;
	}

	$fixed_price_rules = $response[0];
	$current_product_belongsto_array = $response[1];

	// if multiple fixed price rules apply, give the smallest price to the user
	$have_fixed_price = NULL;
	$smallest_fixed_price = 0;

	$fixed_price_rules = b2bking()->get_rules_apply_priority($fixed_price_rules);

	foreach ($fixed_price_rules as $fixed_price_rule){
		// Get rule details
		$type = get_post_meta($fixed_price_rule, 'b2bking_rule_what', true);
		$howmuch = get_post_meta($fixed_price_rule, 'b2bking_rule_howmuch', true);
		$applies = explode('_',get_post_meta($fixed_price_rule, 'b2bking_rule_applies', true));
		$rule_multiple_options = get_post_meta($fixed_price_rule, 'b2bking_rule_applies_multiple_options', true);
		$rule_multiple_options_array = explode(',',$rule_multiple_options);
		$cart = WC()->cart;
		// Get conditions
		$passconditions = 'yes';
		$conditions = get_post_meta($fixed_price_rule, 'b2bking_rule_conditions', true);

		if (!empty($conditions)){
			$conditions = explode('|',$conditions);

			if ($applies[0] === 'multiple'){ // if rule is multiple products / categories rule
				$temporary_pass_conditions = 'no'; // if at least 1 element passes, change to yes
				// for each element that applies to the product and is part of the rule, check if at least 1 passes the conditions
				foreach($current_product_belongsto_array as $element){
					if(in_array($element, $rule_multiple_options_array)){
						$element_array = explode('_', $element);
						// if element is product or if element is category
						if ($element_array[0] === 'product'){
							$passes_inside_conditions = 'yes';
							$product_quantity = 0;
							if(is_object($cart)) {
								foreach($cart->get_cart() as $cart_item){
								if(intval($element_array[1]) === intval($cart_item['product_id'])){
									$product_quantity = $cart_item["quantity"];// Quantity
									break;
								}
								}
							}
							// check all product conditions against it
							foreach ($conditions as $condition){
								$condition_details = explode(';',$condition);

	    		$condition_details[2] = b2bking()->get_woocs_price($condition_details[2]);
								switch ($condition_details[0]){
									case 'product_quantity':
										switch ($condition_details[1]){
											case 'greater':
												if (intval($condition_details[2]) !== 0){
													if (! ($product_quantity > intval($condition_details[2]))){
														$passes_inside_conditions = 'no';
														break 3;
													}
												}
											break;
											case 'equal':
												if (intval($condition_details[2]) !== 0){
													if (! ($product_quantity === intval($condition_details[2]))){
														$passes_inside_conditions = 'no';
														break 3;
													}
												}
											break;
											case 'smaller':
												if (! ($product_quantity < intval($condition_details[2]))){
													$passes_inside_conditions = 'no';
													break 3;
												}
											break;
										}
										break;
									case 'cart_total_quantity':
										switch ($condition_details[1]){
											case 'greater':
												if (intval($condition_details[2]) !== 0){
													if (! ($cart->cart_contents_count > intval($condition_details[2]))){
														$passes_inside_conditions = 'no';
														break 3;
													}
												}
											break;
											case 'equal':
												if (intval($condition_details[2]) !== 0){
													if (! ($cart->cart_contents_count === intval($condition_details[2]))){
														$passes_inside_conditions = 'no';
														break 3;
													}
												}
											break;
											case 'smaller':
												if (! ($cart->cart_contents_count < intval($condition_details[2]))){
													$passes_inside_conditions = 'no';
													break 3;
												}
											break;
										}
										break;
								}
							}
							if ($passes_inside_conditions === 'yes'){
								$temporary_pass_conditions = 'yes';
								break; // if 1 element passed, no need to check all other elements
							}
						} else if ($element_array[0] === 'category'){
							// check all category conditions against it + car total conditions
							$passes_inside_conditions = 'yes';
							$category_quantity = 0;
							if(is_object($cart)) {
								foreach($cart->get_cart() as $cart_item){
									if(b2bking()->b2bking_has_category($element_array[1], 'product_cat', $cart_item['product_id'])){
										$category_quantity += $cart_item["quantity"]; // add item quantity
									}
								}
							}
							foreach ($conditions as $condition){
								$condition_details = explode(';',$condition);

	    		$condition_details[2] = b2bking()->get_woocs_price($condition_details[2]);
								switch ($condition_details[0]){
									case 'category_product_quantity':
										switch ($condition_details[1]){
											case 'greater':
												if (intval($condition_details[2]) !== 0){
													if (! ($category_quantity > intval($condition_details[2]))){
														$passes_inside_conditions = 'no';
														break 3;
													}
												}
											break;
											case 'equal':
												if (intval($condition_details[2]) !== 0){
													if (! ($category_quantity === intval($condition_details[2]))){
														$passes_inside_conditions = 'no';
														break 3;
													}
												}
											break;
											case 'smaller':
												if (! ($category_quantity < intval($condition_details[2]))){
													$passes_inside_conditions = 'no';
													break 3;
												}
											break;
										}
										break;
									case 'cart_total_quantity':
										switch ($condition_details[1]){
											case 'greater':
												if (intval($condition_details[2]) !== 0){
													if (! ($cart->cart_contents_count > intval($condition_details[2]))){
														$passes_inside_conditions = 'no';
														break 3;
													}
												}
											break;
											case 'equal':
												if (intval($condition_details[2]) !== 0){
													if (! ($cart->cart_contents_count === intval($condition_details[2]))){
														$passes_inside_conditions = 'no';
														break 3;
													}
												}
											break;
											case 'smaller':
												if (! ($cart->cart_contents_count < intval($condition_details[2]))){
													$passes_inside_conditions = 'no';
													break 3;
												}
											break;
										}
										break;
								}
							}
							if ($passes_inside_conditions === 'yes'){
								$temporary_pass_conditions = 'yes';
								break; // if 1 element passed, no need to check all other elements
							}
						}
					}
				} //foreach element end

				if ($temporary_pass_conditions === 'no'){
					$passconditions = 'no';
				}

			} else { // if rule is simple product, category, or total cart role 
				$category_products_number = 0;
				$category_products_value = 0;
				$products_number = 0;
				$products_value = 0;
				

				// Check rule is category rule or product rule
				if ($applies[0] === 'category'){

					// Calculate number of products in cart of this category AND total price of these products
					if(is_object($cart)) {
						foreach($cart->get_cart() as $cart_item){
						if(b2bking()->b2bking_has_category($applies[1], 'product_cat', $cart_item['product_id'])){
							$item_qty = $cart_item["quantity"];// Quantity
							$item_line_total = apply_filters('b2bking_line_total_rules', $cart_item["line_total"], $cart_item); // Item total price (price x quantity)
							$category_products_number += $item_qty; // ctotal number of items in cart
							$category_products_value += $item_line_total; // calculated total items amount
						}
						}
					}
				} else if ($applies[0] === 'product') {
					if(is_object($cart)) {
						foreach($cart->get_cart() as $cart_item){
							if(intval($current_product_id) === intval($cart_item['product_id']) or intval($current_product_id) === intval($cart_item['variation_id'])){
								$item_qty = $cart_item["quantity"];// Quantity
								if (isset($cart_item['line_total'])){
									$item_line_total = apply_filters('b2bking_line_total_rules', $cart_item["line_total"], $cart_item); // Item total price (price x quantity)
									$products_value += $item_line_total; // calculated total items amount
								} 
								$products_number += $item_qty; // ctotal number of items in cart

							}
						}
					}
				}

				foreach ($conditions as $condition){
					$condition_details = explode(';',$condition);

	    		$condition_details[2] = b2bking()->get_woocs_price($condition_details[2]);
					switch ($condition_details[0]){
						case 'product_quantity':
							switch ($condition_details[1]){
								case 'greater':
									if (intval($condition_details[2]) !== 0){
										if (! ($products_number > intval($condition_details[2]))){
											$passconditions = 'no';
											break 3;
										}
									}
								break;
								case 'equal':
									if (intval($condition_details[2]) !== 0){
										if (! ($products_number === intval($condition_details[2]))){
											$passconditions = 'no';
											break 3;
										}
									}
								break;
								case 'smaller':
									if (! ($products_number < intval($condition_details[2]))){
										$passconditions = 'no';
										break 3;
									}
								break;
							}
							break;
						
						case 'category_product_quantity':
							switch ($condition_details[1]){
								case 'greater':
									if (intval($condition_details[2]) !== 0){
										if (! ($category_products_number > intval($condition_details[2]))){
											$passconditions = 'no';
											break 3;
										}
									}
								break;
								case 'equal':
									if (intval($condition_details[2]) !== 0){
										if (! ($category_products_number === intval($condition_details[2]))){
											$passconditions = 'no';
											break 3;
										}
									}
								break;
								case 'smaller':
									if (! ($category_products_number < intval($condition_details[2]))){
										$passconditions = 'no';
										break 3;
									}
								break;
							}
							break;
						
						case 'cart_total_quantity':
							switch ($condition_details[1]){
								case 'greater':
									if (intval($condition_details[2]) !== 0){
										if (! ($cart->cart_contents_count > intval($condition_details[2]))){
											$passconditions = 'no';
											break 3;
										}
									}
								break;
								case 'equal':
									if (intval($condition_details[2]) !== 0){
										if (! ($cart->cart_contents_count === intval($condition_details[2]))){
											$passconditions = 'no';
											break 3;
										}
									}
								break;
								case 'smaller':
									if (! ($cart->cart_contents_count < intval($condition_details[2]))){
										$passconditions = 'no';
										break 3;
									}
								break;
							}
							break;
						
					}
				}
			}		
		}
		

		// Passed conditions
		if ($passconditions === 'yes'){
			if ($have_fixed_price === NULL){
				$have_fixed_price = 'yes';
				$smallest_fixed_price = floatval($howmuch);
			} else {
				if (floatval($howmuch) < $smallest_fixed_price){
					$smallest_fixed_price = floatval($howmuch);
				}   
			}
		} else {
			// do nothing
		}

	} //foreach end
	if($have_fixed_price !== NULL){

		return true;

	} else {
		return false;
	}
}