%PDF- %PDF-
Direktori : /var/www/html/friendstravel.al/wp-content/plugins/travel-booking/inc/ |
Current File : /var/www/html/friendstravel.al/wp-content/plugins/travel-booking/inc/ajax_frontend.php |
<?php /*** Ajax url ***/ add_action( 'wp_print_scripts', 'tour_booking_phys_ajax_url' ); function tour_booking_phys_ajax_url() { echo '<script type="text/javascript"> var tb_phys_ajax_url ="' . get_site_url() . '/"; </script>'; } /*** Add Tour to cart ***/ //add_action('wp_ajax_add_tour_to_cart_phys', 'add_tour_to_cart_phys'); //add_action('wp_ajax_nopriv_add_tour_to_cart_phys', 'add_tour_to_cart_phys'); add_action( 'tb_ajax_add_tour_to_cart_phys', 'add_tour_to_cart_phys' ); function add_tour_to_cart_phys() { $message = array( 'status' => 'error' ); // if ( isset( $_REQUEST['nonce'] ) && wp_verify_nonce( $_REQUEST['nonce'], 'tb_booking_nonce_action' ) ) { if ( ! isset( $_POST['tour_id'] ) || ! isset( $_POST['date_booking'] ) ) { wp_send_json( $message ); } $tour_id = $_POST['tour_id']; $date_booking = $_POST['date_booking']; $number_ticket = $_POST['number_ticket']; $cart_tour = WC()->cart; $now = strtotime( date( 'Y-m-d H:i:s' ) ); $basket_item_key = $cart_tour->generate_cart_id( $now ); // $timestamp = strtotime($date_booking); // $day_booking = date("l", $timestamp); // $tour_days = json_decode(htmlspecialchars_decode(get_post_meta($tour_id, '_price_each_day', true))); // $price_day = $tour_days->{$day_booking}; $tour = wc_get_product( $tour_id ); // $tour->set_price($price_day); $cart_tour->cart_contents[ $basket_item_key ] = array( 'product_id' => $tour_id, 'variation_id' => 0, 'variation' => 0, 'quantity' => $number_ticket, 'date_booking' => $date_booking, 'data' => $tour, ); if ( isset( $_POST['number_children'] ) ) { $cart_tour->cart_contents[ $basket_item_key ]['number_children'] = $_POST['number_children']; $price_children = get_price_for_child_on_tour( $tour, $date_booking ); $cart_tour->cart_contents[ $basket_item_key ]['price_children'] = $price_children; } $cart_tour->calculate_totals(); $message['status'] = 'success'; // } wp_send_json( $message ); } add_action( 'woocommerce_before_calculate_totals', 'set_price_day_phys' ); function set_price_day_phys( $cart_object ) { // var_dump( $cart_object ); foreach ( $cart_object->cart_contents as $key => $value ) { if ( isset( $value['date_booking'] ) ) { $timestamp = strtotime( $value['date_booking'] ); $day_booking = date( "l", $timestamp ); $tour_days = json_decode( htmlspecialchars_decode( get_post_meta( $value['product_id'], '_price_each_day', true ) ) ); if ( isset( $tour_days->{$day_booking} ) ) { if ( isset( $tour_days->{$day_booking}->price ) ) { $price_day = $tour_days->{$day_booking}->price; } else { $price_day = $tour_days->{$day_booking}; } if ( $price_day != 0 ) { $value['data']->price = $price_day; } } } } } add_action( 'woocommerce_after_calculate_totals', 'update_price_have_price_child' ); function update_price_have_price_child( $cart_object ) { if ( get_option( 'show_adults_children' ) ) { foreach ( $cart_object->cart_session_data as $key => $default ) { $cart_object->$key = $default; } do_action( 'woocommerce_cart_reset', $cart_object, false ); $cart_object->coupons = $cart_object->get_coupons(); if ( $cart_object->is_empty() ) { $cart_object->set_session(); return; } $tax_rates = array(); $shop_tax_rates = array(); $cart = $cart_object->get_cart(); /** * Calculate subtotals for items. This is done first so that discount logic can use the values. */ foreach ( $cart as $cart_item_key => $values ) { $_product = $values['data']; /** Update number child if update cart **/ if ( isset( $_POST['cart'] ) ) { $cart[ $cart_item_key ]['number_children'] = $_POST['cart'][ $cart_item_key ]['number_children']; $cart_object->cart_contents[ $cart_item_key ]['number_children'] = $_POST['cart'][ $cart_item_key ]['number_children']; } if ( isset( $values['number_children'] ) ) { $line_price_child = get_price_for_child_on_tour( $_product, $values['date_booking'] ); $line_price = $_product->get_price() * $values['quantity'] + $line_price_child * $values['number_children']; // set for order info $cart_object->cart_contents[ $cart_item_key ]['price_adults'] = $_product->get_price(); $cart_object->cart_contents[ $cart_item_key ]['price_children'] = $line_price_child; $cart_object->cart_contents[ $cart_item_key ]['currency'] = get_woocommerce_currency_symbol( get_woocommerce_currency() ); } else { $line_price = $_product->get_price() * $values['quantity']; } $line_subtotal = 0; $line_subtotal_tax = 0; /** * No tax to calculate. */ if ( ! $_product->is_taxable() ) { // Subtotal is the undiscounted price $cart_object->subtotal += $line_price; $cart_object->subtotal_ex_tax += $line_price; /** * Prices include tax. * * To prevent rounding issues we need to work with the inclusive price where possible. * otherwise we'll see errors such as when working with a 9.99 inc price, 20% VAT which would. * be 8.325 leading to totals being 1p off. * * Pre tax coupons come off the price the customer thinks they are paying - tax is calculated. * afterwards. * * e.g. $100 bike with $10 coupon = customer pays $90 and tax worked backwards from that. */ } elseif ( $cart_object->prices_include_tax ) { // Get base tax rates if ( empty( $shop_tax_rates[ $_product->tax_class ] ) ) { $shop_tax_rates[ $_product->tax_class ] = WC_Tax::get_base_tax_rates( $_product->tax_class ); } // Get item tax rates if ( empty( $tax_rates[ $_product->get_tax_class() ] ) ) { $tax_rates[ $_product->get_tax_class() ] = WC_Tax::get_rates( $_product->get_tax_class() ); } $base_tax_rates = $shop_tax_rates[ $_product->tax_class ]; $item_tax_rates = $tax_rates[ $_product->get_tax_class() ]; /** * ADJUST TAX - Calculations when base tax is not equal to the item tax. * * The woocommerce_adjust_non_base_location_prices filter can stop base taxes being taken off when dealing with out of base locations. * e.g. If a product costs 10 including tax, all users will pay 10 regardless of location and taxes. * This feature is experimental @since 2.4.7 and may change in the future. Use at your risk. */ if ( $item_tax_rates !== $base_tax_rates && apply_filters( 'woocommerce_adjust_non_base_location_prices', true ) ) { // Work out a new base price without the shop's base tax $taxes = WC_Tax::calc_tax( $line_price, $base_tax_rates, true, true ); // Now we have a new item price (excluding TAX) $line_subtotal = $line_price - array_sum( $taxes ); // Now add modified taxes $tax_result = WC_Tax::calc_tax( $line_subtotal, $item_tax_rates ); $line_subtotal_tax = array_sum( $tax_result ); /** * Regular tax calculation (customer inside base and the tax class is unmodified. */ } else { // Calc tax normally $taxes = WC_Tax::calc_tax( $line_price, $item_tax_rates, true ); $line_subtotal_tax = array_sum( $taxes ); $line_subtotal = $line_price - array_sum( $taxes ); } /** * Prices exclude tax. * * This calculation is simpler - work with the base, untaxed price. */ } else { // Get item tax rates if ( empty( $tax_rates[ $_product->get_tax_class() ] ) ) { $tax_rates[ $_product->get_tax_class() ] = WC_Tax::get_rates( $_product->get_tax_class() ); } $item_tax_rates = $tax_rates[ $_product->get_tax_class() ]; // Base tax for line before discount - we will store this in the order data $taxes = WC_Tax::calc_tax( $line_price, $item_tax_rates ); $line_subtotal_tax = array_sum( $taxes ); $line_subtotal = $line_price; } // Add to main subtotal $cart_object->subtotal += $line_subtotal; $cart_object->subtotal_ex_tax += $line_subtotal; } // Order cart items by price so coupon logic is 'fair' for customers and not based on order added to cart. // uasort( $cart, array( $cart_object, 'sort_by_subtotal' ) ); /** * Calculate totals for items. */ foreach ( $cart as $cart_item_key => $values ) { $_product = $values['data']; // Prices if ( isset( $values['number_children'] ) ) { $line_price_child = get_price_for_child_on_tour( $_product, $values['date_booking'] ); $base_price = $_product->get_price() * $values['quantity'] + $line_price_child * $values['number_children']; $line_price = $_product->get_price() * $values['quantity'] + $line_price_child * $values['number_children']; } else { $base_price = $_product->get_price() * $values['quantity']; $line_price = $_product->get_price() * $values['quantity']; } // Tax data $taxes = array(); $discounted_taxes = array(); /** * No tax to calculate. */ if ( ! $_product->is_taxable() ) { // Discounted Price (price with any pre-tax discounts applied) $discounted_price = $cart_object->get_discounted_price( $values, $base_price, true ); $line_subtotal_tax = 0; $line_subtotal = $line_price; $line_tax = 0; $line_total = round( $discounted_price, wc_get_rounding_precision() ); /** * Prices include tax. */ } elseif ( $cart_object->prices_include_tax ) { $base_tax_rates = $shop_tax_rates[ $_product->tax_class ]; $item_tax_rates = $tax_rates[ $_product->get_tax_class() ]; /** * ADJUST TAX - Calculations when base tax is not equal to the item tax. * * The woocommerce_adjust_non_base_location_prices filter can stop base taxes being taken off when dealing with out of base locations. * e.g. If a product costs 10 including tax, all users will pay 10 regardless of location and taxes. * This feature is experimental @since 2.4.7 and may change in the future. Use at your risk. */ if ( $item_tax_rates !== $base_tax_rates && apply_filters( 'woocommerce_adjust_non_base_location_prices', true ) ) { // Work out a new base price without the shop's base tax $taxes = WC_Tax::calc_tax( $line_price, $base_tax_rates, true, true ); // Now we have a new item price (excluding TAX) $line_subtotal = round( $line_price - array_sum( $taxes ), wc_get_rounding_precision() ); $taxes = WC_Tax::calc_tax( $line_subtotal, $item_tax_rates ); $line_subtotal_tax = array_sum( $taxes ); // Adjusted price (this is the price including the new tax rate) $adjusted_price = ( $line_subtotal + $line_subtotal_tax ) / $values['quantity']; // Apply discounts and get the discounted price FOR A SINGLE ITEM $discounted_price = $cart_object->get_discounted_price( $values, $adjusted_price, true ); // Convert back to line price and round nicely $discounted_line_price = round( $discounted_price * $values['quantity'], $cart_object->dp ); // Now use rounded line price to get taxes. $discounted_taxes = WC_Tax::calc_tax( $discounted_line_price, $item_tax_rates, true ); $line_tax = array_sum( $discounted_taxes ); $line_total = $discounted_line_price - $line_tax; /** * Regular tax calculation (customer inside base and the tax class is unmodified. */ } else { // Work out a new base price without the item tax $taxes = WC_Tax::calc_tax( $line_price, $item_tax_rates, true ); // Now we have a new item price (excluding TAX) $line_subtotal = $line_price - array_sum( $taxes ); $line_subtotal_tax = array_sum( $taxes ); // Calc prices and tax (discounted) $discounted_price = $cart_object->get_discounted_price( $values, $base_price, true ); // Convert back to line price and round nicely $discounted_line_price = round( $discounted_price, $cart_object->dp ); // Now use rounded line price to get taxes. $discounted_taxes = WC_Tax::calc_tax( $discounted_line_price, $item_tax_rates, true ); $line_tax = array_sum( $discounted_taxes ); $line_total = $discounted_line_price - $line_tax; } // Tax rows - merge the totals we just got foreach ( array_keys( $cart_object->taxes + $discounted_taxes ) as $key ) { $cart_object->taxes[ $key ] = ( isset( $discounted_taxes[ $key ] ) ? $discounted_taxes[ $key ] : 0 ) + ( isset( $cart_object->taxes[ $key ] ) ? $cart_object->taxes[ $key ] : 0 ); } /** * Prices exclude tax. */ } else { $item_tax_rates = $tax_rates[ $_product->get_tax_class() ]; // Work out a new base price without the shop's base tax $taxes = WC_Tax::calc_tax( $line_price, $item_tax_rates ); // Now we have the item price (excluding TAX) $line_subtotal = $line_price; $line_subtotal_tax = array_sum( $taxes ); // Now calc product rates $discounted_price = $cart_object->get_discounted_price( $values, $base_price, true ); $discounted_taxes = WC_Tax::calc_tax( $discounted_price, $item_tax_rates ); $discounted_tax_amount = array_sum( $discounted_taxes ); $line_tax = $discounted_tax_amount; $line_total = $discounted_price; // Tax rows - merge the totals we just got foreach ( array_keys( $cart_object->taxes + $discounted_taxes ) as $key ) { $cart_object->taxes[ $key ] = ( isset( $discounted_taxes[ $key ] ) ? $discounted_taxes[ $key ] : 0 ) + ( isset( $cart_object->taxes[ $key ] ) ? $cart_object->taxes[ $key ] : 0 ); } } // Cart contents total is based on discounted prices and is used for the final total calculation $cart_object->cart_contents_total += $line_total; // Store costs + taxes for lines $cart_object->cart_contents[ $cart_item_key ]['line_total'] = $line_total; $cart_object->cart_contents[ $cart_item_key ]['line_tax'] = $line_tax; $cart_object->cart_contents[ $cart_item_key ]['line_subtotal'] = $line_subtotal; $cart_object->cart_contents[ $cart_item_key ]['line_subtotal_tax'] = $line_subtotal_tax; // Store rates ID and costs - Since 2.2 $cart_object->cart_contents[ $cart_item_key ]['line_tax_data'] = array( 'total' => $discounted_taxes, 'subtotal' => $taxes ); } // Only calculate the grand total + shipping if on the cart/checkout if ( is_checkout() || is_cart() || defined( 'WOOCOMMERCE_CHECKOUT' ) || defined( 'WOOCOMMERCE_CART' ) ) { // Calculate the Shipping $cart_object->calculate_shipping(); // Trigger the fees API where developers can add fees to the cart $cart_object->calculate_fees(); // Total up/round taxes and shipping taxes if ( $cart_object->round_at_subtotal ) { $cart_object->tax_total = WC_Tax::get_tax_total( $cart_object->taxes ); $cart_object->shipping_tax_total = WC_Tax::get_tax_total( $cart_object->shipping_taxes ); $cart_object->taxes = array_map( array( 'WC_Tax', 'round' ), $cart_object->taxes ); $cart_object->shipping_taxes = array_map( array( 'WC_Tax', 'round' ), $cart_object->shipping_taxes ); } else { $cart_object->tax_total = array_sum( $cart_object->taxes ); $cart_object->shipping_tax_total = array_sum( $cart_object->shipping_taxes ); } // VAT exemption done at this point - so all totals are correct before exemption if ( WC()->customer->is_vat_exempt() ) { $cart_object->remove_taxes(); } // Allow plugins to hook and alter totals before final total is calculated // do_action( 'woocommerce_calculate_totals', $cart_object ); // Grand Total - Discounted product prices, discounted tax, shipping cost + tax $cart_object->total = max( 0, apply_filters( 'woocommerce_calculated_total', round( $cart_object->cart_contents_total + $cart_object->tax_total + $cart_object->shipping_tax_total + $cart_object->shipping_total + $cart_object->fee_total, $cart_object->dp ), $cart_object ) ); } else { // Set tax total to sum of all tax rows $cart_object->tax_total = WC_Tax::get_tax_total( $cart_object->taxes ); // VAT exemption done at this point - so all totals are correct before exemption if ( WC()->customer->is_vat_exempt() ) { $cart_object->remove_taxes(); } } } } add_filter( 'woocommerce_cart_item_subtotal', 'update_subtotal_have_price_child', 10, 2 ); function update_subtotal_have_price_child( $value, $cart_item ) { $value = get_woocommerce_currency_symbol( get_woocommerce_currency() ) . $cart_item['line_subtotal']; return $value; } add_filter( 'woocommerce_add_order_item_meta', 'add_imgs_to_order', 10, 2 ); function add_imgs_to_order( $item_id, $tour_item ) { wc_add_order_item_meta( $item_id, '_date_booking', $tour_item['date_booking'] ); if ( isset( $tour_item['number_children'] ) ) { wc_add_order_item_meta( $item_id, '_number_children', $tour_item['number_children'] ); } if ( isset( $tour_item['price_adults'] ) ) { wc_add_order_item_meta( $item_id, '_price_adults', $tour_item['price_adults'] ); } if ( isset( $tour_item['price_children'] ) ) { wc_add_order_item_meta( $item_id, '_price_children', $tour_item['price_children'] ); } if ( isset( $tour_item['currency'] ) ) { wc_add_order_item_meta( $item_id, '_currency', $tour_item['currency'] ); } } function get_price_for_child_on_tour( $tour, $date_booking ) { $price_children = 0; $price_adults_day = 0; $timestamp = strtotime( $date_booking ); $day_booking = date( "l", $timestamp ); $tour_days = json_decode( htmlspecialchars_decode( get_post_meta( $tour->get_id(), '_price_each_day', true ) ) ); if ( isset( $tour_days->{$day_booking}->price_children ) ) { $price_children = $tour_days->{$day_booking}->price_children; $price_adults_day = $tour_days->{$day_booking}->price; } if ( $price_children == 0 ) { $price_children = get_post_meta( $tour->get_id(), '_price_child', true ) ? get_post_meta( $tour->get_id(), '_price_child', true ) : 0; } if ( $price_children == 0 ) { $price_children = get_option( 'price_children' ) * $tour->get_price() / 100; } return $price_children; }