https://t.me/RX1948
Server : Apache/2.4.18 (Ubuntu)
System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64
User : oppastar ( 1041)
PHP Version : 7.0.33-0ubuntu0.16.04.15
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
Directory :  /proc/self/root/var/www/laciasmara.com/public_html/shop/application/controllers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //proc/self/root/var/www/laciasmara.com/public_html/shop/application/controllers/Ajax.php
<?php defined('BASEPATH') or exit('No direct script access allowed');

class Ajax extends Public_Controller
{
  public function __construct()
  {
    parent::__construct();
  }

  //ajax product page select size
  public function ajax_select_size()
  {
    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }
    $quantity = (int) $this->input->post('quantity');
    $id_product = (int) $this->input->post('id_product');
    //get product base price
    $this->db
      ->select('price')
      ->from('products')
      ->where('id_products', $id_product);
    $base_price = $this->db->get()->row()->price;
    //check if the id_product has quantity discount
    $this->db
      ->select('id_quantity_discount')
      ->from('quantity_discount')
      ->where('product_id', $id_product);
    $count_quantity_discount = $this->db->get()->num_rows();
    if ($count_quantity_discount > 0) {
      //get discount for chosen quantity, choosing the closest quantity
      $query = $this->db->query(
        "SELECT discount_percentage FROM quantity_discount WHERE min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
      );
      $row = $query->row();
      if (count($row) > 0) {
        $data['quantity_discounted_price'] =
          $base_price - ($base_price * $row->discount_percentage) / 100;
        $data['quantity_discount_percentage'] = $row->discount_percentage;
      } else {
        //quantity is less than minimum discount rule
        //check if have base normal discount
        $this->db
          ->select('discount_price')
          ->from('products')
          ->where('id_products', $id_product);
        $discount_price = $this->db->get()->row()->discount_price;
        if ($discount_price != 0) {
          $data['discounted_price'] =
            $base_price - ($base_price * $discount_price) / 100;
          $data['discount_percentage'] = $discount_price;
        }
      }
    } else {
      //no quantity discount
      //check if have base normal discount
      $this->db
        ->select('discount_price')
        ->from('products')
        ->where('id_products', $id_product);
      $discount_price = $this->db->get()->row()->discount_price;
      if ($discount_price != 0) {
        $data['discounted_price'] =
          $base_price - ($base_price * $discount_price) / 100;
        $data['discount_percentage'] = $discount_price;
      }
    }
    $data['price'] = $base_price;
    $data['id_product'] = $id_product;
    $this->load->view('ajax/ajax_select_size', $data);
  }

  //ajax product page add product review
  public function ajax_addproductreview()
  {
    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }
    //CPATCHA VALIDATION
    // First, delete old captchas
    $expiration = time() - 7200; // Two hour limit
    $this->db->where('captcha_time < ', $expiration)->delete('captcha');
    // Then see if a captcha exists and match
    $sql =
      'SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?';
    $binds = [$_POST['captcha'], $this->input->ip_address(), $expiration];
    $query = $this->db->query($sql, $binds);
    $row = $query->row();
    if ($row->count == 0) {
      echo '<p style="background-color:red; color:white; padding:5px;">Mohon masukan kode yang benar.</p>';
      exit();
    }
    $product_id = (int) $this->input->post('product_id');
    $rating = $this->input->post('rating');
    $review = $this->security->xss_clean($this->input->post('review'));
    if ($this->input->post('customer_id')) {
      //if customer act as a registered during product review
      $customer_id = (int) $this->input->post('customer_id');
      //get customer name and email
      $this->db
        ->select('name, email')
        ->from('customers')
        ->where('id_customers', $customer_id);
      $customer_data = $this->db->get()->row();
      $data = [
        'product_id' => $product_id,
        'review_date' => date('j M Y'),
        'is_registered' => 'yes',
        'customer_id' => $customer_id,
        'name' => $customer_data->name,
        'email' => $customer_data->email,
        'rating' => $rating,
        'review' => $review,
      ];
    } else {
      //customer act as a guest during product review
      //get value from serialize form data ajax
      $name = $this->security->xss_clean($this->input->post('name'));
      $email = $this->security->xss_clean($this->input->post('email'));
      $data = [
        'product_id' => $product_id,
        'review_date' => date('j M Y'),
        'is_registered' => 'no',
        'name' => $name,
        'email' => $email,
        'rating' => $rating,
        'review' => $review,
      ];
    }
    $this->db->insert('product_review', $data);
    //get all product reviews
    $this->db
      ->select('*')
      ->from('product_review')
      ->where('product_id', $product_id)
      ->order_by('review_date', 'DESC');
    $data['product_reviews'] = $this->db->get()->result();
    $data['product_id'] = $product_id;
    $this->load->view('ajax/ajax_addproductreview', $data);
  }

  //ajax get price

  public function ajax_get_price()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $id_product_detail = (int) $this->input->post('id_product_details');

    $id_product = (int) $this->input->post('id_product');

    //check if $id_product_detail is exist

    $this->db
      ->select('id_product_details')
      ->from('product_details')
      ->where('id_product_details', $id_product_detail);

    $count_id_product_detail = $this->db->get()->num_rows();

    $this->load->helper('category_discount');

    $category_discount_percentage = category_discount($id_product);

    if (isset($this->session->userdata('customer')['customer_id'])) {
      //customer is logged in

      //check if customer is a reseller. if reseller use reseller min quantity

      $this->db
        ->select('reseller_id')
        ->from('customers')
        ->where(
          'id_customers',
          $this->session->userdata('customer')['customer_id']
        );

      $reseller_id = $this->db->get()->row()->reseller_id;

      //check if reseller min quantity already available (already input by admin). If not, display 1 as minimum quantity

      $this->db
        ->select('price')
        ->from('resellers_price')
        ->where('reseller_id', $reseller_id)
        ->where('product_detail_id', $id_product_detail);

      $count_reseller_price = $this->db->get()->num_rows();

      if ($reseller_id != null && $count_reseller_price > 0) {
        //customer is reseller, and data already inputted by admin. so use reseller price

        $this->db
          ->select('price')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_product_detail);

        $data['price'] = $this->db->get()->row()->price;

        $data['discounted_price'] = 0;
      } elseif ($reseller_id != null && $id_product_detail == 0) {
        //customer is a reseller. id_product_detail is 0 because he choose no option with 0 id product details

        //get product detail id (for 1st detail only)

        $this->db
          ->select('id_product_details')
          ->from('product_details')
          ->where('product_id', $id_product)
          ->limit(1);

        $id_product_detail = $this->db->get()->row()->id_product_details;

        $this->db
          ->select('price')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_product_detail);

        $data['price'] = $this->db->get()->row()->price;

        $data['discounted_price'] = 0;
      } elseif ($reseller_id == null || $count_reseller_price == 0) {
        //customer is not a reseller or data not inputted by admin, so use normal price with 0 id product details

        if ($category_discount_percentage != null) {
          //category discount is active

          if ($count_id_product_detail > 0) {
            $this->db
              ->select('price, sku, attributes')
              ->from('product_details')
              ->where('id_product_details', $id_product_detail);

            $prices = $this->db->get()->row();

            $data['price'] = $prices->price;

            $data['discounted_price'] =
              $prices->price -
              ($prices->price * $category_discount_percentage) / 100;
          } else {
            //id_product_details is not available, because customer choose option with 0 id product details

            $this->db
              ->select('price, sku, attributes')
              ->from('product_details')
              ->where('product_id', $id_product)
              ->order_by('id_product_details', 'ASC')
              ->limit(1);

            $prices = $this->db->get()->row();

            $data['price'] = $prices->price;

            $data['discounted_price'] =
              $prices->price -
              ($prices->price * $category_discount_percentage) / 100;
          }
        } else {
          //category discount not active

          if ($count_id_product_detail > 0) {
            //get the initial product price from product_details table

            $this->db
              ->select('price, discounted_price')
              ->from('product_details')
              ->where('id_product_details', $id_product_detail)
              ->order_by('id_product_details', 'ASC')
              ->limit(1);

            $prices = $this->db->get()->row();

            $data['price'] = $prices->price;

            $data['discounted_price'] = $prices->discounted_price;
          } else {
            //id_product_details is not available, because customer choose option with 0 id product details

            $this->db
              ->select('price, discounted_price')
              ->from('product_details')
              ->where('product_id', $id_product)
              ->limit(1);

            $prices = $this->db->get()->row();

            $data['price'] = $prices->price;

            $data['discounted_price'] = $prices->discounted_price;
          }
        }
      }
    } else {
      //if customer is not logged in

      if ($category_discount_percentage != null) {
        //category discount is active

        if ($count_id_product_detail > 0) {
          $this->db
            ->select('price, sku, attributes')
            ->from('product_details')
            ->where('id_product_details', $id_product_detail);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          $data['discounted_price'] =
            $prices->price -
            ($prices->price * $category_discount_percentage) / 100;
        } else {
          //id_product_details is not available, because customer choose option with 0 id product details

          $this->db
            ->select('price, sku, attributes')
            ->from('product_details')
            ->where('product_id', $id_product)
            ->order_by('id_product_details', 'ASC')
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          $data['discounted_price'] =
            $prices->price -
            ($prices->price * $category_discount_percentage) / 100;
        }
      } else {
        //category discount not active

        if ($count_id_product_detail > 0) {
          //get the initial product price from product_details table

          $this->db
            ->select('price, discounted_price')
            ->from('product_details')
            ->where('id_product_details', $id_product_detail)
            ->order_by('id_product_details', 'ASC')
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          $data['discounted_price'] = $prices->discounted_price;
        } else {
          //id_product_details is not available, because customer choose option with 0 id product details

          $this->db
            ->select('price, discounted_price')
            ->from('product_details')
            ->where('product_id', $id_product)
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          $data['discounted_price'] = $prices->discounted_price;
        }
      }
    }

    $this->load->view('ajax/ajax_get_price', $data);
  }

  //ajax get sku. stock, weight

  public function ajax_get_productdetails()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $id_product_detail = (int) $this->input->post('id_product_details');

    $id_product = (int) $this->input->post('id_product');

    //check if $id_product_detail is exist

    $this->db
      ->select('id_product_details')
      ->from('product_details')
      ->where('id_product_details', $id_product_detail);

    $count_id_product_detail = $this->db->get()->num_rows();

    if ($count_id_product_detail > 0) {
      $this->db
        ->select('sku, weight, stock')
        ->from('product_details')
        ->where('id_product_details', $id_product_detail);

      $product_details = $this->db->get()->row();

      $data['sku'] = $product_details->sku;

      $data['weight'] = $product_details->weight;

      $data['stock'] = $product_details->stock;
    } else {
      //id_product_details is not available, because customer choose option with 0 id product details

      $this->db
        ->select('sku, weight, stock')
        ->from('product_details')
        ->where('product_id', $id_product)
        ->order_by('id_product_details', 'ASC')
        ->limit(1);

      $product_details = $this->db->get()->row();

      $data['sku'] = $product_details->sku;

      $data['weight'] = $product_details->weight;

      $data['stock'] = $product_details->stock;
    }

    //get product code (SKU), weight, and stock display status

    $this->db
      ->select('show_product_sku, show_product_weight, show_product_stock')
      ->from('configuration')
      ->where('id_configuration', 1);

    $display_status = $this->db->get()->row();

    $data['display_sku'] = $display_status->show_product_sku;

    $data['display_weight'] = $display_status->show_product_weight;

    $data['display_stock'] = $display_status->show_product_stock;

    $this->load->view('ajax/ajax_get_productdetails', $data);
  }

  //ajax get quantity discount

  public function ajax_get_quantity_discount()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $id_product_detail = (int) $this->input->post('id_product_details');

    $id_product = (int) $this->input->post('id_product');

    //GET THE PRICE

    //get initial min quantity

    if (isset($this->session->userdata('customer')['customer_id'])) {
      //customer is logged in

      //check if customer is a reseller. if reseller use reseller min quantity

      $this->db
        ->select('reseller_id')
        ->from('customers')
        ->where(
          'id_customers',
          $this->session->userdata('customer')['customer_id']
        );

      $reseller_id = $this->db->get()->row()->reseller_id;

      //check if reseller min quantity already available (already input by admin). If not, display 1 as minimum quantity

      $this->db
        ->select('price')
        ->from('resellers_price')
        ->where('reseller_id', $reseller_id)
        ->where('product_detail_id', $id_product_detail);

      $count_reseller_price = $this->db->get()->num_rows();

      if ($reseller_id != null && $count_reseller_price > 0) {
        //customer is reseller, and data already inputted by admin. so use reseller price

        $this->db
          ->select('price')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_product_detail);

        $data['price'] = $this->db->get()->row()->price;

        $data['discounted_price'] = 0;
      } elseif ($reseller_id != null && $id_product_detail == 0) {
        //customer is a reseller. id_product_detail is 0 because he choose no option with 0 id product details

        //get product detail id (for 1st detail only)

        $this->db
          ->select('id_product_details')
          ->from('product_details')
          ->where('product_id', $id_product)
          ->limit(1);

        $id_product_detail = $this->db->get()->row()->id_product_details;

        $this->db
          ->select('price')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_product_detail);

        $data['price'] = $this->db->get()->row()->price;

        $data['discounted_price'] = 0;
      } elseif ($reseller_id == null || $count_reseller_price == 0) {
        //customer is not a reseller or data already inputted by admin, so use normal price with 0 id product details

        //check if $id_product_detail is exist

        $this->db
          ->select('id_product_details')
          ->from('product_details')
          ->where('id_product_details', $id_product_detail);

        $count_id_products = $this->db->get()->num_rows();

        if ($count_id_products > 0) {
          //get the initial product price from product_details table

          $this->db
            ->select('price, discounted_price')
            ->from('product_details')
            ->where('id_product_details', $id_product_detail)
            ->order_by('id_product_details', 'ASC')
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          $data['discounted_price'] = $prices->discounted_price;
        } else {
          //id_product_details is not available, because customer choose option with 0 id product details

          $this->db
            ->select('price, discounted_price')
            ->from('product_details')
            ->where('product_id', $id_product)
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          $data['discounted_price'] = $prices->discounted_price;
        }
      }
    } else {
      //if customer is not logged in

      //check if $id_product_detail is exist

      $this->db
        ->select('id_product_details')
        ->from('product_details')
        ->where('id_product_details', $id_product_detail);

      $count_id_products = $this->db->get()->num_rows();

      if ($count_id_products > 0) {
        //get the initial product price from product_details table

        $this->db
          ->select('price, discounted_price')
          ->from('product_details')
          ->where('id_product_details', $id_product_detail)
          ->order_by('id_product_details', 'ASC')
          ->limit(1);

        $prices = $this->db->get()->row();

        $data['price'] = $prices->price;

        $data['discounted_price'] = $prices->discounted_price;
      } else {
        //id_product_details is not available, because customer choose option with 0 id product details

        $this->db
          ->select('price, discounted_price')
          ->from('product_details')
          ->where('product_id', $id_product)
          ->limit(1);

        $prices = $this->db->get()->row();

        $data['price'] = $prices->price;

        $data['discounted_price'] = $prices->discounted_price;
      }
    }

    //GET THE QUANTITY

    //check whether quantity_discount_active is no, retail only, reseller only, or both

    $this->db
      ->select('quantity_discount_active')
      ->from('products')
      ->where('id_products', $id_product);

    $quantity_discount_active = $this->db->get()->row()
      ->quantity_discount_active;

    //check quantity discount if exist

    $this->db
      ->select('id_quantity_discount')
      ->from('quantity_discount')
      ->where('product_id', $id_product);

    $count_quantity_discount = $this->db->get()->num_rows();

    if (isset($this->session->userdata('customer')['customer_id'])) {
      //customer is loggedin

      //check if customer is a reseller

      $this->db
        ->select('reseller_id')
        ->from('customers')
        ->where(
          'id_customers',
          $this->session->userdata('customer')['customer_id']
        );

      $reseller_id = $this->db->get()->row()->reseller_id;

      if ($reseller_id != null) {
        //this is a reseller

        //display quantity discount

        if (
          $quantity_discount_active == 'reseller' ||
          $quantity_discount_active == 'retail-reseller'
        ) {
          if ($count_quantity_discount > 0) {
            //quantity discount exist. get quantity discount

            $this->db
              ->select('*')
              ->from('quantity_discount')
              ->where('product_id', $id_product)
              ->order_by('min_quantity', 'ASC');

            $data['quantity_discount'] = $this->db->get()->result();
          }
        }
      } else {
        //this is a regular customer

        //display quantity discount

        if (
          $quantity_discount_active == 'retail' ||
          $quantity_discount_active == 'retail-reseller'
        ) {
          if ($count_quantity_discount > 0) {
            //quantity discount exist. get quantity discount

            $this->db
              ->select('*')
              ->from('quantity_discount')
              ->where('product_id', $id_product)
              ->order_by('min_quantity', 'ASC');

            $data['quantity_discount'] = $this->db->get()->result();
          }
        }
      }
    } else {
      //customer is not loggedin

      //display quantity discount

      if (
        $quantity_discount_active == 'retail' ||
        $quantity_discount_active == 'retail-reseller'
      ) {
        if ($count_quantity_discount > 0) {
          //quantity discount exist. get quantity discount

          $this->db
            ->select('*')
            ->from('quantity_discount')
            ->where('product_id', $id_product)
            ->order_by('min_quantity', 'ASC');

          $data['quantity_discount'] = $this->db->get()->result();
        }
      }
    }

    $this->load->view('ajax/ajax_get_quantity_discount', $data);
  }

  //ajax ajax_get_quantity_discount_price

  public function ajax_get_quantity_discount_price()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $id_product_detail = (int) $this->input->post('id_product_details');

    $id_product = (int) $this->input->post('id_product');

    $quantity = (int) $this->input->post('product_quantity');

    $this->load->helper('category_discount');

    $category_discount_percentage = category_discount($id_product);

    if (isset($this->session->userdata('customer')['customer_id'])) {
      //customer is logged in

      //check if customer is a reseller. if reseller use reseller discounted price

      $this->db
        ->select('reseller_id')
        ->from('customers')
        ->where(
          'id_customers',
          $this->session->userdata('customer')['customer_id']
        );

      $reseller_id = $this->db->get()->row()->reseller_id;

      //check if reseller min quantity already available (already input by admin)

      $this->db
        ->select('price')
        ->from('resellers_price')
        ->where('reseller_id', $reseller_id)
        ->where('product_detail_id', $id_product_detail);

      $count_reseller_price = $this->db->get()->num_rows();

      //check if the id_product has quantity discount

      $this->db
        ->select('id_quantity_discount')
        ->from('quantity_discount')
        ->where('product_id', $id_product);

      $count_quantity_discount = $this->db->get()->num_rows();

      if ($reseller_id != null && $count_reseller_price > 0) {
        //customer is reseller, and data already inputted by admin. so use reseller price

        $this->db
          ->select('price')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_product_detail);

        $data['price'] = $this->db->get()->row()->price;

        if ($count_quantity_discount > 0) {
          //count if min_quantity <= '$quantity' is exist

          $query = $this->db->query(
            "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
          );

          $count_discount_percentage = $query->num_rows();

          if ($count_discount_percentage > 0) {
            $query = $this->db->query(
              "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
            );

            $discount_percentage = $query->row()->discount_percentage;

            $data['discounted_price'] =
              $data['price'] - ($data['price'] * $discount_percentage) / 100;
          } else {
            $data['discounted_price'] = 0;
          }
        } else {
          $data['discounted_price'] = 0;
        }
      } elseif ($reseller_id != null && $id_product_detail == 0) {
        //customer is a reseller. id_product_detail is 0 because he choose no option with 0 id product details

        //get product detail id (for 1st detail only)

        $this->db
          ->select('id_product_details')
          ->from('product_details')
          ->where('product_id', $id_product)
          ->limit(1);

        $id_product_detail = $this->db->get()->row()->id_product_details;

        $this->db
          ->select('price')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_product_detail);

        $data['price'] = $this->db->get()->row()->price;

        if ($count_quantity_discount > 0) {
          //count if min_quantity <= '$quantity' is exist

          $query = $this->db->query(
            "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
          );

          $count_discount_percentage = $query->num_rows();

          if ($count_discount_percentage > 0) {
            $query = $this->db->query(
              "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
            );

            $discount_percentage = $query->row()->discount_percentage;

            $data['discounted_price'] =
              $data['price'] - ($data['price'] * $discount_percentage) / 100;
          } else {
            $data['discounted_price'] = 0;
          }
        } else {
          $data['discounted_price'] = 0;
        }
      } elseif ($reseller_id == null || $count_reseller_price == 0) {
        //customer is not a reseller or data not yet inputted by admin, so use normal price with 0 id product details

        if ($id_product_detail != 0) {
          //product detail is not 0, means customer did choose an option

          //get the initial product price from product_details table

          $this->db
            ->select('price')
            ->from('product_details')
            ->where('id_product_details', $id_product_detail)
            ->order_by('id_product_details', 'ASC')
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          //check if the id_product has quantity discount

          $this->db
            ->select('id_quantity_discount')
            ->from('quantity_discount')
            ->where('product_id', $id_product);

          $count_quantity_discount = $this->db->get()->num_rows();

          if ($count_quantity_discount > 0) {
            //count if min_quantity <= '$quantity' is exist

            $query = $this->db->query(
              "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
            );

            $count_discount_percentage = $query->num_rows();

            if ($count_discount_percentage > 0) {
              $query = $this->db->query(
                "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
              );

              $discount_percentage = $query->row()->discount_percentage;

              $data['discounted_price'] =
                $data['price'] - ($data['price'] * $discount_percentage) / 100;
            } else {
              if ($category_discount_percentage != null) {
                //category discount is active

                $this->db
                  ->select('price, discounted_price')
                  ->from('product_details')
                  ->where('id_product_details', $id_product_detail);

                $prices = $this->db->get()->row();

                $data['discounted_price'] =
                  $prices->price -
                  ($prices->price * $category_discount_percentage) / 100;
              } else {
                //category discount is not active

                $this->db
                  ->select('discounted_price')
                  ->from('product_details')
                  ->where('id_product_details', $id_product_detail);

                $data['discounted_price'] = $this->db->get()->row()->discounted_price;
              }
            }
          } else {
            //no quantity discount

            $this->db
              ->select('discounted_price')
              ->from('product_details')
              ->where('id_product_details', $id_product_detail);

            $data['discounted_price'] = $this->db->get()->row()->discounted_price;
          }
        } else {
          //id_product_details is not available, because customer choose option with 0 id product details

          $this->db
            ->select('price')
            ->from('product_details')
            ->where('product_id', $id_product)
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          //check if the id_product has quantity discount

          $this->db
            ->select('id_quantity_discount')
            ->from('quantity_discount')
            ->where('product_id', $id_product);

          $count_quantity_discount = $this->db->get()->num_rows();

          if ($count_quantity_discount > 0) {
            //count if min_quantity <= '$quantity' is exist

            $query = $this->db->query(
              "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
            );

            $count_discount_percentage = $query->num_rows();

            if ($count_discount_percentage > 0) {
              $query = $this->db->query(
                "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
              );

              $discount_percentage = $query->row()->discount_percentage;

              $data['discounted_price'] =
                $data['price'] - ($data['price'] * $discount_percentage) / 100;
            } else {
              if ($category_discount_percentage != null) {
                //category discount is active

                $this->db
                  ->select('price')
                  ->from('product_details')
                  ->where('product_id', $id_product)
                  ->limit(1);

                $prices = $this->db->get()->row();

                $data['discounted_price'] =
                  $prices->price -
                  ($prices->price * $category_discount_percentage) / 100;
              } else {
                //category discount is not active

                $this->db
                  ->select('discounted_price')
                  ->from('product_details')
                  ->where('product_id', $id_product)
                  ->limit(1);

                $data['discounted_price'] = $this->db->get()->row()->discounted_price;
              }
            }
          } else {
            //no quantity discount

            if ($category_discount_percentage != null) {
              //category discount is active

              $this->db
                ->select('price')
                ->from('product_details')
                ->where('product_id', $id_product)
                ->limit(1);

              $prices = $this->db->get()->row();

              $data['discounted_price'] =
                $prices->price -
                ($prices->price * $category_discount_percentage) / 100;
            } else {
              //category discount is not active

              $this->db
                ->select('discounted_price')
                ->from('product_details')
                ->where('product_id', $id_product)
                ->limit(1);

              $data['discounted_price'] = $this->db->get()->row()->discounted_price;
            }
          }
        }
      }
    } else {
      //if customer is not logged in

      if ($id_product_detail != 0) {
        //product detail is not 0, means customer did choose an option

        if ($category_discount_percentage != null) {
          //category discount is active

          $this->db
            ->select('price')
            ->from('product_details')
            ->where('id_product_details', $id_product_detail);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          $data['discounted_price'] =
            $prices->price -
            ($prices->price * $category_discount_percentage) / 100;
        } else {
          //category discount is not active

          //get the initial product price from product_details table

          $this->db
            ->select('price')
            ->from('product_details')
            ->where('id_product_details', $id_product_detail);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;
        }

        //check if the id_product has quantity discount

        $this->db
          ->select('id_quantity_discount')
          ->from('quantity_discount')
          ->where('product_id', $id_product);

        $count_quantity_discount = $this->db->get()->num_rows();

        if ($count_quantity_discount > 0) {
          //count if min_quantity <= '$quantity' is exist

          $query = $this->db->query(
            "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
          );

          $count_discount_percentage = $query->num_rows();

          if ($count_discount_percentage > 0) {
            $query = $this->db->query(
              "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
            );

            $discount_percentage = $query->row()->discount_percentage;

            $data['discounted_price'] =
              $data['price'] - ($data['price'] * $discount_percentage) / 100;
          } else {
            if ($category_discount_percentage != null) {
              //category discount is active

              $this->db
                ->select('price')
                ->from('product_details')
                ->where('id_product_details', $id_product_detail);

              $prices = $this->db->get()->row();

              $data['discounted_price'] =
                $prices->price -
                ($prices->price * $category_discount_percentage) / 100;
            } else {
              //category discount is not active

              $this->db
                ->select('discounted_price')
                ->from('product_details')
                ->where('id_product_details', $id_product_detail);

              $data['discounted_price'] = $this->db->get()->row()->discounted_price;
            }
          }
        } else {
          //no quantity discount

          $this->db
            ->select('discounted_price')
            ->from('product_details')
            ->where('id_product_details', $id_product_detail);

          $data['discounted_price'] = $this->db->get()->row()->discounted_price;
        }
      } else {
        //id_product_details is not available, because customer choose option with 0 id product details

        if ($category_discount_percentage != null) {
          //category discount is active

          $this->db
            ->select('price')
            ->from('product_details')
            ->where('product_id', $id_product)
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;

          $data['discounted_price'] =
            $prices->price -
            ($prices->price * $category_discount_percentage) / 100;
        } else {
          //category discount is not active

          $this->db
            ->select('price')
            ->from('product_details')
            ->where('product_id', $id_product)
            ->limit(1);

          $prices = $this->db->get()->row();

          $data['price'] = $prices->price;
        }

        //check if the id_product has quantity discount

        $this->db
          ->select('id_quantity_discount')
          ->from('quantity_discount')
          ->where('product_id', $id_product);

        $count_quantity_discount = $this->db->get()->num_rows();

        if ($count_quantity_discount > 0) {
          //count if min_quantity <= '$quantity' is exist

          $query = $this->db->query(
            "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
          );

          $count_discount_percentage = $query->num_rows();

          if ($count_discount_percentage > 0) {
            $query = $this->db->query(
              "SELECT discount_percentage FROM quantity_discount WHERE product_id = '$id_product' AND  min_quantity <= '$quantity' ORDER BY ABS(min_quantity - '$quantity') LIMIT 1"
            );

            $discount_percentage = $query->row()->discount_percentage;

            $data['discounted_price'] =
              $data['price'] - ($data['price'] * $discount_percentage) / 100;
          } else {
            if ($category_discount_percentage != null) {
              //category discount is active

              $this->db
                ->select('price')
                ->from('product_details')
                ->where('product_id', $id_product)
                ->limit(1);

              $prices = $this->db->get()->row();

              $data['discounted_price'] =
                $prices->price -
                ($prices->price * $category_discount_percentage) / 100;
            } else {
              //category discount is not active

              $this->db
                ->select('discounted_price')
                ->from('product_details')
                ->where('product_id', $id_product)
                ->limit(1);

              $data['discounted_price'] = $this->db->get()->row()->discounted_price;
            }
          }
        } else {
          //no quantity discount

          if ($category_discount_percentage != null) {
            //category discount is active

            $this->db
              ->select('price')
              ->from('product_details')
              ->where('product_id', $id_product)
              ->limit(1);

            $prices = $this->db->get()->row();

            $data['discounted_price'] =
              $prices->price -
              ($prices->price * $category_discount_percentage) / 100;
          } else {
            //category discount is not active

            $this->db
              ->select('discounted_price')
              ->from('product_details')
              ->where('product_id', $id_product)
              ->limit(1);

            $data['discounted_price'] = $this->db->get()->row()->discounted_price;
          }
        }
      }
    }

    $this->load->view('ajax/ajax_get_price', $data);
  }

  //ajax get product purchase min quantity

  public function ajax_get_min_quantity()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $id_product_detail = (int) $this->input->post('id_product_details');

    $id_product = (int) $this->input->post('id_product');

    //get initial min quantity

    if (isset($this->session->userdata('customer')['customer_id'])) {
      //customer is logged in

      //check if customer is a reseller. if reseller use reseller min quantity

      $this->db
        ->select('reseller_id')
        ->from('customers')
        ->where(
          'id_customers',
          $this->session->userdata('customer')['customer_id']
        );

      $reseller_id = $this->db->get()->row()->reseller_id;

      //check if reseller min quantity already available (already input by admin). If not, display 1 as minimum quantity

      $this->db
        ->select('min_quantity')
        ->from('resellers_price')
        ->where('reseller_id', $reseller_id)
        ->where('product_detail_id', $id_product_detail);

      $count_reseller = $this->db->get()->num_rows();

      if ($reseller_id != null && $count_reseller > 0) {
        //customer is reseller, and data already inputtedby admin. so use reseller min quantity

        $this->db
          ->select('min_quantity')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_product_detail);

        $data['reseller_min_quantity'] = $this->db->get()->row()->min_quantity;
      } elseif ($reseller_id == null) {
        $data['reseller_min_quantity'] = 1;
      } elseif ($reseller_id != null && $count_reseller == 0) {
        //customer is a reseller, but data not input yet, or customer choose empty option..

        //then give default reseller min quantity

        //get id_product_details

        $this->db
          ->select('id_product_details')
          ->from('product_details')
          ->where('product_id', $id_product)
          ->order_by('id_product_details', 'ASC')
          ->limit(1);

        $id_default_product_detail = $this->db->get()->row()
          ->id_product_details;

        //get default reseller min quantity

        $this->db
          ->select('min_quantity')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_default_product_detail);

        $data['reseller_min_quantity'] = $this->db->get()->row()->min_quantity;
      }
    } else {
      //if customer is not logged in

      //set min quantity as 1

      $data['reseller_min_quantity'] = 1;
    }

    echo $data['reseller_min_quantity'];
  }

  //ajax get product purchase min quantity

  public function ajax_get_quantity_options()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $id_product_detail = (int) $this->input->post('id_product_details');

    $id_product = (int) $this->input->post('id_product');

    //get min quantity

    if (isset($this->session->userdata('customer')['customer_id'])) {
      //customer is logged in

      //check if customer is a reseller. if reseller use reseller min quantity

      $this->db
        ->select('reseller_id')
        ->from('customers')
        ->where(
          'id_customers',
          $this->session->userdata('customer')['customer_id']
        );

      $reseller_id = $this->db->get()->row()->reseller_id;

      //check if reseller min quantity already available (already input by admin). If not, display 1 as minimum quantity

      $this->db
        ->select('min_quantity')
        ->from('resellers_price')
        ->where('reseller_id', $reseller_id)
        ->where('product_detail_id', $id_product_detail);

      $count_reseller = $this->db->get()->num_rows();

      if ($reseller_id != null && $count_reseller > 0) {
        //customer is reseller, and data already inputtedby admin. so use reseller min quantity

        $this->db
          ->select('min_quantity')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_product_detail);

        $data['reseller_min_quantity'] = $this->db->get()->row()->min_quantity;
      } elseif ($reseller_id == null) {
        $data['reseller_min_quantity'] = 1;
      } elseif ($reseller_id != null && $count_reseller == 0) {
        //customer is a reseller, but data not input yet, or customer choose empty option..

        //then give default reseller min quantity

        //get id_product_details

        $this->db
          ->select('id_product_details')
          ->from('product_details')
          ->where('product_id', $id_product)
          ->order_by('id_product_details', 'ASC')
          ->limit(1);

        $id_default_product_detail = $this->db->get()->row()
          ->id_product_details;

        //get default reseller min quantity

        $this->db
          ->select('min_quantity')
          ->from('resellers_price')
          ->where('reseller_id', $reseller_id)
          ->where('product_detail_id', $id_default_product_detail);

        $data['reseller_min_quantity'] = $this->db->get()->row()->min_quantity;
      }
    } else {
      //if customer is not logged in

      //set min quantity as 1

      $data['reseller_min_quantity'] = 1;
    }

    $this->load->view('ajax/ajax_get_quantity_options', $data);
  }

  public function ajax_get_cart()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $json_data = [];

    $this->load->helper('cart');
    $json_data['cart_content'] = $this->load->view(
      "themes/$this->theme_no/ajax/ajax_cart_popup",
      '',
      true
    );
    $json_data['cart_count'] = count_cart_content();

    echo json_encode($json_data);
  }

  //ajax product page add to cart
  public function ajax_add_to_cart()
  {
    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $this->load->library('cart');

    $product_id = $this->input->post('product_id');
    $attribute_detail_ids = $this->input->post('attribute_detail_ids'); // get all chosen attribute detail ids

    //get product details id from product_combination
    $correct_product_detail_id = null;
    $this->db->distinct(); //only get 1 unique value of product_details_id
    $this->db
      ->select('product_details_id')
      ->from('product_combination')
      ->where('product_id', $product_id)
      ->where_in('attribute_detail_id', $attribute_detail_ids);
    $product_details_ids = $this->db->get()->result();

    foreach ($product_details_ids as $product_details_id) {
      $this->db
        ->select('attribute_detail_id')
        ->from('product_combination')
        ->where('product_details_id', $product_details_id->product_details_id);
      $attribute_detail_check_ids = $this->db->get()->result();

      $result_check = [];

      foreach ($attribute_detail_check_ids as $id) {
        $result_check[] = $id->attribute_detail_id;
      }

      $array_match = array_intersect($attribute_detail_ids, $result_check);

      if (count($array_match) == count($attribute_detail_ids)) {
        $correct_product_detail_id = $product_details_id->product_details_id;
      }
    }

    if ($correct_product_detail_id != null) {
      //get product name
      $product_data = $this->db
        ->select('title, indent_dp')
        ->from('products')
        ->where('id_products', $product_id)
        ->get()
        ->row();

      $data['qty'] = (int) $this->input->post('qty');

      //get product price
      $product_detail_data = $this->db
        ->select('price, discounted_price, is_indent, sku')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row();

      $product_flashsale = $this->db
        ->select('flashsale_products.*, flashsale.status')
        ->from('flashsale_products')
        ->join('flashsale', 'flashsale_products.flashsale_id=flashsale.id')
        ->where('flashsale_products.product_id', $product_id)
        ->where(
          'flashsale_products.product_details_id',
          $correct_product_detail_id
        )
        ->get();

      $is_indent = $product_detail_data->is_indent;
      $price = $product_detail_data->price;
      $discounted_price = $product_detail_data->discounted_price;
      $sku = $product_detail_data->sku;

      if ($discounted_price > 0) {
        $data['price'] = $discounted_price;
      } else {
        $data['price'] = $price;
      }

      $reseller_id = $this->db
        ->select('reseller_id')
        ->from('customers')
        ->where(
          'id_customers',
          $this->session->userdata('customer')['customer_id']
        )
        ->get()
        ->row()->reseller_id;

      if ($product_flashsale->num_rows() > 0) {
        if ($product_flashsale->row()->status = 'active') {
          $data['price'] = $product_flashsale->row()->discounted_price;
        }
      } else {
        if ($reseller_id != null) {
          $reseller_price = $this->db
            ->select('price')
            ->from('resellers_price')
            ->where('product_detail_id', $correct_product_detail_id)
            ->where('reseller_id', $reseller_id)
            ->get()
            ->row()->price;

          $data['price'] = $reseller_price;
        }
      }

      //check all stock
      $stock = $this->db
        ->select_sum('stock')
        ->from('stock')
        ->where('id_product', $product_id)
        ->where('warehouse_id', 1)
        ->where('id_product_detail', $correct_product_detail_id)
        ->get()
        ->row()->stock;

      $stock_keep = $this->db
        ->select_sum('stock_keep')
        ->from('stock')
        ->where('id_product', $product_id)
        ->where('warehouse_id', 1)
        ->where('id_product_detail', $correct_product_detail_id)
        ->get()
        ->row()->stock_keep;

      $total_stock = $stock - $stock_keep;
      if ($total_stock > 0) {
        //get current cart qty for this product detail
        $current_qty = 0;
        foreach ($this->cart->contents() as $item) {
          if ($item['id'] == $correct_product_detail_id) {
            $current_qty = $current_qty + $item['qty'];
          }
        }

        //check if total stock is less or equal to purchase qty
        if ($total_stock >= $data['qty'] + $current_qty) {
          //stock is enough
          $data['options']['stock_condition'] = 'In Stock';
        } else {
          //stock is not enough
          $not_enough_stock = 'yes';
        }
      } else {
        //stock is 0. check if indent is allow
        $is_indent = $this->db
          ->select('is_indent')
          ->from('product_details')
          ->where('id', $correct_product_detail_id)
          ->where('product_id', $product_id)
          ->get()
          ->row()->is_indent;

        if ($is_indent == 'yes') {
          $data['options']['stock_condition'] = 'Indent';

          if ($discounted_price > 0) {
            $data['options']['downpayment_price'] =
              $data['price'] * ($product_data->indent_dp / 100);
          } else {
            $data['options']['downpayment_price'] =
              $data['price'] * ($product_data->indent_dp / 100);
          }

          if ($product_flashsale->num_rows() > 0) {
            if ($product_flashsale->row()->status = 'active') {
              $data['options']['downpayment_price'] =
                $product_flashsale->row()->discounted_price *
                ($product_data->indent_dp / 100);
            }
          } else {
            if ($reseller_id != null) {
              $reseller_price = $this->db
                ->select('price')
                ->from('resellers_price')
                ->where('product_detail_id', $correct_product_detail_id)
                ->where('reseller_id', $reseller_id)
                ->get()
                ->row()->price;

              $data['price'] = $reseller_price;
            }
          }

          $data['options']['dp_percentage'] = $product_data->indent_dp;

          $data['options']['indent_message'] =
            '<span style="font-size:12px">DP IDR ' .
            number_format($data['options']['downpayment_price'], 0, ',', '.') .
            ' (' .
            $product_data->indent_dp .
            '%)</span>';
        } else {
          //stock is not enough
          $not_enough_stock = 'yes';
        }
      }
    }

    if (isset($not_enough_stock)) {
      echo 'no stock';
    } else {
      $data['id'] = $correct_product_detail_id;
      $data['name'] = $product_data->title;
      $data['options']['attribute_detail_ids'] = $attribute_detail_ids;
      $data['options']['sku'] = $sku;

      //check if this item has discount
      $discount_price = $this->db
        ->select('discounted_price')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row()->discounted_price;

      if ($discount_price > 0) {
        $data['options']['has_discount'] = 'yes';
      } else {
        $data['options']['has_discount'] = 'no';
      }

      $this->cart->product_name_rules = '[:print:]'; //this is to eliminate cart product name restriction on special characters
      $this->cart->insert($data);
      $this->load->helper('cart');
      $json_data['cart_content'] = $this->load->view(
        "themes/$this->theme_no/ajax/ajax_cart_popup",
        '',
        true
      );
      $json_data['cart_count'] = count_cart_content();

      echo json_encode($json_data);
    }
  }

  public function ajax_remove_cart()
  {
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $rowid = $this->input->post('rowid');

    if ($rowid == 'all') {
      $this->cart->destroy();
    } else {
      $data = [
        'rowid' => $rowid,
        'qty' => 0,
      ];
      $this->cart->update($data);
    }

    $json_data = [];

    $this->load->helper('cart');
    $json_data['cart_content'] = $this->load->view(
      "themes/$this->theme_no/ajax/ajax_cart_popup",
      '',
      true
    );
    $json_data['cart_count'] = count_cart_content();

    echo json_encode($json_data);
  }

  //callback function validation cek stock available when add to cart

  public function cek_stock()
  {
    $id_product_details = (int) $this->input->post('product_size');

    $chosen_quantity = (int) $this->input->post('qty');

    //get current stock froms product_details table

    $this->db->select('stock');

    $this->db->from('product_details');

    $this->db->where('id_product_details', $id_product_details);

    $query = $this->db->get();

    $current_stock = (int) $query->row()->stock;

    //check if quantity is less or equal to current stock

    if ($chosen_quantity > $current_stock) {
      return false;
    } else {
      return true;
    }
  }

  public function ajax_get_district()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $province_id = (int) $this->input->post('id_province');

    //check districts table if province_id already available

    $this->db
      ->select('id_indonesia_districts')
      ->from('indonesia_districts')
      ->where('indonesia_id_province', $province_id);

    $count_districts = $this->db->get()->num_rows();

    if ($count_districts > 0) {
      //districts already available, get the districts

      $this->db
        ->select('rajaongkir_id_district, district')
        ->from('indonesia_districts')
        ->where('indonesia_id_province', $province_id);

      $data['districts'] = $this->db->get()->result();
    } else {
      //districts not available yet..then get rajaongkir data and store into districts table

      $this->load->helper('rajaongkir');

      //get list of districts from RajaOngkir.com API

      $districts = get_rajaongkir_data('city?province=' . $province_id); //get from helper file

      foreach ($districts['rajaongkir']['results'] as $district) {
        //check first if rajaongkir district_id already exist..

        $this->db
          ->select('rajaongkir_id_district')
          ->from('indonesia_districts')
          ->where('rajaongkir_id_district', $district['city_id']);

        $count_districts = $this->db->get()->num_rows();

        if ($count_districts == 0) {
          //can input new data, because still empty

          //insert into districts database

          $data = [
            'rajaongkir_id_district' => $district['city_id'],

            'district' => $district['city_name'],

            'indonesia_id_province' => $province_id,
          ];

          $this->db->insert('indonesia_districts', $data);
        }
      }

      //districts should be available now, get the districts

      $this->db
        ->select('rajaongkir_id_district, district')
        ->from('indonesia_districts')
        ->where('indonesia_id_province', $province_id);

      $data['districts'] = $this->db->get()->result();
    }

    $this->load->view('ajax/ajax_get_district', $data);
  }

  public function ajax_get_shipping_district()
  {
    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $shipping_province_id = (int) $this->input->post('id_shipping_province');

    //check districts table if province_id already available
    $this->db
      ->select('id_indonesia_districts')
      ->from('indonesia_districts')
      ->where('indonesia_id_province', $shipping_province_id);
    $count_districts = $this->db->get()->num_rows();

    if ($count_districts > 0) {
      //districts already available, get the districts
      $this->db
        ->select('rajaongkir_id_district, district')
        ->from('indonesia_districts')
        ->where('indonesia_id_province', $shipping_province_id);
      $data['shipping_districts'] = $this->db->get()->result();
    } else {
      //districts not available yet..then get rajaongkir data and store into districts table
      $this->load->helper('rajaongkir');
      //get list of districts from RajaOngkir.com API
      $districts = get_rajaongkir_data(
        'city?province=' . $shipping_province_id
      ); //get from helper file

      foreach ($districts['rajaongkir']['results'] as $district) {
        //check first if rajaongkir district_id already exist..
        $this->db
          ->select('rajaongkir_id_district')
          ->from('indonesia_districts')
          ->where('rajaongkir_id_district', $district['city_id']);
        $count_districts = $this->db->get()->num_rows();

        if ($count_districts == 0) {
          //can input new data, because still empty
          //insert into districts database
          $data = [
            'rajaongkir_id_district' => $district['city_id'],
            'district' => $district['city_name'],
            'indonesia_id_province' => $shipping_province_id,
          ];
          $this->db->insert('indonesia_districts', $data);
        }
      }

      //districts should be available now, get the districts
      $this->db
        ->select('rajaongkir_id_district, district')
        ->from('indonesia_districts')
        ->where('indonesia_id_province', $shipping_province_id);
      $data['shipping_districts'] = $this->db->get()->result();
    }

    $this->load->view('ajax/ajax_get_shipping_district', $data);
  }

  public function ajax_get_subdistrict()
  {
    //if(!$_POST) { show_404(); }

    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $district_id = (int) $this->input->post('id_district');

    //check subdistricts table if district_id already available

    $this->db
      ->select('id_indonesia_subdistricts')
      ->from('indonesia_subdistricts')
      ->where('indonesia_id_district', $district_id);

    $count_subdistricts = $this->db->get()->num_rows();

    if ($count_subdistricts > 0) {
      //subdistricts already available, get the subdistricts

      $this->db
        ->select('rajaongkir_id_subdistrict, subdistrict')
        ->from('indonesia_subdistricts')
        ->where('indonesia_id_district', $district_id);

      $data['subdistricts'] = $this->db->get()->result();
    } else {
      //subdistricts not available yet..then get rajaongkir data and store into subdistricts table

      $this->load->helper('rajaongkir');

      //get list of subdistricts from RajaOngkir.com API

      $subdistricts = get_rajaongkir_data('subdistrict?city=' . $district_id); //get from helper file

      foreach ($subdistricts['rajaongkir']['results'] as $subdistrict) {
        //check first if rajaongkir subdistrict_id already exist..

        $this->db
          ->select('rajaongkir_id_subdistrict')
          ->from('indonesia_subdistricts')
          ->where('rajaongkir_id_subdistrict', $subdistrict['subdistrict_id']);

        $count_subdistricts = $this->db->get()->num_rows();

        if ($count_subdistricts == 0) {
          //can input new data, because still empty

          //insert into subdistricts database

          $data = [
            'rajaongkir_id_subdistrict' => $subdistrict['subdistrict_id'],

            'subdistrict' => $subdistrict['subdistrict_name'],

            'indonesia_id_district' => $district_id,
          ];

          $this->db->insert('indonesia_subdistricts', $data);
        }
      }

      //subdistricts should be available now, get the subdistricts

      $this->db
        ->select('rajaongkir_id_subdistrict, subdistrict')
        ->from('indonesia_subdistricts')
        ->where('indonesia_id_district', $district_id);

      $data['subdistricts'] = $this->db->get()->result();
    }

    $this->load->view('ajax/ajax_get_subdistrict', $data);
  }

  public function ajax_get_shipping_subdistrict()
  {
    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $shipping_district_id = (int) $this->input->post('id_shipping_district');
    //check subdistricts table if district_id already available
    $this->db
      ->select('id_indonesia_subdistricts')
      ->from('indonesia_subdistricts')
      ->where('indonesia_id_district', $shipping_district_id);
    $count_subdistricts = $this->db->get()->num_rows();

    if ($count_subdistricts > 0) {
      //subdistricts already available, get the subdistricts
      $this->db
        ->select('rajaongkir_id_subdistrict, subdistrict')
        ->from('indonesia_subdistricts')
        ->where('indonesia_id_district', $shipping_district_id);
      $data['shipping_subdistricts'] = $this->db->get()->result();
    } else {
      //subdistricts not available yet..then get rajaongkir data and store into subdistricts table
      $this->load->helper('rajaongkir');
      //get list of subdistricts from RajaOngkir.com API
      $subdistricts = get_rajaongkir_data(
        'subdistrict?city=' . $shipping_district_id
      ); //get from helper file

      foreach ($subdistricts['rajaongkir']['results'] as $subdistrict) {
        //check first if rajaongkir subdistrict_id already exist..
        $this->db
          ->select('rajaongkir_id_subdistrict')
          ->from('indonesia_subdistricts')
          ->where('rajaongkir_id_subdistrict', $subdistrict['subdistrict_id']);
        $count_subdistricts = $this->db->get()->num_rows();

        if ($count_subdistricts == 0) {
          //can input new data, because still empty
          //insert into subdistricts database
          $data = [
            'rajaongkir_id_subdistrict' => $subdistrict['subdistrict_id'],
            'subdistrict' => $subdistrict['subdistrict_name'],
            'indonesia_id_district' => $shipping_district_id,
          ];
          $this->db->insert('indonesia_subdistricts', $data);
        }
      }

      //subdistricts should be available now, get the subdistricts
      $this->db
        ->select('rajaongkir_id_subdistrict, subdistrict')
        ->from('indonesia_subdistricts')
        ->where('indonesia_id_district', $shipping_district_id);
      $data['shipping_subdistricts'] = $this->db->get()->result();
    }

    $this->load->view('ajax/ajax_get_shipping_subdistrict', $data);
  }

  public function send_sms_code()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $phone = $this->security->xss_clean($this->input->post('handphone_number'));

    //create 4 random number SMS Code

    $random1 = rand(1, 9);

    $random2 = rand(1, 9);

    $random3 = rand(1, 9);

    $random4 = rand(1, 9);

    $sms_code = $random1 . $random2 . $random3 . $random4;

    //check if the phone number already exist in sms_code table

    $this->db
      ->select('id_sms_code')
      ->from('sms_code')
      ->where('phone', $phone);

    $count_handphone_number = $this->db->get()->num_rows();

    if ($count_handphone_number == 0) {
      //handphone number not exist yet...then add new record

      $data = [
        'phone' => $phone,

        'sms_code' => $sms_code,
      ];

      $this->db->insert('sms_code', $data);
    } else {
      //handphone number already exist...then update record

      $data = [
        'sms_code' => $sms_code,
      ];

      $this->db->where('phone', $phone);

      $this->db->update('sms_code', $data);
    }

    //send sms code to user's phone by sms gateway..

    $url = 'http://gateway.siskomdigital.com:12010/cgi-bin/sendsms';

    $params = [
      'gw-username' => 'oky18003',
      'gw-password' => '1qa2ws4r',
      'gw-to' => '62' . $phone,
      'gw-from' => 'Farmaku.com',
      'gw-text' => 'Farmaku.com OTP Anda adalah ' . $sms_code,

      'gw-coding' => '1',
      'gw-dlr-url' => base_url() . 'sms_receiver',

      'gw-dlr-mask' => '1',
    ];

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_POST, true);

    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $response = curl_exec($ch);

    curl_close($ch);

    echo $response; //contoh: status=0&msgid=0028_alpha0219164522660005.0001;

    //update status and msgid into sms_code table

    $response_array = explode('&', $response);

    $status_array = explode('=', $response_array[0]);

    $status = $status_array[1];

    $msgid_array = explode('=', $response_array[1]);

    $msgid = $msgid_array[1];

    //update record

    $data = [
      'status' => $status,

      'msgid' => $msgid,
    ];

    $this->db->where('phone', $phone);

    $this->db->update('sms_code', $data);

    echo $response;
  }

  public function ajax_check_stock()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $qty = (int) $this->security->xss_clean($this->input->post('qty'));

    $product_id = (int) $this->security->xss_clean(
      $this->input->post('product_id')
    );

    $cart_row_id = $this->security->xss_clean($this->input->post('row_id'));

    $subtotal = $this->security->xss_clean($this->input->post('subtotal'));

    //update qty to cart item

    $data = [
      'rowid' => $cart_row_id,

      'qty' => $qty,

      'subtotal' => $subtotal,
    ];

    $this->cart->update($data);

    //get backorder status

    $this->db
      ->select('is_backorder')
      ->from('products')
      ->where('id_products', $product_id);

    $is_backorder = $this->db->get()->row()->is_backorder;

    //get total stok from warehouse

    $this->db
      ->select_sum('stock')
      ->from('stock')
      ->where('id_product', $product_id);

    $total_stock = $this->db->get()->row()->stock;

    if ($total_stock < $qty) {
      if ($is_backorder == 'no') {
        echo 'stok tidak cukup';
      }
    } else {
      //stock cukup..

      echo '&nbsp;';
    }
  }

  public function ajax_set_subtotal()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $qty = (int) $this->security->xss_clean($this->input->post('qty'));

    $product_id = (int) $this->security->xss_clean(
      $this->input->post('product_id')
    );

    $cart_row_id = $this->security->xss_clean($this->input->post('row_id'));

    $price = $this->security->xss_clean($this->input->post('price'));

    $subtotal = $qty * $price;

    $data = [
      'rowid' => $cart_row_id,

      'qty' => $qty,

      'subtotal' => $subtotal,
    ];

    $this->cart->update($data);

    $cart = $this->cart->contents();

    $grand_total = 0;

    foreach ($cart as $item) {
      $count_grand_total = $count_grand_total + $item['subtotal'];
    }

    if ($count_grand_total > 0) {
      $grand_total = $count_grand_total;
    }

    $data['subtotal'] = 'IDR ' . number_format($subtotal);

    $data['grand_total'] =
      'TOTAL:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IDR ' .
      number_format($grand_total);

    echo json_encode($data);
  }

  public function ajax_get_2hourdelivery()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    //get current subdistricts for 2hour and 1day delivery

    $this->db
      ->select('twohour_subdistrict_id')
      ->from('shipment_method_express')
      ->where('warehouse_id', $this->input->post('id_warehouse'));

    $data['current_2hour_subdistrict_id'] = $this->db->get()->result();

    $this->db->select('*')->from('indonesia_subdistricts');

    $this->db->join(
      'indonesia_districts',
      'indonesia_districts.rajaongkir_id_district = indonesia_subdistricts.indonesia_id_district'
    );

    $this->db->where(
      'indonesia_districts.indonesia_id_province',
      $this->input->post('id_province')
    );

    $data['subdistricts'] = $this->db->get()->result();

    $this->load->view('ajax/ajax_2hourdelivery', $data);
  }

  public function ajax_get_1dayservice()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $this->db
      ->select('oneday_subdistrict_id')
      ->from('shipment_method_express')
      ->where('warehouse_id', $this->input->post('id_warehouse'));

    $data['current_1day_subdistrict_id'] = $this->db->get()->result();

    $this->db->select('*')->from('indonesia_subdistricts');

    $this->db->join(
      'indonesia_districts',
      'indonesia_districts.rajaongkir_id_district = indonesia_subdistricts.indonesia_id_district'
    );

    $this->db->where(
      'indonesia_districts.indonesia_id_province',
      $this->input->post('id_province')
    );

    $data['subdistricts'] = $this->db->get()->result();

    $this->load->view('ajax/ajax_1dayservice', $data);
  }

  public function ajax_check_stock_shipping()
  {
    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $qty = (int) $this->security->xss_clean($this->input->post('qty'));
    $item_id = (int) $this->security->xss_clean($this->input->post('item_id'));
    $product_id = (int) $this->security->xss_clean(
      $this->input->post('product_id')
    );
    $warehouse_id = $this->security->xss_clean(
      $this->input->post('warehouse_id')
    );
    $is_backorder = $this->security->xss_clean(
      $this->input->post('is_backorder')
    );

    //get total stok from warehouse
    error_reporting(0);
    $warehouse_stock = $this->db
      ->select('stock')
      ->from('stock')
      ->where('id_product', $product_id)
      ->where('id_product_detail', $item_id)
      ->where('warehouse_id', $warehouse_id)
      ->get()
      ->row()->stock;

    if ($warehouse_stock < $qty) {
      if ($is_backorder == 'no') {
        echo 'Not Enough Stock';
      }
    } else {
      echo '&nbsp;';
    }
  }

  public function ajax_change_shipping_fee()
  {
    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $this->load->helper('shipping');
    $this->load->helper('rajaongkir');
    $data['qty'] = $this->input->post('qty');
    $data['id_province'] = $this->input->post('province');

    $data['price'] = $this->input->post('price');
    $data['rowid'] = $this->input->post('rowid');
    $data['warehouse_id'] = $this->input->post('warehouse_id');
    $data['shipping_method_ids'] = $this->input->post('shipping_method_ids');
    $data['shipping_id_subdistrict'] = $this->input->post(
      'shipping_id_subdistrict'
    );
    $data['product_id'] = $this->input->post('product_id');
    $data['id'] = $this->input->post('item_id');
    $data['selected_shipping_method_id'] = $this->input->post(
      'selected_shipping_method_id'
    );

    //get shipping fee
    $shipping_info = calculate_shipping_fee(
      $data['selected_shipping_method_id'],
      $data['warehouse_id'],
      $data['product_id'],
      $data['id'],
      $data['qty'],
      $data['shipping_id_subdistrict']
    );

    $total_shipping_fee = $shipping_info['total_shipping_fee'];

    $subtotal = $data['qty'] * $data['price'];

    //add new info to shipping cart session

    $shipping_cart = $this->session->userdata('shipping_cart');
    $shipping_cart[$data['rowid']]['qty'] = $this->input->post('qty');
    $shipping_cart[$data['rowid']]['subtotal'] = $subtotal;
    $shipping_cart[$data['rowid']]['shipping_fee'] = $total_shipping_fee;
    $this->session->set_userdata('shipping_cart', $shipping_cart);

    if ($this->session->userdata('site_lang') == 'english') {
      $this->lang->load('shipping', 'english');
    } else {
      $this->lang->load('shipping', 'indonesian');
    }
    $this->load->view('ajax/ajax_change_shipping_fee', $data);
  }

  public function ajax_get_subtotal()
  {
    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $this->load->helper('shipping');
    $this->load->helper('rajaongkir');

    $data['qty'] = $this->input->post('qty');
    $data['price'] = $this->input->post('price');
    $data['rowid'] = $this->input->post('rowid');
    $data['warehouse_id'] = $this->input->post('warehouse_id');
    $data['shipping_id_subdistrict'] = $this->input->post(
      'shipping_id_subdistrict'
    );
    $data['id'] = $this->input->post('item_id');
    $data['product_id'] = $this->input->post('product_id');
    $data['selected_shipping_method_id'] = $this->input->post(
      'selected_shipping_method_id'
    );

    if ($data['selected_shipping_method_id'] == 2) {
      //get self delivery fee/gosend from configuration table
      $this->db
        ->select('shopdelivery_fee')
        ->from('configuration')
        ->where('id_configuration', 1);
      $shopdelivery_fee = $this->db->get()->row()->shopdelivery_fee;
      $shipping_name = '2 Hour Delivery';
      $total_shipping_fee = $shopdelivery_fee;
    } else {
      $shipping_info = calculate_shipping_fee(
        $data['selected_shipping_method_id'],
        $data['warehouse_id'],
        $data['product_id'],
        $data['id'],
        $data['qty'],
        $data['shipping_id_subdistrict']
      );
      $total_shipping_fee = $shipping_info['total_shipping_fee'];
    }

    $subtotal = $data['qty'] * $data['price'];
    //add new info to shipping cart session
    $shipping_cart = $this->session->userdata('shipping_cart');
    $shipping_cart[$data['rowid']]['qty'] = $this->input->post('qty');
    $shipping_cart[$data['rowid']]['subtotal'] = $subtotal;
    $shipping_cart[$data['rowid']]['chosen_shipping_id'] =
      $data['selected_shipping_method_id'];
    $shipping_cart[$data['rowid']]['shipping_fee'] = $total_shipping_fee;
    $this->session->set_userdata('shipping_cart', $shipping_cart);

    echo number_format($subtotal);
  }

  public function ajax_get_grandtotal()
  {
    $this->session->unset_userdata('chosen_point');
    $this->session->unset_userdata('chosen_point_discount');
    $this->session->unset_userdata('chosen_voucher_code');
    $this->session->unset_userdata('chosen_voucher_type');
    $this->session->unset_userdata('chosen_voucher_discount');
    $this->session->unset_userdata('total_categoryproduct_promo');
    $this->session->unset_userdata('total_brandproduct_promo');
    $this->session->unset_userdata('redeemed_voucher_amount');

    //get grand total for total products, total shipping fee, grand total


    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $total_item_amount = 0;
    /*$final_total_shipping_fee = 0;*/
    foreach ($this->session->userdata('shipping_cart') as $rowid => $item) {
      $total_item_amount = $total_item_amount + $item['subtotal'];
    }

    // The logic to substract first purchase is in the server side
    $first_purchase = 0;
    $disc_first = 0.05;
    $userfirst = $this->db->select('is_first')->from('customers')->where('id_customers', $this->session->userdata('customer')['customer_id'])->get()->row()->is_first;

    // if user first purchase
    if ($userfirst == '0') {
      $first_purchase = $total_item_amount * $disc_first;
    }

    /*new get final total shipping fee*/
    $this->load->helper('rajaongkir');
    $shipping_id_subdistrict = $this->input->post('subdistrict');

    //get shipping_id_district & shipping_id_province
    $shipping_id_district = $this->db
      ->select('indonesia_id_district')
      ->from('indonesia_subdistricts')
      ->where('rajaongkir_id_subdistrict', $shipping_id_subdistrict)
      ->get()
      ->row()->indonesia_id_district;

    $shipping_id_province = $this->db
      ->select('indonesia_id_province')
      ->from('indonesia_districts')
      ->where('rajaongkir_id_district', $shipping_id_district)
      ->get()
      ->row()->indonesia_id_province;

    $final_total_shipping_fee = $this->calculate_total_shipping_fee(
      $shipping_id_subdistrict
    ); //from My_controller

    $free_shipping_fee = $this->calculate_free_shipping_fee(
      $shipping_id_province,
      $final_total_shipping_fee
    ); //from My_controller

    $finalshippingfee = 0;
    $calculate_finalshippingfee =
      $final_total_shipping_fee - $free_shipping_fee;
    if ($calculate_finalshippingfee > 0) {
      $finalshippingfee = $calculate_finalshippingfee;
    }


    //GET THE VALUE OF INDENT REMAINING (only for indent item)
    $indent_remaining = 0;
    foreach (
      $this->session->userdata('shipping_cart')
      as $rowid => $shipping_cart_item
    ) {
      if ($shipping_cart_item['is_backorder'] == 'yes') {
        $indent_remaining =
          $indent_remaining +
          ($shipping_cart_item['price'] - $shipping_cart_item['dp_price']) *
          $shipping_cart_item['qty'];
      }
    }

    //GET THE VALUE OF INDENT SHIPPING FEE (only for indent item)
    $indent_shipping_fee = 0;
    foreach (
      $this->session->userdata('shipping_cart')
      as $rowid => $shipping_cart_item
    ) {
      if ($shipping_cart_item['is_backorder'] == 'yes') {
        $indent_shipping_fee =
          $indent_shipping_fee + $shipping_cart_item['shipping_fee'];
      }
    }

    $final_grand_total = 0;
    // $grand_total =
    //   $total_item_amount +
    //   $finalshippingfee -
    //   $indent_remaining -
    //   $indent_shipping_fee;
    // if ($grand_total > 0) {
    //   $final_grand_total = $grand_total;
    // }

    // Add first purchase substraction
    $grand_total = $total_item_amount + $finalshippingfee - $indent_remaining - $indent_shipping_fee - $first_purchase;
    if ($grand_total > 0) {
      $final_grand_total = $grand_total;
    }
    $insurance_fee = ($final_grand_total * 0.2 / 100) + 5000;
    /*$grand_total = $total_item_amount + $final_total_shipping_fee;*/

    $data_total = [
      'total_item_amount' => number_format($total_item_amount),
      'total_shipping_fee' => number_format($final_total_shipping_fee),
      'total_free_shipping_fee' => number_format($free_shipping_fee),
      'finalshippingfee' => number_format($finalshippingfee),
      'grand_total' => number_format($final_grand_total),
      'indent_remaining' => '-' . number_format($indent_remaining),
      'indent_shipping_fee' => '-' . number_format($indent_shipping_fee),
      'first_purchase' => number_format($first_purchase),
      'insurance_fee' => number_format($insurance_fee),
    ];
    // $this->db->select('shopdelivery_fee')->from('configuration')->where('id_configuration', 1);
    // $shopdelivery_fee = $this->db->get()->row()->shopdelivery_fee;
    // if($shopdelivery_fee == 0){
    // 	$data_total['total_shipping_fee']=$shopdelivery_fee;
    // 	$data_total['finalshippingfee']=$shopdelivery_fee;
    // }

    $id_province = $this->input->post('province');

    $free_shipping_type = $this->db
      ->select('free_shipping_type')
      ->from('configuration')
      ->where('id_configuration', 1)
      ->get()
      ->row()->free_shipping_type;
    $get_grand_total = 0;
    foreach ($this->session->userdata('shipping_cart') as $item) {
      $get_grand_total += $item['subtotal'];
    }

    $q_config_cond = $this->db
      ->select(
        'type_cond_prov_free_shipping, cond_more_prov_free_shipping, cond_less_prov_free_shipping'
      )
      ->from('configuration')
      ->where('id_configuration', 1)
      ->get()
      ->row();

    $condition_freeshipping = false;

    $reseller_id = $this->db->select('reseller_id')->from('customers')->where('id_customers', $this->session->userdata('customer')['customer_id'])->get()->row()->reseller_id;
    if ($reseller_id == null) {
      if ($this->session->userdata('cart_has_discounted_items') == 'no') {
        if ($free_shipping_type == 'region') {
          $selected_region_province = $this->db
            ->select('*')
            ->from('free_shipping_region')
            ->where('configuration_id', 1)
            ->where('province_id', $id_province)
            ->get();

          if ($selected_region_province->num_rows() > 0) {
            switch ($q_config_cond->type_cond_prov_free_shipping) {
              case 'more_than':
                if (
                  $get_grand_total >= $q_config_cond->cond_more_prov_free_shipping
                ) {
                  $condition_freeshipping = true;
                } else {
                  $condition_freeshipping = false;
                }
                break;
              case 'less_than':
                if (
                  $get_grand_total <= $q_config_cond->cond_less_prov_free_shipping
                ) {
                  $condition_freeshipping = true;
                } else {
                  $condition_freeshipping = false;
                }
                break;

              default:
                $condition_freeshipping = true;
                break;
            }
          }
        }
      }
      if ($this->session->userdata('cart_has_discounted_items') == 'yes') {
        if ($free_shipping_type == 'region') {
          $selected_region_province = $this->db
            ->select('*')
            ->from('free_shipping_region')
            ->where('configuration_id', 1)
            ->where('province_id', $id_province)
            ->get();

          if ($selected_region_province->num_rows() > 0) {
            switch ($q_config_cond->type_cond_prov_free_shipping) {
              case 'more_than':
                if (
                  $get_grand_total >= $q_config_cond->cond_more_prov_free_shipping
                ) {
                  $condition_freeshipping = true;
                } else {
                  $condition_freeshipping = false;
                }
                break;
              case 'less_than':
                if (
                  $get_grand_total <= $q_config_cond->cond_less_prov_free_shipping
                ) {
                  $condition_freeshipping = true;
                } else {
                  $condition_freeshipping = false;
                }
                break;

              default:
                $condition_freeshipping = true;
                break;
            }
          }
        }
      }
    } else {
      $condition_freeshipping = false;
    }
    if ($condition_freeshipping == true) {
      $data_total['grand_total'] = number_format(
        $total_item_amount - $indent_remaining - $indent_shipping_fee
      );

      $data_total['total_shipping_fee'] = number_format(0);
      $data_total['finalshippingfee'] = number_format(0);

      // $data_total['total_item_amount'] = number_format($total_item_amount);

      // $data_total['total_free_shipping_fee'] = number_format($free_shipping_fee);

      // $data_total['indent_remaining'] = '-' . number_format($indent_remaining);

      // $data_total['indent_shipping_fee'] = '-' . number_format($indent_shipping_fee);
    }
    $data_total['condition_freeshipping'] = $condition_freeshipping;
    echo json_encode($data_total);
  }

  public function update_shipping_address()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    if (!empty($this->input->post('shipping_address'))) {
      $data = [
        'shipping_address' => $this->input->post('shipping_address'),
      ];

      $this->db->where('id_customers', $this->input->post('customer_id'));

      $this->db->update('customers', $data);
    }

    echo 'success';
  }

  public function update_shipping_postcode()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    if (!empty($this->input->post('shipping_postcode'))) {
      $data = [
        'shipping_postcode' => $this->input->post('shipping_postcode'),
      ];

      $this->db->where('id_customers', $this->input->post('customer_id'));

      $this->db->update('customers', $data);
    }

    echo 'success';
  }

  public function ajax_get_suggest_product()
  {
    $customer_id = $this->session->userdata('customer')['customer_id'];
    if ($this->session->userdata('site_lang') == 'english') {
      $this->lang->load('homepage', 'english');
    } else {
      $this->lang->load('homepage', 'indonesian');
    }

    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }
    $search_data = $this->security->xss_clean(
      $this->input->post('search_data')
    );
    //search by area firstly..
    $this->db->select('*');
    $this->db->from('products');
    $this->db->like('title', $search_data);
    $this->db->where('product_status', '1');
    $this->db->order_by('rand()');
    $this->db->limit(5);
    // Check if customer_id_exc is not empty and matches the customer_id from session
    $this->db->where('(
      products.customer_id_exc IS NULL
      OR products.customer_id_exc = ""
      OR products.customer_id_exc = ' . $this->db->escape($customer_id) . '
  )');
    $data['result_products'] = $this->db->get()->result();
    if ($data['result_products'] != null) {
      $this->load->view('ajax/ajax_get_suggest_product', $data);
    } else {
      echo "<li>Product Not Available...</li>";
    }
  }

  public function ajax_get_sku()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $id = $this->security->xss_clean($this->input->post('id'));

    $this->db->select('*');

    $this->db->from('product_details');

    $this->db->where('product_id', $id);

    //   	$this->db->like('title', $search_data);

    //   	$this->db->order_by('title', 'ASC');

    // $this->db->limit(10);

    $data['product_detail'] = $this->db->get()->result();

    if ($data['product_detail'] != null) {
      $this->load->view('ajax/ajax_get_sku', $data);
    } else {
      echo '<p>Product Not Available...</p>';
    }
  }

  public function ajax_admin_get_product()
  {
    //test if ajax call to prevent direct access

    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $search_data = $this->security->xss_clean(
      $this->input->post('search_data')
    );

    $this->db->select('*');

    $this->db->from('products');

    $this->db->like('title', $search_data);

    $this->db->order_by('title', 'ASC');

    $this->db->limit(10);

    $data['result_products'] = $this->db->get()->result();

    if ($data['result_products'] != null) {
      $this->load->view('ajax/ajax_admin_get_product', $data);
    } else {
      echo '<p>Product Not Available...</p>';
    }
  }

  /*new ajax voucher and point rewards*/
  public function ajax_set_voucher()
  {
    error_reporting(0);
    $this->session->unset_userdata('chosen_voucher_code');
    $this->session->unset_userdata('chosen_voucher_type');
    $this->session->unset_userdata('chosen_voucher_discount');
    $this->session->unset_userdata('total_categoryproduct_promo');
    $this->session->unset_userdata('total_brandproduct_promo');
    $this->session->unset_userdata('redeemed_voucher_amount');

    $input_voucher = $this->security->xss_clean($this->input->post('voucher'));
    $pointprice = $this->security->xss_clean($this->input->post('pointprice'));
    $id_customer = $this->security->xss_clean(
      $this->input->post('id_customer')
    );
    $voucher_price = 0;
    $voucher_discount = '';
    $alert = '';
    $status_redeem = 'failed';

    if ($this->session->userdata('customer')['customer_type'] == 'guest') {
      $alert = 'Silahkan Login untuk menggunakan voucher';
    }

    //check if the voucher quantity already empty
    $this->db
      ->select('qty_ready')
      ->from('vouchers')
      ->where('voucher_code', $input_voucher);
    $qty_ready = $this->db->get()->row()->qty_ready;
    if ($qty_ready == 0 && $qty_ready != null) {
      $alert = 'Voucher Code Used Up!';
    }

    //check if the voucher usage already exceed max customer usage
    //get max quantity
    $this->db
      ->select('maxqty_per_person')
      ->from('vouchers')
      ->where('voucher_code', $input_voucher);
    $maxqty_per_person = $this->db->get()->row()->maxqty_per_person;

    if ($maxqty_per_person != null) {
      //get voucher id
      $this->db
        ->select('id_vouchers')
        ->from('vouchers')
        ->where('voucher_code', $input_voucher);
      $voucher_id = (int) $this->db->get()->row()->id_vouchers;

      //check on customer voucher_user table, if exist
      $this->db
        ->select('*')
        ->from('voucher_users')
        ->where('voucher_id', $voucher_id)
        ->where('customer_id', $id_customer);
      $count_user = $this->db->get()->num_rows();

      if ($count_user > 0) {
        //get current voucher usage
        $this->db
          ->select('voucher_used')
          ->from('voucher_users')
          ->where('voucher_id', $voucher_id)
          ->where('customer_id', $id_customer);
        $voucher_used = (int) $this->db->get()->row()->voucher_used;

        //if the user voucher already exceed max quota
        if ($voucher_used >= $maxqty_per_person) {
          $alert = 'You have used max allowed no. of vouchers / customer';
        }
      }
    }

    /*get grand total without shipping fee*/
    $grand_total_without_shipping = 0;
    foreach ($this->session->userdata('shipping_cart') as $rowid => $item) {
      $grand_total_without_shipping =
        $grand_total_without_shipping + $item['subtotal'];
    }

    //cek jika discount value lebih besar dari total order without shipping, maka di cegat
    /*$this->db->select('discount_value')->from('vouchers')->where('voucher_code', $input_voucher);
		$cek_discount_value = $this->db->get()->row()->discount_value;
		if($cek_discount_value > $grand_total_without_shipping) {
			$alert = 'Harap menambahkan jumlah transaksi anda min. IDR '.number_format($cek_discount_value).'<br/> untuk menggunakan voucher ini';
		}*/

    //get minimum order from voucher table
    $this->db
      ->select('min_order')
      ->from('vouchers')
      ->where('voucher_code', $input_voucher);
    $min_order = $this->db->get()->row()->min_order;

    if ($min_order != null) {
      if ($grand_total_without_shipping < (int) $min_order) {
        $alert = 'Sorry Your order amount is not enough';
      }
    }

    /*VOUCHER VALIDATION*/
    $get_voucher = $this->db
      ->select('voucher_code')
      ->from('vouchers')
      ->where('voucher_code like binary ' . '"' . $input_voucher . '"' . '')
      ->get()
      ->row();
    if (count($get_voucher) == 0) {
      $alert = 'Voucher Code Not Exist!';
    }

    //Check for expired date
    //get expired date for this voucher
    $this->db
      ->select('expired_date')
      ->from('vouchers')
      ->where('voucher_code', $input_voucher);
    $expired_date = $this->db->get()->row()->expired_date;
    if ($expired_date != null) {
      $expired_date_numbers = strtotime($expired_date);
      $current_date_numbers = strtotime(date('Y-m-d H:i:s'));
      if ($current_date_numbers > $expired_date_numbers) {
        $alert = 'Sorry Your Voucher Code Already Expired';
      }
    }

    //get voucher type
    $this->db
      ->select('voucher_type')
      ->from('vouchers')
      ->where('voucher_code', $input_voucher);
    $voucher_type = $this->db->get()->row()->voucher_type;

    //id_customer

    switch ($voucher_type) {
      case 'normal promo':
        # do nothing...
        break;

      case 'birthday promo':
        //get birthmonth
        $this->db
          ->select('birthmonth')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $voucher_birthmonth = (int) $this->db->get()->row()->birthmonth;
        //get customer birthmonth
        $this->db
          ->select('birthday')
          ->from('customers')
          ->where('id_customers', $id_customer);
        $birthday = $this->db->get()->row()->birthday;
        $birthday_array = explode('-', $birthday);
        $customer_birthmonth = (int) $birthday_array[1];
        if ($voucher_birthmonth != $customer_birthmonth) {
          $alert = 'Sorry It is not Your Birth Month';
        }
        break;

      case 'gender promo':
        //get gender
        $this->db
          ->select('gender')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $voucher_gender = $this->db->get()->row()->gender;
        //get customer gender
        $this->db
          ->select('sex_type')
          ->from('customers')
          ->where('id_customers', $id_customer);
        $customer_gender = $this->db->get()->row()->sex_type;
        /*if ($customer_title == 'mr') {
					$customer_gender = 'male';
				} else {
					$customer_gender = 'female';
				}*/
        if ($voucher_gender != $customer_gender) {
          $alert = 'Sorry It is not Your Gender';
        }
        break;

      case 'time promo':
        //strtotime means convert date string d-m-Y to time froom 1970 unix time
        //get start promo time
        $this->db
          ->select('promostart')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $promostart = strtotime($this->db->get()->row()->promostart);
        //get end promo time
        $this->db
          ->select('promoend')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $promoend = strtotime($this->db->get()->row()->promoend);
        //get current date and time
        $currentdatetime = strtotime(date('Y-m-d H:i:s'));
        if ($currentdatetime > $promostart && $currentdatetime < $promoend) {
          //time range is correct, promo is valid
          //do nothing..
        } else {
          //time range is false, so promo is not valid
          $alert = 'Sorry Promo Time expired';
        }
        break;

      case 'province promo':
        //get province_id
        $this->db
          ->select('provincepromo')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $voucher_province_id = (int) $this->db->get()->row()->provincepromo;
        //get customer province_id
        $this->db
          ->select('shipping_id_province')
          ->from('customers')
          ->where('id_customers', $id_customer);
        $customer_shipping_id_province = $this->db->get()->row()
          ->shipping_id_province;
        if ($voucher_province_id != $customer_shipping_id_province) {
          $alert = 'Sorry It is not Your Province';
        }
        break;

      case 'quantity promo':
        //get min quantity at checkout
        $this->db
          ->select('quantitypromo')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $voucher_quantitypromo = (int) $this->db->get()->row()->quantitypromo;
        //get current combined product quantity at cart
        $cart = $this->session->userdata('shipping_cart');
        $total_cart_quantity = 0;
        foreach ($cart as $item) {
          $total_cart_quantity = $total_cart_quantity + $item['qty'];
        }
        if ($total_cart_quantity < $voucher_quantitypromo) {
          $alert = 'Sorry Your Total Cart Quantity not enough';
        }
        break;

      case 'category promo':
        //get categories id from voucher code
        $this->db
          ->select('categorypromo')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $categories = $this->db->get()->row()->categorypromo;
        $categories_array = explode(',', $categories);

        //get current cart content
        $cart = $this->session->userdata('shipping_cart');
        $count_category_exist = 0;

        foreach ($cart as $item) {
          //get category_id from each item
          $this->db
            ->select('id_category')
            ->from('category_product')
            ->where('id_product', $item['product_id']);
          $products_category = $this->db->get()->result();

          foreach ($products_category as $category_item) {
            if (in_array($category_item->id_category, $categories_array)) {
              $count_category_exist = $count_category_exist + 1;
            }
          }
        }
        if ($count_category_exist == 0) {
          $alert = 'Sorry You did not choose Products with Promoted Category';
        }
        break;

      case 'brand promo':
        //get brands id from voucher code
        $this->db
          ->select('brandpromo')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $brands = $this->db->get()->row()->brandpromo;
        $brands_array = explode(',', $brands);
        //get current cart content
        $cart = $this->session->userdata('shipping_cart');

        $count_brand_exist = 0;

        foreach ($cart as $item) {
          //get brand_id from each item
          $this->db
            ->select('brand_id')
            ->from('products')
            ->where('id_products', $item['product_id']);
          $product_brand_id = $this->db->get()->row()->brand_id;

          if (in_array($product_brand_id, $brands_array)) {
            $count_brand_exist = $count_brand_exist + 1;
          }
        }

        if ($count_brand_exist == 0) {
          $alert = 'Sorry You did not choose Products with Promoted Brand';
        }
        break;
      case 'product promo':
        //get brands id from voucher code
        $this->db
          ->select('productpromo')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $products = $this->db->get()->row()->productpromo;
        $products_array = explode(',', $products);
        //get current cart content
        $cart = $this->session->userdata('shipping_cart');

        $count_brand_exist = 0;

        foreach ($cart as $item) {
          //get brand_id from each item
          $this->db
            ->select('id_products')
            ->from('products')
            ->where('id_products', $item['product_id']);
          $product_id = $this->db->get()->row()->id_products;

          if (in_array($product_id, $products_array)) {
            $count_brand_exist = $count_brand_exist + 1;
          }
        }

        if ($count_brand_exist == 0) {
          $alert = 'Sorry You did not choose Promoted Products';
        }
        break;
      case 'customer promo':
        //get brands id from voucher code
        $this->db
          ->select('customerpromo')
          ->from('vouchers')
          ->where('voucher_code', $input_voucher);
        $customers = $this->db->get()->row()->customerpromo;
        $customers_array = explode(',', $customers);
        //get current cart content
        $id = $this->session->userdata('customer')['customer_id'];

        $count_brand_exist = 0;

        if (in_array($id, $customers_array)) {
          $count_brand_exist = $count_brand_exist + 1;
        }

        if ($count_brand_exist == 0) {
          $alert = 'Sorry this code not valid for you';
        }
        break;
    }
    /*VOUCHER VALIDATION*/

    /*if alert is null, is mean validation false*/
    if ($alert != '') {
      $this->session->unset_userdata('chosen_voucher_code');
      $this->session->unset_userdata('chosen_voucher_type');
      $this->session->unset_userdata('chosen_voucher_discount');
      $this->session->unset_userdata('total_categoryproduct_promo');
      $this->session->unset_userdata('total_brandproduct_promo');
      $this->session->unset_userdata('redeemed_voucher_amount');
      $data_log = array(
        'customer_id' => $id_customer,
        'doctor_voucher_code' => $input_voucher,
        'status' => 'failed',
      );
      $this->db->insert('voucher_redemption_attempts', $data_log);
    } /*if alert null, is mean validation true*/ else {

      // This will processed if the voucher success/valid
      /*SET VOUCHER VALUE*/
      //get discount type and amount
      $this->db
        ->select('*')
        ->from('vouchers')
        ->where('voucher_code', $input_voucher);
      $voucher = $this->db->get()->row();

      $this->session->set_userdata(
        'chosen_voucher_code',
        $voucher->voucher_code
      );
      $this->session->set_userdata(
        'chosen_voucher_type',
        $voucher->discount_type
      );
      $this->session->set_userdata(
        'chosen_voucher_discount',
        (int) $voucher->discount_value
      );
      //$voucher_price = (int) $voucher->discount_value;

      // Check voucher type
      if ($voucher->voucher_type == 'category promo') {
        if ($voucher->discount_type == 'percentage') {
          $voucher_discount = '(' . $voucher->discount_value . '%)';

          //discount type by percentage..here need to calculate discount for specific products whose categories are matched only..
          $discount_rate = $voucher->discount_value;
          //get categories id from voucher code
          $this->db
            ->select('categorypromo')
            ->from('vouchers')
            ->where('voucher_code', $input_voucher);
          $categories = $this->db->get()->row()->categorypromo;
          $categories_array = explode(',', $categories);

          //get current cart content
          $cart = $this->session->userdata('shipping_cart');

          $total_amount_promoted_categories = 0;

          foreach ($cart as $item) {
            //check if this item has category which is match with $categories_array
            $this->db
              ->select('id_category')
              ->from('category_product')
              ->where('id_product', $item['product_id']);
            $categories_id = $this->db->get()->result();

            $count_category_id = 0;
            foreach ($categories_id as $category_id) {
              if (in_array($category_id->id_category, $categories_array)) {
                $count_category_id = $count_category_id + 1;
              }
            }

            if ($count_category_id > 0) {
              //this $item has category which is match with $categories_array, so we can add to percentage discounts
              /*$total_amount_promoted_categories = $total_amount_promoted_categories + ($item['price'] * $item['qty'] * $discount_rate / 100);*/
              $voucher_price =
                $voucher_price +
                ($item['price'] * $item['qty'] * $discount_rate) / 100;
            }
          }
          $this->session->set_userdata(
            'total_categoryproduct_promo',
            (int) $voucher_price
          );
        } else {
          $voucher_discount = '';
          $voucher_price = (int) $voucher->discount_value;
        }
      } elseif ($voucher->voucher_type == 'brand promo') {
        if ($voucher->discount_type == 'percentage') {
          $voucher_discount = '(' . $voucher->discount_value . '%)';

          //discount type by percentage..here need to calculate discount for specific products whose brands are matched only..
          $discount_rate = $voucher->discount_value;
          //get brands id from voucher code
          $this->db
            ->select('brandpromo')
            ->from('vouchers')
            ->where('voucher_code', $input_voucher);
          $brands = $this->db->get()->row()->brandpromo;
          $brands_array = explode(',', $brands);

          //get current cart content
          $cart = $this->session->userdata('shipping_cart');

          $total_amount_promoted_brands = 0;

          foreach ($cart as $item) {
            //check if this item has brand which is match with $brands_array
            $this->db
              ->select('brand_id')
              ->from('products')
              ->where('id_products', $item['product_id']);
            $brand_id = $this->db->get()->row()->brand_id;

            if (in_array($brand_id, $brands_array)) {
              //this $item has brand which is match with $brands_array, so we can add to percentage discounts
              /*$total_amount_promoted_brands = $total_amount_promoted_brands + ($item['price'] * $item['qty'] * $discount_rate / 100);*/
              $voucher_price =
                $voucher_price +
                ($item['price'] * $item['qty'] * $discount_rate) / 100;
            }
          }
          $this->session->set_userdata(
            'total_brandproduct_promo',
            (int) $voucher_price
          );
        } else {
          $voucher_discount = '';
          $voucher_price = (int) $voucher->discount_value;
        }
      } else {
        if ($voucher->discount_type == 'percentage') {
          $voucher_discount = '(' . $voucher->discount_value . '%)';
          $product_grand_total = 0;
          foreach (
            $this->session->userdata('shipping_cart')
            as $rowid => $item
          ) {
            $product_grand_total = $product_grand_total + $item['subtotal'];
          }
          $voucher_price =
            ($voucher->discount_value / 100) * $product_grand_total;
        } else {
          $voucher_discount = '';
          $voucher_price = (int) $voucher->discount_value;
        }
      }

      $status_redeem = 'success';

      $this->session->set_userdata('redeemed_voucher_amount', $voucher_price);

      /*SET VOUCHER VALUE*/
    }



    /*hitung grand total include point rewards*/
    $total_item_amount = 0;
    foreach ($this->session->userdata('shipping_cart') as $rowid => $item) {
      $total_item_amount = $total_item_amount + $item['subtotal'];
    }

    $first_purchase = 0;
    $disc_first = 0.05;
    $userfirst = $this->db->select('is_first')->from('customers')->where('id_customers', $this->session->userdata('customer')['customer_id'])->get()->row()->is_first;

    // if user first purchase
    if ($userfirst == '0') {
      $first_purchase = $total_item_amount * $disc_first;
    }


    /*if($voucher_price > $total_item_amount) {
			$alert = 'Jumlah Voucher Yang Ditukar <br/>IDR '.number_format($voucher_price).'<br/> Melebihi Total Pembelian';
			$voucher_price	= 0;
		}*/

    /*new get final total shipping fee*/
    $this->load->helper('rajaongkir');
    $shipping_id_subdistrict = $this->input->post('subdistrict');

    //get shipping_id_district & shipping_id_province
    $shipping_id_district = $this->db
      ->select('indonesia_id_district')
      ->from('indonesia_subdistricts')
      ->where('rajaongkir_id_subdistrict', $shipping_id_subdistrict)
      ->get()
      ->row()->indonesia_id_district;

    $shipping_id_province = $this->db
      ->select('indonesia_id_province')
      ->from('indonesia_districts')
      ->where('rajaongkir_id_district', $shipping_id_district)
      ->get()
      ->row()->indonesia_id_province;

    $final_total_shipping_fee = $this->calculate_total_shipping_fee(
      $shipping_id_subdistrict
    ); //from My_controller

    $free_shipping_fee = $this->calculate_free_shipping_fee(
      $shipping_id_province,
      $final_total_shipping_fee
    ); //from My_controller

    $finalshippingfee = 0;
    $calculate_finalshippingfee =
      $final_total_shipping_fee - $free_shipping_fee;
    if ($calculate_finalshippingfee > 0) {
      $finalshippingfee = $calculate_finalshippingfee;
    }

    //GET THE VALUE OF INDENT REMAINING (only for indent item)
    $indent_remaining = 0;
    foreach (
      $this->session->userdata('shipping_cart')
      as $rowid => $shipping_cart_item
    ) {
      if ($shipping_cart_item['is_backorder'] == 'yes') {
        $indent_remaining =
          $indent_remaining +
          ($shipping_cart_item['price'] - $shipping_cart_item['dp_price']) *
          $shipping_cart_item['qty'];
      }
    }

    //GET THE VALUE OF INDENT SHIPPING FEE (only for indent item)
    $indent_shipping_fee = 0;
    foreach (
      $this->session->userdata('shipping_cart')
      as $rowid => $shipping_cart_item
    ) {
      if ($shipping_cart_item['is_backorder'] == 'yes') {
        $indent_shipping_fee =
          $indent_shipping_fee + $shipping_cart_item['shipping_fee'];
      }
    }


    // Start
    $final_grand_total = 0;
    $grand_total = $total_item_amount - $voucher_price - $pointprice + $finalshippingfee - $indent_remaining - $indent_shipping_fee - $first_purchase;
    $insurance_fee = ($grand_total * 0.2 / 100) + 5000;
    if ($grand_total > 0) {
      $final_grand_total = $grand_total;
    } else {
      //check if finalshippingfee is > 0
      if ($finalshippingfee > 0) {
        $final_grand_total = $finalshippingfee;
      }
    }


    $data_log = array(
      'customer_id' => $id_customer,
      'doctor_voucher_code' => $input_voucher,
      'status' => $status_redeem,
    );
    $this->db->insert('voucher_redemption_attempts', $data_log);

    $data_total = [
      'total_item_amount' => number_format($total_item_amount),
      'voucher_discount' => $voucher_discount,
      'voucherprice' => '-' . number_format($voucher_price),
      'voucherprice_input' => $voucher_price,
      'alert' => $alert,
      'firsttotal' => number_format(
        $total_item_amount - $voucher_price - $pointprice
      ),
      'total_shipping_fee' => number_format($final_total_shipping_fee),
      'total_free_shipping_fee' => number_format($free_shipping_fee),
      'finalshippingfee' => number_format($finalshippingfee),
      'grand_total' => number_format($final_grand_total),
      'indent_remaining' => '-' . number_format($indent_remaining),
      'indent_shipping_fee' => '-' . number_format($indent_shipping_fee),
      'insurance_fee' => number_format($insurance_fee)
    ];
    echo json_encode($data_total);
  }

  public function ajax_set_point_rewards()
  {
    $voucherprice = $this->security->xss_clean(
      $this->input->post('voucherprice')
    );
    $point = $this->security->xss_clean($this->input->post('point'));
    $id_customer = $this->security->xss_clean(
      $this->input->post('id_customer')
    );
    $finalpoint_rewards = 0;
    $alert = '';

    if ($this->session->userdata('customer')['customer_type'] == 'guest') {
      $alert = 'Silahkan Login untuk menggunakan point reward';
    }

    if ($this->session->userdata('customer')['customer_type'] == 'regular') {
      /*hitung point rewards*/
      //get customer current point reward
      $this->db
        ->select('current_pointreward')
        ->from('customers')
        ->where('id_customers', $id_customer);
      $current_point = $this->db->get()->row()->current_pointreward;

      if ($point > $current_point) {
        $alert = 'Point cannot bigger than ' . $current_point;
        $this->session->unset_userdata('chosen_point');
        $this->session->unset_userdata('chosen_point_discount');
      } else {
        $this->db
          ->select('*')
          ->from('point_rewards')
          ->where('id_point_rewards', 1);
        $point_rewards = $this->db->get()->row();
        $reseller_id = $this->db->select('reseller_id')->from('customers')->where('id_customers', $this->session->userdata('customer')['customer_id'])->get()->row()->reseller_id;
        if ($reseller_id == NULL) {
          $finalpoint_rewards = $point * (int) $point_rewards->conversion;
        } else {
          $finalpoint_rewards = $point;
        }

        $this->session->set_userdata('chosen_point', $point);
        $this->session->set_userdata(
          'chosen_point_discount',
          $finalpoint_rewards
        );
      }
      /*hitung point rewards*/
    }

    /*hitung grand total include point rewards*/
    $total_item_amount = 0;
    foreach ($this->session->userdata('shipping_cart') as $rowid => $item) {
      $total_item_amount = $total_item_amount + $item['subtotal'];
    }

    if ($finalpoint_rewards > $total_item_amount) {
      $alert =
        'Jumlah Point Reward <br/>IDR ' .
        number_format($finalpoint_rewards) .
        '<br/> Melebihi Total Pembelian';
      $finalpoint_rewards = 0;
    }

    /*new get final total shipping fee*/
    $this->load->helper('rajaongkir');
    $shipping_id_subdistrict = $this->input->post('subdistrict');

    //get shipping_id_district & shipping_id_province
    $shipping_id_district = $this->db
      ->select('indonesia_id_district')
      ->from('indonesia_subdistricts')
      ->where('rajaongkir_id_subdistrict', $shipping_id_subdistrict)
      ->get()
      ->row()->indonesia_id_district;

    $shipping_id_province = $this->db
      ->select('indonesia_id_province')
      ->from('indonesia_districts')
      ->where('rajaongkir_id_district', $shipping_id_district)
      ->get()
      ->row()->indonesia_id_province;

    $final_total_shipping_fee = $this->calculate_total_shipping_fee(
      $shipping_id_subdistrict
    ); //from My_controller

    $free_shipping_fee = $this->calculate_free_shipping_fee(
      $shipping_id_province,
      $final_total_shipping_fee
    ); //from My_controller

    $finalshippingfee = 0;
    $calculate_finalshippingfee =
      $final_total_shipping_fee - $free_shipping_fee;
    if ($calculate_finalshippingfee > 0) {
      $finalshippingfee = $calculate_finalshippingfee;
    }

    //GET THE VALUE OF INDENT REMAINING (only for indent item)
    $indent_remaining = 0;
    foreach (
      $this->session->userdata('shipping_cart')
      as $rowid => $shipping_cart_item
    ) {
      if ($shipping_cart_item['is_backorder'] == 'yes') {
        $indent_remaining =
          $indent_remaining +
          ($shipping_cart_item['price'] - $shipping_cart_item['dp_price']) *
          $shipping_cart_item['qty'];
      }
    }

    //GET THE VALUE OF INDENT SHIPPING FEE (only for indent item)
    $indent_shipping_fee = 0;
    foreach (
      $this->session->userdata('shipping_cart')
      as $rowid => $shipping_cart_item
    ) {
      if ($shipping_cart_item['is_backorder'] == 'yes') {
        $indent_shipping_fee =
          $indent_shipping_fee + $shipping_cart_item['shipping_fee'];
      }
    }

    $final_grand_total = 0;
    $grand_total =
      $total_item_amount -
      $voucherprice -
      $finalpoint_rewards +
      $finalshippingfee -
      $indent_remaining -
      $indent_shipping_fee;
    if ($grand_total > 0) {
      $final_grand_total = $grand_total;
    }

    $insurance_fee = ($final_grand_total * 0.2 / 100) + 5000;
    /*hitung grand total include point rewards*/

    $data_total = [
      'total_item_amount' => number_format($total_item_amount),
      'pointrewards' => '-' . number_format($finalpoint_rewards),
      'pointrewards_input' => $finalpoint_rewards,
      'alert' => $alert,
      'firsttotal' => number_format(
        $total_item_amount - $voucherprice - $finalpoint_rewards
      ),
      'total_shipping_fee' => number_format($final_total_shipping_fee),
      'total_free_shipping_fee' => number_format($free_shipping_fee),
      'finalshippingfee' => number_format($finalshippingfee),
      'grand_total' => number_format($final_grand_total),
      'indent_remaining' => '-' . number_format($indent_remaining),
      'indent_shipping_fee' => '-' . number_format($indent_shipping_fee),
      'insurance_fee' => number_format($insurance_fee),
    ];
    echo json_encode($data_total);
  }

  public function ajax_cek_current_qty()
  {
    $product_id = $this->security->xss_clean($this->input->post('product_id'));

    $a = $this->cart->contents();

    $b = 0;

    foreach ($a as $item) {
      if ($item['id'] == $product_id) {
        $b = $item['qty'];
      }

      break;
    }

    echo $b;
  }

  //PRODUCT DETAIL PAGE
  public function initialProductDetail()
  {
    if ($this->session->userdata('site_lang') == 'english') {
      $this->lang->load('product_detail', 'english');
      $this->lang->load('product_list', 'english');
    } else {
      $this->lang->load('product_list', 'indonesian');
      $this->lang->load('product_detail', 'indonesian');
    }

    $this->load->helper('product');

    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $product_id = $this->input->post('product_id');
    $attribute_detail_ids = $this->input->post('attribute_detail_ids'); // get all chosen attribute detail ids

    //get product details id from product_combination
    $correct_product_detail_id = null;

    $this->db->distinct(); //only get 1 uniqe value of product_details_id
    $this->db
      ->select('product_details_id')
      ->from('product_combination')
      ->where('product_id', $product_id)
      ->where_in('attribute_detail_id', $attribute_detail_ids);
    $product_details_ids = $this->db->get()->result();

    foreach ($product_details_ids as $product_details_id) {
      $this->db
        ->select('attribute_detail_id')
        ->from('product_combination')
        ->where('product_details_id', $product_details_id->product_details_id);
      $attribute_detail_check_ids = $this->db->get()->result();

      $result_check = [];

      foreach ($attribute_detail_check_ids as $id) {
        $result_check[] = $id->attribute_detail_id;
      }

      $array_match = array_intersect($attribute_detail_ids, $result_check);

      if (count($array_match) == count($attribute_detail_ids)) {
        $correct_product_detail_id = $product_details_id->product_details_id;
      }
    }

    $json_data = [];

    //get placeholder image
    $this->db
      ->select('image_not_available')
      ->from('configuration')
      ->where('id_configuration', 1);
    $image_data['placeholder_image'] = $this->db->get()->row()->image_not_available;

    //get product title
    $this->db
      ->select('title')
      ->from('products')
      ->where('id_products', $product_id);

    $image_data['product_name'] = $this->db->get()->row()->title;

    if ($correct_product_detail_id != null) {
      $json_data['match_found'] = 'true';
      //product detail is available..
      //get all images from confirmed product detail id
      $this->db
        ->select('id, image, alt')
        ->from('product_images')
        ->where('product_id', $product_id)
        ->where('product_details_id', $correct_product_detail_id)
        ->where('status', '1')
        ->order_by('priority', 'ASC');
      $image_data['product_images'] = $this->db->get()->result();
      //get product price
      $this->db
        ->select('*')
        ->from('product_details')
        ->where('id', $correct_product_detail_id);
      $prices = $this->db->get()->row();

      $price_data['price'] = $prices->price;
      $price_data['discounted_price'] = $prices->discounted_price;

      //check all stock
      $this->db
        ->select_sum('stock')
        ->from('stock')
        ->where('id_product', $product_id)
        ->where('warehouse_id', 1)
        ->where('id_product_detail', $correct_product_detail_id);
      $stock = $this->db->get()->row()->stock;

      $this->db
        ->select_sum('stock_keep')
        ->from('stock')
        ->where('id_product', $product_id)
        ->where('warehouse_id', 1)
        ->where('id_product_detail', $correct_product_detail_id);
      $stock_keep = $this->db->get()->row()->stock_keep;

      $total_stock = $stock - $stock_keep;

      // product price
      $price_data['sku'] = $this->db
        ->select('sku')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row()->sku;
      $price_data['weight'] = $this->db
        ->select('weight')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row()->weight;
      $price_data['stock'] = $total_stock;
      $price_data['primary_colortheme'] =
        $this->data_header['primary_colortheme'];
      $price_data['product_id'] = $product_id;
      $json_data['price_content'] = $this->load->view(
        "themes/$this->theme_no/ajax/ajax_get_product_price",
        $price_data,
        true
      );

      if ($total_stock > 0) {
        $json_data['stock_text'] = 'In Stock';
      } else {
        //stock is 0. check if indent is allow
        $this->db
          ->select('is_indent')
          ->from('product_details')
          ->where('id', $correct_product_detail_id)
          ->where('product_id', $product_id);
        $is_indent = $this->db->get()->row()->is_indent;

        if ($is_indent == 'yes') {
          $json_data['stock_text'] = 'No Stock';
        } else {
          $json_data['stock_text'] = 'No Stock';
        }
      }

      //get SKU
      $json_data['sku'] = $this->db
        ->select('sku')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row()->sku;
      $json_data['weight'] = $this->db
        ->select('weight')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row()->weight;
      $json_data['stock'] = $total_stock;
    } else {
      $image_data['product_images'] = null;
      $json_data['match_found'] = 'false';
      $json_data['stock_text'] = 'Not Available';
    }

    //get attribute details name
    $json_data['attribute_detail_names'] = '';

    foreach ($attribute_detail_ids as $index => $id) {
      //get attribute detail name
      if ($this->session->userdata('site_lang') == 'english') {
        $this->db
          ->select('attribute_detail_en as attribute_detail')
          ->from('product_attributes_detail')
          ->where('id', $id);
      } else {
        $this->db
          ->select('attribute_detail')
          ->from('product_attributes_detail')
          ->where('id', $id);
      }
      $attribute_detail_name = $this->db->get()->row()->attribute_detail;

      if ($index == 0) {
        $json_data['attribute_detail_names'] =
          $json_data['attribute_detail_names'] . $attribute_detail_name;
      } else {
        $json_data['attribute_detail_names'] =
          $json_data['attribute_detail_names'] . '-' . $attribute_detail_name;
      }
    }

    $json_data['image_content'] = $this->load->view(
      "themes/$this->theme_no/ajax/ajax_get_product_images",
      $image_data,
      true
    );

    echo json_encode($json_data);
  }

  public function changeProductDetail()
  {
    if ($this->session->userdata('site_lang') == 'english') {
      $this->lang->load('product_detail', 'english');
      $this->lang->load('product_list', 'english');
    } else {
      $this->lang->load('product_list', 'indonesian');
      $this->lang->load('product_detail', 'indonesian');
    }

    $this->load->helper('product');

    //test if ajax call to prevent direct access
    if (!$this->input->is_ajax_request()) {
      exit('No direct script access allowed');
    }

    $product_id = $this->input->post('product_id');
    //get chosen atribute detail id
    $attribute_detail_id = $this->input->post('attribute_detail_id');
    // get all chosen attribute detail ids
    $attribute_detail_ids = $this->input->post('attribute_detail_ids');

    //get product details id from product_combination
    $correct_product_detail_id = null;

    $this->db->distinct(); //only get 1 uniqe value of product_details_id
    $this->db
      ->select('product_details_id')
      ->from('product_combination')
      ->where('product_id', $product_id)
      ->where_in('attribute_detail_id', $attribute_detail_ids);
    $product_details_ids = $this->db->get()->result();

    foreach ($product_details_ids as $product_details_id) {
      $this->db
        ->select('attribute_detail_id')
        ->from('product_combination')
        ->where('product_details_id', $product_details_id->product_details_id);
      $attribute_detail_check_ids = $this->db->get()->result();

      $result_check = [];

      foreach ($attribute_detail_check_ids as $id) {
        $result_check[] = $id->attribute_detail_id;
      }

      $array_match = array_intersect($attribute_detail_ids, $result_check);

      if (count($array_match) == count($attribute_detail_ids)) {
        $correct_product_detail_id = $product_details_id->product_details_id;
      }
    }

    $json_data = [];

    //get placeholder image
    $this->db
      ->select('image_not_available')
      ->from('configuration')
      ->where('id_configuration', 1);
    $image_data['placeholder_image'] = $this->db->get()->row()->image_not_available;

    //get product title
    $this->db
      ->select('title')
      ->from('products')
      ->where('id_products', $product_id);
    $image_data['product_name'] = $this->db->get()->row()->title;

    if ($correct_product_detail_id != null) {
      $json_data['match_found'] = 'true';
      //product detail is available..
      //get all images from confirmed product detail id
      $this->db
        ->select('id, image, alt')
        ->from('product_images')
        ->where('product_id', $product_id)
        ->where('product_details_id', $correct_product_detail_id)
        ->where('status', '1')
        ->order_by('priority', 'ASC');
      $image_data['product_images'] = $this->db->get()->result();

      //get product price
      $this->db
        ->select('*')
        ->from('product_details')
        ->where('id', $correct_product_detail_id);
      $prices = $this->db->get()->row();

      $price_data['price'] = $prices->price;
      $price_data['discounted_price'] = $prices->discounted_price;

      //check all stock
      $this->db
        ->select_sum('stock')
        ->from('stock')
        ->where('id_product', $product_id)
        ->where('warehouse_id', 1)
        ->where('id_product_detail', $correct_product_detail_id);
      $stock = $this->db->get()->row()->stock;

      $this->db
        ->select_sum('stock_keep')
        ->from('stock')
        ->where('id_product', $product_id)
        ->where('warehouse_id', 1)
        ->where('id_product_detail', $correct_product_detail_id);
      $stock_keep = $this->db->get()->row()->stock_keep;

      $total_stock = $stock - $stock_keep;

      // product price
      $price_data['sku'] = $this->db
        ->select('sku')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row()->sku;
      $price_data['weight'] = $this->db
        ->select('weight')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row()->weight;
      $price_data['stock'] = $total_stock;
      $price_data['primary_colortheme'] =
        $this->data_header['primary_colortheme'];
      $price_data['product_details_id'] = $correct_product_detail_id;
      $price_data['product_id'] = $product_id;
      $json_data['price_content'] = $this->load->view(
        "themes/$this->theme_no/ajax/ajax_get_product_price",
        $price_data,
        true
      );

      if ($total_stock > 0) {
        $json_data['stock_text'] = 'In Stock';
      } else {
        //stock is 0. check if indent is allow
        $this->db
          ->select('is_indent')
          ->from('product_details')
          ->where('id', $correct_product_detail_id)
          ->where('product_id', $product_id);
        $is_indent = $this->db->get()->row()->is_indent;

        if ($is_indent == 'yes') {
          $json_data['stock_text'] = 'No Stock';
        } else {
          $json_data['stock_text'] = 'No Stock';
        }
      }

      //get SKU
      $json_data['sku'] = $this->db
        ->select('sku')
        ->from('product_details')
        ->where('id', $correct_product_detail_id)
        ->get()
        ->row()->sku;
    } else {
      $image_data['product_images'] = null;
      $json_data['match_found'] = 'false';
      $json_data['stock_text'] = 'Not Available';
    }

    $json_data['image_content'] = $this->load->view(
      "themes/$this->theme_no/ajax/ajax_get_product_images",
      $image_data,
      true
    );

    //GET ATTRIBUTE DETAIL NAME
    $this->db
      ->select('attribute_detail')
      ->from('product_attributes_detail')
      ->where('id', $attribute_detail_id);

    $attribute_name = $this->db->get()->row()->attribute_detail;
    $json_data['detail_attribute_name'] = ucwords($attribute_name);

    //get attribute details name
    $json_data['attribute_detail_names'] = '';

    foreach ($attribute_detail_ids as $index => $id) {
      //get attribute detail name
      if ($this->session->userdata('site_lang') == 'english') {
        $this->db
          ->select('attribute_detail_en as attribute_detail')
          ->from('product_attributes_detail')
          ->where('id', $id);
      } else {
        $this->db
          ->select('attribute_detail')
          ->from('product_attributes_detail')
          ->where('id', $id);
      }
      $attribute_detail_name = $this->db->get()->row()->attribute_detail;

      if ($index == 0) {
        $json_data['attribute_detail_names'] =
          $json_data['attribute_detail_names'] . $attribute_detail_name;
      } else {
        $json_data['attribute_detail_names'] =
          $json_data['attribute_detail_names'] . '-' . $attribute_detail_name;
      }
    }

    echo json_encode($json_data);
  }

  public function ajax_set_discounted_items_voucher()
  {
    error_reporting(0);
    $this->session->unset_userdata('chosen_voucher_code');
    $this->session->unset_userdata('chosen_voucher_type');
    $this->session->unset_userdata('chosen_voucher_discount');
    $this->session->unset_userdata('total_categoryproduct_promo');
    $this->session->unset_userdata('total_brandproduct_promo');
    $this->session->unset_userdata('redeemed_voucher_amount');

    $input_voucher = $this->security->xss_clean($this->input->post('voucher'));
    $id_customer = $this->security->xss_clean(
      $this->input->post('id_customer')
    );
    $status_redeem = 'failed';
    $data_log = array(
      'customer_id' => $id_customer,
      'doctor_voucher_code' => $input_voucher,
      'status' => $status_redeem,
    );
    $this->db->insert('voucher_redemption_attempts', $data_log);
  }
}

https://t.me/RX1948 - 2025