File: /var/www/dinamo-shop/wp-content/plugins/dinamo-plugin/ajax/cart.php
<?php
add_action( 'wp_ajax_change_country', 'change_country' );
add_action( 'wp_ajax_nopriv_change_country','change_country' );
function change_country() {
    $country = $_POST['country'];
    WC()->customer->set_country( $country );
    WC()->customer->set_billing_country( $country ); // Updated HERE Too
    WC()->customer->set_shipping_country( $country );
    define( 'WOOCOMMERCE_CHECKOUT', true );
    define( 'WOOCOMMERCE_CART', true );
    WC()->cart->calculate_totals();
    WC()->cart->calculate_shipping();
    $packages = WC()->shipping()->get_packages();
    $shipping_price = "";
    $shipping_price_eur = "";
    foreach ( $packages as $i => $package ) {
        $available_methods = $package['rates'];
        if ($available_methods) {
            foreach ($available_methods as $method) {
                $shipping_price = wc_price($method->cost);
                $shipping_price_eur = secondary_price_output($method->cost);
            }
        }
    }
    $base_price = wc_price(WC()->cart->total - WC()->cart->tax_total);
    $base_price_eur = secondary_price_output(WC()->cart->total - WC()->cart->tax_total);
    $tax_total = 0;
    $tax_total_eur = 0;
    foreach ( WC()->cart->get_tax_totals() as $code => $tax ) {
        $tax_total = wp_kses_post($tax->formatted_amount);
        $tax_total_eur = secondary_price_output($tax->amount);
    }
    echo wp_send_json( array(
        'success' => true,
        'shipping_price' => $shipping_price,
        'base_price' => $base_price,
        'tax_total' => $tax_total,
        'cart_total' => WC()->cart->get_total(),
        'shipping_price_eur' => $shipping_price_eur,
        'base_price_eur' => $base_price_eur,
        'tax_total_eur' => $tax_total_eur,
        'cart_total_eur' => secondary_price_output(WC()->cart->total),
    ));
    die();
}
// Get item quantity from cart by cart item key
function get_item_qty( $product ){
    foreach( WC()->cart->get_cart() as $cart_item => $item )
        if ( $product == $cart_item ){
            return $item['quantity'];
            // break;
        }
    return;
}
// Check if cart has free products
function get_free_product(){
    $has_null = false;
                    
    foreach(WC()->cart->get_cart() as $item_key => $item){
        if($item["variation"]["print_type"]){
            $prod = wc_get_product($item["variation_id"]);
            
            if($prod->get_price() == 0){
                $has_null = true;
            }
        }
        if($item["line_total"] == 0){
            $has_null = true;
        }
    }
    if($has_null){
        $null_html = '
        <div class="cart-error__wrap">
            <img src="' . THEMEROOT . '/assets/img/Error.svg" class="cart-error__img">
            <div class="cart-error__text">
                <h4>Dodali ste proizvod od 0€.<br>
                Ispričavamo se na grešci te Vas molimo da uklonite proizvod prije nastavka.</h4>
            </div>
        </div>
        ';
        return $null_html;
    }
    return $has_null;
}
add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
function woocommerce_ajax_add_to_cart(){
    $product_id        = apply_filters('woocommerce_add_to_cart_product_id', absint($_POST['product_id']));
    $quantity          = empty($_POST['quantity']) ? 1 : wc_stock_amount($_POST['quantity']);
    $variation_id = empty($_POST['variation_id']) ? 0 : absint($_POST['variation_id']);
    //$passed_validation = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity);
    $passed_validation = true;
    $product_status    = get_post_status($product_id);
    $product_price = get_post_meta( $product_id, '_regular_price', true);
    $cart_total    = WC()->cart->cart_contents_total;
    $cart_items    = WC()->cart->cart_contents_count;
    $cart_data = array();
    error_log("Looking for error");
    error_log($_POST['print_option']);
    if(!empty($_POST['print_option'])){
        $cart_data["print_option"] = $_POST['print_option'];
        $cart_data["print_sponsor"] =  $_POST['print_sponsor'];
        $cart_data["print_sponsor_back"] =  $_POST['print_sponsor_back'];
        if($_POST['print_option'] == '1'){
            $cart_data["print_number"] =  '1';
            $cart_data["print_name"] =  '1';
            $cart_data["print_number_value"] =  $_POST['print_number_value'];
            $cart_data["print_name_value"] =  $_POST['print_name_value'];
        }else if($_POST['print_option'] == '2'){
            $cart_data["print_number"] =  $_POST['print_number'];
            $cart_data["print_name"] =  $_POST['print_name'];
            if($_POST['print_psk']){
                $cart_data["print_psk"] =  $_POST['print_psk'];
            } else {
                $cart_data["print_psk"] = '0';
            }
            $cart_data["print_number_value"] =  $_POST['print_number_value'];
            $cart_data["print_name_value"] =  $_POST['print_name_value'];
        }
        if($_POST["print_option"] == 1) {
            if($cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '0'){
                $cart_data["print_type"] = 3; // Tisak broja, naziva i sponzora na prsima
            }else if($cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '1'){
                $cart_data["print_type"] = 8; // Tisak broja, naziva i sponzora na leđima
            }else if($cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '1'){
                $cart_data["print_type"] = 9; // Tisak broja, naziva, sponzora na prsima i leđima
            }else if($cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '0'){
                $cart_data["print_type"] = 1; // Tisak broja i naziva
            }
        }else if($_POST["print_option"] == 2){
            if($_POST['print_number'] == '1' && $_POST['print_name'] == '1' && $cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '0' && $cart_data["print_psk"] == '0'){
                $cart_data["print_type"] = 3; // Tisak broja, naziva i sponzora na prsima
            }else if($_POST['print_number'] == '1' && $_POST['print_name'] == '1' && $cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '1' && $cart_data["print_psk"] == '0'){
                $cart_data["print_type"] = 8; // Tisak broja, naziva i sponzora na leđima
            }else if($_POST['print_number'] == '1' && $_POST['print_name'] == '1' && $cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '1' && $cart_data["print_psk"] == '0'){
                $cart_data["print_type"] = 9; // Tisak broja, naziva, sponzora na prsima i leđima
            }else if($_POST['print_number'] == '1' && $_POST['print_name'] == '0' && $cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '0' && $cart_data["print_psk"] == '0'){
                $cart_data["print_type"] = 2; // Tisak broja
            }else if($_POST['print_number'] == '1' && $_POST['print_name'] == '1' && $cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '0' && $cart_data["print_psk"] == '0'){
                $cart_data["print_type"] = 1; // Tisak broja i naziva
            }else if($_POST['print_number'] == '0' && $_POST['print_name'] == '0' && $cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '0' && $cart_data["print_psk"] == '0'){
                $cart_data["print_type"] = 4; // Tisak sponzora na prsima
            }else if($_POST['print_number'] == '0' && $_POST['print_name'] == '0' && $cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '1' && $cart_data["print_psk"] == '0'){
                $cart_data["print_type"] = 10; // Tisak sponzora na leđima
            }else if($_POST['print_number'] == '0' && $_POST['print_name'] == '0' && $cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '1' && $cart_data["print_psk"] == '0'){
                $cart_data["print_type"] = 11; // Tisak sponzora na prsima i leđima
            }
            else if($_POST['print_number'] == '1' && $_POST['print_name'] == '1' && $cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '0' && $cart_data["print_psk"] == '1'){
                $cart_data["print_type"] = 5; // Tisak broja, naziva, sponzora na prsima i psk sponzora
            }else if($_POST['print_number'] == '1' && $_POST['print_name'] == '1' && $cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '1' && $cart_data["print_psk"] == '1'){
                $cart_data["print_type"] = 12; // Tisak broja, naziva, sponzora na leđima i psk sponzora
            }else if($_POST['print_number'] == '1' && $_POST['print_name'] == '1' && $cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '1' && $cart_data["print_psk"] == '1'){
                $cart_data["print_type"] = 13; // Tisak broja, naziva, sponzora na prsima, leđima i psk sponzora
            }
            else if($_POST['print_number'] == '0' && $_POST['print_name'] == '0' && $cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '0' && $cart_data["print_psk"] == '1'){
                $cart_data["print_type"] = 6; // Tisak sponzora na prsima i psk sponzora
            }else if($_POST['print_number'] == '0' && $_POST['print_name'] == '0' && $cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '1' && $cart_data["print_psk"] == '1'){
                $cart_data["print_type"] = 14; // Tisak sponzora na leđima i psk sponzora
            }else if($_POST['print_number'] == '0' && $_POST['print_name'] == '0' && $cart_data["print_sponsor"] == '1' && $cart_data["print_sponsor_back"] == '1' && $cart_data["print_psk"] == '1'){
                $cart_data["print_type"] = 15; // Tisak sponzora na prsima, leđima i psk sponzora
            }
            else if($_POST['print_number'] == '1' && $_POST['print_name'] == '1' && $cart_data["print_sponsor"] == '0' && $cart_data["print_sponsor_back"] == '0' && $cart_data["print_psk"] == '1'){
                $cart_data["print_type"] = 7; // Tisak broja, naziva i psk sponzora
            }
            if($_POST['print_europa_league'] == "1") {
              $cart_data['print_europa_league'] = 1;
            }
        }
    }
                // Check product
                if($passed_validation && 'publish' === $product_status) {
                    $validation = true;
                }else{
                    $validation = false;
                    }
                    $cart_item_key = WC()->cart->add_to_cart($product_id, $quantity, $variation_id, $cart_data);
                    if($cart_item_key && $validation) {
                        $in_cart = get_item_qty($cart_item_key) > 1 ? true : false;
                        $new_cart_items = $cart_items + $quantity;
                        $new_cart_total = $cart_total + ($product_price * $quantity);
                        $product_permalink = get_permalink($product_id);
                        $product_thumbnail = get_the_post_thumbnail($product_id, 'product_thumbnail_cart');
                        $product_name = get_the_title($product_id);
                        ob_start();
                        wc_get_template_part( 'cart/mini-cart' );
                        $cart_html = ob_get_contents();
                        ob_end_clean();
                        $has_null = get_free_product();
                        $data = array(
                            'success' => true,
                            'product_id' => $product_id,
                            'cart_item_key' => $cart_item_key,
                            'cart_total' => WC()->cart->get_cart_subtotal(),
                            'in_cart' => $in_cart,
                            'quantity' => WC()->cart->cart_contents_count,
                            'cart' =>  $cart_html,
                            "null_product" => $has_null,
                        );
                    }  else {
                    $_product = wc_get_product($product_id);
                    $cart_id       = WC()->cart->generate_cart_id( $product_id );
                    $cart_item_key = WC()->cart->find_product_in_cart( $cart_id );
                    $new_qty = get_item_qty( $cart_item_key ) + $quantity;
                    if ($_product->get_stock_quantity() < $new_qty) {
                        $data = array(
                            'success' => false,
                            'error' => true,
                            'message'     => "Proizvod nije moguće dodati u košaricu jer trenutno nije dostupan u količini koju ste odabrali.",
                            'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));
                    } else {
                        $data = array(
                            'success' => false,
                            'error' => true,
                            'message'     => "Došlo je do nepoznate pogreške prilikom dodavanja u košaricu. Molimo pokušajte ponovo kasnije.",
                            'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));
                    }
                }
    wp_send_json($data);
    wp_die();
}
add_action('wp_ajax_woocommerce_ajax_get_mini_cart', 'get_mini_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_get_mini_cart', 'get_mini_cart');
function get_mini_cart(){
    header('Content-Type: application/json');
    ob_start();
    wc_get_template_part( 'cart/mini-cart' );
    $cart_html = ob_get_contents();
    ob_end_clean();
    $has_null = get_free_product();
    wp_send_json(array(
        "total" =>  WC()->cart->cart_contents_count ,
        "cart" => $cart_html,
        "null_product" => $has_null,
    ));
    wp_die();
}
add_filter( 'wc_add_to_cart_message_html', 'remove_add_to_cart_message' );
function remove_add_to_cart_message() {
    return false;
}
add_action('wp_ajax_woocommerce_ajax_delete_from_cart', 'woocommerce_ajax_delete_from_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_delete_from_cart', 'woocommerce_ajax_delete_from_cart');
function woocommerce_ajax_delete_from_cart()
{
    $cart_item_id = $_POST['product_id'];
    $cart_item_key = $_POST['product_key'];
    $cart_item_qty = get_item_qty($cart_item_key);
    $cart_items = WC()->cart->cart_contents_count;
    $new_cart_items = $cart_items - $cart_item_qty;
    if ($cart_item_key) {
        WC()->cart->remove_cart_item($cart_item_key);
        define( 'WOOCOMMERCE_CHECKOUT', true );
        define( 'WOOCOMMERCE_CART', true );
        WC()->cart->calculate_totals();
        WC()->cart->calculate_shipping();
        $base_price = wc_price(WC()->cart->total - WC()->cart->tax_total);
        $tax_total = 0;
        foreach ( WC()->cart->get_tax_totals() as $code => $tax ) {
            $tax_total = wp_kses_post($tax->formatted_amount);
        }
        ob_start();
        wc_get_template_part( 'cart/mini-cart' );
        $cart_html = ob_get_contents();
        ob_end_clean();
        ob_start();
        wc_get_template_part( 'cart/cart-content' );
        $main_cart_html = ob_get_contents();
        ob_end_clean();
        $has_null = get_free_product();
        $data = array(
            'cart_items' => $new_cart_items,
            'cart_total' => WC()->cart->get_cart_subtotal(),
            'base_price' => $base_price,
            'tax_total' => $tax_total,
            'quantity'      => WC()->cart->cart_contents_count,
            'cart' => $cart_html,
            'main_cart' => $main_cart_html,
            "null_product" => $has_null,
        );
        echo wp_send_json($data);
        wp_die();
    }
}
add_action('wp_ajax_woocommerce_ajax_change_qt_from_cart', 'woocommerce_ajax_change_qt_from_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_change_qt_from_cart', 'woocommerce_ajax_change_qt_from_cart');
function woocommerce_ajax_change_qt_from_cart()
{
    $cart_item_id = $_POST['product_id'];
    $cart_item_key = $_POST['product_key'];
    $button_action = $_POST['button_action'];
    $cart_item_qty = get_item_qty($cart_item_key);
    $cart_item = WC()->cart->get_cart_item( $cart_item_key );
    if($cart_item["variation"] || $cart_item["variation_id"]) {
        $_product = wc_get_product($cart_item["variation_id"]);
    }else{
        $_product = wc_get_product($cart_item_id);
    }
    if ($_product->regular_price) {
        $cart_item_price = $_product->regular_price;
    }else{
        $cart_item_price = $_product->price;
    }
    
    if($cart_item["variation"] && $cart_item["variation"]["print_type"])
        $print_type = $cart_item["variation"]["print_type"];
    else
        $print_type = 0;
    $cart_item_price = calculate_price_with_print($cart_item_price, $print_type, $cart_item_id, $cart_item["variation"]["print_europa_league"]);
    if ($_product->is_on_sale()){
        $cart_item_sale_price = $_product->sale_price;
        $cart_item_sale_price = calculate_price_with_print($cart_item_sale_price, $print_type, $cart_item_id, $cart_item["variation"]["print_europa_league"]);
    }
    $cart_total = WC()->cart->cart_contents_total;
    $cart_items = WC()->cart->cart_contents_count;
    $print_type = $cart_item["variation"]["print_type"];
    if ($button_action == "down") {
        $new_qty = $cart_item_qty - 1;
        $new_cart_items = $cart_items - 1;
        $new_cart_total = $cart_total - $cart_item_price;
        if($new_qty == 0){
            $new_qty = 1;
        }
    } else {
        $new_qty = $cart_item_qty + 1;
        $new_cart_items = $cart_items + 1;
        $new_cart_total = $cart_total + $cart_item_price;
    }
    if($_product->get_stock_quantity()){
    if ($_product->get_stock_quantity() < $new_qty) {
        $data = array(
            'message' => __("Promjena nije moguća jer proizvod trenutno nije dostupan u količini koju ste odabrali.", 'dinamo_shop_plugin'),
            'success' => false,
            'new_qty' => $cart_item_qty,
        );
        echo wp_send_json($data);
        wp_die();
        return;
    }
    }
        WC()->cart->set_quantity($cart_item_key, $new_qty);
    ob_start();
    define( 'WOOCOMMERCE_CHECKOUT', true );
    define( 'WOOCOMMERCE_CART', true );
    WC()->cart->calculate_totals();
    WC()->cart->calculate_shipping();
    $packages           = WC()->shipping()->get_packages();
    $shipping_price = "";
    foreach ( $packages as $i => $package ) {
        $available_methods = $package['rates'];
        if ($available_methods) {
            foreach ($available_methods as $method) {
                $shipping_price = wc_price($method->cost);
            }
        }
    }
    $base_price = wc_price(WC()->cart->total - WC()->cart->tax_total);
    $base_price_eur = secondary_price_output(WC()->cart->total - WC()->cart->tax_total);
    $tax_total = 0;
    $tax_total_eur = 0;
    foreach ( WC()->cart->get_tax_totals() as $code => $tax ) {
        $tax_total = wp_kses_post($tax->formatted_amount);
        $tax_total_eur = secondary_price_output($tax->amount);
    }
    if ($_product->sale_price != ""){
        $sale_price = wc_price($cart_item_sale_price * $new_qty);
    }
    ob_start();
    wc_get_template_part( 'cart/mini-cart' );
    $cart_html = ob_get_contents();
    ob_end_clean();
        $data = array(
            'cart_items' => $new_cart_items,
            'cart_total' => WC()->cart->get_total(),
            'cart_total_eur' => secondary_price_output(WC()->cart->total),
            'base_price' => $base_price,
            'tax_total' => $tax_total,
            'base_price_eur' => $base_price_eur,
            'tax_total_eur' => $tax_total_eur,
            'item_total' => wc_price($cart_item_price * $new_qty),
            'item_sale_price'=> $sale_price,
            'item_total_eur' => secondary_price_output($cart_item_price * $new_qty),
            'item_sale_price_eur'=> secondary_price_output($cart_item_sale_price * $new_qty),
            'quantity'      => WC()->cart->cart_contents_count,
            'new_qty' => $new_qty,
            'success' => true,
            'cart' =>  $cart_html
        );
    echo wp_send_json($data);
    wp_die();
}
function coupon_check_via_ajax(){
    $code = strtolower(trim($_POST['code']));
    $coupon = new WC_Coupon($code);
    $coupon_post = get_post($coupon->id);
    if(!empty($coupon_post) && $coupon_post != null){
        $message = 'Coupon not valid';
        $status = 0;
        if($coupon_post->post_status == 'publish'){
            $message = 'Coupon validated';
            $status = 1; }
    } else {
        $status = 0;
        $message = 'Coupon not found!';
    }
    global $woocommerce; WC()->cart->remove_coupons();
    $ret = WC()->cart->add_discount( $coupon );
    $array = array('return' => $ret);
    print_r($array);
    //print json_encode( [ 'status' => $status, 'message' => $message, 'poststatus' =>
      //  $coupon_post->post_status,
   // 'coupon_post' => $coupon_post ] );
    exit();
}
add_action( 'wp_ajax_check_coupon_via_ajax', 'coupon_check_via_ajax' );
add_action( 'wp_ajax_nopriv_check_coupon_via_ajax', 'coupon_check_via_ajax' );
add_action('woocommerce_after_checkout_validation', 'not_approved_free_product', 10, 2);
   
function not_approved_free_product($data, $errors) {
    
    $has_null = get_free_product();
    if($has_null){
        $errors->add('error', "Dodali ste proizvod od 0€.<br>
        Ispričavamo se na grešci te Vas molimo da uklonite proizvod prije nastavka");
    }
}