public static function get_variation_price_behaviour($product_into_cart, $product_variations, $head_product_id, $variations_options) { global $wpdb; if (!empty($product_variations)) { // Initialize variations total price datas $variations_total_price = array('price_et' => 0, 'vat_amount' => 0, 'price_ati' => 0); $variations_discount_total_price = array('price_et' => 0, 'vat_amount' => 0, 'price_ati' => 0); $vat_rate = 0; $discount_amount = $discount_rate = $special_price = 0; // Recover Head product metadata $head_product_metadata = get_post_meta($head_product_id, '_wpshop_product_metadata', true); $tva_rate_id = !empty($head_product_metadata['tx_tva']) ? $head_product_metadata['tx_tva'] : 0; if (!empty($tva_rate_id)) { // Recover VAT Rate of product $query = $wpdb->prepare('SELECT value FROM ' . WPSHOP_DBT_ATTRIBUTE_VALUES_OPTIONS . ' WHERE id = %d', $tva_rate_id); $vat_rate = $wpdb->get_var($query); } $price_piloting = get_option('wpshop_shop_price_piloting'); foreach ($product_variations as $product_variation) { $variation_metadata['product_price'] = 0; $variation_metadata = get_post_meta($product_variation, '_wpshop_product_metadata', true); if (!empty($variation_metadata)) { $p_et = empty($price_piloting) || $price_piloting == 'TTC' ? (!empty($variation_metadata['product_price']) ? $variation_metadata['product_price'] : 0) / (1 + $vat_rate / 100) : $variation_metadata['price_ht']; $p_ati = empty($price_piloting) || $price_piloting == 'TTC' ? !empty($variation_metadata['product_price']) ? $variation_metadata['product_price'] : 0 : $variation_metadata['price_ht'] * (1 + $vat_rate / 100); $variations_total_price['price_et'] += $p_et; $variations_total_price['price_ati'] += $p_ati; $variations_total_price['vat_amount'] += $p_ati - $p_et; $variation_metadata['tx_tva'] = $product_into_cart['tx_tva'] = $vat_rate; // Check discount $discount_config = wpshop_prices::check_discount_for_product($product_variation); if (!empty($discount_config) && !empty($discount_config['value'])) { $variation_discount_prices = wpshop_prices::calcul_discounted_price($variation_metadata, $discount_config); $variations_discount_total_price['price_et'] += $variation_discount_prices['price_ht']; $variations_discount_total_price['price_ati'] += $variation_discount_prices['product_price']; $variations_discount_total_price['vat_amount'] += $variation_discount_prices['tva']; if (!empty($discount_config['type']) && $discount_config['type'] == 'discount_amount') { $product_into_cart['discount_amount'] = $discount_amount + $product_into_cart['discount_amount']; } elseif (!empty($discount_config['type']) && $discount_config['type'] == 'discount_rate') { $product_into_cart['discount_rate'] = $discount_rate + $discount_config['value']; } elseif (!empty($discount_config['type']) && $discount_config['type'] == 'special_price') { $product_into_cart['special_price'] = $special_price + $discount_config['value']; } } $product_variation_def = wpshop_products::get_product_data($product_variation, true); $product_into_cart['item_meta']['variations'][$product_variation] = $product_variation_def; } } // Check if add or replace variation price to head product $product_variation_defining = get_post_meta($head_product_id, '_wpshop_variation_defining', true); if (empty($product_variation_defining) || !empty($product_variation_defining) && empty($product_variation_defining['options']) || !empty($product_variation_defining) && !empty($product_variation_defining['options']) && !empty($product_variation_defining['options']['price_behaviour']) && !empty($product_variation_defining['options']['price_behaviour'][0]) && $product_variation_defining['options']['price_behaviour'][0] == 'replacement') { //Replace the product price if (!empty($variations_discount_total_price) && !empty($variations_discount_total_price['price_ati'])) { $product_into_cart['price_ttc_before_discount'] = $variations_total_price['price_ati']; $product_into_cart['price_ht_before_discount'] = $variations_total_price['price_et']; $product_into_cart['product_price'] = $variations_discount_total_price['price_ati']; $product_into_cart['price_ht'] = $variations_discount_total_price['price_et']; $product_into_cart['tva'] = $variations_discount_total_price['vat_amount']; } else { $product_into_cart['product_price'] = $variations_total_price['price_ati']; $product_into_cart['price_ht'] = $variations_total_price['price_et']; $product_into_cart['tva'] = $variations_total_price['vat_amount']; } } else { // Add variations price to product price if (!empty($variations_discount_total_price) && !empty($variations_discount_total_price['price_ati'])) { $product_into_cart['price_ttc_before_discount'] = $product_into_cart['product_price'] + $variations_total_price['price_ati']; $product_into_cart['price_ht_before_discount'] = $product_into_cart['price_ht'] + $variations_total_price['price_et']; $product_into_cart['product_price'] += $variations_discount_total_price['price_ati']; $product_into_cart['price_ht'] += $variations_discount_total_price['price_et']; $product_into_cart['tva'] += $variations_discount_total_price['vat_amount']; } else { $product_into_cart['product_price'] += $variations_total_price['price_ati']; $product_into_cart['price_ht'] += $variations_total_price['price_et']; $product_into_cart['tva'] += $variations_total_price['vat_amount']; } // Check parent discount $parent_discount_config = wpshop_prices::check_discount_for_product($head_product_id); if (!empty($parent_discount_config)) { $product_into_cart['price_ttc_before_discount'] = !empty($product_into_cart['price_ttc_before_discount']) ? $product_into_cart['price_ttc_before_discount'] : $product_into_cart['product_price']; $product_into_cart['price_ht_before_discount'] = !empty($product_into_cart['price_ht_before_discount']) ? $product_into_cart['price_ht_before_discount'] : $product_into_cart['price_ht']; $product_into_cart = wpshop_prices::calcul_discounted_price($product_into_cart, $parent_discount_config); if (!empty($parent_discount_config['type']) && $parent_discount_config['type'] == 'discount_amount') { $product_into_cart['discount_amount'] = $discount_amount + $parent_discount_config['value']; } elseif (!empty($parent_discount_config['type']) && $parent_discount_config['type'] == 'discount_rate') { $product_into_cart['discount_rate'] = $discount_rate + $parent_discount_config['value']; } elseif (!empty($parent_discount_config['type']) && $parent_discount_config['type'] == 'special_price') { $product_into_cart['special_price'] = $special_price + $parent_discount_config['value']; } } } } else { // If product have just Free variations $discount_config = wpshop_prices::check_discount_for_product($head_product_id); if (!empty($discount_config)) { $product_into_cart['price_ttc_before_discount'] = !empty($product_into_cart['price_ttc_before_discount']) ? $product_into_cart['price_ttc_before_discount'] : $product_into_cart['product_price']; $product_into_cart['price_ht_before_discount'] = !empty($product_into_cart['price_ht_before_discount']) ? $product_into_cart['price_ht_before_discount'] : $product_into_cart['price_ht']; $product_into_cart = wpshop_prices::calcul_discounted_price($product_into_cart, $discount_config); } } // Text From indicator if (!empty($variations_options) && !empty($variations_options['text_from'])) { $product_into_cart['text_from'] = $variations_options['text_from']; } return $product_into_cart; }